diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/union_room_chat.c | 8 | ||||
-rw-r--r-- | src/union_room_chat_display.c | 656 |
2 files changed, 657 insertions, 7 deletions
diff --git a/src/union_room_chat.c b/src/union_room_chat.c index abd763367..936803f80 100644 --- a/src/union_room_chat.c +++ b/src/union_room_chat.c @@ -13,6 +13,7 @@ #include "scanline_effect.h" #include "strings.h" #include "task.h" +#include "union_room_chat_display.h" #include "data_8479668.h" #include "constants/songs.h" @@ -89,13 +90,6 @@ void sub_81295EC(u8 *ptr); void sub_8129614(u8 *ptr); u8 *sub_8129758(void); void sub_81298F8(u8 taskId); -void sub_8129B14(void); -bool32 sub_8129B78(void); -void sub_8129B88(void); -void sub_8129BFC(void); -void sub_8129C34(u16 a0, u8 a1); -u8 sub_8129C8C(u8 a0); -s8 sub_812A568(void); static void (*const gUnknown_845A880[])(void) = { sub_8128640, diff --git a/src/union_room_chat_display.c b/src/union_room_chat_display.c new file mode 100644 index 000000000..993481d3d --- /dev/null +++ b/src/union_room_chat_display.c @@ -0,0 +1,656 @@ +#include "global.h" +#include "gflib.h" +#include "new_menu_helpers.h" +#include "scanline_effect.h" +#include "union_room_chat.h" +#include "union_room_chat_display.h" +#include "union_room_chat_objects.h" + +struct UnionRoomChat2_Unk0 +{ + bool32 (*unk0)(u8 *); + u8 unk4; + u8 unk5; +}; + +struct UnionRoomChat2 +{ + struct UnionRoomChat2_Unk0 unk0[3]; + u16 unk18; + u16 unk1A; + u16 unk1C; + u16 unk1E; + s16 unk20; + u8 unk22[0x106]; + u8 unk128[BG_SCREEN_SIZE]; + u8 unk928[BG_SCREEN_SIZE]; + u8 unk1128[BG_SCREEN_SIZE]; + u8 unk1928[BG_SCREEN_SIZE]; + u8 unk2128[0x20]; + u8 unk2148[0x20]; +}; + +struct Unk845AABC +{ + u16 unk0; + bool32 (*unk4)(u8 *); +}; + +EWRAM_DATA struct UnionRoomChat2 * gUnknown_203B0E4 = NULL; + +void sub_8129BB8(struct UnionRoomChat2 * ptr); +void sub_8129BC4(void); +bool32 sub_8129CA0(u8 *state); +bool32 sub_8129D40(u8 *state); +bool32 sub_8129D78(u8 *state); +bool32 sub_8129DB0(u8 *state); +bool32 sub_8129E1C(u8 *state); +bool32 sub_8129E28(u8 *state); +bool32 sub_8129E74(u8 *state); +bool32 sub_8129EB8(u8 *state); +bool32 sub_8129F24(u8 *state); +bool32 sub_8129FCC(u8 *state); +bool32 sub_812A074(u8 *state); +bool32 sub_812A0B0(u8 *state); +bool32 sub_812A18C(u8 *state); +bool32 sub_812A1B8(u8 *state); +bool32 sub_812A1FC(u8 *state); +bool32 sub_812A240(u8 *state); +bool32 sub_812A294(u8 *state); +bool32 sub_812A2E4(u8 *state); +bool32 sub_812A334(u8 *state); +bool32 sub_812A378(u8 *state); +bool32 sub_812A3D0(u8 *state); +bool32 sub_812A420(u8 *state); +void sub_812A424(u8 a0, u8 a1, u8 a2); +void sub_812A51C(void); +void sub_812A544(void); +void sub_812A578(int a0, u16 a1); +void sub_812A6F4(void); +void sub_812A728(void); +void sub_812A74C(u16 a0, u16 a1, u8 a2); +void sub_812A778(u16 a0, u8 *a1, u8 a2, u8 a3, u8 a4); +void sub_812A804(void); +bool32 sub_812A980(void); +bool32 sub_812A9C8(void); +void sub_812AA10(void); +void sub_812AA64(void); +void sub_812AA78(u16 a0, u8 *a1, u8 a2); +void sub_812AAD4(void); +void sub_812AB8C(void); +void sub_812ABD8(void); +void sub_812AC08(void); +void sub_812AC58(void); +void sub_812AC9C(void); +void sub_812ACC0(void); +void sub_812ACEC(void); +void sub_812AD04(void); +void sub_812AD20(void); +void sub_812AD50(void); + +const u16 gUnknown_845AA24[] = INCBIN_U16("graphics/union_room_chat/unk_845AA24.gbapal"); +const u16 gUnknown_845AA44[] = INCBIN_U16("graphics/union_room_chat/unk_845AA44.gbapal"); +const u16 gUnknown_845AA64[] = INCBIN_U16("graphics/union_room_chat/unk_845AA64.gbapal"); + +const struct BgTemplate gUnknown_845AA84[] = { + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 7, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0x0000 + }, { + .bg = 1, + .charBaseIndex = 3, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0x0000 + }, { + .bg = 2, + .charBaseIndex = 2, + .mapBaseIndex = 23, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0x0000 + }, { + .bg = 3, + .charBaseIndex = 1, + .mapBaseIndex = 15, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0x0001 + } +}; + +const struct WindowTemplate gUnknown_845AA94[] = { + { + .bg = 3, + .tilemapLeft = 8, + .tilemapTop = 1, + .width = 21, + .height = 19, + .paletteNum = 15, + .baseBlock = 0x001 + }, { + .bg = 1, + .tilemapLeft = 9, + .tilemapTop = 18, + .width = 15, + .height = 2, + .paletteNum = 12, + .baseBlock = 0x07a + }, { + .bg = 1, + .tilemapLeft = 0, + .tilemapTop = 2, + .width = 6, + .height = 15, + .paletteNum = 7, + .baseBlock = 0x020 + }, { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 2, + .width = 7, + .height = 9, + .paletteNum = 14, + .baseBlock = 0x013 + }, DUMMY_WIN_TEMPLATE +}; + +const struct Unk845AABC gUnknown_845AABC[] = { + { 0, sub_8129CA0}, + { 3, sub_8129D40}, + { 4, sub_8129D78}, + { 5, sub_8129DB0}, + { 1, sub_8129E1C}, + { 6, sub_8129E28}, + { 7, sub_8129E74}, + { 8, sub_8129EB8}, + { 9, sub_8129F24}, + {10, sub_8129FCC}, + {11, sub_812A074}, + {12, sub_812A0B0}, + { 2, sub_812A18C}, + {13, sub_812A1B8}, + {18, sub_812A1FC}, + {19, sub_812A240}, + {14, sub_812A294}, + {15, sub_812A2E4}, + {16, sub_812A334}, + {17, sub_812A378}, + {20, sub_812A3D0} +}; + +bool8 sub_8129B14(void) +{ + gUnknown_203B0E4 = Alloc(sizeof(*gUnknown_203B0E4)); + if (gUnknown_203B0E4 && sub_812AE70()) + { + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, gUnknown_845AA84, NELEMS(gUnknown_845AA84)); + InitWindows(gUnknown_845AA94); + ResetTempTileDataBuffers(); + sub_812AD50(); + sub_8129BB8(gUnknown_203B0E4); + sub_8129BC4(); + sub_8129C34(0, 0); + return TRUE; + } + else + { + return FALSE; + } +} + +bool32 sub_8129B78(void) +{ + return sub_8129C8C(0); +} + +void sub_8129B88(void) +{ + sub_812AEB0(); + if (gUnknown_203B0E4) + FREE_AND_SET_NULL(gUnknown_203B0E4); + + FreeAllWindowBuffers(); + gScanlineEffect.state = 3; +} + +void sub_8129BB8(struct UnionRoomChat2 *arg0) +{ + arg0->unk18 = 0xFF; + arg0->unk1E = 0xFF; + arg0->unk1A = 0; +} + +void sub_8129BC4(void) +{ + int i; + + if (!gUnknown_203B0E4) + return; + + for (i = 0; i < 3; i++) + { + gUnknown_203B0E4->unk0[i].unk0 = sub_812A420; + gUnknown_203B0E4->unk0[i].unk4 = 0; + gUnknown_203B0E4->unk0[i].unk5 = 0; + } +} + +void sub_8129BFC(void) +{ + int i; + + if (gUnknown_203B0E4 == NULL) + return; + + for (i = 0; i < 3; i++) + { + if (gUnknown_203B0E4->unk0[i].unk4) + gUnknown_203B0E4->unk0[i].unk4 = gUnknown_203B0E4->unk0[i].unk0(&gUnknown_203B0E4->unk0[i].unk5); + } +} + +void sub_8129C34(u16 arg0, u8 arg1) +{ + int i; + + gUnknown_203B0E4->unk0[arg1].unk0 = sub_812A420; + for (i = 0; i < NELEMS(gUnknown_845AABC); i++) + { + if (gUnknown_845AABC[i].unk0 == arg0) + { + gUnknown_203B0E4->unk0[arg1].unk0 = gUnknown_845AABC[i].unk4; + gUnknown_203B0E4->unk0[arg1].unk4 = 1; + gUnknown_203B0E4->unk0[arg1].unk5 = 0; + break; + } + } +} + +bool8 sub_8129C8C(u8 arg0) +{ + return gUnknown_203B0E4->unk0[arg0].unk4; +} + +bool32 sub_8129CA0(u8 *state) +{ + if (FreeTempTileDataBuffersIfPossible() == TRUE) + return TRUE; + + switch (*state) + { + case 0: + sub_812AAD4(); + sub_812AB8C(); + break; + case 1: + sub_812ABD8(); + break; + case 2: + sub_812AC08(); + break; + case 3: + sub_812AC58(); + break; + case 4: + sub_812AC9C(); + break; + case 5: + sub_812ACC0(); + sub_812ACEC(); + sub_812AD20(); + sub_812AD04(); + break; + case 6: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_812AEC8(); + sub_812B048(); + sub_812B100(); + } + break; + default: + return FALSE; + } + + (*state)++; + return TRUE; +} + +bool32 sub_8129D40(u8 *state) +{ + switch (*state) + { + case 0: + sub_812AA10(); + CopyWindowToVram(3, 3); + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + (*state)++; + return TRUE; +} + +bool32 sub_8129D78(u8 *state) +{ + switch (*state) + { + case 0: + sub_812AA64(); + CopyWindowToVram(3, 3); + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + (*state)++; + return TRUE; +} + +bool32 sub_8129DB0(u8 *state) +{ + switch (*state) + { + case 0: + sub_812AEFC(TRUE); + if (sub_812A980()) + return TRUE; + + sub_812A804(); + CopyWindowToVram(2, 2); + break; + case 1: + if (IsDma3ManagerBusyWithBgCopy()) + return TRUE; + break; + case 2: + if (sub_812A9C8()) + return TRUE; + + sub_812AF1C(); + sub_812AEFC(FALSE); + sub_812B160(); + return FALSE; + } + + (*state)++; + return TRUE; +} + +bool32 sub_8129E1C(u8 *state) +{ + sub_812AF1C(); + return FALSE; +} + +bool32 sub_8129E28(u8 *state) +{ + switch (*state) + { + case 0: + sub_812A578(0, 0); + sub_812A424(23, 11, 1); + CopyWindowToVram(gUnknown_203B0E4->unk1E, 3); + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + (*state)++; + return TRUE; +} + +bool32 sub_8129E74(u8 *state) +{ + switch (*state) + { + case 0: + sub_812A6F4(); + sub_812A51C(); + CopyBgTilemapBufferToVram(0); + break; + case 1: + if (IsDma3ManagerBusyWithBgCopy()) + return TRUE; + + sub_812A728(); + sub_812A544(); + return FALSE; + } + + (*state)++; + return TRUE; +} + +bool32 sub_8129EB8(u8 *state) +{ + u32 var0, var1; + u8 *str; + + switch (*state) + { + case 0: + sub_8129730(&var0, &var1); + sub_812A74C(var0, var1, 0); + str = sub_8129714(); + sub_812A778(0, str, 3, 1, 2); + CopyWindowToVram(1, 2); + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_812B160(); + return FALSE; + } + return TRUE; + } + + (*state)++; + return TRUE; +} + +bool32 sub_8129F24(u8 *state) +{ + u16 var0; + u8 *str; + u16 length; + + switch (*state) + { + case 0: + var0 = sub_8129788(); + str = sub_8129758(); + length = StringLength_Multibyte(str); + sub_812A74C(var0, length, PIXEL_FILL(6)); + sub_812A778(var0, str, 0, 4, 5); + CopyWindowToVram(1, 2); + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_812A578(1, 16); + CopyWindowToVram(gUnknown_203B0E4->unk1E, 3); + } + else + { + return TRUE; + } + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy()) + sub_812AF8C(1); + else + return TRUE; + break; + case 3: + return FALSE; + } + + (*state)++; + return TRUE; +} + +bool32 sub_8129FCC(u8 *state) +{ + u16 var0; + u8 *str; + u16 length; + + switch (*state) + { + case 0: + var0 = sub_8129788(); + str = sub_8129758(); + length = StringLength_Multibyte(str); + sub_812A74C(var0, length, PIXEL_FILL(0)); + sub_812A778(var0, str, 3, 1, 2); + CopyWindowToVram(1, 2); + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_812A6F4(); + CopyWindowToVram(gUnknown_203B0E4->unk1E, 3); + } + else + { + return TRUE; + } + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_812AF8C(0); + sub_812A728(); + } + else + { + return TRUE; + } + break; + case 3: + return FALSE; + } + + (*state)++; + return TRUE; +} + +bool32 sub_812A074(u8 *state) +{ + switch (*state) + { + case 0: + sub_812A804(); + CopyWindowToVram(2, 2); + (*state)++; + break; + case 1: + if (IsDma3ManagerBusyWithBgCopy()) + return TRUE; + else + return FALSE; + } + + return TRUE; +} + +bool32 sub_812A0B0(u8 *state) +{ + u16 var0; + u8 *str; + u8 var1; + + switch (*state) + { + case 0: + var0 = gUnknown_203B0E4->unk1A; + str = sub_81297C4(); + var1 = sub_81297D0(); + sub_812AA78(var0, str, var1); + CopyWindowToVram(0, 2); + break; + case 1: + if (IsDma3ManagerBusyWithBgCopy()) + return TRUE; + + if (gUnknown_203B0E4->unk1A < 9) + { + gUnknown_203B0E4->unk1A++; + *state = 4; + return FALSE; + } + else + { + gUnknown_203B0E4->unk1C = 0; + (*state)++; + } + // fall through + case 2: + ScrollWindow(0, 0, 5, PIXEL_FILL(1)); + CopyWindowToVram(0, 2); + gUnknown_203B0E4->unk1C++; + (*state)++; + // fall through + case 3: + if (IsDma3ManagerBusyWithBgCopy()) + return TRUE; + + if (gUnknown_203B0E4->unk1C < 3) + { + (*state)--; + return TRUE; + } + break; + case 4: + return FALSE; + default: + return TRUE; + } + + (*state)++; + return TRUE; +} + +bool32 sub_812A18C(u8 *state) +{ + switch (*state) + { + case 0: + sub_812AFC0(); + (*state)++; + break; + case 1: + return sub_812AFFC(); + } + + return TRUE; +} + +bool32 sub_812A1B8(u8 *state) +{ + switch (*state) + { + case 0: + sub_812A578(3, 16); + CopyWindowToVram(gUnknown_203B0E4->unk1E, 3); + (*state)++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} |