Okay, this will probably be the final version of my shooter. I'm posting it now in case I forget later:
`======= Basic Setup ============================
sync on : sync rate 60
set display mode 1024,768,32,0,4,0
autocam off
hide mouse
randomize timer()
set text font "verdana"
set text size 14
`======= Variable Setup =========================
type WaypointType
PosX as float
PosZ as float
AngX as float
AngY as float
Delay as integer
endtype
type EnemyType
ObjectNo as integer
Killed as boolean
PosX as float
PosZ as float
FallSpeed as integer
TriggerPosX as integer
TriggerPosZ as integer
Raised as integer
TargetHeight as float
Delay as integer
endtype
global objects
objects=10
#Constant TerrainMatrix 1
#Constant GunObject 1
#Constant MuzzleflashObject 2
#Constant MuzzleflashObject2 3
#Constant TerrainTexture 1
#Constant CrosshairsImage 2
#Constant MuzzleflashImage 3
#Constant CrosshairsSprite 1
cameraheight#=20.0
movespeed#=0.4
currentwaypoint=1
findtolerance#=0.5
lives=3
`======= Media Setup ============================
set image colorkey 1,1,1
gosub SetupWaypoints
gosub SetupMap
gosub SetupEnemies
`gun main (chamber)
make object box GunObject,1,1,2
color object GunObject,rgb(80,80,88)
`barrel
temp=FreeObject()
make object cylinder temp,1
scale object temp,100,400,100
xrotate object temp,90
fix object pivot temp
make mesh from object 1,temp
add limb GunObject,1,1
offset limb GunObject,1,0,0,2
color limb GunObject,1,rgb(80,80,88)
delete object temp
delete mesh 1
`handle
make object box temp,0.8,2,1
xrotate object temp,25
fix object pivot temp
make mesh from object 1,temp
add limb GunObject,2,1
offset limb GunObject,2,0,-0.9,-1
color limb GunObject,2,rgb(177,105,46)
delete object temp
delete mesh 1
disable object zdepth GunObject
`Muzzleflash
create bitmap 1,512,256
cls rgb(1,1,1)
for x=1 to 512
for y=1 to 256
prob=abs(y-128)/20 + x/100
if rnd(prob)=1
ink rgb(255,255-rnd(50),0)
dot x,y
endif
next y
next x
get image MuzzleflashImage,1,1,512,256,1
delete bitmap 1
make object plane MuzzleflashObject,6,3
yrotate object MuzzleflashObject,90
fix object pivot MuzzleflashObject
set object ambient MuzzleflashObject,0
texture object MuzzleflashObject,MuzzleflashImage
set object transparency MuzzleflashObject,1
set object emissive MuzzleflashObject,rgb(255,220,0)
make object plane MuzzleflashObject2,6,3
yrotate object MuzzleflashObject2,90
zrotate object MuzzleflashObject2,90
fix object pivot MuzzleflashObject2
set object ambient MuzzleflashObject2,0
texture object MuzzleflashObject2,MuzzleflashImage
set object transparency MuzzleflashObject2,1
set object emissive MuzzleflashObject2,rgb(255,220,0)
`Matrix Textures
create bitmap 1,1000,90
`1
cls rgb(0,120,0)
ink rgb(0,220,0)
for c=1 to 2000
dot rnd(64),rnd(64)
next c
ink rgb(0,180,0)
for c=1 to 2000
dot rnd(64),rnd(64)
next c
`2
ink rgb(40,100,20)
box 65,1,128,64
ink rgb(40,200,20)
for c=1 to 2000
dot rnd(64)+65,rnd(64)
next c
ink rgb(40,160,20)
for c=1 to 2000
dot rnd(64)+65,rnd(64)
next c
`3
ink rgb(80,80,40)
box 129,1,192,64
ink rgb(80,180,40)
for c=1 to 2000
dot rnd(64)+129,rnd(64)
next c
ink rgb(80,140,40)
for c=1 to 2000
dot rnd(64)+129,rnd(64)
next c
get image TerrainTexture,1,1,256,64,0
save image "railtemp.dds",TerrainTexture
load image "railtemp.dds",TerrainTexture
delete file "railtemp.dds"
`Crosshairs
cls rgb(1,1,1)
ink rgb(200,200,200)
line 0,40,80,40
line 40,0,40,80
circle 40,40,20
get image CrosshairsImage,1,1,80,80,1
sprite CrosshairsSprite,0,0,CrosshairsImage
set sprite CrosshairsSprite,1,1
offset sprite CrosshairsSprite,40,40
delete bitmap 1
prepare matrix texture TerrainMatrix,TerrainTexture,4,1
for x=1 to 200
for y=1 to 200
set matrix tile TerrainMatrix,0,0,1
next y
next x
ammo=array count(Enemies(0))*1.2
`================================================
`======= MAIN LOOOOOOOOOOP!!! ===================
`Start off at the first waypoint
camerax#=Waypoints(1).PosX
cameraz#=Waypoints(1).PosZ
cameraangx#=Waypoints(1).AngX
cameraangy#=Waypoints(1).AngY
ink rgb(255,255,255)
do
sprite CrosshairsSprite,mousex(),mousey(),CrosshairsImage
position camera camerax#,cameraheight#+get ground height(TerrainMatrix,camerax#,cameraz#),cameraz#
rotate camera cameraangx#,cameraangy#,0
`Orient gun with screen
set object to camera orientation GunObject
position object GunObject,camerax#,camera position y(),cameraz#
move object GunObject,10
move object right GunObject,4
move object down GunObject,4
yrotate object GunObject,object angle y(GunObject)+(mousex()-screen width()/2)/10
xrotate object GunObject,object angle x(GunObject)+(mousey()-screen height()/2)/10+xangoff#
set object to object orientation MuzzleflashObject,GunObject
position object MuzzleflashObject,object position x(GunObject),object position y(GunObject),object position z(GunObject)
move object MuzzleflashObject,7
set object to object orientation MuzzleflashObject2,GunObject
position object MuzzleflashObject2,object position x(GunObject),object position y(GunObject),object position z(GunObject)
move object MuzzleflashObject2,7
`Recoil control
if xangoff#<0 then inc xangoff#,1
`Muzzleflash
if muzzlealpha>0 then dec muzzlealpha,5
set alpha mapping on MuzzleflashObject,muzzlealpha
set alpha mapping on MuzzleflashObject2,muzzlealpha
`Move
`If we are close to the next waypoint..
if abs(camerax#-Waypoints(currentwaypoint).PosX)<=findtolerance# and abs(cameraz#-Waypoints(currentwaypoint).PosZ)<=findtolerance#
`And we're done delaying..
if delaytimer=0
delaytimer=timer()
else
if timer()-delaytimer>=Waypoints(currentwaypoint).Delay
`And we haven't got to the end yet..
if currentwaypoint<array count(Waypoints(0))
`Target the next waypoint
delaytimer=0
cameraangy#=Waypoints(currentwaypoint).AngY
`cameraangx#=Waypoints(currentwaypoint).AngX
inc currentwaypoint
time#=distance(currentwaypoint,camerax#,cameraz#)/movespeed#
cameraspeedx#=(Waypoints(currentwaypoint).AngX-cameraangx#)/time#
cameraspeedy#=(Waypoints(currentwaypoint).AngY-cameraangy#)/time#
if cameraangx#>270 and Waypoints(currentwaypoint).AngX<90
cameraspeedx#=((Waypoints(currentwaypoint).AngX+180)-(cameraangx#-180))/time#
endif
if cameraangy#>270 and Waypoints(currentwaypoint).AngY<90
cameraspeedy#=((Waypoints(currentwaypoint).AngY+180)-(cameraangy#-180))/time#
endif
if cameraangx#<90 and Waypoints(currentwaypoint).AngX>270
cameraspeedx#=((Waypoints(currentwaypoint).AngX-180)-(cameraangx#+180))/time#
endif
if cameraangy#<90 and Waypoints(currentwaypoint).AngY>270
cameraspeedy#=((Waypoints(currentwaypoint).AngY-180)-(cameraangy#+180))/time#
endif
else
center text screen width()/2,screen height()/2-15,"Level Completed!"
endif
endif
endif
else
`Calculate movement toward next waypoint
inc camerax#,sin(atanfull(Waypoints(currentwaypoint).PosX-camerax#,Waypoints(currentwaypoint).PosZ-cameraz#))*movespeed#
inc cameraz#,cos(atanfull(Waypoints(currentwaypoint).PosX-camerax#,Waypoints(currentwaypoint).PosZ-cameraz#))*movespeed#
`Rotate
cameraangy#=wrapvalue(cameraangy#+cameraspeedy#)
`cameraangx#=wrapvalue(cameraangx#+cameraspeedx#)
endif
`Shoot
if mouseclick()=1 and clicked=0
clicked=1
if ammo>0
pick screen mousex(),mousey(),mapsize*5
xangoff#=-15
muzzlealpha=100
dec ammo
for c=1 to array count(Enemies(0))
if Enemies(c).Killed=0
temp=intersect object(Enemies(c).ObjectNo,camerax#,camera position y(),cameraz#,get pick vector x()+camerax#,get pick vector y()+camera position y(),get pick vector z()+cameraZ#)
if temp>0
Enemies(c).Killed=1
endif
endif
next c
else
noammo=timer()+200
endif
endif
`Update Enemies
for c=1 to array count(Enemies(0))
`Kill
if Enemies(c).Killed=1
move object Enemies(c).ObjectNo,-1
inc Enemies(c).FallSpeed
move object down Enemies(c).ObjectNo,Enemies(c).FallSpeed*0.05
else
point object Enemies(c).ObjectNo,camerax#,camera position y(),cameraz#
`Raise
if Enemies(c).Raised=0
if abs(camerax#-Enemies(c).TriggerPosX)<5 and abs(cameraz#-Enemies(c).TriggerPosZ)<5
Enemies(c).Raised=-timer()
endif
else
if Enemies(c).Raised>0
if object position y(Enemies(c).ObjectNo)<Enemies(c).TargetHeight
move object up Enemies(c).ObjectNo,2
endif
if timer()-Enemies(c).Raised>=2200 and object in screen(Enemies(c).ObjectNo)
cls rgb(255,0,0)
Enemies(c).Killed=1
dec Lives
endif
else
if timer()+Enemies(c).Raised>Enemies(c).Delay
Enemies(c).Raised=timer()
endif
endif
endif
endif
next c
if mouseclick()=0 then clicked=0
temp$=""
for c=1 to Ammo
temp$=temp$+"|"
next c
text 10,10,"Ammo: "+temp$
temp$=""
for c=1 to lives
temp$=temp$+"|"
next c
text 10,30,"Lives: "+temp$
if timer()-noammo<200 then center text screen width()/2,screen height()/2,"NO AMMO"
sync
loop
`======= ==== =============== ===================
`================================================
SetupWaypoints:
read waypointcount
DIM Waypoints(waypointcount) as WaypointType
for c=1 to waypointcount
read Waypoints(c).PosX
read Waypoints(c).PosZ
read Waypoints(c).AngY
read Waypoints(c).AngX
Waypoints(c).AngY=wrapvalue(Waypoints(c).AngY)
Waypoints(c).AngX=wrapvalue(Waypoints(c).AngX)
read Waypoints(c).Delay
next c
return
SetupMap:
read maptiles
mapsize=maptiles*10
make matrix TerrainMatrix,mapsize,mapsize,maptiles,maptiles
for x=1 to maptiles
for z=1 to maptiles
read temp
set matrix height TerrainMatrix,x,z,temp
next z
next x
return
SetupEnemies:
read enemycount
DIM Enemies(enemycount) as EnemyType
for c=1 to enemycount
Enemies(c).ObjectNo=FreeObject()
read Enemies(c).PosX
read Enemies(c).PosZ
read Enemies(c).TriggerPosX
read Enemies(c).TriggerPosZ
read Enemies(c).Delay
make object box Enemies(c).ObjectNo,10,30,5
Enemies(c).TargetHeight=get ground height(TerrainMatrix,Enemies(c).PosX,Enemies(c).PosZ)+15
position object Enemies(c).ObjectNo,Enemies(c).PosX,get ground height(TerrainMatrix,Enemies(c).PosX,Enemies(c).PosZ)+15-50,Enemies(c).PosZ
next c
return
function distance(waypoint,x#,z#)
temp#=SQRT((Waypoints(waypoint).PosX-x#)*(Waypoints(waypoint).PosX-x#)+(Waypoints(waypoint).PosZ-z#)*(Waypoints(waypoint).PosZ-z#))
endfunction temp#
function FreeObject()
temp=objects
repeat
inc temp
until object exist(temp)=0
endfunction temp
`Level data
data 20
data 979.404846191,20.2777328491,-49,0,0
data 883.822143555,96.2560348511,-72.5,0,3600
data 879.359863281,184.003417969,-28,0,0
data 683.226196289,275.361816406,29.5,0,0
data 551.063964844,252.686706543,-28,0,0
data 522.759155273,255.999176025,-78,0,0
data 349.502655029,277.063171387,-23,0,8000
data 308.799468994,282.014282227,0,0,0
data 308.298706055,371.771179199,23,0,0
data 369.83807373,493.201416016,-18,0,0
data 341.259216309,593.693115234,-44.5,0,0
data 316.309509277,626.412963867,-112.5,0,0
data 245.98197937,597.076660156,-134.5,0,0
data 165.750213623,511.296264648,-99.5,0,0
data 92.3321838379,554.863037109,16,0,0
data 216.179107666,777.401306152,53,0,0
data 423.805938721,824.921936035,12,0,0
data 498.935913086,827.347351074,0,0,0
data 525.011352539,817.908752441,147,0,0
data 818.587036133,770.512023926,94.5,0,0
data 100
data 0,0,0.5,1,1,1,1.5,1,0.5,0.5,0.5,1,1,1,1,1,0,0,0,0,0,0,0,1.5,5.5,8.5,9.5,21,26,30.5,37.5,43,36.5,32,23.5,13.5,7,2,0,0,0.5,1,3.5,6,11,20.5,20.5,23,15.5,14.5,8,5.5,7,12,12,9.5,5.5,5,8.5,8,10.5,7.5,6.5,13,13.5,20,10.5,12,8,7,3.5,3,3.5,3.5,3.5,3.5,0.5,0,0,2,3.5,9.5,13.5,18,16,21.5,22.5,34,38.5,41,34,27,11.5,2.5,0,0,0,0,0,0
data 0,0,0.5,1,1,1,1.5,2,1.5,1.5,2,3,2,2,2,1.5,0,0,0,0,0,5,10.5,15,20.5,27,25,37,40,44.5,48,51.5,39,33.5,23.5,13.5,7,2,0,2,3,4.5,6.5,10,13,18.5,15.5,17.5,9.5,10,5,4.5,4,6.5,7,6.5,4,4,8.5,10.5,15.5,14,11,9.5,8,14.5,16,19.5,15.5,13,8,9,7,10,11,12,6.5,4,0,2,3.5,9.5,13.5,18.5,17,24,25,42,47.5,51,46,39,18,7.5,3.5,0,0,0,0,0
data 0,0,0.5,1,1,1,2,2.5,2,2.5,3.5,4,4,4,3.5,2.5,1,0,0,1.5,5,14.5,22,31,39.5,44,39.5,49.5,48,48,50,51.5,39,33.5,23.5,13.5,7,2,0,3,11,14,18.5,14.5,12.5,5.5,1.5,0.5,0.5,1.5,2.5,3,2.5,1.5,0.5,0,0,0,3.5,6,12,14,15.5,13,8,10.5,12.5,20.5,22.5,25.5,18.5,15,11,15,19,21.5,14.5,9.5,2.5,0.5,0.5,3,9,14,14,20,25,43,55,60,58.5,52,30,13,7.5,0.5,4,4,4,0
data 0,0,1.5,2,2,2,3,3,2.5,4.5,7,7.5,7,7,5,2.5,1.5,3,5,10,16.5,28.5,36,43.5,50,51.5,44,51.5,49.5,47,46.5,45,29,21.5,12.5,5,1.5,0.5,1.5,6,13,14.5,15.5,9.5,7,1.5,0,0,0,0,0,0,0,0,0,0,0,0,3.5,5,8.5,10.5,13.5,15,14,9.5,10,12.5,23,29.5,26,23,16,18.5,20.5,26.5,22.5,17,6,2.5,1.5,2,8,13,12,11.5,16,28.5,44,50.5,59,57,41.5,21.5,14.5,4.5,5.5,4.5,4.5,0
data 0.5,1,2.5,4,4,3.5,4,4,3.5,5.5,8,9,9,10,9,8.5,7.5,8.5,13,20,26,41,48.5,52,55.5,55.5,43.5,50.5,45,38,33.5,30,13.5,9,4,0,0,1,2.5,5,11,11,12.5,5.5,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.5,4,8,13,17,16.5,14.5,11.5,19.5,26,27.5,33,29.5,28.5,22.5,26.5,26,21.5,11,5,3.5,3,6,9,8,7.5,10,18,33,43,53.5,58.5,54.5,39,28.5,16.5,15,8.5,7,0
data 0.5,1,2,6.5,6.5,6,6,6.5,4.5,6.5,9.5,10,10,10.5,11,10,10,14.5,24.5,30.5,36.5,51.5,55.5,51,50,47,35,31,23.5,17.5,12.5,10.5,5,4,0.5,0,0,5.5,11,12.5,7,1.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2.5,3.5,7,12,20,21.5,18,16.5,23,24.5,33,28,28.5,18.5,22,24,23.5,17.5,11.5,8,5,3,2.5,2.5,4,3,9,19.5,28,44.5,55.5,61,56,47.5,30,27,15,9,0
data 1,1.5,2.5,7,8,7,7,6.5,5,6.5,9,10,12.5,14,14.5,14,18.5,23.5,32.5,38,44,49,45.5,37.5,35,28.5,19.5,15,9.5,3.5,2,3.5,4,4.5,1.5,1,2,7,11.5,11.5,7,4,3.5,4,7,6,4.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1.5,4,7,16.5,21.5,21.5,19,21.5,28,33.5,32.5,26,19.5,17,24.5,26,27,20.5,14.5,6.5,4,2,1,1,0.5,1,10.5,18,32.5,50.5,62,63,60,46,36,23.5,13,0
data 1,1.5,2.5,7,8,9,8.5,8,7.5,12,13,14.5,16.5,17,16.5,18,23.5,31,40,42,42,41.5,34,21.5,16,11.5,5,2.5,1.5,0,0,4.5,7,8,4.5,5,8.5,13.5,14.5,15,10,7.5,3.5,4,7,6,4.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.5,1,2,2,8,12.5,17,16.5,20,31.5,29.5,27.5,19,23,20.5,22,23,28.5,27,23.5,13,7,3,2,1.5,1.5,1,3,9,20,37.5,57,64.5,71,62,49,29.5,19,0
data 1,1.5,1.5,6,7,8,8,8,9,13.5,14,17,25.5,28,30,34,37,36,39.5,35.5,30.5,27.5,20,9,5.5,4,0.5,0.5,0.5,1.5,2.5,8.5,10.5,11.5,8,12,16.5,17.5,12,14.5,11.5,11.5,3.5,4,7,6,4.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1.5,2.5,5.5,7.5,10.5,13,31.5,29,30,14.5,24.5,25,28,24,27,25,28,24,18.5,10,3.5,2.5,1,1,0,4.5,12.5,27,47,58,69,67,57.5,37.5,26.5,0
data 0.5,1.5,1.5,5,6.5,9,9.5,15.5,17,23.5,24.5,28,31.5,32.5,33.5,36.5,37.5,35.5,36.5,28,21,15,7.5,0.5,0,0,0,0.5,1,2.5,3,11.5,13.5,14,9,13,18.5,19.5,16,20,15,11.5,2.5,2.5,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.5,4,6,9,22.5,22,22.5,11.5,20,24.5,29.5,27,27,26.5,29,29,27.5,18.5,8.5,4,2.5,1,0,1,7,16.5,31,42,57,61.5,55,40.5,29.5,0
data 0.5,1.5,2,3.5,5,7.5,8,16.5,22,30.5,33.5,39.5,40,40.5,38,39,37.5,32,25,17.5,10.5,4.5,0.5,0,0,5,6.5,8,3.5,4,10,19,18.5,14.5,12,20.5,23.5,23.5,21.5,23,20,15.5,12.5,12.5,10.5,5.5,1.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.5,2.5,6,16,15,17,13,18.5,26,33.5,42.5,37,31.5,28,30.5,31,27,17.5,11.5,8.5,6.5,2,0,0,7,16,22.5,39.5,52,51,42,35.5,0
data 0,1,1.5,4,4.5,7.5,8,19,24.5,36,42,48.5,45,43,39,38.5,31.5,25.5,19.5,11.5,3,2,0,0,0,5,6.5,8.5,3.5,4,9,18,18.5,14.5,12.5,17,21.5,24,31,33.5,33,27,25,22,18.5,13,7,2.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6.5,9,11.5,15,20.5,23.5,35.5,33,27,23,25.5,28,25.5,22,16.5,14.5,10.5,5.5,3,1.5,0,8.5,10.5,24,43.5,57,48.5,46.5,0
data 0,1,2,4.5,5,7.5,12.5,23,31,41.5,48,51,47,42.5,37.5,34.5,25.5,18,12,6,0,0,0,0,0,9.5,13.5,15.5,6.5,4,9,13.5,17.5,19.5,22,24.5,25,29,34.5,33,31.5,27,28,28.5,26.5,23,14.5,7.5,2,0,0,0,0,0.5,1,1.5,1,0.5,0,0,0,0,0,0,0,0,0,0,0,0,4,4,5,9.5,12.5,17.5,14.5,22,24,27,30.5,30.5,32,33,28.5,26,24,21.5,15,6.5,4,1.5,1.5,3.5,9.5,31,50,48.5,46.5,0
data 0,1,2.5,5.5,6.5,9,17,28.5,35,46,53,55,43.5,37,29.5,24,13,11.5,8.5,4,0,0,0,0,0,5,8.5,11,7.5,6,4.5,12,19.5,26.5,26.5,22,21.5,22,28.5,33.5,34,31,29,27,25,26,22,16,4.5,0,0,0,5,5.5,6,3,5,4.5,2.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2.5,3.5,5,4,5,8,14,28,31,37,37.5,34,28.5,27,24.5,19,9.5,5.5,2.5,1,1.5,4.5,25,52.5,52.5,51,0
data 0,0,5.5,10.5,11.5,15.5,24,27,32.5,41.5,47,47.5,39,31.5,24,16,7,7,4,1.5,0,0,0,0,2,7,10.5,14.5,17,15,13.5,17,24.5,32.5,29.5,28,23,21,18,18,17.5,16.5,16.5,17.5,18,20.5,19,15,5,0,0,0,6,9,10.5,10,11.5,10.5,5,0.5,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.5,5,10,19.5,25.5,33.5,38.5,37,31.5,30,28.5,23,13.5,6,2.5,1,0,2.5,18.5,52.5,52.5,52.5,0
data 0,2.5,9.5,14.5,15.5,22.5,31.5,31.5,33.5,41.5,44,39.5,32.5,26,20.5,12.5,5.5,5.5,5,1.5,0,0,1,2,6,8,10,13,21.5,21,19,20.5,23.5,23.5,18,18.5,15.5,12,8.5,11,13,12.5,11,8.5,8,10.5,11.5,10,3,0,0,0,6,8.5,9.5,8.5,13.5,15,10.5,3,3.5,4,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,8.5,24.5,28,42.5,33.5,33,21,21.5,20,10.5,4.5,1.5,0.5,1,14.5,52,52,52,0
data 0.5,6.5,17,22.5,26.5,36,42,36,36,41.5,38,32.5,28,23,16.5,10,5,5,4.5,1.5,3,7.5,9.5,11.5,16.5,19,17,19,26,24.5,21,14.5,12.5,11.5,7,9.5,7.5,8,5,3,2,1,0,0,1,2,2.5,1.5,0.5,0,0,0,1,3.5,4.5,9,15.5,18.5,14.5,6.5,5.5,5.5,4.5,1.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,11,16.5,37.5,34.5,36,24.5,26.5,23.5,14,7,2.5,0.5,0.5,7,44.5,44.5,44.5,0
data 2.5,11.5,25,32,38,44,44.5,37,33.5,34.5,31.5,27.5,21.5,19,15,9.5,5.5,5.5,4.5,1.5,3.5,11.5,15.5,21.5,27.5,35.5,30.5,34.5,39.5,40,30.5,24.5,16,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,15,21,19.5,12.5,10,7,6,2.5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5.5,8.5,29,30,34.5,24,30.5,26,20,13.5,8,2.5,1,3.5,42,42,42,0
data 10,24,38,45.5,47,51.5,44,34.5,28.5,27,22.5,17.5,13,10.5,8,4.5,6,8.5,8,7,9,17,20.5,26.5,38.5,48,43.5,46.5,50.5,44,32,25.5,16.5,6.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,12,17.5,16.5,16,15,12,8.5,4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,13,23,25,28.5,28,25,20.5,14.5,8,3.5,3,35.5,33,33,0
data 19.5,33.5,43.5,45,43.5,44,36,29,23.5,20.5,17,12.5,9.5,9.5,8,6.5,10,13.5,13,12,14,24.5,28,33.5,44,53,44,45,45.5,38,26,19.5,11.5,4.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,6,10,10.5,16.5,18.5,19,14,9,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4.5,13.5,27,29,27.5,25.5,28.5,28.5,22,14,9.5,8,35.5,31,29.5,0
data 22.5,34,41.5,40.5,38,35,26.5,20,16,12,9,7.5,7.5,8,8.5,9.5,13.5,18.5,18.5,21,25.5,35.5,35,41,45,50,40,41.5,39,34.5,24,18.5,11,5.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.5,3,10,14.5,21,17,14,6,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4.5,17,33,34,30,24.5,29,31,27.5,19,16,14.5,32.5,25,22,0
data 24.5,32.5,36.5,32,26,20.5,15,12,9.5,5.5,5.5,5.5,5.5,6.5,10,12,13.5,18.5,18,23,25,30.5,29,34,34.5,39,33,34.5,33,32,23.5,20,24.5,19,11,11,11,11,11,11,11,12,12,12,11.5,11.5,11.5,11,11,11,0,0,0,0,0,0,0,0,0.5,4,8,17.5,19,20,10.5,6.5,1.5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4.5,14.5,31.5,33,31,25.5,31,33,33,25.5,20,16,27,19,15.5,0
data 27.5,34,30,23.5,15.5,12,6,5,2.5,0.5,0.5,3,5.5,8.5,12.5,15.5,16.5,20.5,19.5,24,24.5,26.5,23,24,23.5,22.5,19.5,18,15.5,12.5,10,7,16.5,16,11,11,11,11,11,11,11,12,12,12,11.5,11.5,11.5,11,11,11,0,0,0,0,0,0,0,0,0,0,2.5,9,16,20,19,14,7.5,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,15.5,18,18,19,24,28.5,33.5,33,26.5,20,22.5,15,10.5,0
data 25,28,20.5,12,8,5,2,1.5,1.5,0,0,5,7.5,13,22,25.5,23,24.5,21,19.5,19,21,18,19,12.5,9.5,5,4,1,4.5,4.5,4.5,15.5,15.5,11,11,11,11,11,11,11,12,12,12,11.5,11.5,11.5,11,11,11,0,0,0,0,0,0,0,0,0,0,0,3.5,10.5,17,21,17,11.5,4.5,5.5,4.5,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,4,6,7,12.5,17,27,28.5,32,28,20.5,17,12.5,8,0
data 19.5,22.5,13,8.5,7,3.5,0.5,0,0,0,0,7,10,16,27.5,30.5,24,24,19,14.5,14,13.5,10.5,12,5,2.5,2.5,2.5,0,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,10.5,10.5,10.5,0,0,0,0,0,0,0,0,0,0,0,0,6.5,12.5,22.5,20,15,10.5,14.5,13.5,8.5,8.5,8.5,8.5,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0.5,6.5,10.5,24.5,31.5,35.5,34.5,29,19.5,10.5,5.5,0
data 18,21,11.5,8,7,4,6,5.5,5.5,0,0,13.5,16,21.5,31,34,20.5,18,12.5,5.5,2.5,2.5,2.5,2.5,23,23,23,23,23,2.5,2.5,2.5,2.5,2.5,0,0,0,0,0,0,0,0,0,0,0,0,0,10.5,10.5,10.5,0,36.5,36.5,36.5,0,0,0,0,0,0,0,0,3.5,7.5,16.5,16.5,15,14,20.5,18,13,12.5,12.5,12.5,9.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,8.5,19,25.5,30,34.5,32,23,10,6,0
data 23,26,11.5,7.5,7,5,8,7.5,6.5,0,0,11.5,14,19,28,30,18.5,16,11,2,0,0,0,0,22,22,22,22,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10.5,10.5,10.5,0,36.5,36.5,36.5,0,0,41,41,41,0,0,0,2.5,5.5,17,19.5,19,19,26,24,17.5,16,15.5,15.5,10.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.5,3,12.5,19.5,30.5,36.5,37,27,15.5,6,0
data 28,31.5,19.5,11,7.5,10,12.5,12,6.5,0,0,11,12.5,16.5,25,26,15,13.5,9.5,1,0,0,0,0,22.5,22.5,22.5,22.5,22.5,18.5,14.5,9.5,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10.5,10.5,10.5,0,36.5,36.5,36.5,0,0,41,41,41,0,0,0,0,1.5,11.5,15.5,17,19.5,27.5,25,20,18.5,18,17.5,10.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.5,2.5,9.5,14,27.5,35,37.5,29.5,20,8,0
data 27,29,18,9,6,11,10.5,10.5,2.5,0.5,0.5,9.5,11,12.5,15.5,15.5,6.5,5,3.5,0,0,0,0,0,23,23,23,23,23,18.5,14.5,9.5,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10.5,10.5,10.5,0,0,0,0,0,0,41,41,41,0,0,0,0,1,7,11.5,13,23,30,28,22,22,21.5,20.5,10.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.5,5,11.5,23.5,36,40,37.5,30,18.5,0
data 27,29,19,9.5,6,12.5,11,11.5,2,1,1,8,8.5,8.5,8,8,1,0,0,0,0,0,0,0,22.5,22.5,22.5,22.5,22.5,18.5,14.5,9.5,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10.5,10.5,10.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.5,6.5,13,26.5,32,28.5,25.5,29.5,29,24.5,10.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,5,15.5,27.5,33.5,43,40,28.5,0
data 36.5,38.5,24.5,12.5,5.5,8,7,7.5,2,1.5,1.5,1,0.5,0.5,0,0,0,0,0,0,0,0,0,0,22.5,22.5,22.5,22.5,22.5,18.5,14.5,9.5,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10.5,10.5,10.5,10.5,10.5,10.5,10.5,10.5,10.5,0,0,0,0,0,0,0,0,0,4,16.5,30,32.5,27.5,26.5,30.5,30,21.5,6.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.5,2,11.5,24.5,37.5,46.5,45.5,35.5,0
data 34,38.5,28.5,19,10,11.5,8,8.5,4.5,3.5,2,1,0.5,0.5,0,0,0,0,0,0,0,0,0,0,22,22,22,22,22,18.5,14.5,9.5,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10.5,10.5,10.5,10.5,10.5,10.5,10.5,10.5,10.5,0,0,0,0,0,0,0,0,0,3.5,17,32.5,32,28,28,31,30,20,2.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.5,1.5,6,19.5,32,41.5,39.5,36,0
data 31.5,34.5,23.5,18,10,10.5,8.5,8.5,4.5,3.5,2,1,0.5,0.5,0,0,0,0,0,0,0,0,0,0,21.5,21.5,21.5,21.5,21.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10.5,10.5,10.5,10.5,10.5,10.5,10.5,10.5,10.5,0,0,0,0,0,0,0,0,0,1,17,31,32,30,29,29,28,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,15.5,30,40,36,34.5,0
data 37.5,40.5,29,18,10,11,9,7.5,4,3,1.5,0.5,0,0,0,0,0,0,0,0,0,0,0,0,21.5,21.5,21.5,21.5,21.5,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,0,0,0,0,0,0,0,0,3.5,18.5,29.5,29.5,29.5,29.5,29.5,26,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,7.5,22,30,27.5,24.5,0
data 36.5,40,29.5,16.5,12,14.5,12,6.5,3.5,2.5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,21.5,21.5,21.5,21.5,21.5,0,0,0,0,0,0,1,1,1.5,2,2,1,1,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,7,22.5,34,34.5,34.5,34.5,33.5,27.5,12,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.5,4,16,17.5,17.5,14.5,0
data 29.5,33,26.5,14,14.5,16.5,13.5,6.5,3,2,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,21,21,21,21,21,0,0,0,0,0,0,1,1,1.5,2,2.5,1.5,2.5,2,1.5,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.5,9,25.5,36,37.5,37.5,37.5,36,28.5,12,1.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2.5,2.5,4,2.5,0
data 27,28.5,25,11.5,14,15.5,14,3.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,20,20,20,0,0,0,2,2.5,2.5,3.5,3.5,2,2,2.5,1.5,2.5,2.5,2,1.5,1.5,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.5,4,12,27.5,38,40,40,39.5,36,28,12.5,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.5,1.5,0
data 26,27.5,27,11,12.5,13.5,12,2.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.5,19.5,19.5,19.5,19.5,7,13,13,15,15.5,8.5,4,4,2.5,2.5,3,1.5,2.5,2.5,2,1.5,1.5,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.5,7.5,15.5,28,37.5,40,40,38.5,32.5,24.5,12,2.5,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
data 25.5,28,29,14,12.5,10,7.5,0,0,0,0,0,3,4.5,4.5,4.5,4.5,1.5,0,0,0,0,0,0,18.5,18.5,18.5,18.5,18.5,7,13,14.5,18,19,12,6.5,5.5,3.5,3,4,3.5,4,3,3.5,2.5,2.5,1.5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,10.5,20,30.5,37.5,40,38,36,29.5,20,9.5,2.5,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
data 33,35,34.5,17.5,12,8,6,0,0,0,0,0,5,6.5,6.5,6.5,6.5,1.5,0,0,0,0,0,0,18,18,18,18,18,7,13,14.5,21.5,24.5,25,19.5,18.5,14.5,11.5,5,4.5,5.5,3,6.5,5.5,5.5,4,3.5,0,0,0,0,0,0,0,0,0,0,0,1.5,3,4,8.5,10.5,18,28.5,33,37.5,39,34.5,32.5,25,14.5,8.5,2.5,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
data 32,35.5,34,19,11.5,7,3.5,0,0,0,0.5,2.5,7.5,9,9,8.5,6.5,1.5,0,0,0,0,0,0,17,17,17,17,17,7,13,14.5,23.5,27,28.5,26,26,20.5,18.5,10.5,7,6,3,9,11,11,10.5,10,2.5,0,0,0,0,0,0,0,0,0,0.5,2.5,4,6,11.5,15,23,30.5,33.5,38,38.5,33,29.5,21.5,13.5,8.5,2.5,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
data 34.5,37.5,31.5,16.5,10,4.5,1.5,0,0,0,3,6,11.5,13.5,15.5,12.5,9.5,4,2,0,0,0,0,0,16.5,16.5,16.5,16.5,16.5,7,13,14.5,21.5,24.5,26,23.5,25,21.5,20,12,8.5,6,2.5,8.5,10.5,10.5,10,10,2.5,0,0,0,0,0,0,0,0,1,2.5,4.5,8,12,20,25,31,35,37.5,37.5,35.5,27.5,22.5,15.5,10,5.5,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
data 31,33.5,25,13,8.5,3.5,1,0,0,2,7,10,15.5,17.5,17.5,12.5,9.5,4,2,0,0,0,0,0,17,17,17,17,17,0,0,1.5,8.5,11.5,20,23,29.5,32,34,26.5,23.5,14.5,5,7.5,9.5,9.5,10.5,10.5,3,0.5,0.5,1,1.5,4.5,5.5,5.5,7,8,8.5,11.5,15.5,22,32,35.5,41,43.5,43.5,39,32.5,22.5,17.5,11,7,3.5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,36,36,36,36,36,0,0,0
data 24,25.5,15,9,6.5,2.5,1,0,0,6,11,14,16.5,17,13,8,5,2.5,2,0,0,0,0,0,16.5,16.5,16.5,16.5,16.5,0,0,0,5.5,8,16.5,19.5,27,31.5,39,33.5,31.5,23,13,9.5,9.5,10,14,15.5,10,8,8.5,9,9,11,14,14,16,18.5,22.5,25,27,32,41.5,43.5,45,43.5,41.5,36,27,16.5,12,7.5,4,2,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,36,36,36,36,36,0,0,0
data 15.5,17,6,4.5,4,1.5,0,0,1.5,10.5,15.5,18.5,19,18,11,6,3,2.5,2,0,0,0,0,0,15,15,15,15,15,0,0,0,2,2.5,3.5,6.5,14,20,31.5,35,36,29,21,13,11.5,13.5,24.5,29,29.5,30.5,33,34,33,29.5,33,32,31.5,33.5,37,36.5,38.5,40,47,47.5,45,43.5,39.5,31,21.5,11,7.5,5.5,2,1.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,36,36,36,36,36,0,0,0
data 16,16,3,1.5,1,0,0,0,1.5,14,18.5,19.5,20,19,8.5,4,3,2.5,2,0,0,0,0,0,12,12,12,12,12,0,0,0,0,0,0,0,6.5,14,26.5,31,36.5,32.5,25,12.5,8.5,13,23,27.5,33,37.5,40,45,42,39.5,45.5,46,46,49,50,49,49,48,50.5,49,45,40,34.5,24.5,15,6.5,3.5,2,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,36,36,36,36,36,0,0,0
data 18.5,19,2.5,2,1.5,0,0,1.5,7,19.5,21.5,21.5,20,14.5,2,0,0,0,0,0,0,0,0,0,8.5,8.5,8.5,8.5,8.5,0,0,0,0,0,0,0,5,12.5,25,31,37.5,36.5,36,26,20.5,24,31.5,29,32,36.5,43.5,51,50.5,51,63,64.5,65.5,65.5,65.5,60.5,56,48,47,44.5,38,31,26.5,18,9.5,3.5,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,36,36,36,36,36,0,0,0
data 27,24,4,3.5,3,1,0,4,11,21.5,21.5,21.5,17.5,10.5,0,0,0,0,0,0,0,0,0,0,6,6,6,6,6,0,0,0,0,0,0,0,0,1.5,10.5,16,22.5,28,33,27.5,22.5,26,32,28.5,30.5,35,42,50.5,53.5,54,66,67.5,68.5,68.5,67,59.5,55,46,44,40,33,26.5,22.5,14,6.5,1.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,36,36,36,36,36,0,0,0
data 25.5,22,6,4.5,3,1,0,6,15.5,22,22,22,16,6.5,0,0,0,0,0,0,0,0,0,0,2.5,2.5,2.5,2.5,2.5,0,0,0,0,0,0,0,0,0,4,7,12.5,18,24.5,24,23,33.5,39.5,36,37,40,41,49.5,52.5,54,66,67.5,68.5,67.5,65,57.5,51,40,35.5,30,24,18.5,14.5,8,2.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,36,36,36,36,36,0,0,0
data 20.5,19,12.5,10,4,2,0,7.5,15.5,19,19,19,11.5,3.5,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,3.5,6,9.5,18.5,20.5,20.5,37,45,39,39.5,42.5,40.5,48.5,51,49.5,60.5,62,61.5,60.5,59,50.5,43.5,30,23.5,19.5,13.5,8,5.5,2.5,0.5,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,36,36,36,0,0,0
data 19,19.5,18,12.5,4,2,1,7.5,15.5,15.5,15.5,15.5,8,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,1.5,2.5,4,13.5,18,18,36.5,46,38,36,38.5,34,39.5,42.5,43,52,53.5,52.5,50,45,37,32,20,14,11,7,5,3,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,36,36,36,0,0,0
data 22.5,24,27.5,23,10,5,2.5,6,10,10,10,10,4,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,-1.5,0.5,3,5.5,22,28,28,24.5,23,15,18,18.5,24.5,33,35.5,37,35,30.5,25.5,20.5,12,8.5,6,3.5,1.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,34,34,34,36,36,36,0,0,0
data 21,18,23,23,16,11,5.5,6.5,8,9,7.5,7,2.5,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,-1.5,0.5,1.5,4,18.5,22.5,23,20,17.5,7.5,7.5,9.5,14.5,20.5,21.5,22.5,19.5,17.5,13,10,4,3,2,0.5,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,34,34,34,34,34,34,34,0,0,0
data 26,11,17.5,33.5,29.5,28,19,18,13.5,5,3.5,3,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,0,-1.5,0.5,1.5,0,11.5,16,17.5,15.5,17,5.5,3.5,2,3,3,3,3,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0
data 33,21.5,25.5,37,28.5,30,22,30,31,22.5,13,6.5,2.5,0.5,0.5,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,-1.5,-2,-1.5,-6.5,3,10.5,15.5,14,19,9.5,3.5,-1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 33,24.5,28,38.5,30.5,34.5,28.5,33,34,25.5,17,9.5,8,6.5,4.5,7,8,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1.5,-2.5,-2.5,-6.5,2.5,7,14.5,14.5,18.5,9.5,6.5,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 24,28.5,30.5,29.5,20.5,21,17,22.5,27,33,25.5,19,16,18.5,15.5,14,10.5,10.5,4.5,1.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.5,-1,-6,4,7,13.5,15,20,10,7,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 10.5,16,17,20.5,21.5,21,13.5,10.5,12,17.5,23,24.5,31.5,36,31.5,27,18,18,13,10.5,6,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,3,7.5,16.5,18,23,15,10.5,1.5,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 9.5,15.5,13.5,14.5,13.5,11,4,4.5,13,19,26.5,28.5,32.5,35,35.5,28,18,10,13.5,22.5,19,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2.5,2.5,7,16,19,21.5,16.5,12,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 9.5,17.5,14,13.5,12,8,1,1.5,10,11,17.5,18.5,24.5,23,24.5,21,15.5,7.5,11,21,20.5,13.5,3.5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,8.5,10,19.5,25,22,17.5,16,6.5,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 22.5,30.5,16,14,11,8,0,0,6,7.5,9,8,6.5,5,8,8,8,0,2.5,12,14.5,13,3.5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,6,9.5,18,26.5,30.5,27.5,24,17.5,9,2,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 23.5,30.5,17,15.5,8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.5,2.5,2.5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3.5,6.5,13,21,26,27.5,24.5,20.5,12.5,4.5,2.5,2.5,0,0,0,0,0,41.5,41.5,41.5,41.5,41.5,41.5,41.5,0,0,41.5,41.5,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
data 22,24,11,9.5,2,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,0,0,0,0,0,0,0,0,0,0,3,3.5,7,12.5,21,27.5,29.5,31,29,20.5,11,8.5,3.5,0,0,0,0,0,41.5,41.5,41.5,41.5,41.5,41.5,41.5,0,0,41.5,41.5,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
data 21,21.5,9,7.5,0.5,0.5,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,0,0,0,0,0,0,0,0,0,0,3,3.5,7,13,20.5,27,29,33.5,31,23.5,14,11.5,3.5,0,0,0,0,0,41.5,41.5,41.5,41.5,41.5,41.5,41.5,0,0,41.5,41.5,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
data 20.5,20.5,8.5,7,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5.5,12,17.5,26,29,33,30,24.5,16,13,3.5,0,0,0,0,0,41.5,41.5,41.5,41.5,41.5,41.5,41.5,0,0,41.5,41.5,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
data 19,19,17.5,5.5,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4.5,15.5,18,20.5,26,31.5,22,19.5,17,11.5,1.5,0,0,0,0,0,41.5,41.5,41.5,41.5,41.5,41.5,41.5,42,42,42,41.5,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
data 13.5,13.5,12,0,0,0,0,0,0,0,0,0,0,34,34,34,34,34,34,34,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,5.5,16.5,18.5,24,29,33.5,23.5,21.5,16,11,1,0,0,0,0,0,41.5,41.5,41.5,41.5,41.5,41.5,41.5,42,42,42,41.5,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
data 13.5,13.5,12,0,0,0,0,0,0,0,0,0,0,34,34,34,45,45,45,34,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.5,8,18.5,19.5,25.5,27.5,27,16.5,15.5,9.5,5,0,0,0,0,0,0,41.5,41.5,41.5,41.5,41.5,41.5,41.5,42,42,42,41.5,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
data 13.5,15,13.5,1.5,0,0,0,0,0,0,0,0,0,34,34,34,45,45,45,34,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,3,9,18,21,28.5,30,26,17,14,6.5,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 21.5,24.5,19.5,3.5,0.5,0,0,0,0,0,0,0,0,34,34,34,45,45,45,34,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,3.5,8.5,15.5,21,28.5,29,24.5,17.5,12,4.5,0.5,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 14.5,17.5,13,4,2,1,2,3,3,3.5,3,3,1.5,34,34,34,34,34,34,34,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,4.5,10.5,13.5,19.5,27,24,18,15,9,1.5,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 23.5,26.5,19.5,6,6.5,3.5,5.5,6,7.5,7,4.5,3,1.5,34,34,34,34,34,34,34,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.5,8,16.5,21.5,28,31,23.5,15,10,3.5,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 23,26.5,22.5,14,15,8.5,7,7.5,6,7.5,4,5.5,1.5,34,34,34,34,34,34,34,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.5,6,15.5,20.5,27,28,22.5,13,8,1.5,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 24.5,29.5,24,18.5,17,8,5,4.5,4,8,5,5.5,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,0,0,0,0,1.5,7.5,17,22,26,24.5,18.5,9,4,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 20.5,30.5,30,26.5,17.5,5.5,1.5,1.5,-0.5,4.5,3.5,5.5,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,0,0,0,6,10.5,18.5,27,32,27,22.5,14.5,6,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 17.5,34.5,35.5,27,10,0.5,0,0,1,4,4,3,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,0,0,1,8.5,14.5,21.5,28.5,31,24,18,11,4,0.5,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 17.5,34.5,36.5,24,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.5,1.5,1.5,0,0,0,0,0,0,0,0,0,1,2.5,5,14,19.5,22.5,24,22,13,7.5,3.5,0.5,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 21,40,38,21.5,2.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4.5,4.5,1.5,0,0,0,0,0,0,0,0.5,6.5,9.5,13.5,22.5,27.5,25,23,19,10,4.5,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 25.5,38,31,13.5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5.5,10.5,9,6.5,3,2.5,2.5,1,0,4,5.5,16,21,25,30,33,25,20,16,7,2.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,0,0,0,0,0,0,0,0,0,0,0,0,0,41.5,41.5,41.5,41.5,41.5,0,0,0,0,0,0,0,0,0,0,0,0
data 23,34,26.5,14,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.5,4,9,11,11.5,8,6.5,3.5,2,0,4,8,19,24,28,27,41.5,30.5,25.5,25,22,20.5,21.5,21.5,21.5,20.5,20.5,20.5,21.5,21.5,21.5,21,21,21,21,21,21,41,41,41,41,41,0,0,0,0,0,0,0,0,0,0,0,0,0,41.5,41.5,41.5,41.5,41.5,23.5,23.5,23.5,23,23,23,23,23,23,22,22,0
data 21,27.5,16.5,9.5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,6,11,15,16,14,9,4,10.5,16.5,22,33,37,30.5,26,37.5,26.5,21.5,22,20.5,20.5,21.5,21.5,21.5,20.5,20.5,20.5,21.5,21.5,21.5,21,21,21,21,21,21,41,41,41,41,41,0,0,0,0,0,0,0,0,0,0,0,0,0,41.5,41.5,41.5,41.5,41.5,23.5,23.5,23.5,23,23,23,23,23,23,22,22,0
data 19,27.5,21.5,11.5,3,1,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,3.5,9,16,16,15.5,19.5,29,36,42,47,39.5,28,21,32,22,18.5,20.5,20.5,20.5,21.5,21.5,21.5,20.5,20.5,20.5,21.5,21.5,21.5,21,21,21,21,21,21,41,41,41,41,41,0,0,0,0,0,0,0,0,0,0,0,0,0,41.5,41.5,41.5,41.5,41.5,23.5,23.5,23.5,23,23,23,23,23,23,22,22,0
data 23.5,33,32,14,4.5,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.5,6,21,26,27.5,23.5,29,36,41.5,41.5,32.5,19.5,12.5,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,41,0,0,0,0,0,0,0,0,0,0,0,0,0,41.5,41.5,41.5,41.5,41.5,0,0,0,0,0,0,0,0,0,0,0,0
data 17.5,26,30.5,13,13,8.5,8.5,5.5,5.5,4.5,4.5,4.5,5.5,4.5,4.5,4.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,16.5,28,31,28.5,29,32,36.5,32,21,8,5,0.5,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,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
data 10,18,27,17,17.5,8.5,8.5,5.5,5.5,4.5,4.5,4.5,5.5,4.5,4.5,4.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2.5,15.5,32.5,36,34,29,32,34,29,18,5,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,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
data 6,20.5,30,28.5,22.5,12.5,8.5,5.5,5.5,4.5,4.5,4.5,5.5,4.5,4.5,4.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.5,7.5,27,31.5,34.5,18.5,19.5,20,15,5,1.5,0.5,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,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
data 11,25,33.5,31,19,10.5,4,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,7,25.5,27,20,1.5,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,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,0,0,0,0,0,0
data 16,29,30.5,29,18.5,14.5,4.5,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.5,7,23,25.5,19.5,3.5,0.5,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,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,0,0,0,0,0
data 12.5,18.5,20,18.5,15,11.5,4.5,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,11,27.5,29,29,29,18,1.5,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,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,0,0,0,0
data 8.5,15.5,18.5,17,10.5,5,0.5,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,11,27.5,29,29,29,18,1.5,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,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,0,0,0,0
data 7,12.5,18,12,6.5,1,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,11,27.5,29,29,29,18,1.5,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,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,0,0,0,0
data 8.5,13.5,12.5,6,1,0,0,0,0,0,5.5,5.5,5.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,27.5,29,29,29,18,1.5,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,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,0,0,0,0
data 18.5,20,9.5,1.5,0,0,0,0,4.5,7.5,16,11.5,8.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,27.5,29,29,29,18,1.5,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,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,0,0,0,0
data 14.5,14.5,4,0,0,0,0,3.5,10.5,16,21.5,14.5,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.5,4,7.5,7,11,19,30,27.5,16,4,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,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,0,0,0,0
data 11.5,11.5,3,0,0,0,0.5,9,16,28.5,25,18,5,0,2,5.5,5.5,3.5,0,0,0,0,0,0,0,0,0,3,6.5,6.5,5.5,9.5,13,14.5,17.5,29,36,31,16,5.5,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,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,0,0,0,0
data 0,0,0,0,0,1,7.5,16,20,24.5,22.5,17.5,6.5,0,2.5,8.5,11,9.5,5,6,5.5,4,0.5,0,0,0,1.5,11,17,23.5,19.5,24,22.5,24.5,25.5,37.5,43,41,24,11,1.5,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,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,0,0,0
data 0,0,0,0,2.5,6.5,13,20,18.5,20.5,18,19.5,11,9.5,11.5,21.5,20,18.5,12.5,12,8.5,6,6.5,6,6,5.5,11.5,22.5,26.5,29,23,25.5,24,25.5,24.5,35,36.5,35,19.5,10,2.5,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,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,0,0,0
data 0,0,0,0,11.5,15.5,21.5,20.5,22,19,18.5,17,14,9.5,9.5,16,15,16.5,16.5,19.5,18,17,18,18,15.5,11,14.5,22,22,23.5,20,24.5,23,23,18.5,22,22.5,23.5,15,7.5,2.5,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,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,0,0,0
data 0,0,0,0,11.5,14.5,14.5,13.5,13.5,15.5,10.5,11.5,9.5,9.5,9,13,9.5,10.5,11.5,13.5,12.5,13,17.5,18,15.5,11,13,14,11.5,6.5,6,10,12.5,12,7,8,7.5,7,3.5,1,1,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,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,0,0,0
data 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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 20
data 652.818603516,127.62336731,886.442077637,93.8065414429,0
data 701.302856445,60.1504554749,888.545776367,92.1973342896,1000
data 727.378479004,217.510528564,887.766723633,93.0390853882,1500
data 720.602294922,162.103683472,888.257751465,93.0585021973,2000
data 772.95501709,322.116027832,855.384399414,195.611343384,0
data 555.351745605,502.659912109,656.605529785,272.158203125,0
data 544.091064453,305.63470459,573.514648438,258.233306885,0
data 229.152069092,450.426361084,356.586029053,273.939605713,0
data 293.673461914,510.156341553,362.450744629,273.681213379,2000
data 191.553955078,588.027709961,360.59753418,273.946594238,3000
data 272.077087402,444.820037842,355.782775879,276.342315674,4500
data 291.803894043,462.947387695,356.315948486,275.276000977,6000
data 84.0458374023,484.882476807,239.464660645,590.658935547,0
data 666.872436523,540.072631836,676.795898438,275.788635254,0
data 330.456970215,893.265258789,169.508117676,694.465759277,0
data 358.5496521,886.873291016,172.324493408,702.044433594,0
data 358.415283203,911.184265137,179.547698975,714.323364258,0
data 607.806335449,704.950134277,525.992980957,817.463867188,0
data 699.457214355,736.278198242,571.587280273,809.273193359,0
data 827.184265137,695.248168945,553.131652832,812.39465332,0
Editor:
`======= Basic Setup ============================
sync on : sync rate 60
set display mode 1024,769,32,0,4,0
autocam off
randomize timer()
color backdrop rgb(140,140,140)
set text opaque
`======= Variable Setup =========================
type WaypointType
PosX as float
PosZ as float
AngX as float
AngY as float
Delay as integer
`Editor only
ObjectNo as integer
endtype
type EnemyType
ObjectNo as integer
TriggerObject as integer
Killed as boolean
PosX as float
PosZ as float
FallSpeed as integer
TriggerPosX as float
TriggerPosZ as float
Delay as integer
endtype
#Constant TerrainMatrix 1
#Constant TerrainTexture 1
#Constant BlueImage 2
#Constant GreenImage 3
#Constant RedImage 4
#Constant PickObject 1
#Constant WaypointObject 2
cameraheight#=20.0
movespeed#=0.5
currentwaypoint=0
findtolerance#=3.0
camtargetx=600
camtargetz=400
camanglex=90
camspeed=4
camtolerance=5
brushsize=2
mapsize=1000
DIM Waypoints(0) as WaypointType
DIM Enemies(0) as EnemyType
DIM MatrixHeights(mapsize/10,mapsize/10) as float
`======= Media Setup ============================
set image colorkey 1,1,1
`Ground
make matrix TerrainMatrix,mapsize,mapsize,mapsize/10,mapsize/10
`Textures (low green,high red,high blue)
create bitmap 1,1000,70
`1
cls rgb(0,120,0)
ink rgb(0,220,0)
for c=1 to 2000
dot rnd(64),rnd(64)
next c
ink rgb(0,180,0)
for c=1 to 2000
dot rnd(64),rnd(64)
next c
`2
ink rgb(40,100,20)
box 65,1,128,64
ink rgb(40,200,20)
for c=1 to 2000
dot rnd(64)+65,rnd(64)
next c
ink rgb(40,160,20)
for c=1 to 2000
dot rnd(64)+65,rnd(64)
next c
`3
ink rgb(80,80,40)
box 129,1,192,64
ink rgb(80,180,40)
for c=1 to 2000
dot rnd(64)+129,rnd(64)
next c
ink rgb(80,140,40)
for c=1 to 2000
dot rnd(64)+129,rnd(64)
next c
`Select
ink rgb(128,50,50)
box 193,1,256,64
ink rgb(0,0,0),0
LineBox(1,1,64,63)
LineBox(65,1,129,63)
LineBox(130,1,193,63)
LineBox(194,1,257,63)
get image TerrainTexture,1,1,256,64,0
save image "railtemp.dds",TerrainTexture
load image "railtemp.dds",TerrainTexture
delete file "railtemp.dds"
`Colors
cls rgb(255,0,0)
get image RedImage,1,1,4,4
cls rgb(0,255,0)
get image GreenImage,1,1,4,4
cls rgb(0,0,255)
get image BlueImage,1,1,4,4
delete bitmap 1
prepare matrix texture TerrainMatrix,TerrainTexture,4,1
for x=1 to 200
for y=1 to 200
set matrix tile TerrainMatrix,0,0,1
next y
next x
`Pick object
make object plane PickObject,mapsize,mapsize
position object PickObject,mapsize/2,-1,mapsize/2
xrotate object PickObject,90
set alpha mapping on PickObject,0
`Waypoint object
make object sphere WaypointObject,10
temp=FreeObject()
make object box temp,2,20,2
make mesh from object 1,temp
delete object temp
add limb WaypointObject,1,1
offset limb WaypointObject,1,0,10,0
delete mesh 1
xrotate object WaypointObject,90
fix object pivot WaypointObject
exclude object on WaypointObject
`================================================
`======= MAIN LOOOOOOOOOOP!!! ===================
ink rgb(0,0,0),rgb(140,140,140)
clear entry buffer
do
gosub CameraControl
`Enemies
if editmode=3
text 10,10,"Current mode: Enemy Placement"
text 10,25,"(Press tab to change)"
text 10,50,"Click and drag to place an enemy and a spawn marker for it."
text 10,65,"Right-click to delete an enemy"
text 10,95,"Type to set enemy delay time (how long the enemy will wait after the player reaches its trigger) - "+str$(Enemies(curen).Delay)
`Typing
if timer()-typedelay>2000 and val(entry$(1))<>0 then temp$="" : typedelay=timer()
temp$=temp$+entry$(1)
clear entry buffer
Enemies(curen).Delay=val(temp$)
temp$=str$(Enemies(curen).Delay)
if mouseclick()=1
if clicked=0
clicked=1
obj=pick object(mousex(),mousey(),PickObject,PickObject)
if obj>0
array insert at bottom Enemies(0)
curen=array count(Enemies(0))
Enemies(curen).ObjectNo=FreeObject()
Enemies(curen).PosX=get pick vector x()+camera position x()
Enemies(curen).PosZ=get pick vector z()+camera position z()
make object box Enemies(curen).ObjectNo,10,30,5
position object Enemies(curen).ObjectNo,Enemies(curen).PosX,get ground height(TerrainMatrix,Enemies(curen).PosX,Enemies(curen).PosZ)+15,Enemies(curen).PosZ
endif
else
ink rgb(100,100,200)
line object screen x(Enemies(curen).ObjectNo),object screen y(Enemies(curen).ObjectNo),mousex(),mousey()
ink rgb(0,0,0),rgb(140,140,140)
endif
endif
if mouseclick()=0
if curen>0
obj=pick object(mousex(),mousey(),PickObject,PickObject)
if obj>0
Enemies(curen).TriggerObject=FreeObject()
Enemies(curen).TriggerPosX=get pick vector x()+camera position x()
Enemies(curen).TriggerPosZ=get pick vector z()+camera position z()
make object cone Enemies(curen).TriggerObject,12
position object Enemies(curen).TriggerObject,Enemies(curen).TriggerPosX,get ground height(TerrainMatrix,Enemies(curen).TriggerPosX,Enemies(curen).TriggerPosZ)+6,Enemies(curen).TriggerPosZ
else
delete object Enemies(curen).ObjectNo
array delete element Enemies(0),curen
endif
curen=0
endif
endif
if mouseclick()=2 and clicked=0
clicked=1
obj=pick object(mousex(),mousey(),1,10000)
if obj>0
for c=1 to array count(Enemies(0))
if Enemies(c).ObjectNo=obj
delete object Enemies(c).ObjectNo
delete object Enemies(c).TriggerObject
array delete element Enemies(0),c
exit
endif
next c
endif
endif
if keystate(15) and pressed=0
pressed=1
editmode=0
temp$=""
endif
endif
`Terrain
if editmode=2
text 10,10,"Current mode: Terrain Editing"
text 10,25,"(Press tab to change)"
text 10,50,"Left-click to raise terrain"
text 10,65,"Right-click to lower terrain"
text 10,80,"Delete to set height to 0"
text 10,95,"[ and ] to change brush size"
text 20,110,"Brush size: "+str$(brushsize)
obj=pick object(mousex(),mousey(),PickObject,PickObject)
`1. Reset old selection
for d=-brushsize/2 to brushsize/2-1
for e=-brushsize/2 to brushsize/2-1
if xtile+d<mapsize/10 and xtile+d>-1 and ztile+e<mapsize/10 and ztile+e>-1
if int(MatrixHeights(xtile+d,ztile+e)/30)+1<=3
set matrix tile TerrainMatrix,xtile+d,ztile+e,int(MatrixHeights(xtile+d,ztile+e)/30)+1
else
set matrix tile TerrainMatrix,xtile+d,ztile+e,3
endif
endif
next e
next d
`Change brushsize with [ and ]
if keystate(26) and pressed=0 and brushsize>2 then dec brushsize,2 : pressed=1
if keystate(27) and pressed=0 then inc brushsize,2 : pressed=1
if obj>0
xtile=int((get pick vector x()+camera position x())/10)
ztile=int((get pick vector z()+camera position z())/10)
`Raise terrain
if mouseclick()=1
for d=-brushsize/2 to brushsize/2
for e=-brushsize/2 to brushsize/2
if xtile+d<mapsize/10 and xtile+d>-1 and ztile+e<mapsize/10 and ztile+e>-1
inc MatrixHeights(xtile+d,ztile+e),0.5
set matrix height TerrainMatrix,xtile+d,ztile+e,MatrixHeights(xtile+d,ztile+e)
if int(MatrixHeights(xtile+d,ztile+e)/30)+1<=3
set matrix tile TerrainMatrix,xtile+d,ztile+e,int(MatrixHeights(xtile+d,ztile+e)/30)+1
else
set matrix tile TerrainMatrix,xtile+d,ztile+e,3
endif
endif
next e
next d
endif
`Lower terrain
if mouseclick()=2
for d=-brushsize/2 to brushsize/2
for e=-brushsize/2 to brushsize/2
if xtile+d<mapsize/10 and xtile+d>-1 and ztile+e<mapsize/10 and ztile+e>-1
dec MatrixHeights(xtile+d,ztile+e),0.5
set matrix height TerrainMatrix,xtile+d,ztile+e,MatrixHeights(xtile+d,ztile+e)
if int(MatrixHeights(xtile+d,ztile+e)/30)+1<=3
set matrix tile TerrainMatrix,xtile+d,ztile+e,int(MatrixHeights(xtile+d,ztile+e)/30)+1
else
set matrix tile TerrainMatrix,xtile+d,ztile+e,3
endif
endif
next e
next d
endif
`Set terrain to 0
if keystate(211)
for d=-brushsize/2 to brushsize/2
for e=-brushsize/2 to brushsize/2
if xtile+d<mapsize/10 and xtile+d>-1 and ztile+e<mapsize/10 and ztile+e>-1
MatrixHeights(xtile+d,ztile+e)=0
set matrix height TerrainMatrix,xtile+d,ztile+e,MatrixHeights(xtile+d,ztile+e)
if int(MatrixHeights(xtile+d,ztile+e)/30)+1<=3
set matrix tile TerrainMatrix,xtile+d,ztile+e,int(MatrixHeights(xtile+d,ztile+e)/30)+1
else
set matrix tile TerrainMatrix,xtile+d,ztile+e,3
endif
endif
next e
next d
endif
`Show new selection
for d=-brushsize/2 to brushsize/2-1
for e=-brushsize/2 to brushsize/2-1
if xtile+d<mapsize/10 and xtile+d>-1 and ztile+e<mapsize/10 and ztile+e>-1
set matrix tile TerrainMatrix,xtile+d,ztile+e,4
endif
next e
next d
update matrix TerrainMatrix
endif
`Switch mode
if keystate(15) and pressed=0
pressed=1
editmode=3
`Reset selection
for d=-brushsize/2 to brushsize/2-1
for e=-brushsize/2 to brushsize/2-1
if xtile+d<mapsize/10 and xtile+d>-1 and ztile+e<mapsize/10 and ztile+e>-1
if int(MatrixHeights(xtile+d,ztile+e)/30)+1<=3
set matrix tile TerrainMatrix,xtile+d,ztile+e,int(MatrixHeights(xtile+d,ztile+e)/30)+1
else
set matrix tile TerrainMatrix,xtile+d,ztile+e,3
endif
endif
next e
next d
endif
endif
`Waypoint angles
if editmode=1
text 10,10,"Current mode: Waypoint Angles"
text 10,25,"(Press tab or click to go back to Waypoints mode)"
text 10,50,"[ and ] change Yangle"
text 10,65,"+ and - change Xangle"
text 10,95,"Yangle: "+str$(Waypoints(setangles).AngY)
text 10,110,"Xangle: "+str$(Waypoints(setangles).AngX)
text 10,125,"Type to set delay time (how long the player will pause at the waypoint) - "+str$(Waypoints(setangles).Delay)
`Typing
if timer()-typedelay>2000 and val(entry$(1))<>0 then temp$="" : typedelay=timer()
temp$=temp$+entry$(1)
clear entry buffer
Waypoints(setangles).Delay=val(temp$)
temp$=str$(Waypoints(setangles).Delay)
rotate object Waypoints(setangles).ObjectNo,Waypoints(setangles).AngX,Waypoints(setangles).AngY,0
if keystate(26)
Waypoints(setangles).AngY=Waypoints(setangles).AngY-0.5
endif
if keystate(27)
Waypoints(setangles).AngY=Waypoints(setangles).AngY+0.5
endif
if keystate(74) or keystate(13)
Waypoints(setangles).AngX=wrapvalue(Waypoints(setangles).AngX-0.5)
if Waypoints(setangles).AngX<275 then Waypoints(setangles).AngX=275
endif
if keystate(78) or keystate(12)
Waypoints(setangles).AngX=wrapvalue(Waypoints(setangles).AngX+0.5)
if Waypoints(setangles).AngX<275 then Waypoints(setangles).AngX=0
endif
`Get out
if keystate(15) and pressed=0
texture object Waypoints(setangles).ObjectNo,0
if setangles=1 then texture object Waypoints(setangles).ObjectNo,GreenImage
pressed=1
setangles=0
editmode=0
temp$=""
endif
if mouseclick()=1 and clicked=0
clicked=1
obj=pick object(mousex(),mousey(),PickObject,1000)
for c=1 to array count(Waypoints(0))
if Waypoints(c).ObjectNo=obj
texture object Waypoints(setangles).ObjectNo,0
if setangles=1 then texture object Waypoints(setangles).ObjectNo,GreenImage
setangles=c
editmode=1
good=1
texture object obj,BlueImage
endif
next c
if good=0
texture object Waypoints(setangles).ObjectNo,0
if setangles=1 then texture object Waypoints(setangles).ObjectNo,GreenImage
setangles=0
editmode=0
else
good=0
endif
endif
endif
`Waypoints
if editmode=0
text 10,10,"Current mode: Waypoints"
text 10,25,"(Press tab to change)"
text 10,55,"Click to place a waypoint."
text 10,70,"Right-click to delete a waypoint."
text 10,85,"Click an existing waypoint to set player angles."
`Make waypoints
if mouseclick()=1 and clicked=0
clicked=1
obj=pick object(mousex(),mousey(),PickObject,1000)
if obj=PickObject
array insert at bottom Waypoints(0)
temp=array count(Waypoints(0))
Waypoints(temp).ObjectNo=FreeObject()
Waypoints(temp).PosX=get pick vector x()+camera position x()
Waypoints(temp).PosZ=get pick vector z()+camera position z()
clone object Waypoints(temp).ObjectNo,WaypointObject
if temp=1 then texture object Waypoints(temp).ObjectNo,GreenImage
position object Waypoints(temp).ObjectNo,Waypoints(temp).PosX,get ground height(TerrainMatrix,Waypoints(temp).PosX,Waypoints(temp).PosZ),Waypoints(temp).PosZ
else
for c=1 to array count(Waypoints(0))
if Waypoints(c).ObjectNo=obj
setangles=c
editmode=1
texture object obj,BlueImage
endif
next c
endif
endif
`Delete waypoints
if mouseclick()=2 and clicked=0
clicked=1
obj=pick object(mousex(),mousey(),1,1000)
for c=1 to array count(Waypoints(0))
if Waypoints(c).ObjectNo=obj
delete object obj
array delete element Waypoints(0),c
exit
endif
next c
if array count(Waypoints(0))>0 then texture object Waypoints(1).ObjectNo,GreenImage
endif
`Switch mode
if keystate(15) and pressed=0
pressed=1
editmode=2
endif
endif
`Saving
text 10,700,"Press F1 to save (level will be saved as data statements in 'RailLevel.txt')"
text 10,715,"Paste this over the data statements at the end of the game code to play your level!"
if timer()-saved<3000 then text 10,640,"Level saved succesfully"
if keystate(59) and pressed=0
pressed=1
gosub Save
endif
text 10,150,"Camera controls:"
text 15,165,"Mousewheel - Zoom"
text 15,180,"Mousewheel + Shift - Height"
text 15,195,"Mousewheel + Ctrl - Rotation"
text 15,210,"Arrowkeys or WASD - Move"
`Draw links between waypoints
old=0
for c=1 to array count(Waypoints(0))
if old>0
line object screen x(Waypoints(old).ObjectNo),object screen y(Waypoints(old).ObjectNo),object screen x(Waypoints(c).ObjectNo),object screen y(Waypoints(c).ObjectNo)
endif
old=c
next c
`Draw lines between enemies and triggers
ink rgb(100,100,200)
for c=1 to array count(Enemies(0))
if Enemies(c).TriggerObject>0 then line object screen x(Enemies(c).ObjectNo),object screen y(Enemies(c).ObjectNo),object screen x(Enemies(c).TriggerObject),object screen y(Enemies(c).TriggerObject)
next c
ink rgb(0,0,0),rgb(140,140,140)
if scancode()=0 then pressed=0
if mouseclick()=0 then clicked=0
sync
loop
`======= ==== =============== ===================
`================================================
CameraControl:
if shiftkey()=1 then inc camanglex,mousemovez()/10
if controlkey()=1 then inc camangley,mousemovez()/10
if controlkey()=0 and shiftkey()=0 then inc height,mousemovez()*-0.5
if height<50 then height=50
if height>400 then height=400
if camanglex>90 then camanglex=90
if camanglex<10 then camanglex=10
camangley=wrapvalue(camangley)
if leftkey()=1 or mousex()-camtolerance<=0 or keystate(30)
camtargetx=camtargetx-cos(camangley)*camspeed
camtargetz=camtargetz+sin(camangley)*camspeed
endif
if rightkey()=1 or mousex()+camtolerance>=screen width() or keystate(32)
camtargetx=camtargetx+cos(camangley)*camspeed
camtargetz=camtargetz-sin(camangley)*camspeed
endif
if upkey()=1 or mousey()-camtolerance<=0 or keystate(17)
camtargetz=camtargetz+cos(camangley)*camspeed
camtargetx=camtargetx+sin(camangley)*camspeed
endif
if downkey()=1 or mousey()+camtolerance>=screen height() or keystate(31)
camtargetz=camtargetz-cos(camangley)*camspeed
camtargetx=camtargetx-sin(camangley)*camspeed
endif
if camtargetx<0 then camtargetx=0
if camtargetz<0 then camtargetz=0
if camtargetx>mapsize then camtargetx=mapsize
if camtargetz>mapsize then camtargetz=mapsize
position camera camtargetx,0,camtargetz
yrotate camera camangley
xrotate camera camanglex
move camera -height
return
Save:
if file exist("RailLevel.txt") then delete file "RailLevel.txt"
open to write 1,"RailLevel.txt"
`Write waypoints
write string 1,"data "+str$(array count(Waypoints(0)))
for c=1 to array count(Waypoints(0))
write string 1,"data "+str$(Waypoints(c).PosX)+","+str$(Waypoints(c).PosZ)+","+str$(Waypoints(c).AngY)+","+str$(Waypoints(c).AngX)+","+str$(Waypoints(c).Delay)
next c
`Write terrain
write string 1,""
write string 1,"data "+str$(mapsize/10)
for x=1 to mapsize/10
temp$="data "
for z=1 to mapsize/10
temp$=temp$+str$(MatrixHeights(x,z))+","
next z
write string 1,left$(temp$,len(temp$)-1)
next x
`Write enemies
write string 1,""
write string 1,"data "+str$(array count(Enemies(0)))
for d=1 to array count(Enemies(0))
write string 1,"data "+str$(Enemies(d).PosX)+","+str$(Enemies(d).PosZ)+","+str$(Enemies(d).TriggerPosX)+","+str$(Enemies(d).TriggerPosZ)+","+str$(Enemies(d).Delay)
next d
saved=timer()
close file 1
return
function LineBox(X1,Y1,X2,Y2)
line X1,Y1,X2,Y1
line X1,Y1,X1,Y2
line X2,Y1,X2,Y2
line X1,Y2,X2,Y2
endfunction
function FreeObject()
repeat
inc objects
until object exist(objects)=0
endfunction objects