aboutsummaryrefslogtreecommitdiff
path: root/modes/dungeon.gbasm
diff options
context:
space:
mode:
authorAstatin <[email protected]>2025-03-25 19:01:47 +0900
committerAstatin <[email protected]>2025-03-25 19:01:47 +0900
commitfb8e853fd0c6660696e762f67877b4d24a9f4c22 (patch)
tree4c2c69bd5e13bebfe02534541e4adcf2b67f335f /modes/dungeon.gbasm
parent2df3daa5128a27381fe5208fa4eac59ab10bdd9c (diff)
Separate modes VBlank functions
Diffstat (limited to 'modes/dungeon.gbasm')
-rw-r--r--modes/dungeon.gbasm172
1 files changed, 172 insertions, 0 deletions
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