From 0652503fbc2c27b6f06719666488c9dc20447b34 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Fri, 19 Apr 2024 01:41:52 -0400 Subject: [PATCH] keen: more work on generic engine --- games/keen/Makefile | 52 ++++-- games/keen/level2.s | 295 +++------------------------------ games/keen/level2_orig.s | 287 ++++++++++++++++++++++++++++++++ games/keen/level3.s | 37 +++++ games/keen/loader.s | 2 + games/keen/maps/level1_map.png | Bin 7449 -> 10611 bytes games/keen/maps/level3_map.png | Bin 14261 -> 14051 bytes games/keen/mars.s | 4 +- 8 files changed, 389 insertions(+), 288 deletions(-) create mode 100644 games/keen/level2_orig.s create mode 100644 games/keen/level3.s diff --git a/games/keen/Makefile b/games/keen/Makefile index 1afee0ca..0a513f40 100644 --- a/games/keen/Makefile +++ b/games/keen/Makefile @@ -11,7 +11,8 @@ EMPTY_DISK = ../../empty_disk/empty.dsk all: keen1_lores.dsk -keen1_lores.dsk: HELLO LOADER TITLE ENGINE MARS LEVEL1 +keen1_lores.dsk: HELLO LOADER TITLE ENGINE MARS \ + LEVEL1 LEVEL2 LEVEL3 cp $(EMPTY_DISK) keen1_lores.dsk $(DOS33) -y keen1_lores.dsk SAVE A HELLO $(DOS33) -y keen1_lores.dsk BSAVE -a 0x1000 LOADER @@ -19,7 +20,8 @@ keen1_lores.dsk: HELLO LOADER TITLE ENGINE MARS LEVEL1 $(DOS33) -y keen1_lores.dsk BSAVE -a 0x4000 ENGINE $(DOS33) -y keen1_lores.dsk BSAVE -a 0x4000 MARS $(DOS33) -y keen1_lores.dsk BSAVE -a 0x6000 LEVEL1 -# $(DOS33) -y keen1_lores.dsk BSAVE -a 0x2000 LEVEL2 + $(DOS33) -y keen1_lores.dsk BSAVE -a 0x6000 LEVEL2 + $(DOS33) -y keen1_lores.dsk BSAVE -a 0x6000 LEVEL3 ### @@ -67,6 +69,26 @@ level1.o: level1.s \ maps/level1_map.zx02 ca65 -o level1.o level1.s -l level1.lst +#### + +LEVEL2: level2.o + ld65 -o LEVEL2 level2.o -C ../../linker_scripts/apple2_6000.inc + +level2.o: level2.s \ + maps/level2_map.zx02 + ca65 -o level2.o level2.s -l level2.lst + +#### + +LEVEL3: level3.o + ld65 -o LEVEL3 level3.o -C ../../linker_scripts/apple2_6000.inc + +level3.o: level3.s \ + maps/level3_map.zx02 + ca65 -o level3.o level3.s -l level3.lst + + + #### ENGINE: engine.o @@ -85,19 +107,19 @@ engine.o: engine.s zp.inc hardware.inc \ #### -LEVEL2: level2.o - ld65 -o LEVEL2 level2.o -C ../../linker_scripts/apple2_2000.inc - -level2.o: level2.s zp.inc hardware.inc \ - text_help.s gr_fast_clear.s text_quit_yn.s text_drawbox.s \ - level1_enemies.s level1_items.s \ - graphics/keen_graphics.inc sprites/keen_sprites.inc \ - maps/level2_map.zx02 \ - status_bar.s draw_keen.s move_keen.s gr_putsprite_crop.s \ - draw_tilemap.s tilemap_lookup.s \ - level1_sfx.s longer_sound.s level2_data.inc \ - keyboard.s handle_laser.s - ca65 -o level2.o level2.s -l level2.lst +#LEVEL2: level2.o +# ld65 -o LEVEL2 level2.o -C ../../linker_scripts/apple2_2000.inc +# +#level2.o: level2.s zp.inc hardware.inc \ +# text_help.s gr_fast_clear.s text_quit_yn.s text_drawbox.s \ +# level1_enemies.s level1_items.s \ +# graphics/keen_graphics.inc sprites/keen_sprites.inc \ +# maps/level2_map.zx02 \ +# status_bar.s draw_keen.s move_keen.s gr_putsprite_crop.s \ +# draw_tilemap.s tilemap_lookup.s \ +# level1_sfx.s longer_sound.s level2_data.inc \ +# keyboard.s handle_laser.s +# ca65 -o level2.o level2.s -l level2.lst #### diff --git a/games/keen/level2.s b/games/keen/level2.s index 5b9082f3..e6076665 100644 --- a/games/keen/level2.s +++ b/games/keen/level2.s @@ -1,287 +1,40 @@ -; Keen PoC Level 2 (First Shrine) +; Level 2 (First Shrine) -; by deater (Vince Weaver) +; at $6000 -; Zero Page - .include "zp.inc" - .include "hardware.inc" - .include "common_defines.inc" +level2_data: +.byte 20 ;MAX_TILE_X = 116 ; 116 wide +.byte 26 ;MAX_TILE_Y = 16 ; 16 tall - .include "level2_data.inc" +.byte 1 ;START_KEEN_TILEX = 1 +.byte 13 ;START_KEEN_TILEY = 13 +.byte 0 ;START_TILEMAP_X = 0 +.byte 5 ;START_TILEMAP_Y = 5 -level2_start: - ;=================== - ; init screen +.byte 0 ;NUM_ENEMIES = 8 - bit KEYRESET +.byte 32 ;HARDTOP_TILES = 32 ; start at 32 +.byte 40 ;ALLHARD_TILES = 40 ; start at 40 - bit SET_GR - bit PAGE1 - bit LORES - bit FULLGR - jsr clear_top ; avoid grey stripes at load +.align $100 - ;===================== - ; init vars - ;===================== - - lda #0 - sta ANIMATE_FRAME - sta FRAMEL - sta FRAMEH - sta KEEN_WALKING - sta KEEN_JUMPING - sta LEVEL_OVER - sta LASER_OUT - sta KEEN_XL - sta KEEN_FALLING - sta KEEN_SHOOTING - sta KEYCARDS - sta ORACLE_SPOKEN - - ; debug - -; lda #9 -; sta RAYGUNS - - lda #4 - sta DRAW_PAGE - - ; set starting location - - lda #START_KEEN_TILEX - sta KEEN_TILEX - lda #START_KEEN_TILEY - sta KEEN_TILEY - - lda #0 ; offset from tile location - sta KEEN_X - sta KEEN_Y - - lda #RIGHT ; direction - sta KEEN_DIRECTION - - - ;==================================== - ; load level1 tilemap - ;==================================== - - lda #level1_data_zx02 - sta ZX0_src+1 - lda #$90 ; load to page $9000 - jsr full_decomp - - ;==================================== - ; copy in tilemap subset - ;==================================== - ; we copy in full screen, 40x48 = 20x12 tiles - ; we start out assuming position is 0,5 - - lda #START_TILEMAP_X - sta TILEMAP_X - lda #START_TILEMAP_Y - sta TILEMAP_Y - - jsr copy_tilemap_subset - - ;==================================== - ;==================================== - ; Main loop - ;==================================== - ;==================================== - -keen_loop: - - ; draw tilemap - - jsr draw_tilemap - - ; draw enemies - - jsr draw_enemies - - ; draw laser - - jsr draw_laser - - ; draw keen - - jsr draw_keen - - jsr page_flip - - jsr handle_keypress - - jsr move_keen - - jsr move_enemies - - jsr move_laser - - - ;======================== - ; increment frame count - ;======================== - - inc FRAMEL - bne no_frame_oflo - inc FRAMEH -no_frame_oflo: - - ;=========================== - ; check end of level - ;=========================== - - lda LEVEL_OVER - bne done_with_keen - - ;=========================== - ; delay - ;=========================== - -; lda #200 -; jsr WAIT - - - jmp keen_loop - - -done_with_keen: - bit KEYRESET ; clear keypress - - ; three reasons we could get here - ; NEXT_LEVEL = finished level by exiting door - ; GAME_OVER = hit ESC and said Y to QUIT - ; TOUCHED_ENEMY = touched an enemy - - lda LEVEL_OVER - cmp #NEXT_LEVEL - beq level1_levelover - - cmp #GAME_OVER - beq level1_gameover - - ; got here, touched enemy - - - ;============================ - ; end animation - ;============================ - - lda #1 - sta PLAY_END_SOUND - - inc KEEN_TILEY ; move down - - sec - lda KEEN_TILEX - sbc TILEMAP_X - asl - clc - adc KEEN_X - sta XPOS - - sec - lda KEEN_TILEY - sbc TILEMAP_Y - asl - asl - clc - adc KEEN_Y - sta YPOS - -level_end_animation: - jsr draw_tilemap - - ldx #keen_sprite_squish - stx INL - sta INH - jsr put_sprite_crop - - jsr page_flip - - lda PLAY_END_SOUND - beq skip_end_sound - - ldy #SFX_KEENDIESND - jsr play_sfx - - dec PLAY_END_SOUND -skip_end_sound: - - - lda #50 - jsr WAIT - - dec YPOS - dec YPOS - - bpl level_end_animation - - - dec KEENS - bpl level1_levelover - -level1_gameover: - - ; mars plays the sound - - lda #GAME_OVER - sta LEVEL_OVER - -level1_levelover: - - lda #LOAD_MARS - sta WHICH_LOAD - - rts ; exit back - - - ;========================== - ; includes - ;========================== - - .include "text_print.s" - .include "gr_offsets.s" - .include "gr_fast_clear.s" - .include "gr_pageflip.s" - .include "gr_putsprite_crop.s" - .include "zx02_optim.s" - - .include "status_bar.s" - .include "keyboard.s" - .include "joystick.s" - - .include "text_drawbox.s" - .include "text_help.s" - .include "text_quit_yn.s" - - .include "draw_keen.s" - .include "sprites/keen_sprites.inc" - .include "move_keen.s" - .include "handle_laser.s" - .include "draw_tilemap.s" - .include "level1_enemies.s" - .include "level1_items.s" - - .include "level1_sfx.s" - .include "longer_sound.s" - - .include "random16.s" - - .include "tilemap_lookup.s" - -level1_data_zx02: - .incbin "maps/level2_map.zx02" +; at $6100 +enemy_data: +.byte $0 +.align $100 +; at $6200 oracle_message: ; 012345678901234567890123456789012345678 .byte 2,21,"YOU HEAR IN YOUR MIND:",0 .byte 2,22,"IT IS TOO BAD THAT YOU CANNOT READ",0 .byte 2,23,"THE STANDARD GALACTIC ALPHABET, HUMAN",0 + +.align $100 + +; at $6300 +level2_data_zx02: + .incbin "maps/level2_map.zx02" diff --git a/games/keen/level2_orig.s b/games/keen/level2_orig.s new file mode 100644 index 00000000..5b9082f3 --- /dev/null +++ b/games/keen/level2_orig.s @@ -0,0 +1,287 @@ +; Keen PoC Level 2 (First Shrine) + +; by deater (Vince Weaver) + +; Zero Page + .include "zp.inc" + .include "hardware.inc" + .include "common_defines.inc" + + .include "level2_data.inc" + + +level2_start: + ;=================== + ; init screen + + bit KEYRESET + + bit SET_GR + bit PAGE1 + bit LORES + bit FULLGR + + jsr clear_top ; avoid grey stripes at load + + ;===================== + ; init vars + ;===================== + + lda #0 + sta ANIMATE_FRAME + sta FRAMEL + sta FRAMEH + sta KEEN_WALKING + sta KEEN_JUMPING + sta LEVEL_OVER + sta LASER_OUT + sta KEEN_XL + sta KEEN_FALLING + sta KEEN_SHOOTING + sta KEYCARDS + sta ORACLE_SPOKEN + + ; debug + +; lda #9 +; sta RAYGUNS + + lda #4 + sta DRAW_PAGE + + ; set starting location + + lda #START_KEEN_TILEX + sta KEEN_TILEX + lda #START_KEEN_TILEY + sta KEEN_TILEY + + lda #0 ; offset from tile location + sta KEEN_X + sta KEEN_Y + + lda #RIGHT ; direction + sta KEEN_DIRECTION + + + ;==================================== + ; load level1 tilemap + ;==================================== + + lda #level1_data_zx02 + sta ZX0_src+1 + lda #$90 ; load to page $9000 + jsr full_decomp + + ;==================================== + ; copy in tilemap subset + ;==================================== + ; we copy in full screen, 40x48 = 20x12 tiles + ; we start out assuming position is 0,5 + + lda #START_TILEMAP_X + sta TILEMAP_X + lda #START_TILEMAP_Y + sta TILEMAP_Y + + jsr copy_tilemap_subset + + ;==================================== + ;==================================== + ; Main loop + ;==================================== + ;==================================== + +keen_loop: + + ; draw tilemap + + jsr draw_tilemap + + ; draw enemies + + jsr draw_enemies + + ; draw laser + + jsr draw_laser + + ; draw keen + + jsr draw_keen + + jsr page_flip + + jsr handle_keypress + + jsr move_keen + + jsr move_enemies + + jsr move_laser + + + ;======================== + ; increment frame count + ;======================== + + inc FRAMEL + bne no_frame_oflo + inc FRAMEH +no_frame_oflo: + + ;=========================== + ; check end of level + ;=========================== + + lda LEVEL_OVER + bne done_with_keen + + ;=========================== + ; delay + ;=========================== + +; lda #200 +; jsr WAIT + + + jmp keen_loop + + +done_with_keen: + bit KEYRESET ; clear keypress + + ; three reasons we could get here + ; NEXT_LEVEL = finished level by exiting door + ; GAME_OVER = hit ESC and said Y to QUIT + ; TOUCHED_ENEMY = touched an enemy + + lda LEVEL_OVER + cmp #NEXT_LEVEL + beq level1_levelover + + cmp #GAME_OVER + beq level1_gameover + + ; got here, touched enemy + + + ;============================ + ; end animation + ;============================ + + lda #1 + sta PLAY_END_SOUND + + inc KEEN_TILEY ; move down + + sec + lda KEEN_TILEX + sbc TILEMAP_X + asl + clc + adc KEEN_X + sta XPOS + + sec + lda KEEN_TILEY + sbc TILEMAP_Y + asl + asl + clc + adc KEEN_Y + sta YPOS + +level_end_animation: + jsr draw_tilemap + + ldx #keen_sprite_squish + stx INL + sta INH + jsr put_sprite_crop + + jsr page_flip + + lda PLAY_END_SOUND + beq skip_end_sound + + ldy #SFX_KEENDIESND + jsr play_sfx + + dec PLAY_END_SOUND +skip_end_sound: + + + lda #50 + jsr WAIT + + dec YPOS + dec YPOS + + bpl level_end_animation + + + dec KEENS + bpl level1_levelover + +level1_gameover: + + ; mars plays the sound + + lda #GAME_OVER + sta LEVEL_OVER + +level1_levelover: + + lda #LOAD_MARS + sta WHICH_LOAD + + rts ; exit back + + + ;========================== + ; includes + ;========================== + + .include "text_print.s" + .include "gr_offsets.s" + .include "gr_fast_clear.s" + .include "gr_pageflip.s" + .include "gr_putsprite_crop.s" + .include "zx02_optim.s" + + .include "status_bar.s" + .include "keyboard.s" + .include "joystick.s" + + .include "text_drawbox.s" + .include "text_help.s" + .include "text_quit_yn.s" + + .include "draw_keen.s" + .include "sprites/keen_sprites.inc" + .include "move_keen.s" + .include "handle_laser.s" + .include "draw_tilemap.s" + .include "level1_enemies.s" + .include "level1_items.s" + + .include "level1_sfx.s" + .include "longer_sound.s" + + .include "random16.s" + + .include "tilemap_lookup.s" + +level1_data_zx02: + .incbin "maps/level2_map.zx02" + + +oracle_message: + ; 012345678901234567890123456789012345678 + .byte 2,21,"YOU HEAR IN YOUR MIND:",0 + .byte 2,22,"IT IS TOO BAD THAT YOU CANNOT READ",0 + .byte 2,23,"THE STANDARD GALACTIC ALPHABET, HUMAN",0 diff --git a/games/keen/level3.s b/games/keen/level3.s new file mode 100644 index 00000000..053efa73 --- /dev/null +++ b/games/keen/level3.s @@ -0,0 +1,37 @@ +; Level 3 (Treasury) + +; at $6000 + +level3_data: +.byte 116 ;MAX_TILE_X = 116 ; 116 wide +.byte 16 ;MAX_TILE_Y = 16 ; 16 tall + +.byte 1 ;START_KEEN_TILEX = 1 +.byte 13 ;START_KEEN_TILEY = 13 + +.byte 0 ;START_TILEMAP_X = 0 +.byte 5 ;START_TILEMAP_Y = 5 + +.byte 8 ;NUM_ENEMIES = 8 + +.byte 32 ;HARDTOP_TILES = 32 ; start at 32 +.byte 40 ;ALLHARD_TILES = 40 ; start at 40 + + +.align $100 + +; at $6100 +enemy_data: +.byte $0 + +.align $100 + +; at $6200 +oracle_message: +.byte $0 + +.align $100 + +; at $6300 +level1_data_zx02: + .incbin "maps/level3_map.zx02" diff --git a/games/keen/loader.s b/games/keen/loader.s index c6795026..7039d25b 100644 --- a/games/keen/loader.s +++ b/games/keen/loader.s @@ -211,6 +211,8 @@ keen1_filename: .byte "LEVEL1",0 keen2_filename: .byte "LEVEL2",0 +keen3_filename: + .byte "LEVEL3",0 ;=================================================== diff --git a/games/keen/maps/level1_map.png b/games/keen/maps/level1_map.png index 2b9b96a3c7347b8da800bbb2f629a148b19b431b..a7849758502a6a04a2ae498af4d0f77e76eadf9a 100644 GIT binary patch delta 5400 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 delta 2380 zcmZWqdsNct7R4E-Ov_j0E6Z0Fn3@kVWdcUXOiUrbNHfg`7#gDZNJ(X;e2rP^_$#Fh zha4nPF*PF}=`A%2E1PlDw3H@?&`g;`Bt>hO?rp7m*InnYv(Gte?|s%;->1N{Va0YV zP%o2sG#MXp+B$(jr%+Fkt&`Ie$kyaEDg^{e8>8X8jk~RNI@ARSEv?O!QCE_ykyDEH zHP?Qmc}$*tcSq~~`}D5+Rp+YK1oSeVutD`9tv0TVTcvi>k9G=-i{9c5sMUqw{MTp6 zMTx_G=ggzfmz@tRTHe2{8w77!HA`n9x8JSe$h&Xo+eMhZb~%YKk;Y14_fwzgDmKDu z>S>?G^=^xHuK1Q4{D?YH@@~UHq{S~bhZD+NzwXREqjkO~A~)ydEY&tc>#y!$Q*GNv z4?!TUY$_U!^FyP*IMVp2$Si>$?8a@%!44MS9rP)Ni8}ae@2=ZkWVPt}+%SyIIkNRo z*z($dke@c0`rd1K^=cq;=w5FyX)Vdya78OIH36SoVl4O9b&AYLNVk&RO}ZmTe0TCl zd3?_6@8h3SVC>?i)}R{IW}EDq{e=#X1y3F^bUSBewrO=rdebg{x{D-rT^5-c7Uxga zQO0_<^tfM5y`VreKE$vJ4rB!Gi@=}jDGDXQvnE56gI}?)v;77(p6|goo*#0i*b{bg zc3g~Y^Ik#?M_o{u#N5Tl%p#Wb?9!vi>=~ln!AK+jVjFLttz_Z}y94ds1v$`bJ2O_g zh2cBOFhVyoFB4pjey{S}r+f0zkenL7-H@L^%rHw?)cUFMZ$elb`j!x>6~pTcGu8+T zFLsS-Q;>f2h z21TDdQnTgND?_v0_{Fw?c6FOjs6Vx*r>g4I+;pIdjyF@}MZhNCWJ={vG z4fz|~_PRl#d)!=HH32ORF-p{RA-cH0pnGBNuBAgp+y5(V{@NJ&O|ymB2_5ZO6K+Fk zmUZ}gUG3dg(8;L=5J)GndD?nhi`6`>ucp@qInw)9FZPv{9kne2ldN7pyk2N29{lY+ zwH5YyI5|%zLYvWr9C%aI2W6TMwJhPS>t6;T)C|-Ag@L<@FDjSa%4*W`#nP9&SgaDa^E&?EU5gC_F?R=rRnlT^wx z9^dFCiUs^l;`H36tj9OV3jhz}rNRvtnYVnv1S|KJ$a-8$Yig`C+s7p2#Qzm+!zp%XJ z6^Pp#&WXR>70TcpLgJQIzl9-H>du(_o2O#qSL@FsXm7VI)g`fnfUpjGR0%;<4!@G87PWoZkD5aG(9 zEwv3FXR^LMF92i)DTvF@TKWSvraHif?6~h{;Nk6vo|v$sSoZHE_ptUAcVN}ho0g9m zC0V7-GQ%_fe7%c@OBH3Qf93qukogM+0@RPtk*wvhR`vB-z`Pr&dSH;GuI-o670lzx zt^l~ScxK9!0GauL=?Eb6hT7{+cwL&GUs4Opm0>q)`0rwmiTMIR>A8+PQ65Rajt<=h zutAWVrgqofY7XOJ=VHw+vf5iJ*>gSM;5<{D%B@R<)l%w2l$!xFjdS(0)OL@lVOC6? z+-zjw<6BYh?tAbQUdQd$1BA`3mZ_B(Ufqrl6v8H@Vn;x&zVn#}XW-J7iTNX4!3N|( zb*7#dM4i!e*T4%Bw|rj2|w!d8nKUpjvO$ zGof?sgF68AScH#Sm#hr?G)!Psb8n7}EQ|^i)v(cp=F_T+uA_@)fJpsBk#PJU8WSx} z3eRx>Sw)zeCJv@e7r(I-%g^s(dRfTLeC_p<8UPdoAm~a}*o*6Ung>IZomM~&j5Ar1 z_{r@6%8QFL@u|qhgL4>uT*vRg-e4n)Atu{6+nB4Z3D$lM!j7}(`hfize->v8SOYrt zI`*h_n)ng-e*o%$?QGRK%>ULtw|{B=GS9+RNq+U_X>em;Twg{Tu} F{{|6Cfe`=z diff --git a/games/keen/maps/level3_map.png b/games/keen/maps/level3_map.png index 2544a405d62d710d77656032e5ab99a8badbf78d..b8659fc3d5248a35a8304e13f2a520d1974b47d2 100644 GIT binary patch delta 8853 zcmYjVcRZWX*H^TqRTQmN)E0^oBh;u}L5vtxt4h?~qei6mt`#&SMvS0FQPgfri&(Yy z7Ne-vXllRd?|na?_xJp9pXZ+Yz2|(+xo6#{-ec7*g%9BvWc<|E$Tr}X%LN*5o$#dkDX-WDn3f9K-2TO{|LFxr|B!^F&ch zWj#-n$YMG%H~uVM`gJP*EgyMNifv1p;IZ)=OBECk3h7usc=Yw;EVNxS>DY(Zc&ZZG z+HZMta=#rhJR7X1{1c({Yc*S-dMzvL>=n zB=5?4OXZa2q)p@dowiV=%jmGYrH=Ua(+i27$&PmnZM<_22|$iROW-mwo;9myy~RaE+}xtoSf7FIc~0D0lj6MUp||P)Vrk@4&A<34o9voKK%6 z;FBLlDlJCr(U!}aKl1ASN`&yjM*N_9f&;$kijx=_or-ByQ|q->pFsCN*uXWtpA1cF zkLD{7FeFr7dqIE3rB`_}E!RnFZW&bxJkVCiW{luh+V5Um)>rnd&Qb+)_FXu<^&{+j zc3{nwyBx5y=bP6zAW;8G-mA9Bom9Q{wQz@Dl4>U?=4sl+S4x7m@3PABNv6)o0qbje ziTd|%jeE$BZ2;fvI5#zBIao{)~MdS=ZRIe(i3x^UQUX(xXr_p74?+}pSW-c z4#o3CpeUeFXxNRk`G37{!-0xMy`Q2Yv2pl?e0IJ^78stg-S&j2mUcJFB?%ebDNd>=WGuCSWUb^G!~rO?^LSNIX^I7TsM=7yeF^|cR8?CT>MsNOl&gV{_=STgPD3%_iwEMFO?M=f>^OM>f zYWavKdpKZYB}Wn;_-6iVeRf^}={GgxoBfg#o#_t0=y?L;S&;_16i z=ER>C#_r;cmE-1NoWHtWEhQ`6Elh=}E_z%a&uT@R)8$i(IG*;LpVh29uD5cl`^7^$XVopZA(Ntq5JZ%9@{mW_l24cJ3c+0B&8e%VX!+K`p zU@~QG@(J8?(!hV(0kJ)m3Qij5!IOpF#DU3X3Cr+9vo|_1xnA{{Z zDQ<6ED@&Ch!t8Bxzlvl-*nMt?KWQO`UP-_?adeKyHB`PfBGgkcJ{@Dk8&uAnNDz-Bub zJRuICM&vM_N(*)rsTToFU-T_8qI_tmM*z=ahs;;kUN)z4tw(&D#?T{XGjX>Zzr&<% zvX&GVe~#Fw$|$rFd2-a!3B3FxP3^cIzgdv-KuM(K)?N1B>)Pz4ZR4%n?Mc==9Z@}; z!$pO=9N$u8gb8+cAL){{X*a~_+e+9q27NcPfEh8CVNhkaO^hVh7ZObM0e3J!Dxksc zmE;9W=%;1> znUnF7n{fZeS`qRiJbg5*^ozpbcsjF7rIVETld)T;#`Edd9>?8jK}crC6;grookKkB z_abU5rKD#p$Z`^l2c`Np%(e2BN}Kma6&@M1y}tJM-ZLHZirAi?w`%eOxgL+Gc<^5V zCO=7-!+74zPzS->O9Mng;;Jh`p7Zeh1WEa-?0%-PoRjmurEINWR`aH4dST!6CI8sm zJ*Edc)bF@P^?CrxLGlQ?E0Jx;0PgQhu8;o^Ic$%qqPy+~f;$STMTL$HKx1NGc*WG= zcw?pV*C1U`uPI^c_8VYnA*Nuqh>+s;^sWDm%vpPw{AM}tZ0~Fw9eLmOciS6k`P83W zD}t{n=1s8G$N(zNc#rPw?Vg1sEP0_#swh|@$c=ErhVpM0TqmpB!@ z!zSzJxD{I7FPVo9x35ZE4p>|NCiT2%l-v<4MB6B*)+@>HExS9#9d)^JH{6rYjK1vq zL%IW1W~!@WQ7Zlmk9vf2uB!Ch@o>kL%;)_OR}V?czOp(}ifm{z1fgCWv=(Gf@n8;0 z--;Yo>0ahU33 zpKywul=h`-ppzZc_-%BDspHCx-H2#Pv%%2k^$GD5)j3pY-3V~m8pHi>am`Wh>h0;Z z?Ws0hk>#%A%zN@qDzq}CG9FLu2gZV>e1pY9ck$}pgQi@!pFY=e{wDvp5XP{i zo>9AU)OB5CExt(g`k(i&`#jZ5uNNQFxAJdtduWP3I$7fXOgl0({a47DO*DDx5$}tH z+qMP=_o1a%3tW(hhhuWzY+>!WwQa)_dQlr}FY6OQI={|ld?DfWlPpzPJ|3*KLwERY zy=QmL!x04d$jdYj|MZrpxG>kzYtU7ly%!fwI~DWAOq~4%&*?q09oA)%f7`dPyv|l; zH8U9+7-ZzW?pWn}xjO!(^%?sYv9Q^`pxd87QTwf*RK5*i5Qx5s4+{ce7SHSbyWst_R=L0K2 zHLBB74rG)gh|v$ZEBw*pab@{O5~1H|{5}1AEV+ks(?t+z?0wD;O#!o(MSN z8CwyA_}`B=)*_{~F04Kq^UiHPq$+f0cqrPc1}u4GaC|@LidP8W#WmkqRZG1rF-Jy) z!2&iqX%HL%O_*4{HATU^X_)n)ipp;|Grv~sS6JPpN?%$!84ZrO+4#&+o`Q|7DR>Z?v8?76cbY#H-*!* z*cWuN12&*YJtzEpiwEL5`MJeu#kzNALJ$9#Y_%#6Q63F7oW5}X`^U{Qg1i2lX**Ky zVxyK8QRWd+%60X5&o8s7-{`#b>wfRQfPF2$8^dLjR;183UwrY;r)Zw=qOhFLgRW4- zs2p@2HYI>5b8sn|Z&P9>knmWGA6D3f4 zU--H3)&rI?GtFThW>k$^vDsIP(Qauhal0Td%u_+>Dg7KEoN6-Rt){E$QIEH?yQ;(k zZi5NhJGv6Edv|=UMz|joQf7;`k|{|vr#;?=yhrGL9sS9)%XNNWY2UHP_Da$igryg=7M}@ZJ+j2YVQNf?zVgB8h`bz+;BV!US zEYeP?09?jNO+HA2s=l_nBjyl3ZzvW%NhN&!^B_-Z^siJPc)IGLm+sSg*D>lY3N9z| z4bE4Ho*LCbGr+vwZGp2$N<7;JHG$*db?6Hxe6%f{W};l2qvh3KDzZQGuj{ydNa@S( zcj#GFVRF)Hj-?oMF>Aj5p`d=WSoXGthx$Tcz-uF6=IuA-J_O**I6=YxEYd@E$nmk{ ztfor}9fQ0Al(61STaq1>t@h`0zp-@Jo0r#g5uk)Nv{ve(n3g-IC|OhZupghIW9L^Z zs)}tfh^t0>_h|^Raa`=RnU;% zh;$JttVkmz^G%KUsBfYl!lE9ShgKPjoJ)*+?cBFo2Lrn_-^&_2?kFx<@?fObU4HHO z#9?)CT7Ngxk!4t=xH#z(+qS3X7Q6 zi@mJ3x(!kw)NgKRO`G^g#Q*fMjp615=Vno4ZA_L{10-0FW2ZKy8QiQN3N)?xJTZCT6NFze^mb%^jWtH z;mUtSJ*jD;&L2ZTp?&)D)yF4K;O)N5pO3XUc#~s`Gj8m)PjUr2g^0@8jry^yWhZh+hrjOCXQ)1x~?@Y5V4~jc` zMSE5nxbH2-EjWcR+@nv8)?!IgDu@lpMhN(SJ7r>HS`iq3&k)|e&dEZK4Jc6MFVOPt z!trdp`zUqQmVM05^q0U#_Pq3xB?g0~8_imK-THCC_b>Qb$*}iSwCy0CLEDz2$)6^a zq%`d(usB9D;|i(#u`({?i~&yA-h)QFJ2OUgnfFDQT|@f&nx}U0{o{FDS}Q{NVF<~L zSQ^%@BRR>=VbmRkRazS!HOAS$Ho6bLW`f0AR1_xWl|fH4cqsAICka+9eRYY;{##la zJLgOal2WHKPCjR<~J9lM;84a(noaHH&Y8abZ+V8d(N9=iC&$+j1Ky!OjEbo1a$ir*V58n(I=Do=$ z1Ma`YTR(lJ@HI?EIR?5%UFPwPF^a(}Sbu_Zg07VEItK_MZS9zv?X>XZ;yFDRg7@qm zWs#mbv-6-WaiB04qtj8p!Q!FJIa~aFSL@I#Wzs}!Or;6GsCWWLuUAUx6?)WQ_d%O` zTxT^c0UmjnI2Jh}8!Y|B$x;^m+1)N1Vlq$Xlaay!IyU;-Jr^I}A2LM%I|FH*9gTWt z4x!+IrR;2Bq99oiNEGR343sVINiS}&!?^FK#W$}$jlTi%nA(Kl$Ts~D615@C{p%0WyT5qLM2 z#|xKkF|mfRSICdKH=hyhO6oHk`~&KIAPkW#rC*Wt#IJMR+tQS;+5Jk1HB+o-iFpobdHy;=Pn@2#-^ZxE}e<^YLaS`ZudF(goSA#Jc3(Y?C2YbA` z8w%OpJv5IuimeeEUnQOr5MgNqoKSG_(clR;*f4$`d)OQj7}|Ui6(kSay)@%)y%6r` z60yNDt-!b1=dT%Bi%nh!$J!ZY5_U^Mj8YSz&V~El!h5;^+J2Svx+>y~j}%>jSHe$h;Kc2>;>7b!T3SXU)WV%H~Y+Hn?1`9bdgem<4pdxjFkd z^fubtx3^knie^9OHeo3!E1?-(8kT^UCkjpqR&A&_{4AZkc`QofYuvG3twn7V2eq-T znk@HbCVc0;Zf3Z!*W;n73kHJ|!I_*CN$9>7m$e8&3QNV3}2nqxJVSOyF91V3?N2; zp8)Cd#a1$%q3S2QOjw$1kpSc7ZxkFRogWeya0>l^qyJk#iE!miyox2!rT}j25kJmj z4`&ZL&fs0`AvRr{I9CpmSve<$&GD&#n=|Z|?zN}*TwOr9lQtEuzoM`X$!k|DYxYLw zfmm+Vo)rpVR2Bap_F3Nc_|QX$;h*f*xn>UR4h-Ol*Tr}Pv<9=dqJnKCei3Hri>I;x z@4DSYyzmr}pt)m{MXhdS=o`p)7B1%(RQnUs-XU+X4{mJ1OFhf?a-d23!Vp$H++9;Uq3D&&QK zm9_UAWi*#PJp1ME+gP9DyQ`f%c*iB=bzk3gdFh%*^6gPRb$n}W#^g8!|3kNJFWgV~ z>7TaII0l^V59I1SR5Ni`gde@%haQ<&h0LES4H4LJx+}unzY7Qt{XltIULD(qRQPUzgJK!rf}2D{qc zqZr*l^+DI{92TyEp$ z>qHRYGY6*9rM=PL*VkPd5kO-akyXj_pc!1wTW{cnSBE&+Y_}~CLy0{bw9vH9Rk?Vh zqqmkPd;i?&9Dr7H0I@-o|&EMuOq+O`|2`;x@85lobe_ zc^0LVJUra%ddQ)L^a2vRNPN=A0CusG{v{vA@4z`b0fno$QnItkQ2UCSn*}6g|Z4^Ie3Rd*%RgXW4hY7B z^PN_ExnRBn-xqD$^Ra6GXEW9k-MUQ0M)XV3*_mcZrR1hTr7r+RIT*-L45m-4UQTmM zW+WxBE`XZ!MP}_r=1GxG!&gAZ8~~v<-{AlVb}!R!wzsgjoY|0=49o@*dgbK{B#WmR z4i&Yg!ssD^ORx^m+9)r}V`NI@UG0cxaz{UnzHcV>&D$p8#A7wpM-;_FJie7P{j z+wE3ETWLD*lDu6ETMSgd7w?I++$*R)8nFUy|Hm};cmu5O);|iu3ixga{UnbQ^v?vu zxt!oC;%>Z$!x4&cYm}ncuYV>f*@Sy2CZiO6%zvcFZVYsz^Pe6=ENju zL!caqr58SUHeM!GC`!Jet928_fa@OxsEL_a1uc$CxV7!MkjW$=o({aKfUXPThZYdT z%rImi)MFHI4zeK~0 z+RhE&K4?i^oGw3D8qw2_Y*6}W1uurTiWgIj%XR~Rc%&GX#t=8A=>of^t5jXiks@4k zQHh^>5+RpTwhom%DS?jT{d7RGsoPzh331s zvtfByG&ZEvD6{q}0Pz8W;y_^8)dBpF<98&GIw03a0*6ol!CW=oOl}IP8N?Wv&4Djf zXLz+1W1PL$bCWw}2 zxslSF>v<9RNIz0j){PnIG2k-C*Yo*q{bYutoA@H34ok>!FoH;FxPt7(NJa{c*L7nR zd@!VLAOidg6<)zUc1YHu>zz&VzoR zWhAJW8=P80GR8fO*@S6{*h_b@>G%x{{f}%If?;%3kX?Ie*zQ`9R z3kljFl$G_~{A&cakt=r%k*s)<_)mboj3>vb{5knpCX-a@>OE48+eA9Fc)Gi^HrmZp z)Mi(nPdnV(IzU0%T9({gSw9j(<#mQW1EBH*Q$v}7f&E#u=+`w~{E^@4KQf&+zWAJt zbce_bRtX)WU`!a9>-OF|_sz_WfFd~8kUFQ*ViSOYprtkVDY-PfiXJOPteFc|#t_;b zc;P?B&v|lTqU5qHgxokdd=5E$uvbz0MUX9d9|yYbgf!hiyzcP;mJhmulrg;FQl(p{ zElFT~>Vx+Z#N9BC;%tGHP7qWVjs}sdlVmtu9y|=EkRT+|%@IPh$Cn|5{&m~$g^2c~ zmohG7lAq!zrMt;{Z?3-$JC_dVuD$|6g+YI+HYC&yZ8Xa}i7k!+^!JdbQgX^IXRi#6 zaAzhsWK%rJACu)_ayvRwEs&R0m%CQ4eV;n0WA@E3Beo`XR9VK0m+RG{k$ljL5~#p! z*tFZF@o+<$ZX5!t$y6N61C}Is$P*^yi~TUqCfyhL`ZSRCcyVt$*@39dx$~%s+m@Gp z36on*1E%0T3_L&n8KA$8R59br#=4H! z#;lEG{3@L(;+Lpf#_)NB6AXfp|GdyVo&hQr3A{tRJ|3%35gX^8R3cTgCGVzJ{!q5t zbNqI$9unm$5XnONKCYLCnB0B8-|ildq>n$o&(%P#D|TvdsXb#pYTlg-p7w|>hDB`NvE|AYB{suRFF6ybrfMlUsZ zfimk#R@ED^!`ly=ZAi)H2@->>y{x`{oaLf1(DQuoJ~(*L`17lB{E+T+2W{c0$qJI% zv+}p7Vhtz?8eJCfZ_3e>JABLT<0BDBoDh(SRHjIdpiUa_jIp%(?3xYB}4?#qaM*tJDn(z3#XjkyXfVJAY4LpK{(M)$t9fLd++765Yf3L zoOVj|DB+dw?|t9j`~30j&dkp2&hG4dc6Y_2&MS!cb-$l(|0 z?a1Ny%EgI*;MM$2rs+rKCf`VG)g2K+D90Nd0r?M>z0ToNhK$l?p}N(2cctdpzAuB^ zk&IV_-+x{XbYOpbT^f8~EPmnjxo%L0)qiy;jt!f8CXY7BU0-*eN>|#u`W>27k(S~1 z(`@-}5IneI6aROdp}pMY0DJ}1#pd3fPGpZiw}M@}kjRaZHjlk zZlGV-IG+(JJ+xB7!h1Tsexp%)?H#0NXIR6SoZDU>kvh+K4lKaI47!&Mk-$K`K#2OK z23v}C$ntn@Dov7g-{ysLB?|w%tfO@^s`PaS{2XAe0Jl4W)w^CT>WAL(y=cEW_?xsk zV;cD6`eu;V!YS;_#@e~`fA5D}x6Pb~oQw!NdAw^5kvgvHTcD^WG4!f-@)_u}M}GirHW%?e7hm$r!9%imre8lXvRZA01uk!^9}Z^4^Y{*NEtNXL z?+a#I?DFl@t?t!*ah|6Qc;$p2agQ;F*;O9h?_yW%&JF!( z(gT&JH{MU_Pa!3FZp}UW>aZ!HYvsTZ19!0h&@^ea8c8K4X+3eYn8|ba@<&K#yq2bm zp9!C8ioyY>apu1$4 zGx(tSRj!lptF0?h7<_!8qS^@pSG^dTU5H?tGTCS!g~~pL;<#-IVaO3wBEXisByM)< zRXy9>-`=WVJ3w=Q7_Ytdn@QrR5l`dj84XT~rt;~4vS#v>Y)0~(=sFi?Te%AD<+Wss z1zFyJQOUz4lrc4yDPk~{N`D?u@7nPm!-yuVdztDHHwBxV<#W~kyP*xwLb5O>aMRRv z#d^vw&KaidRnvY?9^XwNh%QS)&w+CUPd=_9hFby{yf}pTvT!fyLO8Tj>WwtDEk3_( ziQD3~(&I6uE_pTYKF+yn>%yDS`jy9=@v#aD*2PeM>yc@bLd*l+DQ4{$jjRSoQXp@( zE7wqhH2XryzM9XDe_9eeQGsI0|GjQ(frolgZkw~dtMbsgO?SjYS^@ex$&a`7@OX`S zkE{z*wjL~tiD zVCTIgw0?KPKV=%BDBqzf7{)SHCf}tohFX=REsDYz7~|&SF;9?i@_SwtKrYT_AqpkK zE=AS>rAY^hwx*n%rS*n$bV+#)(O!btJNcn*UzS}le<#OXt8Gl0OTV3vB_kw1Eyx6= zU-a)xK{j$0E3?{^@L}|ryx~xjnKFsnivn#6`h#szMY^OZxO@GQJlf(W)L6=^F|N^idOv8_fW~TpDFr^GaZh*se&tIr zOmHr9<%GzU0p9&_Hv?kaQuADkN;KdpSCHfwvw}hAEa_{TPst1E)H$UUiEZmIy|#e%AJ_C?rNE3H&~?M^)3$bUILDX0`8Eoy{xArNoU3|$Sd8t z*B$efI3Mdd=JB3@c=+p-Q8~dO0QPNeqDUl&^^R*p_kGL8M)UIp`q_3H?>9>imL~lA znC>vjy~CkvqRk+i_+-vvz>06&hL+|{=f}k-v=BFD9nx9N zg&0rJZ>0#h$XYz|bdY`wl}kbm2(COd(A=WFKQR|RCi1uQRioV7xV3t<{7HjZ=?K&d zU}cenm0!=Eomi)9G&X}QK|TJ-@aZPjqI7iP%lx(h;KMhx)tLEW=W3E52pT;)!%#F! ziDF}kE+HXL_N3$pFidqT~EZO&SzXJ zao<6%KK{tX=DC1~(5=}tz2O4Vcdqfc1%%`CpXA{zu1O80`)WZ#PX zGxO#zxRZugHu_z#K8K6N$TBriES}+S3PV<2t)3Vem9RvxdDUIl!DGp|S@(L6!TL{Y zz_3V~uLc{@LAJEfbYq^*`F&Autl zLgcQQ$Xx_m?y7ywnn@gB!Z61^Q$?h(znXZ^2ru+hlU6TC;siW;M^!*BoGh~CYE8z> zz&v1FvoGH%GF!VWKoqSqTsy5Cb>tbk`qrN0I6a){7K&ulh&+4=l~t@h?11zk6!<7| z7x1mJvW;tNuy^atno0nQpXD1~>cm8qm{72dhJs~^rma=mR10*wEt1sM^mAByo~Sa; z0RC0^M;-GP(Pm;}i-uRtqjxqj@3qENA0iJSY`(~FNP|V*svMs`FAadP&Q&nsS;ENj z*8z35>V6T7b1=`l-_>$3q>WMJ4BN>5=VEw!TK`d53QpMzt7Pt`6Yaop9aoN6!T)Gw5*TKHWF!cS$-@`^4>`p_u%#B z=(9U5ALIunL^1x^+^GpsD+Hv?*0B7Fea@EA=>5T#V6PR1Li#(Dn5bP93aQ4bfp-p#-=;Dx@jr!c ztFdaf=?~h&A2w#H%CE^xZqYBRm+J0)Cz3ToiR;s(4J4{B!2)UX3iIOQMf>KczVMLu z?b>%yjIsttedSQS)Ao|gjX}m;TFY6iaXE{jYi~WPr79!(i@a#mQi`Qrm3ikYa)Ngx z%s<-M!>XC(hlwk1-Qkh}D1R#9zQilT=jD;EkA4%%#s*o&;yFn)*dHI!m3JLKdTaIO zd7m}OOzohz8QMmOKiGor5S5Zb#G3x~a`=e()L!sQ-Z+Wpw`V7MOGK>Uo3}?|#+~G@ z#FCx^W3-OL^|t7`BjV$ENdY3*?sVhlL~ClE0e417h&bH4$ST6iU2nN(d+Y|M!u7lG zWs3Yp48Ez|>D0hi^IMa5IwNPIh}wGua~_miN9h)j3RIZ=3{vuErlr-6$)yCgX!?jH zyd|1XV)%@D=Hg?=4XJo()R^vF+rwo=suo2MR+wYM$8zVEGPTy4bSpb{eP!>i;91|b zB?Im8x88%`p?!0}!HdRdQu6u_TkuXY72;vR?%GD>yru*Dst?g?+le3Z)?cf$7AG_d z>TdslaN0N)P@F{K{fl0vsJ2VX6G(N+kuTHf0hDWqe5}|hl=U{Ve}sAdkS?GbW%$FF z>a~cv}$eX;Pp85N;! z>AWT)mTyrDmq(=V9#?OU83_EuSJlzi)%>n(H!^=*gu!V&2s1>3^4yZL`~PUxO+ z^L4XQhdURL$m^?GaH)^=CqI(WIqCqvdMi*_oF}^I(&=_6Zz%Fggt8D$4eoO{c3}uB z&4$Djdd5syKW&A&Y?Q?Xw-3fzCTT@Syp>WL)0X&oT%+1q>fV)iq-PRIe6Mxr$oqCz zn4h%Z(voc6V}4A8a322djR2tJ+YRfd~fv2v1FNsR{9i$d!FMsq`oe ziY5;EAXY=1p9E5jo8yO*Jv(w`Kg#-amq>%noZE`~=&deSM)%XM?3b5b4CF_z*0*{u z-taOe;hx5^zDrr_=2q?gmFf}7D4VSkC1;p-;2mg6(rjzYKNxldGX6k8z-z{EN2Bkq z$&%1^lF=>2%Pp*=MIOuN{1y z_>AUv+T#9@74v&){NCK4gn5Q|lW4req1ASTK9Qvbb(jK4Ab_?bvQ0CTSlRiEIy46m z6kIpqNlZ5(gJ2-CBW3?#T6>QkY)6EA{6WE{zSN;%qm*j;*5;tpW5t}5hV#tMS0t&* zqwDoqxv{bAK?F2^B;lTgj0_AmuTvuxY4jsW^qk5*(=mHb(UNNtVzR8%)a-eeY^bJ5 z<@GZqIh^PYY;NhDb4ZJdZ1I7qe|e*?W5#qoUlK6MOt!^yifs6K$irVo6qb$*+>0j(lT`(T{oPjg(f`Wx!x66k&UPYiR=Aa`rv`^! zq0P*SZ%RE@Vt*V&mT%bFu|zMi|4mh$>qt(wZc5@Pi$z8`E>6ezIx9U(lx%+B{Ze$Z zsxgmJvTj{mDB99@MAQD9it1Uf-th35aDB#P(Q*aot)6-Ig%8_xwai&VJ@4i8o^Dd; z;tHJ3<%PP^;UIjX8jn&-T?iQm@GqUROfEKM-#UG`O#vqKrO^#xeDta417q!hHz(=N z8^LJ4hJIt)cGwiFNP_UT23K+R_}TZBv!->}9ZpP+Cc4o)Qg2s;Y+tNfi8Ab)H8mv> zBI(){^Ftp;A+h`t6bjrhBCQ&WoZLS;D-wEieHsuYaSdl{)LG1voQ>ptBcgnTXWefJ zcKhQq+&R>;*%W`Yu@`TS5GV_jmK6o2kT7unAF@WAA&G?BUP96iC@v}{ByKAW5|R*= zbQH3aadHxJa*}Wq7XymfI*LlCa594_#QxWic#S-(CpmH8hj4|IavmG_EoP#;pYc`% z1hl2k)Km;^UWBsaf{JBnG|2LuiR=Qe8x+){`xrTrC{$)-t;fovr{+79QZg*mNIefQ z^Y$6RSM`wujXo5|CLun8vA|8o9!IYFv zbADdt=6Z|e&xjnI)hxEE0i>~eyJyBfFRpMaYDFYPW=n^MhZi;wgrOv@qoHBLm1KiP zW)%5CecSQ+()kRwxjb$M;d}V)O9M2>yzY-oS;IGH0Qf@@|Mz`37CTJDGaR6I0>)<_ zYa=EHJ@tZ?+U2dwLqFv}0uQfCXev4|clR-9e)TKQB}bX)1K%b^-6zP{gLU-dR2>0d zAFzjk6$Hl$#k>{6k;&kGB>P+54<~Z{P@L6p11h5-f51!AC0n7!VU$eJWyPNr7o9V3 zgFW-xWqT3~0&vC0u__2~=nS4?Z27m@--;lsIQ>r+htSZXRz*R*2Rgf_C`L5^N=*jz z>7L_Ekv&G+5Q<{4isBCpA=aDz%uxc4(U;2~gkKjm-juRZpn`i_UniQdd<}cduOCFk z>K~UII&0ki_VUT!FZ>2@^XwUa$D*KBFy=h!&rUNIzRU0M$q{^QODjJXSG~u2`q!05 zdf_(s9XQGVZ$Q?b(&W<<{ic$32)vLu;C!6oID#IR3x%+pHs+#CUu5`htRD|SWSVe- zX!lN5q^}Ah9B(OneO#C@%(cwal+b8_?g;!`OLdgXuw}lrQ5ZDZ!N#M>Gd4VUY&KJl z>IJ}kFg7TI23sBtp5dR?^xKr$OVvJLB(RFxtHHLi?@e{mrxkB+C-ZTu?LNq{A2L^n zO+1r}_12<<=_iib7cDK}a%J;GPO^8YJA ze?>G6#6x|$5@lk6L&0K+KM`cndKHAC{$S&VKf+rYnVi$*@Z#MBsK)*LQ2;HD-F0pK z1$NZGHQYeke*nNGm(K)!1kU2mpTY5Cin{@Huktq$VJuINuv>eMFT!;NZ>9+v%KULZ z?YmhIplG9ar<>89Ur=v&LP#13^v^lK8=T2TRtp4uFOxvtL&v|q4yF3^-S1CbB$U?| zT&HOCkoGa$F~25S%(&(*$ng=nHNX;Ob$Z#*WRYN;AIns4(;l$+m;1UdGYT=)`^v%^{puB#V?iVvYDv$gxnx}_R zkL&AmZVcE@JiMznEq)UxbTW>%PkFB~Pgv^7Vpxr>91@|+xn9a1J7G{KqY2YkuEZ_M zvPPs+fEM7`4NQ(6DMi)Xf7o*=L27`WM_*x%I)_|C%rP)h~_g^Z&HUdcLC_4CzT4^`B;~X z%mPEoQ-ANTHba}ASJyX~HvK|~d12vQc3{B5&`dwDFkda2FPIZkYpTXXg#_BF50v`w zRfGf^F^=A#T%I5D;OlZjS$}r($&UFcgy&{6e1dKTok|pFnO>Zf1+O63*AVrYep~Ym zUQ5jAOHuUH#VCu>o)sS3u-E1ROJqSF^dR;3xL^it!HN8%ZC>7(yD%`kEpbHecvk@> zaoXMmP#OUohl-nTEybvxeN213z{OX}yB_A~ik0a_JnhZ!FvrwJw72_@YdrPFP}*U* zevQnc7ONRn%oEtr@`?rWkH+GKFhap%zYt9Q{}d+FU6yKS(Ie$3`?2GfMZx%VSb4_G zgilG6UFBA*JH71${Clcv*Slh)+dd`$VzkyO;-qOA@4wga@XR8(Eg`|Y=6-(W)QV^o z8Cq)tAp&dTliaFH*H=(l7{SN;xP3&G2B($!VBC?Dz?l~BqF^1@RoKq4to@>Ed09IY zfil}#kcKclkAW|2sF@BK4DB$-=EVo!Zh$NO~lThPUF+7oP}ZiJ{W^Q3~}9F*-T)Zf_R2_!aq-W3q!ox z#>}@fhLAqU1Gocyc9Iy*Y)5Xj*sUJ9x_In^Nip<$(vNVf+e<>#;<(q#6QMaH0M-9+ z^6*eI-((Oj3gkGL?pt=k>K6ij4)NVR2RU}fLehaN*e1o9DOm4me`(O}$>gO+5H>^3 z(G&GQta^*?xO@LXdAZJO#iGJ(3+^BN@_*VQfiN_s!G+W*#c5N)tS`D;tR$yJ=%?h( z0{LPXSMG%jXm6d?IiWsm*G-FTmv_7&da;CXRs*s#>_+5-&8Q8*Ao&f~b} zld|&sG`=SuaFZ(xbAa8AYX4aOTGFBAYaVg!e5QK@FR&;HSwR^1B@f(q?1en|W{+V+ zQOYnl+vnUv_X1XW5rTDlbrc|1O7ut*imrHM12gTDQMI-)5|bQ=CHv=GZC}Fw&`co5 zr1=InSW$?1zkGlCXYt?*r{&Ws2vg{CO$&ac7wcLs16d1!S3x6@N^M88-^D!Y_JrK5 zBTeX1=Hj28wiAuzS_N$jfX#P;hv(Bcr+aVgMS=4Dt#=eqwNvd4r6Ejq+FHniS7=IU zc+h5*y}L_Eh?nIxd@?{=Yb}I*8&NcyjFwoLXbSo>KVv>%C)_uDlOBo=5E(I(QhUMW zZ0#q<(^cuu_p4n&xHQ>(kL6Pfh1bXU_x558E4cQbh}?C=SRkgMF2rf;XNk2JYh2TP zky9#ke9^z)S8SX38VIhtN@Rl0Z~a&}G9W3*T0t<$@OvcH^WWCS9A6L53|m$#&|u>*82fE(-$X0(B_1qqpw>Bc@kd=YyvE6)Qt z!$Dknb-k((ZaD{&f35uFU^lyGq!WP8@L;K51E5jz|IJX1*2nSuHz^+lm4)K~!D6wV z&STJ7Vk4W*{DjOSFD9Jr5)U z4eh^~|JK5>lycew`IQ@hhX!Hg^k%Zxp2eXA61?_ui3A;xqB@&gn6$mzT;AN9fs4Nc z1Gr*=s;0kg&T)=4_u%^NeaRlWdSFY3(Zi5mh}+qdrM7q}?1k{mVI1|D%1-<7lXce~ zMooN&$lh1mu~n}%7Vrj@u3pW1Ht0(8$7lc8%XI=b1AoPf+=O^!@M!Gv5S?7 zW8LY)LK5|{33C?-vR}i}557P)LB39RpT;GpAC!vW_-@L3=-O!gQXj{M+V`M2Zza)4 zBi}7$(~TnYNC8XX-j-!C+>v-EfUa^4;Y{n;W|XiW4M67-LSmqi47h|F?U8Xf;QAo> zt?S^oM&G^Jkv7yK9TcKOgai_y7uEf(Swa+zzdz%=iA44vhzkiBrRK{QddcWZD|G42 z3It;I{4h?oDLr%Yj&F#+3`=kwAh25q>Y9hDjbDPUvpO0y)wRyDAsK22?S{YkzSh>1 zZ*Mw1qRH>2XF#x4O08xCy>**40vO4v|U^{RVgWE7u ztWd#}AuIC00m9^`fdXKpw6#nFvS;nULN_;)8>S&b%1|R3z>cy=7mb4E^Z;5kQLptZ z+?t>R(Evj=n_xOu>-gP(fj#`rT&Mxp_akCXo(Zb zv`LfuE*?5QNMI54>Ve$uymtI6poBpAR27O=ygt9`JYJ#Ta-re|_XIHbIOv#AjomP_ zQ@hHJSccjgi?* zyx-=!{}Wdl95(dkzVS%!rJ>>RHJs`TrmiI*P(W|XWM9(B;O%~i0M-tCyzS6&gL{PK zGVS?v<9UO+XOMrC!c0n|?U9u{B!<6+jt3GW&hG10l7@;Zt?N;q)FKl z9#{l?%#LDFq__zNy?Oy{;b{FOiK+EB&|4{DQdud=QsfNLmv^nh*RBTFEn5g~zGvzX Kwelx6VgCiqG2n3k diff --git a/games/keen/mars.s b/games/keen/mars.s index e288cea4..ab35170a 100644 --- a/games/keen/mars.s +++ b/games/keen/mars.s @@ -616,7 +616,7 @@ location_size: location_actions_low: .byte <(enter_level-1),<(enter_level-1) ; level1, level2 - .byte <(dummy_action-1),<(dummy_action-1) + .byte <(enter_level-1),<(dummy_action-1) ; level3, level4 .byte <(dummy_action-1),<(dummy_action-1) .byte <(dummy_action-1),<(dummy_action-1) .byte <(dummy_action-1),<(dummy_action-1) @@ -628,7 +628,7 @@ location_actions_low: location_actions_high: .byte >(enter_level-1),>(enter_level-1) ; level1, level2 - .byte >(dummy_action-1),>(dummy_action-1) + .byte >(enter_level-1),>(dummy_action-1) ; level3, level4 .byte >(dummy_action-1),>(dummy_action-1) .byte >(dummy_action-1),>(dummy_action-1) .byte >(dummy_action-1),>(dummy_action-1)