dos33fsprogs/ootw/ootw_pool.s
Vince Weaver 540d9e795c ootw: implement kicking and crouching
Apple II keyboard auto-repeat behavior makes this interesting
2019-01-18 11:33:23 -05:00

446 lines
5.1 KiB
ArmAsm

; Ootw Pool Party
ootw_pool:
;===========================
; Enable graphics
bit LORES
bit SET_GR
bit FULLGR
;===========================
; Clear both bottoms
lda #$4
sta DRAW_PAGE
jsr clear_bottom
lda #$0
sta DRAW_PAGE
jsr clear_bottom
lda #0
sta DRAW_PAGE
lda #1
sta DISP_PAGE
;=============================
; Load background to $c00
lda #$0c
sta BASH
lda #$00
sta BASL ; load image off-screen $c00
lda #>(pool_rle)
sta GBASH
lda #<(pool_rle)
sta GBASL
jsr load_rle_gr
;=================================
; copy to both pages $400/$800
jsr gr_copy_to_current
jsr page_flip
jsr gr_copy_to_current
;=================================
; setup vars
lda #0
sta GAIT
sta GAME_OVER
sta TENTACLE_GRAB
lda #30
sta TENTACLE_PROGRESS
;============================
; Pool Loop (palindrome)
;============================
pool_loop:
;================================
; copy background to current page
jsr gr_copy_to_current
;=======================
; draw pool ripples
lda FRAMEL
and #$30 ; 0110 1100
lsr
lsr
lsr
tax
lda pool_ripples,X
sta INL
lda pool_ripples+1,X
sta INH
lda #9
sta XPOS
lda #30
sta YPOS
jsr put_sprite
lda FRAMEL
and #$30 ; 0110 1100
lsr
lsr
lsr
clc
adc #2
and #$6
tax
lda pool_ripples,X
sta INL
lda pool_ripples+1,X
sta INH
lda #27
sta XPOS
lda #30
sta YPOS
jsr put_sprite
lda FRAMEL
and #$30 ; 0110 1100
lsr
lsr
lsr
clc
adc #4
and #$6
tax
lda #18
sta XPOS
lda #28
sta YPOS
jsr put_sprite
;==============================
; handle being grabbed
lda TENTACLE_GRAB
beq tentacle_action
;=================================
; actively being grabbed
lda TENTACLE_PROGRESS
tax
lda caught_progression,X
sta INL
lda caught_progression+1,X
sta INH
lda TENTACLE_X
sta XPOS
lda #22
sta YPOS
lda FRAMEL
and #$1f
bne no_caught_progress
inc TENTACLE_PROGRESS
inc TENTACLE_PROGRESS
no_caught_progress:
jsr put_sprite
lda TENTACLE_PROGRESS
cmp #24
bne beyond_tentacles
lda #$ff
sta GAME_OVER
jmp beyond_tentacles
;===============
; move/draw tentacle monster
tentacle_action:
lda FRAMEH
and #3
bne tentacle_move
lda FRAMEL
cmp #$ff
bne tentacle_move
tentacle_init:
sec
lda PHYSICIST_X
sbc #2
sta TENTACLE_X
lda #0
sta TENTACLE_PROGRESS
tentacle_move:
lda TENTACLE_PROGRESS
cmp #26
bpl no_tentacle
tax
lda tentacle_progression,X
sta INL
lda tentacle_progression+1,X
sta INH
lda TENTACLE_X
sta XPOS
lda #22
sta YPOS
lda FRAMEL
and #$3f
bne no_tentacle_progress
inc TENTACLE_PROGRESS
inc TENTACLE_PROGRESS
no_tentacle_progress:
jsr put_sprite
; See if we are fully extended
; if we are close enough to grab
lda TENTACLE_PROGRESS
cmp #12
bne no_tentacle
sec
lda PHYSICIST_X
sbc TENTACLE_X ; want -4 to 4
clc
adc #4 ; want 0 to 8
and #$f8
bne no_tentacle
lda #0
sta TENTACLE_PROGRESS
lda #1
sta TENTACLE_GRAB
no_tentacle:
;===============================
; check keyboard
jsr handle_keypress_pool
;===============
; draw physicist
jsr draw_physicist
beyond_tentacles:
;======================
; draw foreground plant
lda FRAMEL
and #$c0 ; 0110 1100
lsr
lsr
lsr
lsr
lsr
tax
lda plant_wind,X
sta INL
lda plant_wind+1,X
sta INH
lda #4
sta XPOS
lda #30
sta YPOS
jsr put_sprite
;===============
; page flip
jsr page_flip
;================
; inc frame count
inc FRAMEL
bne frame_no_oflo
inc FRAMEH
frame_no_oflo:
; pause?
; check if done this level
lda GAME_OVER
cmp #$ff
beq done_pool
; check if done this level
cmp #$1
bne not_done_pool
lda #0
sta PHYSICIST_X
jmp ootw_cavern
not_done_pool:
; loop forever
jmp pool_loop
done_pool:
rts
;======================================
; handle keypress (pool)
;======================================
handle_keypress_pool:
lda KEYPRESS ; 4
bmi keypress_pool ; 3
rts
keypress_pool:
; -1
and #$7f ; clear high bit
check_quit:
cmp #'Q'
beq quit
cmp #27
bne check_left
quit:
lda #$ff ; could just dec
sta GAME_OVER
rts
check_left:
cmp #'A'
beq left
cmp #$8 ; left arrow
bne check_right
left:
lda #0
sta CROUCHING
lda DIRECTION
bne face_left
dec PHYSICIST_X
bpl just_fine_left
too_far_left:
inc PHYSICIST_X
just_fine_left:
inc GAIT
inc GAIT
jmp done_keypress
face_left:
lda #0
sta DIRECTION
sta GAIT
jmp done_keypress
check_right:
cmp #'D'
beq right
cmp #$15
bne check_down
right:
lda #0
sta CROUCHING
lda DIRECTION
beq face_right
inc PHYSICIST_X
lda PHYSICIST_X
cmp #37
bne just_fine_right
too_far_right:
lda #1
sta GAME_OVER
rts
just_fine_right:
inc GAIT
inc GAIT
jmp done_keypress
face_right:
lda #0
sta GAIT
lda #1
sta DIRECTION
jmp done_keypress
check_down:
cmp #'S'
beq down
cmp #$0A
bne check_space
down:
lda #48
sta CROUCHING
lda #0
sta GAIT
jmp done_keypress
check_space:
cmp #' '
beq space
cmp #$15
bne unknown
space:
lda #15
sta KICKING
lda #0
sta GAIT
unknown:
done_keypress:
bit KEYRESET ; clear the keyboard strobe ; 4
no_keypress:
rts ; 6