` LBFN DBC CHALLENGE - MAZE GAME set display mode 800,600,32 sync on : sync rate 60 randomize timer() hide mouse sw = screen width() sh = screen height() backdrop on color backdrop rgb(18,18,18) autocam off MapWidth = 32 MapHeight = 32 UnitSize = 200 maxw = Mapwidth-3 maxh = MapHeight-3 pointer = 49900 TotalWalls = 0 : TotalFloors = 0 : TotalEnemies = 40 fog on fog color rgb(18,18,18) fog distance 1500 set camera range 1,2000 set ambient light 55 cls dim map$(mapwidth,mapheight) : dim EnemySpeed(TotalEnemies) `gosub StoreMap gosub MakeMaze MakeImages() gosub PickFinal `gosub MakeCeiling player = 1 make object sphere player,10 set object collision on player make object collision box player,-5,-5,-5,5,5,5,0 hide object player okay = 0 gosub GetPlayerXY gosub MakeEnemies gosub FixMaze gosub ShowMap make object cone pointer,30 texture object pointer,2319 xrotate object pointer,90.0 fix object pivot pointer cls get image 999,0,0,170,45 draw to front ty#=camera position y() ink rgb(255,0,0),0 StartTime#=timer() u#=.1 rem Main Loop ______________________________________________________________________________________________ do text 100,10,"FPS = "+str$(screen fps() ) ` center text sw/2,10,"Time:"+str$(int(timer()-StartTime#)/1000) camx#=camera position x() : oldx#=camx# camy#=camera position y() : oldy#=camy# camz#=camera position z() : oldz#=camz# position object player,camx#,camy#,camz# set object to camera orientation player move object player,10 position object pointer,camx#,camy#+42.0,camz# set object to camera orientation pointer move object pointer,100 if u#<3.0 u#=u#+.0000001 else u#=0.001 endif scroll object texture pointer,0.0,u# point object pointer,tx#,ty#,tz# y#=camera angle y() yrotate camera wrapvalue(y#+mousemovex() ) camx#=camera position x() camy#=camera position y() camz#=camera position z() position object player,camx#,camy#,camz# set object to camera orientation player move object player,10 y#=object angle y(20) yrotate object 20,wrapvalue(y#+6.0) mc=mouseclick() if mc=1 move camera 10 : move object player,10 gosub CheckCollision if hit = 1 then move camera -10 : move object player,-10 endif if mc=2 move camera -10 : move object player,-10 gosub CheckCollision if hit = 1 then move camera 10 : move object player,10 ` gosub DP_Map endif ` if upkey()=1 ` camy#=camy#+5.0 ` position camera camx#,camy#,camz# ` endif ` if downkey()=1 ` camy#=camy#-5.0 ` position camera camx#,camy#,camz# ` endif if spacekey()=1 then exit gosub CheckWinner gosub MoveEnemies gosub CheckEnemyCollision : if hit = 1 then gosub P1Died sync loop rem Main Loop ______________________________________________________________________________________________ show mouse end Restart: gosub MakeMaze gosub PickFinal gosub GetPlayerXY gosub FixMaze gosub ShowMap gosub MakeEnemies StartTime#=timer() if object exist(9000)=1 then hide object 9000 return P1Died: if object exist(9000)=0 make object plain 9000,screen width()+100,screen height()+100 endif show object 9000 position object 9000,camx#,camy#,camz# set object to camera orientation 9000 move object 9000,50 rg = 255 color object 9000,rgb(rg,rg,rg) OldTime#=timer() time# = timer()+3000.0 repeat t#=timer() if (t#-OldTime#)>59.0 dec rg,5 color object 9000,rgb(rg,rg,rg) OldTime#=timer() endif sync until timer()>time# color backdrop rgb(18,18,18) gosub Restart return MakeEnemies: EnemyObj=25000 while EnemyObj<(25000 + TotalEnemies) for z=1 to MapHeight for x=1 to MapWidth if map$(x,z)="_" and rnd(1000)>970 and EnemyObj<(25000 + TotalEnemies) ` make enemy x# = (x*UnitSize) z# = (z*UnitSize) camx#=camera position x() camy#=camera position y() camz#=camera position z() c# = (camx# - x#) : c# = c# * c# d# = (camz# - z#) : d# = d# * d# dist# = sqrt(c# + d#) if dist#>750.0 if object exist(EnemyObj)=0 make object sphere EnemyObj,50 yrotate object EnemyObj,145.0 fix object pivot EnemyObj endif position object EnemyObj,x#,25.0,z# texture object EnemyObj,12 set object collision on EnemyObj make object collision box EnemyObj,-25,-25,-25,25,25,25,0 EnemySpeed(EnemyObj-24999)=rnd(3)+3 inc EnemyObj,1 endif endif next x next z endwhile return MoveEnemies: For enemy = 25000 to (25000 + TotalEnemies-1) point object enemy,camx#,camy#,camz# e=enemy-24999 move object enemy,EnemySpeed(e) for f = 200 to TotalWalls if object collision(enemy,f)=1 then move object enemy,0-EnemySpeed(e) : exit next f next enemy return CheckCollision: hit = 0 oldcamx#=camera position x() oldcamy#=camera position y() oldcamz#=camera position z() for f = 200 to TotalWalls if object collision(player,f)=1 then hit = 1 next f return CheckEnemyCollision: hit = 0 for e = 25000 to (25000 + TotalEnemies) if object collision(player,e)=1 then hit = 1 : P1Died = 1 next e return StoreMap: restore MapData for y=1 to mapheight read a$ for x=1 to len(a$) map$(x,y)=mid$(a$,x) next x next y gosub PickFinal return PickFinal: ` pick random spot for the final x=rnd(mapWidth-10)+6 z=rnd(MapHeight-10)+6 map$(x-1,z)="_" : map$(x,z)="_" : map$(x+1,z)="_" map$(x-1,z+1)="_" : map$(x,z+1)="_" : map$(x+1,z+1)="_" map$(x-1,z-1)="_" : map$(x,z-1)="_" : map$(x+1,z-1)="_" map$(x,z)="F" tx# = (x*UnitSize) : ty# = 50.0 : tz# = (z*UnitSize) a = rnd(3) if a = 0 then map$(x-2,z)="_" : map$(x-3,z)="_" if a = 1 then map$(x,z-2)="_" : map$(x,z-3)="_" if a = 2 then map$(x+2,z)="_" : map$(x+3,z)="_" if a = 3 then map$(x,z+2)="_" : map$(x,z+3)="_" rem make light at the end of the zone if object exist(20)=0 make object cone 20,100 zrotate object 20,180.0 scale object 20,200.0,500.0,200.0 endif position object 20,tx#,ty#+200.0,tz# color object 20,rgb(0,0,225) ghost object on 20 return GetPlayerXY: okay = 0 tries = 0 repeat x = rnd(20)+6 : z = rnd(20)+6 x# = (x*UnitSize) z# = (z*UnitSize) c# = abs(tx# - x#) : c# = c# * c# d# = abs(tz# - z#) : d# = d# * d# dist# = sqrt(c# + d#) if dist#>3000.0 or tries>100 okay = 1 map$(x-1,z-1)="_" : map$(x,z-1)="_" : map$(x+1,z-1)="_" map$(x-1,z)="_" : map$(x,z)="_" : map$(x+1,z)="_" map$(x-1,z+1)="_" : map$(x,z+1)="_" : map$(x+1,z+1)="_" playerX=x playerZ=z position camera playerX*UnitSize,50.0,playerZ*UnitSize a = rnd(3) if a = 0 then map$(x-2,z)="_" if a = 1 then map$(x,z-2)="_" if a = 2 then map$(x+2,z)="_" if a = 3 then map$(x,z+2)="_" endif inc tries,1 until okay = 1 return function MakeImages() ` wall create bitmap 2,256,256 ink rgb(119,41,9),0 box 0,0,255,255 ink rgb(190,190,190),0 box 0,0,255,5 : box 62,0,67,57 box 190,0,195,57 box 0,54,255,57 : box 0,54,4,108 box 128,54,133,108 box 0,104,255,108 : box 40,104,45,157 box 101,104,106,157 : box 200,104,205,157 box 0,155,255,159 : box 12,155,17,208 box 133,155,138,208 : box 0,204,255,208 box 68,204,73,255 : box 195,204,200,255 box 0,251,255,255 get image 43,0,0,255,255 ` floor cls ink rgb(130,116,71),0 box 0,0,255,255 ink rgb(0,98,197),0 box 3,3,250,250 ink rgb(130,116,71),0 box 64,64,190,190 ink rgb(0,98,197),0 box 96,96,157,157 get image 53,0,0,255,255 ` mad face cls ink rgb(255,255,0),0 box 0,0,255,255 ink rgb(18,18,18),0 box 67,77,82,100 line 71,73,78,73 : line 70,74,79,74 line 69,75,80,75 : line 68,76,81,76 line 68,101,81,101 : line 69,102,80,102 line 70,103,79,103 : line 71,104,78,104 get image 19000,67,73,83,105 paste image 19000,117,73 delete image 19000 line 84,137,118,137 : line 81,138,121,138 : line 79,139,123,139 line 77,140,125,140 : line 76,141,126,141 : line 75,142,127,142 line 74,143,128,143 : line 73,144,89,144 : line 112,144,129,144 line 73,145,85,145 : line 117,145,129,145 : line 72,146,80,146 line 122,146,130,146 : line 71,147,79,147 : line 123,147,131,147 line 71,148,78,148 : line 124,148,131,148 : line 70,149,77,149 line 125,149,132,149 : line 70,150,76,150 : line 126,150,132,150 line 69,151,75,151 : line 127,151,133,151 : line 69,152,74,152 line 128,152,133,152 : line 69,153,74,153 : line 128,153,133,153 line 69,154,73,154 : line 129,154,133,154 get image 12,0,0,255,255 ` pointer texture cls ink rgb(255,0,0),0 box 0,0,127,21 ink rgb(0,183,91),0 box 0,22,127,127 get image 2319,0,0,128,128 delete bitmap 2 set current bitmap 0 endfunction MakeMaze: cls set text size 26 backdrop off t# = timer() center text sw/2,sh/2,"Generating maze...." : sync ` set all of map to "W" sync rate 0 for z=1 to mapheight for x=1 to mapwidth map$(x,z)="W" next x next z for g=1 to 8 Column=rnd(28)+2 for z=2 to mapheight-1 map$(column,z)="_" a=rnd(2)+1 if a=1 and column>2 then dec column,1 : map$(column,z)="_" if a=2 and column<(mapwidth-2) then inc column,1 : map$(column,z)="_" next z next g for g=1 to 8 Row=rnd(28)+2 for x=2 to mapwidth-1 map$(x,row)="_" a=rnd(2)+1 if a=1 and row>2 then dec row,1 : map$(x,row)="_" if a=2 and row<(mapheight-2) then inc row,1 : map$(x,row)="_" next x next g repeat ink rgb(rnd(255),rnd(255),rnd(255)),0 center text sw/2,sh/2,"Generating maze...." sync until timer()>t#+1000.0 sync rate 60 backdrop on return FixMaze: repeat resolved = 0 for z=3 to mapheight-2 for x=3 to mapwidth-2 if map$(x,z)="_" num = 0 : left = 0 : up = 0 : right = 0 : down = 0 if map$(x-1,z)="_" then left = 1 : inc num,1 if map$(x,z-1)="_" then up = 1 : inc num,1 if map$(x+1,z)="_" then right = 1 : inc num,1 if map$(x,z+1)="_" then down = 1 : inc num,1 if num<=1 okeydokey = 0 : resolved = 1 repeat a = rnd(3) if a = 0 and left = 0 then map$(x-1,z) = "_" : okeydokey = 1 if a = 1 and up = 0 then map$(x,z-1) = "_" : okeydokey = 1 if a = 2 and right = 0 then map$(x+1,z) = "_" : okeydokey = 1 if a = 3 and down = 0 then map$(x,z+1) = "_" : okeydokey = 1 until okeydokey = 1 endif endif next x next z until resolved = 0 return CheckWinner: c# = (camx# - tx#) : c# = c# * c# d# = (camz# - tz#) : d# = d# * d# dist# = sqrt(c# + d#) ` text 200,10,str$(dist#) if dist#<=150.0 t#=int((timer()-StartTime#)/1000) ink rgb(255,255,0),0 repeat center text sw/2,200,"You are the Winner!!!" ` center text sw/2,220,"You made it in "+str$(t#)+" seconds!" center text sw/2,400,"Press [Return] to play again." center text sw/2,420,"Press [ESC] to quit." sync rt = returnkey() until rt=1 or escapekey()=1 if rt = 1 rt = 0 : gosub RESTART repeat sync until keystate(28)=0 endif endif return MakeCeiling: ` make image create bitmap 2,512,512 ink rgb(96,96,96),0 box 0,0,511,511 get image 7,0,0,512,512 set current bitmap 0 delete bitmap 2 make object plain 11000,6400,6400 texture object 11000,7 rotate object 11000,90.0,0.0,0.0 set object collision off 11000 position object 11000,3200.0,498.0,3200.0 return DP_Map: for f = 200 to TotalWalls hide object f next f for f = 1000 to TotalFloors hide object f next f hide object pointer backdrop off cls sync cx=int((camx#+100)/200) cz=int((camz#+100)/200) for z=1 to mapheight for x=1 to mapwidth if x=cx and z=cz ink rgb(0,255,0),0 else ink rgb(255,255,0),0 endif a$=map$(x,z) text x*16,z*16,a$ next x next z sync wait key backdrop on for f = 200 to TotalWalls show object f next f for f = 1000 to TotalFloors show object f next f show object pointer return ShowMap: if TotalWalls>0 for i = 200 to TotalWalls if object exist(i)=1 then delete object i next i endif if TotalFloors>0 for i = 1000 to TotalFloors if object exist(i)=1 then delete object i next i endif WallObj=200 FloorObj=15000 EnemyObj=25000 for z=1 to MapHeight for x=1 to MapWidth if map$(x,z)="W" xsize#=(x*UnitSize) zsize#=(z*UnitSize) make object box WallObj,UnitSize,500.0,UnitSize set object WallObj,1,1,1 texture object WallObj,43 position object WallObj,xsize#,248.0,zsize# set object collision on WallObj make object collision box WallObj,-100,-250,-100,100,250,100,0 inc WallObj,1 endif if map$(x,z)="_" or map$(x,z)="S" or map$(x,z)="F" xsize#=(x*UnitSize) zsize#=(z*UnitSize) make object plain FloorObj,UnitSize,UnitSize set object FloorObj,1,1,1 xrotate object FloorObj,90 texture object FloorObj,53 position object FloorObj,xsize#,0.0,zsize# set object collision off FloorObj inc FloorObj,1 endif next x next z TotalWalls = (WallObj-1) TotalFloors= (FloorObj-1) return MapData: data "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" data "W______________________________W" data "W______________WWWWWWWWWWWWWWWWW" data "WWWWWW_________W_W_____WWWWW_WWW" data "W____W_________W_W_____W______WW" data "W____WWWWWWWWW_W_W_____WWWWW_WWW" data "W______________W_W________WW___W" data "W_WWWWWWWW_____W_W________WW___W" DATA "W_W____________W_________WWW___W" DATA "W_WWWWW__________________WWW___W" DATA "W__WWWW________________________W" DATA "W__WWWWWW______________________W" DATA "W_____WWW_________WWWWW________W" DATA "W_____WWW_________W___W________W" DATA "W_____WWW_________W___W________W" DATA "WWWW__WWW_________W____WW______W" DATA "W_____WWW_________W____________W" DATA "W_________________WWWWWWW______W" DATA "W_____WWWWWWW__________________W" DATA "W_____W_____WWW______________WWW" DATA "W___WWW_________WW_________WWWWW" DATA "WWWWWWW_____WWW_________WWWW___W" DATA "W____WWWW___WWW_________WWW____W" DATA "W____WWWW___WWW_________WWW____W" DATA "W_________WWWWW________________W" DATA "W_________WWWWWWWWW________WWWWW" DATA "W_________W_______W________W___W" DATA "W_________W________________W___W" DATA "WWWW______W_______W________W___W" DATA "WWWW______________W________W__WW" DATA "WWWW__S___________W___________WW" DATA "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"