keen: back to feature parity
This commit is contained in:
parent
d20c367e94
commit
ceb32b2528
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue