Cannon

View previous topic View next topic Go down

Cannon

Post by DanielLC on Sat Dec 18, 2010 12:14 am

The model itself is pretty useless. It's just a basic car with a gun attached, and the gun doesn't even fire. All it does is set SHOOT to 10000000 once a second if you hold z.

The campaign fires a very heavy ball from GUN with a force of SHOOT every time it's non-zero.

I hope this will be just the first in a series of campaign-enhanced models. Think of what you could build: grenades that explode into shrapnel after a second, sailboats that can control the wind, gravity guns. The possibilities are endless.

If you want to use this, I'd suggest making a good model to shoot from.

BasicGun.txt
Code:
Val
{
   Brake(default=0,min=0,max=80,step=80)
   HBrake(default=0,min=0,max=100,step=100)
   Handle(default=0,min=-20,max=20,step=5)
   Engine(default=0,min=-2500,max=2500,step=2500)
   trigger(default=0,max=1,step=1)
   timer(default=0,step=1)
   shoot(default=0,step=10000000)
}
Key
{
   0:Engine(step=-500)
   1:Engine(step=500)
   2:Handle(step=-0.5)
   3:Handle(step=0.5)
   4:trigger(step=1)
   7:Brake(step=30),HBrake(step=20)
   8:HBrake(step=20)
}
Body {
   Core(){
      N:Chip(){
         N:Rudder(angle=Handle){
            N:Arm(name=GUN){}
            W:Frame(){
               W:Wheel(angle=90,brake=Brake){
               }
            }
            E:Frame(){
               E:Wheel(angle=90,brake=Brake){
               }
            }
         }
      }
      S:Chip(){
         W:Frame(){
            W:Wheel(angle=90,power=Engine,brake=HBrake){
            }
         }
         E:Frame(){
            E:Wheel(angle=90,power=-Engine,brake=HBrake){
            }
         }
      }
   }
}
Lua
{
function main()
  if TRIGGER == 1 and TIMER == 0 then
    TIMER = 30
    SHOOT = 10000000
  end
end
}
Cannon.rcs
Code:
function qmult(q1,q2)
  local q3={0,0,0,0}
  q3[1]=q1[2]*q2[3]-q1[3]*q2[2]+q1[4]*q2[1]+q1[1]*q2[4]
  q3[2]=q1[3]*q2[1]-q1[1]*q2[3]+q1[4]*q2[2]+q1[2]*q2[4]
  q3[3]=q1[1]*q2[2]-q1[2]*q2[1]+q1[4]*q2[3]+q1[3]*q2[4]
  q3[4]=q1[4]*q2[4]-q1[1]*q2[1]-q1[2]*q2[2]-q1[3]*q2[3]
  return(q3)
end

function qinv(q)
  return({-q[1],-q[2],-q[3],q[4]})
end

function rot(v,q)
  return qmult(qmult(q,v),qinv(q))
end
function fire()
  r = rot({0,0,-1,0},{_QX(GUN),_QY(GUN),_QZ(GUN),_QW(GUN)})
  _WARPOBJ(0,_X(GUN)+r[1],_Y(GUN)+r[2],_Z(GUN)+r[3])
  _ENERVATEOBJ(0)
  _FORCEOBJ(0,SHOOT*r[1],SHOOT*r[2],SHOOT*r[3])
--_FORCEOBJ(0,-SHOOT*r[1],-SHOOT*r[2],-SHOOT*r[3])
--recoil
end

function OnFrame()
  out(0,SHOOT)
  if SHOOT ~= 0 then
    fire()
  end
end

function OnInit()
  _SETRINGSTATE(0,0)
  _ADDBALL(0.2,0,0,0,10)
--(size,x,y,z,density)
  _SETOBJCOLOR(0,0,0,0)
end

function OnReset()

end

function OnMode()

end

DanielLC
Tank
Tank

Posts : 78
Join date : 2010-10-23

View user profile

Back to top Go down

Re: Cannon

