Thanks, but the tiles aren't complicated enough to really study. It was your idea which I stole anyway.
I've made some superficial upgrades. You can now use "wasd" to control the car.
Also, I stole some sound code from Hobgoblin Lord.
There are now boost squares (the red and yellow ones)
`The Usual Setup
sync on
sync rate 30
autocam off
hide mouse
randomize timer()
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#