diff options
Diffstat (limited to 'src/easy_chat.c')
-rw-r--r-- | src/easy_chat.c | 2182 |
1 files changed, 2171 insertions, 11 deletions
diff --git a/src/easy_chat.c b/src/easy_chat.c index 5f5d20e16..1b1bd105b 100644 --- a/src/easy_chat.c +++ b/src/easy_chat.c @@ -2,11 +2,16 @@ // Includes #include "global.h" #include "alloc.h" +#include "bg.h" +#include "decompress.h" #include "dewford_trend.h" #include "dynamic_placeholder_text_util.h" #include "easy_chat.h" #include "event_data.h" +#include "event_object_movement.h" #include "field_weather.h" +#include "gpu_regs.h" +#include "graphics.h" #include "international_string_util.h" #include "link.h" #include "main.h" @@ -17,7 +22,9 @@ #include "string_util.h" #include "strings.h" #include "task.h" +#include "text_window.h" #include "window.h" +#include "constants/event_objects.h" #include "constants/flags.h" #include "constants/songs.h" @@ -70,8 +77,46 @@ struct EasyChatScreen /*0x3C*/ u16 ecWordBuffer[9]; }; +struct Unk203A11C +{ + u16 unk0; + u16 windowId; + u16 unk4; + u8 unk6; + u8 unk7; + s8 unk8; + u8 unk9; + u8 unkA; + u8 unkB[0xC1]; + u8 unkCC[0x202]; + u16 unk2CE; + int unk2D0; + int unk2D4; + struct Sprite *unk2D8; + struct Sprite *unk2DC; + struct Sprite *unk2E0; + struct Sprite *unk2E4; + struct Sprite *unk2E8; + struct Sprite *unk2EC; + struct Sprite *unk2F0; + struct Sprite *unk2F4; + struct Sprite *unk2F8; + struct Sprite *unk2FC; + u16 unk300[BG_SCREEN_SIZE / 2]; + u16 unkB00[BG_SCREEN_SIZE / 2]; +}; + +struct Unk08597C30 +{ + u8 unk0_0:5; + u8 unk0_5:3; + u8 unk1; + u8 unk2; + u8 unk3; +}; + EWRAM_DATA struct EasyChatScreen *gEasyChatScreen = NULL; -EWRAM_DATA void *gUnknown_0203A11C = 0; +EWRAM_DATA struct Unk203A11C *gUnknown_0203A11C = 0; EWRAM_DATA void *gUnknown_0203A120 = 0; static void sub_811A2C0(u8); @@ -103,10 +148,10 @@ static u8 sub_811BCC8(u8); static void sub_811BDF0(u8 *); void sub_811BF78(void); static bool8 sub_811BF8C(void); -bool8 sub_811BFA4(void); -void sub_811C13C(void); -/*static*/ void sub_811C158(u16); -/*static*/ bool8 sub_811C170(void); +static bool8 sub_811BFA4(void); +static void sub_811C13C(void); +static void sub_811C158(u16); +static bool8 sub_811C170(void); bool8 sub_811F28C(void); void sub_811F2B8(void); u8 sub_811F3AC(void); @@ -152,7 +197,102 @@ static void sub_811B9A0(void); static u8 sub_811BA1C(void); static int sub_811BF20(void); static u16 sub_811BF40(void); -u8 sub_811CE94(void); +static bool8 sub_811CE94(void); +static void sub_811CF64(void); +static void sub_811CF04(void); +static void sub_811D60C(void); +static void sub_811D424(u16 *); +static void sub_811D230(void); +void sub_811E948(void); +static void sub_811CFCC(void); +static void sub_811D0BC(void); +static void sub_811D2C8(void); +static void sub_811D684(void); +static void sub_811DE90(void); +static void sub_811DEC4(void); +static void sub_811DE5C(u8, u8, u8, u8); +static void sub_811E5D4(void); +static void sub_811E720(void); +static void sub_811E828(void); +static bool8 sub_811C2D4(void); +static bool8 sub_811C30C(void); +static bool8 sub_811C3E4(void); +static bool8 sub_811C48C(void); +static bool8 sub_811C404(void); +static bool8 sub_811C448(void); +static bool8 sub_811C4D0(void); +static bool8 sub_811C518(void); +static bool8 sub_811C554(void); +static bool8 sub_811C620(void); +static bool8 sub_811C830(void); +static bool8 sub_811C8F0(void); +static bool8 sub_811C99C(void); +static bool8 sub_811CA5C(void); +static bool8 sub_811C780(void); +static bool8 sub_811C78C(void); +static bool8 sub_811C7D4(void); +static bool8 sub_811CB18(void); +static bool8 sub_811CB98(void); +static bool8 sub_811CB24(void); +static bool8 sub_811CC90(void); +static bool8 sub_811CC08(void); +static bool8 sub_811C6C0(void); +static bool8 sub_811CD14(void); +static bool8 sub_811CD54(void); +static bool8 sub_811CD94(void); +static bool8 sub_811CDD4(void); +static bool8 sub_811CE14(void); +static bool8 sub_811CE54(void); +static void sub_811DF60(u8, u8); +static int sub_811E920(int); +static void sub_811DF90(void); +static void sub_811D104(u8); +static void sub_811D214(u8); +static void sub_811DFB0(void); +static void sub_811D6D4(void); +static void sub_811D9CC(int); +static void sub_811E3AC(void); +static bool8 sub_811E418(void); +static void sub_811DFC8(void); +static void sub_811E6E0(int); +static bool8 sub_811DAA4(void); +static void sub_811E64C(void); +static void sub_811E050(void); +static void sub_811E4AC(void); +static void sub_811E6B0(void); +static void sub_811E55C(void); +static bool8 sub_811E4D0(void); +static bool8 sub_811E5B8(void); +static void sub_811E578(void); +static void sub_811E088(void); +static void sub_811DDAC(s16, u8); +static bool8 sub_811DE10(void); +static void sub_811D9B4(void); +static void sub_811D698(u32); +static void sub_811E288(void); +static void sub_811E794(void); +static void sub_811E380(void); +static void sub_811E7F8(void); +static void sub_811E30C(void); +static void sub_811D7A4(void); +static void sub_811D7C8(void); +static int sub_811DE48(void); +static void sub_811D7EC(void); +static void sub_811D830(void); +void sub_811D058(u8, u8, const u8 *, u8, u8, u8, u8, u8, u8); +static void sub_811DD84(void); +static void sub_811D6F4(void); +static void sub_811D758(void); +static void sub_811D794(void); +const u8 *sub_811F424(u8); +static void sub_811D864(u8, u8); +static void sub_811D950(u8, u8); +static void sub_811DADC(u8); +static void sub_811DC28(int, int, int, int); +static void sub_811E0EC(s8, s8); +static void sub_811E1A4(s8, s8); +static void sub_811E2DC(struct Sprite *); +static void sub_811E34C(u8, u8); u8 *CopyEasyChatWordPadded(u8 *, u16, u16); extern const struct { @@ -164,6 +304,28 @@ extern const struct EasyChatScreenTemplate gEasyChatScreenTemplates[21]; extern const u8 gUnknown_08597748[][7]; extern const u16 gUnknown_08597764[]; extern const u16 gUnknown_0859776C[][2]; +extern const struct BgTemplate gUnknown_08597C54[4]; +extern const struct WindowTemplate gUnknown_08597C64[]; +extern const u32 gUnknown_08597B54[]; +extern const struct Unk08597C30 gUnknown_08597C30[]; +extern const u16 gUnknown_08597B14[]; +extern const u16 gUnknown_08597B34[]; +extern const u16 gUnknown_08597C1C[]; +extern const u16 gUnknown_08597C24[]; +extern const struct WindowTemplate gUnknown_08597C84; +extern const u8 gUnknown_08597C8C[4]; +extern const u8 *const gUnknown_08597C90[4]; +extern const struct SpriteSheet gUnknown_08597CA0[]; +extern const struct SpritePalette gUnknown_08597CC0[]; +extern const struct CompressedSpriteSheet gUnknown_08597CE8[]; +extern const struct SpriteTemplate gUnknown_08597D18; +extern const struct SpriteTemplate gUnknown_08597D68; +extern const struct SpriteTemplate gUnknown_08597DF0; +extern const struct SpriteTemplate gUnknown_08597DD0; +extern const struct SpriteTemplate gUnknown_08597E48; +extern const struct SpriteTemplate gUnknown_08597E30; +extern const u8 gUnknown_08597D08[]; +extern const u8 gUnknown_08597E60[][4]; void sub_811A20C(u8 kind, u16 *words, MainCallback callback, u8 sizeParam) { @@ -1916,19 +2078,19 @@ u8 sub_811BAC4(void) return gEasyChatScreen->mainCursorRow; } -void sub_811BAD0(const u8 **str1, const u8 **str2) +static void GetEasyChatInstructionsText(const u8 **str1, const u8 **str2) { *str1 = gEasyChatScreenTemplates[gEasyChatScreen->templateId].instructionsText1; *str2 = gEasyChatScreenTemplates[gEasyChatScreen->templateId].instructionsText2; } -void sub_811BB08(const u8 **str1, const u8 **str2) +static void GetEasyChatConfirmText(const u8 **str1, const u8 **str2) { *str1 = gEasyChatScreenTemplates[gEasyChatScreen->templateId].confirmText1; *str2 = gEasyChatScreenTemplates[gEasyChatScreen->templateId].confirmText2; } -void sub_811BB40(const u8 **str1, const u8 **str2) +static void sub_811BB40(const u8 **str1, const u8 **str2) { switch (gEasyChatScreen->kind) { @@ -1949,7 +2111,7 @@ void sub_811BB40(const u8 **str1, const u8 **str2) } -void sub_811BB88(const u8 **str1, const u8 **str2) +static void GetEasyChatConfirmDeletionText(const u8 **str1, const u8 **str2) { *str1 = gText_AllTextBeingEditedWill; *str2 = gText_BeDeletedThatOkay; @@ -2026,7 +2188,7 @@ int sub_811BC2C(void) return 0; } -int sub_811BC70(void) +static int sub_811BC70(void) { return sub_811BA3C(); } @@ -2213,3 +2375,2001 @@ static bool8 sub_811BF8C(void) else return 1; } + +static bool8 sub_811BFA4(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, gUnknown_08597C54, ARRAY_COUNT(gUnknown_08597C54)); + SetBgTilemapBuffer(3, gUnknown_0203A11C->unkB00); + SetBgTilemapBuffer(1, gUnknown_0203A11C->unk300); + InitWindows(gUnknown_08597C64); + DeactivateAllTextPrinters(); + sub_811CF64(); + sub_811CF04(); + CpuFastFill(0, (void *)VRAM + 0x1000000, 0x400); + break; + case 1: + DecompressAndLoadBgGfxUsingHeap(3, gEasyChatWindow_Gfx, 0, 0, 0); + CopyToBgTilemapBuffer(3, gEasyChatWindow_Tilemap, 0, 0); + sub_811D60C(); + sub_811D424(gUnknown_0203A11C->unk300); + sub_811D230(); + sub_811E948(); + CopyBgTilemapBufferToVram(3); + break; + case 2: + DecompressAndLoadBgGfxUsingHeap(1, gUnknown_08597B54, 0, 0, 0); + CopyBgTilemapBufferToVram(1); + break; + case 3: + sub_811CFCC(); + sub_811D0BC(); + sub_811D2C8(); + sub_811D684(); + break; + case 4: + sub_811DE90(); + if (sub_811BA5C() != 16) + sub_811DEC4(); + break; + case 5: + if (IsDma3ManagerBusyWithBgCopy()) + { + return TRUE; + } + else + { + sub_811DE5C(0, 0, 0, 0); + SetGpuReg(REG_OFFSET_WININ, WIN_RANGE(0, 63)); + SetGpuReg(REG_OFFSET_WINOUT, WIN_RANGE(0, 59)); + ShowBg(3); + ShowBg(1); + ShowBg(2); + ShowBg(0); + sub_811E5D4(); + sub_811E720(); + sub_811E828(); + } + break; + default: + return FALSE; + } + + gUnknown_0203A11C->unk0++; + return TRUE; +} + +static void sub_811C13C(void) +{ + if (gUnknown_0203A11C) + FREE_AND_SET_NULL(gUnknown_0203A11C); +} + +static void sub_811C158(u16 arg0) +{ + gUnknown_0203A11C->unk4 = arg0; + gUnknown_0203A11C->unk0 = 0; + sub_811C170(); +} + +static bool8 sub_811C170(void) +{ + switch (gUnknown_0203A11C->unk4) + { + case 0: return FALSE; + case 1: return sub_811C2D4(); + case 2: return sub_811C30C(); + case 3: return sub_811C3E4(); + case 4: return sub_811C48C(); + case 5: return sub_811C404(); + case 6: return sub_811C448(); + case 7: return sub_811C4D0(); + case 8: return sub_811C518(); + case 9: return sub_811C554(); + case 10: return sub_811C620(); + case 11: return sub_811C830(); + case 12: return sub_811C8F0(); + case 13: return sub_811C99C(); + case 14: return sub_811CA5C(); + case 15: return sub_811C780(); + case 16: return sub_811C78C(); + case 17: return sub_811C7D4(); + case 18: return sub_811CB18(); + case 19: return sub_811CB98(); + case 20: return sub_811CB24(); + case 21: return sub_811CC90(); + case 22: return sub_811CC08(); + case 23: return sub_811C6C0(); + case 24: return FALSE; + case 25: return FALSE; + case 26: return FALSE; + case 27: return FALSE; + case 28: return FALSE; + case 29: return sub_811CD14(); + case 30: return sub_811CD54(); + case 31: return sub_811CD94(); + case 32: return sub_811CDD4(); + case 33: return sub_811CE14(); + case 34: return sub_811CE54(); + default: return FALSE; + } +} + +static bool8 sub_811C2D4(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811D2C8(); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811C30C(void) +{ + u8 i; + u16 *ecWordBuffer; + u16 *ecWord; + u8 var0; + u8 cursorColumn, cursorRow, numColumns; + s16 var1; + int stringWidth; + int trueStringWidth; + u8 var2; + u8 sp0[64]; + + ecWordBuffer = sub_811BA94(); + var0 = sub_811BA68(); + cursorColumn = sub_811BAB8(); + cursorRow = sub_811BAC4(); + numColumns = sub_811BAAC(); + ecWord = &ecWordBuffer[cursorRow * numColumns]; + var1 = 8 * gUnknown_08597C30[var0].unk0_0 + 13; + for (i = 0; i < cursorColumn; i++) + { + if (*ecWord == 0xFFFF) + { + stringWidth = 72; + } + else + { + CopyEasyChatWord(sp0, *ecWord); + stringWidth = GetStringWidth(1, sp0, 0); + } + + trueStringWidth = stringWidth + 17; + var1 += trueStringWidth; + ecWord++; + } + + var2 = 8 * (gUnknown_08597C30[var0].unk0_5 + cursorRow * 2); + sub_811DF60(var1, var2 + 8); + return FALSE; +} + +static bool8 sub_811C3E4(void) +{ + u8 var0 = sub_811E920(sub_811BAB8()); + sub_811DF60(var0, 96); + return FALSE; +} + +static bool8 sub_811C404(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DF90(); + sub_811D104(2); + sub_811D214(1); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811C448(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DF90(); + sub_811D104(3); + sub_811D214(0); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811C48C(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DF90(); + sub_811D104(1); + sub_811D214(1); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811C4D0(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DFB0(); + sub_811D104(0); + sub_811D2C8(); + ShowBg(0); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811C518(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DFB0(); + sub_811D104(0); + sub_811D2C8(); + gUnknown_0203A11C->unk0++; + // Fall through + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811C554(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DF90(); + HideBg(0); + sub_811DE5C(0, 0, 0, 0); + sub_811D6D4(); + gUnknown_0203A11C->unk0++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811D9CC(0); + gUnknown_0203A11C->unk0++; + } + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy() && !sub_811DAA4()) + gUnknown_0203A11C->unk0++; + break; + case 3: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811E3AC(); + gUnknown_0203A11C->unk0++; + } + break; + case 4: + if (!sub_811E418()) + { + sub_811DFC8(); + sub_811E6E0(0); + sub_811E64C(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + default: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811C620(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811E050(); + sub_811E4AC(); + sub_811E6B0(); + gUnknown_0203A11C->unk0++; + break; + case 1: + if (sub_811E4D0() == TRUE) + break; + + sub_811D9CC(1); + gUnknown_0203A11C->unk0++; + // Fall through + case 2: + if (!sub_811DAA4()) + gUnknown_0203A11C->unk0++; + break; + case 3: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811DFB0(); + ShowBg(0); + gUnknown_0203A11C->unk0++; + } + break; + case 4: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811C6C0(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811E050(); + sub_811E6B0(); + sub_811E55C(); + sub_811D9CC(5); + gUnknown_0203A11C->unk0++; + break; + case 1: + if (!sub_811DAA4() && !sub_811E5B8()) + { + sub_811D6D4(); + gUnknown_0203A11C->unk0++; + } + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811D9CC(6); + sub_811E578(); + gUnknown_0203A11C->unk0++; + } + break; + case 3: + if (!sub_811DAA4() && !sub_811E5B8()) + { + sub_811E64C(); + sub_811DFC8(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + case 4: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811C780(void) +{ + sub_811E088(); + return FALSE; +} + +static bool8 sub_811C78C(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DDAC(1, 4); + gUnknown_0203A11C->unk0++; + // Fall through + case 1: + if (!sub_811DE10()) + { + sub_811E088(); + sub_811E64C(); + return FALSE; + } + break; + } + + return TRUE; +} + +static bool8 sub_811C7D4(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DDAC(-1, 4); + gUnknown_0203A11C->unk0++; + // Fall through + case 1: + if (!sub_811DE10()) + { + sub_811E64C(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + case 2: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811C830(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811E050(); + sub_811E4AC(); + sub_811E6B0(); + gUnknown_0203A11C->unk0++; + break; + case 1: + if (!sub_811E4D0()) + { + sub_811D9B4(); + gUnknown_0203A11C->unk0++; + } + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811D9CC(2); + gUnknown_0203A11C->unk0++; + } + break; + case 3: + if (!sub_811DAA4()) + { + sub_811D698(2); + gUnknown_0203A11C->unk0++; + } + break; + case 4: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811E288(); + sub_811E6E0(1); + sub_811E64C(); + sub_811E794(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + case 5: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811C8F0(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811D2C8(); + gUnknown_0203A11C->unk0++; + break; + case 1: + sub_811E380(); + sub_811E6B0(); + sub_811E7F8(); + sub_811D9B4(); + gUnknown_0203A11C->unk0++; + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811D9CC(3); + gUnknown_0203A11C->unk0++; + } + break; + case 3: + if (!sub_811DAA4()) + { + ShowBg(0); + gUnknown_0203A11C->unk0++; + } + break; + case 4: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811DFB0(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + case 5: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811C99C(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811D2C8(); + gUnknown_0203A11C->unk0++; + break; + case 1: + sub_811E380(); + sub_811E6B0(); + sub_811E7F8(); + sub_811D9B4(); + gUnknown_0203A11C->unk0++; + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811D9CC(3); + gUnknown_0203A11C->unk0++; + } + break; + case 3: + if (!sub_811DAA4()) + { + sub_811D104(3); + gUnknown_0203A11C->unk0++; + } + break; + case 4: + if (!IsDma3ManagerBusyWithBgCopy()) + { + ShowBg(0); + gUnknown_0203A11C->unk0++; + } + break; + case 5: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811DFB0(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + case 6: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811CA5C(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811E380(); + sub_811E6B0(); + sub_811E7F8(); + sub_811D9B4(); + gUnknown_0203A11C->unk0++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811D9CC(4); + gUnknown_0203A11C->unk0++; + } + break; + case 2: + if (!sub_811DAA4()) + { + sub_811D6D4(); + gUnknown_0203A11C->unk0++; + } + break; + case 3: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811E3AC(); + gUnknown_0203A11C->unk0++; + } + break; + case 4: + if (!sub_811E418()) + { + sub_811DFC8(); + sub_811E6E0(0); + sub_811E64C(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + } + + return TRUE; +} + +static bool8 sub_811CB18(void) +{ + sub_811E30C(); + return FALSE; +} + +static bool8 sub_811CB24(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811D7A4(); + gUnknown_0203A11C->unk0++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811DDAC(1, 4); + gUnknown_0203A11C->unk0++; + } + break; + case 2: + if (!sub_811DE10()) + { + sub_811E30C(); + sub_811E64C(); + sub_811E794(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + case 3: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811CB98(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811D7C8(); + gUnknown_0203A11C->unk0++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_811DDAC(-1, 4); + gUnknown_0203A11C->unk0++; + } + break; + case 2: + if (!sub_811DE10()) + { + sub_811E64C(); + sub_811E794(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + case 3: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811CC08(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811D7EC(); + gUnknown_0203A11C->unk0++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + s16 var0 = sub_811BBDC() - sub_811DE48(); + sub_811DDAC(var0, 8); + gUnknown_0203A11C->unk0++; + } + break; + case 2: + if (!sub_811DE10()) + { + sub_811E30C(); + sub_811E64C(); + sub_811E794(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + case 3: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811CC90(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811D830(); + gUnknown_0203A11C->unk0++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + s16 var0 = sub_811BBDC() - sub_811DE48(); + sub_811DDAC(var0, 8); + gUnknown_0203A11C->unk0++; + } + break; + case 2: + if (!sub_811DE10()) + { + sub_811E64C(); + sub_811E794(); + gUnknown_0203A11C->unk0++; + return FALSE; + } + break; + case 3: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_811CD14(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DF90(); + sub_811D104(4); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811CD54(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DF90(); + sub_811D104(5); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811CD94(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DF90(); + sub_811D104(6); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811CDD4(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DF90(); + sub_811D104(7); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811CE14(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DF90(); + sub_811D104(8); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811CE54(void) +{ + switch (gUnknown_0203A11C->unk0) + { + case 0: + sub_811DF90(); + sub_811D104(9); + gUnknown_0203A11C->unk0++; + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_811CE94(void) +{ + gUnknown_0203A11C = Alloc(sizeof(*gUnknown_0203A11C)); + if (!gUnknown_0203A11C) + return FALSE; + + gUnknown_0203A11C->unk0 = 0; + gUnknown_0203A11C->unk2D8 = NULL; + gUnknown_0203A11C->unk2DC = NULL; + gUnknown_0203A11C->unk2E0 = NULL; + gUnknown_0203A11C->unk2E4 = NULL; + gUnknown_0203A11C->unk2E8 = NULL; + gUnknown_0203A11C->unk2EC = NULL; + gUnknown_0203A11C->unk2F0 = NULL; + gUnknown_0203A11C->unk2F4 = NULL; + gUnknown_0203A11C->unk2F8 = NULL; + gUnknown_0203A11C->unk2FC = NULL; + gUnknown_0203A11C->unkA = sub_811BC70(); + return TRUE; +} + +static void sub_811CF04(void) +{ + ChangeBgX(3, 0, 0); + ChangeBgY(3, 0, 0); + ChangeBgX(1, 0, 0); + ChangeBgY(1, 0, 0); + ChangeBgX(2, 0, 0); + ChangeBgY(2, 0, 0); + ChangeBgX(0, 0, 0); + ChangeBgY(0, 0, 0); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON); +} + +static void sub_811CF64(void) +{ + ResetPaletteFade(); + LoadPalette(gEasyChatMode_Pal, 0, 32); + LoadPalette(gUnknown_08597B14, 1 * 16, 32); + LoadPalette(gUnknown_08597B34, 4 * 16, 32); + LoadPalette(gUnknown_08597C1C, 10 * 16, 8); + LoadPalette(gUnknown_08597C24, 11 * 16, 12); + LoadPalette(gUnknown_08597C24, 15 * 16, 12); + LoadPalette(gUnknown_08597C24, 3 * 16, 12); +} + +static void sub_811CFCC(void) +{ + int xOffset; + const u8 *titleText = sub_811BA88(); + if (!titleText) + return; + + xOffset = GetStringCenterAlignXOffset(1, titleText, 144); + FillWindowPixelBuffer(0, 0); + sub_811D058(0, 1, titleText, xOffset, 1, 0xFF, 0, 2, 3); + PutWindowTilemap(0); + CopyWindowToVram(0, 3); +} + +void sub_811D028(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16)) +{ + AddTextPrinterParameterized(windowId, fontId, str, x, y, speed, callback); +} + +void sub_811D058(u8 windowId, u8 fontId, const u8 *str, u8 left, u8 top, u8 speed, u8 red, u8 green, u8 blue) +{ + u8 color[3]; + color[0] = red; + color[1] = green; + color[2] = blue; + AddTextPrinterParameterized3(windowId, fontId, left, top, color, speed, str); +} + +static void sub_811D0BC(void) +{ + FillBgTilemapBufferRect(0, 0, 0, 0, 32, 20, 17); + LoadUserWindowBorderGfx(1, 1, 0xE0); + sub_8098858(1, 1, 14); + sub_811D104(0); + PutWindowTilemap(1); + CopyBgTilemapBufferToVram(0); +} + +static void sub_811D104(u8 arg0) +{ + const u8 *text2 = NULL; + const u8 *text1 = NULL; + switch (arg0) + { + case 0: + GetEasyChatInstructionsText(&text1, &text2); + break; + case 2: + sub_811BB40(&text1, &text2); + break; + case 3: + GetEasyChatConfirmText(&text1, &text2); + break; + case 1: + GetEasyChatConfirmDeletionText(&text1, &text2); + break; + case 4: + text1 = gText_CreateAQuiz; + break; + case 5: + text1 = gText_SelectTheAnswer; + break; + case 6: + text1 = gText_OnlyOnePhrase; + text2 = gText_OriginalSongWillBeUsed; + break; + case 7: + text1 = gText_LyricsCantBeDeleted; + break; + case 8: + text1 = gText_CombineTwoWordsOrPhrases3; + break; + case 9: + text1 = gText_YouCannotQuitHere; + text2 = gText_SectionMustBeCompleted; + break; + } + + FillWindowPixelBuffer(1, 0x11); + if (text1) + sub_811D028(1, 1, text1, 0, 1, 0xFF, 0); + + if (text2) + sub_811D028(1, 1, text2, 0, 17, 0xFF, 0); + + CopyWindowToVram(1, 3); +} + +static void sub_811D214(u8 initialCursorPos) +{ + CreateYesNoMenu(&gUnknown_08597C84, 1, 14, initialCursorPos); +} + +static void sub_811D230(void) +{ + u8 var0; + struct WindowTemplate template; + + var0 = sub_811BA68(); + template.bg = 3; + template.tilemapLeft = gUnknown_08597C30[var0].unk0_0; + template.tilemapTop = gUnknown_08597C30[var0].unk0_5; + template.width = gUnknown_08597C30[var0].unk1; + template.height = gUnknown_08597C30[var0].unk2; + template.paletteNum = 11; + template.baseBlock = 0x6C; + gUnknown_0203A11C->windowId = AddWindow(&template); + PutWindowTilemap(gUnknown_0203A11C->windowId); +} + +static void sub_811D2C8(void) +{ + u8 spC[4]; + u16 *ecWord; + u8 numColumns, numRows; + u8 *str; + int var0; + int var1; + int i, j, k; + + ecWord = sub_811BA94(); + numColumns = sub_811BAAC(); + numRows = sub_811BAA0(); + var0 = sub_811BA68(); + var1 = 0; + if (var0 == 7) + var1 = 1; + + FillWindowPixelBuffer(gUnknown_0203A11C->windowId, 0x11); + for (i = 0; i < numRows; i++) + { + memcpy(spC, gUnknown_08597C8C, sizeof(gUnknown_08597C8C)); + if (var1) + spC[2] = 6; + + str = gUnknown_0203A11C->unkB; + gUnknown_0203A11C->unkB[0] = EOS; + str = StringAppend(str, spC); + for (j = 0; j < numColumns; j++) + { + if (*ecWord != 0xFFFF) + { + str = CopyEasyChatWord(str, *ecWord); + ecWord++; + } + else + { + ecWord++; + if (!var1) + { + str = WriteColorChangeControlCode(str, 0, 4); + for (k = 0; k < 12; k++) + { + *str = CHAR_HYPHEN; + str++; + } + + str = WriteColorChangeControlCode(str, 0, 2); + } + } + + if (var1) + spC[2] = 3; + + str = StringAppend(str, spC); + if (var0 == 2 || var0 == 7 || var0 == 8) + { + if (j == 0 && i == 4) + break; + } + } + + *str = EOS; + sub_811D028(gUnknown_0203A11C->windowId, 1, gUnknown_0203A11C->unkB, 0, i * 16 + 1, 0xFF, 0); + } + + CopyWindowToVram(gUnknown_0203A11C->windowId, 3); +} + +static void sub_811D424(u16 *tilemap) +{ + u8 var0; + int right, bottom; + int x, y; + + var0 = sub_811BA68(); + CpuFastFill(0, tilemap, BG_SCREEN_SIZE); + if (var0 == 2 || var0 == 8) + { + right = gUnknown_08597C30[var0].unk0_0 + gUnknown_08597C30[var0].unk1; + bottom = gUnknown_08597C30[var0].unk0_5 + gUnknown_08597C30[var0].unk2; + for (y = gUnknown_08597C30[var0].unk0_5; y < bottom; y++) + { + x = gUnknown_08597C30[var0].unk0_0 - 1; + tilemap[y * 32 + x] = 0x1005; + x++; + for (; x < right; x++) + tilemap[y * 32 + x] = 0x1000; + + tilemap[y* 32 + x] = 0x1007; + } + } + else + { + y = gUnknown_08597C30[var0].unk0_5 - 1; + x = gUnknown_08597C30[var0].unk0_0 - 1; + right = gUnknown_08597C30[var0].unk0_0 + gUnknown_08597C30[var0].unk1; + bottom = gUnknown_08597C30[var0].unk0_5 + gUnknown_08597C30[var0].unk2; + tilemap[y * 32 + x] = 0x1001; + x++; + for (; x < right; x++) + tilemap[y * 32 + x] = 0x1002; + + tilemap[y * 32 + x] = 0x1003; + y++; + for (; y < bottom; y++) + { + x = gUnknown_08597C30[var0].unk0_0 - 1; + tilemap[y * 32 + x] = 0x1005; + x++; + for (; x < right; x++) + tilemap[y * 32 + x] = 0x1000; + + tilemap[y* 32 + x] = 0x1007; + } + + x = gUnknown_08597C30[var0].unk0_0 - 1; + tilemap[y * 32 + x] = 0x1009; + x++; + for (; x < right; x++) + tilemap[y * 32 + x] = 0x100A; + + tilemap[y * 32 + x] = 0x100B; + } +} + +static void sub_811D60C(void) +{ + u8 var0; + u16 *tilemap; + + tilemap = GetBgTilemapBuffer(3); + var0 = sub_811BA68(); + switch (gUnknown_08597C30[var0].unk3) + { + case 2: + tilemap += 0x2A0; + CopyToBgTilemapBufferRect(3, tilemap, 0, 11, 32, 2); + break; + case 1: + tilemap += 0x300; + CopyToBgTilemapBufferRect(3, tilemap, 0, 11, 32, 2); + break; + case 3: + CopyToBgTilemapBufferRect(3, tilemap, 0, 10, 32, 4); + break; + } +} + +static void sub_811D684(void) +{ + PutWindowTilemap(2); + CopyBgTilemapBufferToVram(2); +} + +static void sub_811D698(u32 arg0) +{ + sub_811DD84(); + FillWindowPixelBuffer(2, 0x11); + switch (arg0) + { + case 0: + sub_811D6F4(); + break; + case 1: + sub_811D758(); + break; + case 2: + sub_811D794(); + break; + } + + CopyWindowToVram(2, 2); +} + +static void sub_811D6D4(void) +{ + if (!sub_811BBB0()) + sub_811D698(0); + else + sub_811D698(1); +} + +static void sub_811D6F4(void) +{ + int i; + int x, y; + + i = 0; + y = 97; + while (1) + { + for (x = 0; x < 2; x++) + { + u8 index = sub_811F3B8(i++); + if (index == 22) + { + sub_811DDAC(sub_811BBBC(), 0); + return; + } + + sub_811D028(2, 1, sub_811F424(index), x * 84 + 10, y, 0xFF, NULL); + } + + y += 16; + } +} + +static void sub_811D758(void) +{ + u32 i; + + for (i = 0; i < 4; i++) + sub_811D028(2, 1, gUnknown_08597C90[i], 10, 97 + i * 16, 0xFF, NULL); +} + +static void sub_811D794(void) +{ + sub_811D864(0, 4); +} + +static void sub_811D7A4(void) +{ + u8 var0 = sub_811BBDC() + 3; + sub_811D950(var0, 1); + sub_811D864(var0, 1); +} + +static void sub_811D7C8(void) +{ + u8 var0 = sub_811BBDC(); + sub_811D950(var0, 1); + sub_811D864(var0, 1); +} + +static void sub_811D7EC(void) +{ + u8 var0 = sub_811BBDC(); + u8 var1 = var0 + 4; + u8 var2 = sub_811BBE8() + 1; + if (var1 > var2) + var1 = var2; + + if (var0 < var1) + { + u8 var3 = var1 - var0; + sub_811D950(var0, var3); + sub_811D864(var0, var3); + } +} + +static void sub_811D830(void) +{ + u8 var0 = sub_811BBDC(); + u8 var1 = sub_811DE48(); + if (var0 < var1) + { + u8 var2 = var1 - var0; + sub_811D950(var0, var2); + sub_811D864(var0, var2); + } +} + +static void sub_811D864(u8 arg0, u8 arg1) +{ + int i, j; + u16 easyChatWord; + u8 *str; + int y; + int var0; + + var0 = arg0 * 2; + y = (arg0 * 16 + 96) & 0xFF; + y++; + for (i = 0; i < arg1; i++) + { + for (j = 0; j < 2; j++) + { + easyChatWord = sub_811F578(var0++); + if (easyChatWord != 0xFFFF) + { + CopyEasyChatWordPadded(gUnknown_0203A11C->unkCC, easyChatWord, 0); + if (!sub_811BF88(easyChatWord)) + sub_811D028(2, 1, gUnknown_0203A11C->unkCC, (j * 13 + 3) * 8, y, 0xFF, NULL); + else + sub_811D058(2, 1, gUnknown_0203A11C->unkCC, (j * 13 + 3) * 8, y, 0xFF, 1, 5, 3); + } + } + + y += 16; + } + + CopyWindowToVram(2, 2); +} + +static void sub_811D950(u8 arg0, u8 arg1) +{ + int y; + int var0; + int var1; + int var2; + + y = (arg0 * 16 + 96) & 0xFF; + var2 = arg1 * 16; + var0 = y + var2; + if (var0 > 255) + { + var1 = var0 - 256; + var2 = 256 - y; + } + else + { + var1 = 0; + } + + FillWindowPixelRect(2, 0x11, 0, y, 224, var2); + if (var1) + FillWindowPixelRect(2, 0x11, 0, 0, 224, var1); +} + +static void sub_811D9B4(void) +{ + FillWindowPixelBuffer(2, 0x11); + CopyWindowToVram(2, 2); +} + +static void sub_811D9CC(int arg0) +{ + switch (arg0) + { + case 0: + gUnknown_0203A11C->unk6 = 0; + gUnknown_0203A11C->unk7 = 10; + break; + case 1: + gUnknown_0203A11C->unk6 = 9; + gUnknown_0203A11C->unk7 = 0; + break; + case 2: + gUnknown_0203A11C->unk6 = 11; + gUnknown_0203A11C->unk7 = 17; + break; + case 3: + gUnknown_0203A11C->unk6 = 17; + gUnknown_0203A11C->unk7 = 0; + break; + case 4: + gUnknown_0203A11C->unk6 = 17; + gUnknown_0203A11C->unk7 = 10; + break; + case 5: + gUnknown_0203A11C->unk6 = 18; + gUnknown_0203A11C->unk7 = 22; + break; + case 6: + gUnknown_0203A11C->unk6 = 22; + gUnknown_0203A11C->unk7 = 18; + break; + } + + gUnknown_0203A11C->unk8 = gUnknown_0203A11C->unk6 < gUnknown_0203A11C->unk7 ? 1 : -1; +} + +static bool8 sub_811DAA4(void) +{ + u8 var0, var1; + if (gUnknown_0203A11C->unk6 == gUnknown_0203A11C->unk7) + return FALSE; + + gUnknown_0203A11C->unk6 += gUnknown_0203A11C->unk8; + sub_811DADC(gUnknown_0203A11C->unk6); + var0 = gUnknown_0203A11C->unk6; + var1 = gUnknown_0203A11C->unk7; + return (var0 ^ var1) > 0; +} + +static void sub_811DADC(u8 arg0) +{ + FillBgTilemapBufferRect_Palette0(1, 0, 0, 10, 30, 10); + switch (arg0) + { + case 0: + break; + case 1: + sub_811DC28(11, 14, 3, 2); + break; + case 2: + sub_811DC28(9, 14, 7, 2); + break; + case 3: + sub_811DC28(7, 14, 11, 2); + break; + case 4: + sub_811DC28(5, 14, 15, 2); + break; + case 5: + sub_811DC28(3, 14, 19, 2); + break; + case 6: + sub_811DC28(1, 14, 23, 2); + break; + case 11: + sub_811DC28(1, 10, 24, 10); + break; + case 12: + sub_811DC28(1, 10, 25, 10); + break; + case 13: + sub_811DC28(1, 10, 26, 10); + break; + case 14: + sub_811DC28(1, 10, 27, 10); + break; + case 15: + sub_811DC28(1, 10, 28, 10); + break; + case 16: + sub_811DC28(1, 10, 29, 10); + break; + case 17: + sub_811DC28(0, 10, 30, 10); + break; + case 10: + case 18: + sub_811DC28(1, 10, 23, 10); + break; + case 9: + case 19: + sub_811DC28(1, 11, 23, 8); + break; + case 8: + case 20: + sub_811DC28(1, 12, 23, 6); + break; + case 7: + case 21: + sub_811DC28(1, 13, 23, 4); + break; + case 22: + sub_811DC28(1, 14, 23, 2); + break; + } + + CopyBgTilemapBufferToVram(1); +} + +static void sub_811DC28(int left, int top, int width, int height) +{ + u16 *tilemap; + int right; + int bottom; + int x, y; + + tilemap = gUnknown_0203A11C->unk300; + right = left + width - 1; + bottom = top + height - 1; + x = left; + y = top; + tilemap[y * 32 + x] = 0x4001; + x++; + for (; x < right; x++) + tilemap[y * 32 + x] = 0x4002; + + tilemap[y * 32 + x] = 0x4003; + y++; + for (; y < bottom; y++) + { + tilemap[y * 32 + left] = 0x4005; + x = left + 1; + for (; x < right; x++) + tilemap[y * 32 + x] = 0x4000; + + tilemap[y * 32 + x] = 0x4007; + } + + tilemap[y * 32 + left] = 0x4009; + x = left + 1; + for (; x < right; x++) + tilemap[y * 32 + x] = 0x400A; + + tilemap[y * 32 + x] = 0x400B; + sub_811DE5C((left + 1) * 8, (top + 1) * 8, (width - 2) * 8, (height - 2) * 8); +} + +static void sub_811DD84(void) +{ + ChangeBgY(2, 0x800, 0); + gUnknown_0203A11C->unk2CE = 0; +} + +static void sub_811DDAC(s16 arg0, u8 arg1) +{ + int bgY; + s16 var0; + + bgY = GetBgY(2); + gUnknown_0203A11C->unk2CE += arg0; + var0 = arg0 * 16; + bgY += var0 << 8; + if (arg1) + { + gUnknown_0203A11C->unk2D0 = bgY; + gUnknown_0203A11C->unk2D4 = arg1 * 256; + if (var0 < 0) + gUnknown_0203A11C->unk2D4 = -gUnknown_0203A11C->unk2D4; + } + else + { + ChangeBgY(2, bgY, 0); + } +} + +static bool8 sub_811DE10(void) +{ + int bgY; + + bgY = GetBgY(2); + if (bgY == gUnknown_0203A11C->unk2D0) + { + return FALSE; + } + else + { + ChangeBgY(2, gUnknown_0203A11C->unk2D4, 1); + return TRUE; + } +} + +static int sub_811DE48(void) +{ + return gUnknown_0203A11C->unk2CE; +} + +static void sub_811DE5C(u8 left, u8 top, u8 width, u8 height) +{ + u16 horizontalDimensions = WIN_RANGE(left, left + width); + u16 verticalDimensions = WIN_RANGE(top, top + height); + SetGpuReg(REG_OFFSET_WIN0H, horizontalDimensions); + SetGpuReg(REG_OFFSET_WIN0V, verticalDimensions); +} + +static void sub_811DE90(void) +{ + u32 i; + + LoadSpriteSheets(gUnknown_08597CA0); + LoadSpritePalettes(gUnknown_08597CC0); + for (i = 0; i < 4; i++) + LoadCompressedSpriteSheet(&gUnknown_08597CE8[i]); +} + +static void sub_811DEC4(void) +{ + u8 var0 = sub_811BA68(); + int x = gUnknown_08597C30[var0].unk0_0 * 8 + 13; + int y = gUnknown_08597C30[var0].unk0_5 * 8 + 8; + u8 spriteId = CreateSprite(&gUnknown_08597D18, x, y, 2); + gUnknown_0203A11C->unk2D8 = &gSprites[spriteId]; + gSprites[spriteId].data[1] = 1; +} + +void sub_811DF28(struct Sprite *sprite) +{ + if (sprite->data[1]) + { + if (++sprite->data[0] > 2) + { + sprite->data[0] = 0; + if (++sprite->pos2.x > 0) + sprite->pos2.x = -6; + } + } +} + +static void sub_811DF60(u8 x, u8 y) +{ + gUnknown_0203A11C->unk2D8->pos1.x = x; + gUnknown_0203A11C->unk2D8->pos1.y = y; + gUnknown_0203A11C->unk2D8->pos2.x = 0; + gUnknown_0203A11C->unk2D8->data[0] = 0; +} + +static void sub_811DF90(void) +{ + gUnknown_0203A11C->unk2D8->data[0] = 0; + gUnknown_0203A11C->unk2D8->data[1] = 0; + gUnknown_0203A11C->unk2D8->pos2.x = 0; +} + +static void sub_811DFB0(void) +{ + gUnknown_0203A11C->unk2D8->data[1] = 1; +} + +static void sub_811DFC8(void) +{ + u8 spriteId = CreateSprite(&gUnknown_08597D68, 0, 0, 3); + gUnknown_0203A11C->unk2DC = &gSprites[spriteId]; + gUnknown_0203A11C->unk2DC->pos2.x = 32; + + spriteId = CreateSprite(&gUnknown_08597D68, 0, 0, 3); + gUnknown_0203A11C->unk2E0 = &gSprites[spriteId]; + gUnknown_0203A11C->unk2E0->pos2.x = -32; + + gUnknown_0203A11C->unk2DC->hFlip = 1; + sub_811E088(); +} + +static void sub_811E050(void) +{ + DestroySprite(gUnknown_0203A11C->unk2DC); + gUnknown_0203A11C->unk2DC = NULL; + DestroySprite(gUnknown_0203A11C->unk2E0); + gUnknown_0203A11C->unk2E0 = NULL; +} + +static void sub_811E088(void) +{ + u8 var0; + u8 var1; + + if (gUnknown_0203A11C->unk2DC && gUnknown_0203A11C->unk2E0) + { + sub_811BB9C(&var0, &var1); + if (!sub_811BBB0()) + sub_811E0EC(var0, var1); + else + sub_811E1A4(var0, var1); + } +} + +static void sub_811E0EC(s8 arg0, s8 arg1) +{ + if (arg0 != -1) + { + StartSpriteAnim(gUnknown_0203A11C->unk2DC, 0); + gUnknown_0203A11C->unk2DC->pos1.x = arg0 * 84 + 58; + gUnknown_0203A11C->unk2DC->pos1.y = arg1 * 16 + 96; + + StartSpriteAnim(gUnknown_0203A11C->unk2E0, 0); + gUnknown_0203A11C->unk2E0->pos1.x = arg0 * 84 + 58; + gUnknown_0203A11C->unk2E0->pos1.y = arg1 * 16 + 96; + } + else + { + StartSpriteAnim(gUnknown_0203A11C->unk2DC, 1); + gUnknown_0203A11C->unk2DC->pos1.x = 216; + gUnknown_0203A11C->unk2DC->pos1.y = arg1 * 16 + 112; + + StartSpriteAnim(gUnknown_0203A11C->unk2E0, 1); + gUnknown_0203A11C->unk2E0->pos1.x = 216; + gUnknown_0203A11C->unk2E0->pos1.y = arg1 * 16 + 112; + } +} + +static void sub_811E1A4(s8 arg0, s8 arg1) +{ + int anim; + int x, y; + + if (arg0 != -1) + { + y = arg1 * 16 + 96; + x = 32; + if (arg0 == 6 && arg1 == 0) + { + x = 158; + anim = 2; + } + else + { + x += gUnknown_08597D08[(u8)arg0 < 7 ? arg0 : 0]; + anim = 3; + } + + StartSpriteAnim(gUnknown_0203A11C->unk2DC, anim); + gUnknown_0203A11C->unk2DC->pos1.x = x; + gUnknown_0203A11C->unk2DC->pos1.y = y; + + StartSpriteAnim(gUnknown_0203A11C->unk2E0, anim); + gUnknown_0203A11C->unk2E0->pos1.x = x; + gUnknown_0203A11C->unk2E0->pos1.y = y; + } + else + { + StartSpriteAnim(gUnknown_0203A11C->unk2DC, 1); + gUnknown_0203A11C->unk2DC->pos1.x = 216; + gUnknown_0203A11C->unk2DC->pos1.y = arg1 * 16 + 112; + + StartSpriteAnim(gUnknown_0203A11C->unk2E0, 1); + gUnknown_0203A11C->unk2E0->pos1.x = 216; + gUnknown_0203A11C->unk2E0->pos1.y = arg1 * 16 + 112; + } +} + +static void sub_811E288(void) +{ + u8 spriteId = CreateSprite(&gUnknown_08597D18, 0, 0, 4); + gUnknown_0203A11C->unk2E4 = &gSprites[spriteId]; + gUnknown_0203A11C->unk2E4->callback = sub_811E2DC; + gUnknown_0203A11C->unk2E4->oam.priority = 2; + sub_811E30C(); +} + +static void sub_811E2DC(struct Sprite *sprite) +{ + if (++sprite->data[0] > 2) + { + sprite->data[0] = 0; + if (++sprite->pos2.x > 0) + sprite->pos2.x = -6; + } +} + +static void sub_811E30C(void) +{ + s8 var0, var1, x, y; + + sub_811BBC8(&var0, &var1); + x = var0 * 13; + x = x * 8 + 28; + y = var1 * 16 + 96; + sub_811E34C(x, y); +} + +static void sub_811E34C(u8 x, u8 y) +{ + if (gUnknown_0203A11C->unk2E4) + { + gUnknown_0203A11C->unk2E4->pos1.x = x; + gUnknown_0203A11C->unk2E4->pos1.y = y; + gUnknown_0203A11C->unk2E4->pos2.x = 0; + gUnknown_0203A11C->unk2E4->data[0] = 0; + } +} + +static void sub_811E380(void) +{ + if (gUnknown_0203A11C->unk2E4) + { + DestroySprite(gUnknown_0203A11C->unk2E4); + gUnknown_0203A11C->unk2E4 = NULL; + } +} + +static void sub_811E3AC(void) +{ + u8 spriteId = CreateSprite(&gUnknown_08597DF0, 208, 128, 6); + gUnknown_0203A11C->unk2E8 = &gSprites[spriteId]; + gUnknown_0203A11C->unk2E8->pos2.x = -64; + + spriteId = CreateSprite(&gUnknown_08597DD0, 208, 80, 5); + gUnknown_0203A11C->unk2EC = &gSprites[spriteId]; + gUnknown_0203A11C->unk9 = 0; +} + +static bool8 sub_811E418(void) +{ + switch (gUnknown_0203A11C->unk9) + { + default: + return FALSE; + case 0: + gUnknown_0203A11C->unk2E8->pos2.x += 8; + if (gUnknown_0203A11C->unk2E8->pos2.x >= 0) + { + gUnknown_0203A11C->unk2E8->pos2.x = 0; + if (!sub_811BBB0()) + StartSpriteAnim(gUnknown_0203A11C->unk2EC, 1); + else + StartSpriteAnim(gUnknown_0203A11C->unk2EC, 2); + + gUnknown_0203A11C->unk9++; + } + break; + case 1: + if (gUnknown_0203A11C->unk2EC->animEnded) + { + gUnknown_0203A11C->unk9 = 2; + return FALSE; + } + } + + return TRUE; +} + +static void sub_811E4AC(void) +{ + gUnknown_0203A11C->unk9 = 0; + StartSpriteAnim(gUnknown_0203A11C->unk2EC, 3); +} + +static bool8 sub_811E4D0(void) +{ + switch (gUnknown_0203A11C->unk9) + { + default: + return FALSE; + case 0: + if (gUnknown_0203A11C->unk2EC->animEnded) + gUnknown_0203A11C->unk9 = 1; + break; + case 1: + gUnknown_0203A11C->unk2E8->pos2.x -= 8; + if (gUnknown_0203A11C->unk2E8->pos2.x <= -64) + { + DestroySprite(gUnknown_0203A11C->unk2EC); + DestroySprite(gUnknown_0203A11C->unk2E8); + gUnknown_0203A11C->unk2EC = NULL; + gUnknown_0203A11C->unk2E8 = NULL; + gUnknown_0203A11C->unk9++; + return FALSE; + } + } + + return TRUE; +} + +static void sub_811E55C(void) +{ + StartSpriteAnim(gUnknown_0203A11C->unk2EC, 4); +} + +static void sub_811E578(void) +{ + if (!sub_811BBB0()) + StartSpriteAnim(gUnknown_0203A11C->unk2EC, 1); + else + StartSpriteAnim(gUnknown_0203A11C->unk2EC, 2); +} + +static bool8 sub_811E5B8(void) +{ + return !gUnknown_0203A11C->unk2EC->animEnded; +} + +static void sub_811E5D4(void) +{ + u8 spriteId = CreateSprite(&gUnknown_08597E48, 96, 80, 0); + if (spriteId != MAX_SPRITES) + gUnknown_0203A11C->unk2F0 = &gSprites[spriteId]; + + spriteId = CreateSprite(&gUnknown_08597E48, 96, 156, 0); + if (spriteId != MAX_SPRITES) + { + gUnknown_0203A11C->unk2F4 = &gSprites[spriteId]; + gUnknown_0203A11C->unk2F4->vFlip = 1; + } + + sub_811E6B0(); +} + +static void sub_811E64C(void) +{ + gUnknown_0203A11C->unk2F0->invisible = !sub_811BBF8(); + gUnknown_0203A11C->unk2F4->invisible = !sub_811BC2C(); +} + +static void sub_811E6B0(void) +{ + gUnknown_0203A11C->unk2F0->invisible = 1; + gUnknown_0203A11C->unk2F4->invisible = 1; +} + +static void sub_811E6E0(int arg0) +{ + if (!arg0) + { + gUnknown_0203A11C->unk2F0->pos1.x = 96; + gUnknown_0203A11C->unk2F4->pos1.x = 96; + } + else + { + gUnknown_0203A11C->unk2F0->pos1.x = 120; + gUnknown_0203A11C->unk2F4->pos1.x = 120; + } +} + +static void sub_811E720(void) +{ + u8 spriteId = CreateSprite(&gUnknown_08597E30, 220, 84, 1); + if (spriteId != MAX_SPRITES) + gUnknown_0203A11C->unk2F8 = &gSprites[spriteId]; + + spriteId = CreateSprite(&gUnknown_08597E30, 220, 156, 1); + if (spriteId != MAX_SPRITES) + { + gUnknown_0203A11C->unk2FC = &gSprites[spriteId]; + StartSpriteAnim(gUnknown_0203A11C->unk2FC, 1); + } + + sub_811E7F8(); +} + +static void sub_811E794(void) +{ + gUnknown_0203A11C->unk2F8->invisible = !sub_811BBF8(); + gUnknown_0203A11C->unk2FC->invisible = !sub_811BC2C(); +} + +static void sub_811E7F8(void) +{ + gUnknown_0203A11C->unk2F8->invisible = 1; + gUnknown_0203A11C->unk2FC->invisible = 1; +} + +static void sub_811E828(void) +{ + int graphicsId; + u8 spriteId; + + switch (sub_811BCBC()) + { + case 0: + graphicsId = EVENT_OBJ_GFX_REPORTER_M; + break; + case 1: + graphicsId = EVENT_OBJ_GFX_REPORTER_F; + break; + case 2: + graphicsId = EVENT_OBJ_GFX_BOY_1; + break; + default: + return; + } + + if (sub_811BA68() != 4) + return; + + spriteId = AddPseudoEventObject(graphicsId, SpriteCallbackDummy, 76, 40, 0); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].oam.priority = 0; + StartSpriteAnim(&gSprites[spriteId], 2); + } + + spriteId = AddPseudoEventObject( + gSaveBlock2Ptr->playerGender == MALE ? EVENT_OBJ_GFX_RIVAL_BRENDAN_NORMAL : EVENT_OBJ_GFX_RIVAL_MAY_NORMAL, + SpriteCallbackDummy, + 52, + 40, + 0); + + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].oam.priority = 0; + StartSpriteAnim(&gSprites[spriteId], 3); + } +} + +int sub_811E8E4(void) +{ + u8 var0 = sub_811BA68(); + switch (gUnknown_08597C30[var0].unk3) + { + case 1: + return 1; + case 2: + return 2; + case 0: + return 0; + default: + return 3; + } +} + +static int sub_811E920(int arg0) +{ + int var0 = sub_811E8E4(); + if (var0 < 3) + return gUnknown_08597E60[var0][arg0] + 4; + else + return 0; +} |