Hey everyone again!
A huge thanks to LBFN for helping with collision, setting up sparky's etc.
But now im having a problem of every-time the player hits a switch to disable a door, the program closes and says the door object can't be found, even though I created a separate object for each door to avoid that problem?
Code below, sparky's required, No media required though
If someone could take a look and help me sort it out, a reward of three invisible ducks will be delivered to your door within 5 minutes of posting!
Rem Project: Tucker collision
Rem Created: Saturday, October 30, 2010
Rem ***** Main Source File *****
sync on : sync rate 60
rem Setup display
set display mode 800,600,32
autocam off : hide mouse
backdrop on : color backdrop rgb(255,255,255)
set ambient light 20 : color ambient light 50
global numSpheres as integer : numSpheres = 5
global radius# as float : radius# = 10.0
global littleRadius# as double float : littleRadius# = 2.0
global ScrWid : ScrWid = screen width()
global ScrHgt : ScrHgt = screen height()
global rtimer as integer
global stimer as integer
global vtimer as integer
rem player movement vector
global vx# as double float
global vy# as double float
global vz# as double float
global gravity# as double float : gravity# = -0.1
global slope# as double float : slope# = 0.5
global ground as integer : ground = 1
global jumptimer as integer : jumptimer = 0
global collide : global collide2 : global collideGroup
global syncmode as integer : syncmode = 60
global view as integer : view = 1
global hide as integer : hide = 0
global PlayerDied : global Gameover
DIM bullet(6,6) : DIM enemy(100,10) : dim TLA(134,12)
gosub InitVars
gosub MakeObjects
gosub CreateLevel
IF TotalEnemies > 0 THEN GOSUB SetupEnemies
`gosub SwitchControls ` subroutine companion movement
score=0:lives=3
` *********************************** Main loop ************************************
repeat
`Print Score Level and Lives on screen
MovePlayer(player)
rem Control camera
x# = object position x(player)
y# = object position y(player)
z# = object position z(player)
position camera x#,y#,z#-400
point camera x#,y#,z#
gosub Debug
if PlayerDied = 1
gosub PlayerDying
endif
gosub CollideDoors
gosub MoveBullets
gosub MoveEnemies
rem Update screen
sync
rem End main loop
until PlayerDied = 1
end
` *********************************** Functions ************************************
function movePlayer(player)
oldx# = object position x(player)
oldy# = object position y(player)
oldz# = object position z(player)
rem apply gravity, and user changes to movement
angy# = object angle y(player)
vx# = 0
vz# = 0
rem if player is jumping or falling then apply 'normal' gravity
rem if not attempt to keep the player stuck to the floor
if vy#=0 and jumptimer=0 then vy# = vy# + 10*gravity# else vy# = vy# + gravity#
if keystate(32)=1 then vx# = vx# + cos(angy#) : vz# = vz# - sin(angy#) : ` D
if keystate(30)=1 then vx# = vx# - cos(angy#) : vz# = vz# + sin(angy#) : ` A
`if keystate(31)=1 then vx# = vx# - sin(angy#) : vz# = vz# - cos(angy#) : ` S
` if keystate(17)=1 then vx# = vx# + sin(angy#) : vz# = vz# + cos(angy#) : ` W
rem only jump if on ground, and a certain time after last jump
IF returnkey () = 1 AND TIMER() > BulletTimer THEN GOSUB FireBullet
if ground=1
if spacekey()=1 and jumptimer=0 then jumptimer = 17
endif
if jumptimer > 0
inc vy#,0.3
dec jumptimer
` if jumptimer = 0 then vy# = 0.0
endif
rem this would be the player's final position without collision
x# = oldx# + vx#
y# = oldy# + vy#
z# = oldz# + vz#
collide3 = sc_SphereCastGroup(3,oldx#,oldy#,oldz#,oldx#,oldy#+vy#,oldz#,radius#,0)
if collide3 > 0 then PLayerDied = 1
collide = sc_SphereCastGroup(2,oldx#,oldy#,oldz#,oldx#,oldy#+vy#,oldz#,radius#,0)
if collide > 0 or collide3 > 0 : ` check against the boxes that make up the world
rem how flat is this ground
ny# = sc_getCollisionNormalY()
if abs(ny#) > slope# :`and jumptimer = 0
rem FLAT, stick
oldy# = sc_getStaticCollisionY()
else
rem STEEP, slide
x# = x# - oldx# : z# = z# - oldz#
oldx# = sc_getCollisionSlideX()
oldy# = sc_getCollisionSlideY()
oldz# = sc_getCollisionSlideZ()
x# = x# + oldx# : z# = z# + oldz#
endif
rem ny#<0 means the player has hit a ceiling rather than a floor
if ny#>slope# : `and jumptimer = 0
rem only on ground if standing on flat ground
ground = 1
vy# = 0
else
ground = 0
rem if player has hit a flat ceiling then stop vy# movement
if ny#<-slope# then vy# = gravity#
endif
else
if collide = 0 and collide3 = 0
rem nothing below player, not on ground, add vertical speed to player
oldy# = oldy# + vy#
ground = 0
endif
endif
` check against coins
collide1 = sc_SphereCastGroup(1,oldx#,oldy#,oldz#,oldx#,oldy#+vy#,oldz#,radius#,0)
if collide1 > 0 : ` check for coins
ObjCollided = SC_getObjectHit (collide)
time = timer() + 1000
repeat
text 100,100,"You picked up a coin!"
text 100,120,"collided with " + str$(ObjCollided)
sync
UNTIL timer() > time
inc score, 100
`DisplayScore()
if ObjCollided > 0
if object exist(ObjCollided) = 1 then sc_removeobject ObjCollided : delete object ObjCollided
endif
endif
collide2 = sc_SphereSlideGroup(2,oldx#,oldy#,oldz#,x#,oldy#,z#,radius#,0)
if collide2 > 0
rem if hit, reposition player, halt movement vector
x# = sc_getCollisionSlideX()
oldy# = sc_getCollisionSlideY()
z# = sc_getCollisionSlideZ()
vx# = 0
vz# = 0
rem possible code for giving the player a jumping help up stairs...
rem might be useful if slope# is set very high but stairs are still required
`dy# = oldy#-sc_getStaticCollisionY()
`if dy#<slope# and dy#>0 and ground=1 then vy# = 0.5
endif
rem check collision w/lava
collide3 = sc_SphereSlideGroup(3,oldx#,oldy#,oldz#,x#,oldy#,z#,radius#,0)
` endif
rem position the player
position object player,x#,oldy#,z#
sc_updateObject player
endfunction
` *********************************** Subroutines ************************************
`SwitchControls: `----------------companion movement
`return
`variables go here
InitVars:
CurrBullet = 0
Lives = 3
Score = 0
player = 1
PlayerDied = 0
GameOver = 0
FOR i = 0 TO 6
bullet(i,4) = 0 : ` reset status to inactive
bullet(i,5) = 600 + i
NEXT i
FOR i = 0 TO 100
enemy(i,4) = 0 : ` status = inactive
enemy(i,5) = 400 + i : ` object # -- use objects 400 to 500 for enemies
NEXT i
BulletTimer = TIMER()
return
CollideDoors:
`------------------------------door collision-------------------------------
IF OBJECT COLLISION (player, 8)
`GOSUB PlayerDying
ENDIF
IF OBJECT COLLISION (player, 9)
GOSUB PlayerDying
ENDIF
IF OBJECT COLLISION (player, 10)
GOSUB PlayerDying
ENDIF
IF OBJECT COLLISION (player, 11)
GOSUB PlayerDying
ENDIF
IF OBJECT COLLISION (player, 12)
GOSUB PlayerDying
ENDIF
IF OBJECT COLLISION (player, 13)
GOSUB PlayerDying
ENDIF
IF OBJECT COLLISION (player, 14)
GOSUB PlayerDying
ENDIF
`---------------------------------------------------------------------------
IF OBJECT hit (player, 16) ` if player touches switch, delete the door
delete OBJECT 9
INC Score, 1
ENDIF
Return
FireBullet:
bullet(CurrBullet,1) = OBJECT POSITION X(player)
bullet(CurrBullet,2) = OBJECT POSITION Y(player)
bullet(CurrBullet,3) = OBJECT POSITION Z(player)
bullet(CurrBullet,4) = 1 : ` status = active
bullet(CurrBullet,5) = 600 + CurrBullet : ` object #
x# = OBJECT POSITION X(player)
y# = OBJECT POSITION Y(player)
z# = OBJECT POSITION Z(player)
POSITION OBJECT bullet(CurrBullet,5),x#,y#,z#
SHOW OBJECT bullet(CurrBullet,5)
bullet(CurrBullet,6) = 8 : ` moving right
IF direction = left THEN bullet(CurrBullet,6) = -8 : ` moving left
INC CurrBullet : IF CurrBullet > 6 THEN CurrBullet = 0
BulletTimer = TIMER() + 200
RETURN
MoveBullets:
FOR k = 0 TO 6
IF bullet(k,4) = 1 : ` is it active?
bullet(k,1) = bullet(k,1) + bullet(k,6) : ` move it
IF OBJECT IN SCREEN(bullet(k,5)) = 1
` check for collision
collide = OBJECT COLLISION(bullet(k,5),0)
IF collide >= 1000
` collision with the world
HIDE OBJECT bullet(k,5)
bullet(k,4) = 0 : ` status = inactive
ENDIF
` check collision with enemies
IF collide >= 400 AND collide <= (400 + TotalEnemies)
IF enemy(collide - 400,4) = 1 : ` is it still active?
` yes, got an enemy!
enemy(collide - 400,4) = 0 : ` status = inactive
HIDE OBJECT enemy(collide - 400,5)
` hide the bullet and change it's status
HIDE OBJECT bullet(k,5)
bullet(k,4) = 0 : ` status = inactive
Score = Score+1
ELSE
` enemy has already been destroyed - move the bullet
POSITION OBJECT bullet(k,5),bullet(k,1),bullet(k,2),bullet(k,3)
ENDIF
ENDIF
IF collide = player OR collide = 0 OR (collide >= 600 AND collide <= 606)
` re-position the bullet
POSITION OBJECT bullet(k,5),bullet(k,1),bullet(k,2),bullet(k,3)
ENDIF
ELSE
` bullet off screen - hide it
HIDE OBJECT bullet(k,5)
bullet(k,4) = 0 : ` status = inactive
ENDIF
ENDIF
NEXT k
RETURN
MoveEnemies:
FOR t = 0 TO TotalEnemies
IF Enemy(t,4) = 1 : ` is it still alive?
Enemy(t,1) = Enemy(t,1) + Enemy(t,8)
IF Enemy(t,1) < Enemy(t,6) OR Enemy(t,1) > Enemy(t,7) THEN Enemy(t,8) = Enemy(t,8) * -1 : `reverse direction
POSITION OBJECT Enemy(t,5),Enemy(t,1),Enemy(t,2),0.0
ENDIF
NEXT t
RETURN
MakeObjects:
rem Create a player object
make object sphere player,25,40,25
sc_setupObject player,0,1
color object player,rgb(0,0,255)
position object player,300,100,0
sc_setupobject player,0,1
` make bullets
FOR k = 600 TO 606
MAKE OBJECT SPHERE k,3
COLOR OBJECT k,RGB(255,0,0) : ` make them red
MAKE OBJECT COLLISION BOX k,-1.5,-1.5,-1.5,1.5,1.5,1.5,1
HIDE OBJECT k
NEXT k
`------------------------------switches----------------------------------
MAKE OBJECT SPHERE 5, 20, 20, 20 `1st switch
SET OBJECT COLLISION ON 5
SET OBJECT COLLISION TO SPHERES 5
COLOR OBJECT 5, RGB (255,255,255)
POSITION OBJECT 5,400,250,0
MAKE OBJECT SPHERE 16, 20, 20, 20 `2nd switch
SET OBJECT COLLISION ON 16
SET OBJECT COLLISION TO SPHERES 16
COLOR OBJECT 16, RGB (255,255,255)
POSITION OBJECT 16,1000,100,0
MAKE OBJECT SPHERE 17, 20, 20, 20 `3rd switch
SET OBJECT COLLISION ON 17
SET OBJECT COLLISION TO SPHERES 17
COLOR OBJECT 17, RGB (255,255,255)
POSITION OBJECT 17,2100,550,0
MAKE OBJECT SPHERE 18, 20, 20, 20 `4th switch
SET OBJECT COLLISION ON 18
SET OBJECT COLLISION TO SPHERES 18
COLOR OBJECT 18, RGB (255,255,255)
POSITION OBJECT 18,2900,450,0
MAKE OBJECT SPHERE 19, 20, 20, 20 `5th switch
SET OBJECT COLLISION ON 19
SET OBJECT COLLISION TO SPHERES 19
COLOR OBJECT 19, RGB (255,255,255)
POSITION OBJECT 19,3750,500,0
MAKE OBJECT SPHERE 20, 20, 20, 20 `6th switch
SET OBJECT COLLISION ON 20
SET OBJECT COLLISION TO SPHERES 20
COLOR OBJECT 20, RGB (255,255,255)
POSITION OBJECT 20,3850,450,0
MAKE OBJECT SPHERE 21, 20, 20, 20 `7th switch
SET OBJECT COLLISION ON 21
SET OBJECT COLLISION TO SPHERES 21
COLOR OBJECT 21, RGB (255,255,255)
POSITION OBJECT 21,5400,450,0
`-------------------------------doors------------------------------------
MAKE OBJECT BOX 8, 50, 50, 50 `1st door
sc_setupobject 8,3,2
SET OBJECT COLLISION ON 8
SET OBJECT COLLISION TO BOXES 8
COLOR OBJECT 8, RGB (255,0,0)
POSITION OBJECT 8,400,100,0
MAKE OBJECT BOX 9, 50, 50, 50 `2nd door
SET OBJECT COLLISION ON 9
SET OBJECT COLLISION TO BOXES 9
COLOR OBJECT 9, RGB (255,0,0)
POSITION OBJECT 9,1100,150,0
MAKE OBJECT BOX 10, 50, 50, 50 `3rd door
SET OBJECT COLLISION ON 10
SET OBJECT COLLISION TO BOXES 10
COLOR OBJECT 10, RGB (255,0,0)
POSITION OBJECT 10,2100,250,0
MAKE OBJECT BOX 11, 50, 50, 50 `4th door
SET OBJECT COLLISION ON 11
SET OBJECT COLLISION TO BOXES 11
COLOR OBJECT 11, RGB (255,0,0)
POSITION OBJECT 11,2800,200,0
MAKE OBJECT BOX 12, 50, 50, 50 `5th door
SET OBJECT COLLISION ON 12
SET OBJECT COLLISION TO BOXES 12
COLOR OBJECT 12, RGB (255,0,0)
POSITION OBJECT 12,3650,200,0
MAKE OBJECT BOX 13, 50, 50, 50 `6th door
SET OBJECT COLLISION ON 13
SET OBJECT COLLISION TO BOXES 13
COLOR OBJECT 13, RGB (255,0,0)
POSITION OBJECT 13,4600,350,0
MAKE OBJECT BOX 14, 50, 50, 50 `7th door
SET OBJECT COLLISION ON 14
SET OBJECT COLLISION TO BOXES 14
COLOR OBJECT 14, RGB (255,0,0)
POSITION OBJECT 14,5800,200,0
MAKE OBJECT BOX 15, 50, 50, 50 `ENDGAME door
SET OBJECT COLLISION ON 15
SET OBJECT COLLISION TO BOXES 15
COLOR OBJECT 15, RGB (255,0,0)
POSITION OBJECT 15,6650,350,0
`-------------------------------------------------------
return
PlayerDying:
ink rgb(0,220,0),0
time = timer() + 1200
repeat
center text ScrWid / 2,ScrHgt /2,"Player Died"
sync
UNTIL timer() > time
dec lives
if lives > 0
rem reset player's position to the original place
position object player,300,100,0
PlayerDied = 0
endif
return
Debug:
ink rgb(0,0,255),0
text 10,10,"SCORE:" + str$(Score) + " LIVES:" + str$(lives)
text 10,30,"FPS: " + str$(screen fps())
text 10,100,"collide = " + str$(collide)
text 10,120,"collide2 = " + str$(collide2)
text 10,140,"collideGroup = " + str$(collideGroup)
text 10,160,"jumptimer = " + str$(jumptimer)
text 10,180,"ground = " + str$(ground)
return
SetupEnemies:
FOR t = 0 TO TotalEnemies
` look for blocks below to set left / right paths
x = Enemy(t,9) : y = enemy(t,10) : tempx = x : tempy = y
IF y > 1 AND y < 12 AND x > 1 AND x < 134 : ` make sure we don't go out of bounds
okay = 0
REPEAT
DEC tempx
IF TLA(tempx,tempy) = 1
okay = 1
ENDIF
UNTIL okay = 1
MaxLeft = tempx + 1 : ` see how far left we can go before we hit a block
tempx = x
okay = 0
REPEAT
INC tempx
IF TLA(tempx,tempy) = 1
okay = 1
ENDIF
UNTIL okay = 1
MaxRight = tempx - 1 : ` furthest right w/o hitting a block
`now we will check underneath to make sure there is a platform to walk on
tempx = x
DEC tempy
okay = 0
REPEAT
DEC tempx
IF TLA(tempx,tempy) = 0
okay = 1
ENDIF
UNTIL okay = 1
xtu = MaxLeft : IF (tempx + 1) > MaxLeft THEN xtu = (tempx + 1)
Enemy(t,6) = (xtu * 50) : ` furthest left it can go left
tempx = x
okay = 0
REPEAT
INC tempx
IF TLA(tempx,tempy) = 0
okay = 1
ENDIF
UNTIL okay = 1
xtu = MaxRight : IF (tempx - 1) < MaxRight THEN xtu = (tempx - 1)
Enemy(t,7) = (xtu * 50) : ` max right
ENDIF
` set random speed
Enemy(t,8) = RND(3) + 1 : ` random amount - moving right
IF RND(100) > 50 THEN Enemy(t,8) = Enemy(t,8) * -1 : ` randomly start moving left
NEXT t
RETURN
CreateLevel:
rem Create a level
LevelObject = 1000 : EnemyObj = 400 : NumReads = 0
`for y=134 to 1 step -1
for y = 12 to 1 step -1
for x = 1 to 134
read TestLevel1Data
TLA(x,y) = TestLevel1Data
if TestLevel1Data=1 : ` main blocks which player can stand upon
make object cube LevelObject,50
position object LevelObject,x*50,y*50,0
color object LevelObject,rgb(0,0,0)
sc_setupobject LevelObject,2,2
endif
IF TestLevel1Data = 3
make object cube LevelObject,50
position object LevelObject,x*50,y*50,0
color object LevelObject,rgb(128,128,128)
sc_setupobject LevelObject,2,2
ENDIF
if TestLevel1Data = 4 `coins/pickups
make object sphere LevelObject,10,10,10 `coins/pickups
position object LevelObject,x * 50,y * 50,0
color object LevelObject,rgb(255,255,0)
sc_setupobject LevelObject,1,1
endif
if TestLevel1Data = 5 : ` lava
make object cube LevelObject,50
color object LevelObject, rgb (255,0,0)
position object LevelObject,x * 50,y * 50,0
sc_setupobject LevelObject,3,2
endif
if object exist(LevelObject)
inc LevelObject
endif
IF TestLevel1Data = 2
IF OBJECT EXIST(EnemyObj) = 1 THEN DELETE OBJECT EnemyObj `enemies
MAKE OBJECT SPHERE EnemyObj,15
COLOR OBJECT EnemyObj,RGB(139,69,19)
SET OBJECT AMBIENCE EnemyObj,RGB(0,255,0)
MAKE OBJECT COLLISION BOX EnemyObj,-20.0,-20.0,-20.0,20.0,20.0,20.0,0
Enemy(EnemyObj - 400,1) = x * 50 : Enemy(EnemyObj - 400,2) = y * 50
POSITION OBJECT EnemyObj,Enemy(EnemyObj - 400,1),Enemy(EnemyObj - 400,2),0
Enemy(EnemyObj - 400,4) = 1 : ` status = active
Enemy(EnemyObj - 400,9) = x : Enemy(EnemyObj - 400,10) = y : ` store map locations
INC EnemyObj,1
ENDIF
next x
next y
TotalEnemies = EnemyObj - 400
return
TestLevel1Data:
DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,5,1,5,1,5,1,5,1,5,1,1,5,1,5,1,5,5,5,5,5,5,5,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,1,5,1,5,1,5,1,5,1,1
DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,1,5,1,5,1,1,5,1,5,1,1,5,1,5,1,1,1,1,1,1,1,1,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,0,0,5,0,5,0,5,0,5,0,5,0,0,1,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,0,1,5,5,0,1,0,1,5,5,0,0,0,0,0,0,5,1,5,1,5,1,5,1,5,1,1
DATA 1,0,0,0,0,5,5,5,5,5,0,0,0,0,0,0,0,1,5,1,5,1,5,1,5,1,5,1,1,5,1,5,1,0,0,5,0,5,0,0,0,0,1,0,0,0,5,5,5,5,0,0,0,0,0,1,5,0,5,1,0,5,0,5,0,5,0,5,0,5,0,0,1,5,0,5,0,1,5,1,0,0,0,0,0,0,0,0,0,0,0,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,0,5,1,5,0,5,0,0,0,0,5,0,0,0,0,0,5,1,5,1,5,1,5,1,5,1,1
DATA 1,0,0,0,0,5,1,5,1,5,0,0,0,0,0,0,0,5,1,5,1,5,1,1,1,1,1,1,1,5,1,5,1,0,0,0,0,0,0,0,1,1,1,5,5,5,5,0,0,0,0,0,0,0,0,1,5,0,5,1,0,5,0,5,0,5,0,5,0,5,0,0,1,0,0,5,1,5,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,1,5,1,5,1,5,0,5,5,1,0,1,5,1,0,5,0,0,0,0,0,5,1,5,1,5,1,5,1,5,1,1
DATA 1,0,0,0,0,5,5,5,5,5,0,0,0,0,0,0,0,1,5,1,5,1,5,0,0,0,0,0,1,5,1,5,1,0,5,0,5,0,5,0,1,0,1,5,0,0,0,0,5,5,0,0,0,0,0,1,5,0,5,1,0,5,0,5,0,5,0,5,0,5,0,0,1,0,5,5,0,0,0,0,5,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,5,0,1,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
DATA 1,0,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,5,1,5,1,5,1,0,0,0,0,0,1,5,1,5,1,0,0,0,0,0,2,0,0,0,1,0,0,5,5,5,5,0,0,0,0,0,0,0,1,0,1,0,0,5,0,5,0,5,0,5,0,5,0,0,0,0,1,0,1,5,1,0,1,0,0,0,0,0,0,0,0,0,1,1,5,1,5,1,5,1,5,1,1,0,0,0,0,0,1,5,1,5,1,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1
DATA 1,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1,0,5,5,0,0,0,0,0,0,2,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,5,5,5,5,5,5,5,5,5,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1
DATA 1,0,0,0,0,0,5,5,5,0,0,0,0,9,0,0,0,0,0,0,2,0,1,0,5,5,5,0,0,0,2,0,0,1,1,1,1,5,5,5,1,0,1,0,5,0,0,0,0,1,1,5,1,1,1,0,1,0,1,0,0,0,0,0,0,0,0,2,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,1,1,5,5,5,5,5,5,5,5,5,1,1,1,0,0,0,1,1,1,1,0,0,1,1,0,0,1,1,5,5,5,1,5,5,5,1,5,5,5,1,1,1,1,1
DATA 1,0,0,0,0,0,1,1,1,0,0,0,0,1,5,1,0,0,1,1,1,0,5,0,0,0,2,0,1,5,1,5,1,1,1,1,1,5,1,5,1,0,1,1,1,0,0,1,1,1,5,5,5,1,0,0,1,0,1,1,1,1,1,0,0,1,1,1,1,5,5,1,1,0,1,0,1,5,1,0,5,1,1,1,1,0,0,1,1,1,1,5,5,5,5,5,5,5,5,5,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,1
DATA 1,0,0,0,0,0,0,7,0,0,2,0,1,1,5,1,1,0,0,0,1,0,0,0,1,1,1,1,1,5,1,5,1,1,1,1,1,5,5,5,1,0,0,0,2,0,1,1,5,5,5,5,5,1,0,0,0,0,0,2,0,0,0,0,1,1,5,5,5,5,5,5,1,0,0,0,0,2,0,0,0,0,2,0,0,0,1,1,1,1,1,5,5,5,5,5,5,5,5,5,1,1,1,1,1,0,0,2,0,0,0,0,2,0,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,1,1
DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Hey look at that!