Formula 50 Grand Prix - my entry into the 50 line challenge. (No media)
You are the red car in pole position - first to 5 laps is the winner - enjoy!
Compressed format - 45 lines, maximum 25 commands per line:
set display mode 1024,768,32 : hide mouse : ink rgb(180,180,255),0 : text 400,0,"Formula 50 Grand Prix!" : text 0,40,"Upkey - Accelerate" : text 0,60,"Downkey - Brake" : text 0,80,"Leftkey - Steer left" : text 0,100,"Rightkey - Steer right" : text 0,120,"First to complete 5 laps wins" : text 0,140,"If you cut too many corners or take shortcuts your lap will not count!" : text 0,180,"Press any key" : wait key : sync on : sync rate 60 : hide light 0 : color backdrop rgb(80,80,80) : make light 1 : position light 1,0,50,100 : set light range 1,500 : matrixsizex=100 : matrixsizez=100 : xsegments=10 : zsegments=10 : tileimagesize=64 : numberofcars=6
type tiletype
imagenumber as integer : tilenumber as integer : height as float : posx as float : posy as float : waypoint as integer
endtype
type cartype
objectnumber as integer : x as float : y as float : z as float : oldx as float : oldy as float : oldz as float : fi as float : fl as float : fd as float : fb as float : maxfd as float : maxfb as float : fx as float : fz as float : ax as float
az as float : vx as float : vz as float : ang as float : turnspeed as float : slow as integer : waypoint as integer : waypointset as integer : targetangle as float : lap as integer : collision as integer
endtype
type waypointtype
x as float : z as float
endtype
make matrix 1,matrixsizex,matrixsizez,xsegments,zsegments : inc numberofimages : create bitmap 1,tileimagesize,tileimagesize : set current bitmap 1 : ink rgb(120,120,120),0 : box 0,0,tileimagesize,tileimagesize : ink rgb(100,100,100),0 : for n=1 to 600 : dot rnd(tileimagesize),rnd(tileimagesize)
next n : ink rgb(140,140,140),0 : for n=1 to 600 : dot rnd(tileimagesize),rnd(tileimagesize) : next n : ink -1,0 : for y=0 to tileimagesize step 8 : for x=0 to tileimagesize step 8 : if white=0 : white=1 : else white=0 : endif : if white=1 : box x,y,x+8,y+8 : endif : next x : next y : for n=0 to 4 : line 0,n,tileimagesize,n : next n : ink -1,0 : for n=0 to 9 step 2 : box 2,n*tileimagesize/10.0,6,(n+1)*tileimagesize/10.0 : box tileimagesize-6,n*tileimagesize/10.0,tileimagesize-2,(n+1)*tileimagesize/10.0 : next n
ink rgb(255,0,0),0 : for n=1 to 10 step 2 : box 2,n*tileimagesize/10.0,6,(n+1)*tileimagesize/10.0 : box tileimagesize-6,n*tileimagesize/10.0,tileimagesize-2,(n+1)*tileimagesize/10.0 : next n : grid=2 : get image grid,0,0,tileimagesize,tileimagesize,1 : set current bitmap 0 : delete bitmap 1 : inc numberofimages : create bitmap 1,tileimagesize,tileimagesize : set current bitmap 1 : ink rgb(120,120,120),0 : box 0,0,tileimagesize,tileimagesize : ink rgb(100,100,100),0 : for n=1 to 600 : dot rnd(tileimagesize),rnd(tileimagesize) : next n : ink rgb(140,140,140),0 : for n=1 to 600 : dot rnd(tileimagesize),rnd(tileimagesize) : next n : ink -1,0 : for n=0 to 9 step 2 : box 2,n*tileimagesize/10.0,6,(n+1)*tileimagesize/10.0
box tileimagesize-6,n*tileimagesize/10.0,tileimagesize-2,(n+1)*tileimagesize/10.0 : next n : ink rgb(255,0,0),0 : for n=1 to 10 step 2 : box 2,n*tileimagesize/10.0,6,(n+1)*tileimagesize/10.0 : box tileimagesize-6,n*tileimagesize/10.0,tileimagesize-2,(n+1)*tileimagesize/10.0 : next n : road1=8 : get image road1,0,0,tileimagesize,tileimagesize,1 : set current bitmap 0 : delete bitmap 1 : inc numberofimages : create bitmap 1,tileimagesize,tileimagesize : set current bitmap 1 : ink rgb(120,120,120),0 : box 0,0,tileimagesize,tileimagesize : ink rgb(100,100,100),0 : for n=1 to 600 : dot rnd(tileimagesize),rnd(tileimagesize) : next n : ink rgb(140,140,140),0 : for n=1 to 600 : dot rnd(tileimagesize),rnd(tileimagesize) : next n : ink -1,0
for n=0 to 9 step 2 : box n*tileimagesize/10.0,2,(n+1)*tileimagesize/10.0,6 : box n*tileimagesize/10.0,tileimagesize-6,(n+1)*tileimagesize/10.0,tileimagesize-2 : next n : ink rgb(255,0,0),0 : for n=1 to 10 step 2 : box n*tileimagesize/10.0,2,(n+1)*tileimagesize/10.0,6 : box n*tileimagesize/10.0,tileimagesize-6,(n+1)*tileimagesize/10.0,tileimagesize-2 : next n : road2=6 : get image road2,0,0,tileimagesize,tileimagesize,1 : set current bitmap 0 : delete bitmap 1 : inc numberofimages : create bitmap 1,tileimagesize,tileimagesize : set current bitmap 1 : ink rgb(120,120,120),0 : box 0,0,tileimagesize,tileimagesize : ink rgb(100,100,100),0 : for n=1 to 600 : dot rnd(tileimagesize),rnd(tileimagesize) : next n : ink rgb(140,140,140),0 : for n=1 to 600 : dot rnd(tileimagesize),rnd(tileimagesize)
next n : ink -1,0 : for n=0 to 9 step 2 : box 2,n*tileimagesize/10.0,6,(n+1)*tileimagesize/10.0 : box n*tileimagesize/10.0,2,(n+1)*tileimagesize/10.0,6 : next n : ink rgb(255,0,0),0 : for n=1 to 10 step 2 : box 2,n*tileimagesize/10.0,6,(n+1)*tileimagesize/10.0 : box n*tileimagesize/10.0,2,(n+1)*tileimagesize/10.0,6 : next n : box tileimagesize-6,tileimagesize-6,tileimagesize-2,tileimagesize-2 : road7=7 : get image road7,0,0,tileimagesize,tileimagesize,1 : set current bitmap 0 : delete bitmap 1 : inc numberofimages : temp=free_sprite() : sprite temp,-100,-100,road7 : mirror sprite temp : create bitmap 1,tileimagesize,tileimagesize : set current bitmap 1 : paste sprite temp,0,0 : road9=9 : get image road9,0,0,tileimagesize,tileimagesize,1
set current bitmap 0 : delete bitmap 1 : inc numberofimages : flip sprite temp : create bitmap 1,tileimagesize,tileimagesize : set current bitmap 1 : paste sprite temp,0,0 : road3=3 : get image road3,0,0,tileimagesize,tileimagesize,1 : set current bitmap 0 : delete bitmap 1 : inc numberofimages : mirror sprite temp : create bitmap 1,tileimagesize,tileimagesize : set current bitmap 1 : paste sprite temp,0,0 : road1=1 : get image road1,0,0,tileimagesize,tileimagesize,1 : set current bitmap 0 : delete bitmap 1 : inc numberofimages : create bitmap 1,tileimagesize,tileimagesize : set current bitmap 1 : ink rgb(0,200,0),0 : box 0,0,tileimagesize,tileimagesize
ink rgb(0,220,0),0 : for n=1 to 600 : dot rnd(tileimagesize),rnd(tileimagesize) : next n : ink rgb(0,210,0),0 : for n=1 to 600 : dot rnd(tileimagesize),rnd(tileimagesize) : next n : blur bitmap 1,1 : grass=5 : get image grass,0,0,tileimagesize,tileimagesize,1 : set current bitmap 0 : delete bitmap 1 : ink 0,0 : dim tile(xsegments,zsegments) as tiletype : create bitmap 1,xsegments*tileimagesize,zsegments*tileimagesize : create bitmap 1,9*tileimagesize,tileimagesize : for imagenumber=1 to 9 : if image exist(imagenumber)=1 : paste image imagenumber,(imagenumber-1)*tileimagesize,0 : endif : next imagenumber : matrixtexture=free_image() : get image matrixtexture,0,0,9*tileimagesize,tileimagesize : delete bitmap 1
prepare matrix texture 1,matrixtexture,9,1 : set matrix trim 1,0.003,0.003 : for z=zsegments-1 to 0 step -1 : for x=0 to xsegments-1 : read tile(x,z).imagenumber : next x : next z : for z=zsegments-1 to 0 step -1 : for x=0 to xsegments-1 : read tile(x,z).height : next x : next z : dim waypoint(99) as waypointtype : for z=zsegments-1 to 0 step -1 : for x=0 to xsegments-1 : read tile(x,z).waypoint : if tile(x,z).waypoint>0 : if tile(x,z).imagenumber=8 or tile(x,z).imagenumber=6 or tile(x,z).imagenumber=2 : offsetx#=0.5 : offsetz#=0.5 : endif : if tile(x,z).imagenumber=7 : offsetx#=0.8 : offsetz#=0.2 : endif
if tile(x,z).imagenumber=9 : offsetx#=0.2 : offsetz#=0.2 : endif : if tile(x,z).imagenumber=3 : offsetx#=0.2 : offsetz#=0.8 : endif : if tile(x,z).imagenumber=1 : offsetx#=0.8 : offsetz#=0.8 : endif : waypoint(tile(x,z).waypoint).x=(x+offsetx#)*matrixsizex/xsegments : waypoint(tile(x,z).waypoint).z=(z+offsetz#)*matrixsizez/zsegments : endif : next x : next z : tile=0 : for z=zsegments-1 to 0 step -1 : for x=0 to xsegments-1 : inc tile : tile(x,z).tilenumber=tile : set matrix tile 1,x,z,tile(x,z).imagenumber : set matrix height 1,x,z,tile(x,z).height : next x
next z : matnum=1 : For Z = 1 To zsegments - 1 : For X = 1 To xsegments - 1 : h8# = Get Matrix Height(MatNum,x,z-1) : h4# = Get Matrix Height(MatNum,x-1,z) : h# = Get Matrix Height(MatNum,x,z) : h2# = Get Matrix Height(MatNum,x,z) : x1#=(x-1)*25.0 : y1#=h# : x2#=(x+0)*25.0 : y2#=h4# : dx#=x2#-x1# : dy#=y2#-y1# : ax# = AtanFull(dx#,dy#) : ax# = WrapValue(90-ax#) : z1# = (z-1)*25.0 : y1#=h2# : z2# = (z+0)*25.0 : y2#=h8# : dz# = z2#-z1# : dy# = y2#-y1# : az# = AtanFull(dz#,dy#) : az# = WrapValue(90-az#) : nx# = Sin(ax#)
ny# = Cos(ax#) : nz# = Sin(az#) : Set Matrix Normal MatNum,x,z,nx#,ny#,nz# : Next X : Next Z : update matrix 1 : for n=1 to 20 : building=free_object() : make object box building,rnd(5)+1,5,rnd(5)+1 : repeat : x=5+10*rnd(matrixsizex-1)/10 : z=5+10*rnd(matrixsizez-1)/10 : tilex=int(x/(matrixsizex/xsegments)) : tilez=int(z/(matrixsizez/zsegments)) : until tile(tilex,tilez).imagenumber=5 : position object building,x,get ground height(1,x,z),z : next n : dim car(numberofcars) as cartype : for n=1 to numberofcars : car(n).objectnumber=free_object() : make object box car(n).objectnumber,1,0.2,2 : if n=1 : color object car(n).objectnumber,rgb(255,0,0) : endif : if n=2
color object car(n).objectnumber,rgb(255,255,0) : endif : if n=3 : color object car(n).objectnumber,rgb(255,0,255) : endif : if n=4 : color object car(n).objectnumber,rgb(0,255,0) : endif : if n=5 : color object car(n).objectnumber,rgb(0,255,255) : endif : if n=6 : color object car(n).objectnumber,rgb(0,0,255) : endif : disable object zdepth car(n).objectnumber : wheel1=free_object() : make object box wheel1,0.4,0.2,0.4 : position object wheel1,-0.5,0,0.7 : disable object zdepth wheel1 : color object wheel1,rgb(0,0,0) : glue object to limb wheel1,car(n).objectnumber,0 : wheel2=free_object() : make object box wheel2,0.4,0.2,0.4 : position object wheel2,0.5,0,0.7 : disable object zdepth wheel2
color object wheel2,rgb(0,0,0) : glue object to limb wheel2,car(n).objectnumber,0 : wheel3=free_object() : make object box wheel3,0.6,0.2,0.5 : position object wheel3,-0.5,0,-0.7 : disable object zdepth wheel3 : color object wheel3,rgb(0,0,0) : glue object to limb wheel3,car(n).objectnumber,0 : wheel4=free_object() : make object box wheel4,0.6,0.2,0.5 : position object wheel4,0.5,0,-0.7 : disable object zdepth wheel4 : color object wheel4,rgb(0,0,0) : glue object to limb wheel4,car(n).objectnumber,0 : body=free_object() : make object box body,0.4,0.3,2.4 : glue object to limb body,car(n).objectnumber,0 : disable object zdepth body : tail=free_object() : make object box tail,1.2,0.3,0.4 : position object tail,0,0,-1.3 : glue object to limb tail,car(n).objectnumber,0 : disable object zdepth tail : if xoffset=0 : xoffset=4
else xoffset=0 : endif : car(n).x=13+xoffset : car(n).y=0.5 : car(n).z=25-n*2 : car(n).fi=0.03+n*0.003 : car(n).fl=0.05+n*0.003 : car(n).maxfd=0.02+n*0.002 : car(n).maxfb=0.04 : car(n).turnspeed=2 : position object car(n).objectnumber,car(n).x,car(n).y,car(n).z : next n : set text font "arial" : set text size 30
start:
cockpitmode=0 : ink rgb(150,250,250),0 : camx#=matrixsizex/2.0 : camy#=75 : camz#=-25 : position camera camx#,camy#,camz# : point camera matrixsizex/2.0,0,matrixsizez/2.0 : repeat : text 450,0,"Get ready ...." : if camz#<matrixsizez/2.0-1
inc camz#,0.4 : endif : if camy#<100 : inc camy#,0.2 : endif : position camera camx#,camy#,camz# : point camera matrixsizex/2.0,0,matrixsizez/2.0 : sync : until camy#>=100 and camz#>=matrixsizez/2.0-1 : sync : text 450,0,"3" : sync : wait 1000 : text 450,0,"2" : sync : wait 1000 : text 450,0,"1" : sync : wait 1000 : bestlaptime#=888888 : starttime=timer() : startlaptime=timer() : do : time#=(timer()-starttime)/1000.0 : laptime#=(timer()-startlaptime)/1000.0
player=1 : if upkey()=1 : car(player).fd=car(player).maxfd : else car(player).fd=0 : endif : if downkey()=1 or car(player).slow=1 : car(player).fb=car(player).maxfb : else car(player).fb=0 : endif : if leftkey()=1 : dec car(player).ang,car(player).turnspeed : endif : if rightkey()=1 : inc car(player).ang,car(player).turnspeed : endif : tilex=int(car(1).x/(matrixsizex/xsegments)) : tilez=int(car(1).z/(matrixsizez/zsegments)) : if tile(tilex,tilez).waypoint>0 and tile(tilex,tilez).waypoint<>car(1).waypoint : inc waypointsreached : endif : if tile(tilex,tilez).waypoint<>0 : car(1).waypoint=tile(tilex,tilez).waypoint : endif : position=1 : for n=2 to numberofcars
infront=0 : if car(n).waypoint-1>car(1).waypoint and car(n).lap=car(1).lap : infront=1 : endif : if car(n).lap>car(1).lap : infront=1 : endif : if infront=1 : inc position : endif : next n : if waypointsreached>15 : if car(1).waypoint=1 or car(1).waypoint=99 : inc car(1).lap : startlaptime=timer() : if laptime#<bestlaptime# : bestlaptime#=laptime# : endif : if car(1).lap>4 : winner=1 : position=1 : goto gameover : endif : waypointsreached=0 : endif
endif : for n=2 to numberofcars : car(n).fd=car(n).maxfd : if car(n).slow=1 : car(n).fb=car(n).maxfb : else car(n).fb=0 : endif : if car(n).waypointset=0 : inc car(n).waypoint : if car(n).waypoint>20 : car(n).waypoint=1 : inc car(n).lap : endif : car(n).waypointset=1 : oldang#=car(n).ang : endif : point object car(n).objectnumber,waypoint(car(n).waypoint).x,0,waypoint(car(n).waypoint).z : car(n).targetangle=object angle y(car(n).objectnumber) : rotate object car(n).objectnumber,0,oldang#,0 : rotate object car(n).objectnumber,0,curveangle(car(n).targetangle,car(n).ang,10),0 : car(n).ang=object angle y(car(n).objectnumber) : tilex=int(car(n).x/(matrixsizex/xsegments)) : tilez=int(car(n).z/(matrixsizez/zsegments)) : if tile(tilex,tilez).waypoint=car(n).waypoint : car(n).waypointset=0
endif : if car(n).lap>4 and car(n).waypoint>1 : winner=n : goto gameover : endif : next n : for n=1 to numberofcars : vresultant#=sqrt(car(n).vx^2+car(n).vz^2) : directionoftravel#=atanfull(car(n).vx,car(n).vz) : angle#=differencebetweentwoangles(car(n).ang,directionoftravel#) : inlinefriction#=(car(n).fi+car(n).fb)*vresultant#*cos(angle#) : if inlinefriction#<0 : inlinefriction#=0 : endif : inlinefrictionx#=inlinefriction#*sin(directionoftravel#) : inlinefrictionz#=inlinefriction#*cos(directionoftravel#) : lateralfriction#=car(n).fl*vresultant#*sin(angle#) : lateralfrictionx#=lateralfriction#*sin(directionoftravel#) : lateralfrictionz#=lateralfriction#*cos(directionoftravel#) : totalfrictionx#=(inlinefrictionx#+lateralfrictionx#) : totalfrictionz#=(inlinefrictionz#+lateralfrictionz#) : car(n).fx=car(n).fd*sin(car(n).ang)+(lateralfriction#*sin(car(n).ang)) : car(n).fz=car(n).fd*cos(car(n).ang)+(lateralfriction#*cos(car(n).ang)) : inc car(n).vx,car(n).fx-totalfrictionx# : inc car(n).vz,car(n).fz-totalfrictionz#
inc car(n).x,car(n).vx : inc car(n).z,car(n).vz : car(n).y=get ground height(1,car(n).x,car(n).z) : rotate object car(n).objectnumber,0,car(n).ang,0 : position object car(n).objectnumber,car(n).x,car(n).y,car(n).z : next n : for n=1 to numberofcars : for target=1 to numberofcars : if n<>target : collision=object collision(car(n).objectnumber,car(target).objectnumber) : if collision=1 : if rnd(1)=0 : angle#=5 : else angle#=-5 : endif : inc car(n).ang,angle# : exit : endif : endif : next target : tilex=int(car(n).x/(matrixsizex/xsegments)) : tilez=int(car(n).z/(matrixsizez/zsegments)) : if tilex>xsegments-1 : tilex=xsegments-1 : endif
if tilez>zsegments-1 : tilez=zsegments-1 : endif : if tile(tilex,tilez).imagenumber=5 : ongrass=1 : else ongrass=0 : endif : if ongrass=1 : car(n).slow=1 : set object emissive car(n).objectnumber,rgb(255,128,0) : else : car(n).slow=0 : set object emissive car(n).objectnumber,rgb(80,80,80) : endif : next n : for n=1 to numberofcars : car(n).oldx=car(n).x : car(n).oldz=car(n).z : next n : text 460,30,"Lap: "+str$(car(1).lap+1)+" of 5" : text 0,0,"Time: "+left$(str$(time#),5) : text 450,0,"Lap Time: "+left$(str$(laptime#),5) : text 840,0,"Best Lap: "+left$(str$(bestlaptime#),5) : text 460,730,"Position: "+str$(position) : if spacekey()=1
cockpitmode=1 : endif : if cockpitmode=1 : position camera object position x(car(1).objectnumber),object position y(car(1).objectnumber)+2,object position z(car(1).objectnumber) : set camera to object orientation car(1).objectnumber : move camera -4 : endif : sync : loop
function differencebetweentwoangles(angle2#,angle1#) : angle2#=wrapvalue(angle2#) : angle1#=wrapvalue(angle1#) : if angle1#>180 : dec angle1#,360 : endif : if angle2#>180 : dec angle2#,360 : endif : difference#=abs(angle2#-angle1#) : if difference#>180 : difference#=abs(difference#-360) : endif
endfunction difference# : function normal(MatNum,MapSizeX,MapSizeZ) : for x=1 to MapSizeX-1 : for z=1 to MapSizeZ-1 : h8#=tile(x,z-1).height : h4#=tile(x-1,z).height : h1#=tile(x,z).height : y1#=h1# : y2#=h4# : dx#=stepX#/10 : dy#=y2#-y1# : ax#=atanfull(dx#,dy#) : ax#=wrapvalue(90-ax#) : y1#=h1# : y2#=h8# : dz#=stepZ#/10 : dy#=y2#-y1# : az#=atanfull(dz#,dy#) : az#=wrapvalue(90-az#) : nx# = Sin(ax#) : ny# = Cos(ax#) : nz# = Sin(az#) : Set Matrix Normal MatNum,x,z,nx#,ny#,nz# : Next x : Next z
EndFunction : function free_image() : repeat : inc n : until image exist(n)=0
endfunction n : function free_sprite() : repeat : inc n : until sprite exist(n)=0
endfunction n : function free_object() : repeat : inc n : until object exist(n)=0
endfunction n : data 5,5,5,5,5,5,5,5,5,5, 5,7,6,6,6,6,6,9,5,5, 5,8,5,5,5,5,5,1,9,5, 5,1,6,6,6,9,5,5,8,5, 5,5,5,5,5,1,9,5,8,5, 5,7,6,9,5,5,8,5,8,5, 5,8,5,1,6,6,3,5,8,5, 5,2,5,5,5,5,5,5,8,5, 5,1,6,6,6,6,6,6,3,5, 5,5,5,5,5,5,5,5,5,5, 0,0,0,0,0,4,4,4,4,4, 0,0,0,0,0,4,4,4,4,4, 0,0,0,0,0,4,4,4,4,4, 0,0,0,0,0,0,4,9,9,9, 0,0,0,0,0,0,4,9,9,9, 0,0,0,3,3,3,0,9,9,9, 0,0,0,3,3,3,0,4,4,4, 0,0,0,5,5,5,0,0,0,0, 0,0,0,5,5,5,0,0,0,0, 0,0,0,5,5,5,0,0,0,0, 00,00,00,00,00,00,00,00,00,00, 00,11,00,00,12,00,00,13,00,00, 00,00,00,00,00,00,00,00,14,00, 00,10,09,00,00,08,00,00,00,00, 00,00,00,00,00,00,07,00,00,00, 00,02,00,03,00,00,00,00,15,00, 99,01,99,00,04,05,06,00,00,00, 00,00,00,00,00,00,00,00,16,00, 00,20,19,00,00,18,00,00,17,00, 00,00,00,00,00,00,00,00,00,00
gameover:
ink -1,0 : if position>1 : text 400,250,"Car "+str$(winner)+" wins!" : endif : text 400,270,"You finished in position "+str$(position) : text 400,290,"Your time was: "+left$(str$(time#),5)+"s" : text 400,310,"Your best lap time was: "+left$(str$(bestlaptime#),5)+"s" : if winner=1 : text 400,350,"Congratulations!!!" : else text 400,350,"Unlucky!!!" : endif : text 400,400,"Press any key to start again" : sync : wait 2000 : wait key : for n=1 to numberofcars : if xoffset=0 : xoffset=4 : else xoffset=0 : endif : car(n).x=13+xoffset : car(n).y=0.5
car(n).z=25-n*2 : position object car(n).objectnumber,car(n).x,car(n).y,car(n).z : car(n).oldx=0 : car(n).oldy=0 : car(n).oldz=0 : car(n).fx=0 : car(n).fz=0 : car(n).vx=0 : car(n).vz=0 : car(n).ang=0 : rotate object car(n).objectnumber,0,car(n).ang,0 : car(n).slow=0 : car(n).waypoint=0 : car(n).waypointset=0 : car(n).targetangle=0 : car(n).lap=0 : car(n).collision=0 : waypointsreached=0 : next n : goto start
Uncompressed with comments:
Rem Created: 14/03/2007 11:04:37
Rem ***** Main Source File *****
set display mode 1024,768,32
hide mouse
ink rgb(180,180,255),0
text 400,0,"Formula 50 Grand Prix!"
text 0,40,"Upkey - Accelerate"
text 0,60,"Downkey - Brake"
text 0,80,"Leftkey - Steer left"
text 0,100,"Rightkey - Steer right"
text 0,120,"First to complete 5 laps wins"
text 0,140,"If you cut too many corners or take shortcuts your lap will not count!"
text 0,180,"Press any key"
wait key
sync on
sync rate 60
hide light 0
color backdrop rgb(80,80,80)
make light 1
position light 1,0,50,100
set light range 1,500
`constants
matrixsizex=100
matrixsizez=100
xsegments=10
zsegments=10
tileimagesize=64
numberofcars=6
type tiletype
imagenumber as integer
tilenumber as integer
height as float
posx as float
posy as float
waypoint as integer
endtype
type cartype
objectnumber as integer
x as float
y as float
z as float
oldx as float
oldy as float
oldz as float
fi as float
fl as float
fd as float
fb as float
maxfd as float
maxfb as float
fx as float
fz as float
ax as float
az as float
vx as float
vz as float
ang as float
turnspeed as float
slow as integer
waypoint as integer
waypointset as integer
targetangle as float
lap as integer
collision as integer
endtype
type waypointtype
x as float
z as float
endtype
gosub make_track
gosub make_cars
set text font "arial"
set text size 30
start:
cockpitmode=0
ink rgb(150,250,250),0
camx#=matrixsizex/2.0
camy#=75
camz#=-25
position camera camx#,camy#,camz#
point camera matrixsizex/2.0,0,matrixsizez/2.0
repeat
text 450,0,"Get ready ...."
if camz#<matrixsizez/2.0-1 then inc camz#,0.4
if camy#<100 then inc camy#,0.2
position camera camx#,camy#,camz#
point camera matrixsizex/2.0,0,matrixsizez/2.0
sync
until camy#>=100 and camz#>=matrixsizez/2.0-1
sync
text 450,0,"3"
sync
wait 1000
text 450,0,"2"
sync
wait 1000
text 450,0,"1"
sync
wait 1000
bestlaptime#=888888
starttime=timer()
startlaptime=timer()
do
time#=(timer()-starttime)/1000.0
laptime#=(timer()-startlaptime)/1000.0
gosub move_player
gosub ai
gosub move_cars
gosub collision
gosub store_positions
gosub display
if spacekey()=1 then cockpitmode=1
if cockpitmode=1 then gosub camera
sync
loop
camera:
position camera object position x(car(1).objectnumber),object position y(car(1).objectnumber)+2,object position z(car(1).objectnumber)
set camera to object orientation car(1).objectnumber
move camera -4
return
display:
`for n=1 to numberofcars
`text 0,20*n+20,"Car"+str$(n)+" lap: "+str$(car(n).lap+1)+" of 5"
`next n
text 460,30,"Lap: "+str$(car(1).lap+1)+" of 5"
text 0,0,"Time: "+left$(str$(time#),5)
text 450,0,"Lap Time: "+left$(str$(laptime#),5)
`if car(1).lap>0 then
text 840,0,"Best Lap: "+left$(str$(bestlaptime#),5)
text 460,730,"Position: "+str$(position)
return
store_positions:
for n=1 to numberofcars
car(n).oldx=car(n).x
car(n).oldz=car(n).z
next n
collision:
for n=1 to numberofcars
for target=1 to numberofcars
if n<>target
collision=object collision(car(n).objectnumber,car(target).objectnumber)
if collision=1
if rnd(1)=0 then angle#=5 else angle#=-5
inc car(n).ang,angle#
exit
endif
endif
next target
tilex=int(car(n).x/(matrixsizex/xsegments))
tilez=int(car(n).z/(matrixsizez/zsegments))
if tilex>xsegments-1 then tilex=xsegments-1
if tilez>zsegments-1 then tilez=zsegments-1
if tile(tilex,tilez).imagenumber=5 then ongrass=1 else ongrass=0
if ongrass=1
car(n).slow=1
set object emissive car(n).objectnumber,rgb(255,128,0)
else
car(n).slow=0
set object emissive car(n).objectnumber,rgb(80,80,80)
endif
next n
return
ai:
for n=2 to numberofcars
car(n).fd=car(n).maxfd
if car(n).slow=1 then car(n).fb=car(n).maxfb else car(n).fb=0
if car(n).waypointset=0
inc car(n).waypoint
if car(n).waypoint>20 then car(n).waypoint=1: inc car(n).lap
car(n).waypointset=1
oldang#=car(n).ang
endif
point object car(n).objectnumber,waypoint(car(n).waypoint).x,0,waypoint(car(n).waypoint).z
car(n).targetangle=object angle y(car(n).objectnumber)
rotate object car(n).objectnumber,0,oldang#,0
rotate object car(n).objectnumber,0,curveangle(car(n).targetangle,car(n).ang,10),0
car(n).ang=object angle y(car(n).objectnumber)
tilex=int(car(n).x/(matrixsizex/xsegments))
tilez=int(car(n).z/(matrixsizez/zsegments))
if tile(tilex,tilez).waypoint=car(n).waypoint then car(n).waypointset=0
if car(n).lap>4 and car(n).waypoint>1 then winner=n:goto gameover
next n
return
move_player:
player=1
if upkey()=1 then car(player).fd=car(player).maxfd else car(player).fd=0
if downkey()=1 or car(player).slow=1 then car(player).fb=car(player).maxfb else car(player).fb=0
if leftkey()=1 then dec car(player).ang,car(player).turnspeed
if rightkey()=1 then inc car(player).ang,car(player).turnspeed
tilex=int(car(1).x/(matrixsizex/xsegments))
tilez=int(car(1).z/(matrixsizez/zsegments))
if tile(tilex,tilez).waypoint>0 and tile(tilex,tilez).waypoint<>car(1).waypoint then inc waypointsreached
if tile(tilex,tilez).waypoint<>0 then car(1).waypoint=tile(tilex,tilez).waypoint
position=1
for n=2 to numberofcars
infront=0
if car(n).waypoint-1>car(1).waypoint and car(n).lap=car(1).lap then infront=1
if car(n).lap>car(1).lap then infront=1
if infront=1 then inc position
next n
if waypointsreached>15
if car(1).waypoint=1 or car(1).waypoint=99
inc car(1).lap
startlaptime=timer()
if laptime#<bestlaptime# then bestlaptime#=laptime#
if car(1).lap>4 then winner=1:position=1:goto gameover
waypointsreached=0
endif
endif
return
move_cars:
for n=1 to numberofcars
`calculate resultant velocity size and direction of travel from previous loop
vresultant#=sqrt(car(n).vx^2+car(n).vz^2)
directionoftravel#=atanfull(car(n).vx,car(n).vz)
`calculate angle between car and direction of travel
angle#=differencebetweentwoangles(car(n).ang,directionoftravel#)
`calculate inline friction size
inlinefriction#=(car(n).fi+car(n).fb)*vresultant#*cos(angle#)
if inlinefriction#<0 then inlinefriction#=0
`calculate x and z components of inline friction
inlinefrictionx#=inlinefriction#*sin(directionoftravel#)
inlinefrictionz#=inlinefriction#*cos(directionoftravel#)
`calculate lateral friction size
lateralfriction#=car(n).fl*vresultant#*sin(angle#)
`calculate x and z components of lateral friction
lateralfrictionx#=lateralfriction#*sin(directionoftravel#)
lateralfrictionz#=lateralfriction#*cos(directionoftravel#)
`calculate total friction
totalfrictionx#=(inlinefrictionx#+lateralfrictionx#)
totalfrictionz#=(inlinefrictionz#+lateralfrictionz#)
`calculate x and z force components due to drive, and reaction of lateral friction in direction of car
car(n).fx=car(n).fd*sin(car(n).ang)+(lateralfriction#*sin(car(n).ang))
car(n).fz=car(n).fd*cos(car(n).ang)+(lateralfriction#*cos(car(n).ang))
`calculate new x and z velocity components due to driving and frictional forces
inc car(n).vx,car(n).fx-totalfrictionx#
inc car(n).vz,car(n).fz-totalfrictionz#
`update positions
inc car(n).x,car(n).vx
inc car(n).z,car(n).vz
car(n).y=get ground height(1,car(n).x,car(n).z)
rotate object car(n).objectnumber,0,car(n).ang,0
position object car(n).objectnumber,car(n).x,car(n).y,car(n).z
next n
return
make_cars:
dim car(numberofcars) as cartype
for n=1 to numberofcars
car(n).objectnumber=free_object()
make object box car(n).objectnumber,1,0.2,2
if n=1 then color object car(n).objectnumber,rgb(255,0,0)
if n=2 then color object car(n).objectnumber,rgb(255,255,0)
if n=3 then color object car(n).objectnumber,rgb(255,0,255)
if n=4 then color object car(n).objectnumber,rgb(0,255,0)
if n=5 then color object car(n).objectnumber,rgb(0,255,255)
if n=6 then color object car(n).objectnumber,rgb(0,0,255)
disable object zdepth car(n).objectnumber
wheel1=free_object()
make object box wheel1,0.4,0.2,0.4
position object wheel1,-0.5,0,0.7
disable object zdepth wheel1
color object wheel1,rgb(0,0,0)
glue object to limb wheel1,car(n).objectnumber,0
wheel2=free_object()
make object box wheel2,0.4,0.2,0.4
position object wheel2,0.5,0,0.7
disable object zdepth wheel2
color object wheel2,rgb(0,0,0)
glue object to limb wheel2,car(n).objectnumber,0
wheel3=free_object()
make object box wheel3,0.6,0.2,0.5
position object wheel3,-0.5,0,-0.7
disable object zdepth wheel3
color object wheel3,rgb(0,0,0)
glue object to limb wheel3,car(n).objectnumber,0
wheel4=free_object()
make object box wheel4,0.6,0.2,0.5
position object wheel4,0.5,0,-0.7
disable object zdepth wheel4
color object wheel4,rgb(0,0,0)
glue object to limb wheel4,car(n).objectnumber,0
body=free_object()
make object box body,0.4,0.3,2.4
glue object to limb body,car(n).objectnumber,0
disable object zdepth body
tail=free_object()
make object box tail,1.2,0.3,0.4
position object tail,0,0,-1.3
glue object to limb tail,car(n).objectnumber,0
disable object zdepth tail
if xoffset=0 then xoffset=4 else xoffset=0
car(n).x=13+xoffset
car(n).y=0.5
car(n).z=25-n*2
car(n).fi=0.03+n*0.003 `force due to inline friction
car(n).fl=0.05+n*0.003 `force due to lateral friction
car(n).maxfd=0.02+n*0.002 `force due to drive
car(n).maxfb=0.04 `force due to braking friction
car(n).turnspeed=2
position object car(n).objectnumber,car(n).x,car(n).y,car(n).z
next n
return
make_track:
make matrix 1,matrixsizex,matrixsizez,xsegments,zsegments
`grid
inc numberofimages
create bitmap 1,tileimagesize,tileimagesize
set current bitmap 1
ink rgb(120,120,120),0
box 0,0,tileimagesize,tileimagesize
ink rgb(100,100,100),0
for n=1 to 600
dot rnd(tileimagesize),rnd(tileimagesize)
next n
ink rgb(140,140,140),0
for n=1 to 600
dot rnd(tileimagesize),rnd(tileimagesize)
next n
ink -1,0
for y=0 to tileimagesize step 8
for x=0 to tileimagesize step 8
if white=0 then white=1 else white=0
if white=1
box x,y,x+8,y+8
endif
next x
next y
for n=0 to 4
line 0,n,tileimagesize,n
next n
ink -1,0
for n=0 to 9 step 2
box 2,n*tileimagesize/10.0,6,(n+1)*tileimagesize/10.0
box tileimagesize-6,n*tileimagesize/10.0,tileimagesize-2,(n+1)*tileimagesize/10.0
next n
ink rgb(255,0,0),0
for n=1 to 10 step 2
box 2,n*tileimagesize/10.0,6,(n+1)*tileimagesize/10.0
box tileimagesize-6,n*tileimagesize/10.0,tileimagesize-2,(n+1)*tileimagesize/10.0
next n
grid=2
get image grid,0,0,tileimagesize,tileimagesize,1
set current bitmap 0
delete bitmap 1
`road vertical
inc numberofimages
create bitmap 1,tileimagesize,tileimagesize
set current bitmap 1
ink rgb(120,120,120),0
box 0,0,tileimagesize,tileimagesize
ink rgb(100,100,100),0
for n=1 to 600
dot rnd(tileimagesize),rnd(tileimagesize)
next n
ink rgb(140,140,140),0
for n=1 to 600
dot rnd(tileimagesize),rnd(tileimagesize)
next n
ink -1,0
for n=0 to 9 step 2
box 2,n*tileimagesize/10.0,6,(n+1)*tileimagesize/10.0
box tileimagesize-6,n*tileimagesize/10.0,tileimagesize-2,(n+1)*tileimagesize/10.0
next n
ink rgb(255,0,0),0
for n=1 to 10 step 2
box 2,n*tileimagesize/10.0,6,(n+1)*tileimagesize/10.0
box tileimagesize-6,n*tileimagesize/10.0,tileimagesize-2,(n+1)*tileimagesize/10.0
next n
road1=8
get image road1,0,0,tileimagesize,tileimagesize,1
set current bitmap 0
delete bitmap 1
`road horizontal
inc numberofimages
create bitmap 1,tileimagesize,tileimagesize
set current bitmap 1
ink rgb(120,120,120),0
box 0,0,tileimagesize,tileimagesize
ink rgb(100,100,100),0
for n=1 to 600
dot rnd(tileimagesize),rnd(tileimagesize)
next n
ink rgb(140,140,140),0
for n=1 to 600
dot rnd(tileimagesize),rnd(tileimagesize)
next n
ink -1,0
for n=0 to 9 step 2
box n*tileimagesize/10.0,2,(n+1)*tileimagesize/10.0,6
box n*tileimagesize/10.0,tileimagesize-6,(n+1)*tileimagesize/10.0,tileimagesize-2
next n
ink rgb(255,0,0),0
for n=1 to 10 step 2
box n*tileimagesize/10.0,2,(n+1)*tileimagesize/10.0,6
box n*tileimagesize/10.0,tileimagesize-6,(n+1)*tileimagesize/10.0,tileimagesize-2
next n
road2=6
get image road2,0,0,tileimagesize,tileimagesize,1
set current bitmap 0
delete bitmap 1
`road bend 7
inc numberofimages
create bitmap 1,tileimagesize,tileimagesize
set current bitmap 1
ink rgb(120,120,120),0
box 0,0,tileimagesize,tileimagesize
ink rgb(100,100,100),0
for n=1 to 600
dot rnd(tileimagesize),rnd(tileimagesize)
next n
ink rgb(140,140,140),0
for n=1 to 600
dot rnd(tileimagesize),rnd(tileimagesize)
next n
ink -1,0
for n=0 to 9 step 2
box 2,n*tileimagesize/10.0,6,(n+1)*tileimagesize/10.0
box n*tileimagesize/10.0,2,(n+1)*tileimagesize/10.0,6
next n
ink rgb(255,0,0),0
for n=1 to 10 step 2
box 2,n*tileimagesize/10.0,6,(n+1)*tileimagesize/10.0
box n*tileimagesize/10.0,2,(n+1)*tileimagesize/10.0,6
next n
box tileimagesize-6,tileimagesize-6,tileimagesize-2,tileimagesize-2
road7=7
get image road7,0,0,tileimagesize,tileimagesize,1
set current bitmap 0
delete bitmap 1
`road bend 9
inc numberofimages
temp=free_sprite()
sprite temp,-100,-100,road7
mirror sprite temp
create bitmap 1,tileimagesize,tileimagesize
set current bitmap 1
paste sprite temp,0,0
road9=9
get image road9,0,0,tileimagesize,tileimagesize,1
set current bitmap 0
delete bitmap 1
`road bend 3
inc numberofimages
flip sprite temp
create bitmap 1,tileimagesize,tileimagesize
set current bitmap 1
paste sprite temp,0,0
road3=3
get image road3,0,0,tileimagesize,tileimagesize,1
set current bitmap 0
delete bitmap 1
`road bend 1
inc numberofimages
mirror sprite temp
create bitmap 1,tileimagesize,tileimagesize
set current bitmap 1
paste sprite temp,0,0
road1=1
get image road1,0,0,tileimagesize,tileimagesize,1
set current bitmap 0
delete bitmap 1
`grass
inc numberofimages
create bitmap 1,tileimagesize,tileimagesize
set current bitmap 1
ink rgb(0,200,0),0
box 0,0,tileimagesize,tileimagesize
ink rgb(0,220,0),0
for n=1 to 600
dot rnd(tileimagesize),rnd(tileimagesize)
next n
ink rgb(0,210,0),0
for n=1 to 600
dot rnd(tileimagesize),rnd(tileimagesize)
next n
blur bitmap 1,1
grass=5
get image grass,0,0,tileimagesize,tileimagesize,1
set current bitmap 0
delete bitmap 1
`create matrix texture
ink 0,0
dim tile(xsegments,zsegments) as tiletype
create bitmap 1,xsegments*tileimagesize,zsegments*tileimagesize
restore datastatements
create bitmap 1,9*tileimagesize,tileimagesize
for imagenumber=1 to 9
if image exist(imagenumber)=1
paste image imagenumber,(imagenumber-1)*tileimagesize,0
endif
next imagenumber
matrixtexture=free_image()
get image matrixtexture,0,0,9*tileimagesize,tileimagesize
delete bitmap 1
prepare matrix texture 1,matrixtexture,9,1
set matrix trim 1,0.003,0.003
`read texture map
for z=zsegments-1 to 0 step -1
for x=0 to xsegments-1
read tile(x,z).imagenumber
next x
next z
`read height map
for z=zsegments-1 to 0 step -1
for x=0 to xsegments-1
read tile(x,z).height
next x
next z
dim waypoint(99) as waypointtype
`read waypoint map
for z=zsegments-1 to 0 step -1
for x=0 to xsegments-1
read tile(x,z).waypoint
if tile(x,z).waypoint>0
if tile(x,z).imagenumber=8 or tile(x,z).imagenumber=6 or tile(x,z).imagenumber=2 then offsetx#=0.5:offsetz#=0.5
if tile(x,z).imagenumber=7 then offsetx#=0.8:offsetz#=0.2
if tile(x,z).imagenumber=9 then offsetx#=0.2:offsetz#=0.2
if tile(x,z).imagenumber=3 then offsetx#=0.2:offsetz#=0.8
if tile(x,z).imagenumber=1 then offsetx#=0.8:offsetz#=0.8
waypoint(tile(x,z).waypoint).x=(x+offsetx#)*matrixsizex/xsegments
waypoint(tile(x,z).waypoint).z=(z+offsetz#)*matrixsizez/zsegments
endif
next x
next z
tile=0
for z=zsegments-1 to 0 step -1
for x=0 to xsegments-1
inc tile
tile(x,z).tilenumber=tile
set matrix tile 1,x,z,tile(x,z).imagenumber
set matrix height 1,x,z,tile(x,z).height
next x
next z
matnum=1
For Z = 1 To zsegments - 1
For X = 1 To xsegments - 1
rem Get matrix heights
h8# = Get Matrix Height(MatNum,x,z-1)
h4# = Get Matrix Height(MatNum,x-1,z)
h# = Get Matrix Height(MatNum,x,z)
h2# = Get Matrix Height(MatNum,x,z)
rem Calculate projected angle X using heights
x1#=(x-1)*25.0 : y1#=h#
x2#=(x+0)*25.0 : y2#=h4#
dx#=x2#-x1#
dy#=y2#-y1#
ax# = AtanFull(dx#,dy#)
ax# = WrapValue(90-ax#)
rem Calculate projected angle Z using heights
z1# = (z-1)*25.0 : y1#=h2#
z2# = (z+0)*25.0 : y2#=h8#
dz# = z2#-z1#
dy# = y2#-y1#
az# = AtanFull(dz#,dy#)
az# = WrapValue(90-az#)
rem Make normal from projected angle
nx# = Sin(ax#)
ny# = Cos(ax#)
nz# = Sin(az#)
rem Setting matrix normal for smoothness
Set Matrix Normal MatNum,x,z,nx#,ny#,nz#
Next X
Next Z
`normal(1,xsegments,zsegments)
update matrix 1
for n=1 to 20
building=free_object()
make object box building,rnd(5)+1,5,rnd(5)+1
repeat
x=5+10*rnd(matrixsizex-1)/10
z=5+10*rnd(matrixsizez-1)/10
tilex=int(x/(matrixsizex/xsegments))
tilez=int(z/(matrixsizez/zsegments))
until tile(tilex,tilez).imagenumber=5
position object building,x,get ground height(1,x,z),z
next n
return
function differencebetweentwoangles(angle2#,angle1#)
angle2#=wrapvalue(angle2#)
angle1#=wrapvalue(angle1#)
if angle1#>180 then dec angle1#,360
if angle2#>180 then dec angle2#,360
difference#=abs(angle2#-angle1#)
if difference#>180 then difference#=abs(difference#-360)
endfunction difference#
function normal(MatNum,MapSizeX,MapSizeZ)
for x=1 to MapSizeX-1
for z=1 to MapSizeZ-1
rem create regular normals for Terrain array
rem Vertices on the matrix
rem x-1,z-1 x,z-1
rem x-1,z x,z
rem Get stored heights
h8#=tile(x,z-1).height
h4#=tile(x-1,z).height
h1#=tile(x,z).height
rem Calculate projected angle X using heights
y1#=h1#
y2#=h4#
rem X distance is a function of stepX#
dx#=stepX#/10
rem Y distance is the difference in height
dy#=y2#-y1#
ax#=atanfull(dx#,dy#)
ax#=wrapvalue(90-ax#)
rem Calculate projected angle Z using heights
y1#=h1#
y2#=h8#
rem Z distance is a function of stepZ#
dz#=stepZ#/10
rem Y distance is the difference in height
dy#=y2#-y1#
az#=atanfull(dz#,dy#)
az#=wrapvalue(90-az#)
rem Make normal from projected angle
nx# = Sin(ax#)
ny# = Cos(ax#)
nz# = Sin(az#)
rem Setting matrix normal for smoothness
Set Matrix Normal MatNum,x,z,nx#,ny#,nz#
Next x
Next z
EndFunction
function free_image()
repeat
inc n
until image exist(n)=0
endfunction n
function free_sprite()
repeat
inc n
until sprite exist(n)=0
endfunction n
function free_object()
repeat
inc n
until object exist(n)=0
endfunction n
datastatements:
`texturemap
data 5,5,5,5,5,5,5,5,5,5
data 5,7,6,6,6,6,6,9,5,5
data 5,8,5,5,5,5,5,1,9,5
data 5,1,6,6,6,9,5,5,8,5
data 5,5,5,5,5,1,9,5,8,5
data 5,7,6,9,5,5,8,5,8,5
data 5,8,5,1,6,6,3,5,8,5
data 5,2,5,5,5,5,5,5,8,5
data 5,1,6,6,6,6,6,6,3,5
data 5,5,5,5,5,5,5,5,5,5
`heightmap
data 0,0,0,0,0,4,4,4,4,4
data 0,0,0,0,0,4,4,4,4,4
data 0,0,0,0,0,4,4,4,4,4
data 0,0,0,0,0,0,4,9,9,9
data 0,0,0,0,0,0,4,9,9,9
data 0,0,0,3,3,3,0,9,9,9
data 0,0,0,3,3,3,0,4,4,4
data 0,0,0,5,5,5,0,0,0,0
data 0,0,0,5,5,5,0,0,0,0
data 0,0,0,5,5,5,0,0,0,0
`waypoints
data 00,00,00,00,00,00,00,00,00,00
data 00,11,00,00,12,00,00,13,00,00
data 00,00,00,00,00,00,00,00,14,00
data 00,10,09,00,00,08,00,00,00,00
data 00,00,00,00,00,00,07,00,00,00
data 00,02,00,03,00,00,00,00,15,00
data 99,01,99,00,04,05,06,00,00,00
data 00,00,00,00,00,00,00,00,16,00
data 00,20,19,00,00,18,00,00,17,00
data 00,00,00,00,00,00,00,00,00,00
gameover:
ink -1,0
if position>1 then text 400,250,"Car "+str$(winner)+" wins!"
text 400,270,"You finished in position "+str$(position)
text 400,290,"Your time was: "+left$(str$(time#),5)+"s"
text 400,310,"Your best lap time was: "+left$(str$(bestlaptime#),5)+"s"
if winner=1 then text 400,350,"Congratulations!!!" else text 400,350,"Unlucky!!!"
text 400,400,"Press any key to start again"
sync
wait 2000
wait key
for n=1 to numberofcars
if xoffset=0 then xoffset=4 else xoffset=0
car(n).x=13+xoffset
car(n).y=0.5
car(n).z=25-n*2
position object car(n).objectnumber,car(n).x,car(n).y,car(n).z
car(n).oldx=0
car(n).oldy=0
car(n).oldz=0
car(n).fx=0
car(n).fz=0
car(n).vx=0
car(n).vz=0
car(n).ang=0
rotate object car(n).objectnumber,0,car(n).ang,0
car(n).slow=0
car(n).waypoint=0
car(n).waypointset=0
car(n).targetangle=0
car(n).lap=0
car(n).collision=0
waypointsreached=0
next n
goto start
Tested successfully in DBPro 6.2.
Thanks to CPU for his advanced compressor snippet -
http://forum.thegamecreators.com/?m=forum_view&t=61870&b=11 - which made light work of compressing this into 45 lines.
<note> Pressing space during the race gives access to 'secret 3d mode' - the game isn't really meant to be played like this, so a few things appear a little odd in this mode, it's just there for fun! </note>