set doublewide on set zoneheight 8 displaymode 160A set screenheight 208 rem ** we're using a bit of math and the "frame" parameter of plotsprite rem ** to simplify the walk cycle. The relative order of these is rem ** important. rem ** aslo, because we're using a zone height of 8, our sprites are rem ** limited to being 8 tall. no big deal, we'll just use two of them rem ** (a "top" and a "bottom") to make a 16 pixel tall sprite... incgraphic walking/walk0_bottom.png 160B incgraphic walking/walk1_bottom.png 160B incgraphic walking/walk2_bottom.png 160B incgraphic walking/walk3_bottom.png 160B incgraphic walking/walk4_bottom.png 160B incgraphic walking/walk5_bottom.png 160B incgraphic walking/walk6_bottom.png 160B incgraphic walking/walk7_bottom.png 160B incgraphic walking/walk8_bottom.png 160B incgraphic walking/walk9_bottom.png 160B incgraphic walking/walk0_top.png 160B incgraphic walking/walk1_top.png 160B incgraphic walking/walk2_top.png 160B incgraphic walking/walk3_top.png 160B incgraphic walking/walk4_top.png 160B incgraphic walking/walk5_top.png 160B incgraphic walking/walk6_top.png 160B incgraphic walking/walk7_top.png 160B incgraphic walking/walk8_top.png 160B incgraphic walking/walk9_top.png 160B incgraphic walking/walk0_bottom_left.png 160B incgraphic walking/walk1_bottom_left.png 160B incgraphic walking/walk2_bottom_left.png 160B incgraphic walking/walk3_bottom_left.png 160B incgraphic walking/walk4_bottom_left.png 160B incgraphic walking/walk5_bottom_left.png 160B incgraphic walking/walk6_bottom_left.png 160B incgraphic walking/walk7_bottom_left.png 160B incgraphic walking/walk8_bottom_left.png 160B incgraphic walking/walk9_bottom_left.png 160B incgraphic walking/walk0_top_left.png 160B incgraphic walking/walk1_top_left.png 160B incgraphic walking/walk2_top_left.png 160B incgraphic walking/walk3_top_left.png 160B incgraphic walking/walk4_top_left.png 160B incgraphic walking/walk5_top_left.png 160B incgraphic walking/walk6_top_left.png 160B incgraphic walking/walk7_top_left.png 160B incgraphic walking/walk8_top_left.png 160B incgraphic walking/walk9_top_left.png 160B incgraphic flying/fly_up_right_top.png 160B incgraphic flying/fly_0_up_right_bottom.png 160B incgraphic flying/fly_1_up_right_bottom.png 160B incgraphic flying/fly_up_left_top.png 160B incgraphic flying/fly_0_up_left_bottom.png 160B incgraphic flying/fly_1_up_left_bottom.png 160B incgraphic flying/fly_right_top.png 160B incgraphic flying/fly_0_right_bottom.png 160B incgraphic flying/fly_1_right_bottom.png 160B incgraphic flying/fly_left_top.png 160B incgraphic flying/fly_0_left_bottom.png 160B incgraphic flying/fly_1_left_bottom.png 160B newblock incgraphic gfx/level1_tileset.png 160B incgraphic gfx/scorefont.png 160B newblock incgraphic missile/missile1_nf_bottom.png 160B incgraphic missile/missile1_f_bottom.png 160B incgraphic missile/missile2_nf_bottom.png 160B incgraphic missile/missile2_f_bottom.png 160B incgraphic missile/missile3_nf_bottom.png 160B incgraphic missile/missile3_f_bottom.png 160B incgraphic missile/missile4_nf_bottom.png 160B incgraphic missile/missile4_f_bottom.png 160B incgraphic missile/missile5_nf_bottom.png 160B incgraphic missile/missile5_f_bottom.png 160B incgraphic missile/missile6_nf_bottom.png 160B incgraphic missile/missile6_f_bottom.png 160B incgraphic missile/missile7_nf_bottom.png 160B incgraphic missile/missile7_f_bottom.png 160B incgraphic missile/missile8_nf_bottom.png 160B incgraphic missile/missile8_f_bottom.png 160B incgraphic missile/missile1_nf_top.png 160B incgraphic missile/missile1_f_top.png 160B incgraphic missile/missile2_nf_top.png 160B incgraphic missile/missile2_f_top.png 160B incgraphic missile/missile3_nf_top.png 160B incgraphic missile/missile3_f_top.png 160B incgraphic missile/missile4_nf_top.png 160B incgraphic missile/missile4_f_top.png 160B incgraphic missile/missile5_nf_top.png 160B incgraphic missile/missile5_f_top.png 160B incgraphic missile/missile6_nf_top.png 160B incgraphic missile/missile6_f_top.png 160B incgraphic missile/missile7_nf_top.png 160B incgraphic missile/missile7_f_top.png 160B incgraphic missile/missile8_nf_top.png 160B incgraphic missile/missile8_f_top.png 160B incgraphic explosion/explosion1_top.png 160B incgraphic explosion/explosion1_bottom.png 160B incgraphic explosion/explosion2_top.png 160B incgraphic explosion/explosion2_bottom.png 160B incgraphic explosion/explosion3_top.png 160B incgraphic explosion/explosion3_bottom.png 160B incgraphic explosion/explosion4_top.png 160B incgraphic explosion/explosion4_bottom.png 160B dim level=a dim frame=b dim walkframe=c dim herox=d dim heroy=e dim herodir=f dim mytemp1=g dim mytemp2=h dim mytemp1a=i dim mytemp1b=j dim herochar=k dim blockpaint=l dim totalpaint=m dim isfalling=n dim isflying=o dim count=var0 dim enemyx=p dim enemyy=q dim enemyflag=r dim edirx=s dim ediry=t dim mytemp3=u dim mytemp4=v dim mytemp3a=w dim mytemp4a=x dim enemychar=y dim nomove=z dim starthx=var1 dim starthy=var2 dim startex=var3 dim startey=var4 dim colorcycleflag=var5 dim hx=var6 dim hy=var8 dim ex=var10 dim ey=var14 dim pexplodeflag=var16 dim explodeframe=var18 dim playerdelay=var20 dim enexplodeflag=var22 dim enexplodeframe=var26 dim enemydelay=var30 dim screendata = $2200 rem the screen data size is 20*26 bytes = 480 bytes ($1E0 in hex) rem the next free RAM byte after screendata is $23E0 rem ** set our palettes based on automatic png->7800 color conversion... P4C1=walk2_top_color1:rem grey 3 P4C2=walk2_top_color2:rem grey 2 P4C3=walk2_top_color3:rem white P5C1=walk2_top_color4:rem grey 1 P5C2=walk2_top_color5: rem orange P5C3=walk2_top_color6-$10:rem blue P6C1=walk2_top_color7-$02 P6C2=walk2_top_color8:rem yellow P6C3=walk2_top_color9 P7C1=walk2_top_color10 P7C2=walk2_top_color11 P7C3=walk2_top_color12 rem ** one of the advantages of using different sprites for "top" and rem ** "bottom" is we can draw them in different palettes. This allows rem ** us to give our hero different colored pants. :) rem ** we need to let the 7800 know where the character set is resetlevel characterset level1_tileset count=0 enemyflag=0 rem level=9 colorcycleflag=0 pexplodeflag=0 explodeframe=0 rem ** now we setup the screen to the 7800 renders a character map rem ** from RAM... clearscreen gosub loadlevel plotmap screendata 0 0 2 20 23 0 0 40 plotmap screendata 0 80 2 20 23 20 0 40 characterset scorefont alphachars 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789();:{} ' plotchars 'PLAYER 1: (): 03' 4 0 0 plotchars '000000 {}: 000' 4 0 1 plotchars 'player 2; (); 03' 4 80 0 plotchars '000000 {}; 000' 4 80 1 rem characterset level1_tileset savescreen main restorescreen if pexplodeflag then gosub explodeplayer:goto donefalling if joy0fire1 && isfalling=0 then isflying=1:gosub flying:goto doneflying isflying=0 doneflying frame=frame+1 if (frame&7)=0 then walkframe=walkframe+1:if walkframe>9 then walkframe=0 if (frame&1) then goto joydone if joy0left && isfalling=0 then herodir=20:herox=herox-1:nomove=0:goto joydone if joy0right && isfalling=0 then herodir=0:herox=herox+1:nomove=0:goto joydone walkframe=3 : nomove=1:rem make our hero stand tall when he's not walking joydone gosub boundx rem ** see what character is underneath the hero... rem ** convert sprite coordinates to character coordinates... mytemp1=(herox+2)/4 : rem 2 is 160B character width, but x2 for doublewide mytemp1a=mytemp1+1 mytemp1b=mytemp1-1 mytemp2=heroy/8 : rem 8 is our zoneheight 4 is 160B character width, but x2 for doublewide mytemp2=mytemp2-1 : rem the block under our feet rem ** ... then make sure we don't try to read/write rem ** off-screen memory... if mytemp1>39 || mytemp2>25 then goto falling rem ** ...then read the character! herochar=peekchar(screendata,mytemp1,mytemp2,40,26) rem ** check if hero is on a block that needs to be painted... if herochar=4 then pokechar screendata mytemp1 mytemp2 40 26 8:pokechar screendata mytemp1a mytemp2 40 26 10:blockpaint=blockpaint+1 if herochar=6 then pokechar screendata mytemp1 mytemp2 40 26 10:pokechar screendata mytemp1b mytemp2 40 26 8:blockpaint=blockpaint+1 if herochar=20 then pexplodeflag=1:pokechar screendata mytemp1 mytemp2 40 26 0:pokechar screendata mytemp1a mytemp2 40 26 0 if herochar=22 then pexplodeflag=1:pokechar screendata mytemp1 mytemp2 40 26 0:pokechar screendata mytemp1b mytemp2 40 26 0 rem ** check if hero is on spikes. if so, make him jump in pain... rem if herochar=6 then heroy=heroy-4 rem ** if our hero is on a block, he isn't falling... if herochar>0 then heroy = heroy & %11111000:isfalling=0 : tsound 0,0,0,0:goto donefalling : rem check if character is blank falling if isflying then goto donefalling rem ** a simple no-physics fall routine if nomove=1 then goto checkbound if herodir=0 && herox>152 then herox=150:goto donecheckfall if herodir=20 then herox = (herox & %11111000) + 1 if herodir=0 then herox = (herox & %11111000) + 6 checkbound gosub boundx donecheckfall isfalling=1 heroy=heroy+2 if heroy>228 then pexplodeflag=1:goto donefalling mytemp2=heroy/8:mytemp2=mytemp2+10 mytemp3=mytemp2-8 tsound 0,mytemp3,12,2 donefalling if enexplodeflag then gosub explodeenemy:goto draweverything enemyflag=enemyflag+1 if enemyflag<3 then goto draweverything enemyflag=0 if enemyx>herox && enemyx-herox>2 then edirx=-1: goto ycheck if enemyx2 then edirx=1: goto ycheck edirx=0 ycheck mytemp1=heroy-5 if enemyy>mytemp1 && enemyy-mytemp1>2 then ediry=-1:goto enemydone if enemyy2 then ediry=1:goto enemydone ediry=0 enemydone mytemp3=(enemyx+2)/4 : rem 2 is 160B character width, but x2 for doublewide mytemp3a=mytemp3+edirx mytemp4=(enemyy-3)/8 : rem 8 is our zoneheight 4 is 160B character width, but x2 for doublewide mytemp4=mytemp4-1:rem correct for plotmap y-offset mytemp4a=mytemp4+ediry enemychar=peekchar(screendata,mytemp3a,mytemp4a,40,26) if enemychar=4 then goto draweverything if enemychar=6 then goto draweverything if enemychar=8 then goto draweverything if enemychar=10 then goto draweverything enemyx=enemyx+edirx enemyy=enemyy+ediry draweverything gosub drawhero gosub drawenemy collisioncheck if isfalling=1 then goto donecollisioncheck rem if enemyx-herox<-8 or enemyx-herox>8 then goto donecollisioncheck rem if enemyy-heroy<-16 or enemyy-heroy>16 then goto donecollisioncheck if edirx=0 && ediry=0 then pexplodeflag=1:goto donecollisioncheck rem if boxcollision(enemyx,enemyy,8,16,herox,heroy,8,16) then herodir=0:herox=0:heroy=182:enemyx=1:enemyy=100 if boxcollision(enemyx,enemyy,8,16,herox,heroy,8,16) then pexplodeflag=1:enexplodeflag=1 donecollisioncheck rem gosub updatescore colorcycleflag=colorcycleflag+1 if colorcycleflag<5 then goto donecolorcycle colorcycleflag=0 mytemp1=P0C3 mytemp2=P2C1 mytemp3=P2C3 P2C3=mytemp1 P0C3=mytemp2 P2C1=mytemp3 donecolorcycle drawscreen if blockpaint=totalpaint then level=level+1:clearscreen:gosub loadlevel goto main explodeplayer plotsprite explosion1_bottom 4 herox heroy explodeframe mytemp2=heroy-8 plotsprite explosion1_top 4 herox mytemp2 explodeframe playerdelay=playerdelay+1:if playerdelay<3 then goto doneexp playerdelay=0 explodeframe=explodeframe+2 if explodeframe=8 then pexplodeflag=0:playerdelay=0:explodeframe=0:herodir=0:herox=0:heroy=182 doneexp return explodeenemy plotsprite explosion1_bottom 4 enemyx enemyy enexplodeframe mytemp2=enemyy-8 plotsprite explosion1_top 4 enemyx mytemp2 enexplodeframe enemydelay=enemydelay+1:if enemydelay<3 then goto doneenexp enemydelay=0 enexplodeframe=enexplodeframe+2 if enexplodeframe=8 then enexplodeflag=0:enemydelay=0:enexplodeframe=0:enemyx=1:enemyy=100 doneenexp return boundx if herox>155 then herox=1 if herox<1 then herox=155 return flying rem ** stop player from flying past the top if heroy>23 then heroy=heroy-1 if heroy<24 then heroy=24:goto doneflyblockcheck rem ** see if our hero hits his head on a character rem ** see what character is underneath the hero... rem ** convert sprite coordinates to character coordinates... if herodir=0 then mytemp1=(herox+6)/4:gosub boundx:goto doneheadcheck mytemp1=(herox+2)/4 : rem 2 is 160B character width, but x2 for doublewide=set doneheadcheck if heroy=24 then mytemp2=heroy+2 if heroy>24 then mytemp2=heroy+6 mytemp2=mytemp2/8 : rem 8 is our zoneheight if heroy>24 then mytemp2=mytemp2-3 : rem the block above us rem if heroy=24 then mytemp2=mytemp2-2 herochar=peekchar(screendata,mytemp1,mytemp2,40,23) if herochar then isfalling=1:isflying=0:tsound 0,0,0,0 if herodir=0 then mytemp1a=mytemp1a+1:mytemp1b=mytemp1b+1 if herochar=4 then pokechar screendata mytemp1 mytemp2 40 26 8:pokechar screendata mytemp1a mytemp2 40 26 10:blockpaint=blockpaint+1 if herochar=6 then pokechar screendata mytemp1 mytemp2 40 26 10:pokechar screendata mytemp1b mytemp2 40 26 8:blockpaint=blockpaint+1 if herochar=20 then pexplodeflag=1:pokechar screendata mytemp1 mytemp2 40 26 0:pokechar screendata mytemp1a mytemp2 40 26 0 if herochar=22 then pexplodeflag=1:pokechar screendata mytemp1 mytemp2 40 26 0:pokechar screendata mytemp1b mytemp2 40 26 0 doneflyblockcheck tsound 0,mytemp2,8,2 return drawhero if pexplodeflag then goto donedrawhero if isflying=1 then goto drawflying mytemp1=herodir+walkframe plotsprite walk0_bottom 4 herox heroy mytemp1 mytemp2=heroy-8 plotsprite walk0_top 4 herox mytemp2 mytemp1 goto donedrawhero drawflying mytemp1=rand:if mytemp1<129 then mytemp1=1 if mytemp1>128 then mytemp1=0 if herodir=20 then goto drawflyingleft if nomove=1 then plotsprite fly_0_up_right_bottom 4 herox heroy mytemp1:mytemp2=heroy-8:plotsprite fly_up_right_top 4 herox mytemp2 0:goto donedrawhero plotsprite fly_0_right_bottom 4 herox heroy mytemp1:mytemp2=heroy-8:plotsprite fly_right_top 4 herox mytemp2 0:goto donedrawhero drawflyingleft if nomove=1 then plotsprite fly_0_up_left_bottom 4 herox heroy mytemp1:mytemp2=heroy-8:plotsprite fly_up_left_top 4 herox mytemp2 0:goto donedrawhero plotsprite fly_0_left_bottom 4 herox heroy mytemp1:mytemp2=heroy-8:plotsprite fly_left_top 4 herox mytemp2 0:goto donedrawhero donedrawhero return drawenemy if enexplodeflag then goto donedrawenemy mytemp1=rand:if mytemp1<129 then mytemp1=1 if mytemp1>128 then mytemp1=0 if enemychar=4 then mytemp1=0 if enemychar=6 then mytemp1=0 if enemychar=8 then mytemp1=0 if enemychar=10 then mytemp1=0 if edirx=-1 && ediry=-1 then mytemp3=0 if edirx=0 && ediry=-1 then mytemp3=2 if edirx=1 && ediry=-1 then mytemp3=4 if edirx=1 && ediry=0 then mytemp3=6 if edirx=1 && ediry=1 then mytemp3=8 if edirx=0 && ediry=1 then mytemp3=10 if edirx=-1 && ediry=1 then mytemp3=12 if edirx=-1 && ediry=0 then mytemp3=14 mytemp3=mytemp3+mytemp1 mytemp4=enemyy+5 mytemp2=enemyy-3 plotsprite missile1_nf_bottom 4 enemyx mytemp4 mytemp3 plotsprite missile1_nf_top 4 enemyx mytemp2 mytemp3 donedrawenemy return loadlevel rem ** some variables that should get reset when the level loads herox=80 heroy=0 blockpaint=0 isfalling=0 if level>11 then level=0 : rem ** limit the number of levels to 2 rem ** use memcpy to copy the ROM level into the block of RAM rem ** starting at our "screendata" variable... characterset scorefont gosub restorecolordata for inttemp1=0 to level P0C1=sread(colordata):rem Trap color dark P0C2=sread(colordata):rem pill color dark P0C3=sread(colordata):rem block color dark P1C1=sread(colordata):rem trap color medium P1C2=sread(colordata):rem coin color dark P1C3=sread(colordata):rem pill color medium P2C1=sread(colordata):rem block color medium P2C2=sread(colordata):rem trap color light P2C3=sread(colordata):rem block color light P3C1=sread(colordata):rem coin color medium P3C2=sread(colordata):rem pill color light P3C3=sread(colordata):rem coin color light next if level=0 then memcpy screendata level1 920:totalpaint=80:plotchars 'LEVEL 1: the foundation' 4 33 25:rem P0C1=$d0:P1C1=$d6:P2C2=$d8:P0C2=$82:P1C3=$84:P3C2=$88:P0C3=$42:P2C1=$46:P2C3=$48:P1C2=$02:P3C1=$06:P3C3=$0e if level=1 then memcpy screendata level2 920:totalpaint=75:plotchars ' LEVEL 2: the rafters' 4 29 25 if level=2 then memcpy screendata level3 920:totalpaint=50:plotchars 'LEVEL 3: fallout shelter' 4 29 25 if level=3 then memcpy screendata level4 920:totalpaint=50:plotchars 'LEVEL 4: teleport chamber' 4 24 25 if level=4 then memcpy screendata level5 920:totalpaint=50:plotchars 'LEVEL 5: the vault' 4 24 25 if level=5 then memcpy screendata level6 920:totalpaint=50:plotchars 'LEVEL 6: atlanta stopovers' 4 24 25 if level=6 then memcpy screendata level7 920:totalpaint=50:plotchars 'LEVEL 7: the arena' 4 24 25 if level=7 then memcpy screendata level8 920:totalpaint=50:plotchars 'LEVEL 8: the blind alley' 4 24 25 if level=8 then memcpy screendata level9 920:totalpaint=50:plotchars 'LEVEL 9: the construction room' 4 24 25 if level=9 then memcpy screendata level10 920:totalpaint=50:plotchars 'LEVEL 10: the lab' 4 24 25 if level=10 then memcpy screendata level11 920:totalpaint=50:plotchars 'LEVEL 11: the cobra' 4 24 25 if level=11 then memcpy screendata level12 920:totalpaint=50:plotchars 'LEVEL 12: the staircase' 4 24 25 return topscreenroutine rem ** topscreenroutine is called by the display interrupt every rem ** frame. This is where we can change the display as it's being rem ** drawn, 2600 style. rem ** This technique may not work right if you completely max out rem ** the number of objects that Maria can display. rem ** rem ** We hit the WSYNC register to skip/complete scanlines. rem ** Any register changes must immediately follow the previous WSYNC, rem ** or else the changes will show up mid-scanline. rem ** rem ** You shouldn't use the temp1-temp9 variables for these routines. rem ** Instead you can use the interupt-safe inttemp1-inttemp6 variables. rem ** rem ** Similarly, you should avoid writing to your own important game rem ** game variables during this routine. WSYNC=1 : BACKGRND=$01 rem ** skip over the 320A text area... for inttemp1=0 to 15 WSYNC=1 next rem ** go to 160A WSYNC=1 : BACKGRND=$00 return restorecolordata sdata colordata=C $01,$42,$12,$a4,$22,$48,$14,$aa,$1a,$26,$4b,$2e, $50,$c2,$82,$46,$12,$c4,$84,$48,$88,$16,$c8,$1e, $30,$b2,$72,$36,$92,$b4,$76,$38,$78,$96,$b8,$9e, $30,$62,$22,$36,$92,$64,$26,$38,$28,$96,$68,$9e, $80,$22,$b2,$86,$02,$24,$b6,$88,$b8,$06,$28,$0e, $b0,$96,$62,$b6,$02,$98,$63,$b8,$64,$06,$9a,$0e, $30,$46,$82,$36,$12,$48,$84,$38,$86,$16,$4a,$1e, $00,$16,$f2,$06,$22,$18,$f4,$08,$f6,$26,$1a,$2e, $b4,$36,$54,$b6,$12,$38,$56,$b8,$58,$16,$3a,$1e, $b4,$02,$08,$b6,$92,$04,$0a,$b8,$0c,$94,$06,$96, $30,$46,$62,$36,$f2,$48,$66,$38,$68,$f6,$4a,$fe, $50,$96,$b2,$56,$32,$98,$b6,$58,$b8,$36,$9a,$3e, $255 end return rem ** our tile graphics only have 4x double-wide characters. We'll rem ** assign some letters to these so our alphadata looks nice. alphachars ' .bBcCdDeEfFgGhH' alphadata level1 level1_tileset ' ' ' ' 'bBbBbB bBbBbBbB bBbBbBbBbB bBbBbB' ' dD ' ' ' ' ' ' bBbBbB bBbBfFbBbB bBbBbBbB ' ' ' ' ' ' dD ' 'bBbBbB bBbBbB bBbBbBbBbB bBbBbBbBbB' ' ' ' ' ' dD ' ' bBbB bBbBbBbBbB bBbBbB bBbB ' ' ' ' ' ' ' ' bBbB bBbBbBbB bBfFbBbB ' ' ' ' ' ' ' 'bBfFbBbBbBbBbBbBbBfFbBbBbBbBbBbBbBfFbBbB' end alphadata level2 level1_tileset ' ' ' ' 'bBbBdDbBbB bBbBdDbBbB bBbBdDbBbB bBbB' ' ' ' ' ' ' 'bBbBbBbB bBbBbBbB bBbBfFbB bBbB' ' ' ' ' ' ' ' bBbBbBbB bBfFbBbB bBbBbBbB ' ' ' ' ' ' ' ' bBbBbBbB bBbBbBbB bBbBbBbB ' ' dD ' ' ' ' ' ' bBfFbBbB bBbBbBbB bBbBbBbB ' ' ' ' ' ' ' 'bBbB bBbBbBbB bBbBbBbB bBbBbBbB' end alphadata level3 level1_tileset ' ' ' ' ' ' ' bBbB bBbB bBbB bBbB ' ' dD ' ' ' ' bBbB bBbBfFbB bBbB ' ' ' ' dD ' ' bBbB bBbB bBbB ' ' ' ' ' ' bBbB bBbB ' ' ' ' ' ' bBbBbBbB ' ' ' ' ' ' bBbB gG gG gG ' ' ' ' ' 'bBbBbBbBbBbBbBbBbBfFbBbBbBbBbBbBbBbBbBbB' ' ' end alphadata level4 level1_tileset ' ' ' ' ' bBhHbBbB bBbBbBbB bBbBbBbB ' ' ' ' ' ' ' 'bBbB bBbBbBbBbB bBbBbBbBbB bBbB' ' ' ' ' ' ' ' bBbBbBbB bBbBbBbB bBbBbBbB ' ' ' ' ' ' ' 'bBbB bBbBbBbBbB bBbBbBbBbB bBbB' ' ' ' ' ' ' ' bBbBbBbB bBbBhHbB bBbBbBbB ' ' ' ' ' ' ' 'bBbBbBhHbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbB' end alphadata level5 level1_tileset ' gG cCcCcCcC gG ' ' ' ' ' 'bBbBbBbBbBbBbB dDbBbBbBbBbBbBbBbb' ' ' ' ' ' ' 'bBbBbBbB gG bBbB' ' ' ' ' ' bBbBbBbB ' 'bBbB bBbB' ' ' ' ' ' bBfFbBbBbBbBfFbBbB ' ' ' ' ' ' dD dD bBbB' ' ' ' dD bBbBbBhHbBbBbB ' ' ' ' ' 'bBbBbBfFbB bBfFbBbBbB' end alphadata level6 level1_tileset ' cC ' ' ' ' bBbBbBbBbBbBbB bBbBbBbBbBbBbBbB ' ' ' ' cC ' ' bBbBbBbBbBbB bBbBbBbBbBbBbB ' ' ' ' ' ' cC ' ' bBbBbBfFbBbB bBbBbBbBbBbBbB ' ' ' ' ' ' cC ' ' bBbBbBbBbBbB bBbBbBbBbBbBbB ' ' ' ' ' ' cC ' ' bBbBbBbBbBbB bBbBbBbBbBbBbB ' ' ' ' ' ' cC ' 'bBbBbBbBbBbBbB bBbBbBbBbBbBfFbB' ' bB bB ' end alphadata level7 level1_tileset ' ' ' ' 'bBbBbBbBbBbBbB bBbBbBbB bBbBbBbBbBbBbB' ' ' ' ' ' ' ' bBbB bBbB ' ' ' ' ' ' bBbBbBbB bBbBbBbB ' 'bB bB' ' gG gG gG ' ' ' 'bBbB bBbB' ' ' ' bBbB bBbB ' ' ' ' ' ' bBbBbBbB bBbBbBbB ' ' dD dD ' ' ' ' ' 'bBbBfFbBbBbB bBbBbBbBbBbB bBbBbBfFbBbB' end alphadata level8 level1_tileset ' ' ' ' ' bBbBbBhHbBbBbBbBbBbBbBbBhHbBbBbB ' ' ' ' ' ' bBbB ' 'bBbB bBbB ' ' ' ' bBbB ' ' ' ' bBbB ' ' bBbB ' ' bBfF ' 'bBbB bBbB ' ' ' ' ' ' bBbB ' ' ' ' ' 'bB bBbBbBbBbBbBbB bBbBbBbBbBbBbB bB' ' gG gG gG ' ' ' ' bBbBbBcC cCbBbBbBbBbBbBbB cCbBbBbB' end alphadata level9 level1_tileset ' ' ' ' 'bBbBbB bBbBbB' ' bBbBbBbB bBbBbBbB ' ' bBbB bBbB ' ' ' ' ' ' bBbBbBfFbBbB ' ' bBbB bB bB bBbB ' 'bBbBbB bBbBbB' ' hH dD ' ' ' ' bBbB bBbB ' ' bBbBbBbB bBbBbBbB ' ' bBbBbBbBbBbB ' ' dD ' ' ' ' bBbBbBfFbBbB ' ' bBbBbBbB bBbBbBbB ' 'bBbBbB bBbBbB' ' hH ' ' bBbBbBbBbBbB bBbBbBbBbBbBbB ' ' ' end alphadata level10 level1_tileset ' dD ' ' ' 'bB bBbB bB' ' dD ' ' bBbB bBbB bBbB bBbB ' ' ' ' bBbB bBbB ' 'bBbB gGgGgGgG bBbB' ' bBbB bBbB ' ' ' ' bBbB bBbB bBbB ' ' ' ' bBbB bBbB ' 'bBbB eE bBbB' ' bBbB bBbB ' ' ' ' bBbB bBbB bBbB bBbB ' ' ' ' ' ' bBbBbBfFbBbBbBfFbBbBbBbBbBbB ' 'dD ' 'bB bB' ' ' end alphadata level11 level1_tileset ' ' ' ' ' bBbB ' ' ' ' bBbBbBbBbBbB bBbBbBbBbBbB ' ' ' ' ' ' bBbBbBbBbB bBbBbBbBbB ' ' dD ' ' ' ' bBbBbBbB bBbBbBfF ' ' ' ' ' ' bBbBbB bBbBbB ' ' ' ' ' ' bBbB bBbB ' ' ' ' ' ' bB bB ' 'bBbB dD bBbB' ' bB bB ' ' bBbBfFbBbBbB bBbBbBbBbBbB ' end alphadata level12 level1_tileset ' ' ' ' ' bBbBbB ' 'bBbBbBbBbBbB bBbBbBbBbBbB' ' ' ' ' ' ' 'bBbBbBbBbB dD bBbBbBbBbBbBbB' ' ' ' ' ' ' 'bBbBbBbB bBbBbBbBbBbBbBbB' ' hH ' ' ' ' ' 'bBbBbB bBbBbBfFbBbBbBbBbB' ' ' ' ' ' ' 'bBbB bBbBfFbBbBbBbBbBbBbB' ' dD ' ' ' 'bB bBbBbBbBbBbBbBbBbBbBbB' end