; Cavern scenes (with the slugs) ootw_cavern: ;=========================== ; Enable graphics bit LORES bit SET_GR bit FULLGR ;================== ; setup drawing lda #0 sta DRAW_PAGE lda #1 sta DISP_PAGE ;====================== ; setup room boundaries lda #(-4+128) sta LEFT_LIMIT sta LEFT_WALK_LIMIT lda #(39+128) sta RIGHT_LIMIT sta RIGHT_WALK_LIMIT ;============================= ; Load background to $c00 jsr cavern_load_background ;================================ ; Load quake background to $BC00 jsr gr_make_quake ;================================ ; setup per-cave variables lda WHICH_CAVE bne cave1 cave0: ; set slug table to use lda #0 sta ds_smc1+1 lda #3 ; use slugs 0-2 sta ds_smc2+1 ; set right exit lda #1 sta cer_smc+1 lda #ootw_cavern sta cer_smc+6 ; set left exit lda #0 sta cel_smc+1 lda #ootw_pool sta cel_smc+6 jmp cave_setup_done cave1: ; set slug table to use lda #3 sta ds_smc1+1 lda #7 ; use slugs 3-6 sta ds_smc2+1 ; set right exit lda #1 sta cer_smc+1 lda #ootw_mesa sta cer_smc+6 ; set left exit lda #0 sta cel_smc+1 lda #ootw_cavern sta cel_smc+6 cave_setup_done: ;================================= ; copy $c00 background 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 BG_BEAST ; in case it wasn't gone yet ; make sure in range and such jsr refresh_slugs jsr setup_beast ;============================ ;============================ ;============================ ; Cavern Loop (not a palindrome) ;============================ ;============================ ;============================ cavern_loop: ;========================== ; handle earthquake jsr earthquake_handler ;=============== ; check keyboard jsr handle_keypress ;=============== ; move physicist jsr move_physicist ;=============== ; check room limits jsr check_screen_limit ;=============== ; draw physicist jsr draw_physicist ;================ ; handle beast lda BEAST_OUT beq cavern_no_beast ;================ ; move beast jsr move_beast ;================ ; draw beast jsr draw_beast cavern_no_beast: just_slugs: ;=============== ; draw slugs jsr draw_slugs ;====================== ; draw falling boulders jsr draw_boulder ;======================= ; page flip jsr page_flip ;======================== ; inc frame count inc FRAMEL bne frame_no_oflo_c inc FRAMEH frame_no_oflo_c: ;================= ; see if game over lda GAME_OVER beq still_in_cavern ; if 0, continue as per normal cmp #$ff ; if $ff, we died beq done_cavern ;=========================== ; see if exited room to right cmp #1 beq cavern_exit_left cavern_exit_right: lda #0 sta PHYSICIST_X cer_smc: lda #$0 sta WHICH_CAVE jmp ootw_pool ;========================== ; see if exited room to left cavern_exit_left: lda #37 sta PHYSICIST_X cel_smc: lda #$0 sta WHICH_CAVE jmp ootw_pool still_in_cavern: ; loop forever jmp cavern_loop done_cavern: rts ;=============================== ; load proper background to $c00 ;=============================== cavern_load_background: lda WHICH_CAVE bne cave_bg1 cave_bg0: ; load background lda #<(cavern_lzsa) sta getsrc_smc+1 ; LZSA_SRC_LO lda #>(cavern_lzsa) sta getsrc_smc+2 ; LZSA_SRC_HI jmp cave_bg_done cave_bg1: ; load background lda #<(cavern2_lzsa) sta getsrc_smc+1 ; LZSA_SRC_LO lda #>(cavern2_lzsa) sta getsrc_smc+2 ; LZSA_SRC_HI cave_bg_done: lda #$c ; load image off-screen $c00 jmp decompress_lzsa2_fast ; tail call