; 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 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 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+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