diff --git a/games/keen/TODO b/games/keen/TODO index f479d368..24a2fcab 100644 --- a/games/keen/TODO +++ b/games/keen/TODO @@ -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 diff --git a/games/keen/level1_items.s b/games/keen/level1_items.s index cf1bc9f1..de715982 100644 --- a/games/keen/level1_items.s +++ b/games/keen/level1_items.s @@ -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 diff --git a/games/keen/move_keen.s b/games/keen/move_keen.s index 30a17284..d7373d02 100644 --- a/games/keen/move_keen.s +++ b/games/keen/move_keen.s @@ -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 diff --git a/games/keen/zp.inc b/games/keen/zp.inc index 60505442..df9fc221 100644 --- a/games/keen/zp.inc +++ b/games/keen/zp.inc @@ -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