// Fannel Ver3 val{ jp1_1(default=0,min=-200000,max=200000,step=0,disp=0) jp2_1(default=0,min=-200000,max=200000,step=0,disp=0) jp3_1(default=0,min=-200000,max=200000,step=0,disp=0) jp4_1(default=0,min=-200000,max=200000,step=0,disp=0) jp5_1(default=0,min=-200000,max=200000,step=0,disp=0) jp6_1(default=0,min=-200000,max=200000,step=0,disp=0) jp7_1(default=0,min=-200000,max=200000,step=0,disp=0) jp8_1(default=0,min=-200000,max=200000,step=0,disp=0) beam_1(default=0,min=0,max=100000,step=0,disp=0) col_1(default=#0000FF,step=0,disp=0) dmp_1(default=0.3,disp=0) spr_1(default=0.3,disp=0) jp1_2(default=0,min=-200000,max=200000,step=0,disp=0) jp2_2(default=0,min=-200000,max=200000,step=0,disp=0) jp3_2(default=0,min=-200000,max=200000,step=0,disp=0) jp4_2(default=0,min=-200000,max=200000,step=0,disp=0) jp5_2(default=0,min=-200000,max=200000,step=0,disp=0) jp6_2(default=0,min=-200000,max=200000,step=0,disp=0) jp7_2(default=0,min=-200000,max=200000,step=0,disp=0) jp8_2(default=0,min=-200000,max=200000,step=0,disp=0) beam_2(default=0,min=0,max=100000,step=0,disp=0) col_2(default=#FF0000,step=0,disp=0) dmp_2(default=0.3,disp=0) spr_2(default=0.3,disp=0) gas_3(default=0,min=1000,max=40000,step=0,disp=1) col_3(default=#00FF00,disp=0) } /////////////////////////////////////////////////////////////////////////////// key{ } /////////////////////////////////////////////////////////////////////////////// body{ core(name=c_1,color=col_1){ n:arm(power=beam_1,option=30000,spring=spr_1,damper=dmp_1,color=col_1){ s:trimf(angle=90,spring=spr_1,damper=dmp_1,color=col_1){ w:jet(power=jp3_1,spring=spr_1,damper=dmp_1,color=col_1){ e:trimf(angle=90,spring=spr_1,damper=dmp_1,color=col_1){ n:jet(power=jp7_1,spring=spr_1,damper=dmp_1,color=col_1){} s:jet(power=jp8_1,spring=spr_1,damper=dmp_1,color=col_1){} } } e:jet(power=jp4_1,spring=spr_1,damper=dmp_1,color=col_1){} } } s:arm(spring=spr_1,damper=dmp_1,color=col_1){} w:jet(power=jp1_1,spring=spr_1,damper=dmp_1,color=col_1){ e:trimf(angle=90,spring=spr_1,damper=dmp_1,color=col_1){ n:jet(power=jp5_1,spring=spr_1,damper=dmp_1,color=col_1){} s:jet(power=jp6_1,spring=spr_1,damper=dmp_1,color=col_1){} } } e:jet(power=jp2_1,spring=spr_1,damper=dmp_1,color=col_1){} //----------------------------------------------------------------------------- n:chip(name=c_2,color=col_2){ n:arm(power=beam_2,option=90000,spring=spr_2,damper=dmp_2,color=col_2){ s:trimf(angle=90,spring=spr_2,damper=dmp_2,color=col_2){ w:jet(power=jp3_2,spring=spr_2,damper=dmp_2,color=col_2){ e:trimf(angle=90,spring=spr_2,damper=dmp_2,color=col_2){ n:jet(power=jp7_2,spring=spr_2,damper=dmp_2,color=col_2){} s:jet(power=jp8_2,spring=spr_2,damper=dmp_2,color=col_2){} } } e:jet(power=jp4_2,spring=spr_2,damper=dmp_2,color=col_2){} } } s:arm(spring=spr_2,damper=dmp_2,color=col_2){} w:jet(power=jp1_2,spring=spr_2,damper=dmp_2,color=col_2){ e:trimf(angle=90,spring=spr_2,damper=dmp_2,color=col_2){ n:jet(power=jp5_2,spring=spr_2,damper=dmp_2,color=col_2){} s:jet(power=jp6_2,spring=spr_2,damper=dmp_2,color=col_2){} } } e:jet(power=jp2_2,spring=spr_2,damper=dmp_2,color=col_2){} } //----------------------------------------------------------------------------- s:jet(name=c_3,option=1,power=gas_3,color=col_3){} //----------------------------------------------------------------------------- } } /////////////////////////////////////////////////////////////////////////////// Lua{ c_1,c_2,c_3=C_1,C_2,C_3 tgtx={} tgty={} tgtz={} tgtx[c_1],tgty[c_1],tgtz[c_1]=0,0,0 tgtx[c_2],tgty[c_2],tgtz[c_2]=0,0,0 tgtx[c_3],tgty[c_3],tgtz[c_3]=_X(c_3),_Y(c_3),_Z(c_3) gx0={} gy0={} gz0={} gx1={} gy1={} gz1={} gvx={} gvy={} gvz={} gx0[c_1],gy0[c_1],gz0[c_1]=0,0,0 gx0[c_2],gy0[c_2],gz0[c_2]=0,0,0 gx0[c_3],gy0[c_3],gz0[c_3]=0,0,0 gx1[c_1],gy1[c_1],gz1[c_1]=0,0,0 gx1[c_2],gy1[c_2],gz1[c_2]=0,0,0 gx1[c_3],gy1[c_3],gz1[c_3]=0,0,0 baseh=_Y(c_3) bal_i=0 bal_vy0=0 attack=0 -- len3 ----------------------------------------------------------------------- function math.len3(x,y,z,cn) x,y,z=x-_X(cn),y-_Y(cn),z-_Z(cn) return math.sqrt(x^2+y^2+z^2) end -- 角度補正 ------------------------------------------------------------------- function angle_hosei(a) while a> math.pi do a=a-math.pi*2 end while a<-math.pi do a=a+math.pi*2 end return a end -- 出力リミッタ --------------------------------------------------------------- function limiter(jp,limit) jp=math.min(limit,math.max(-limit,jp)) return jp end -- GETWPOS -------------------------------------------------------------------- function getwpos(lx,ly,lz,cn) -- Z軸回転を加算する(AZだけ回転させる) ly,lx=ly*math.cos(_EZ(cn))+lx*math.sin(_EZ(cn)),lx*math.cos(_EZ(cn))-ly*math.sin(_EZ(cn)) -- X軸回転を加算する(AXだけ回転させる) lz,ly=lz*math.cos(_AX(cn))+ly*math.sin(_AX(cn)),ly*math.cos(_AX(cn))-lz*math.sin(_AX(cn)) -- Y軸回転を加算する(AYだけ回転させる) lz,lx=lz*math.cos(_AY(cn))-lx*math.sin(_AY(cn)),lx*math.cos(_AY(cn))+lz*math.sin(_AY(cn)) return lx,ly,lz end -- GETLPOS -------------------------------------------------------------------- function getlpos(lx,ly,lz,cn) -- Y軸回転を差し引く(-AYだけ回転させる) lz,lx=lz*math.cos(_AY(cn))+lx*math.sin(_AY(cn)),lx*math.cos(_AY(cn))-lz*math.sin(_AY(cn)) -- X軸回転を差し引く(-AXだけ回転させる) lz,ly=lz*math.cos(_AX(cn))-ly*math.sin(_AX(cn)),ly*math.cos(_AX(cn))+lz*math.sin(_AX(cn)) -- Z軸回転を差し引く(-AZだけ回転させる) ly,lx=ly*math.cos(_EZ(cn))-lx*math.sin(_EZ(cn)),lx*math.cos(_EZ(cn))+ly*math.sin(_EZ(cn)) return lx,ly,lz end -- ガス ----------------------------------------------------------------------- function gas(cn,gas) local bal_p,bal_d=0,0 local y=gy1[cn] local vy=gvy[cn] -- 低空補正 if(_H(cn)>=0) then vy=vy-(10-_H(cn))*0.1 end -- 上空補正 if(_Y(cn)>=baseh+100) then vy=vy-(baseh+100-_Y(cn))*0.1 end -- 各項係数 local kp=100 local ki=kp local kd=kp -- 比例項 bal_p=-vy*kp -- 積分項 bal_i=bal_i-vy*ki bal_i=math.min(10000,math.max(0,bal_i)) -- 微分項 bal_d=(bal_vy0-vy)*kd bal_vy0=vy -- PID制御(リミッタ付) local dh=bal_p+bal_i+bal_d-gas dh=math.min(1000,math.max(-1000,dh)) gas=gas+dh return gas end -- 重心速度 ------------------------------------------------------------------- function gvel(cn) gx1[cn],gy1[cn],gz1[cn]=_GX(cn),_GY(cn),_GZ(cn) gvx[cn],gx0[cn]=(gx1[cn]-gx0[cn])*30,gx1[cn] gvy[cn],gy0[cn]=(gy1[cn]-gy0[cn])*30,gy1[cn] gvz[cn],gz0[cn]=(gz1[cn]-gz0[cn])*30,gz1[cn] end -- ジェット出力並進制御 ------------------------------------------------------- function jetlshift(lx,ly,lz,p,cn) local jp={} local br,t lx,ly,lz=getlpos(lx,ly,lz,cn) if math.abs(ly)<15 then br=0.2 else br=0 end t=p*(ly-_VY(cn)*br) for i=1,2 do jp[i]=t end if math.abs(lx)<15 then br=0.2 else br=0 end t=p*(lx-_VX(cn)*br) for i=3,4 do jp[i]=t end if math.abs(lz)<15 then br=0.2 else br=0 end t=p*(lz-_VZ(cn)*br)*0.5 for i=5,8 do jp[i]=t end for i=1,8,1 do jp[i]=limiter(jp[i],100000) end return jp[1],jp[2],jp[3],jp[4],jp[5],jp[6],jp[7],jp[8] end -- ジェット出力回転制御 ------------------------------------------------------- function jetlroll(rx,ry,rz,p,cn) local jp={} local br=0.2 jp[1]=p*(rz-_WZ(cn)*br)*0.5 jp[2]=-jp[1] jp[3]=jp[1] jp[4]=jp[2] jp[5]=p*(rx-_WX(cn)*br) jp[6]=-jp[5] jp[7]=-p*(ry-_WY(cn)*br) jp[8]=-jp[7] for i=1,8 do jp[i]=limiter(jp[i],100000) end return jp[1],jp[2],jp[3],jp[4],jp[5],jp[6],jp[7],jp[8] end -- 重力補正 ------------------------------------------------------------------- function gravity_hosei(cn) local jp={} local g=mass[cn]*9.80665*3 jp[1],jp[2],jp[3],jp[4],jp[5],jp[6],jp[7],jp[8]=jetlshift(0,1,0,g,cn) return jp[1],jp[2],jp[3],jp[4],jp[5],jp[6],jp[7],jp[8] end -- 並進目標 ----------------------------------------------------------------- function target_p(cn,ct,r) local lx,ly,lz if(math.random(100)<3) then tgtx[cn]=math.random()*2*r-r tgty[cn]=math.random()*2*r-r tgtz[cn]=math.random()*2*r-r end local k=0.5 lx=tgtx[cn]+gx1[ct]+gvx[ct]*k ly=tgty[cn]+gy1[ct]+gvy[ct]*k lz=tgtz[cn]+gz1[ct]+gvz[ct]*k if(ly=0) then k=(-b-math.sqrt(d))/2/a else k=0 end lx=lx+vx*k ly=ly+vy*k lz=lz+vz*k local rx=math.atan2(ly,math.sqrt(lx^2+lz^2))-_AX(cn) local ry=math.atan2(-lx,-lz)-_AY(cn) local rz=-_EZ(cn) rx=angle_hosei(rx) ry=angle_hosei(ry) return rx,ry,rz end -- ファンネル制御 ------------------------------------------------------------- function fannel(cn,ct) local jp={} local js={} local tx,ty,tz local beam=0 js[1],js[2],js[3],js[4],js[5],js[6],js[7],js[8]=gravity_hosei(cn) for i=1,8 do jp[i]=js[i] end local lx,ly,lz,dst=target_p(cn,ct,30) js[1],js[2],js[3],js[4],js[5],js[6],js[7],js[8]=jetlshift(lx,ly,lz,80000,cn) for i=1,8 do jp[i]=jp[i]+js[i] end local rx,ry,rz=target_r(cn,ct) js[1],js[2],js[3],js[4],js[5],js[6],js[7],js[8]=jetlroll(rx,ry,rz,40000,cn) for i=1,8 do jp[i]=jp[i]+js[i] end local a=math.rad(3) if(math.abs(rx)0) then beam=1000000 end return jp[1],jp[2],jp[3],jp[4],jp[5],jp[6],jp[7],jp[8],beam end -- メイン --------------------------------------------------------------------- function main() -- 質量計算 if(_TICKS()<2) then mass={} mass[c_1]=0 mass[c_2]=0 mass[c_3]=0 for i=c_1,c_2-1 do mass[c_1]=mass[c_1]+_M(i) end for i=c_2,c_3-1 do mass[c_2]=mass[c_2]+_M(i) end for i=c_3,_CHIPS()-1 do mass[c_3]=mass[c_3]+_M(i) end t=_SPLIT(c_2) t=_SPLIT(c_3) end gvel(c_1) gvel(c_2) gvel(c_3) JP1_1,JP2_1,JP3_1,JP4_1,JP5_1,JP6_1,JP7_1,JP8_1,BEAM_1=fannel(c_1,c_3) JP1_2,JP2_2,JP3_2,JP4_2,JP5_2,JP6_2,JP7_2,JP8_2,BEAM_2=fannel(c_2,c_3) GAS_3=gas(c_3,GAS_3) if(attack==0) then math.randomseed(_TICKS()) t=_SETCOLOR(255) t=_MOVE3D(gx1[c_1],gy1[c_1],gz1[c_1]) t=_LINE3D(gx1[c_3],gy1[c_3],gz1[c_3]) t=_SETCOLOR(255*65536) t=_MOVE3D(gx1[c_2],gy1[c_2],gz1[c_2]) t=_LINE3D(gx1[c_3],gy1[c_3],gz1[c_3]) end if(_KEY(7)>0) then attack=1 end if(_KEY(8)>0) then attack=0 end local vel=math.sqrt(gvx[c_1]^2+gvy[c_1]^2+gvz[c_1]^2) out(0,"FPS=",_FPS(),", CHIPS=",_CHIPS(),", WEIGHT=",_WEIGHT(),"kg, SPEED=",vel*3.6,"km/h") out(1,"A:Attack, S:Stop") end }