Post by JHaskly on Sat Dec 18, 2010 6:59 pm

Could I suggest keeping the ability to spawn the large purple balls? You need something to shoot Wink

_________________
Previously (and currently) known as Juz.

Please do not write "LUA", beause it's "Lua". It's Moon in Portuguese, not a Limited User Account, Last Universal Ancestor, or the Lukla Airport in Nepal.

JHaskly
Admin

Posts : 235
Join date : 2010-07-16
Age : 21
Location : Brisbane

View user profile

Back to top Go down

Re: Cannon

Post by DanielLC on Sat Dec 18, 2010 7:13 pm

Grafting my mod and the scenario it runs before you run a scenario (System.rcs), I mad this:

Code:
function qmult(q1,q2)
  local q3={0,0,0,0}
  q3[1]=q1[2]*q2[3]-q1[3]*q2[2]+q1[4]*q2[1]+q1[1]*q2[4]
  q3[2]=q1[3]*q2[1]-q1[1]*q2[3]+q1[4]*q2[2]+q1[2]*q2[4]
  q3[3]=q1[1]*q2[2]-q1[2]*q2[1]+q1[4]*q2[3]+q1[3]*q2[4]
  q3[4]=q1[4]*q2[4]-q1[1]*q2[1]-q1[2]*q2[2]-q1[3]*q2[3]
  return(q3)
end

function qinv(q)
  return({-q[1],-q[2],-q[3],q[4]})
end

function rot(v,q)
  return qmult(qmult(q,v),qinv(q))
end
function fire()
  r = rot({0,0,-1,0},{_QX(GUN),_QY(GUN),_QZ(GUN),_QW(GUN)})
  _WARPOBJ(0,_X(GUN)+r[1],_Y(GUN)+r[2],_Z(GUN)+r[3])
  _ENERVATEOBJ(0)
  _FORCEOBJ(0,SHOOT*r[1],SHOOT*r[2],SHOOT*r[3])
--_FORCEOBJ(0,-SHOOT*r[1],-SHOOT*r[2],-SHOOT*r[3])
--recoil
end

WindLevel=0
LastBall=-1

function OnFrame()
   
   if(_SKEYDOWN(0)>0) then
      LastBall=_ADDBALL(0.6, 2, _GETY(2,0)+6+LastBall ,LastBall/10, 0.3)
      _SETOBJCOLOR(LastBall,1,0,1)
   end
   if(_SKEYDOWN(1)>0) then
      WindLevel=WindLevel+1
      if(WindLevel>3) then WindLevel=0 end
      if(WindLevel==0) then _SETWIND(0,0,0) end
      if(WindLevel==1) then _SETWIND(5,0,0) end
      if(WindLevel==2) then _SETWIND(16,0,0) end
      if(WindLevel==3) then _SETWIND(50,0,0) end
   end
   wx,wy,wz=_GETWIND()
   if(WindLevel~=0) then out(0,"Wind = ",wx," ",wy," ",wz) end
   if(LastBall>=0) then out(1,"Ball Count = ",LastBall+1) end

  if SHOOT ~= 0 then
    fire()
  end

  _ADDBALL(0.2,0,0,0,10)
--(size,x,y,z,density)
  _SETOBJCOLOR(0,0,0,0)
end

function OnInit()
   WindLevel=0
   LastBall=-1

--   cannonInit()
end

function OnReset()

end

DanielLC
Tank
Tank

Posts : 78
Join date : 2010-10-23

View user profile

Back to top Go down

Re: Cannon

Post by JHaskly on Sun Dec 19, 2010 7:04 am

Also, what you could perhaps do is to stor the fired balls in an array, so that the previous one is not deleted upon te next firing.

_________________
Previously (and currently) known as Juz.

Please do not write "LUA", beause it's "Lua". It's Moon in Portuguese, not a Limited User Account, Last Universal Ancestor, or the Lukla Airport in Nepal.

JHaskly
Admin

