video: made menu to level transiton look nicer
authorLukas Krickl <lukas@krickl.dev>
Tue, 15 Jul 2025 17:14:34 +0000 (19:14 +0200)
committerLukas Krickl <lukas@krickl.dev>
Tue, 15 Jul 2025 17:14:34 +0000 (19:14 +0200)
Moved BGP handling for fade out to a shadow register
fade in now takes a target palette as a parameter.
Moved IE to a shadow register so interrupts can be centrally configured
even if they are disabled.

src/mem.s
src/player.s
src/sys.s
src/update.s
src/video.s
src/wram.s

index 96d4e09ea870c5507f434eae7e1d27fafe37134e..e48a7e5341c832663a676a7e7ae5e378d28c17a5 100644 (file)
--- a/src/mem.s
+++ b/src/mem.s
@@ -5,6 +5,10 @@ mem_init:
   ld bc, WRAMLEN
   call memset
   
+  ; set up shadow IE
+  ld a, IVBLANK | ILCD
+  ld [shadow_ie], a
+
   ; set up rand
   call rand_init
 
index f695c6bfda78cc92cc80ececf7fab1ad2801b69d..be4b0f20258b64f5bb7018b299b2cfe6e42970c6 100644 (file)
@@ -160,6 +160,7 @@ unit_check_exit_hit:
   call scroll_write
 
   ; fade back in
+  ld a, [shadow_bpg] 
   call video_fade_in
 
 
index b881cba3e655ec6602bbd357ebd1aaa47b203e61..d2cec9676214a26370afeff975f906eab220ab44 100644 (file)
--- a/src/sys.s
+++ b/src/sys.s
@@ -16,14 +16,19 @@ panic:
 
 @loop:
   jp @loop
-
+  
+  ; enabels interrupts
+  ; writes shadow_ie to IE
 enableinterrupts:
   ; enable interrupts 
-  ld a, IVBLANK | ILCD
+  ld a, [shadow_ie]
   ld [IE], a
   ei 
   ret
 
+  ; disables interrupts
+  ; writes 0 to IE 
+  ; leaves shadow_ie as is
 disableinterrutpts:
   ld a, 0
   ld [IE], a
index c72a775e07fd94ffc95b5b2ebe95f9c471459617..4a835364f1fab8889f6c99748bfddc374e66d080 100644 (file)
@@ -41,6 +41,8 @@ update:
   ; loads default map
 new_game_init:
   call video_fade_out
+  
+  call shadow_oam_clear
 
   call unit_load_default_player
 
@@ -48,6 +50,9 @@ new_game_init:
   call map_init
   
   call game_init
+
+  ld a, BGP
+  ld [shadow_bpg], a 
   call video_fade_in
   ret
   
@@ -67,12 +72,15 @@ game_init:
   ; gameplay
   ld a, BGP 
   ld [RBGP], a
+  ld [shadow_bpg], a 
 
   ld a, 0b11100100 
   ld [ROBP0], a
+  ld [shadow_robp0], a
 
   ld a, 0b11011000
   ld [ROBP1], a
+  ld [shadow_robp1], a
 
   ldnull bc
   ret
index a9dec0d01f4974d7af5703fd99ac6aaa33af770d..5488045ac3ec7d8e9605db28196425951f26ec69 100644 (file)
@@ -151,7 +151,7 @@ video_wait_n_frames:
   ; inputs:
   ;   $1: BGP
 #macro video_fade_set_bgp
-  ld a, BGP 
+  ld a, [RBGP] 
   and a, $1 
   ld [RBGP], a
 
@@ -164,6 +164,7 @@ video_wait_n_frames:
   ; interrupts must be enabled
   ; preserved all registers
   ; disables window
+  ; fades away from current RBGP
 video_fade_out:
   push_all 
   
@@ -189,6 +190,8 @@ video_fade_out:
   ; interrupts must be enabled
   ; preserved all registers
   ; enables window
+  ; inputs:
+  ;   a: new palette
 video_fade_in:
   push_all
 
@@ -198,21 +201,26 @@ video_fade_in:
   ld a, [RLCD]
   and a, ~LCDF_WINDOWON & 0xFF
   ld [RLCD], a
-
-  video_fade_set_bgp 0b11000000
-  video_fade_set_bgp 0b11110000
-  video_fade_set_bgp 0b11111100
-  video_fade_set_bgp 0b11111111
+  
+  ; wait a few frames
+  call next_vblank_wait
+  call next_vblank_wait
+  call next_vblank_wait
+  call next_vblank_wait
+  call next_vblank_wait
+  call next_vblank_wait
+  call next_vblank_wait
 
   ; re-enable window
   ld a, [RLCD]
   or a, LCDF_WINDOWON
   ld [RLCD], a
 
-  ld a, BGP 
-  ld [RBGP], a
 
   pop_all
+  ; push all saved new palette value
+  ; so we can use it here
+  ld [RBGP], a
   ret
 #undefine video_fade_set_bgp
 
index bb576f563964ddd403e80361ee476f86e46a72f3..606445ac3e9d978291a6c21eaa94aa5cdc65c0d8 100644 (file)
@@ -22,6 +22,14 @@ curr_inputs: .adv 1
 prev_inputs: .adv 1
 
 game_mode: .adv st_size
+  
+  ; used by video fade out and fade in
+shadow_bpg: .adv 1
+shadow_robp0: .adv 1
+shadow_robp1: .adv 1
+
+; shadow version of IE
+shadow_ie: .adv 1
 
   ; status text buffer
 status_text: .adv 32