The Game Creators
The Game Creators Home Online Shop Click to Login
  Hot: Christmas CompetitionNovember NewsletterModel Pack 36DB Pro Pack 2009DGS BonanzaCharacter PackFPS Creator Bonanza;
The Game Creators
20 Liners / 50 liner: ** Formula 50 Grand Prix **

Go to the first page of this board Return to the Forum Menu Post Message
8 Messages - Page   of 1   
Bookmark and Share Search the Forum

Author Message
Ric

User


Joined: Sun Jul 11th 2004
Location: object position x
Posted: 29th Mar 2007 09:59     Edited: 29th Mar 2007 10:48     | link | toggle

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:

+ Code Snippet
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:

+ Code Snippet
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>

Back to top
Andromedus.com
Download: f50gp.jpg Size: 123859 bytes  View Image: f50gp.jpg Size: 123859 bytesReport this message as abusive
The Nerd

User


Joined: Sat Jun 5th 2004
Location: Denmark
Posted: 29th Mar 2007 10:25           | link | toggle

hehe, that's a really awesome little game! Really impressive.

Well done Ric!

Back to top
Report this message as abusive
French gui

User


Joined: Tue May 11th 2004
Location: France
Posted: 29th Mar 2007 11:08     Edited: 29th Mar 2007 11:16     | link | toggle

OMG! This is incredible! This is a master piece of code! I bet on you to win this compo Ric.

( My best lap: 10.31 )
Back to top
FFG
Report this message as abusive
IBOL

User


Joined: Tue Mar 30th 2004
Location: chair
Posted: 29th Mar 2007 16:31           | link | toggle

i just lost. looks great!

Back to top
Report this message as abusive
Google Ad
Back to top
 
French gui

User


Joined: Tue May 11th 2004
Location: France
Posted: 29th Mar 2007 16:53           | link | toggle

Oh,Bob, you'll win the 2nd price...
Back to top
FFG
Report this message as abusive
Valle

User


Joined: Fri Mar 10th 2006
Location: Cyberspace
Posted: 30th Mar 2007 11:49           | link | toggle

absolutely awesome!!


Back to top
Report this message as abusive
Ric

User


Joined: Sun Jul 11th 2004
Location: object position x
Posted: 30th Mar 2007 13:44           | link | toggle

Thanks for the positive comments, guys.

FrenchGUI - 10.31 that's fast! I don't think I've managed under 12s yet - must need more practice!

Back to top
Andromedus.com
Report this message as abusive
filya

User


Joined: Wed Aug 23rd 2006
Location: USA
Posted: 30th Mar 2007 15:46     Edited: 30th Mar 2007 19:50     | link | toggle

Ric, I am a DBPro beginner. Although if I try hard, I may be able to understand most of your code, could I request you to comment the code a bit more?
It would help me understand why you did something and how.

It may be pretty obvious to most around here, but it surely would help newcomers like me
If it's not too much trouble, you could comment the various 'paragraphs' you already have.

Thanks for the code! (even if you dont comment it )

-- game dev is fun...but taking up too much time --
Back to top
Unleash3d
Report this message as abusive

Go to the first page of this board Return to the Forum Menu Post Message
8 Messages - Page   of 1   
Search the Forum

Sorry, but it has been so long since anyone replied to this Thread that it has been automatically locked.
You may read it but not reply.

Forum Search

Enter a word or phrase to search our Forum for:

Thread Subject Search
Search Phrase:
Search Scope: Entire forum
Just this board
 
Google Forum Search
Search Phrase:
 
Apollo v2.02


Dark Game Studio
Privacy Policy AUP Top of Page