Posts : 235
Join date : 2010-07-16
Age : 21
Location : Brisbane

View user profile

Back to top Go down

Re: Cannon

Post by DanielLC on Sun Dec 19, 2010 1:33 pm

I don't need to store them. I did it that way because I didn't want a bunch of cannonballs lying around.

Or do you mean make them get deleted after a certain amount of time?

I'm logged on in linux right now, so I can't test this, but this should work:

Code:
function qmult(q1,q2)
  local q3={0,0,0,0}
  q3[1]=q1[2]*q2[3]-q1[3]*q2[2]+q1[4]*q2[1]+q1[1]*q2[4]
  q3[2]=q1[3]*q2[1]-q1[1]*q2[3]+q1[4]*q2[2]+q1[2]*q2[4]
  q3[3]=q1[1]*q2[2]-q1[2]*q2[1]+q1[4]*q2[3]+q1[3]*q2[4]
  q3[4]=q1[4]*q2[4]-q1[1]*q2[1]-q1[2]*q2[2]-q1[3]*q2[3]
  return(q3)
end

function qinv(q)
  return({-q[1],-q[2],-q[3],q[4]})
end

function rot(v,q)
  return qmult(qmult(q,v),qinv(q))
end
function fire()
  r = rot({0,0,-1,0},{_QX(GUN),_QY(GUN),_QZ(GUN),_QW(GUN)})
  _ADDBALL(0.2,0,0,0,10)
--(size,x,y,z,density)
  LastBall = LastBall + 1
  _SETOBJCOLOR(0,0,0,0)
  _FORCEOBJ(LastBall,SHOOT*r[1],SHOOT*r[2],SHOOT*r[3])
--_FORCE(GUN,-SHOOT*r[1],-SHOOT*r[2],-SHOOT*r[3])
--recoil
end

WindLevel=0
LastBall=-1

function OnFrame()
 
  if(_SKEYDOWN(0)>0) then
      LastBall=_ADDBALL(0.6, 2, _GETY(2,0)+6+LastBall ,LastBall/10, 0.3)
      _SETOBJCOLOR(LastBall,1,0,1)
  end
  if(_SKEYDOWN(1)>0) then
      WindLevel=WindLevel+1
      if(WindLevel>3) then WindLevel=0 end
      if(WindLevel==0) then _SETWIND(0,0,0) end
      if(WindLevel==1) then _SETWIND(5,0,0) end
      if(WindLevel==2) then _SETWIND(16,0,0) end
      if(WindLevel==3) then _SETWIND(50,0,0) end
  end
  wx,wy,wz=_GETWIND()
  if(WindLevel~=0) then out(0,"Wind = ",wx," ",wy," ",wz) end
  if(LastBall>=0) then out(1,"Ball Count = ",LastBall+1) end

  if SHOOT ~= 0 then
    fire()
  end

end

function OnInit()
  WindLevel=0
  LastBall=-1
end

function OnReset()

end

Also, if I do it this way, I could make it so the size and density of the ball can be controlled by the model. I'll probably do it that way.

DanielLC
Tank
Tank

Posts : 78
Join date : 2010-10-23

View user profile

Back to top Go down

Re: Cannon

Post by JHaskly on Mon Dec 20, 2010 8:14 am

