From 83895b6d6d7127afd0f9b7aabd76dd785d384109 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Thu, 17 Dec 2020 15:57:08 -0500 Subject: [PATCH] duke: more separation of levels --- duke/Makefile | 12 +- duke/TODO | 2 - duke/{actions.s => actions_level1.s} | 0 duke/actions_level2.s | 204 ++++++++++++++++ duke/draw_duke.s | 69 ------ duke/duke_level1.s | 5 +- duke/duke_level2.s | 9 +- duke/duke_sprites.inc | 70 ++++++ duke/duke_title.s | 8 +- duke/{enemies.s => enemies_level1.s} | 0 duke/enemies_level2.s | 339 +++++++++++++++++++++++++++ duke/loader.s | 2 - duke/maps/level2_map.png | Bin 3735 -> 3784 bytes 13 files changed, 632 insertions(+), 88 deletions(-) rename duke/{actions.s => actions_level1.s} (100%) create mode 100644 duke/actions_level2.s create mode 100644 duke/duke_sprites.inc rename duke/{enemies.s => enemies_level1.s} (100%) create mode 100644 duke/enemies_level2.s diff --git a/duke/Makefile b/duke/Makefile index cfb74633..f7b54a85 100644 --- a/duke/Makefile +++ b/duke/Makefile @@ -27,7 +27,7 @@ HELLO: hello.bas LOADER: loader.o ld65 -o LOADER loader.o -C ../linker_scripts/apple2_1000.inc -loader.o: loader.s init_vars.s +loader.o: loader.s ca65 -o loader.o loader.s -l loader.lst #### @@ -35,7 +35,7 @@ loader.o: loader.s init_vars.s DUKE_TITLE: duke_title.o ld65 -o DUKE_TITLE duke_title.o -C ../linker_scripts/apple2_4000.inc -duke_title.o: duke_title.s zp.inc hardware.inc +duke_title.o: duke_title.s zp.inc hardware.inc init_vars.s ca65 -o duke_title.o duke_title.s -l duke_title.lst #### @@ -45,8 +45,8 @@ DUKE_LEVEL1: duke_level1.o duke_level1.o: duke_level1.s zp.inc hardware.inc \ print_help.s gr_fast_clear.s quit_yn.s text_drawbox.s level_end.s \ - enemies.s actions.s \ - graphics/duke_graphics.inc \ + enemies_level1.s actions_level1.s \ + graphics/duke_graphics.inc duke_sprites.inc \ maps/level1_map.lzsa \ status_bar.s draw_duke.s move_duke.s gr_putsprite_crop.s \ draw_tilemap.s \ @@ -61,8 +61,8 @@ DUKE_LEVEL2: duke_level2.o duke_level2.o: duke_level2.s zp.inc hardware.inc \ print_help.s gr_fast_clear.s quit_yn.s text_drawbox.s level_end.s \ - enemies.s actions.s \ - graphics/duke_graphics.inc \ + enemies_level2.s actions_level2.s \ + graphics/duke_graphics.inc duke_sprites.inc \ maps/level2_map.lzsa \ status_bar.s draw_duke.s move_duke.s gr_putsprite_crop.s \ draw_tilemap.s \ diff --git a/duke/TODO b/duke/TODO index f2e75bb5..aed5b8f4 100644 --- a/duke/TODO +++ b/duke/TODO @@ -1,7 +1,5 @@ before release: ~~~~~~~~~~~~~~~ -+ laser collision detection -+ enemies can be killed + pick up red key + fix collision when walking into things diff --git a/duke/actions.s b/duke/actions_level1.s similarity index 100% rename from duke/actions.s rename to duke/actions_level1.s diff --git a/duke/actions_level2.s b/duke/actions_level2.s new file mode 100644 index 00000000..70134391 --- /dev/null +++ b/duke/actions_level2.s @@ -0,0 +1,204 @@ + + ; someone pressed UP + +up_action: + + + ; set X and Y value + ; convert tile values to X,Y + ; X=((DUKE_X/2)-1)+TILEX + + lda DUKE_X + lsr + sec + sbc #1 + clc + adc TILEMAP_X + sta XPOS + + ; Y = (DUKEY/4)+TILEY + lda DUKE_Y + lsr + lsr + clc + adc TILEMAP_Y + sta YPOS + + ; $39,$22 = 57,34 + + ; check if it's a key slot +check_red_keyhole: + + + ; key slot is 280,148 + ; 280,148 (-80,-12) -> 200,136 -> (/4,/4) -> 50,34 + + lda XPOS + cmp #50 + beq redkey_x + cmp #51 + bne check_if_exit + +redkey_x: + + lda YPOS + cmp #34 + bne check_if_exit + + ; check that we have the key + lda INVENTORY + and #INV_RED_KEY + bne open_the_wall + +no_red_key: + jsr buzzer_noise + jmp done_up_action + + ; open the red wall + ; there has to be a more efficient way of doing this +open_the_wall: + ; reset smc + lda #>BIG_TILEMAP + sta rwr_smc1+2 + sta rwr_smc2+2 + +remove_red_wall_outer: + ldx #0 +remove_red_wall_loop: +rwr_smc1: + lda BIG_TILEMAP,X + cmp #49 ; red key tile + bne not_red_tile + lda #2 ; lblue bg tile +rwr_smc2: + sta BIG_TILEMAP,X +not_red_tile: + inx + bne remove_red_wall_loop + + inc rwr_smc1+2 + inc rwr_smc2+2 + + lda rwr_smc1+2 + cmp #(>BIG_TILEMAP)+40 + bne remove_red_wall_outer + + ; refresh local tilemap + + jsr copy_tilemap_subset + + jsr rumble_noise + + jmp done_up_action + + + ; check if it's the exit +check_if_exit: + + ; exit is 296,148 + ; 296,148 (-80,-12) -> 216,136 -> (/4,/4) -> 54,34 + + lda XPOS + cmp #54 + beq exit_x + + cmp #55 + bne done_up_action + +exit_x: + lda YPOS + cmp #34 + bne done_up_action + + ; check that we have the key + lda INVENTORY + and #INV_RED_KEY + beq done_up_action + + lda #1 + sta DOOR_ACTIVATED + + sta FRAMEL ; restart timer + +done_up_action: + + rts + + + ;========================== + ; open the door, end level + ;========================== +check_open_door: + lda DOOR_ACTIVATED + beq done_open_door + + asl + tay + lda door_opening,Y + sta INL + lda door_opening+1,Y + sta INH + + ; need to find actual door location + ; it's at 54,34 + ; Y is going to be at 20 unless something weird is going on + ; X is going to be ((54-TILE_X)+2)*2 + + lda #56 + sec + sbc TILEMAP_X + asl + sta XPOS + + lda #20 + sta YPOS + + jsr put_sprite_crop + + lda FRAMEL + and #$7 + bne done_open_door + + ; increment + + inc DOOR_ACTIVATED + lda DOOR_ACTIVATED + cmp #6 + bne done_open_door + + jsr level_end + +done_open_door: + rts + + + +door_opening: + .word door_sprite0 + .word door_sprite0 + .word door_sprite1 + .word door_sprite2 + .word door_sprite1 + .word door_sprite0 + +door_sprite0: + .byte 4,4 + .byte $15,$55,$55,$f5 + .byte $55,$f5,$5f,$55 + .byte $25,$25,$25,$25 + .byte $55,$55,$55,$55 + +door_sprite1: + .byte 4,4 + .byte $51,$f5,$f5,$5f + .byte $55,$05,$05,$50 + .byte $05,$50,$50,$55 + .byte $52,$55,$55,$52 + +door_sprite2: + .byte 4,4 + .byte $f5,$05,$05,$f0 + .byte $55,$00,$00,$55 + .byte $55,$00,$00,$55 + .byte $05,$50,$50,$25 + diff --git a/duke/draw_duke.s b/duke/draw_duke.s index 3f46d474..31b08f04 100644 --- a/duke/draw_duke.s +++ b/duke/draw_duke.s @@ -117,73 +117,4 @@ actually_draw_duke: rts -duke_sprite_stand_right: - .byte 4,4 - .byte $AA,$dd,$bd,$AA - .byte $AA,$3d,$Ab,$AA - .byte $AA,$6b,$b7,$A7 - .byte $AA,$56,$56,$AA - -duke_sprite_stand_left: - .byte 4,4 - .byte $AA,$bd,$dd,$AA - .byte $AA,$Ab,$3d,$AA - .byte $A7,$b7,$6b,$AA - .byte $AA,$56,$56,$AA - -duke_sprite_walking_right: - .byte 4,4 - .byte $AA,$dd,$bd,$AA - .byte $AA,$3d,$Ab,$AA - .byte $AA,$6b,$b7,$A7 - .byte $56,$A6,$A6,$5A - -duke_sprite_walking_left: - .byte 4,4 - .byte $AA,$bd,$dd,$AA - .byte $AA,$Ab,$3d,$AA - .byte $A7,$b7,$6b,$AA - .byte $5A,$A6,$A6,$56 - -duke_sprite_jumping_right: - .byte 4,4 - .byte $AA,$dd,$bd,$AA - .byte $AA,$3d,$Ab,$AA - .byte $AA,$6b,$b7,$A7 - .byte $55,$A6,$AA,$AA - -duke_sprite_jumping_left: - .byte 4,4 - .byte $AA,$bd,$dd,$AA - .byte $AA,$Ab,$3d,$AA - .byte $A7,$b7,$6b,$AA - .byte $AA,$AA,$A6,$55 - -duke_sprite_falling_right: - .byte 4,4 - .byte $AA,$dd,$bd,$AA - .byte $AA,$3d,$Ab,$AA - .byte $AA,$6b,$67,$A7 - .byte $5A,$A6,$56,$AA - -duke_sprite_falling_left: - .byte 4,4 - .byte $AA,$bd,$dd,$AA - .byte $AA,$Ab,$3d,$AA - .byte $A7,$67,$6b,$AA - .byte $AA,$56,$A6,$5A - -duke_sprite_shooting_right: - .byte 4,4 - .byte $AA,$dd,$bd,$AA - .byte $AA,$3d,$Ab,$AA - .byte $AA,$b7,$A7,$AA - .byte $AA,$56,$56,$AA - -duke_sprite_shooting_left: - .byte 4,4 - .byte $AA,$bd,$dd,$AA - .byte $AA,$Ab,$3d,$AA - .byte $AA,$A7,$b7,$AA - .byte $AA,$56,$56,$AA diff --git a/duke/duke_level1.s b/duke/duke_level1.s index e1525a6e..7f97e72e 100644 --- a/duke/duke_level1.s +++ b/duke/duke_level1.s @@ -220,11 +220,12 @@ done_with_duke: .include "level_end.s" .include "draw_duke.s" + .include "duke_sprites.inc" .include "move_duke.s" .include "handle_laser.s" .include "draw_tilemap.s" - .include "enemies.s" - .include "actions.s" + .include "enemies_level1.s" + .include "actions_level1.s" .include "sound_effects.s" .include "speaker_tone.s" diff --git a/duke/duke_level2.s b/duke/duke_level2.s index 84079518..1105416e 100644 --- a/duke/duke_level2.s +++ b/duke/duke_level2.s @@ -73,7 +73,7 @@ duke_start: jsr decompress_lzsa2_fast ;==================================== - ; load level1 tilemap + ; load level2 tilemap ;==================================== lda # 76,80 -> (/4,/4) -> 19,20 + .byte 1 ; out + .byte 0 ; exploding + .byte ENEMY_CAMERA ; type + .byte $ff ; direction + .byte 19,20 ; tilex,tiley + .byte 0,0 ; x,y + +enemy1: + ; 272,92 (-80,-12) -> 192,80 -> (/4,/4) -> 48,20 + .byte 1 ; out + .byte 0 ; exploding + .byte ENEMY_CAMERA ; type + .byte $ff ; direction + .byte 48,20 ; tilex,tiley + .byte 0,0 ; x,y + +enemy2: + ; 156,112 (-80,-12) -> 76,100 -> (/4,/4) -> 19,25 + .byte 1 ; out + .byte 0 ; exploding + .byte ENEMY_CRAWLER ; type + .byte $ff ; direction + .byte 19,25 ; tilex,tiley + .byte 0,0 ; x,y + +enemy3: + ; 184,116 (-80,-12) -> 104,104 -> (/4,/4) -> 26,26 + .byte 1 ; out + .byte 0 ; exploding + .byte ENEMY_BOT ; type + .byte $ff ; direction + .byte 26,26 ; tilex,tiley + .byte 0,0 ; x,y + + diff --git a/duke/loader.s b/duke/loader.s index c6264eee..6603f4aa 100644 --- a/duke/loader.s +++ b/duke/loader.s @@ -54,8 +54,6 @@ loader_start: jsr init ; unhook DOS, init nibble table - jsr init_vars - ;=================================================== ;=================================================== ; SETUP THE FILENAME diff --git a/duke/maps/level2_map.png b/duke/maps/level2_map.png index 12f45aa3d80077078b70b840b0bc086ee34d072e..518a1cfd2724fd2eee0ef369e41eec01e6298891 100644 GIT binary patch delta 3225 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 delta 3175 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