`The Usual Setup
sync on
sync rate 30
autocam off
hide mouse
randomize timer()
if check display mode(1024,768,32)=1
    set display mode 1024,768,32
endif
set text font "Gungsuh"
`Variables
sw=screen width()
sh=screen height()
type car_info
     acc as float
     wpt as integer
     lap as integer
     finish as boolean
endtype
dim car(8) as car_info
type way_point
     x as integer
     z as integer
endtype
dim way(20) as way_point
null=make vector2(1)
null=make vector2(2)
dim pt(8) as string
pt(1)="st"
pt(2)="nd"
pt(3)="rd"
for i=4 to 8
    pt(i)="th"
next i
place=8
dim comment(8) as string
comment(1)="Congradulations, you are God"
comment(2)="Ok, now you'll have to play again"
comment(3)="You still get a medal"
comment(4)="Do better"
comment(5)="Now your not even in the top 50%"
comment(6)="Shame"
comment(7)="You could have done worse"
comment(8)="Seek help"
`Stolen from Hobgoblin Lord
type note_thing
   note as integer
   speed as integer
   volume as integer
endtype
dim master_note(-1) as note_thing
make_midi("R",25,2,"a4 a4 a4 g5")
load music "r.mid",1
`Grass
make_image_memblock(1,32,32,32)
for x=1 to 32
    for y=1 to 32
        memblock_dot(1,x,y,rgb(rnd(128),rnd(128)+127,0))
    next y
next x
make image from memblock 10,1
`Road
for x=1 to 32
    for y=1 to 32
        c=rnd(20)+127
        memblock_dot(1,x,y,rgb(c,c,c))
    next y
next x
make image from memblock 11,1
`Wall
for x=1 to 32
    for y=1 to 32
        c=rnd(60)
        memblock_dot(1,x,y,rgb(c,c,c))
    next y
next x
make image from memblock 12,1
`Boost
for x=1 to 32
    for y=1 to 32
        memblock_dot(1,x,y,rgb(255,x*50 mod 256,0))
    next y
next x
make image from memblock 15,1
delete memblock 1
set text size 14
color backdrop rgb(29, 94, 99)
`Choose Track
track=1
repeat
if escapekey()=1
   end
endif
sync
set cursor 0,0
print "Select a track"
print ""
dim trackname(3) as string
trackname(1)="Winding Willow"
trackname(2)="Spring Track"
trackname(3)="Checker Field"
sprite 1,-10,-10,10
size sprite 1,10,10
for i=1 to 3
    if i=track
       ink rgb(123, 123, 238),0
       arrow$=" <--------"
    else
       ink -1,0
       arrow$=""
    endif
    print trackname(i)+arrow$
next i
select track
    case 1
        restore track1
    endcase
    case 2
        restore track2
    endcase
    case 3
        restore track3
    endcase
endselect
for x=1 to 30
    for z=1 to 30
        read road
        select road
            case 0
                set sprite image 1,10
            endcase
            case 1
                set sprite image 1,11
            endcase
            case 2
                set sprite image 1,12
            endcase
            case 3
                set sprite image 1,15
            endcase
        endselect
        paste sprite 1,x*10+200,400-z*10
    next z
next x
track=track-upkey()+downkey()
if track<1
   track=1
endif
if track>3
   track=3
endif
ink -1,0
until returnkey()=1
delete sprite 1
`Make Car
set camera range 10,10000
color backdrop rgb(0, 210, 255)
make object box 1,50,30,100
make object box 2,10,10,15
make mesh from object 1,2
delete object 2
add limb 1,1,1
offset limb 1,1,0,20,-40
delete mesh 1
make object box 2,60,6,20
make mesh from object 1,2
delete object 2
add limb 1,2,1
offset limb 1,2,0,23,-40
delete mesh 1
make object sphere 2,100,6,6
scale object 2,6,25,25
make mesh from object 1,2
delete object 2
add limb 1,3,1
offset limb 1,3,28,-10,30
add limb 1,4,1
offset limb 1,4,-28,-10,30
add limb 1,5,1
offset limb 1,5,28,-10,-30
add limb 1,6,1
offset limb 1,6,-28,-10,-30
delete mesh 1
scale object 1,50,50,50
`Car colors
make_image_memblock(1,1,1,32)
for image=1 to 8
    memblock_dot(1,1,1,rgb(rnd(255),rnd(255),rnd(255)))
    make image from memblock image,1
