diff --git a/games/keen/Makefile b/games/keen/Makefile index 4cde7354..1afee0ca 100644 --- a/games/keen/Makefile +++ b/games/keen/Makefile @@ -11,14 +11,15 @@ EMPTY_DISK = ../../empty_disk/empty.dsk all: keen1_lores.dsk -keen1_lores.dsk: HELLO LOADER TITLE MARS LEVEL1 LEVEL2 +keen1_lores.dsk: HELLO LOADER TITLE ENGINE MARS LEVEL1 cp $(EMPTY_DISK) keen1_lores.dsk $(DOS33) -y keen1_lores.dsk SAVE A HELLO $(DOS33) -y keen1_lores.dsk BSAVE -a 0x1000 LOADER $(DOS33) -y keen1_lores.dsk BSAVE -a 0x4000 TITLE - $(DOS33) -y keen1_lores.dsk BSAVE -a 0x2000 MARS - $(DOS33) -y keen1_lores.dsk BSAVE -a 0x2000 LEVEL1 - $(DOS33) -y keen1_lores.dsk BSAVE -a 0x2000 LEVEL2 + $(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 ### @@ -47,7 +48,7 @@ title.o: title.s zp.inc hardware.inc \ #### MARS: mars.o - ld65 -o MARS mars.o -C ../../linker_scripts/apple2_2000.inc + ld65 -o MARS mars.o -C ../../linker_scripts/apple2_4000.inc mars.o: mars.s zp.inc hardware.inc game_over.s \ gr_fade.s \ @@ -60,18 +61,27 @@ mars.o: mars.s zp.inc hardware.inc game_over.s \ #### LEVEL1: level1.o - ld65 -o LEVEL1 level1.o -C ../../linker_scripts/apple2_2000.inc + ld65 -o LEVEL1 level1.o -C ../../linker_scripts/apple2_6000.inc -level1.o: level1.s zp.inc hardware.inc \ +level1.o: level1.s \ + maps/level1_map.zx02 + ca65 -o level1.o level1.s -l level1.lst + +#### + +ENGINE: engine.o + ld65 -o ENGINE engine.o -C ../../linker_scripts/apple2_4000.inc + +engine.o: engine.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/level1_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 level1_data.inc \ + level1_sfx.s longer_sound.s \ keyboard.s handle_laser.s - ca65 -o level1.o level1.s -l level1.lst + ca65 -o engine.o engine.s -l engine.lst + #### @@ -106,7 +116,7 @@ maps/level1_map.lzsa: #### clean: - rm -f *~ *.o *.lst HELLO LOADER TITLE MARS LEVEL1 LEVEL2 + rm -f *~ *.o *.lst HELLO LOADER TITLE ENGINE MARS LEVEL1 LEVEL2 cd graphics && make clean cd maps && make clean # cd title && make clean diff --git a/games/keen/NOTES b/games/keen/NOTES index 8e1e3304..dc5af90a 100644 --- a/games/keen/NOTES +++ b/games/keen/NOTES @@ -10,9 +10,18 @@ Memory map: $1000-$1fff = loader $2000-$3fff = code (8k? currently 5k) - $9000-$93ff = tiles (1k) - $9400-????? = big_tilemap (10k) - $BC00-????? = tilemap (1k) 10x16 + ; MARS = 6k + ; LEVEL1 = 6k + ; TITLE = 4k + + ; LOAD engine at $4000 + ; $4000 - $5fff = 8k worst case + ; LOAD level data at $6000 + ; $6000 - $7fff = 8k worst case + + $9000-$93FF = tiles (1k) + $9400-$BBFF = big_tilemap (10k) 128x80 + $BC00-$BCFF = small tilemap (256B) 20x12 tiles are 2x4, or 4 bytes each so in theory can have up to 256 of them diff --git a/games/keen/draw_tilemap.s b/games/keen/draw_tilemap.s index 4fddee97..df17fb9a 100644 --- a/games/keen/draw_tilemap.s +++ b/games/keen/draw_tilemap.s @@ -207,7 +207,7 @@ done_tilemap_subset: ; activate yorps ;========================== - ldx #NUM_ENEMIES + ldx NUM_ENEMIES beq done_yorps clc diff --git a/games/keen/engine.s b/games/keen/engine.s new file mode 100644 index 00000000..f12857a8 --- /dev/null +++ b/games/keen/engine.s @@ -0,0 +1,329 @@ +; Game Engine for Apple II Commander Keen + +; by deater (Vince Weaver) + +; Zero Page + .include "zp.inc" + .include "hardware.inc" + .include "common_defines.inc" + +; .include "level1_data.inc" + +level_data = $6000 + max_tile_x = level_data+0 + max_tile_y = level_data+1 + start_keen_tilex= level_data+2 + start_keen_tiley= level_data+3 + start_tilemap_x = level_data+4 + start_tilemap_y = level_data+5 + num_enemies = level_data+6 + hardtop_tiles = level_data+7 + allhard_tiles = level_data+8 + + + +;enemy_data = $6100 +oracle_message = $6200 +level_data_zx02 = $6300 + +level_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 max_tile_x + sta MAX_TILE_X + sec + sbc #20 + sta max_tilex_minus_20_smc+1 + lda MAX_TILE_X + sec + sbc #1 + sta max_tilex_minus_1_smc+1 + + lda max_tile_y + sta MAX_TILE_Y + sec + sbc #6 + sta max_tiley_minus_6_smc+1 + +; lda start_keen_tilex +; sta START_KEEN_TILEX +; lda start_keen_tiley +; sta START_KEEN_TILEY +; lda start_tilemap_x +; sta START_TILEMAP_X +; lda start_tilemap_y +; sta START_TILEMAP_Y + + lda num_enemies + sta NUM_ENEMIES + lda hardtop_tiles + sta HARDTOP_TILES + lda allhard_tiles + sta ALLHARD_TILES + + 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 + + ; 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 #level_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/level1_map.zx02" + +;oracle_message: diff --git a/games/keen/handle_laser.s b/games/keen/handle_laser.s index 4cd481d9..eee9f9cd 100644 --- a/games/keen/handle_laser.s +++ b/games/keen/handle_laser.s @@ -39,7 +39,7 @@ laser_check_tiles: ldy #0 lda (INL),Y - cmp #ALLHARD_TILES + cmp ALLHARD_TILES bcs destroy_laser @@ -165,7 +165,7 @@ hit_something: done_laser_enemy: iny - cpy #NUM_ENEMIES + cpy NUM_ENEMIES bne laser_enemies_loop exit_laser_enemy: diff --git a/games/keen/level1.s b/games/keen/level1.s index 996caf01..150c2749 100644 --- a/games/keen/level1.s +++ b/games/keen/level1.s @@ -1,280 +1,37 @@ -; Keen PoC Level 1 (Border Town) +; Level 1 (Border Town) -; by deater (Vince Weaver) +; at $6000 -; Zero Page - .include "zp.inc" - .include "hardware.inc" - .include "common_defines.inc" +level1_data: +.byte 116 ;MAX_TILE_X = 116 ; 116 wide +.byte 16 ;MAX_TILE_Y = 16 ; 16 tall - .include "level1_data.inc" +.byte 1 ;START_KEEN_TILEX = 1 +.byte 13 ;START_KEEN_TILEY = 13 -level1_start: - ;=================== - ; init screen +.byte 0 ;START_TILEMAP_X = 0 +.byte 5 ;START_TILEMAP_Y = 5 - bit KEYRESET +.byte 8 ;NUM_ENEMIES = 8 - bit SET_GR - bit PAGE1 - bit LORES - bit FULLGR +.byte 32 ;HARDTOP_TILES = 32 ; start at 32 +.byte 40 ;ALLHARD_TILES = 40 ; start at 40 - jsr clear_top ; avoid grey stripes at load - ;===================== - ; init vars - ;===================== +.align $100 - 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 +; at $6100 +enemy_data: +.byte $0 - ; 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/level1_map.zx02" +.align $100 +; at $6200\ oracle_message: +.byte $0 + +.align $100 + +; at $6300 +level1_data_zx02: + .incbin "maps/level1_map.zx02" diff --git a/games/keen/level1_data.inc b/games/keen/level1_data.inc deleted file mode 100644 index 9e2479dd..00000000 --- a/games/keen/level1_data.inc +++ /dev/null @@ -1,15 +0,0 @@ -; Level 1 (Border Town) - -MAX_TILE_X = 116 ; 116 wide -MAX_TILE_Y = 16 ; 16 tall - -START_KEEN_TILEX = 1 -START_KEEN_TILEY = 13 - -START_TILEMAP_X = 0 -START_TILEMAP_Y = 5 - -NUM_ENEMIES = 8 - -HARDTOP_TILES = 32 ; start at 32 -ALLHARD_TILES = 40 ; start at 40 diff --git a/games/keen/level1_enemies.s b/games/keen/level1_enemies.s index aab087ac..6489abf7 100644 --- a/games/keen/level1_enemies.s +++ b/games/keen/level1_enemies.s @@ -45,7 +45,7 @@ enemy_is_out: load_foot1_smc: lda small_tilemap,Y - cmp #HARDTOP_TILES + cmp HARDTOP_TILES bcs no_enemy_fall ; if hardtop tile, don't fall inc enemy_data_tiley,X ; fall one tiles worth @@ -144,7 +144,7 @@ enemy_facing_right: iny ; to the right load_right_foot_smc: lda small_tilemap,Y - cmp #ALLHARD_TILES + cmp ALLHARD_TILES bcc no_right_barrier ; skip if no right barrier ; hit right barrier @@ -202,7 +202,7 @@ enemy_facing_left: dey ; look to the left load_left_foot_smc: lda small_tilemap,Y - cmp #ALLHARD_TILES + cmp ALLHARD_TILES bcc no_left_barrier ; skip if no right barrier ; hit left barrier @@ -242,7 +242,7 @@ move_left_noflo: done_move_enemy: inx - cpx #NUM_ENEMIES + cpx NUM_ENEMIES beq totally_done_move_enemies jmp move_enemies_loop @@ -365,7 +365,7 @@ draw_enemy: done_draw_enemy: iny - cpy #NUM_ENEMIES + cpy NUM_ENEMIES beq exit_draw_enemy jmp draw_enemies_loop diff --git a/games/keen/level1_items.s b/games/keen/level1_items.s index 9c4683b1..3e813229 100644 --- a/games/keen/level1_items.s +++ b/games/keen/level1_items.s @@ -306,7 +306,7 @@ yes_yorp_stomp: no_yorp_stomp: inx - cpx #NUM_ENEMIES + cpx NUM_ENEMIES bne check_yorp_loop done_check_yorp: diff --git a/games/keen/level1_orig.s b/games/keen/level1_orig.s new file mode 100644 index 00000000..996caf01 --- /dev/null +++ b/games/keen/level1_orig.s @@ -0,0 +1,280 @@ +; Keen PoC Level 1 (Border Town) + +; by deater (Vince Weaver) + +; Zero Page + .include "zp.inc" + .include "hardware.inc" + .include "common_defines.inc" + + .include "level1_data.inc" + +level1_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 + + ; 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/level1_map.zx02" + +oracle_message: diff --git a/games/keen/loader.s b/games/keen/loader.s index b99edd59..c6795026 100644 --- a/games/keen/loader.s +++ b/games/keen/loader.s @@ -93,14 +93,30 @@ print_model_done: which_load_loop: - - ; update the which-file error message ; lda WHICH_LOAD ; tay ; lda which_disk,Y ; sta error_string+19 + ; 0 = TITLE + ; 1 = MARS + ; LEVEL = WHICH_LOAD-3 + + lda WHICH_LOAD + cmp #2 + bcc skip_engine_load +engine_load: + + lda #engine_filename + sta OUTH + + jsr opendir_filename + +skip_engine_load: + lda WHICH_LOAD asl @@ -110,21 +126,21 @@ which_load_loop: lda filenames+1,Y sta OUTH - lda WHICH_LOAD - bne load_other +; lda WHICH_LOAD +; bne load_other load_intro: lda #<$4000 sta entry_smc+1 lda #>$4000 sta entry_smc+2 - jmp actual_load +; jmp actual_load -load_other: - lda #<$2000 - sta entry_smc+1 - lda #>$2000 - sta entry_smc+2 +;load_other: +; lda #<$2000 +; sta entry_smc+1 +; lda #>$2000 +; sta entry_smc+2 actual_load: @@ -185,6 +201,8 @@ filenames: .word keen1_filename .word keen2_filename +engine_filename: + .byte "ENGINE",0 title_filename: .byte "TITLE",0 mars_filename: diff --git a/games/keen/maps/Makefile b/games/keen/maps/Makefile index d08f0220..45ad7f50 100644 --- a/games/keen/maps/Makefile +++ b/games/keen/maps/Makefile @@ -7,6 +7,7 @@ PNG2GR = ../../../utils/gr-utils/png2gr all: png2map \ level1_map.zx02 level2_map.zx02 \ + level3_map.zx02 \ mars_map.zx02 ### @@ -25,6 +26,14 @@ level2_map.zx02: level2_map.inc level2_map.inc: level2_map.png png2map ./png2map level2_map.png level2_map.inc +### + +level3_map.zx02: level3_map.inc + $(ZX02) level3_map.inc level3_map.zx02 + +level3_map.inc: level3_map.png png2map + ./png2map level3_map.png level3_map.inc + ### diff --git a/games/keen/maps/level3_map.png b/games/keen/maps/level3_map.png new file mode 100644 index 00000000..2544a405 Binary files /dev/null and b/games/keen/maps/level3_map.png differ diff --git a/games/keen/mars.s b/games/keen/mars.s index 46f66b81..e288cea4 100644 --- a/games/keen/mars.s +++ b/games/keen/mars.s @@ -9,7 +9,7 @@ ; or are there? -NUM_ENEMIES = 0 +;NUM_ENEMIES = 0 TILE_COLS = 20 ; define this elsewhere? mars_start: diff --git a/games/keen/mars_keyboard.s b/games/keen/mars_keyboard.s index e8ae18b9..56e8a37c 100644 --- a/games/keen/mars_keyboard.s +++ b/games/keen/mars_keyboard.s @@ -1,4 +1,4 @@ -MAX_TILE_Y = 57 ; 69-12 +MARS_MAX_TILE_Y = 57 ; 69-12 ;============================== ; Handle Keypress @@ -354,7 +354,7 @@ down_pressed: bcc move_keen_down lda TILEMAP_Y - cmp #MAX_TILE_Y + cmp #MARS_MAX_TILE_Y bcs move_keen_down jmp scroll_keen_down diff --git a/games/keen/move_keen.s b/games/keen/move_keen.s index cf32b4f4..eba1a9dc 100644 --- a/games/keen/move_keen.s +++ b/games/keen/move_keen.s @@ -41,7 +41,8 @@ move_keen_early_out: ; otherwise, scroll move_right: lda TILEMAP_X - cmp #(MAX_TILE_X-20) +max_tilex_minus_20_smc: + cmp #$DD bcs keen_walk_right sec @@ -199,7 +200,7 @@ collide_head_l: lda (INL),Y ; if tile# < ALLHARD_TILES then we are fine - cmp #ALLHARD_TILES + cmp ALLHARD_TILES bcc collide_left_right ; blt ; fallthrough to get other @@ -208,7 +209,7 @@ collide_head_r: iny lda (INL),Y ; if tile# < ALLHARD_TILES then we are fine - cmp #ALLHARD_TILES + cmp ALLHARD_TILES bcc collide_left_right ; blt ; o/~ I hit my head, I heard the phone ring o/~ @@ -255,7 +256,8 @@ collide_left_right: check_right_collide: lda KEEN_TILEY - cmp #(MAX_TILE_X-1) ; stop at right edge of screen +max_tilex_minus_1_smc: + cmp #$dd ; stop at right edge of screen beq keen_stop @@ -272,7 +274,7 @@ right_collide_noextra: lda (INL),Y ; if tile# < ALLHARD_TILES then we are fine - cmp #ALLHARD_TILES + cmp ALLHARD_TILES bcc done_keen_collide ; blt bcs keen_stop @@ -291,7 +293,7 @@ check_left_collide: ; lda KEEN_WALK_TILE_L ; if tile# < ALLHARD_TILES then we are fine - cmp #ALLHARD_TILES + cmp ALLHARD_TILES bcc done_keen_collide ; blt keen_stop: @@ -413,13 +415,13 @@ check_falling: check_below: lda (INL),Y - cmp #HARDTOP_TILES + cmp HARDTOP_TILES bcs feet_on_ground ; if hardtop tile, don't fall check_below_plus1: iny lda (INL),Y - cmp #HARDTOP_TILES + cmp HARDTOP_TILES bcs feet_on_ground ; if hardtop tile, don't fall @@ -459,7 +461,8 @@ do_full_falling_check: ; if tilemap_y >= max_tile, keen_fall lda TILEMAP_Y - cmp #(MAX_TILE_Y-6) +max_tiley_minus_6_smc: + cmp #$DD bcs keen_fall ; bge diff --git a/games/keen/zp.inc b/games/keen/zp.inc index c362cd76..bd4384d4 100644 --- a/games/keen/zp.inc +++ b/games/keen/zp.inc @@ -146,6 +146,16 @@ APPLEII_MODEL = $A6 CURRENT_LEVEL = $A7 ORACLE_SPOKEN = $A8 +MAX_TILE_X = $A9 +MAX_TILE_Y = $AA +;START_KEEN_TILEX = $AB +;START_KEEN_TILEY = $AC +;START_TILEMAP_X = $AD +;START_TILEMAP_Y = $AE +NUM_ENEMIES = $AF +HARDTOP_TILES = $B0 +ALLHARD_TILES = $B1 + WHICH_SLOT = $DA JS_BUTTON_STATE = $DB CURRENT_DISK = $DC