REM Project: MyProject REM Created: 2/05/2005 9:41:34 PM REM REM ***** Main Source File ***** REM path$=GET DIR$()+"\":rem get the path of exe needed for setup programs set text font "Times New Roman":set text to bold #constant youWon=202 #constant gameover=201 #constant missileLife=150 #constant gamePaused=200 #constant preloader=100 #constant overlay=101 sync on sync rate 1000:cls `create a loading screen ink rgb(200,0,0),rgb(5,5,5) create bitmap 1,800,600 set text size 20 set current bitmap 1:cls rgb(5,5,5) set cursor 5,270:print "Loading Objects" set cursor 5,290:print "Creating Guages" set cursor 5,310:print "Creating Heads Up" set cursor 5,330:print "Creating Matrix" set cursor 5,350:print "Creating Sky" set cursor 5,370:print "Setting Particles" set cursor 5,390:print "Creating Camera's" set cursor 5,410:print "Setting Boundaries" set cursor 5,430:print "Setting Collisions" set cursor 5,450:print "Loading Sounds" get image overlay,400,0,800,300 set text size 50 center text screen width()/2,20,"Killer Scuds" get image preloader,0,0,800,600 set current bitmap 0:delete bitmap 1 sprite preloader,0,0,preloader:set sprite priority preloader,65534 sprite overlay,0,280,overlay:set sprite priority overlay,65535 sync:rem place loading bar:prior to further loading `this command directly controls the ammount of levels #constant maxOpponents=10 #constant computer=103 #constant playermissile=201 #constant computermissile=202 #constant computermove=4 #constant computermissilemove=5 #constant computerexplosion=6 #constant particleImage=5 `define a computer opponent type opponent cobject as integer `holds object number missileObject as integer `holds missile object number moveSound as integer `holds move sound missileMoveSound as integer `holds missile move sound explosionSound `missile explosion sound missileFlag as boolean `missile fired true false frame as integer `animation Frame tempFrame as integer `temporary frame angle as float oldAngle as float frameCounter as integer explode as integer `holds exploded true or false x as float `comp x location y as float `comp y location z as float `comp z location mx as float `missile x location my as float `missile y location mz as float `missile z location power as float `missile power particleFrequency as integer `particle frequency cpitch as boolean `holds direction of missile pitch cmissileLife as integer `missile Life endtype dim computer(maxOpponents) as opponent compsounds=computermove for t = 0 to maxOpponents-1 computer(t).cobject=computer+t computer(t).missileObject=computermissile+t computer(t).moveSound=compsounds computer(t).missileMoveSound=compsounds+1 computer(t).explosionSound=compsounds+2 computer(t).frame=0 computer(t).frameCounter=1 computer(t).tempFrame=computer(t).frame computer(t).x=0 computer(t).y=0 computer(t).z=0 computer(t).explode=0 computer(t).missileFlag=0 computer(t).mx=0 computer(t).my=0 computer(t).mz=0 computer(t).particleFrequency=0 computer(t).cpitch=0 computer(t).power=0 computer(t).cmissileLife=0 inc compsounds,3 next t randomize TIMER() Hide Mouse #constant player1=101 #constant playerExplode=102 load object path$+"Objects\Scud Launcher\L-Scud Launcher-Attack1.X",player1 APPEND OBJECT path$+"Objects\Scud Launcher\L-Scud Launcher-Move.X",player1,65 clone object playerExplode,player1 hide object playerExplode `#constant computer=103 `#constant computerExplode=104 load object path$+"Objects\Scud Launcher 2\L-Scud Launcher 2-Attack1.X",computer(0).cobject APPEND OBJECT path$+"Objects\Scud Launcher 2\L-Scud Launcher 2-Move.X",computer(0).cobject,65 for t= 1 to maxOpponents-1 clone object computer(t).cobject,computer(0).cobject `ensure object is rotated and fix the rotation pivot must be done for point to work rotate object computer(t).cobject,0,180,0 FIX OBJECT PIVOT computer(t).cobject next t `ensure object is rotated and fix the rotation pivot must be done for point to work rotate object computer(0).cobject,0,180,0 FIX OBJECT PIVOT computer(0).cobject sprite overlay,0,300,overlay:sync `constants for image numbers #constant guages=4 #constant compasndle=1 #constant scoreImage=5 `the score image number load bitmap path$+"Graphics\Console5.bmp",1 set current bitmap 1 get image guages,0,0,104,334,1`console image get image compasndle,106,0,107,30,1 set current bitmap 0 delete bitmap 1 sprite overlay,0,300,overlay:sync `Load the Radar #constant HUD=2 #constant OLDHUD=3 sync:create bitmap 1,320,240 load image path$+"Graphics\HUD.bmp",OLDHUD,1 set current bitmap 0 sprite overlay,0,320,overlay:sync rem make our matrix #constant mapsize=1000 #constant mymatrix=1 load image path$+"Graphics\dirt.bmp",20`This is our texture for the terrain make matrix mymatrix,mapsize,mapsize,25,25 prepare matrix texture mymatrix,20,1,1 rem undulate it randomize matrix mymatrix,10 rem make our undulations take effect update matrix mymatrix sprite overlay,0,340,overlay:sync `Our variable for the skysphere. #constant sky=10 load image path$+"Graphics\sky06.jpg",sky `Load our texture for the skysphere. make object sphere sky,(-mapsize*2) `Here we create our sphere, and ensure it's big enough `to cover the map, by multiplying it by the mapsize. texture object sky,sky `Texture our sky with the sky texture. position object sky,mapsize/2,0,mapsize/2 `We position our skysphere. `Note that we divide the mapsize by 2 because our object `has been rotated. :) `Later on, in the main loop, we'll rotate the skysphere. This will create the illusion that `the sky is actually moving like it really does. SET OBJECT TEXTURE sky,1,0 SET OBJECT LIGHT sky,0 `set the sky to have no lighting effects scale=100:x#=mapsize/2:z#=mapsize/2:y#=get ground height(mymatrix,x#,z#) `minimum distance for scuds to be apart #constant minPDist=75 mflag=0 `player missile flag holds whether missile fired frame=0 `player animation frame of object `camera constants for console camera #constant cdist=500 #constant chght=200 #constant csmth=50.0 sprite overlay,0,360,overlay:sync `Make the missiles scale object player1,scale,scale,scale `scale object computer,scale,scale,scale MAKE OBJECT FROM LIMB playermissile,player1,11 glue object to limb playermissile,player1,11 hide limb player1,11 for t = 0 to maxOpponents-1 MAKE OBJECT FROM LIMB computer(t).missileObject,computer(t).cobject,11 `ensure computer missile is facing the right way rotate object computer(t).missileObject,0,180,0 FIX OBJECT PIVOT computer(t).missileObject`fix the rotation `glue the missiles to the scud launchers hide limb computer(t).cobject,11 glue object to limb computer(t).missileObject,computer(t).cobject,11 hide object computer(t).cobject:hide object computer(t).missileObject next t sprite overlay,0,380,overlay:sync`410 `Make the particles explosion for player missile pfrequency=0 #constant particleImage=5 load image path$+"Graphics\FireExp2.bmp",particleImage make particles playermissile,particleImage,100,40.0 position particles playermissile,x#,y#,z# color particles playermissile,255,100,0 hide particles playermissile set particle emissions playermissile,0 set particle speed playermissile,0.01 set particle gravity playermissile,2 `Make the particles explosion for computer missile for t=0 to maxOpponents-1 make particles computer(t).missileObject,particleImage,100,40.0 position particles computer(t).missileObject,computer(t).x,computer(t).y,computer(t).z color particles computer(t).missileObject,255,100,0 hide particles computer(t).missileObject set particle emissions computer(t).missileObject,0 set particle speed computer(t).missileObject,0.01 set particle gravity computer(t).missileObject,2 next t gosub setupSmoke y#=get ground height(mymatrix,x#,z#) position object player1,x#,y#,z# `set some default colour constants for quicker calling #constant black=rgb(0,0,0) red=rgb(255,0,0) green=rgb(0,255,0) blue=rgb(0,0,255) #constant white=rgb(255,255,255) sprite overlay,0,400,overlay:sync `set camera so as the sky can be seen SET CAMERA RANGE 1,mapsize*2 `night time effect `Fog on `Fog distance 500 `Fog color RGB(10,10,10) `Color Backdrop RGB(10,10,10) `make a camera to put in console for sideview #constant sideview=1 make camera sideview SET CAMERA RANGE sideview,1,500 SET CAMERA VIEW sideview,2,179,102,239 `make a camera to put in console for missile cam #constant misscam=2 make camera misscam SET CAMERA VIEW misscam,2,244,102,304 SET CAMERA RANGE misscam,1,2000 sprite overlay,0,420,overlay:sync `make wall to be used for keeping opponents in matrix make object box 100, mapsize*2,50,2 INSTANCE OBJECT 99,100:yrotate object 99,90 INSTANCE OBJECT 98,100:yrotate object 98,90 INSTANCE OBJECT 97,100 position object 100,mapsize,get ground height(mymatrix,x#,z#),mapsize position object 99,0,get ground height(mymatrix,x#,z#),mapsize/2 position object 98,mapsize,get ground height(mymatrix,x#,z#),mapsize/2 position object 97,0,get ground height(mymatrix,x#,z#),0 set object collision on 100 set object collision to boxes 100 set object collision on 99 set object collision to boxes 99 set object collision on 98 set object collision to boxes 98 set object collision on 97 set object collision to boxes 97 hide object 100:hide object 99:hide object 98:hide object 97 sprite overlay,0,440,overlay:sync `set object collision on player set object collision on playerExplode set object collision on playermissile set object collision off sky SET OBJECT COLLISION TO BOXES player1 SET OBJECT COLLISION TO BOXES playerExplode SET OBJECT COLLISION TO POLYGONS playermissile for t=0 to maxOpponents-1 set object collision on computer(t).cobject set object collision to boxes computer(t).cobject set object collision on computer(t).missileObject set object collision to polygons computer(t).missileObject next t `sound constants #constant playermove=1 #constant playermissilemove=2 #constant playerexplosion=3 #constant maxLives=10 #constant levelImage=300 pexplode=0:pkills=0:plives=maxLives:level=1:nextLevel=1:playerDied=0 sprite overlay,0,460,overlay:sync LOAD 3DSOUND path$+"Sounds\Tank.wav",playermove LOAD 3DSOUND path$+"Sounds\Missile.wav",playermissilemove LOAD 3DSOUND path$+"Sounds\Explosion.wav",playerexplosion SET SOUND VOLUME playermove,85 for t = 0 to maxOpponents-1 CLONE SOUND computer(t).moveSound,playermove SET SOUND VOLUME computer(t).moveSound,85 CLONE SOUND computer(t).missileMoveSound,playermissilemove CLONE SOUND computer(t).explosionSound,playerexplosion next t loop sound playermove `loop sound computermove POSITION LISTENER x#,y#,z# gosub fadeIn DO if leftkey() and pexplode=0 oldang#=ang#`store the old angle for collisions ang#=wrapvalue(ang#-.59) endif if rightkey() and pexplode=0 oldang#=ang#`store the old angle for collisions ang#=wrapvalue(ang#+.59) endif if upkey () and pexplode=0 if frame<=40 dec frame if frame<0 then frame=90`:show limb 200,11 set object frame player1,frame else if frame>65 then dec frame set object frame player1,frame if frame=65 then frame=90 x#=newxvalue(x#,ang#,-.59) z#=newzvalue(z#,ang#,-.59) endif endif if downkey () and pexplode=0 if frame<=40 dec frame if frame<0 then frame=90`:show limb 200,11 set object frame player1,frame else if frame<90 then inc frame set object frame player1,frame if frame=90 then frame=65 x#=newxvalue(x#,ang#,.59) z#=newzvalue(z#,ang#,.59) endif endif key$=UPPER$(inkey$()) if key$="A" and pexplode=0 if frame<40 then inc frame if frame>40 then frame=1 set object frame player1,frame endif if key$="Z" and pexplode=0 if frame>0 then dec frame if frame>40 then frame=1 set object frame player1,frame endif if key$="P" then gosub pauseScreen if spacekey() and mflag=0 and pexplode=0 power#=.2 mflag=1 endif if mflag=1 `get the power from user if spacekey() and power#<1 and pexplode=0 ink white,black inc power#,.025`.0025 box 2,309,(int(power#*100))+2,332 else mflag=2`reposition the missile and unglue angle#=wrapvalue(object angle y(player1)):ppitch=0 yrot#=limb direction y(playermissile,0):xrot#=limb direction x(playermissile,0) if angle#=90 or angle#=270 then yrot#=360-yrot#:xrot#=((frame/70.00)*100.00) if angle#>90 and angle#<270 then ppitch=1:yrot#=360-yrot#:xrot#=(360-xrot#) pmlife=0:unglue object playermissile yrotate object playermissile,yrot# xrotate object playermissile,xrot# PLAY SOUND playermissilemove endif endif if mflag=2 `missile has fired move it inc pmlife if ppitch=0 then PITCH OBJECT DOWN playermissile,-((1.01-power#)+1.00) if ppitch=1 then PITCH OBJECT DOWN playermissile,((1.01-power#)+1.00) move object playermissile,-(power#+1.00) mx#=object position x(playermissile) my#=object position y(playermissile) mz#=object position z(playermissile) theight#=get ground height(mymatrix,mx#,mz#) POSITION SOUND playermissilemove,mx#,my#,mz# mhit= object collision (playermissile,0) t=0:repeat if (theight#>my#) or OBJECT VISIBLE(playermissile)=0 or mhit=computer(t).cobject or pmlife>missileLife mflag=0`:mhit=OBJECT COLLISION(playermissile,player1) POSITION SOUND playerexplosion,mx#,my#,mz# PLAY SOUND playerexplosion position particles playermissile,mx#,my#,mz# pfrequency=50:show particles playermissile set particle emissions playermissile,pfrequency glue object to limb playermissile,player1,11 `reposition the scud on the launcher position object playermissile,0,0,0 rotate object playermissile,0,0,0 if mhit=computer(t).cobject and computer(t).explode=0 position object computer(t).cobject,computer(t).x,computer(t).y,computer(t).z yrotate object computer(t).cobject,int(rnd(360)) calctilt(computer(t).cobject,computer(t).x,computer(t).z,OBJECT ANGLE Y(computer(t).cobject),2) computer(t).explode=1:inc pkills if pkills= levelChange(level) if levellevel-1 `if mhit=player1 ` position object playerExplode,x#,y#,z# ` calctilt(playerExplode,x#,z#,OBJECT ANGLE Y(playerExplode),2) ` hide object player1:show object playerExplode ` pexplode=1 `endif endif `the computer has exploded reposition him `this code needs moving if nextLevel>level inc level:gosub doNewLevel endif t=0:repeat `if computer(t).explode>0 `needed to check if computer shot himself or if computer(t).explode=2 gosub placeComp:show object computer(t).cobject computer(t).explode=0 endif `endif inc t:until t>level-1 `the player has exploded reposition him/her if pexplode=1 pexplode=0 if plives>0 `testing code oldx#=x#:oldz#=z#:oldy#=y# ang#=object angle y(player1) gosub placePlayer:show object player1 gosub showRadar:playerDied=1 repeat `PDist=calcDistance(oldx#,y#,oldz#,x#,y#,z#) if oldx#>x# then dec oldx# if oldz#>z# then dec oldz# if oldx#0 then dec computer(t).particleFrequency,5:set particle emissions computer(t).missileObject,computer(t).particleFrequency inc t:until t>level-1 POSITION LISTENER oldx#,y#,oldz# sync until oldx#<(x#+1) and oldx#>(x#-1) and oldz#<(z#+1) and oldz#>(z#-1) `end testing code else gosub endGame end endif endif if pfrequency>0 then dec pfrequency,5:set particle emissions playermissile,pfrequency if playerDied=1 count=1500 smokex#=object position x(playerExplode) smokey#=object position y(playerExplode) smokez#=object position z(playerExplode) t=11:gosub positionSmoke endif t=0:repeat if computer(t).particleFrequency>0 then dec computer(t).particleFrequency,5:set particle emissions computer(t).missileObject,computer(t).particleFrequency `smoke testing if computer(t).explode>=1 count=(100*t)+300 smokex#=computer(t).x smokey#=computer(t).y smokez#=computer(t).z gosub positionSmoke endif `end smoke testing inc t:until t>level-1 gosub SlidingCollisionPlayer `gosub SlidingCollisionComputer `position where the sounds will be heard from in the 3dworld POSITION LISTENER x#,y#,z# POSITION SOUND playermove,x#,y#,z# `POSITION SOUND computermove,cx#,cy#,cz# `the screen camera POSITION CAMERA x#,y#,z# SET CAMERA TO FOLLOW x#,y#,z#,ang#+180,cdist,chght,csmth,1 `the console camera POSITION CAMERA sideview,x#,y#,z# SET CAMERA TO FOLLOW sideview,x#,y#,z#,ang#-90,cdist,chght,csmth,1 `missile camera POSITION CAMERA misscam,mx#,my#,mz# ca2#=LIMB ANGLE Y(playermissile,0) SET CAMERA TO FOLLOW misscam,mx#,my#,mz#,object angle y(playermissile),cdist,my#,csmth,0 sprite 1,0,0,guages`console sprite 2,52,137,compasndle`needle for console sprite 3,550,0,scoreImage rotate sprite 2,ang#+180 Rem make radar gosub showRadar gosub compAI `[===skysphere===] `This will rotate the sky slowly, making it appear more realistic. yrotate object sky,object angle y(sky)+.2 `set cursor 0,350 `print playerDied sync LOOP placeComp: collide=1:if t>level-1 then t=0 repeat computer(t).explode=0 computer(t).x=rnd(mapsize-40)+20 computer(t).z=rnd(mapsize-40)+20 computer(t).y=get ground height(mymatrix,computer(t).x,computer(t).z) position object computer(t).cobject,computer(t).x,computer(t).y,computer(t).z calctilt(computer(t).cobject,computer(t).x,computer(t).z,OBJECT ANGLE Y(computer(t).cobject),2) temp = 0:collide=0 repeat if temp<>t if object collision (computer(t).cobject,player1)=1 or OBJECT COLLISION(computer(t).cobject,playerExplode)=1 or OBJECT COLLISION(computer(temp).cobject,computer(t).cobject)=1 collide=1 endif endif inc temp until temp>level-1 until collide=0 return placeAllComp: t=0 repeat gosub placeComp show object computer(t).cobject:show object computer(t).missileObject computer(t).explode=0 inc t until t>level-1 placePlayer: repeat x#=rnd(mapsize-40)+20 z#=rnd(mapsize-40)+20 y#=get ground height(mymatrix,x#,z#) position object player1,x#,y#,z# calctilt(player1,x#,z#,OBJECT ANGLE Y(player1),2) until OBJECT COLLISION(player1,computer)=0 and OBJECT COLLISION(player1,playerExplode)=0 return rem Simple AI compAI: t=0:repeat if computer(t).explode=0 and pexplode=0 rem position computer scud at new location position object computer(t).cobject,computer(t).x,computer(t).y,computer(t).z `PDist=sqrt((compx#-x#)^2+(compy#+25-y#)^2+(compz#-z#)^2) `calcDistance(x1#,y1#,z1#,x2#,y2#,z2#) PDist=calcDistance(computer(t).x,computer(t).y,computer(t).z,x#,y#,z#) if PDist<=180`240 if PDist<=minPDist computer(t).x=newxvalue(computer(t).x,computer(t).angle,-.59) computer(t).z=newzvalue(computer(t).z,computer(t).angle,-.59) endif rem aim computer scud if computer(t).missileFlag=0 then gosub calcaimframe if computer(t).frame40 then computer(t).frame=1 set object frame computer(t).cobject,computer(t).frame endif if PDist >180`240 if computer(t).frame<=40 dec computer(t).frame if computer(t).frame<0 then computer(t).frame=90 set object frame computer(t).cobject,computer(t).frame else if computer(t).frame>65 then dec computer(t).frame set object frame computer(t).cobject,computer(t).frame if computer(t).frame=65 then computer(t).frame=90 computer(t).x=newxvalue(computer(t).x,computer(t).angle,.59) computer(t).z=newzvalue(computer(t).z,computer(t).angle,.59) computer(t).frameCounter=-1`:computer(t).computerUp=1 endif endif `setup missile if none fired if computer(t).missileFlag=0 and computer(t).frame=computer(t).tempframe and computer(t).explode=0 if PDist<=75 then computer(t).power = PDist/(sqrt(PDist)*120)`player chasing if PDist>75 and PDist<=98 then computer(t).power = PDist/(sqrt(PDist)*18.00)`18.00 if PDist>98 and PDist<128 then computer(t).power = PDist/(sqrt(PDist)*15.00) if PDist>=128 and PDist<134 then computer(t).power = PDist/(sqrt(PDist)*14.00) if PDist>=134 then computer(t).power = PDist/(sqrt(PDist)*13.35) `computer(t).power = PDist/(sqrt(PDist)*21.00) computer(t).missileFlag=1 computer(t).angle=wrapvalue(object angle y(computer(t).cobject)) computer(t).mx=limb position x(computer(t).missileObject,0) computer(t).my=limb position y(computer(t).missileObject,0) computer(t).mz=limb position z(computer(t).missileObject,0) if computer(t).angle<90 then yrot#=limb direction y(computer(t).missileObject,0):xrot#=limb direction x(computer(t).missileObject,0)+180 if computer(t).angle>90 and computer(t).angle<270 then yrot#=(360-limb direction y(computer(t).missileObject,0)):xrot#=180-limb direction x(computer(t).missileObject,0) if computer(t).angle=90 or computer(t).angle=270 then yrot#=limb direction y(computer(t).missileObject,0):xrot#=(computer(t).frame/70.00)*100.00 if computer(t).angle>270 then yrot#=(limb direction y(computer(t).missileObject,0)):xrot#=((limb direction x(computer(t).missileObject,0))-180) computer(t).cpitch=0:if computer(t).angle<90 or computer(t).angle>270 then computer(t).cpitch=1 unglue object computer(t).missileObject yrotate object computer(t).missileObject,yrot# xrotate object computer(t).missileObject,xrot# position object computer(t).missileObject,computer(t).mx,computer(t).my,computer(t).mz PLAY SOUND computer(t).missileMoveSound computer(t).cmissileLife=0`catch computer stuff ups endif gosub SlidingCollisionComputer endif if computer(t).missileFlag=1 then gosub computershoot inc t:until t>level-1 return `shoot computer missile computershoot: `the missile now fires rem position computer scud at new location `pitch object down computermissile,((1.01-cpower#)+1.00) if computer(t).cpitch=0 then pitch object down computer(t).missileObject,-((1.01-computer(t).power)+1.00) if computer(t).cpitch=1 then pitch object down computer(t).missileObject,((1.01-computer(t).power)+1.00) move object computer(t).missileObject,-(computer(t).power+1.00):inc computer(t).cmissileLife,1 computer(t).mx=object position x(computer(t).missileObject) computer(t).my=object position y(computer(t).missileObject) computer(t).mz=object position z(computer(t).missileObject) POSITION SOUND computer(t).missileMoveSound,computer(t).mx,computer(t).my,computer(t).mz theight#=get ground height(mymatrix,computer(t).mx,computer(t).mz) mhit= object collision (computer(t).missileObject,0) temp=0:repeat:rem need to check if computer shot himself if (theight#>computer(t).my) or OBJECT VISIBLE(computer(t).missileObject)=0 or mhit=player1 or computer(t).cmissileLife>missileLife or mhit=computer(temp).cobject and temp<>t computer(t).missileFlag=0 POSITION SOUND computer(t).explosionSound,computer(t).mx,computer(t).my,computer(t).mz PLAY SOUND computer(t).explosionSound position particles computer(t).missileObject,computer(t).mx,computer(t).my,computer(t).mz computer(t).particleFrequency=50:show particles computer(t).missileObject set particle emissions computer(t).missileObject,computer(t).particleFrequency glue object to limb computer(t).missileObject,computer(t).cObject,11 `reposition the scud on the launcher position object computer(t).missileObject,0,0,0 rotate object computer(t).missileObject,0,0,0 if mhit=computer(temp).cobject and computer(temp).explode=0 position object computer(temp).cobject,computer(temp).x,computer(temp).y,computer(temp).z yrotate object computer(temp).cobject,int(rnd(360)) calctilt(computer(temp).cobject,computer(temp).x,computer(temp).z,OBJECT ANGLE Y(computer(temp).cobject),2) computer(temp).explode=2`shot one of his own endif endif inc temp:until temp>level-1 if mhit=player1 position object playerExplode,x#,y#,z# calctilt(playerExplode,x#,z#,OBJECT ANGLE Y(playerExplode),2) hide object player1:show object playerExplode pexplode=1:dec plives endif return function calcDistance(x1#,y1#,z1#,x2#,y2#,z2#) VectorResult=make vector3(1) set vector3 1,(x2#-x1#),(y2#-y1#),(z2#-z1#) Distance= length vector3(1) a=delete vector3(VectorResult) endfunction Distance function calctilt(id,xpos#,zpos#,yAng#,distVal#) `------------------------------ `tilt the vehicle to the ground `------------------------------ `work out the positions of the front, back, left and right of the vehicle ang#=yAng# frontX#=newxvalue(xPos#,ang#,distVal#) frontZ#=newzvalue(zPos#,ang#,distVal#) ang#=yAng#+180 backX#=newxvalue(xPos#,ang#,distVal#) backZ#=newzvalue(zPos#,ang#,distVal#) ang#=yAng#+90 leftX#=newxvalue(xPos#,ang#,distVal#) leftZ#=newzvalue(zPos#,ang#,distVal#) ang#=yAng#-90 rightX#=newxvalue(xPos#,ang#,distVal#) rightZ#=newzvalue(zPos#,ang#,distVal#) `work out the different heights frontHeight#=get ground height(1,frontX#,frontZ#) backHeight#=get ground height(1,backX#,backZ#) leftHeight#=get ground height(1,leftX#,leftZ#) rightHeight#=get ground height(1,rightX#,rightZ#) `Work out tilt values xAng#=curveangle((backHeight#-frontHeight#)*30,object angle x(id),5) `zAng#=curveangle((leftHeight#-rightHeight#)*30,object angle z(id),5) `update the vehicle rotation xrotate object id,xAng# `zrotate object id,zAng# `rotate object id,xAng#,yAng#,zAng# endfunction calcaimframe: computer(t).frame=35+computer(t).frameCounter inc computer(t).frameCounter,1 :computer(t).frame=35+(computer(t).frameCounter mod 6) if computer(t).frameCounter>4 computer(t).frameCounter=0 `move object computer(t).cobject,-.59 computer(t).x=newxvalue(computer(t).x,computer(t).angle,-.59) computer(t).z=newzvalue(computer(t).z,computer(t).angle,-.59) gosub slidingCollisionComputer endif computer(t).tempFrame=computer(t).frame return SlidingCollisionPlayer: `ensure player is at terrain height y#=get ground height(mymatrix,x#,z#) calctilt(player1,x#,z#,ang#,1) position object player1,x#,y#,z# yrotate object player1,ang# for id=97 to (102+level)`103 if player1<>id and object collision(player1,id)>0 dec x#,get object collision x() dec y#,get object collision y() dec z#,get object collision z() calctilt(player1,x#,z#,ang#,1) position object player1,x#,y#,z# yrotate object player1,ang# endif `check to make sure still no collision and player hasn't rotated on the spot if player1<>id and object collision(player1,id)>0 ang#=oldang#`restore the angles calctilt(player1,x#,z#,ang#,1) position object player1,x#,y#,z# yrotate object player1,ang# `check for collision if player1<>id and object collision(player1,id)>0 dec x#,get object collision x() dec y#,get object collision y() dec z#,get object collision z() position object player1,x#,y#,z# endif endif next id return SlidingCollisionComputer: `ensure computer is at terrain height computer(t).y=get ground height(mymatrix,computer(t).x,computer(t).z) computer(t).angle=object angle y(computer(t).cobject) calctilt(computer(t).cobject,computer(t).x,computer(t).z,computer(t).angle,1) position object computer(t).cobject,computer(t).x,computer(t).y,computer(t).z for id=97 to (102+level)`103 if computer(t).explode=0 if computer(t).cobject<>id and object collision(computer(t).cobject,id)>0 dec computer(t).x,get object collision x() dec computer(t).y,get object collision y() dec computer(t).z,get object collision z() calctilt(computer(t).cobject,computer(t).x,computer(t).z,computer(t).angle,1) position object computer(t).cobject,computer(t).x,computer(t).y,computer(t).z yrotate object computer(t).cobject,computer(t).angle endif `check to make sure still no collision and player hasn't rotated on the spot if computer(t).cobject<>id and object collision(computer(t).cobject,id)>0 computer(t).angle=computer(t).oldAngle`restore the angles calctilt(computer(t).cobject,computer(t).x,computer(t).z,computer(t).angle,1) position object computer(t).cobject,computer(t).x,computer(t).y,computer(t).z yrotate object computer(t).cobject,computer(t).angle `check for collision if computer(t).cobject<>id and object collision(computer(t).cobject,id)>0 dec computer(t).x,get object collision x() dec computer(t).y,get object collision y() dec computer(t).z,get object collision z() position object computer(t).cobject,computer(t).x,computer(t).y,computer(t).z endif endif endif next id computer(t).oldAngle=computer(t).angle`store the angle if computer(t).explode=0 point object computer(t).cobject,x#,y#,z# endif return fadeIn: `position all sprites sprite 1,0,0,guages`console sprite 2,52,137,compasndle`needle for console sprite overlay,0,490,overlay:sync gosub placeAllComp:gosub placePlayer:gosub showRadar ang#=object angle y(player1):rotate sprite 2,ang#+180 sprite 3,550,0,scoreImage ang#=object angle y(player1):gosub slidingCollisionPlayer `the screen camera POSITION CAMERA x#,y#,z# SET CAMERA TO FOLLOW x#,y#,z#,ang#,cdist,chght,csmth,1 delete sprite overlay:`cleanup after loader `perform a clean smooth in effect volume#=0:gosub createLevel:for t = 255 to 1 step -1 inc volume#,.5 set sprite alpha preloader,t if volume#<86 set sound volume playermove,int(volume#) temp=0:repeat set sound volume computer(temp).moveSound,int(volume#) inc temp:until temp>level-1 endif if t<=180 POSITION CAMERA x#,y#,z# SET CAMERA TO FOLLOW x#,y#,z#,ang#+(180-t),cdist,chght,csmth,1 endif sprite levelImage,250,200,levelImage set sprite alpha levelImage,255-t paste image HUD,2,2 sync:wait 10:next t for t= 255 to 0 step -1 sprite levelImage,250,200,levelImage:set sprite alpha levelImage,t paste image HUD,2,2 sync:wait 5:next t delete sprite preloader:sync:delete image preloader:delete image overlay set text opaque:set text size 16:sync rate 100 return pauseScreen: stop sound playermove pause sound playermissilemove pause sound playerexplosion t=0:repeat stop sound computer(t).moveSound pause sound computer(t).missileMoveSound pause sound computer(t).explosionSound inc t:until t>level-1 sync:ink red,black create bitmap 3,800,600 set current bitmap 3 cls black:set text size 50 print "Game Paused" get image gamePaused,0,0,265,50,1 set current bitmap 0 sprite gamePaused,200,200,gamePaused show sprite gamePaused paste image HUD,2,2 sync:repeat:SUSPEND FOR KEY:until upper$(inkey$())="P" delete bitmap 3:set text size 16 loop sound playermove resume sound playermissilemove resume sound playerexplosion t=0:repeat loop sound computer(t).moveSound resume sound computer(t).missileMoveSound resume sound computer(t).explosionSound inc t:until t>level-1 volume#=0:for t = 255 to 1 step -1 inc volume#,.5 set sprite alpha gamePaused,t if volume#<86 set sound volume playermove,int(volume#) endif if volume#<101 set sound volume playermissilemove,int(volume#) set sound volume playerexplosion,int(volume#) endif temp=0:repeat if volume#<86 set sound volume computer(temp).moveSound,int(volume#) endif if volume#<101 set sound volume computer(temp).missileMoveSound,int(volume#) set sound volume computer(temp).explosionSound,int(volume#) endif inc temp:until temp>level-1 paste image HUD,2,2 POSITION CAMERA x#,y#,z# SET CAMERA TO FOLLOW x#,y#,z#,ang#+180,cdist,chght,csmth,1 sync:next t delete sprite gamePaused:delete image gamePaused `wait 100 return showRadar: set current bitmap 1 paste image OLDHUD,0,0`wipe old radar settings `position player on radar ink blue,black box (100-(x#/mapsize)*100),((z#/mapsize)*100),(100-(x#/mapsize)*100)+4,((z#/mapsize)*100)+4 `position computer on radar t = 0 :repeat ink black,black box (100-(computer(t).x/mapsize)*100),((computer(t).z/mapsize)*100),(100-(computer(t).x/mapsize)*100)+4,((computer(t).z/mapsize)*100)+4 `position computer missile on radar if computer(t).missileFlag=1 ink red,black circle (100-(computer(t).mx/mapsize)*100),((computer(t).mz/mapsize)*100),1 endif inc t:until t>level-1 `position player missile on radar if mflag=2 ink red,black Circle (100-(mx#/mapsize)*100),((mz#/mapsize)*100),1 endif ink black,white:box 100,0,320,30:rem wipe old text ink white,black set text size 16 set cursor 100,0:print "Player Kills" set cursor 170,0:print ":",pkills set cursor 100,15:print "Player Lives" set cursor 170,15:print ":",plives get image HUD,0,0,100,100,1 get image scoreImage,100,0,320,32,1 set current bitmap 0 paste image HUD,2,2 return youWon: create bitmap 3,800,600 set current bitmap 3 cls black:ink red,black set text size 50 print "You Won!!" get image youWon,0,0,220,50,1 set current bitmap 0 sprite youWon,220,200,youWon:set sprite priority youWon,65535 set sprite alpha youWon,1 volume#=100 for t = 1 to 255 sync:sprite youWon,220,200,youWon set sprite alpha youWon,t if pfrequency>0 then dec pfrequency,1:set particle emissions playermissile,pfrequency if volume#<86 and volume#>0 set sound volume playermove,int(volume#) endif if volume#<101 and volume#>0 set sound volume playermissilemove,int(volume#) set sound volume playerexplosion,int(volume#) endif temp = 0 :repeat if computer(temp).particleFrequency>0 then dec computer(temp).particleFrequency,1:set particle emissions computer(temp).missileObject,computer(temp).particleFrequency if volume#<86 and volume#>0 set sound volume computer(temp).moveSound,int(volume#) endif if volume#<101 and volume#>0 set sound volume computer(temp).missileMoveSound,int(volume#) set sound volume computer(temp).explosionSound,int(volume#) endif inc temp:until temp>level-1 dec volume#,.5 next t for t=255 to 1 step -1 sync:sprite youWon,220,200,youWon set sprite alpha youWon,t next t return endGame: create bitmap 3,800,600 set current bitmap 3 cls black:ink red,black set text size 50 print "Game Over" get image gameover,0,0,220,50,1 set current bitmap 0 sprite gameOver,200,200,gameOver:set sprite priority gameOver,65535 set sprite alpha gameOver,1 volume#=100 for t = 1 to 255 sync:sprite gameOver,200,200,gameOver set sprite alpha gameOver,t if pfrequency>0 then dec pfrequency,1:set particle emissions playermissile,pfrequency if volume#<86 and volume#>0 set sound volume playermove,int(volume#) endif if volume#<101 and volume#>0 set sound volume playermissilemove,int(volume#) set sound volume playerexplosion,int(volume#) endif temp = 0 :repeat if computer(temp).particleFrequency>0 then dec computer(temp).particleFrequency,1:set particle emissions computer(temp).missileObject,computer(temp).particleFrequency if volume#<86 and volume#>0 set sound volume computer(temp).moveSound,int(volume#) endif if volume#<101 and volume#>0 set sound volume computer(temp).missileMoveSound,int(volume#) set sound volume computer(temp).explosionSound,int(volume#) endif inc temp:until temp>level-1 dec volume#,.5 next t return createLevel: ink red,black create bitmap 4,800,600 set current bitmap 4 cls black set text size 50 print "Level ",level get image levelImage,0,0,200,50,1 set current bitmap 0 sprite levelImage,250,200,levelImage:set sprite priority levelImage,65535 delete bitmap 4:show sprite levelImage return doNewLevel: gosub createLevel for t= 0 to 255 step -1 sprite levelImage,250,200,levelImage:set sprite alpha levelImage,t paste image HUD,2,2 sync:wait 5:next t gosub placePlayer:show object player1 ang#=object angle y(player1) calctilt(player1,x#,z#,OBJECT ANGLE Y(player1),2) gosub placeAllComp POSITION CAMERA x#,y#,z# SET CAMERA TO FOLLOW x#,y#,z#,ang#+180,cdist,chght,csmth,1 `hide all smoke objects t=0:count=300:repeat for px=count to (count+numSmokeParticles) hide object px next px inc t:inc count,100:until t>maxOpponents-1 count=1500:for px=count to (count+numSmokeParticles) hide object px next px `end hide smoke objects `show sprite for the level number and fade away for t= 255 to 0 step -1 sprite levelImage,250,200,levelImage:set sprite alpha levelImage,t paste image HUD,2,2 sync:wait 5:next t return function levelChange(num as integer) result=1; i=1:while i<=num result=result+i:inc i endwhile result=result-1 endfunction result setupSmoke: `Number of smoke particles #constant numSmokeParticles=10 `Particle value arrays dim smokeParticlesPos#(((maxOpponents*10)+10)+(numSmokeParticles),3) dim smokeParticlesVel#(((maxOpponents*10)+10)+(numSmokeParticles),3) dim smokeParticlesSize#(((maxOpponents*10)+10)+(numSmokeParticles),3) dim smokeParticlesFade#(((maxOpponents*10)+10)+(numSmokeParticles),2) dim particleCount(maxOpponents+1) dim currentParticle(maxOpponents+1) `Create smoke image create bitmap 4,50,50 cls rgb(0,0,0) ink rgb(130,130,130),0 `Draw random dots in a circle shape for px=1 to 1000 ang=rnd(360) rad=rnd(20) dot 25+sin(ang)*rad,25+cos(ang)*rad next px `Blur smoke image blur bitmap 4,8 get image 6,0,0,50,50 delete bitmap 4 `backdrop on `color backdrop rgb(0,0,0) `Make particles t=0:count=300:repeat for px=count to (count+numSmokeParticles) make object plain px,10,10 texture object px,6 hide object px `Deactivate ambient light set object ambient px,0 `Make black areas see through set object transparency px,1 ghost object on px set object collision off px next px inc t:inc count,100:until t>maxOpponents-1 count=1500 for px=count to (count+numSmokeParticles) make object plain px,10,10 texture object px,6 hide object px `Deactivate ambient light set object ambient px,0 `Make black areas see through set object transparency px,1 ghost object on px set object collision off px next px return positionSmoke: `Position new particle at origin every nth time inc particleCount(t),1 if particleCount(t)=2 then particleCount(t)=0 if particleCount(t)=0 `Increase number of particle to reset inc currentParticle(t),1 `Loop round if you reach the end of the particles if currentParticle(t)>numSmokeParticles then currentParticle(t)=1 `Reset particle values `Position smokeParticlesPos#((t*10)+currentParticle(t),1)=0 smokeParticlesPos#((t*10)+currentParticle(t),2)=0 smokeParticlesPos#((t*10)+currentParticle(t),3)=0 `Scale smokeParticlesSize#((t*10)+currentParticle(t),1)=75`50 smokeParticlesSize#((t*10)+currentParticle(t),2)=75`50 `Velocity (randomize) smokeParticlesVel#((t*10)+currentParticle(t),1)=rnd(1000)/1000.0-0.2`(200).1 smokeParticlesVel#((t*10)+currentParticle(t),2)=rnd(500)/1000.0+0.2`(100).1 smokeParticlesVel#((t*10)+currentParticle(t),3)=rnd(1000)/1000.0-0.2`(200).1 smokeParticlesFade#((t*10)+currentParticle(t),1)=200`200 `Show the particle show object (count+currentParticle(t)) endif `Loop through particles for px=1 to numSmokeParticles `Re-position and scale particle values for py=1 to 3 smokeParticlesSize#((t*10)+px,py)=smokeParticlesSize#((t*10)+px,py)+0.5 smokeParticlesPos#((t*10)+px,py)=smokeParticlesPos#((t*10)+px,py)+smokeParticlesVel#((t*10)+px,py) next py `Fade particle value smokeParticlesFade#((t*10)+px,1)=smokeParticlesFade#((t*10)+px,1)-1.0`1.5 `Position, scale and fade particle object position object count+px,smokeParticlesPos#((t*10)+px,1)+smokex#,smokeParticlesPos#((t*10)+px,2)+smokey#,smokeParticlesPos#((t*10)+px,3)+smokez# scale object count+px,smokeParticlesSize#((t*10)+px,1),smokeParticlesSize#((t*10)+px,2),100 fade object count+px,smokeParticlesFade#((t*10)+px,1) `Point at camera `set object to camera orientation count+px rotate object count+px,0,ang#,0 next px return