next image
`Black Tire
memblock_dot(1,1,1,rgb(0,0,0))
make image from memblock 9,1
delete memblock 1
`Speedometer
make_image_memblock(1,256,128,32)
for thickness=0 to 2
    memblock_circle(1,128,128+thickness,128,rgb(255,255,255))
next thickness
for ang=-90 to 90 step 10
    memblock_line(1,int((cos(ang)-sin(ang)*30+129)),int((sin(ang)-cos(ang)*30+129)),int((cos(ang)-sin(ang)*120+129)),int((sin(ang)-cos(ang)*120+129)),rgb(255,255,255))
next ang
make image from memblock 13,1
delete memblock 1
sprite 1,sw-256,sh-152,13
hide sprite 1
`Speedometer needle
make_image_memblock(1,10,120,32)
memblock_circle(1,5,115,5,rgb(255,0,0))
for thickness=-2 to 2
    memblock_line(1,5+thickness,110,5+thickness,1,rgb(255,0,0))
next thickness
make image from memblock 14,1
delete memblock 1
sprite 2,sw-130,sh-24,14
offset sprite 2,0,115
hide sprite 2
`Make enemies
for car=2 to 8
    clone object car,1
next car
for car=1 to 8
    texture object car,car   
    for i=3 to 6
        texture limb car,i,9
    next i
    position object car,cos(car*180)*40+3700,0,car*40+2100
next car
`Make track
obj=9
dim track(30,30)
select track
   case 1
      restore track1
   endcase
   case 2
      restore track2
   endcase
   case 3
      restore track3
   endcase
endselect   
for x=1 to 30
    for z=1 to 30
        read road
        track(x,z)=road
        if road<2
            make object plain obj,200,200,1
            xrotate object obj,90
            position object obj,x*200,-20,z*200
            texture object obj,10+road
        else
            if road=2
                make object box obj,200,50,200
                position object obj,x*200,5,z*200
                texture object obj,12
            else
                make object plain obj,200,200,1
                xrotate object obj,90
                position object obj,x*200,-20,z*200
                texture object obj,15
            endif
        endif
        inc obj
    next z
next x
`Set waypoints for ai and keeping track of place
select track
    case 1
        way(0).x=19
        way(0).z=13
        way(1).x=20
        way(1).z=16
        way(2).x=26
        way(2).z=18
        way(3).x=29
        way(3).z=22
        way(4).x=23
        way(4).z=27
        way(5).x=15
        way(5).z=26
        way(6).x=13
        way(6).z=17
        way(7).x=11
        way(7).z=16
        way(8).x=8
        way(8).z=19
        way(9).x=8
        way(9).z=25
        way(10).x=4
        way(10).z=24
        way(11).x=4
        way(11).z=15
        way(12).x=7
        way(12).z=11
        way(13).x=8
        way(13).z=4
        way(14).x=17
        way(14).z=4
        way(15).x=20
        way(15).z=3
        way(16).x=21
        way(16).z=7
        way(17).x=18
        way(17).z=10
        numways=17
    endcase
    case 2
        way(0).x=19
        way(0).z=15
        way(1).x=23
        way(1).z=16
        way(2).x=25
        way(2).z=6
        way(3).x=23
        way(3).z=3
        way(4).x=10
        way(4).z=3
        way(5).x=6
        way(5).z=10
        way(6).x=3
        way(6).z=13
        way(7).x=5
        way(7).z=18
        way(8).x=4
        way(8).z=23
        way(9).x=6
        way(9).z=26
        way(10).x=11
        way(10).z=25
        way(11).x=15
        way(11).z=28
        way(12).x=26
        way(12).z=27
        way(13).x=27
        way(13).z=22
        way(14).x=17
        way(14).z=21
        way(15).x=14
        way(15).z=10
        way(16).x=18
        way(16).z=9
        numways=16
    endcase
    case 3
        way(0).x=17
        way(0).z=15
        way(1).x=12
        way(1).z=15
        way(2).x=12
        way(2).z=6
        way(3).x=4
        way(3).z=5
        way(4).x=4
        way(4).z=10
        way(5).x=6
        way(5).z=12
        way(6).x=3
        way(6).z=16
        way(7).x=6
        way(7).z=26
        way(8).x=12
        way(8).z=23
        way(9).x=15
        way(9).z=24
        way(10).x=20
        way(10).z=23
        way(11).x=26
        way(11).z=22
        way(12).x=26
        way(12).z=13
        way(13).x=24
        way(13).z=5
        way(14).x=21
        way(14).z=5
        numways=14
    endcase
