From f43852d6036af8b03bfd72a82d55edc4a82ee4d6 Mon Sep 17 00:00:00 2001 From: Lukas Krickl Date: Thu, 17 Jul 2025 21:05:49 +0200 Subject: [PATCH] map: Added way to redraw 2 rows of tiles similar to UI redraw --- src/defs.s | 6 +++++ src/map.s | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++--- src/ui.s | 3 +-- src/wram.s | 8 ++++++ 4 files changed, 88 insertions(+), 6 deletions(-) diff --git a/src/defs.s b/src/defs.s index ef3d711..dfad1ce 100644 --- a/src/defs.s +++ b/src/defs.s @@ -35,12 +35,18 @@ #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 diff --git a/src/map.s b/src/map.s index 6ada788..22330a6 100644 --- 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 diff --git a/src/ui.s b/src/ui.s index 2477cb1..617a608 100644 --- 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 diff --git a/src/wram.s b/src/wram.s index fc77985..56fce98 100644 --- a/src/wram.s +++ b/src/wram.s @@ -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 -- 2.30.2