diff --git a/Makefile b/Makefile index 9ddff667f..9dc880850 100755 --- a/Makefile +++ b/Makefile @@ -107,7 +107,7 @@ else CC1 := $(shell $(PATH_MODERNCC) --print-prog-name=cc1) -quiet LIBPATH := -L "$(dir $(shell $(PATH_MODERNCC) -mthumb -print-file-name=libgcc.a))" -L "$(dir $(shell $(PATH_MODERNCC) -mthumb -print-file-name=libnosys.a))" -L "$(dir $(shell $(PATH_MODERNCC) -mthumb -print-file-name=libc.a))" LIB := $(LIBPATH) -lc -lnosys -lgcc -L../../libagbsyscall -lagbsyscall - override CC1FLAGS += -mthumb -mthumb-interwork -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -Wimplicit -Wparentheses -Wunused -Werror -O2 + override CC1FLAGS += -mthumb -mthumb-interwork -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -Wimplicit -Wparentheses -Wunused -Werror -O2 -g INCLUDE_DIRS := include INCLUDE_CPP_ARGS := $(INCLUDE_DIRS:%=-iquote %) INCLUDE_PATHS := $(INCLUDE_DIRS:%=-I %) diff --git a/include/code_800558C.h b/include/code_800558C.h deleted file mode 100644 index 838d53d78..000000000 --- a/include/code_800558C.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef GUARD_CODE_800558C_H -#define GUARD_CODE_800558C_H - -extern bool8 gUnknown_2026E38; -extern s16 *gUnknown_2026E3C; -extern s16 gUnknown_2026E4E; - -extern s16 *gUnknown_203B078; - -void sub_80057E8(void); -void sub_8005838(s32 *, u8 kind); -void sub_80060EC(void); - -#endif // GUARD_CODE_800558C_H diff --git a/include/text_1.h b/include/text_1.h index 1ce9901e2..9e8438d25 100644 --- a/include/text_1.h +++ b/include/text_1.h @@ -43,7 +43,7 @@ extern void (*ScrollUpWindowFunc)(s32 windowId); extern void (*gIwramTextFunc3)(s32 a0); extern void (*gIwramTextFunc4)(s32 a0); -extern s16 gUnknown_3000E94[161]; +extern s16 gWindowBg[161]; extern const u32 gUnknown_80B853C[16]; extern const unkShiftData gCharMasksOffsets[8]; diff --git a/include/text_2.h b/include/text_2.h index 86f7caca3..96ee0d1c6 100644 --- a/include/text_2.h +++ b/include/text_2.h @@ -16,7 +16,7 @@ void sub_8007B7C(u32 a0, s32 x, s32 y, s32 a3, u32 color); // srcGFX: Each u32 is 8 packed pixels, 4 bits per pixel. void WriteGFXToBG0Window(u32 winID, u32 x, u32 y, u32 w, u32 h, u32 *srcGFX, u32 palNum); void sub_80087EC(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); -void sub_80089AC(const WindowTemplate *r4, DungeonPos *r5_Str); +void DrawWindowBg(const WindowTemplate *window, DungeonPos *pos); u32 DrawCharOnWindow(s32 x, s32 y, u32 chr, u32 color, u32 windowId); bool8 xxx_call_update_bg_vram(void); u32 DrawCharOnWindowInternal(Window *windows, s32 x, s32 y, u32 chr, u32 color, u32 windowId); diff --git a/include/window_buffer.h b/include/window_buffer.h new file mode 100644 index 000000000..bfdc1ee69 --- /dev/null +++ b/include/window_buffer.h @@ -0,0 +1,23 @@ +#ifndef GUARD_WINDOW_BUFFER_H +#define GUARD_WINDOW_BUFFER_H + +extern bool8 gDrawWindow; +extern s16 *gWinBufferPtr; +extern s16 gUnknown_2026E4E; + +extern s16 *gWindowBgCopy; + +typedef enum CopyWindowBgBufferType { + COPY_WINDOW_BG_BUFFER_WIN0, + COPY_WINDOW_BG_BUFFER_DIM2, // Dim while in light darkness corridor + COPY_WINDOW_BG_BUFFER_DIM1, // Same but for heavy darkness + COPY_WINDOW_BG_BUFFER_ROOM_DIM, // While in a room, dim outside + COPY_WINDOW_BG_BUFFER_UNK4, + COPY_WINDOW_BG_BUFFER_UNK5, +} CopyWindowBgBufferType; + +void WindowBgBufferInit(void); +void CopyWindowBgBuffer(s32 *pos, u8 kind); +void ToggleWindowBgBuffer(void); + +#endif // GUARD_WINDOW_BUFFER_H diff --git a/ld_script.ld b/ld_script.ld index 28b165f19..a24951fd1 100755 --- a/ld_script.ld +++ b/ld_script.ld @@ -62,7 +62,7 @@ SECTIONS { src/input.o(.text); src/code_8004AA0.o(.text); src/sprite.o(.text); - src/code_800558C.o(.text); + src/window_buffer.o(.text); src/random.o(.text); src/text_1.o(.text); src/text_2.o(.text); @@ -440,7 +440,7 @@ SECTIONS { src/input.o(.rodata); src/code_8004AA0.o(.rodata); src/sprite.o(.rodata); - src/code_800558C.o(.rodata); + src/window_buffer.o(.rodata); src/random.o(.rodata); src/text_1.o(.rodata); src/text_2.o(.rodata); diff --git a/src/code_800558C.c b/src/code_800558C.c deleted file mode 100644 index 5ff29b4c0..000000000 --- a/src/code_800558C.c +++ /dev/null @@ -1,482 +0,0 @@ -#include "global.h" -#include "globaldata.h" -#include "bg_control.h" -#include "code_800558C.h" -#include "math.h" - -EWRAM_DATA bool8 gUnknown_2026E38 = FALSE; -EWRAM_DATA s16 *gUnknown_2026E3C = NULL; -EWRAM_DATA static s32 sUnknown_2026E40 = 0; // Read from but never written to -EWRAM_DATA static s32 sUnknown_2026E44 = 0; // Read from but never written to -EWRAM_DATA static s32 sUnknown_2026E48 = 0; // Read from but never written to -EWRAM_DATA static bool8 sUnknown_2026E4C = FALSE; -EWRAM_DATA s16 gUnknown_2026E4E = 0; -EWRAM_DATA static bool32 sUnknown_2026E50 = FALSE; -EWRAM_DATA static bool32 sUnknown_2026E54 = FALSE; -EWRAM_DATA static s16 *sUnknown_2026E58 = NULL; -UNUSED EWRAM_DATA static u32 sUnused0 = 0; -EWRAM_DATA static s16 sUnknown_2026E60[324] = {0}; // These might be [2][162] -EWRAM_DATA static s16 sUnknown_20270E8[324] = {0}; - -EWRAM_INIT s16 *gUnknown_203B078 = NULL; - -static const s16 gUnknown_80B8008[17] = {16, 12, 9, 7, 6, 5, 4, 3, 2, 2, 1, 1, 1, 0, 0, 0, 0}; - -#define UNK_TABLES_ARR_COUNT 160 - -static const s16 gUnknown_80B802A[UNK_TABLES_ARR_COUNT] = { - 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, - 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, - 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, - 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, - 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, - 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, - 0x846C, 0x8967, 0x8C64, 0x8E62, 0x9060, 0x915F, 0x935D, - 0x945C, 0x955B, 0x965A, 0x965A, 0x9759, 0x9858, 0x9858, - 0x9957, 0x9957, 0x9A56, 0x9A56, 0x9A56, 0x9B55, 0x9B55, - 0x9B55, 0x9B55, 0x9B55, 0x9C55, 0x9C54, 0x9C54, 0x9C54, - 0x9C54, 0x9C54, 0x9C54, 0x9C54, 0x9C54, 0x9C54, 0x9C54, - 0x9C54, 0x9C54, 0x9C54, 0x9C54, 0x9C54, 0x9C54, 0x9C54, - 0x9C54, 0x9C54, 0x9C54, 0x9C54, 0x9C54, 0x9C54, 0x9B55, - 0x9B55, 0x9B55, 0x9B55, 0x9B55, 0x9A56, 0x9A56, 0x9A56, - 0x9957, 0x9957, 0x9858, 0x9858, 0x9759, 0x965A, 0x965A, - 0x955B, 0x945C, 0x935D, 0x915F, 0x9060, 0x8E62, 0x8C64, - 0x8967, 0x846C, 0x100, 0x100, 0x100, 0x100, 0x100, - 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, - 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, - 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, - 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, - 0x100, 0x100, 0x100 -}; - -static const s16 gUnknown_80B816A[UNK_TABLES_ARR_COUNT] = { - 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, - 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, - 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, - 0x8071, 0x866B, 0x8A67, 0x8D64, 0x8F62, 0x9160, 0x935E, - 0x955C, 0x975A, 0x9958, 0x9A57, 0x9B56, 0x9D54, 0x9E53, - 0xA051, 0xA051, 0xA150, 0xA24F, 0xA44D, 0xA54C, 0xA54C, - 0xA64B, 0xA74A, 0xA849, 0xA948, 0xA948, 0xAA47, 0xAA47, - 0xAB46, 0xAC45, 0xAC45, 0xAD44, 0xAD44, 0xAE43, 0xAE43, - 0xAF42, 0xAF42, 0xB041, 0xB041, 0xB140, 0xB140, 0xB140, - 0xB23F, 0xB23F, 0xB23F, 0xB23F, 0xB33E, 0xB33E, 0xB33E, - 0xB33E, 0xB33E, 0xB33E, 0xB43D, 0xB43D, 0xB43D, 0xB43D, - 0xB43D, 0xB43D, 0xB43D, 0xB43D, 0xB43D, 0xB43D, 0xB43D, - 0xB43D, 0xB43D, 0xB43D, 0xB43D, 0xB43D, 0xB33E, 0xB33E, - 0xB33E, 0xB33E, 0xB33E, 0xB33E, 0xB23F, 0xB23F, 0xB23F, - 0xB23F, 0xB140, 0xB140, 0xB140, 0xB041, 0xB041, 0xAF42, - 0xAF42, 0xAE43, 0xAE43, 0xAD44, 0xAD44, 0xAC45, 0xAC45, - 0xAB46, 0xAA47, 0xAA47, 0xA948, 0xA948, 0xA849, 0xA74A, - 0xA64B, 0xA54C, 0xA54C, 0xA44D, 0xA24F, 0xA150, 0xA051, - 0xA051, 0x9E53, 0x9D54, 0x9B56, 0x9A57, 0x9958, 0x975A, - 0x955C, 0x935E, 0x9160, 0x8F62, 0x8D64, 0x8A67, 0x866B, - 0x8071, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, - 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, - 0x100 -}; - -// Almost all 0x100 -static const s16 gUnknown_80B82AA[UNK_TABLES_ARR_COUNT] = { - [0 ... 2] = 0x100, - [3] = 0x9392, - [4 ... UNK_TABLES_ARR_COUNT - 1] = 0x100 -}; -// All zeroes -static const s16 gUnknown_80B83EA[UNK_TABLES_ARR_COUNT] = { - [0 ... UNK_TABLES_ARR_COUNT - 1] = 0 -}; - -// arm9.bin::02006154 -void sub_80057E8(void) -{ - sUnknown_2026E4C = TRUE; - sUnknown_2026E54 = FALSE; - sUnknown_2026E50 = TRUE; - sUnknown_2026E58 = NULL; - gUnknown_2026E3C = NULL; - gUnknown_2026E38 = FALSE; - gUnknown_2026E4E = 0x60C; - gUnknown_203B078 = NULL; -} - -// arm9.bin::02005758 -void sub_8005838(s32 *a0, u8 kind) -{ - const s16 *src1, *src2; - s16 *dst; - s32 i; - - if (!sUnknown_2026E4C) - kind = 0; - - dst = !sUnknown_2026E54 ? sUnknown_2026E60 : sUnknown_20270E8; - - src1 = gUnknown_203B078; - if (src1 == NULL) - src1 = gUnknown_80B83EA; - - sUnknown_2026E58 = dst; - - switch (kind) { - case 0: - for (i = 0; i < 10; i++) { - *dst++ = *src1++; - *dst++ = 0; - *dst++ = *src1++; - *dst++ = 0; - *dst++ = *src1++; - *dst++ = 0; - *dst++ = *src1++; - *dst++ = 0; - *dst++ = *src1++; - *dst++ = 0; - *dst++ = *src1++; - *dst++ = 0; - *dst++ = *src1++; - *dst++ = 0; - *dst++ = *src1++; - *dst++ = 0; - *dst++ = *src1++; - *dst++ = 0; - *dst++ = *src1++; - *dst++ = 0; - *dst++ = *src1++; - *dst++ = 0; - *dst++ = *src1++; - *dst++ = 0; - *dst++ = *src1++; - *dst++ = 0; - *dst++ = *src1++; - *dst++ = 0; - *dst++ = *src1++; - *dst++ = 0; - *dst++ = *src1++; - *dst++ = 0; - } - break; - case 1: - src2 = gUnknown_80B816A; - for (i = 0; i < 10; i++) { - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - } - break; - case 2: - src2 = gUnknown_80B802A; - for (i = 0; i < 10; i++) { - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - } - break; - case 3: - if ((a0[0] < 0 && a0[2] < 0) - || (a0[1] < 0 && a0[3] < 0) - || (a0[0] >= 240 && a0[2] >= 240) - || (a0[1] >= 160 && a0[3] >= 160)) { - for (i = 0; i < 10; i++) { - *dst++ = *src1++; - *dst++ = 240; - *dst++ = *src1++; - *dst++ = 240; - *dst++ = *src1++; - *dst++ = 240; - *dst++ = *src1++; - *dst++ = 240; - *dst++ = *src1++; - *dst++ = 240; - *dst++ = *src1++; - *dst++ = 240; - *dst++ = *src1++; - *dst++ = 240; - *dst++ = *src1++; - *dst++ = 240; - *dst++ = *src1++; - *dst++ = 240; - *dst++ = *src1++; - *dst++ = 240; - *dst++ = *src1++; - *dst++ = 240; - *dst++ = *src1++; - *dst++ = 240; - *dst++ = *src1++; - *dst++ = 240; - *dst++ = *src1++; - *dst++ = 240; - *dst++ = *src1++; - *dst++ = 240; - *dst++ = *src1++; - *dst++ = 240; - } - } - else { - s32 iVar5; - s32 r4; - for (i = 0; i < 160; i++) { - if (a0[1] > i) { - *dst++ = *src1++; - *dst++ = 256; - } - else if (a0[3] <= i) { - *dst++ = *src1++; - *dst++ = 256; - } - else { - if (i - a0[1] < 16) { - r4 = a0[0] + gUnknown_80B8008[i - a0[1]]; - iVar5 = a0[2] - gUnknown_80B8008[i - a0[1]]; - } - else if (a0[3] - i < 16) { - r4 = a0[0] + gUnknown_80B8008[a0[3] - i]; - iVar5 = a0[2] - gUnknown_80B8008[a0[3] - i]; - } - else { - r4 = a0[0]; - iVar5 = a0[2]; - } - - if (r4 < 0) - r4 = 0; - if (r4 > 240 - 1) - r4 = 240 - 1; - - if (iVar5 < 1) - iVar5 = 1; - if (iVar5 > 240) - iVar5 = 240; - - *dst++ = *src1++; - *dst++ = (iVar5 << 8) | r4; - } - } - } - break; - case 4: - src2 = gUnknown_80B82AA; - for (i = 0; i < 15; i++) { - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - *dst++ = *src1++; - *dst++ = *src2++; - } - break; - case 5: { - s32 r8; - s32 sp14; - s32 uVar7; - s32 sp10; - s32 iVar11; - - s32 val1; - s32 val2; - s32 val3; - s32 spC; - - s32 j, k; - - for (i = 0; i < 15; i++) { - *dst++ = *src1++; - *dst++ = 256; - *dst++ = *src1++; - *dst++ = 256; - *dst++ = *src1++; - *dst++ = 256; - *dst++ = *src1++; - *dst++ = 256; - *dst++ = *src1++; - *dst++ = 256; - *dst++ = *src1++; - *dst++ = 256; - *dst++ = *src1++; - *dst++ = 256; - *dst++ = *src1++; - *dst++ = 256; - *dst++ = *src1++; - *dst++ = 256; - *dst++ = *src1++; - *dst++ = 256; - *dst++ = *src1++; - *dst++ = 256; - *dst++ = *src1++; - *dst++ = 256; - *dst++ = *src1++; - *dst++ = 256; - *dst++ = *src1++; - *dst++ = 256; - *dst++ = *src1++; - *dst++ = 256; - *dst++ = *src1++; - *dst++ = 256; - } - - val1 = sUnknown_2026E40; - val2 = sUnknown_2026E44; - val3 = sUnknown_2026E48; - - spC = 0x400 / (val3 / 256 + 1); - iVar11 = val2 / 256; - - k = iVar11; - j = iVar11; - for (sp10 = 0; sp10 < 0x400; sp10 += spC) { - s32 tmp1 = sin_4096(sp10) * val3 / 256; - - sp14 = (val2 + tmp1) / 256; - r8 = (val2 - tmp1) / 256; - - if (j < sp14 || k > r8) { - s32 tmp2 = cos_4096(sp10) * val3 / 256; - - s32 iVar5 = (val1 - tmp2) / 256; - s32 iVar3 = (val1 + tmp2) / 256; - - if (iVar5 < 0) - iVar5 = 0; - if (iVar3 < 0) - iVar3 = 0; - if (iVar5 > 240 - 1) - iVar5 = 160 - 1; - if (iVar3 > 240 - 1) - iVar3 = 160 - 1; - - if (iVar5 > iVar3) - uVar7 = (iVar5 << 8) | iVar3; - else - uVar7 = (iVar3 << 8) | iVar5; - - for (; j < sp14; j++) { - if (j < 0) - continue; - if (j >= 160) - continue; - - if (!sUnknown_2026E54) - sUnknown_2026E60[j * 2 + 1] = uVar7; - else - sUnknown_20270E8[j * 2 + 1] = uVar7; - } - - for (; k > r8; k--) { - if (k < 0) - continue; - if (k >= 160) - continue; - - if (!sUnknown_2026E54) - sUnknown_2026E60[k * 2 + 1] = uVar7; - else - sUnknown_20270E8[k * 2 + 1] = uVar7; - } - } - } - break; - } - } -} - -#if (GAME_VERSION == VERSION_RED) -UNUSED static void sub_80060A8(void) -{ - gUnknown_2026E3C = sUnknown_2026E58; - sUnknown_2026E54 = !sUnknown_2026E54; - sUnknown_2026E50 = !sUnknown_2026E50; - gUnknown_2026E38 = FALSE; -} -#endif - -// arm9.bin::020056C0 -void sub_80060EC(void) -{ - gUnknown_2026E3C = sUnknown_2026E58; - sUnknown_2026E54 = !sUnknown_2026E54; - sUnknown_2026E50 = !sUnknown_2026E50; - SetBldAlphaReg((gUnknown_2026E4E & 0x1F00) >> 8, gUnknown_2026E4E & 0x1F); - gUnknown_2026E38 = TRUE; -} diff --git a/src/code_8040094_1.c b/src/code_8040094_1.c index 06a263002..89df2e89b 100644 --- a/src/code_8040094_1.c +++ b/src/code_8040094_1.c @@ -4,7 +4,7 @@ #include "constants/type.h" #include "constants/weather.h" #include "structs/str_dungeon.h" -#include "code_800558C.h" +#include "window_buffer.h" #include "code_8040094_1.h" #include "dungeon_8041AD0.h" #include "dungeon_info.h" diff --git a/src/cpu.c b/src/cpu.c index 58343c3b0..000bd33af 100644 --- a/src/cpu.c +++ b/src/cpu.c @@ -1,6 +1,6 @@ #include "global.h" #include "bg_control.h" -#include "code_800558C.h" +#include "window_buffer.h" #include "cpu.h" EWRAM_DATA u32 gUnknown_202D800 = {0}; @@ -80,11 +80,14 @@ void VBlank_CB(void) REG_WINOUT = WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WIN01_BG3 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG0; REG_BLDCNT = gBldCnt; REG_BLDALPHA = gBldAlpha; - if (gUnknown_2026E38) { - // Very interesting use of DmaCopy16 here. - DmaSet(0, &gUnknown_2026E3C[2], REG_ADDR_WIN0H, ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_SRC_INC | DMA_DEST_RELOAD | DMA_16BIT) << 16) | 2); - REG_WIN0H = gUnknown_2026E3C[0]; - REG_WIN1H = gUnknown_2026E3C[1]; + if (gDrawWindow) { + // Write the next 2 values from gWinBufferPtr to WIN0H/WIN1H every HBlank, allows for drawing + // non-rectangular windows + DmaSet(0, &gWinBufferPtr[2], REG_ADDR_WIN0H, ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_SRC_INC | DMA_DEST_RELOAD | DMA_16BIT) << 16) | 2); + // Manually set the first WIN0H and WIN1H values + REG_WIN0H = gWinBufferPtr[0]; + REG_WIN1H = gWinBufferPtr[1]; + // Set WIN0V/WIN1V to max screen dimensions REG_WIN0V = DISPLAY_HEIGHT; REG_WIN1V = DISPLAY_HEIGHT; } diff --git a/src/debug_field_map.c b/src/debug_field_map.c index 50ef85498..b8e329d04 100644 --- a/src/debug_field_map.c +++ b/src/debug_field_map.c @@ -2,7 +2,7 @@ #include "globaldata.h" #include "debug_field_map_window.h" #include "music_util.h" -#include "code_800558C.h" +#include "window_buffer.h" #include "code_8099360.h" #include "code_800C9CC.h" #include "graphics_memory.h" @@ -38,7 +38,7 @@ UNUSED static void DebugMapViewer(void) sub_809975C(); sub_809D0AC(); ResetDialogueBox(); - sub_8005838(NULL, 0); + CopyWindowBgBuffer(NULL, COPY_WINDOW_BG_BUFFER_WIN0); AllocGroundMapAction(); while (TRUE) { bool8 quitMapView; @@ -48,7 +48,7 @@ UNUSED static void DebugMapViewer(void) if (DebugFieldMapWindow_Init()) { DebugFieldMapWindow_MoveMenuTo(mapId); while (TRUE) { - sub_8005838(NULL, 0); + CopyWindowBgBuffer(NULL, COPY_WINDOW_BG_BUFFER_WIN0); sub_8012A18(0); switch (DebugFieldMapWindow_GetInput()) { case MENU_INPUT_A_PRESS: @@ -132,8 +132,8 @@ UNUSED static void DebugMapViewer(void) sub_809D25C(); sub_80A59DC(); DrawDialogueBoxString_Async(); - sub_8005838(NULL, 0); - sub_80060EC(); + CopyWindowBgBuffer(NULL, COPY_WINDOW_BG_BUFFER_WIN0); + ToggleWindowBgBuffer(); nullsub_8(gGameOptionsRef->touchScreen); sub_8005180(); sub_8099BE4(); diff --git a/src/dungeon_8041AD0.c b/src/dungeon_8041AD0.c index f8ae86623..2035f82c3 100644 --- a/src/dungeon_8041AD0.c +++ b/src/dungeon_8041AD0.c @@ -7,7 +7,7 @@ #include "structs/dungeon_entity.h" #include "structs/sprite_oam.h" #include "structs/str_dungeon.h" -#include "code_800558C.h" +#include "window_buffer.h" #include "effect_main.h" #include "effect_sub_1.h" #include "effect_sub_2.h" diff --git a/src/dungeon_tilemap.c b/src/dungeon_tilemap.c index 10224aaef..0849e52cd 100644 --- a/src/dungeon_tilemap.c +++ b/src/dungeon_tilemap.c @@ -6,7 +6,7 @@ #include "bg_control.h" #include "bg_palette_buffer.h" #include "code_8004AA0.h" -#include "code_800558C.h" +#include "window_buffer.h" #include "graphics_memory.h" #include "effect_data.h" #include "confirm_name_menu.h" @@ -303,11 +303,11 @@ static void sub_803F7BC(void) u32 roomId = tile->room; if (strPtr->allTilesRevealed != 0 || strPtr->unk1820C != 0 || strPtr->unk18217 != 0) { - sub_8005838(NULL, 0); + CopyWindowBgBuffer(NULL, COPY_WINDOW_BG_BUFFER_WIN0); } else if (roomId == CORRIDOR_ROOM) { - u32 kind = (strPtr->visibilityRange == 2) ? 1 : 2; - sub_8005838(NULL, kind); + u32 kind = (strPtr->visibilityRange == 2) ? COPY_WINDOW_BG_BUFFER_DIM2 : COPY_WINDOW_BG_BUFFER_DIM1; + CopyWindowBgBuffer(NULL, kind); } else { s32 sp[4]; @@ -317,7 +317,7 @@ static void sub_803F7BC(void) sp[1] = room->unk10 - strPtr->cameraPixelPos.y; sp[2] = room->unk14 - strPtr->cameraPixelPos.x; sp[3] = room->unk18 - strPtr->cameraPixelPos.y; - sub_8005838(sp, 3); + CopyWindowBgBuffer(sp, 3); } } @@ -716,7 +716,7 @@ void sub_8040094(u8 r0) { gDungeon->unk181e8.unk18217 = r0; sub_803F7BC(); - sub_80060EC(); + ToggleWindowBgBuffer(); IncrementPlayTime(gPlayTimeRef); WaitForNextFrameAndAdvanceRNG(); LoadBufferedInputs(); diff --git a/src/dungeon_vram.c b/src/dungeon_vram.c index b450dfa98..996898731 100644 --- a/src/dungeon_vram.c +++ b/src/dungeon_vram.c @@ -5,7 +5,7 @@ #include "bg_control.h" #include "bg_palette_buffer.h" #include "code_8004AA0.h" -#include "code_800558C.h" +#include "window_buffer.h" #include "graphics_memory.h" #include "code_800C9CC.h" #include "music_util.h" @@ -206,7 +206,7 @@ static void sub_803E490(u32 unused) nullsub_8(gGameOptionsRef->touchScreen); sub_8005180(); nullsub_12(); - sub_80060EC(); + ToggleWindowBgBuffer(); gDungeonFramesCounter++; @@ -239,8 +239,8 @@ void sub_803E668(u32 unused) nullsub_8(gGameOptionsRef->touchScreen); sub_8005180(); nullsub_12(); - sub_8005838(NULL, 0); - sub_80060EC(); + CopyWindowBgBuffer(NULL, COPY_WINDOW_BG_BUFFER_WIN0); + ToggleWindowBgBuffer(); gDungeonFramesCounter++; IncrementPlayTime(gPlayTimeRef); WaitForNextFrameAndAdvanceRNG(); diff --git a/src/friend_areas_map.c b/src/friend_areas_map.c index 405947946..c2e991360 100644 --- a/src/friend_areas_map.c +++ b/src/friend_areas_map.c @@ -4,7 +4,7 @@ #include "bg_control.h" #include "bg_palette_buffer.h" #include "code_8004AA0.h" -#include "code_800558C.h" +#include "window_buffer.h" #include "graphics_memory.h" #include "code_800C9CC.h" #include "code_800D090.h" diff --git a/src/friend_areas_map_util.c b/src/friend_areas_map_util.c index 7a4478b63..f3807983b 100644 --- a/src/friend_areas_map_util.c +++ b/src/friend_areas_map_util.c @@ -4,7 +4,7 @@ #include "bg_control.h" #include "bg_palette_buffer.h" #include "code_8004AA0.h" -#include "code_800558C.h" +#include "window_buffer.h" #include "graphics_memory.h" #include "code_800C9CC.h" #include "code_800D090.h" @@ -373,10 +373,10 @@ void FriendAreasMap_RunFrameActions(void) SetBG3RegOffsets(gFriendAreasMapPtr->bgPos.x, gFriendAreasMapPtr->bgPos.y); AnimateSprites(); UpdateAnimatedColors(FadeScreen(), gFriendAreasMapPtr->unk4C4C, 0xB0, 16, gFriendAreasMapPtr->brightness, NULL); - sub_8005838(NULL, 0); + CopyWindowBgBuffer(NULL, COPY_WINDOW_BG_BUFFER_WIN0); nullsub_8(gGameOptionsRef->touchScreen); sub_8005180(); - sub_80060EC(); + ToggleWindowBgBuffer(); IncrementPlayTime(gPlayTimeRef); WaitForNextFrameAndAdvanceRNG(); LoadBufferedInputs(); diff --git a/src/ground_main.c b/src/ground_main.c index 47d880c0d..1dea79986 100644 --- a/src/ground_main.c +++ b/src/ground_main.c @@ -5,7 +5,7 @@ #include "structs/str_wonder_mail.h" #include "structs/str_dungeon_setup.h" #include "adventure_info.h" -#include "code_800558C.h" +#include "window_buffer.h" #include "code_800C9CC.h" #include "code_8094F88.h" #include "code_80958E8.h" @@ -308,8 +308,8 @@ u32 xxx_script_related_8098468_Async(s32 startMode) GroundMap_ExecuteEvent(EVENT_DIVIDE, FALSE); } GroundMap_Action(); - sub_8005838(NULL,0); - sub_80060EC(); + CopyWindowBgBuffer(NULL, COPY_WINDOW_BG_BUFFER_WIN0); + ToggleWindowBgBuffer(); xxx_call_update_bg_sound_input(); while ( 1 ) { xxx_call_update_bg_sound_input(); diff --git a/src/ground_map.c b/src/ground_map.c index 93f70ee6f..ddf7d16bf 100644 --- a/src/ground_map.c +++ b/src/ground_map.c @@ -10,7 +10,7 @@ #include "ground_weather.h" #include "memory.h" #include "ground_map_conversion_table.h" -#include "code_800558C.h" +#include "window_buffer.h" #include "constants/dungeon.h" #include "constants/ground_map.h" #include "code_809D148.h" diff --git a/src/ground_weather.c b/src/ground_weather.c index 4db101ad4..c8f1ed181 100644 --- a/src/ground_weather.c +++ b/src/ground_weather.c @@ -1,7 +1,7 @@ #include "global.h" #include "globaldata.h" #include "ground_weather.h" -#include "code_800558C.h" +#include "window_buffer.h" #include "debug.h" #include "event_flag.h" #include "ground_bg.h" diff --git a/src/main.c b/src/main.c index 651d72708..b4eaf72ef 100644 --- a/src/main.c +++ b/src/main.c @@ -3,7 +3,7 @@ #include "bg_control.h" #include "bg_palette_buffer.h" #include "code_8004AA0.h" -#include "code_800558C.h" +#include "window_buffer.h" #include "graphics_memory.h" #include "cpu.h" #include "crt0.h" @@ -90,7 +90,7 @@ void AgbMain(void) nullsub_6(); InitInput(); InitBGPaletteBuffer(); - sub_80057E8(); + WindowBgBufferInit(); InitFileSystem(); LoadCharmaps(); ResetScheduledMemCopies(); diff --git a/src/main_loops.c b/src/main_loops.c index 6687e2864..372641a7e 100644 --- a/src/main_loops.c +++ b/src/main_loops.c @@ -8,7 +8,7 @@ #include "adventure_info.h" #include "bg_control.h" #include "bg_palette_buffer.h" -#include "code_800558C.h" +#include "window_buffer.h" #include "code_800C9CC.h" #include "code_800D090_1.h" #include "code_8094F88.h" @@ -273,13 +273,13 @@ void GameLoop_Async(void) static void MainLoops_RunFrameActions(u32 unused) { DrawDialogueBoxString_Async(); - sub_8005838(NULL, 0); + CopyWindowBgBuffer(NULL, COPY_WINDOW_BG_BUFFER_WIN0); nullsub_8(gGameOptionsRef->touchScreen); sub_8005180(); // Extra call here in blue. Seems to be for 2nd screen sprites - sub_80060EC(); + ToggleWindowBgBuffer(); UpdateSoundEffectCounters(); WaitForNextFrameAndAdvanceRNG(); LoadBufferedInputs(); @@ -362,8 +362,8 @@ static void QuickSave_Async(u32 mode) sub_8099744(); sub_8099750(); SetCharacterMask(3); - sub_8005838(NULL, 0); - sub_80060EC(); + CopyWindowBgBuffer(NULL, COPY_WINDOW_BG_BUFFER_WIN0); + ToggleWindowBgBuffer(); CreateDialogueBoxAndPortrait(sSaveTextQuicksaving, 0, 0, 0x20); while (TRUE) { diff --git a/src/menu_input.c b/src/menu_input.c index 33cd3d517..aeeb69ed0 100644 --- a/src/menu_input.c +++ b/src/menu_input.c @@ -16,7 +16,7 @@ #include "code_800C9CC.h" #include "bg_palette_buffer.h" #include "game_options.h" -#include "code_800558C.h" +#include "window_buffer.h" const u32 gDefaultMenuTextColors[3] = { COLOR_WHITE_2, COLOR_RED, COLOR_RED }; @@ -66,7 +66,7 @@ void sub_8012A18(s32 unused) DrawDialogueBoxString_Async(); nullsub_8(gGameOptionsRef->touchScreen); sub_8005180(); - sub_80060EC(); + ToggleWindowBgBuffer(); WaitForNextFrameAndAdvanceRNG(); LoadBufferedInputs(); // Input related CopySpritesToOam(); diff --git a/src/other_menus1.c b/src/other_menus1.c index 8cf8775b0..53a71d9d0 100644 --- a/src/other_menus1.c +++ b/src/other_menus1.c @@ -4,7 +4,7 @@ #include "constants/main_menu.h" #include "structs/str_dungeon.h" #include "bg_palette_buffer.h" -#include "code_800558C.h" +#include "window_buffer.h" #include "graphics_memory.h" #include "code_800C9CC.h" #include "music_util.h" @@ -208,8 +208,8 @@ static void sub_80371B8(void) void sub_80373C4(void) { - sub_8005838(NULL, 0); - sub_80060EC(); + CopyWindowBgBuffer(NULL, COPY_WINDOW_BG_BUFFER_WIN0); + ToggleWindowBgBuffer(); WaitForNextFrameAndAdvanceRNG(); LoadBufferedInputs(); TransferBGPaletteBuffer(); diff --git a/src/run_dungeon.c b/src/run_dungeon.c index b2e75e33b..714663c8e 100644 --- a/src/run_dungeon.c +++ b/src/run_dungeon.c @@ -10,7 +10,7 @@ #include "structs/sprite_oam.h" #include "bg_control.h" #include "bg_palette_buffer.h" -#include "code_800558C.h" +#include "window_buffer.h" #include "graphics_memory.h" #include "effect_main.h" #include "effect_data.h" diff --git a/src/text_1.c b/src/text_1.c index a15312928..e6612f2c6 100644 --- a/src/text_1.c +++ b/src/text_1.c @@ -2,7 +2,7 @@ #include "globaldata.h" #include "structs/str_text.h" #include "bg_palette_buffer.h" -#include "code_800558C.h" +#include "window_buffer.h" #include "graphics_memory.h" #include "cpu.h" #include "decompress_at.h" @@ -37,7 +37,7 @@ EWRAM_INIT void (*ScrollUpWindowFunc)(s32 windowId) = ScrollUpWindow; EWRAM_INIT void (*gIwramTextFunc3)(s32 a0) = sub_82729A4; EWRAM_INIT void (*gIwramTextFunc4)(s32 a0) = sub_8272A78; -IWRAM_DATA ALIGNED(4) s16 gUnknown_3000E94[161] = {0}; +IWRAM_DATA ALIGNED(4) s16 gWindowBg[161] = {0}; const u32 gUnknown_80B853C[16] = { @@ -160,7 +160,7 @@ void LoadCharmaps(void) gDrawTextShadow = 1; gTextShadowMask = 0x88888888; - gUnknown_203B078 = NULL; + gWindowBgCopy = NULL; gUnknown_20274A5 = FALSE; gUnknown_202B020 = 1; gUnknown_202B024 = 20; @@ -266,18 +266,18 @@ static void ShowWindowsInternal(const WindowTemplates *winTemplates, bool8 a1, b if (winTemplates->id[i].width != 0) { AddWindow(gWindows, (u32 *)VRAM, sWindowGFXPool, gBgTilemaps, sUnknown_80B8804[i], &winTemplates->id[i], a1, startTileNum, positionModifier, FALSE); - sub_80089AC(&winTemplates->id[i], positionModifier); + DrawWindowBg(&winTemplates->id[i], positionModifier); startTileNum += winTemplates->id[i].width * winTemplates->id[i].totalHeight; } } // Needed to account for weird compiler LDRs - ASM_MATCH_TRICK(gUnknown_203B078); - ASM_MATCH_TRICK(gUnknown_3000E94[0]); + ASM_MATCH_TRICK(gWindowBgCopy); + ASM_MATCH_TRICK(gWindowBg[0]); ASM_MATCH_TRICK(gUnknown_20274A5); - gUnknown_203B078 = gUnknown_3000E94; + gWindowBgCopy = gWindowBg; gUnknown_20274A5 = TRUE; } diff --git a/src/text_2.c b/src/text_2.c index 097dcb814..463ed0b61 100644 --- a/src/text_2.c +++ b/src/text_2.c @@ -1107,169 +1107,184 @@ void ResetWindowBgData(void) { s32 i; - for (i = 0; i < ARRAY_COUNT_INT(gUnknown_3000E94); i++) { - gUnknown_3000E94[i] = 0xF0F0; + for (i = 0; i < ARRAY_COUNT_INT(gWindowBg); i++) { + gWindowBg[i] = 0xF0F0; } } -void sub_80089AC(const WindowTemplate *r4, DungeonPos *r5_Str) +void DrawWindowBg(const WindowTemplate *window, DungeonPos *pos) { - u8 *r6; + const u8 WINH_DEFAULT = 0xF0; + const s32 Y_MAX = 160; + u8 *windowArr; - if (r4->flags & WINTEMPLATE_FLAG_x40) + if (window->flags & WINTEMPLATE_FLAG_x40) return; - r6 = (u8*) gUnknown_3000E94; - if (r4->type == WINDOW_TYPE_WITHOUT_BORDER) { - s32 r12 = (r4->pos.x + r5_Str->x) * 8; - s32 r5 = (r4->pos.y + r5_Str->y) * 8; - s32 r7 = (r4->pos.x + r5_Str->x + r4->width) * 8; - s32 r2 = (r4->pos.y + r5_Str->y + r4->height) * 8; - if (r4->height != 0) { - if (r5 < 0) - r5 = 0; - if (r2 < 0) - r2 = 0; - if (r5 > 160) - r5 = 160; - if (r2 > 160) - r2 = 160; - while (r5 < r2) { - s32 id = r5 * 2; - if (r6[id] == 240 && r6[id + 1] == 240) { - r6[id++] = r7; - r6[id] = r12; + windowArr = (u8*) gWindowBg; + if (window->type == WINDOW_TYPE_WITHOUT_BORDER) { + s32 xStart = (window->pos.x + pos->x) * 8; + s32 yStart = (window->pos.y + pos->y) * 8; + s32 xEnd = (window->pos.x + pos->x + window->width) * 8; + s32 yEnd = (window->pos.y + pos->y + window->height) * 8; + if (window->height != 0) { + if (yStart < 0) + yStart = 0; + if (yEnd < 0) + yEnd = 0; + if (yStart > Y_MAX) + yStart = Y_MAX; + if (yEnd > Y_MAX) + yEnd = Y_MAX; + + // Draw window background + while (yStart < yEnd) { + s32 idx = yStart * 2; + if (windowArr[idx] == WINH_DEFAULT && windowArr[idx + 1] == WINH_DEFAULT) { + windowArr[idx++] = xEnd; // Right side of window + windowArr[idx] = xStart; // Left side of window } else { - if (r6[id] < r7) { - r6[id] = r7; + // Only allow window to expand in size? + // Right side of window + if (windowArr[idx] < xEnd) { + windowArr[idx] = xEnd; } - id++; - if (r6[id] > r12) { - r6[id] = r12; + idx++; + // Left side of window + if (windowArr[idx] > xStart) { + windowArr[idx] = xStart; } } - r5++; + yStart++; } } } - else if (r4->type == WINDOW_TYPE_WITH_HEADER) { + else if (window->type == WINDOW_TYPE_WITH_HEADER) { s32 i; - s32 r9 = ((r4->pos.x + r5_Str->x) * 8) - 5; - s32 r5 = ((r4->pos.y + r5_Str->y) * 8) - 4; - s32 var_24 = ((r4->pos.x + r5_Str->x + r4->width) * 8) + 5; - s32 r8 = ((r4->pos.y + r5_Str->y + r4->height) * 8) + 5; - s32 r12 = ((r4->pos.x + r5_Str->x) * 8) + 3; - const WindowHeader *r2 = r4->header; - s32 tmp = r2->width - 1; - s32 r10 = (((tmp + r2->count + 2) * 8) + r12) - 4; - s32 r4 = r9 + ((r2->currId + 1) * 8); - s32 r7 = (r4 + ((r2->width + 2) * 8)) - 4; + s32 xStart = ((window->pos.x + pos->x) * 8) - 5; + s32 yStart = ((window->pos.y + pos->y) * 8) - 4; + s32 xEnd = ((window->pos.x + pos->x + window->width) * 8) + 5; + s32 yEnd = ((window->pos.y + pos->y + window->height) * 8) + 5; + s32 allHeadersStart = ((window->pos.x + pos->x) * 8) + 3; + const WindowHeader *header = window->header; + s32 tmp = header->width - 1; + s32 allHeadersEnd = (((tmp + header->count + 2) * 8) + allHeadersStart) - 4; + s32 currHeaderStart = xStart + ((header->currId + 1) * 8); + s32 currHeaderEnd = (currHeaderStart + ((header->width + 2) * 8)) - 4; - if (r5 < 0) - r5 = 0; - if (r8 < 0) - r8 = 0; - if (r5 > 160) - r5 = 160; - if (r8 > 160) - r8 = 160; + if (yStart < 0) + yStart = 0; + if (yEnd < 0) + yEnd = 0; + if (yStart > Y_MAX) + yStart = Y_MAX; + if (yEnd > Y_MAX) + yEnd = Y_MAX; // BUG: The background array is 161 entries long, but this function will potentially write // up to index 160 + 12 = 172, overflowing the array. #ifdef UBFIX - if (r5 > 160 - 12) { - r5 = 160 - 12; + if (yStart > Y_MAX - 12) { + yStart = Y_MAX - 12; } #endif + // Draw extra header background for current tab + // For multi-tabbed windows, the current tab is taller, so need to draw an extra 4 pixels of BG for (i = 0; i < 4; i++) { - s32 id = r5 * 2; - if (r6[id] == 240 && r6[id + 1] == 240) { - r6[id++] = r7; - r6[id] = r4; + s32 idx = yStart * 2; + if (windowArr[idx] == WINH_DEFAULT && windowArr[idx + 1] == WINH_DEFAULT) { + windowArr[idx++] = currHeaderEnd; // Right side of window + windowArr[idx] = currHeaderStart; // Left side of window } else { - if (r6[id] < r7) { - r6[id] = r7; + // Only allow window to expand in size? + // Right side of window + if (windowArr[idx] < currHeaderEnd) { + windowArr[idx] = currHeaderEnd; } - id++; - if (r6[id] > r4) { - r6[id] = r4; + idx++; + // Left side of window + if (windowArr[idx] > currHeaderStart) { + windowArr[idx] = currHeaderStart; } } - r5++; - } - for (i = 0; i < 8; i++) { - s32 id = r5 * 2; - if (r6[id] == 240 && r6[id + 1] == 240) { - r6[id++] = r10; - r6[id] = r12; - } - else { - if (r6[id] < r10) { - r6[id] = r10; - } - id++; - if (r6[id] > r12) { - r6[id] = r12; - } - } - r5++; + yStart++; } - while (r5 < r8) { - s32 id = r5 * 2; - if (r6[id] == 240 && r6[id + 1] == 240) { - r6[id++] = var_24; - r6[id] = r9; + // Draw header background for all tabs + for (i = 0; i < 8; i++) { + s32 id = yStart * 2; + if (windowArr[id] == WINH_DEFAULT && windowArr[id + 1] == WINH_DEFAULT) { + windowArr[id++] = allHeadersEnd; // Right side of window + windowArr[id] = allHeadersStart; // Left side of window } else { - if (r6[id] < var_24) { - r6[id] = var_24; + if (windowArr[id] < allHeadersEnd) { + windowArr[id] = allHeadersEnd; } id++; - if (r6[id] > r9) { - r6[id] = r9; + if (windowArr[id] > allHeadersStart) { + windowArr[id] = allHeadersStart; } } - r5++; + yStart++; + } + + // Draw main window background + while (yStart < yEnd) { + s32 idx = yStart * 2; + if (windowArr[idx] == WINH_DEFAULT && windowArr[idx + 1] == WINH_DEFAULT) { + windowArr[idx++] = xEnd; // Right side of window + windowArr[idx] = xStart; // Left side of window + } + else { + if (windowArr[idx] < xEnd) { + windowArr[idx] = xEnd; + } + idx++; + if (windowArr[idx] > xStart) { + windowArr[idx] = xStart; + } + } + yStart++; } } else { - s32 r8 = ((r4->pos.x + r5_Str->x) * 8) - 5; - s32 r3 = ((r4->pos.y + r5_Str->y) * 8) - 5; - s32 r12 = ((r4->pos.x + r5_Str->x + r4->width) * 8) + 5; - s32 r5 = ((r4->pos.y + r5_Str->y + r4->height) * 8) + 5; - if (r4->height != 0) { - if (r4->type == 0) { - r3 += 8; - r5 = ((r4->pos.y + r5_Str->y + r4->height) * 8) - 3; + s32 xStart = ((window->pos.x + pos->x) * 8) - 5; + s32 yStart = ((window->pos.y + pos->y) * 8) - 5; + s32 xEnd = ((window->pos.x + pos->x + window->width) * 8) + 5; + s32 yEnd = ((window->pos.y + pos->y + window->height) * 8) + 5; + if (window->height != 0) { + if (window->type == WINDOW_TYPE_0) { + yStart += 8; + yEnd = ((window->pos.y + pos->y + window->height) * 8) - 3; } - if (r3 < 0) - r3 = 0; - if (r5 < 0) - r5 = 0; - if (r3 > 160) - r3 = 160; - if (r5 > 160) - r5 = 160; - while (r3 < r5) { - s32 id = r3 * 2; - if (r6[id] == 240 && r6[id + 1] == 240) { - r6[id++] = r12; - r6[id] = r8; + if (yStart < 0) + yStart = 0; + if (yEnd < 0) + yEnd = 0; + if (yStart > Y_MAX) + yStart = Y_MAX; + if (yEnd > Y_MAX) + yEnd = Y_MAX; + while (yStart < yEnd) { + s32 idx = yStart * 2; + if (windowArr[idx] == WINH_DEFAULT && windowArr[idx + 1] == WINH_DEFAULT) { + windowArr[idx++] = xEnd; // Right side of window + windowArr[idx] = xStart; // Left side of window } else { - if (r6[id] < r12) { - r6[id] = r12; + if (windowArr[idx] < xEnd) { + windowArr[idx] = xEnd; } - id++; - if (r6[id] > r8) { - r6[id] = r8; + idx++; + if (windowArr[idx] > xStart) { + windowArr[idx] = xStart; } } - r3++; + yStart++; } } } diff --git a/src/textbox.c b/src/textbox.c index f3b35b49b..04a9f3cdb 100644 --- a/src/textbox.c +++ b/src/textbox.c @@ -5,7 +5,7 @@ #include "structs/menu.h" #include "structs/str_file_system.h" #include "structs/str_mon_portrait.h" -#include "code_800558C.h" +#include "window_buffer.h" #include "code_800D090.h" #include "code_8015080.h" #include "code_801B60C.h" @@ -1040,16 +1040,16 @@ void sub_809B57C_Async(void) } if (sTextbox->unk434 < 0) { - sub_8005838(0, 0); + CopyWindowBgBuffer(0, COPY_WINDOW_BG_BUFFER_WIN0); } else { - sub_8005838(0, 5); + CopyWindowBgBuffer(0, 5); } } void sub_809B614(void) { - sub_80060EC(); + ToggleWindowBgBuffer(); gUnknown_20399DE = gUnknown_20399DC; gUnknown_20399DC &= ~2; } diff --git a/src/window_buffer.c b/src/window_buffer.c new file mode 100644 index 000000000..90053fbc9 --- /dev/null +++ b/src/window_buffer.c @@ -0,0 +1,312 @@ +#include "global.h" +#include "globaldata.h" +#include "bg_control.h" +#include "window_buffer.h" +#include "math.h" + +#define UNROLL16(x) do { x; x; x; x; x; x; x; x; x; x; x; x; x; x; x; x; } while (0) + +EWRAM_DATA bool8 gDrawWindow = FALSE; +EWRAM_DATA s16 *gWinBufferPtr = NULL; +EWRAM_DATA static s32 sUnknown_2026E40 = 0; // Read from but never written to +EWRAM_DATA static s32 sUnknown_2026E44 = 0; // Read from but never written to +EWRAM_DATA static s32 sUnknown_2026E48 = 0; // Read from but never written to +EWRAM_DATA static bool8 sInitialized = FALSE; +EWRAM_DATA s16 gUnknown_2026E4E = 0; +EWRAM_DATA static bool32 sBoolUnk = FALSE; // Toggled but is never read +EWRAM_DATA static bool32 sBufferIdx = FALSE; // Write to sBuffer0 or sBuffer1 +EWRAM_DATA static s16 *sBufferPtr = NULL; +UNUSED EWRAM_DATA static u32 sUnused0 = 0; +EWRAM_DATA static s16 sBuffer0[324] = {0}; // These might be [2][162] +EWRAM_DATA static s16 sBuffer1[324] = {0}; + +EWRAM_INIT s16 *gWindowBgCopy = NULL; + +// Rounded corners in low visibility rooms +static const s16 sRoomCornerDim[17] = {16, 12, 9, 7, 6, 5, 4, 3, 2, 2, 1, 1, 1, 0, 0, 0, 0}; + +#define Y_MAX 160 +#define X_MAX 240 +// In corridor with heavy darkness, dim everything except a small circle +static const s16 sCorridorDim1[Y_MAX] = { + 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, + 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, + 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, + 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, + 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, + 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, + 0x846C, 0x8967, 0x8C64, 0x8E62, 0x9060, 0x915F, 0x935D, + 0x945C, 0x955B, 0x965A, 0x965A, 0x9759, 0x9858, 0x9858, + 0x9957, 0x9957, 0x9A56, 0x9A56, 0x9A56, 0x9B55, 0x9B55, + 0x9B55, 0x9B55, 0x9B55, 0x9C55, 0x9C54, 0x9C54, 0x9C54, + 0x9C54, 0x9C54, 0x9C54, 0x9C54, 0x9C54, 0x9C54, 0x9C54, + 0x9C54, 0x9C54, 0x9C54, 0x9C54, 0x9C54, 0x9C54, 0x9C54, + 0x9C54, 0x9C54, 0x9C54, 0x9C54, 0x9C54, 0x9C54, 0x9B55, + 0x9B55, 0x9B55, 0x9B55, 0x9B55, 0x9A56, 0x9A56, 0x9A56, + 0x9957, 0x9957, 0x9858, 0x9858, 0x9759, 0x965A, 0x965A, + 0x955B, 0x945C, 0x935D, 0x915F, 0x9060, 0x8E62, 0x8C64, + 0x8967, 0x846C, 0x100, 0x100, 0x100, 0x100, 0x100, + 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, + 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, + 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, + 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, + 0x100, 0x100, 0x100 +}; + +// In corridor with light darkness, dim everything except a larger circle +static const s16 sCorridorDim2[Y_MAX] = { + 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, + 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, + 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, + 0x8071, 0x866B, 0x8A67, 0x8D64, 0x8F62, 0x9160, 0x935E, + 0x955C, 0x975A, 0x9958, 0x9A57, 0x9B56, 0x9D54, 0x9E53, + 0xA051, 0xA051, 0xA150, 0xA24F, 0xA44D, 0xA54C, 0xA54C, + 0xA64B, 0xA74A, 0xA849, 0xA948, 0xA948, 0xAA47, 0xAA47, + 0xAB46, 0xAC45, 0xAC45, 0xAD44, 0xAD44, 0xAE43, 0xAE43, + 0xAF42, 0xAF42, 0xB041, 0xB041, 0xB140, 0xB140, 0xB140, + 0xB23F, 0xB23F, 0xB23F, 0xB23F, 0xB33E, 0xB33E, 0xB33E, + 0xB33E, 0xB33E, 0xB33E, 0xB43D, 0xB43D, 0xB43D, 0xB43D, + 0xB43D, 0xB43D, 0xB43D, 0xB43D, 0xB43D, 0xB43D, 0xB43D, + 0xB43D, 0xB43D, 0xB43D, 0xB43D, 0xB43D, 0xB33E, 0xB33E, + 0xB33E, 0xB33E, 0xB33E, 0xB33E, 0xB23F, 0xB23F, 0xB23F, + 0xB23F, 0xB140, 0xB140, 0xB140, 0xB041, 0xB041, 0xAF42, + 0xAF42, 0xAE43, 0xAE43, 0xAD44, 0xAD44, 0xAC45, 0xAC45, + 0xAB46, 0xAA47, 0xAA47, 0xA948, 0xA948, 0xA849, 0xA74A, + 0xA64B, 0xA54C, 0xA54C, 0xA44D, 0xA24F, 0xA150, 0xA051, + 0xA051, 0x9E53, 0x9D54, 0x9B56, 0x9A57, 0x9958, 0x975A, + 0x955C, 0x935E, 0x9160, 0x8F62, 0x8D64, 0x8A67, 0x866B, + 0x8071, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, + 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, + 0x100 +}; + +// Almost all 0x100 (unused?) +static const s16 gUnknown_80B82AA[Y_MAX] = { + [0 ... 2] = 0x100, + [3] = 0x9392, + [4 ... Y_MAX - 1] = 0x100 +}; +// All zeroes (fallback?) +static const s16 sDefaultBgH[Y_MAX] = { + [0 ... Y_MAX - 1] = 0 +}; + +// arm9.bin::02006154 +void WindowBgBufferInit(void) +{ + sInitialized = TRUE; + sBufferIdx = FALSE; + sBoolUnk = TRUE; + sBufferPtr = NULL; + gWinBufferPtr = NULL; + gDrawWindow = FALSE; + gUnknown_2026E4E = 0x60C; + gWindowBgCopy = NULL; +} + +// arm9.bin::02005758 +void CopyWindowBgBuffer(s32 *pos, u8 kind) +{ + const s16 *src1, *src2; + s16 *dst; + s32 i; + + if (!sInitialized) + kind = COPY_WINDOW_BG_BUFFER_WIN0; + + dst = !sBufferIdx ? sBuffer0 : sBuffer1; + + src1 = gWindowBgCopy; + if (src1 == NULL) + src1 = sDefaultBgH; + + sBufferPtr = dst; + + switch (kind) { + case COPY_WINDOW_BG_BUFFER_WIN0: + for (i = 0; i < 10; i++) { + UNROLL16( + *dst++ = *src1++; // WIN0H + *dst++ = 0; // WIN1H (disabled) + ); + } + break; + case COPY_WINDOW_BG_BUFFER_DIM2: + src2 = sCorridorDim2; + for (i = 0; i < 10; i++) { + UNROLL16( + *dst++ = *src1++; // WIN0H + *dst++ = *src2++; // WIN1H (dim) + ); + } + break; + case COPY_WINDOW_BG_BUFFER_DIM1: + src2 = sCorridorDim1; + for (i = 0; i < 10; i++) { + UNROLL16( + *dst++ = *src1++; // WIN0H + *dst++ = *src2++; // WIN1H (dim) + ); + } + break; + case COPY_WINDOW_BG_BUFFER_ROOM_DIM: + if ((pos[0] < 0 && pos[2] < 0) + || (pos[1] < 0 && pos[3] < 0) + || (pos[0] >= X_MAX && pos[2] >= X_MAX) + || (pos[1] >= Y_MAX && pos[3] >= Y_MAX)) { + // If the camera is outside the room, dim the entire screen + for (i = 0; i < 10; i++) { + UNROLL16(*dst++ = *src1++; *dst++ = 0xF0;); + } + } + else { + s32 left; + s32 right; + for (i = 0; i < Y_MAX; i++) { + if (pos[1] > i) { + *dst++ = *src1++; + *dst++ = 256; + } + else if (pos[3] <= i) { + *dst++ = *src1++; + *dst++ = 256; + } + else { + if (i - pos[1] < 16) { + right = pos[0] + sRoomCornerDim[i - pos[1]]; + left = pos[2] - sRoomCornerDim[i - pos[1]]; + } + else if (pos[3] - i < 16) { + right = pos[0] + sRoomCornerDim[pos[3] - i]; + left = pos[2] - sRoomCornerDim[pos[3] - i]; + } + else { + right = pos[0]; + left = pos[2]; + } + + if (right < 0) + right = 0; + if (right > X_MAX - 1) + right = X_MAX - 1; + + if (left < 1) + left = 1; + if (left > X_MAX) + left = X_MAX; + + *dst++ = *src1++; + // Note this is backwards so the dim window is drawn on the outside + *dst++ = (left << 8) | right; + } + } + } + break; + case COPY_WINDOW_BG_BUFFER_UNK4: + src2 = gUnknown_80B82AA; + for (i = 0; i < 15; i++) { + UNROLL16(*dst++ = *src1++; *dst++ = *src2++;); + } + break; + case COPY_WINDOW_BG_BUFFER_UNK5: { + s32 r8; + s32 sp14; + s32 uVar7; + s32 sp10; + s32 iVar11; + + s32 val1; + s32 val2; + s32 val3; + s32 spC; + + s32 j, k; + + for (i = 0; i < 15; i++) { + UNROLL16(*dst++ = *src1++; *dst++ = 256;); + } + + val1 = sUnknown_2026E40; + val2 = sUnknown_2026E44; + val3 = sUnknown_2026E48; + + spC = 0x400 / (val3 / 256 + 1); + iVar11 = val2 / 256; + + k = iVar11; + j = iVar11; + for (sp10 = 0; sp10 < 0x400; sp10 += spC) { + s32 tmp1 = sin_4096(sp10) * val3 / 256; + + sp14 = (val2 + tmp1) / 256; + r8 = (val2 - tmp1) / 256; + + if (j < sp14 || k > r8) { + s32 tmp2 = cos_4096(sp10) * val3 / 256; + + s32 iVar5 = (val1 - tmp2) / 256; + s32 iVar3 = (val1 + tmp2) / 256; + + if (iVar5 < 0) + iVar5 = 0; + if (iVar3 < 0) + iVar3 = 0; + if (iVar5 > 240 - 1) + iVar5 = 160 - 1; + if (iVar3 > 240 - 1) + iVar3 = 160 - 1; + + if (iVar5 > iVar3) + uVar7 = (iVar5 << 8) | iVar3; + else + uVar7 = (iVar3 << 8) | iVar5; + + for (; j < sp14; j++) { + if (j < 0) + continue; + if (j >= 160) + continue; + + if (!sBufferIdx) + sBuffer0[j * 2 + 1] = uVar7; + else + sBuffer1[j * 2 + 1] = uVar7; + } + + for (; k > r8; k--) { + if (k < 0) + continue; + if (k >= 160) + continue; + + if (!sBufferIdx) + sBuffer0[k * 2 + 1] = uVar7; + else + sBuffer1[k * 2 + 1] = uVar7; + } + } + } + break; + } + } +} + +#if (GAME_VERSION == VERSION_RED) +UNUSED static void sub_80060A8(void) +{ + gWinBufferPtr = sBufferPtr; + sBufferIdx = !sBufferIdx; + sBoolUnk = !sBoolUnk; + gDrawWindow = FALSE; +} +#endif + +// arm9.bin::020056C0 +void ToggleWindowBgBuffer(void) +{ + gWinBufferPtr = sBufferPtr; + sBufferIdx = !sBufferIdx; + sBoolUnk = !sBoolUnk; + SetBldAlphaReg((gUnknown_2026E4E & 0x1F00) >> 8, gUnknown_2026E4E & 0x1F); + gDrawWindow = TRUE; +} diff --git a/src/world_map.c b/src/world_map.c index 45efb0ed2..8c50130b7 100644 --- a/src/world_map.c +++ b/src/world_map.c @@ -3,7 +3,7 @@ #include "bg_control.h" #include "bg_palette_buffer.h" #include "code_8004AA0.h" -#include "code_800558C.h" +#include "window_buffer.h" #include "graphics_memory.h" #include "code_800C9CC.h" #include "code_800D090.h" @@ -406,10 +406,10 @@ static void WorldMap_RunFrameActions(void) SetBG3RegOffsets(sWorldMapPtr->bgPos.x, sWorldMapPtr->bgPos.y); AnimateSprites(TRUE); FadeScreen(); - sub_8005838(NULL, 0); + CopyWindowBgBuffer(NULL, COPY_WINDOW_BG_BUFFER_WIN0); nullsub_8(gGameOptionsRef->touchScreen); sub_8005180(); - sub_80060EC(); + ToggleWindowBgBuffer(); IncrementPlayTime(gPlayTimeRef); WaitForNextFrameAndAdvanceRNG(); LoadBufferedInputs(); diff --git a/sym_ewram.txt b/sym_ewram.txt index 89c811fce..64fb81207 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -6,7 +6,7 @@ .include "src/bg_palette_buffer.o" .include "src/input.o" .include "src/sprite.o" - .include "src/code_800558C.o" + .include "src/window_buffer.o" .include "src/text_1.o" .include "src/graphics_memory.o" .include "src/file_system.o" diff --git a/sym_ewram_init.txt b/sym_ewram_init.txt index 0d7994ffc..d8e33edbb 100644 --- a/sym_ewram_init.txt +++ b/sym_ewram_init.txt @@ -3,7 +3,7 @@ .include "src/main_loops.o" .include "src/other_random.o" .include "src/sprite.o" -.include "src/code_800558C.o" +.include "src/window_buffer.o" .include "src/random.o" .include "src/text_1.o" .include "src/graphics_memory.o"