endselect
`Smooth glide to show off
set text size 100
position camera 0,5000,0
point camera 3000,0,3000
for i=1 to 400
    sync
    txt$="Get Ready!  "
    if i=310
        play music 1
    endif
    if i>=310
       txt$=txt$+str$((400-i)/30+1)
    endif
    ink rgb(0, 0, 160),0
    center text screen width()/2-5,screen height()/2-55,txt$
    ink -1,0
    center text screen width()/2,screen height()/2-50,txt$
    position camera curvevalue(object position x(1),camera position x(),80),curvevalue(1000,camera position y(),80),curvevalue(object position z(1),camera position z(),80)
    rotate camera curveangle(90,camera angle x(),80),curveangle(0,camera angle y(),80),curveangle(0,camera angle z(),80)
next i
`Final bit of setup
rotate camera 90,0,0
set text size 24
show sprite 1
show sprite 2
`Main Loop
repeat
if escapekey()=1
   end
endif
sync
`Display HUD
text 0,0,"Lap: "+str$(car(1).lap+1)
text 0,30,"Place: "+str$(place)+pt(place)
speed$=str$(int(abs(car(1).acc*3)))+" mph"
text sw-text width(speed$),sh-24,speed$
rotate sprite 2,abs(car(1).acc*3)-90
`Control player
oldx#=object position x(1)
oldz#=object position z(1)
`text 0,60,"X: "+str$(int(oldx#/200+0.5))+" Z: "+str$(int(oldz#/200+0.5))
road=track(int(oldx#/200+0.5),int(oldz#/200+0.5))
select road
    case 0
        friction#=.95
    endcase
    case 1
        friction#=.98
    endcase
    case 3
        friction#=1.2
    endcase
endselect
car(1).acc=car(1).acc*friction#+(((upkey()+keystate(17))>0)-((downkey()+keystate(31))>0)*.4)*.7
move object 1,car(1).acc
turn=((rightkey()+keystate(32))>0)-((leftkey()+keystate(30))>0)
yrotate object 1,object angle y(1)+turn*4
rotate limb 1,3,0,turn*10,0
rotate limb 1,4,0,turn*10,0
rotate limb 1,5,0,-turn*10,0
rotate limb 1,6,0,-turn*10,0
newx#=object position x(1)
newz#=object position z(1)
colwith=object collision(1,0)
if colwith>0
   position object 1,oldx#+(newx#-object position x(colwith))*.01,0,oldz#+(newz#-object position z(colwith))*.01
   car(1).acc=car(1).acc*.1
endif
wx=way(car(1).wpt).x*200
wz=way(car(1).wpt).z*200
set vector2 1,object position x(1),object position z(1)
set vector2 2,wx,wz
subtract vector2 2,1,2
dist#=length vector2(2)
if dist#<1000
   car(1).wpt=car(1).wpt+1
   if car(1).wpt>numways
      car(1).wpt=0
      car(1).lap=car(1).lap+1
   endif
endif
position camera object position x(1),1000,object position z(1)
tx=int(object position x(1)/200+0.5)
tz=int(object position z(1)/200+0.5)
if car(1).lap=5 and tx>16 and tx<22 and tz=13
    car(1).finish=1
endif
`Control ai
for ai=2 to 8
    ca#=object angle y(ai)
    wx=way(car(ai).wpt).x*200
    wz=way(car(ai).wpt).z*200
    point object ai,wx,0,wz
    na#=object angle y(ai)
    rotate object ai,0,curveangle(na#,ca#,10),0
    road=track(int(object position x(ai)/200+0.5),int(object position z(ai)/200+0.5))
    select road
        case 0
            friction#=.95
        endcase
        case 1
            friction#=.98
        endcase
        case 3
            friction#=1.2
        endcase
    endselect
    car(ai).acc=car(ai).acc*friction#+rnd(100)/100.0+.1
    oldx#=object position x(ai)
    oldz#=object position z(ai)
    move object ai,car(ai).acc
    newx#=object position x(ai)
    newz#=object position z(ai)   
    colwith=object collision(ai,0)
    if colwith>0
       position object ai,oldx#+(newx#-object position x(colwith))*.01,0,oldz#+(newz#-object position z(colwith))*.01
       car(ai).acc=car(ai).acc*.1
    endif
    set vector2 1,object position x(ai),object position z(ai)
    set vector2 2,wx,wz
    subtract vector2 2,1,2
    dist#=length vector2(2)
    if dist#<150
       car(ai).wpt=car(ai).wpt+1
       if car(ai).wpt>numways
          car(ai).wpt=0
          car(ai).lap=car(ai).lap+1
       endif
    endif
    tx=int(object position x(ai)/200+0.5)
    tz=int(object position z(ai)/200+0.5)
    if car(ai).lap=5 and tx>16 and tx<22 and tz=13
        car(ai).finish=1
    endif
next ai
place=1
for i=2 to 8
    if car(i).lap>car(1).lap or car(i).lap=car(1).lap and car(i).wpt=>car(1).wpt
       inc place
    endif
next i
until car(1).finish=1
`Display final info
delete objects 1,obj-1
delete sprite 1
delete sprite 2
color backdrop 0
set text size 50
cls
place=1
for i=2 to 8
    if car(i).finish=1
        inc place
    endif
next i
center text screen width()/2,screen height()/2-25,"You ranked "+str$(place)+pt(place)
set text size 30
center text screen width()/2,screen height()/2+15,comment(place) 
sync
wait key
end
track1:
data 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2
data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,3,1,1,0,0,0,0,2
data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,2
data 2,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,2
data 2,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,2,2,2,2,2,2,2,0,1,1,0,0,0,2
data 2,0,0,1,1,1,1,1,1,1,1,1,0,0,0,2,2,0,0,0,0,0,0,0,1,1,0,0,0,2
data 2,0,1,1,1,0,0,0,0,0,0,0,0,2,2,2,0,1,1,1,1,1,1,1,1,1,0,0,0,2
data 2,0,1,1,1,0,0,0,0,2,2,2,2,2,2,0,1,1,0,0,1,1,1,1,1,0,0,0,0,2
data 2,0,1,1,0,0,0,0,2,2,2,0,0,0,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,2
data 2,0,1,3,0,0,0,2,2,2,0,0,0,0,2,1,1,0,0,2,2,2,2,2,2,2,2,2,2,2
data 2,0,1,1,0,0,2,2,0,0,0,0,0,0,2,1,1,0,0,0,0,0,0,0,0,0,0,0,2,2
data 2,0,1,1,0,0,2,2,0,0,0,0,0,0,2,0,1,1,1,1,1,0,0,0,0,0,0,0,0,2
data 2,0,0,1,1,0,2,0,0,0,0,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,0,0,0,2
data 2,0,0,1,1,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,1,1,1,1,0,0,0,2
data 2,0,0,1,1,0,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,2
data 2,0,1,1,0,0,2,2,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,0,1,1,0,0,2
data 2,1,1,0,0,0,2,0,0,1,1,1,1,0,0,0,0,2,0,0,0,0,2,0,0,1,1,0,0,2
data 2,1,1,0,0,0,0,0,1,1,1,1,1,1,1,0,0,2,0,0,0,0,2,0,0,1,1,0,0,2
data 2,1,1,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,2,0,0,0,2,0,0,1,1,0,0,2
data 2,0,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,0,2,0,0,0,2,0,1,1,1,0,0,2
data 2,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,0,0,2,0,0,2,0,1,1,3,0,0,2
data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,2,0,2,0,1,1,1,0,0,2
data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,2,2,0,1,1,1,0,0,2
data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,2
data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,2
data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,0,0,2
data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,2
data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,2
data 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
track2:
data 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2
data 2,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,0,2
data 2,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,2
data 2,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,0,0,0,2
data 2,0,0,0,0,0,0,1,1,1,1,0,0,2,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,2
data 2,0,0,0,1,1,1,1,1,1,0,2,2,2,2,2,2,2,2,2,2,0,0,1,1,1,0,0,0,2
data 2,0,0,1,1,1,1,1,0,0,0,2,2,0,0,0,0,0,0,0,2,0,1,1,1,0,0,0,0,2
data 2,0,1,1,1,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,2,0,1,1,1,0,0,0,0,2
data 2,0,1,1,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,2,2,0,1,1,0,0,0,0,2
data 2,0,1,1,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,1,1,0,0,0,2
data 2,1,1,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,1,0,0,2
data 2,1,1,0,0,2,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,2,2,0,0,1,1,0,0,2
data 2,1,1,0,0,2,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,2,2,0,0,1,1,0,2
data 2,1,1,0,0,2,0,0,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,2,0,0,1,3,0,2
data 2,1,1,0,0,2,0,1,1,0,2,2,2,2,0,0,0,0,1,1,1,0,0,2,0,0,1,1,0,2
data 2,1,1,0,0,2,0,1,1,0,0,0,0,0,2,2,0,0,0,1,1,1,0,2,0,0,1,1,0,2
data 2,1,1,1,0,2,0,1,1,1,1,1,1,1,1,0,2,0,0,0,1,1,0,2,0,0,1,1,0,2
data 2,3,1,1,0,2,0,0,1,1,1,1,1,1,1,1,0,2,0,0,1,1,0,2,2,0,1,1,0,2
data 2,1,1,1,0,2,0,0,0,0,0,0,0,0,1,1,1,0,2,0,1,1,0,2,2,0,1,1,0,2
data 2,1,1,1,0,2,2,2,2,2,2,2,2,0,0,1,1,0,2,0,1,1,0,2,2,0,1,1,0,2
data 2,1,1,1,0,2,0,0,0,0,0,0,2,0,0,1,1,0,2,0,1,1,0,2,2,0,1,1,0,2
data 2,0,1,1,0,2,0,0,0,0,0,1,1,1,1,1,1,0,2,0,1,1,0,2,2,0,1,1,0,2
data 2,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,2,0,1,1,0,2,2,0,1,1,0,2
data 2,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,2,0,1,1,0,0,0,0,1,1,0,2
data 2,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,2,2,0,1,1,1,0,0,1,1,1,0,2
data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,1,1,1,1,1,1,0,2
data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,1,1,1,1,0,0,0,2
data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,2
data 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
track3:
data 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2
data 2,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,2
data 2,0,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,2
data 2,0,1,1,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0,2
data 2,0,1,0,1,0,0,0,0,0,1,1,1,0,0,0,0,0,2,0,0,0,0,1,1,1,1,0,0,2
data 2,0,1,1,1,0,0,2,0,0,0,0,0,0,0,2,0,2,0,2,0,2,0,0,1,1,1,0,0,2
data 2,0,1,1,1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,0,0,1,1,1,0,0,2
data 2,0,0,1,1,0,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,0,0,0,1,1,0,0,0,2
data 2,0,0,1,1,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,2,0,0,1,1,0,0,0,0,2
data 2,0,0,1,1,1,1,0,0,1,1,1,0,0,0,0,0,2,0,2,0,0,1,1,0,0,0,0,0,2
data 2,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,2,0,2,0,1,1,0,0,0,0,0,2
data 2,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,0,2,0,2,0,0,1,1,0,0,0,0,0,2
data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,2,0,2,0,1,1,0,0,0,0,0,2
data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,2,0,2,0,0,0,3,0,0,0,0,0,2
data 2,2,2,2,2,2,2,2,2,2,2,2,2,0,1,1,0,0,2,0,2,0,0,1,0,0,0,0,0,2
data 2,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,2,0,0,0,1,0,0,0,0,0,2
data 2,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,2,0,2,0,2,0,0,1,0,0,0,0,0,2
data 2,0,0,0,0,1,1,1,1,1,1,1,1,1,0,2,0,2,0,2,0,0,1,1,0,0,0,0,0,2
data 2,0,0,0,1,1,1,1,0,0,2,0,2,0,2,0,2,0,2,0,0,0,1,1,0,0,0,0,0,2
data 2,0,0,1,1,1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,0,1,0,0,0,0,0,0,2
data 2,0,0,1,1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,0,0,0,0,0,2
data 2,0,0,1,1,0,0,2,0,2,0,2,0,2,0,2,0,0,0,2,0,1,1,1,0,0,0,0,0,2
data 2,0,0,1,1,1,1,1,1,1,1,0,2,0,2,0,0,0,2,0,0,1,1,1,0,0,0,0,0,2
data 2,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,2
data 2,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,2
data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,3,1,1,1,0,0,0,0,0,0,0,2
data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2
data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2
data 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
`function stolen from Hobgoblin Lord (http://forum.thegamecreators.com/?m=forum_view&t=96232&b=6)
function make_midi(file as string,instrument as integer,tempo as integer,notes as string)
SPEED=135
notes=" "+notes
for a = 1 to len(notes)
   watch$=mid$(notes,a)
   if watch$=" "
      start=a:test_note$=""
      repeat
         inc start
         new$=mid$(notes,start)
         if new$<>" "
            test_note$=test_note$+new$
         endif
      until new$=" " or start=len(notes)
    note_on=1
    if len(test_note$)=1
      select lower$(test_note$)
         case "q":SPEED=135:endcase
         case "8":speed=134:endcase
         case "h":speed=140:endcase
         case "r":array insert at bottom master_note():count=array count(master_note())
            master_note(count).note=0:master_note(count).speed=SPEED:master_note(count).volume=0
         endcase
      endselect
      note_on=0
    else
      temp_note$=left$(test_note$,1):temp_octave=val(right$(test_note$,1))
      select lower$(temp_note$)
         case "c":note_base=0:endcase
         case "d":note_base=2:endcase
         case "e":note_base=4:endcase
         case "f":note_base=5:endcase
         case "g":note_base=7:endcase
         case "a":note_base=9:endcase
         case "b":note_base=11:endcase
      endselect
      inc note_base,Temp_octave*12
      if len(test_note$)=3 then inc note_base
    endif
      if note_on=1
        array insert at bottom master_note()
        count=array count(master_note())
        master_note(count).note=note_base
        master_note(count).speed=SPEED
        master_note(count).volume=127
      endif
    endif
   next a
   `figure bytes in the track
   track_total=20+((array count(master_note())+1)*9)
   if file exist("making_bytes.txt")=1 then delete file "making_bytes.txt"
   open to write 1,"making_bytes.txt"
   write long 1,track_total
   close file 1
   open to read 1,"making_bytes.txt"
      read byte 1,track_bytesD
      read byte 1,track_bytesc
      read byte 1,track_bytesB
      read byte 1,track_bytesA
   close file 1
   `create the actual midi file
   file=file+".mid"
   if file exist(file)=1 then delete file file
      open to write 1,file
      `write the header
      write byte 1,77:write byte 1,84:write byte 1,104:write byte 1,100:write byte 1,0:write byte 1,0:write byte 1,0:write byte 1,6
      write byte 1,0:write byte 1,0:write byte 1,0:write byte 1,1
      `write track header
      write byte 1,TEMPO:write byte 1,192 `affects duration
      write byte 1,77:write byte 1,84:write byte 1,114:write byte 1,107
      `number of bytes in the track
      write byte 1,track_bytesa:write byte 1,track_bytesb:write byte 1,track_bytesc:write byte 1,track_bytesd
      `instrument and delta set up
      write byte 1,0:write byte 1,192:write byte 1,INSTRUMENT `instrument
      write byte 1,0:write byte 1,255:write byte 1,89:write byte 1,2:write byte 1,0:write byte 1,0:write byte 1,0:write byte 1,255:write byte 1,81:write byte 1,3:write byte 1,9:write byte 1,39:write byte 1,192:write byte 1,0
      `write the notes
      `turn the note on
      for count = 0 to array count(master_note())
         write byte 1,144:write byte 1,master_note(count).note:write byte 1,master_note(count).volume:write byte 1,master_note(count).speed:write byte 1,64
         `turn it off
         write byte 1,128:write byte 1,master_note(count).note:write byte 1,0:write byte 1,0
      next count
      `write track end
      write byte 1,255,:write byte 1,47,:write byte 1,0,:write byte 1,1
      close file 1
endfunction
function make_image_memblock(memblock,width,height,depth)
make memblock memblock,width*height*depth*4+12
write memblock dword memblock,0,width
write memblock dword memblock,4,height
write memblock dword memblock,8,depth
endfunction
function memblock_dot(memblock,xcoord,ycoord,colour as dword)
width=memblock dword(memblock,0)
write memblock dword memblock,((ycoord-1)*width+xcoord-1)*4+12,colour
endfunction
function memblock_line(memblock,x1,y1,x2,y2,colour as dword)
width=memblock dword(memblock,0)
if abs(x2-x1)>abs(y2-y1)
    m#=(y2-y1+0.0)/(x2-x1+0.0)
    b#=y1-m#*x1
    minx=min(x1,x2)
    maxx=max(x1,x2)
    for ix=minx to maxx
        iy=int(m#*ix+b#+0.5)
        write memblock dword memblock,((iy-1)*width+ix-1)*4+12,colour
    next ix
else
    miny=min(y1,y2)
    maxy=max(y1,y2)
    if x2=x1
       for iy=miny to maxy
           write memblock dword memblock,((iy-1)*width+x1-1)*4+12,colour
       next iy
    else
        m#=(x2-x1+0.0)/(y2-y1+0.0)
        b#=y1-1/m#*x1
        for iy=miny to maxy
            ix=int(m#*(iy-b#)+0.5)
            write memblock dword memblock,((iy-1)*width+ix-1)*4+12,colour
        next ix
    endif
endif
endfunction
function memblock_circle(memblock,centerx,centery,radius,colour as dword)
bx=centerx-radius
py1=centery+sqrt(radius^2-(bx-centerx)^2)
py2=centery-sqrt(radius^2-(bx-centerx)^2)
ex=centerx+radius
width=memblock dword(memblock,0)
size=get memblock size(1)
for x=bx to ex
    y1=centery+sqrt(radius^2-(x-centerx)^2)
    y2=centery-sqrt(radius^2-(x-centerx)^2)
    miny=min(py1,y1)
    maxy=max(py1,y1)
    for y=miny to maxy
        pos=((y-1)*width+x-1)*4+12
        if pos>11 and pos<size
           write memblock dword memblock,pos,colour
        endif
    next y
    miny=min(py2,y2)
    maxy=max(py2,y2)
    for y=miny to maxy
        pos=((y-1)*width+x-1)*4+12
        if pos>11 and pos<size
           write memblock dword memblock,pos,colour
        endif
    next y
    py1=y1
    py2=y2
next x
endfunction
function min(value1#,value2#)
if value1#<value2#
   a#=value1#
else
   a#=value2#
endif
endfunction a#
function max(value1#,value2#)
if value1#>value2#
   a#=value1#
else
   a#=value2#
endif
endfunction a#