From fb8e853fd0c6660696e762f67877b4d24a9f4c22 Mon Sep 17 00:00:00 2001 From: Astatin Date: Tue, 25 Mar 2025 19:01:47 +0900 Subject: Separate modes VBlank functions --- modes/dungeon.gbasm | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 modes/dungeon.gbasm (limited to 'modes/dungeon.gbasm') diff --git a/modes/dungeon.gbasm b/modes/dungeon.gbasm new file mode 100644 index 0000000..41fc11d --- /dev/null +++ b/modes/dungeon.gbasm @@ -0,0 +1,172 @@ +Update_Blinking_Counter: + LD A, $mem_blinking_animation_counter + DEC A + CP $ff + RET Z + LD $mem_blinking_animation_counter, A + RET + +Update_Animation_Steps: + LD A, $mem_map_loading_flags + BIT 3, A + JR Z, =.update_mode + + LD A, $mem_moving_animation_step + INC A + AND $0f + LD $mem_moving_animation_step, A + + CP $00 + JR NZ, =.end + + LD A, $mem_map_loading_flags + RES 3, A + SET 1, A + LD $mem_map_loading_flags, A + + .update_mode: + + ; We need to make sure that the mode doesn't change to a mode with objects update while a dialogue box refresh is currently being done + LD A, $mem_current_mode + BIT 7, A + JR Z, =.set_current_mode + LD A, $mem_display_flag + AND 0b00010100 + CP $00 + JR NZ, =.end + + .set_current_mode: + LD A, $mem_requested_mode + LD $mem_current_mode, A + CALL =Update_VBlank_Handler + + .end: + LD A, $mem_bunny_health + CP $00 + RET NZ + LD A, $mem_moving_animation_step + CP $00 + RET NZ + + .Dead_mode: + + LD A, $20 + LD $mem_bunny_direction, A + + LD A, $enum_dead_mode + LD $mem_current_mode, A + CALL =Update_VBlank_Handler + + .CLOSE_DIALOGUE + + RET + +STAT_Entrypoint: + PUSH AF + PUSH DE + .SET_WINDOW_LCDC_E + + LD A, $reg_lyc + CP $0a + JR Z, =.End_Top_Bar + CP $67 + JR Z, =.Start_dialogue + .Thin_font: + LD A, $palette_thin_font + LD $reg_bg_palette, A + JR =.skip_dialogue + + .Start_dialogue: + LD A, $mem_display_flag + BIT 0, A + JR Z, =.skip_dialogue + .ENABLE_DIALOGUE + LD A, $mem_display_flag + BIT 1, A + JR Z, =.Thin_font + LD A, $palette_bold_font + LD $reg_bg_palette, A + LD A, $77 + LD $reg_lyc, A + .RESET_STAT_INTERRUPT + POP DE + POP AF + RETI + + .skip_dialogue: + .DISABLE_LYC_INTERRUPT + POP DE + POP AF + RETI + + .End_Top_Bar: + .DISABLE_DIALOGUE + LD A, $67 + LD $reg_lyc, A + .RESET_STAT_INTERRUPT + POP DE + POP AF + RETI + +Dungeon_VBLANK_Entrypoint: + .SET_WINDOW_LCDC_E + .ENABLE_TOP_BAR + + LD A, $palette_bold_font + LD $reg_bg_palette, A + + CALL $OAM_DMA_Transfer_routine + + LD A, $mem_current_mode + BIT 7, A + JR NZ, =Skip_VBlank_Dungeon_Update + LD HL, $9d60 + LD A, $mem_bunny_health + CALL =Print_8bit + + LD HL, $9d64 + LD A, $mem_bunny_mana + CALL =Print_8bit + + CALL =Display_Prepared_Blocks + CALL =Display_Object + Skip_VBlank_Dungeon_Update: + + ; LYC + LD A, $0a + LD $reg_lyc, A + .ENABLE_LYC_INTERRUPT + .RESET_STAT_INTERRUPT + EI + + CALL =Pad_Button_Check + CALL =Load_Additional_Block + + LD A, $mem_current_mode + CP $enum_dungeon_mode + JR NZ, =Skip_Dungeon_Update + + CALL =Entities_Actions + CALL =Object_Interactions_Check + CALL =Respawn_Entities + CALL =Prepare_Scrolling_Map + + Skip_Dungeon_Update: + LD A, $mem_current_mode + + CALL =Animation_Wait_Mode + CALL =Update_Blinking_Counter + CALL =Update_Animation_Steps + CALL =Check_Open_Menu_button + + LD A, $00 + LD $mem_oam_buffer_low, A + CALL =Display_Animation_List + CALL =Display_Entities + + LD A, $mem_loop_frame_timer + INC A + LD $mem_loop_frame_timer, A + + .ENABLE_VBLANK_INTERRUPTS + RETI -- cgit v1.2.3-70-g09d2