dos33fsprogs/games/keen/engine_items.s

388 lines
5.2 KiB
ArmAsm
Raw Normal View History

ITEMS_START = 24 ; pogo is first?
ITEMS_MAX = 35 ; green keycard is last
ITEM_DOOR = 11
ITEM_POGO = 24
ITEM_SPECIAL = 25
ITEM_KEYCARD = 32
; POGO= 24
; SPECIAL = 25 (ship part or oracle)
; GUN = 26
; LOLLIPOP = 27
; SODA = 28
; PIZZA = 29
; BOOK = 30
; BEAR = 31
; YELLOW KEYCARD = 32
; RED KEYCARD = 33
; BLUE KEYCARD = 34
; GREEN KEYCARD = 35
2024-03-30 04:55:12 +00:00
;======================
; check touching things
;======================
; do head, than foot
2024-04-05 20:45:40 +00:00
2024-03-30 04:55:12 +00:00
check_items:
2024-03-30 05:05:25 +00:00
2024-04-06 06:18:42 +00:00
jsr check_yorp
2024-04-05 20:45:40 +00:00
;===================
; check head first
;===================
; if X==0, check TILEX and TILEX+1
; if X==1, check TILEX+1
2024-03-30 05:05:25 +00:00
ldx KEEN_TILEY
lda tilemap_lookup_high,X
2024-04-05 20:45:40 +00:00
sta INH
lda tilemap_lookup_low,X
ora KEEN_TILEX
2024-04-05 20:45:40 +00:00
sta INL
2024-03-30 04:55:12 +00:00
; clc
; adc #>big_tilemap
; sta INH
; lda KEEN_TILEX
; sta INL
2024-04-05 20:45:40 +00:00
lda KEEN_X
bne check_head_tilex1
;===================
; check head tilex
2024-03-30 05:05:25 +00:00
2024-04-05 20:45:40 +00:00
check_head_tilex:
; don't check door, only leave if feet at door
; check if touching enemy
2024-03-30 05:05:25 +00:00
jsr check_enemy
2024-04-05 20:45:40 +00:00
; check item
jsr check_item
check_head_tilex1:
inc INL
; don't check door, only leave if feet at door
2024-03-30 05:05:25 +00:00
2024-04-05 20:45:40 +00:00
; check if touching enemy
jsr check_enemy
; check items
jsr check_item
2024-04-05 20:45:40 +00:00
;========================
; check feet
check_feet:
; inc INH ; point to next row
lda INL ; blurgh much longer
clc
adc #$80
sta INL
lda #$0
adc INH
sta INH
; won't work, maybe not faster
; lda INL
; eor #$80
; sta INL
; asl
; adc INH
; sta INH
2024-04-05 20:45:40 +00:00
dec INL ; restore tile pointer
lda KEEN_X
bne check_feet_tilex1
check_feet_tilex:
; check if going out door
jsr check_door
2024-04-06 06:18:42 +00:00
; check if touching fixed enemy
2024-04-05 20:45:40 +00:00
jsr check_enemy
2024-04-06 06:18:42 +00:00
; check yorp
; jsr check_yorp
2024-04-05 20:45:40 +00:00
; check item
2024-03-30 04:55:12 +00:00
jsr check_item
2024-04-05 20:45:40 +00:00
check_feet_tilex1:
inc INL
; check if going out door
jsr check_door
2024-04-06 06:18:42 +00:00
; check if touching fixed enemy
2024-04-05 20:45:40 +00:00
jsr check_enemy
2024-03-30 05:05:25 +00:00
2024-04-06 06:18:42 +00:00
; check yorp
; jsr check_yorp
2024-04-05 20:45:40 +00:00
; check items
jsr check_item
2024-04-06 06:18:42 +00:00
; rts ; FIXME: fallthrough
2024-04-05 20:45:40 +00:00
2024-03-10 05:44:20 +00:00
;==================
; check for items
;==================
2024-03-29 05:34:20 +00:00
2024-03-10 05:44:20 +00:00
check_item:
2024-04-05 20:45:40 +00:00
ldy #0
lda (INL),Y
2024-03-10 05:44:20 +00:00
2024-03-30 04:55:12 +00:00
do_check_item:
2024-04-15 05:30:30 +00:00
cmp #ITEMS_START
2024-03-18 05:16:13 +00:00
bcc done_check_item ; not an item
cmp #(ITEMS_MAX+1)
2024-03-18 05:16:13 +00:00
bcs done_check_item ; not an item
cmp #ITEM_POGO
beq was_pogo ; if pogo, then pogo
cmp #ITEM_SPECIAL ; if oracle/ship part skip ahead
beq was_special
2024-03-18 05:16:13 +00:00
sec
sbc #ITEMS_START ; subtract off to get index
2024-03-18 05:16:13 +00:00
; 0 = laser gun
; 1 = lollipop 100 pts
; 2 = carbonated beverage 200 pts
2024-03-18 05:16:13 +00:00
; 3 = pizza 500 pts
; 4 = book 1000 pts
; 5 = bear 5000 pts
; 6...9 = keycards
beq get_laser_gun ; if laser gun skip ahead
2024-03-18 05:16:13 +00:00
cmp #6
bcs get_keycard
2024-03-20 05:40:58 +00:00
; otherwise look up points and add it
2024-03-18 05:16:13 +00:00
2024-04-05 20:45:40 +00:00
tax
lda score_lookup,X
2024-03-20 05:40:58 +00:00
jsr inc_score
jmp done_item_pickup
2024-03-18 05:16:13 +00:00
2024-03-20 05:40:58 +00:00
get_laser_gun:
2024-03-20 05:45:37 +00:00
lda RAYGUNS
clc
sed
adc #$05
sta RAYGUNS
cld
jmp done_item_pickup
2024-03-18 05:16:13 +00:00
2024-03-20 05:40:58 +00:00
; keycards go here too...
get_keycard:
; TODO
2024-03-20 05:40:58 +00:00
done_item_pickup:
2024-03-18 05:16:13 +00:00
2024-04-05 20:45:40 +00:00
; erase big tilemap
2024-03-18 05:16:13 +00:00
lda #1 ; plain tile
2024-04-05 20:45:40 +00:00
sta (INL),Y
2024-03-10 05:44:20 +00:00
2024-04-05 20:45:40 +00:00
jsr copy_tilemap_subset
2024-03-18 05:16:13 +00:00
; play sound
2024-04-04 05:06:29 +00:00
ldy #SFX_GOTITEMSND
jsr play_sfx
2024-03-18 05:16:13 +00:00
2024-03-10 05:44:20 +00:00
done_check_item:
rts
2024-03-20 05:40:58 +00:00
2024-03-30 04:55:12 +00:00
;==========================
; check if feet at door
;==========================
check_door:
2024-04-05 20:45:40 +00:00
ldy #0
lda (INL),Y
cmp #ITEM_DOOR ; door tile
2024-03-30 04:55:12 +00:00
bne done_check_door
at_door:
inc LEVEL_OVER
; TODO: mark level complete somehow
2024-04-04 05:06:29 +00:00
ldy #SFX_LVLDONESND
jsr play_sfx
2024-03-30 04:55:12 +00:00
done_check_door:
rts
2024-03-20 05:40:58 +00:00
;==================================
; item pogo
;==================================
was_pogo:
lda #$FF
sta POGO ; pick up pogo
bne done_item_pickup ; bra
;==================================
; item special
;==================================
; if oracle text, then oracle
; otherwise is ship part
was_special:
lda oracle_message
cmp #$ff
beq was_ship_part
2024-04-15 05:30:30 +00:00
was_oracle:
lda ORACLE_SPOKEN
bne done_oracle
bit KEYRESET
2024-04-15 05:30:30 +00:00
inc ORACLE_SPOKEN
bit TEXTGR
jsr clear_bottom
lda #<oracle_message
sta OUTL
lda #>oracle_message
sta OUTH
jsr move_and_print
jsr move_and_print
jsr move_and_print
jsr page_flip
wait_oracle:
lda KEYPRESS
bpl wait_oracle
bit KEYRESET
bit FULLGR
done_oracle:
rts
2024-03-30 05:05:25 +00:00
was_ship_part:
; TODO
; play sound effect
jmp done_item_pickup
2024-03-30 05:05:25 +00:00
;=============================
2024-04-06 06:18:42 +00:00
; check if touching enemy
2024-03-30 05:05:25 +00:00
;=============================
; level1 at least you can't touch with head?
check_enemy:
2024-04-05 20:45:40 +00:00
ldy #0
lda (INL),Y
2024-03-30 05:05:25 +00:00
cmp #21 ; green tentacles
beq touched_enemy
cmp #22 ; clam thing
bne done_check_enemy
touched_enemy:
2024-04-04 05:06:29 +00:00
2024-04-06 06:18:42 +00:00
; actual level over handled elsewhere
2024-04-06 03:56:13 +00:00
lda #TOUCHED_ENEMY
sta LEVEL_OVER
2024-04-04 05:06:29 +00:00
2024-04-06 06:18:42 +00:00
done_check_enemy:
rts
2024-04-04 05:06:29 +00:00
2024-04-06 06:18:42 +00:00
;==================================
; check if feet touching yorp head
;==================================
check_yorp:
2024-04-04 05:06:29 +00:00
2024-04-06 06:18:42 +00:00
ldx #0
check_yorp_loop:
lda enemy_data_out,X
beq no_yorp_stomp
lda enemy_data_state,X
cmp #YORP_STUNNED
beq no_yorp_stomp
lda enemy_data_tilex,X
cmp KEEN_TILEX
bne no_yorp_stomp
;==================
; K 0+1=1
; K Y
; Y
lda enemy_data_tiley,X
sec
sbc #1
cmp KEEN_TILEY
bne no_yorp_stomp
yes_yorp_stomp:
; this trashes X,Y
txa
pha
ldy #SFX_YORPBOPSND
jsr play_sfx
pla
tax
lda #YORP_STUNNED
sta enemy_data_state,X
lda #255
sta enemy_data_count,X
no_yorp_stomp:
inx
2024-04-19 05:30:17 +00:00
cpx NUM_ENEMIES
2024-04-06 06:18:42 +00:00
bne check_yorp_loop
done_check_yorp:
2024-03-30 05:05:25 +00:00
rts
2024-04-06 06:18:42 +00:00
2024-03-20 05:40:58 +00:00
score_lookup:
.byte $00,$01,$10,$05,$02,$50 ; BCD
; 0 = laser gun
; 1 = lollipop 100 pts
; 2 = carbonated beverage 200 pts
2024-03-20 05:40:58 +00:00
; 3 = pizza 500 pts
; 4 = book 1000 pts
; 5 = bear 5000 pts