Code:
// [RCD]
Val
{
   CANNON1CHIP(default=0)
   CANNON1MASS(default=0)
   CANNON1TRIG(default=0)
   CX1(default=-150, min=-999999, max=999999, disp=0)
   CX2(default=-120, min=-999999, max=999999, disp=0)
   CX3(default=90, min=-999999, max=999999, disp=0)
   CY1(default=90, min=-999999, max=999999, disp=0)
   CY2(default=-90, min=-999999, max=999999, disp=0)
   LX1A(default=30, min=-999999, max=999999, disp=0)
   LX1B(default=-120, min=-999999, max=999999, disp=0)
   LX2A(default=30, min=-999999, max=999999, disp=0)
   LX2B(default=-120, min=-999999, max=999999, disp=0)
   LX3A(default=30, min=-999999, max=999999, disp=0)
   LX3B(default=-120, min=-999999, max=999999, disp=0)
   LX4A(default=30, min=-999999, max=999999, disp=0)
   LX4B(default=-120, min=-999999, max=999999, disp=0)
   LX5A(default=30, min=-999999, max=999999, disp=0)
   LX5B(default=-120, min=-999999, max=999999, disp=0)
   LX6A(default=30, min=-999999, max=999999, disp=0)
   LX6B(default=-120, min=-999999, max=999999, disp=0)
   LY1(default=-60, min=-999999, max=999999, disp=0)
   LY2(default=0, min=-999999, max=999999, disp=0)
   LY3(default=60, min=-999999, max=999999, disp=0)
   LY4(default=60, min=-999999, max=999999, disp=0)
   LY5(default=0, min=-999999, max=999999, disp=0)
   LY6(default=-60, min=-999999, max=999999, disp=0)
}
Key
{
}
Body
{
   Core() {
      S:Jet(angle=-150, power=1) {
         S:Weight(angle=-120) { }
         S:Weight(angle=150) {
            W:Weight(angle=90) { }
            E:Weight(angle=90) { }
            S:Weight(angle=90) { }
            N:Arm(name=GUN) { }
         }
      }
      S:Jet(angle=CX1) {
         S:Jet(angle=CX2) {
            S:Weight(angle=CX3) {
               N:Weight() { }
               N:Rudder(angle=CY2) {
                  S:Weight(angle=180) { }
                  S:Rudder(angle=LY6) {
                     S:Weight(angle=LX6A) {
                        S:Weight() {
                           S:Weight(angle=LX6B) {
                              S:Weight() { }
                           }
                        }
                     }
                  }
                  S:Rudder(angle=LY5) {
                     S:Weight(angle=LX5A) {
                        S:Weight() {
                           S:Weight(angle=LX5B) {
                              S:Weight() { }
                           }
                        }
                     }
                  }
                  S:Rudder(angle=LY4) {
                     S:Weight(angle=LX4A) {
                        S:Weight() {
                           S:Weight(angle=LX4B) {
                              S:Weight() { }
                           }
                        }
                     }
                  }
               }
               N:Rudder(angle=CY1) {
                  S:Weight(angle=180) { }
                  S:Rudder(angle=LY1) {
                     S:Weight(angle=LX1A) {
                        S:Weight() {
                           S:Weight(angle=LX1B) {
                              S:Weight() { }
                           }
                        }
                     }
                  }
                  S:Rudder(angle=LY2) {
                     S:Weight(angle=LX2A) {
                        S:Weight() {
                           S:Weight(angle=LX2B) {
                              S:Weight() { }
                           }
                        }
                     }
                  }
                  S:Rudder(angle=LY3) {
                     S:Weight(angle=LX3A) {
                        S:Weight() {
                           S:Weight(angle=LX3B) {
                              S:Weight() { }
                           }
                        }
                     }
                  }
               }
            }
         }
      }
   }
}
Lua
{require("Juz/index.lua")

view = {x=0,y=0}
c = {}
for i =1,6 do c[i] = {} end
ui = {b=0}
eng = {}
mov = {ey=0}
_ZOOM(35)

function OnFrame()
   m = m or {t=1}
   m.t = mod(m.t+_KEYDOWN(11),2)
   m.m = mouseout(m.m)
   m.x,m.y = m.t*abs(m.m.x)^1.5*sgn(m.m.x),m.t*abs(m.m.y)^1.5*sgn(m.m.y)
   view.kx,view.ky = -(_KEY(0)-_KEY(1)+m.y),-(_KEY(2)-_KEY(3)-m.x)

   view.x = limit(view.x+view.kx*3,-90,30)
   view.y = cycle(view.y+view.ky*3,-180,180)
   view.t = mod((view.t or 0)+_KEYDOWN(13),2)
   out(9,view.t)
   eng.k = sgn(_KEY(15)+_KEY(8)+_KEY(7)+_KEY(9))
   mov.ey = animaterad(mov.ey,atan2((_KEY(15)-_KEY(8)),(_KEY(7)-_KEY(9)))+rad(view.y),pi)


   CX1 = animatedeg(CX1,atand2(0.5,-(cosd(30)-0.5))+acosd(len2(0.5,-(cosd(30)-0.5))/2),4)
   CX2 = animatedeg(CX2,-acosd(len2(0.5,-(cosd(30)-0.5))/2)*2,4)
   CX3 = 180-CX1-CX2+view.x

   CY1 = 90+view.y
   CY2 = -90+view.y

   ui.b = ui.b+0.2
   ui.o = oscillate(ui.b,-1,1)
   ui.llo = ui.o*eng.k*pi/2
   ui.llo2 = oscillate(pi/4+ui.b,-1,1)*eng.k*pi/2

   ui.defaultpos = 1.8+view.t*1
   ui.movlength = 1.2*(1-view.t)
   ui.ymovlength = 1/8*(1-view.t)

   c[1].x = cosd(60)*ui.defaultpos+cos(mov.ey)*eng.k*ui.llo/2*ui.movlength
   c[1].y = -1+sin(ui.llo2)*ui.ymovlength
   c[1].z = sind(60)*ui.defaultpos+sin(mov.ey)*eng.k*ui.llo/2*ui.movlength
   c[2].x = cosd(0)*ui.defaultpos-cos(mov.ey)*eng.k*ui.llo/2*ui.movlength
   c[2].y = -1-sin(ui.llo2)*ui.ymovlength
   c[2].z = sind(0)*ui.defaultpos-sin(mov.ey)*eng.k*ui.llo/2*ui.movlength
   c[3].x = cosd(-60)*ui.defaultpos+cos(mov.ey)*eng.k*ui.llo/2*ui.movlength
   c[3].y = -1+sin(ui.llo2)*ui.ymovlength
   c[3].z = sind(-60)*ui.defaultpos+sin(mov.ey)*eng.k*ui.llo/2*ui.movlength
   c[4].x = cosd(60)*ui.defaultpos+cos(mov.ey)*eng.k*ui.llo/2*ui.movlength
   c[4].y = -1-sin(ui.llo2)*ui.ymovlength
   c[4].z = sind(60)*ui.defaultpos-sin(mov.ey)*eng.k*ui.llo/2*ui.movlength
   c[5].x = cosd(0)*ui.defaultpos-cos(mov.ey)*eng.k*ui.llo/2*ui.movlength
   c[5].y = -1+sin(ui.llo2)*ui.ymovlength
   c[5].z = sind(0)*ui.defaultpos+sin(mov.ey)*eng.k*ui.llo/2*ui.movlength
   c[6].x = cosd(-60)*ui.defaultpos+cos(mov.ey)*eng.k*ui.llo/2*ui.movlength
   c[6].y = -1-sin(ui.llo2)*ui.ymovlength
   c[6].z = sind(-60)*ui.defaultpos-sin(mov.ey)*eng.k*ui.llo/2*ui.movlength

   for i = 1,6 do
      c[i].i = {}
      c[i].i.vflip = -sgn(3.5-i)
      c[i].i.ey = atand2(c[i].z,c[i].x)
      c[i].i.zlen = 0.5+(cosd(c[i].i.ey)*c[i].x+sind(c[i].i.ey)*c[i].z)/2
      c[i].i.ex = atand2(c[i].y/2,c[i].i.zlen)
      c[i].i.len = len2(c[i].i.zlen,c[i].y/2)
      c[i].i.el = acosd(c[i].i.len/2)

      _G["LY"..i] = animate(_G["LY"..i],c[i].i.ey*c[i].i.vflip,10)
      _G["LX"..i.."A"] = animate(_G["LX"..i.."A"],c[i].i.ex+c[i].i.el,10)
      _G["LX"..i.."B"] = animate(_G["LX"..i.."B"],-c[i].i.el*2,10)
   end



   out(0,"'Walker Frame', by Juz.")
   out(2,"[Arrow Keys] = Look around.  [WASD] = Directional Controls.")
   
   CANNON1TRIG = 100*m.m.ld*m.t
   CANNON1MASS = 100
   CANNON1CHIP = GUN
end}

