Rem ***** Main Source File ***** Rem asteroid attack 3d by Jetmech rem ****************** Thanx to Ric for the awesome sound function!********************* sync on sync rate 0 set text font "arial" : set text size 13 set text to bold : set text transparent autocam off color backdrop 0 randomize timer() position camera 0,0,0 hide mouse make object sphere 6,4000,15,15 position object 6,0,0,0 color object 6,RGB(14,0,44) set object cull 6,0 force=80 sc#=100 createsound("explosion",3,20,1400,8000,10000.00,0.5,0,0,0,0) createsound("bass hit",9,20,200,14000,0.00,1.2,.0,0,0,0) make object sphere force,100,15,15 position object force,0,50,0 hide object force ghost object on force `-------------------------------------------------------- `matrix setup `-------------------------------------------------------- for grassx=0 to 39 for grassy=0 to 39 ink rgb(20,rnd(100)+100,20),rgb(0,0,0) dot grassx,grassy next grassy next grassx get image 1,0,0,40,40 make matrix 1,6000,6000,10,10 prepare matrix texture 1,1,1,1 position matrix 1,-3000,-100,-3000 randomize matrix 1,10 set matrix wireframe off 1 update matrix 1 `-------------------------------------------------------- `type setup `-------------------------------------------------------- type bullet currentbullet bullalive explode time as float bullscale distance as float distmissle as float score endtype dim bull(30) as bullet bull(0).currentbullet=10 Type enemymissles enemyscale distcity explode wave speed as float etime as float endtype dim enemy(15) as enemymissles enemy(0).wave = 70 FOR spd=0 to 15 enemy(spd).speed = .5 next type citydata destroyed damage gameover endtype dim city(5) AS citydata `-------------------------------------------------------- `game setup `-------------------------------------------------------- citysetup() bulletsetup() enemysetup() `-------------------------------------------------------- `main loop `-------------------------------------------------------- do checkdist() moveenemy() camcontrol() Display_UWProgramInfo() movebullet() hud() explode() ` the Time variable is returned from the timer function and determines the fire rate if timer() > time# + 150 if mouseclick()=1 then time# = fire() endif if mouseclick()=2 and throw = 0 throw=1 set object to camera orientation force show object force starttime = timer() endif if throw=1 then throw = forcefield(force) if throw=2 sc#=sc#+.5 if sc#=>300 then sc#=300 scale object force,sc#,sc#,sc# if timer()-starttime> 8000 hide object force position object force,0,50,0 sc#=100.00 scale object force,sc#,sc#,sc# throw=0 endif endif sync loop `-------------------------------------------------------- `camera controls `-------------------------------------------------------- Function camcontrol() camx#=camera angle x()+mousemovey()/2.0 camy#=camera angle y()+mousemovex()/2.0 if camx#>20 then camx#=20 if camx#<-90 then camx#=-90 if camy#<-90 then camy# = -90 if camy#>90 then camy# = 90 rotate camera camx#,camy#,0 endfunction `-------------------------------------------------------- `info loop `-------------------------------------------------------- Function Display_UWProgramInfo() text 0,0,"Fps:"+str$(screen fps()) text 300,0,"SCORE: "+ str$(bull(0).score) sz=object size(80) text 0,100,str$(sz) EndFunction function citysetup() for cty = 1 to 5 make object box cty,50,20,50 color object cty,RGB(0,128,128) city(cty).damage=100 position object cty, rnd(2000)-1000,-90,rnd(200)+500 next cty endfunction function bulletsetup() for bx=0 to 9 for by=0 to 9 ink RGB(255,255,0),rgb(0,0,0) dot bx,by next by next bx get image 2,0,0,10,10 for bullet=10 to 20 make object sphere bullet,2,5,5 texture object bullet,2 set object light bullet,0 hide object bullet position object bullet,rnd(5)-rnd(5),rnd(10)-15,0 bull(bullet-10).bullscale=100 next bullet endfunction function fire() if bull(0).currentbullet = 20 then bull(0).currentbullet = 10 if bull(bull(0).currentbullet-10).bullalive=0 set object to camera orientation bull(0).currentbullet show object bull(0).currentbullet bull(bull(0).currentbullet-10).bullalive=1 play sound 9 hide object bull(0).currentbullet move object bull(0).currentbullet,20 show object bull(0).currentbullet inc bull(0).currentbullet endif oldtime#= timer() endfunction oldtime# function movebullet() for bullcount=10 to 20 if bull(bullcount-10).bullalive=1 and bull(bullcount-10).explode = 0 move object bullcount,12 endif next bullcount endfunction function enemysetup() for bx=0 to 9 for by=0 to 9 ink RGB(rnd(100)+50,rnd(30)+30,rnd(30)+30),rgb(0,0,0) dot bx,by next by next bx get image 3,0,0,10,10 for E = 60 to enemy(0).wave make object sphere E,rnd(20)+20,rnd(6)+4,rnd(6)+4 texture object e,3 position object E,rnd(2000)-1000,1000,rnd(2000)-1000 repeat cty = rnd(4)+1 until city(cty).destroyed=0 point object E, object position x(cty)+ rnd(100)-50, -100, object position z(cty)+ rnd(100)-50 enemy(E-60).enemyscale = 100 next E endfunction function hud() Ink RGB(255,0,0),0 circle Screen Width()/2, (Screen Height()/2)+5,3 Dot Screen Width()/2, (Screen Height()/2)+15 Dot Screen Width()/2, (Screen Height()/2)-5 endfunction function moveenemy() for e=60 to enemy(0).wave if enemy(e-60).explode = 0 move object e,enemy(e-60).speed if object position y(e) < -99 enemy(e-60).explode = 1 play sound 3 endif endif next e endfunction function explode() for bullcount=10 to 20 if bull(bullcount-10).explode=1 if sound playing(3) =0 play sound 3 endif ghost object on bullcount if particles exist(bullcount) = 0 make particles bullcount,2,10,30 color particles bullcount,rnd(254)+1,rnd(254)+1,rnd(254)+1 set particle emissions bullcount,1 set particle life bullcount,20 set particle gravity bullcount,1 bull(bullcount-10).time=timer() endif position particles bullcount,object position x(bullcount),object position y(bullcount),object position z(bullcount) scale object bullcount,bull(bullcount-10).bullscale,bull(bullcount-10).bullscale*.05,bull(bullcount-10).bullscale inc bull(bullcount-10).bullscale,40 fade object bullcount,0 if timer()>bull(bullcount-10).time+150 set particle emissions bullcount,0 endif if bull(bullcount-10).bullscale => 2500 bull(bullcount-10).bullscale = 100 scale object bullcount,bull(bullcount-10).bullscale,100,bull(bullcount-10).bullscale position object bullcount,rnd(5)-rnd(5),rnd(10)-15,0 hide object bullcount delete particles bullcount bull(bullcount-10).bullalive=0 bull(bullcount-10).explode = 0 ghost object off bullcount endif endif next bullcount for e=60 to enemy(0).wave if enemy(e-60).explode =1 hide object e if particles exist(e) = 0 make particles e,2,10,30 color particles e,rnd(254)+1,rnd(254)+1,rnd(254)+1 set particle emissions e,1 set particle floor e,0 set particle gravity e,1 enemy(e-60).etime=timer() position particles e,object position x(e),object position y(e),object position z(e) position object e,rnd(2000)-1000,1000,rnd(2000)-1000 endif ` position particles e,object position x(e),object position y(e),object position z(e) if timer()>enemy(e-60).etime+200 set particle emissions e,0 endif if timer()>enemy(e-60).etime+2500 delete particles e enemy(e-60).explode =0 continue=0 repeat cty = rnd(4)+1 if city(cty).destroyed=0 continu=1 obx = object position x(cty)+ rnd(100)-50 obz = object position z(cty)+ rnd(100)-50 endif for dead= 1 to 5 if city(dead).destroyed = 1 then count=count +1 next dead if count = 5 GameOver() continu=1 obx = rnd(2000)-1000 obz = rnd(200)+500 endif until continu=1 ` position object e,rnd(2000)-1000,1000,rnd(2000)-1000 point object E, obx, -100,obz show object e enemy(e-60).speed= enemy(e-60).speed +.05 endif endif next e for cty = 1 to 5 if object exist(cty) if city(cty).destroyed = 1 ghost object on cty fade object cty,50 delete object cty endif endif next cty endfunction function checkdist() for bullcount = 10 to 20 `--------determin object distance-------------- xd# = 0 - object position x(bullcount) yd# = 20 - object position y(bullcount) zd# = 0 - object position z(bullcount) bull(bullcount-10).distance = sqrt((xd#*xd#) + (yd#*yd#) + (zd#*zd#)) `---------------------------------------------- if bull(bullcount-10).distance >1500 bull(bullcount-10).bullalive=0 position object bullcount,rnd(5)-rnd(5),rnd(10)-15,0 hide object bullcount endif `--------determin bullet distance from missle-------------- for missle = 60 to enemy(0).wave xd2# = object position x(missle) - object position x(bullcount) yd2# = object position y(missle) - object position y(bullcount) zd2# = object position z(missle) - object position z(bullcount) fxd2# = object position x(missle) - object position x(80) fyd2# = object position y(missle) - object position y(80) fzd2# = object position z(missle) - object position z(80) bull(bullcount-10).distmissle = sqrt((xd2#*xd2#) + (yd2#*yd2#) + (zd2#*zd2#)) forcedist# = sqrt((fxd2#*fxd2#) + (fyd2#*fyd2#) + (fzd2#*fzd2#)) if forcedist# < object size(80)+object size(missle) enemy(missle-60).explode = 1 endif if bull(bullcount-10).distmissle < bull(bullcount-10).bullscale/20 if enemy(missle-60).explode = 0 then bull(0).score = bull(0).score + ((enemy(missle-60).speed*2)+ (100/object size(missle))) bull(bullcount-10).explode=1 enemy(missle-60).explode = 1 endif if bull(bullcount-10).bullscale=100 if bull(bullcount-10).distmissle < object size(missle) if enemy(missle-60).explode = 0 then bull(0).score = bull(0).score + ((enemy(missle-60).speed*2)+ (100/object size(missle))) bull(bullcount-10).explode=1 enemy(missle-60).explode = 1 endif endif for cty = 1 to 5 if object exist(cty) xd3# = object position x(missle) - object position x(cty) yd3# = object position y(missle) - object position y(cty) zd3# = object position z(missle) - object position z(cty) enemy(missle-60).distcity = sqrt((xd3#*xd3#) + (yd3#*yd3#) + (zd3#*zd3#)) if enemy(missle-60).distcity < 70 dec city(cty).damage,50 if city(cty).damage =< 0 then city(cty).destroyed = 1 endif endif next cty next missle next bullcount endfunction function createsound(name$,soundnumber,frequency#,length#,loudness#,bend#,decay#,vibratospeed#,vibratodepth#,tremelospeed#,tremelodepth#) if file exist(name$+".wav")=1 then delete file name$+".wav" open to write 1,name$+".wav" chunk=int(((length#/1000)*44100*16)/8) `sample size (no of samples * bitrate * channels / 8) samples=int((length#/1000)*44100) `length *44100 restore for x=1 to 40 read byte2 write byte 1, byte2 next x write long 1,chunk rem generate and write wave for x=1 to samples output#=int(sin((x/122.5)*(frequency#+vibratodepth#*sin(theta#)))*(loudness#+tremelodepth#*sin(phi#)))*3.0 inc theta#,vibratospeed# inc phi#,tremelospeed# dec frequency#,bend# if loudness#>0 then dec loudness#,decay# write word 1,output# next x close file 1 load sound name$+".wav",soundnumber data 82:data 73:data 70:data 70:data 208:data 59:data 1:data 0:data 87 data 65:data 86:data 69:data 102:data 109:data 116:data 32:data 16 data 0:data 0:data 0:data 1:data 0:data 2:data 0:data 34:data 86:data 0 data 0:data 136:data 88:data 1:data 0:data 4:data 0:data 16:data 0 data 100:data 97:data 116:data 97 endfunction Function GameOver() for e=60 to enemy(0).wave enemy(e-60).speed=10 next e city(0).gameover = 1 endfunction Function Forcefield(force) move object force,10 pitch object down force,.5 if get ground height(1,object position x(force), object position z(force)) => object position y(force)+object size(force)*2 throw=2 else throw=1 endif endfunction throw