#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
; hl = c_tile
; load row 1
- call map_draw_row
+ call map_draw_rows
ld de, MAP_SIZE
ld bc, SCRN0+32
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
ret
-#define UI_REDRAW_TILES_PER_FRAME 4
; requests a redraw
; this will set up redraw_bg
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
; 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