2D tile per pixel scrolling engine by Phaelax22nd Aug 2005 4:20
|
---|
Summary scrolling tile engine Description Tile engine which scrolls per pixel instead of per tile. Invisible boundary set up so character can move and map scrolls before character reaches the end of the screen. This code also creates images from scratch and displays a character stats screen. Code ` This code was downloaded from The Game Creators ` It is reproduced here with full permission ` http://www.thegamecreators.com set display mode 640,480,32 randomize timer() `// `// Passable tiles range from 1 to 5 `// Obstacle tiles range from 6 and up `// `// `// `// #CONSTANT TRUE = 1 #CONSTANT FALSE = 0 #CONSTANT GRASS = 1 : `image number for grass #CONSTANT BRIDGE = 2 : `image number for bridge #CONSTANT BRICK = 8 : `image number for bricks #CONSTANT BUSHES = 7 : `image number for bricks #CONSTANT WATTER = 6 : `image number for water (water is a reserved word, hence watter) #CONSTANT PLAYER1 = 50 : `image number for player #CONSTANT ENEMY1 = 51 : `image number for enemy #CONSTANT TILE_SIZE = 32 : `size of 1 tile (tile is assumed and should to be square) #CONSTANT CHARACTER_SIZE = 15 : `size of character (assumed to be square) #CONSTANT ENEMY_BADDIE = 1 : `enemy type #CONSTANT ENEMY_GHOST = 2 : `enemy type Global MAP_WIDTH = 64 : `number of tiles in a map across Global MAP_HEIGHT = 64 : `number of tiles in a map down GLOBAL SCREEN_HEIGHT : SCREEN_HEIGHT = screen height() / TILE_SIZE : `screen height in number of tiles GLOBAL SCREEN_WIDTH : SCREEN_WIDTH = screen width() / TILE_SIZE : `screen width in number of tiles GLOBAL SCREEN_WIDTH_BOUNDARY : SCREEN_WIDTH_BOUNDARY = (MAP_WIDTH * TILE_SIZE) - (SCREEN_WIDTH-1)*TILE_SIZE GLOBAL SCREEN_HEIGHT_BOUNDARY : SCREEN_HEIGHT_BOUNDARY = (MAP_HEIGHT * TILE_SIZE) - (SCREEN_HEIGHT-1)*TILE_SIZE GLOBAL SCROLL_BOUNDARY : SCROLL_BOUNDARY = TILE_SIZE*4 : `How far from edge of screen should map start scrolling GLOBAL STAT_BOX_HEIGHT = 64 GLOBAL MX as float : MX = TILE_SIZE GLOBAL MY as float : MY = TILE_SIZE type character speed as float x as float y as float damage as integer armor as integer str as float dex as float hp as float gold as integer level as integer expr as integer name as string endtype player as character restore player1_stats read player.damage read player.armor read player.str read player.dex read player.hp read player.gold read player.level read player.expr read player.name player.x = 320 player.y = 240 player.speed = 0.5 REM create some random images getGrassImage(GRASS) getBushesImage(BUSHES) getWaterImage(WATTER) getBrickImage(BRICK) getBridgeImage(BRIDGE) restore map1 buildMap() restore player1 getPlayerImage(PLAYER1) sync on backdrop on make object cube 3, 4 make matrix 1,43,34,4,4 DO oldPlayerX# = player.x oldPlayerY# = player.y gosub _CONTROLS if collision_overlaps(player.x, player.y) = TRUE player.x = oldPlayerX# player.y = oldPlayerY# else gosub _BOUNDARY_CHECKS endif drawMap(MX,MY) positionPlayer(player.x, player.y) printStats(player) set cursor 0,0 print "FPS: ",screen fps() sync LOOP `================================================= `Player controls `Also keeps coordinates within boundaries `================================================= _CONTROLS: if upkey() then dec player.y, player.speed if downkey() then inc player.y, player.speed if rightkey() then inc player.x, player.speed if leftkey() then dec player.x, player.speed RETURN `================================================= `If given position is inside a tile marked `not passible, return true `================================================= function collision_overlaps(px as float, py as float) rem convert screen position into world position px = px + (MX-TILE_SIZE) py = py + (MY-TILE_SIZE) mapx1 = px / TILE_SIZE + 1 mapy1 = py / TILE_SIZE + 1 mapx2 = (px+CHARACTER_SIZE) / TILE_SIZE + 1 mapy2 = py / TILE_SIZE + 1 mapx3 = px / TILE_SIZE + 1 mapy3 = (py+CHARACTER_SIZE) / TILE_SIZE + 1 mapx4 = (px+CHARACTER_SIZE) / TILE_SIZE + 1 mapy4 = (py+CHARACTER_SIZE) / TILE_SIZE + 1 id1 = getMapTile(mapy1, mapx1) id2 = getMapTile(mapy2, mapx2) id3 = getMapTile(mapy3, mapx3) id4 = getMapTile(mapy4, mapx4) if id1 < 6 AND id2 < 6 AND id3 < 6 AND id4 < 6 then exitfunction FALSE endfunction TRUE `================================================= `Checks player and screen boundaries along with `map scrolling `================================================= _BOUNDARY_CHECKS: sw = screen width() sh = screen height() if player.x < SCROLL_BOUNDARY if MX > TILE_SIZE player.x = SCROLL_BOUNDARY dec MX, player.speed else MX = TILE_SIZE if player.x < 0 then player.x = 0 endif endif if player.x > sw - SCROLL_BOUNDARY if MX < SCREEN_WIDTH_BOUNDARY player.x = sw - SCROLL_BOUNDARY inc MX, player.speed else MX = MX - (MX-SCREEN_WIDTH_BOUNDARY) rem 15 is the character's image size if player.x > sw-15 then player.x = sw-15 endif endif if player.y < SCROLL_BOUNDARY if MY > TILE_SIZE player.y = SCROLL_BOUNDARY dec MY, player.speed else MY = TILE_SIZE if player.y < 0 then player.y = 0 endif endif if player.y > (sh - STAT_BOX_HEIGHT) - SCROLL_BOUNDARY if MY < SCREEN_HEIGHT_BOUNDARY player.y = (sh - STAT_BOX_HEIGHT) - SCROLL_BOUNDARY inc MY, player.speed else MY = SCREEN_HEIGHT_BOUNDARY if player.y > (sh - STAT_BOX_HEIGHT)-15 then player.y = (sh - STAT_BOX_HEIGHT)-15 endif endif RETURN `================================================= `Draws the map at position (mapDrawX,mapDrawY `starting in the top left corner of the screen(0,0) `Parameters are map coordinates. So a map with 64 `tiles each 32pixels each, the map would range from `1 to 2048 `================================================= function drawMap(mapDrawX as integer, mapDrawY as integer) mapx = mapDrawX / TILE_SIZE mapy = mapDrawY / TILE_SIZE xoff = mapDrawX AND (TILE_SIZE-1) yoff = mapDrawY AND (TILE_SIZE-1) xoff = mapDrawX - mapx*TILE_SIZE yoff = mapDrawY - mapy*TILE_SIZE for x = 0 to SCREEN_WIDTH for y = 0 to SCREEN_HEIGHT img = getMapTile(mapy+y, mapx+x) if img > 0 then paste image img,x*TILE_SIZE - xoff, y*TILE_SIZE - yoff next y next x endfunction `================================================= `Position in screen coordinates `================================================= function positionPlayer(x as float, y as float) paste image PLAYER1, x, y, 1 endfunction `================================================= `Returns value from map array, making sure the call `is within the boundaries of the array `================================================= function getMapTile(y as integer, x as integer) if x >= 0 and x <= MAP_WIDTH and y >= 0 and y <= MAP_HEIGHT img = map(y,x) exitfunction img endif endfunction 0 `================================================= ` !!!!!WARNING!!!!!! `map data must be restored BEFORE you call this `function so it knows which map to load `================================================= function buildMap() REM create our map restore map1 read MAP_WIDTH read MAP_HEIGHT SCREEN_WIDTH_BOUNDARY = (MAP_WIDTH * TILE_SIZE) - (SCREEN_WIDTH-1)*TILE_SIZE SCREEN_HEIGHT_BOUNDARY = ((MAP_HEIGHT * TILE_SIZE) - (SCREEN_HEIGHT-1)*TILE_SIZE) + 64 dim map(MAP_HEIGHT, MAP_WIDTH) for y=1 to MAP_HEIGHT for x=1 to MAP_WIDTH read map(y,x) next x next y endfunction `================================================= `Display player's stats `================================================= function printStats(c as character) SH = screen height() ink 0,0 box 0,SH-STAT_BOX_HEIGHT,screen width(),SH ink rgb(255,0,0), 0 center text 320,SH - 64,c.name +" ("+str$(c.level)+")" text 0, SH - 64, "Strength: "+str$(c.str) text 0, SH - 52, "Dexterity: "+str$(c.dex) text 0, SH - 40, "Armor: "+str$(c.armor) text 0, SH - 28, "Damage: "+str$(c.damage) text 0, SH - 16, "Hitpoints: "+str$(c.hp) text 190, SH - 28, "Experience: "+str$(c.expr) text 190, SH - 16, "Gold: "+str$(c.gold) endfunction `================================================= `Randomly creates a grass image `================================================= function getGrassImage(img as integer) cls for x = 0 to 32 for y=0 to 32 r = rnd(128) dot x,y,rgb(r,rnd(128)+128,r) next y next x blur bitmap 0, 2 get image img, 0,0,32,32 endfunction `================================================= `Randomly creates a bushes image `================================================= function getBushesImage(img as integer) for r = 14 to 1 step -1 g = 255 - (r-1)*10 ink rgb(0,g,0),0 circle 16,16,r next r blur bitmap 0,2 get image img, 0,0,32,32 endfunction `================================================= `Randomly creates a water image `================================================= function getWaterImage(img as integer) cls for x = 0 to 32 for y=0 to 32 r = rnd(64) g = rnd(128) dot x,y,rgb(r,g,rnd(128)+128) next y next x blur bitmap 0, 3 get image img, 0,0,32,32 endfunction `================================================= `Randomly creates a brick image `================================================= function getBrickImage(img as integer) cls for x = 0 to 32 for y=0 to 32 g = rnd(128)+64 dot x,y,rgb(g,g,g) next y next x ink 0,0 line 0,31,32,31 line 0,21,32,21 line 0,10,32,10 line 10,0,10,10 line 21,0,21,10 line 10,21,10,32 line 21,21,21,32 line 16,10,16,21 get image img, 0,0,32,32 endfunction `================================================= `A bridge image `================================================= function getBridgeImage(img as integer) cls color as dword for x = 0 to 15 c = (16-x)*2 color = rgb(152-c,146-c,107-c) ink color, 0 line x,0,x,32 next x for x = 16 to 32 c = x*2 color = rgb(152-c,146-c,107-c) ink color, 0 line x,0,x,32 next x get image img, 0,0,32,32 endfunction `================================================= `loads the character and forms a picture from data `================================================= function getPlayerImage(img as integer) cls color as dword read cx read cy for y = 1 to cy for x = 1 to cx read z color = rgb(255,255,255) * z dot x,y,color next y next x get image img, 1,1,cx,cy endfunction `================================================= `loads enemey image from data `================================================= function getEnemyImage(img as integer) cls color as dword read ex read ey for y = 1 to ey for x = 1 to ex read a color = rgb(255,255,255) * z dot x,y,color next x next y get image img,1,1,ex,ey endfunction player1_stats: DATA 2, 0, 9, 6, 40, 80, 1, 0, "Gwark" player1: data 15,15 data 0,1,0,0,0,0,0,1,1,0,0,0,0,0,0 data 0,1,0,0,0,0,1,1,1,1,0,0,0,0,0 data 0,0,1,0,0,0,1,1,1,1,0,0,0,0,0 data 0,0,1,0,0,0,0,1,1,0,0,0,0,0,0 data 0,0,0,1,0,0,1,1,1,1,1,0,0,0,0 data 0,0,0,1,0,1,1,1,0,0,1,1,1,0,0 data 0,0,0,0,1,1,0,1,0,1,1,1,1,0,0 data 0,0,0,0,1,0,1,1,1,0,1,1,0,0,0 data 0,0,0,0,0,0,1,1,1,0,1,1,0,0,0 data 0,0,0,0,0,0,1,1,1,1,1,0,0,0,0 data 0,0,0,0,0,0,1,1,0,1,1,0,0,0,0 data 0,0,0,0,0,0,1,1,0,1,1,0,0,0,0 data 0,0,0,0,0,0,1,1,0,1,1,0,0,0,0 data 0,0,0,0,0,1,1,1,0,1,1,1,0,0,0 data 0,0,0,0,0,1,1,1,0,1,1,1,0,0,0 map1: DATA 64,64 DATA 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 DATA 8,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,7,7,7,6,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,8 DATA 8,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,7,7,6,6,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,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,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,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,6,6,1,1,6,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,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,6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,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,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,1,1,1,1,1,1,1,1,1,1,1,1,7,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,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,1,1,1,1,1,1,1,1,1,1,1,7,7,7,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,6,6,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,1,1,1,1,1,1,1,1,1,1,1,7,7,7,7,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,7,7,7,7,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,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,7,7,7,7,7,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,7,7,7,1,1,1,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,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,6,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,6,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,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,7,7,7,7,7,1,1,1,1,1,1,1,6,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,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,7,7,7,7,1,1,1,1,1,1,1,1,1,6,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,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,7,7,7,7,7,1,1,1,1,7,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,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,7,7,7,7,7,1,1,1,1,1,1,1,7,7,7,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,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,7,7,7,7,1,1,1,1,1,1,1,1,7,7,7,7,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,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,6,6,6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,6,6,6,6,6,6,6,1,1,1,1,1,1,6,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,6,6,6,6,6,6,1,1,1,1,1,1,1,6,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,6,6,6,6,1,1,1,1,1,1,1,1,6,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,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,6,6,6,1,1,1,1,1,1,1,1,6,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,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,6,6,6,1,1,1,1,1,1,1,1,6,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,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,6,6,1,1,1,1,1,1,1,1,6,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,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,6,6,1,1,1,1,1,1,6,6,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8 DATA 8,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,6,6,6,6,6,6,6,6,6,6,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,8 DATA 8,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,6,6,6,6,6,6,6,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,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,8 DATA 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 |