dos33fsprogs/games/ootw/ootw_c1/ootw_c1_beast.s

477 lines
7.1 KiB
ArmAsm

; FIXME, if beast gets close and you pull away, it should trip
;=======================================
;=======================================
; Setup Beast Running -- for each room
;=======================================
;=======================================
setup_beast:
; only move beast if out
lda BEAST_OUT
beq setup_no_beast
; have the beast wait standing offscreen a bit??
; what were you thinking, 6-months-ago Vince?
lda #30
sta BEAST_COUNT
lda #B_STANDING
sta BEAST_STATE
; set Y position
lda #26
sta BEAST_Y
; what we do is based on direction
lda BEAST_DIRECTION
beq setup_beast_left
setup_beast_right:
; after rope scene, put beast further back so you
; have time to run a bit
lda WHICH_CAVE
cmp #4
beq beast_right_rope
jmp beast_right_set_normal
beast_right_rope:
lda #240
jmp beast_right_set_x
; adjust for distance
beast_right_set_normal:
lda BEAST_X
bpl right_set_not_neg ; how fast are you?
lda #0
right_set_not_neg:
lsr
lsr
adc #236 ;
beast_right_set_x:
sta BEAST_X
jmp setup_no_beast
;==============================
; running left
setup_beast_left:
; adjust for how far was on last screen
; /4
lda BEAST_X
lsr
lsr
clc
adc #40
sta BEAST_X
setup_no_beast:
rts
;=======================================
;=======================================
; Move Beast
;=======================================
;=======================================
; stop if catch physicist
; also stop if swinging
; run just every slightly faster than physicist
move_beast:
lda BEAST_STATE
cmp #B_RUNNING
beq move_beast_running
cmp #B_STANDING
beq move_beast_standing
rts
;======================
; running
move_beast_running:
;=======================
; stop at edge or at physicist
lda BEAST_DIRECTION
beq check_beast_left
check_beast_right:
; Bbbb^b
; Pp^pp
; if (B+6)==P
; if B=P-6
sec
lda PHYSICIST_X
sbc #$6
cmp BEAST_X
bne beast_no_stop
beq beast_caught
check_beast_left:
; stop if in rope room and at edge
lda WHICH_CAVE
cmp #3
bne beast_not_rope_room
beast_rope_room:
lda BEAST_X
cmp #11
bcs beast_not_rope_room ; bge
lda #B_STANDING
sta BEAST_STATE
lda #0
sta BEAST_COUNT
rts
beast_not_rope_room:
; no attack if swinging
lda PHYSICIST_STATE
cmp #P_SWINGING
beq skip_if_swinging
; Pp^pp Bbbbbb
; if B=p
clc
lda PHYSICIST_X
adc #$2
cmp BEAST_X
bne beast_no_stop
beq beast_caught
skip_if_swinging:
beast_no_stop:
inc BEAST_GAIT ; cycle through animation
lda BEAST_GAIT
and #$7
cmp #5
beq b_run
and #$3 ; only run roughly 3/8 of time
bne b_no_move_run
b_run:
lda BEAST_DIRECTION
beq b_run_left
inc BEAST_X ; run right
rts
b_run_left:
dec BEAST_X ; run left
b_no_move_run:
rts
beast_caught:
jmp beast_slash_cutscene
;======================
; standing
; need to check for collision here so physicist
; doesn't just run past beast at arrival
move_beast_standing:
lda BEAST_COUNT
beq beast_stand_done ; if 0, perma-stand
dec BEAST_COUNT
bne beast_stand_done
lda #B_RUNNING
sta BEAST_STATE
beast_stand_done:
lda PHYSICIST_X
cmp BEAST_X
bne p_not_foolish
jmp beast_slash_cutscene
p_not_foolish:
rts
;======================================
;======================================
; draw beast
;======================================
;======================================
draw_beast:
lda BEAST_STATE
cmp #B_STANDING
beq b_standing
cmp #B_RUNNING
beq b_running
rts
;==================================
; STANDING
;==================================
b_standing:
lda #<beast_standing
sta INL
lda #>beast_standing
sta INH
jmp finally_draw_beast
;===============================
; Running
;================================
b_running:
lda BEAST_GAIT
cmp #18
bcc brun_gait_fine ; blt
lda #0
sta BEAST_GAIT
brun_gait_fine:
; lsr
and #$fe
tax
lda beast_run_progression,X
sta INL
lda beast_run_progression+1,X
sta INH
jmp finally_draw_beast
;=============================
; Actually Draw Beast
;=============================
finally_draw_beast:
lda BEAST_X
sta XPOS
lda BEAST_Y ; was 26
sec
sbc EARTH_OFFSET ; adjust for earthquakes
sta YPOS
lda BEAST_DIRECTION
bne b_facing_right
b_facing_left:
jmp put_sprite_crop
b_facing_right:
jmp put_sprite_flipped_crop
;========================
;========================
; beast arrival cutscene
;========================
;========================
beast_arrival_cutscene:
;====================
; beast dropping in
lda #$8
sta DRAW_PAGE
jsr clear_top
lda #<beast_background
sta INL
lda #>beast_background
sta INH
lda #15
sta XPOS
lda #10
sta YPOS
jsr put_sprite
lda #$0
sta DRAW_PAGE
jsr gr_copy_to_current
jsr page_flip
jsr gr_copy_to_current
jsr page_flip
ldx #0
stx CUTFRAME
beast_loop:
jsr gr_copy_to_current
ldx CUTFRAME
lda beast_frames,X
sta INL
lda beast_frames+1,X
sta INH
lda #15
sta XPOS
lda #10
sta YPOS
jsr put_sprite
jsr page_flip
ldx #2
beast_long_delay:
lda #250
jsr WAIT
dex
bne beast_long_delay
ldx CUTFRAME
inx
inx
stx CUTFRAME
cpx #28
beq beast_end
jmp beast_loop
beast_end:
;=============================
; Restore background to $c00
lda #<(cavern3_lzsa)
sta getsrc_smc+1 ; LZSA_SRC_LO
lda #>(cavern3_lzsa)
sta getsrc_smc+2 ; LZSA_SRC_HI
lda #$c ; load image off-screen $c00
jmp decompress_lzsa2_fast
beast_frames:
.word beast_frame1 ; 0
.word beast_frame2 ; 1
.word beast_frame3 ; 2
.word beast_frame4 ; 3
.word beast_frame5 ; 4
.word beast_frame6 ; 5
.word beast_frame7 ; 6
.word beast_frame8 ; 7
.word beast_frame9 ; 8
.word beast_frame10 ; 9
.word beast_frame11 ; 10
.word beast_frame12 ; 11
.word beast_frame8 ; 12
.word beast_frame8 ; 13
;========================
;========================
; beast slash cutscene
;========================
;========================
beast_slash_cutscene:
lda #<beast_bg_lzsa
sta getsrc_smc+1 ; LZSA_SRC_LO
lda #>beast_bg_lzsa
sta getsrc_smc+2 ; LZSA_SRC_HI
lda #$c
jsr decompress_lzsa2_fast
ldx #0h
beast_slash_loop:
lda beast_slash_frames,X
sta getsrc_smc+1 ; LZSA_SRC_LO
lda beast_slash_frames+1,X
sta getsrc_smc+2 ; LZSA_SRC_HI
txa
pha
lda #$10
jsr decompress_lzsa2_fast
jsr gr_overlay
lda #200
jsr WAIT
jsr page_flip
pla
tax
inx
inx
cmp #40
bne beast_slash_loop
beast_slash_end:
lda #$ff
sta GAME_OVER
rts
beast_slash_frames:
.word beast_slash07_lzsa ; 0
.word beast_slash08_lzsa ; 1
.word beast_slash09_lzsa ; 2
.word beast_slash10_lzsa ; 3
.word beast_slash11_lzsa ; 4
.word beast_slash12_lzsa ; 5
.word beast_slash13_lzsa ; 6
.word beast_slash14_lzsa ; 7
.word beast_slash15_lzsa ; 8
.word beast_slash16_lzsa ; 9
.word beast_slash17_lzsa ; 10
.word beast_slash18_lzsa ; 11
.word beast_slash19_lzsa ; 12
.word beast_slash20_lzsa ; 13
.word beast_slash20_lzsa ; 14
.word beast_slash20_lzsa ; 15
.word beast_slash20_lzsa ; 16
.word beast_slash20_lzsa ; 17
.word beast_slash20_lzsa ; 18
.word beast_slash20_lzsa ; 19
.word beast_slash20_lzsa ; 20