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:
~~~~~~~~~
+ jump one block too high
+ fall through upper platform
+ scroll with sub-block movement? might not work at hi-res?
enemies
~~~~~~~
+ remove yorps from background tiles
+ enemy movement
+ animate enemies?
+ allow stepping on head
+ disable when not on screen?
lo-res version
~~~~~~~~~~~~~~
+ walk behind some sprites (columns on level1)
+ fix keybindings/help menu
+ better start/stop level music
+ implement leaving level
+ animate death
+ game over screen if out of lives

View File

@ -2,38 +2,91 @@
; check touching things
;======================
; do head, than foot
; FIXME: should we check both left/right head/feet
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
; check if touching enemy
jsr check_enemy
; check head items
ldx KEEN_HEAD_POINTER_L
jsr check_item
ldx KEEN_HEAD_POINTER_R
; 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
ldx KEEN_FOOT_POINTER_R
; fallthrough
rts ; FIXME: fallthrough
;==================
; check for items
;==================
check_item:
lda tilemap,X
ldy #0
lda (INL),Y
do_check_item:
cmp #27
@ -55,8 +108,8 @@ do_check_item:
; otherwise look up points and add it
tay
lda score_lookup,Y
tax
lda score_lookup,X
jsr inc_score
jmp done_item_pickup
@ -75,41 +128,12 @@ get_keycard:
done_item_pickup:
; erase small tilemap
; erase big tilemap
lda #1 ; plain tile
sta tilemap,X
sta (INL),Y
; big tilemap:
; 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
jsr copy_tilemap_subset
; play sound
ldy #SFX_GOTITEMSND
@ -123,11 +147,9 @@ done_check_item:
; check if feet at door
;==========================
check_door:
lda KEEN_FOOT_TILE1
ldy #0
lda (INL),Y
cmp #11 ; door tile
beq at_door
lda KEEN_FOOT_TILE2
cmp #11
bne done_check_door
at_door:
@ -148,13 +170,8 @@ done_check_door:
;=============================
; level1 at least you can't touch with head?
check_enemy:
lda KEEN_FOOT_TILE1
cmp #21 ; green tentacles
beq touched_enemy
cmp #22 ; clam thing
beq touched_enemy
lda KEEN_FOOT_TILE2
ldy #0
lda (INL),Y
cmp #21 ; green tentacles
beq touched_enemy
cmp #22 ; clam thing
@ -193,7 +210,7 @@ score_lookup:
; 4 = carbonated beverage 200 pts
; ? = bear 5000 pts
.if 0
; bit of a hack
; 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
.endif

View File

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

View File

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