keen: can exit level

This commit is contained in:
Vince Weaver 2024-03-30 00:55:12 -04:00
parent 4c1f36cd64
commit 10f9706d05
6 changed files with 85 additions and 81 deletions

View File

@ -5,10 +5,11 @@ lo-res version
+ animate enemies?
+ check raygun count before shooting
+ fix background tile when get item
+ fix keybindings
+ fix keybindings/help menu
+ play jingle entering/leaving level
+ implement leaving level
+ animate death
+ game over screen if out of lives
hi-res version
~~~~~~~~~~~~~~

View File

@ -1,11 +1,28 @@
;======================
; check touching things
;======================
; do head, than foot
; FIXME: should we check both head/feet?
check_items:
jsr check_door
ldx KEEN_HEAD_POINTER
jsr check_item
ldx KEEN_FOOT_POINTER
; fallthrough
;==================
; check for items
;==================
; A holds tile value to check
check_item:
lda tilemap,X
do_check_enemy:
do_check_item:
cmp #27
bcc done_check_item ; not an item
cmp #32
@ -45,16 +62,14 @@ get_keycard:
done_item_pickup:
; erase
; FIXME: only erases small tilemap
; also need to update big
; erase small tilemap
lda #1 ; plain tile
sta tilemap,X
; big tilemap:
; tilemap
; to find... urgh
; X is currently (KEEN_Y/4)*20)+(KEEN_X/2)
lda KEEN_Y ; divide by 4 as tile 4 blocks tall
lsr
@ -71,7 +86,7 @@ done_item_pickup:
lda KEEN_X
lsr
tay
iny ; why add 1????
; iny ; why add 1????
lda #0 ; background tile
btc_smc:
@ -80,49 +95,27 @@ btc_smc:
; play sound
jsr pickup_noise
.if 0
check_red_key:
lda tilemap,X
cmp #31 ; red key
bne check_blue_key
jsr pickup_noise
lda INVENTORY
ora #INV_RED_KEY
sta INVENTORY
; erase red key (304,96)
lda #0
sta $A938 ; hack
jsr copy_tilemap_subset
jsr update_status_bar
jmp done_check_item
check_blue_key:
cmp #30 ; blue key
bne done_check_item
jsr pickup_noise
lda INVENTORY
ora #INV_BLUE_KEY
sta INVENTORY
; erase blue key
lda #0
sta $970c ; hack
jsr copy_tilemap_subset
jsr update_status_bar
jmp keen_check_head
.endif
done_check_item:
rts
;==========================
; check if feet at door
;==========================
check_door:
lda KEEN_FOOT_TILE1
cmp #11 ; door tile
beq at_door
lda KEEN_FOOT_TILE2
cmp #11
bne done_check_door
at_door:
inc LEVEL_OVER
; TODO: mark level complete somehow
jsr exit_music
done_check_door:
rts
score_lookup:
.byte $00,$01,$10,$05,$02,$50 ; BCD

View File

