keen: back to feature parity

This commit is contained in:
Vince Weaver 2024-04-05 16:45:40 -04:00
parent d20c367e94
commit ceb32b2528
4 changed files with 129 additions and 88 deletions

View File

@ -1,20 +1,23 @@
sound effects
~~~~~~~~~~~~~
+ shorten item pickup noise
+ game over noise if you quit too?
movement: movement:
~~~~~~~~~ ~~~~~~~~~
+ jump one block too high + scroll with sub-block movement? might not work at hi-res?
+ fall through upper platform
enemies enemies
~~~~~~~ ~~~~~~~
+ remove yorps from background tiles + allow stepping on head
+ enemy movement + disable when not on screen?
+ animate enemies?
lo-res version lo-res version
~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~
+ walk behind some sprites (columns on level1) + walk behind some sprites (columns on level1)
+ fix keybindings/help menu + fix keybindings/help menu
+ better start/stop level music + better start/stop level music
+ implement leaving level
+ animate death + animate death
+ game over screen if out of lives + game over screen if out of lives

View File

@ -2,38 +2,91 @@
; check touching things ; check touching things
;====================== ;======================
; do head, than foot ; do head, than foot
; FIXME: should we check both left/right head/feet
check_items: check_items:
; check if going out door ;===================
; check head first
;===================
; if X==0, check TILEX and TILEX+1
; if X==1, check TILEX+1
clc
lda KEEN_TILEY
adc #>big_tilemap
sta INH
lda KEEN_TILEX
sta INL
lda KEEN_X
bne check_head_tilex1
;===================
; check head tilex
check_head_tilex:
; don't check door, only leave if feet at door
; check if touching enemy
jsr check_enemy
; check item
jsr check_item
check_head_tilex1:
inc INL
; don't check door, only leave if feet at door
; check if touching enemy
jsr check_enemy
; check items
jsr check_item
;========================
; check feet
check_feet:
inc INH ; point to next row
dec INL ; restore tile pointer
lda KEEN_X
bne check_feet_tilex1
check_feet_tilex:
; check if going out door
jsr check_door jsr check_door
; check if touching enemy ; check if touching enemy
jsr check_enemy jsr check_enemy
; check head items ; check item
ldx KEEN_HEAD_POINTER_L
jsr check_item
ldx KEEN_HEAD_POINTER_R
jsr check_item jsr check_item
; check feet items check_feet_tilex1:
inc INL
ldx KEEN_FOOT_POINTER_L ; check if going out door
jsr check_door
; check if touching enemy
jsr check_enemy
; check items
jsr check_item jsr check_item
ldx KEEN_FOOT_POINTER_R rts ; FIXME: fallthrough
; fallthrough
;================== ;==================
; check for items ; check for items
;================== ;==================
check_item: check_item:
lda tilemap,X ldy #0
lda (INL),Y
do_check_item: do_check_item:
cmp #27 cmp #27
@ -55,8 +108,8 @@ do_check_item:
; otherwise look up points and add it ; otherwise look up points and add it
tay tax
lda score_lookup,Y lda score_lookup,X
jsr inc_score jsr inc_score
jmp done_item_pickup jmp done_item_pickup
@ -75,41 +128,12 @@ get_keycard:
done_item_pickup: done_item_pickup:
; erase small tilemap ; erase big tilemap
lda #1 ; plain tile lda #1 ; plain tile
sta tilemap,X sta (INL),Y
; big tilemap: jsr copy_tilemap_subset
; to find... urgh
; X is currently (KEEN_Y/4)*20)+(KEEN_X/2)
; (X mod 20) = KEEN_X/2
; X/20 = KEEN_Y/4
;
lda div20_table,X
; lda KEEN_Y ; divide by 4 as tile 4 blocks tall
; lsr
; lsr
clc
adc TILEMAP_Y ; add in tilemap Y (each row 256 bytes)
adc #>big_tilemap ; add in offset of start
sta btc_smc+2
lda TILEMAP_X ; add in X offset of tilemap
sta btc_smc+1
lda mod20_table,X
; lda KEEN_X
; lsr
tay
lda #1 ; background tile
btc_smc:
sta $b000,Y
; play sound ; play sound
ldy #SFX_GOTITEMSND ldy #SFX_GOTITEMSND
@ -123,11 +147,9 @@ done_check_item:
; check if feet at door ; check if feet at door
;========================== ;==========================
check_door: check_door:
lda KEEN_FOOT_TILE1 ldy #0
lda (INL),Y
cmp #11 ; door tile cmp #11 ; door tile
beq at_door
lda KEEN_FOOT_TILE2
cmp #11
bne done_check_door bne done_check_door
at_door: at_door:
@ -148,13 +170,8 @@ done_check_door:
;============================= ;=============================
; level1 at least you can't touch with head? ; level1 at least you can't touch with head?
check_enemy: check_enemy:
lda KEEN_FOOT_TILE1 ldy #0
cmp #21 ; green tentacles lda (INL),Y
beq touched_enemy
cmp #22 ; clam thing
beq touched_enemy
lda KEEN_FOOT_TILE2
cmp #21 ; green tentacles cmp #21 ; green tentacles
beq touched_enemy beq touched_enemy
cmp #22 ; clam thing cmp #22 ; clam thing
@ -193,7 +210,7 @@ score_lookup:
; 4 = carbonated beverage 200 pts ; 4 = carbonated beverage 200 pts
; ? = bear 5000 pts ; ? = bear 5000 pts
.if 0
; bit of a hack ; bit of a hack
; TODO: auto-generate at startup ; TODO: auto-generate at startup
@ -229,3 +246,4 @@ mod20_table:
.byte 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 .byte 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
.byte 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 .byte 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
.endif

View File

@ -13,8 +13,8 @@ TILE_COLS = 20
;========================= ;=========================
move_keen: move_keen:
; lda #0 lda #0
; sta SUPPRESS_WALK ; ???? sta SUPPRESS_WALK ; if we collide we set this to stop walk
; jsr keen_get_feet_location ; get location of feet ; jsr keen_get_feet_location ; get location of feet
@ -26,27 +26,30 @@ move_keen:
lda KEEN_WALKING ; if not walking, we're done lda KEEN_WALKING ; if not walking, we're done
beq done_move_keen beq move_keen_early_out
dec KEEN_WALKING ; decrement walk count dec KEEN_WALKING ; decrement walk count
; lda SUPPRESS_WALK ; why???? lda SUPPRESS_WALK ; we hit somthing, don't walk
; bne done_move_keen bne move_keen_early_out
lda KEEN_DIRECTION ; check direction lda KEEN_DIRECTION ; check direction
bmi move_left bmi move_left
bpl move_right
move_keen_early_out:
jmp done_move_keen
;============================== ;==============================
; Move Keen Right ; Move Keen Right
;============================== ;==============================
; if (keen_tilex-tilemap_x<11) || (tilemap_x>96) walk ; if (keen_tilex-tilemap_x<11) || (tilemap_x>96) walk
; otherwise, scroll ; otherwise, scroll
move_right:
lda TILEMAP_X lda TILEMAP_X
cmp #96 ; 540-80 = 460/4 = 115-20 = 95 cmp #96 ; 540-80 = 460/4 = 115-20 = 95
bcs keen_walk_right bcs keen_walk_right
sec sec
lda KEEN_TILEX lda KEEN_TILEX
sbc TILEMAP_X sbc TILEMAP_X
@ -54,20 +57,15 @@ move_keen:
bcc keen_walk_right bcc keen_walk_right
keen_scroll_right: keen_scroll_right:
clc ; location is 8:8 fixed point
lda KEEN_XL
adc #KEEN_SPEED ; add in speed
sta KEEN_XL
bcc skip_keen_scroll_right ; if carry out we scroll
clc ; location is 8:8 fixed point inc TILEMAP_X ; scroll screen to right
lda KEEN_XL
adc #KEEN_SPEED ; add in speed
sta KEEN_XL
bcc skip_keen_scroll_right ; if carry out we scroll
inc TILEMAP_X ; scroll screen to right
inc KEEN_TILEX inc KEEN_TILEX
jsr copy_tilemap_subset ; update tilemap jsr copy_tilemap_subset ; update tilemap
@ -168,7 +166,7 @@ keen_collide:
;================== ;==================
keen_check_items: keen_check_items:
; jsr check_items jsr check_items
;=================== ;===================
; collide with head ; collide with head
@ -218,19 +216,37 @@ collide_head_r:
; jsr head_noise ; jsr head_noise
collide_left_right: collide_left_right:
rts
;=================== ;===================
; collide left/right ; collide left/right
;=================== ;===================
clc
lda KEEN_TILEY
adc #1
adc #>big_tilemap
sta INH
lda KEEN_TILEX
sta INL
lda KEEN_DIRECTION lda KEEN_DIRECTION
beq done_keen_collide ; can this happen? beq done_keen_collide ; can this happen?
bmi check_left_collide bmi check_left_collide
check_right_collide: check_right_collide:
lda KEEN_WALK_TILE_R
; if KEEN_X=0, collide +1
; if KEEN_X=1, collide +2
ldy #2
lda KEEN_X
beq right_collide_noextra
; iny
right_collide_noextra:
lda (INL),Y
; if tile# < ALLHARD_TILES then we are fine ; if tile# < ALLHARD_TILES then we are fine
cmp #ALLHARD_TILES cmp #ALLHARD_TILES
bcc done_keen_collide ; blt bcc done_keen_collide ; blt
@ -241,7 +257,10 @@ check_right_collide:
check_left_collide: check_left_collide:
lda KEEN_WALK_TILE_L ldy #0
lda (INL),Y
; lda KEEN_WALK_TILE_L
; if tile# < ALLHARD_TILES then we are fine ; if tile# < ALLHARD_TILES then we are fine
cmp #ALLHARD_TILES cmp #ALLHARD_TILES
bcc done_keen_collide ; blt bcc done_keen_collide ; blt

View File

@ -138,7 +138,7 @@ TILEMAP_OFFSET = $9F
; ;
.if 0
KEEN_FOOT_TILE1 = $A1 KEEN_FOOT_TILE1 = $A1
KEEN_FOOT_TILE2 = $A2 KEEN_FOOT_TILE2 = $A2
KEEN_FOOT_BELOW1 = $A3 KEEN_FOOT_BELOW1 = $A3
@ -151,6 +151,7 @@ KEEN_FOOT_POINTER_L = $A9
KEEN_FOOT_POINTER_R = $AA KEEN_FOOT_POINTER_R = $AA
KEEN_HEAD_POINTER_L = $AB KEEN_HEAD_POINTER_L = $AB
KEEN_HEAD_POINTER_R = $AC KEEN_HEAD_POINTER_R = $AC
.endif
MARS_X = $AD MARS_X = $AD
MARS_Y = $AE MARS_Y = $AE
INITIAL_SOUND = $AF INITIAL_SOUND = $AF