And here's the scenario:
Code:
function init()
   cannon = {}
   cannon.radius = 0.3
   cannon.fireoffset = 0.3+cannon.radius
   cannon.gun = {i = 1}
   cannon.balls = {i=10}
   cannon.ballsi = {}
   cannon.dballs = 0
   LastBall = -1

   while _G['CANNON'..cannon.gun.i..'TRIG'] do
      cannon.gun[cannon.gun.i] = {}
      cannon.gun.i = cannon.gun.i+1
   end
   cannon.gun.i = cannon.gun.i-1

   cannon.update = function()
      for i = 1,cannon.gun.i do
         cannon.gun[i].trig = _G['CANNON'..i..'TRIG']
         cannon.gun[i].chip = _G['CANNON'..i..'CHIP']
         cannon.gun[i].weight = _G['CANNON'..i..'MASS']
      end
   end

   cannon.fire = function(gun)
      local chip = cannon.gun[gun].chip
      local zx,zy,zz = -_ZX(chip),-_ZY(chip),-_ZZ(chip)
      if cannon.balls[cannon.balls.i] == nil then cannon.balls[cannon.balls.i] = _ADDBALL(cannon.radius,0,0,0,cannon.gun[gun].weight/(cannon.radius^3*math.pi*4/3)/1000) end
      _ENERVATEOBJ(cannon.balls[cannon.balls.i])
      _WARPOBJ(cannon.balls[cannon.balls.i],_X(chip)+zx*cannon.fireoffset,_Y(chip)+zy*cannon.fireoffset,_Z(chip)+zz*cannon.fireoffset)
      _SETOBJCOLOR(cannon.balls[cannon.balls.i],1,0,0)
      local force = cannon.gun[gun].weight*cannon.gun[gun].trig/_DT()
      _FORCEOBJ(cannon.balls[cannon.balls.i],zx*force,zy*force,zz*force)
      cannon.balls.i = cycle(cannon.balls.i+1,10,20)
   end

   cycle = function(v0,v1,v2)
      while v0 > v2 do v0 = v0-math.abs(v1-v2) end
      while v0 < v1 do v0 = v0+math.abs(v1-v2) end
      return v0
   end
end
init()
function OnInit() init() end
--function OnReset() init() end

function OnFrame()
   cannon.update()
   for i = 1,cannon.gun.i do
      if cannon.gun[i].trig ~= 0 then cannon.fire(i) end
   end
   
   if(_SKEYDOWN(0)>0) and cannon.dballs < 10 then
      cannon.balls[cannon.dballs] = _ADDBALL(0.6, 2, _GETY(2,0)+5 ,-cannon.balls.i, 1)
      _SETOBJCOLOR(cannon.balls[cannon.dballs],1,0,1)
      cannon.dballs = cannon.dballs+1
   end
end

I haven't had time to document it, but I think it should be pretty easy to work out Smile

_________________
Previously (and currently) known as Juz.

Please do not write "LUA", beause it's "Lua". It's Moon in Portuguese, not a Limited User Account, Last Universal Ancestor, or the Lukla Airport in Nepal.

JHaskly
Admin

Posts : 235
Join date : 2010-07-16
Age : 21
Location : Brisbane

View user profile

Back to top Go down

Re: Cannon

Post by Sponsored content


Sponsored content


Back to top Go down

View previous topic View next topic Back to top

- Similar topics

 
Permissions in this forum:
You cannot reply to topics in this forum