@ -44,10 +44,10 @@ keen_start:
lda #4
sta DRAW_PAGE
lda #18
sta KEEN_X
lda #11
sta KEEN_Y
; lda #18
; sta KEEN_X
; lda #11
; sta KEEN_Y
;====================================
; load mars background
@ -178,15 +178,15 @@ parts_zx02:
; D32
draw_keen:
lda KEEN_Y
lda MARS_Y
and #1
beq draw_keen_even
draw_keen_odd:
; calculate address of KEEN_Y/2
; calculate address of MARS_Y/2
lda KEEN_Y
lda MARS_Y
and #$FE
tay
lda gr_offsets,Y
@ -196,14 +196,14 @@ draw_keen_odd:
adc DRAW_PAGE
sta OUTH
ldy KEEN_X
ldy MARS_X
lda (OUTL),Y
and #$0f
ora #$D0
sta (OUTL),Y
lda KEEN_Y
lda MARS_Y
clc
adc #2
@ -216,7 +216,7 @@ draw_keen_odd:
adc DRAW_PAGE
sta OUTH
ldy KEEN_X
ldy MARS_X
lda #$23
sta (OUTL),Y
@ -227,7 +227,7 @@ draw_keen_odd:
draw_keen_even:
lda KEEN_Y
lda MARS_Y
; and #$FE ; no need to mask, know bottom bit is 0
tay
lda gr_offsets,Y
@ -236,12 +236,12 @@ draw_keen_even:
clc
adc DRAW_PAGE
sta OUTH
ldy KEEN_X ; adjust with Xpos
ldy MARS_X ; adjust with Xpos
lda #$3D
sta (OUTL),Y
lda KEEN_Y
lda MARS_Y
clc
adc #2
; and #$FE ; no need to mask
@ -252,7 +252,7 @@ draw_keen_even:
clc
adc DRAW_PAGE
sta OUTH
ldy KEEN_X ; adjust with Xpos
ldy MARS_X ; adjust with Xpos
lda (OUTL),Y
and #$F0
@ -374,12 +374,12 @@ check_left:
bne check_right
left_pressed:
ldy KEEN_X
ldy MARS_X
dey
ldx KEEN_Y
ldx MARS_Y
jsr check_valid_feet
bcc done_left_pressed
dec KEEN_X
dec MARS_X
done_left_pressed:
jmp done_keypress
@ -390,12 +390,12 @@ check_right:
bne check_up
right_pressed:
ldy KEEN_X
ldy MARS_X
iny
ldx KEEN_Y
ldx MARS_Y
jsr check_valid_feet
bcc done_right_pressed
inc KEEN_X
inc MARS_X
done_right_pressed:
jmp done_keypress
@ -406,12 +406,12 @@ check_up:
bne check_down
up_pressed:
ldy KEEN_X
ldx KEEN_Y
ldy MARS_X
ldx MARS_Y
dex
jsr check_valid_feet
bcc done_up_pressed
dec KEEN_Y
dec MARS_Y
done_up_pressed:
jmp done_keypress
@ -421,12 +421,12 @@ check_down:
cmp #$0A
bne check_space
down_pressed:
ldy KEEN_X
ldx KEEN_Y
ldy MARS_X
ldx MARS_Y
inx
jsr check_valid_feet
bcc done_up_pressed
inc KEEN_Y
inc MARS_Y
done_down_pressed:
jmp done_keypress
@ -554,7 +554,7 @@ done_parts:
do_action:
lda KEEN_X
lda MARS_X
cmp #15
bcc do_nothing ; blt
@ -571,7 +571,7 @@ do_nothing:
maybe_ship:
lda KEEN_Y
lda MARS_Y
cmp #16
bcc do_nothing
cmp #24

View File

@ -203,6 +203,11 @@ init_vars:
;============================
; set up initial location
lda #18
sta MARS_X
lda #11
sta MARS_Y
lda #LOAD_MARS
sta WHICH_LOAD ; start at first level

View File

@ -133,12 +133,9 @@ keen_collide:
;==================
; check for item
;==================
keen_check_item:
lda KEEN_HEAD_TILE1
keen_check_items:
jsr check_item
; TODO: do this again for KEEN_HEAD_TILE2?
jsr check_items
;===================
; collide with head
@ -408,6 +405,7 @@ keen_get_feet_even:
sta KEEN_HEAD_TILE1
lda tilemap+1,X
sta KEEN_HEAD_TILE2
stx KEEN_HEAD_POINTER
txa ; restore pointer to tile of head
clc
@ -420,6 +418,7 @@ keen_get_feet_even:
lda tilemap+1,X
sta KEEN_FOOT_TILE2
sta KEEN_WALK_TILE_R
stx KEEN_FOOT_POINTER
txa ; restore pointer to tile of foot
clc
@ -444,6 +443,7 @@ keen_get_feet_odd:
lda tilemap+1,X ; put tilemap value in place
sta KEEN_HEAD_TILE1
sta KEEN_HEAD_TILE2
stx KEEN_HEAD_POINTER
txa
clc
@ -457,6 +457,7 @@ keen_get_feet_odd:
sta KEEN_FOOT_TILE2
lda tilemap+2,X
sta KEEN_WALK_TILE_R
stx KEEN_FOOT_POINTER
txa
clc

View File

@ -144,8 +144,12 @@ KEEN_HEAD_TILE1 = $A5
KEEN_HEAD_TILE2 = $A6
KEEN_WALK_TILE_L = $A7
KEEN_WALK_TILE_R = $A8
KEEN_FOOT_POINTER = $A9
KEEN_HEAD_POINTER = $AA
MARS_X = $AB
MARS_Y = $AC
; done game puzzle state
WHICH_SLOT = $DA