map: Added way to redraw 2 rows of tiles similar to UI redraw
authorLukas Krickl <lukas@krickl.dev>
Thu, 17 Jul 2025 19:05:49 +0000 (21:05 +0200)
committerLukas Krickl <lukas@krickl.dev>
Thu, 17 Jul 2025 19:05:49 +0000 (21:05 +0200)
src/defs.s
src/map.s
src/ui.s
src/wram.s

index ef3d7111b495d153e1bcb62b806772855fcccfea..dfad1ce71cc4fae7b5764d5d9cffb63645819817 100644 (file)
 #define UI_TILE_WIDTH 32
 #define UI_TILE_HEIGHT 4
 
+#define BG_WIDTH 32
+#define BG_SHADOW_HEIGHT 4
+
   ; defines end of scroll location
 #define CURSOR_MIN_X 0
 #define CURSOR_MAX_X 0xF8
 #define CURSOR_MIN_Y 0 
 #define CURSOR_MAX_Y 0xB8
 
+#define REDRAW_TILES_PER_FRAME 4
+
+
   ; each unit can have up to 4 status effects
 #define EFFECTS_MAX 4
 
index 6ada7886aeb81d5af16514a151031af3806ba61c..22330a6d3ac57edb488ba82f8d35ce8ae2ecae89 100644 (file)
--- a/src/map.s
+++ b/src/map.s
@@ -361,7 +361,7 @@ map_draw_all:
   ; hl = c_tile 
   
   ; load row 1
-  call map_draw_row
+  call map_draw_rows
   
   ld de, MAP_SIZE
   ld bc, SCRN0+32
@@ -372,18 +372,87 @@ map_draw_all:
   ld a, 16
   ld [TMP_TILE_OFFSET], a
   ld hl, map
-  call map_draw_row
+  call map_draw_rows
 
   ret
 
-  ; draws a map row
+  ; draws 2 2x2 rows of tiles to shadow_bg
+  ; map size is equal to 2 rows
+  ; inputs:
+  ;    a: row offset 
+map_draw_shadow2:
+  ld hl, map
+  ld de, MAP_W
+  
+  ; calculate what row to draw
+@offset_loop:
+    cp a, 0
+    jr z, @offset_done REL
+      ; go down a row
+      add hl, de 
+      dec a
+      jr @offset_loop REL
+@offset_done:
+  
+  push hl ; save map ptr
+
+  ; row 1
+  ld de, MAP_W * 2
+  ld bc, shadow_bg
+  xor a, a
+  ld [TMP_TILE_COUNT], a
+  ld [TMP_TILE_OFFSET], a
+
+  call map_draw_rows
+
+  ; row 2
+  pop hl ; resotre map ptr
+
+  ld de, MAP_W * 2
+  ld bc, shadow_bg+32
+  xor a, a
+  ld [TMP_TILE_COUNT], a
+  ld a, 16
+  ld [TMP_TILE_OFFSET], a
+  
+  call map_draw_rows
+
+  ret
+
+  ; requests a map redraw
+  ; this will set up redraw_bg
+  ; redraw_shadow and redraw steps for 4 rows of tiles
+  ; inputs:
+  ;   hl: bg target ptr
+map_request_redraw2:
+  ; write bg target
+  ld a, h
+  ld [redraw_bg], a
+  ld a, l
+  ld [redraw_bg+1], a
+
+  ; load tiles to write
+  ld de, shadow_bg
+  ld a, d
+  ld [redraw_shadow], a
+  ld a, e
+  ld [redraw_shadow+1], a
+  
+  ; steps of 5 * 16
+  ld a, BG_WIDTH * BG_SHADOW_HEIGHT / REDRAW_TILES_PER_FRAME
+  ld [redraw_steps], a
+  ret
+
+
+  ; draws a map rows
+  ; either top or bottom rows of a 2x2 tile
   ; inputs:
   ;   hl: map ptr
   ;   bc: SCRN start
   ;   de: MAP_SIZE
   ;   [TMP_TILE_COUNT]: 0
   ;   [TMP_TILE_OFFSET]: 0 or 16
-map_draw_row:
+map_draw_rows:
 @loop:
   push de
   ; load row 1
index 2477cb1e2b1be2011da63516958692adfeec5829..617a60862aa8f7998450c3a80ab10616d2497b54 100644 (file)
--- a/src/ui.s
+++ b/src/ui.s
@@ -28,7 +28,6 @@ ui_redraw_hp:
 
   ret
 
-#define UI_REDRAW_TILES_PER_FRAME 4
 
   ; requests a redraw
   ; this will set up redraw_bg
@@ -47,7 +46,7 @@ ui_request_redraw:
   ld [redraw_shadow+1], a
   
   ; steps of 5 * 16
-  ld a, UI_TILE_WIDTH * UI_TILE_HEIGHT / UI_REDRAW_TILES_PER_FRAME
+  ld a, UI_TILE_WIDTH * UI_TILE_HEIGHT / REDRAW_TILES_PER_FRAME
   ld [redraw_steps], a
   ret
 
index fc77985ed5b28db6d21f1c1cadbff8f959c5f204..56fce98dd6446bd0554494c366e62b988832aa1d 100644 (file)
@@ -50,6 +50,14 @@ gameplay_flags: .adv 1
   ; shadow UI is a buffer for drawing the UI
   ; this UI is then re-drawn on request in vblank
 shadow_ui: .adv UI_TILE_WIDTH * UI_TILE_HEIGHT
+  
+  ; shadow bg
+  ; 4 rows of tiles that can be updated 
+  ; the same way shadow_ui can be redrawn
+  ; draw new tiles here
+  ; and queue up a redraw for the desired amount of rows
+  ; at the desired location
+shadow_bg: .adv BG_WIDTH * BG_SHADOW_HEIGHT
 
 ; redraw BG address
 redraw_bg: .adv 2