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? + animate enemies?
+ check raygun count before shooting + check raygun count before shooting
+ fix background tile when get item + fix background tile when get item
+ fix keybindings + fix keybindings/help menu
+ play jingle entering/leaving level + play jingle entering/leaving level
+ implement leaving level + implement leaving level
+ animate death + animate death
+ game over screen if out of lives
hi-res version 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 ; check for items
;================== ;==================
; A holds tile value to check
check_item: check_item:
lda tilemap,X
do_check_enemy:
do_check_item:
cmp #27 cmp #27
bcc done_check_item ; not an item bcc done_check_item ; not an item
cmp #32 cmp #32
@ -45,16 +62,14 @@ get_keycard:
done_item_pickup: done_item_pickup:
; erase ; erase small tilemap
; FIXME: only erases small tilemap
; also need to update big
lda #1 ; plain tile lda #1 ; plain tile
sta tilemap,X sta tilemap,X
; big tilemap: ; 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 lda KEEN_Y ; divide by 4 as tile 4 blocks tall
lsr lsr
@ -71,7 +86,7 @@ done_item_pickup:
lda KEEN_X lda KEEN_X
lsr lsr
tay tay
iny ; why add 1???? ; iny ; why add 1????
lda #0 ; background tile lda #0 ; background tile
btc_smc: btc_smc:
@ -80,49 +95,27 @@ btc_smc:
; play sound ; play sound
jsr pickup_noise 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: done_check_item:
rts 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: score_lookup:
.byte $00,$01,$10,$05,$02,$50 ; BCD .byte $00,$01,$10,$05,$02,$50 ; BCD

View File

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

View File

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

View File

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

View File

@ -144,8 +144,12 @@ KEEN_HEAD_TILE1 = $A5
KEEN_HEAD_TILE2 = $A6 KEEN_HEAD_TILE2 = $A6
KEEN_WALK_TILE_L = $A7 KEEN_WALK_TILE_L = $A7
KEEN_WALK_TILE_R = $A8 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 WHICH_SLOT = $DA