diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/union_room_chat.c | 1114 |
1 files changed, 1114 insertions, 0 deletions
diff --git a/src/union_room_chat.c b/src/union_room_chat.c new file mode 100644 index 000000000..c171731c2 --- /dev/null +++ b/src/union_room_chat.c @@ -0,0 +1,1114 @@ +#include "global.h" +#include "gflib.h" +#include "help_system.h" +#include "link.h" +#include "link_rfu.h" +#include "list_menu.h" +#include "load_save.h" +#include "menu.h" +#include "overworld.h" +#include "quest_log.h" +#include "save.h" +#include "scanline_effect.h" +#include "task.h" +#include "data_8479668.h" +#include "constants/songs.h" + +enum +{ + UNION_ROOM_KB_PAGE_UPPER, + UNION_ROOM_KB_PAGE_LOWER, + UNION_ROOM_KB_PAGE_EMOJI, + UNION_ROOM_KB_PAGE_COUNT +}; + +struct UnionRoomChat +{ + u8 filler0[0x4]; + u16 unk4; + u16 unk6; + u8 filler8[0x2]; + u16 unkA; + u8 fillerC[0x1]; + u8 unkD; + u8 unkE; + u8 unkF; + u8 currentPage; + u8 unk11; + u8 currentRow; + u8 unk13; + u8 unk14; + u8 unk15; + u8 unk16; + u8 unk17; + u8 unk18; + u8 unk19; + u8 unk1A[0x1F]; + u8 unk39[0x40]; + u8 unk79[0x40]; + u8 unkB9[UNION_ROOM_KB_ROW_COUNT][21]; + u8 filler18B[0x5]; + u8 unk190[0x28]; +}; + +EWRAM_DATA struct UnionRoomChat * gUnknown_203B0E0 = NULL; + +void sub_812845C(struct UnionRoomChat * unionRoomChat); +void c2_081284E0(void); +void sub_81285B4(void); +void sub_81285CC(void); +void sub_81285E8(u8 taskId); +void sub_8128640(void); +void sub_81286C4(void); +void sub_81287B4(void); +void sub_81288D4(void); +void sub_8128AA0(void); +void sub_8128C04(void); +void sub_8128CA8(void); +void sub_8128DA4(void); +void sub_8128E78(void); +void sub_8128FB8(void); +void sub_8129218(u16 a0); +bool32 sub_8129228(void); +void sub_81292D8(void); +void sub_81293AC(void); +void sub_81293D8(void); +bool32 sub_8129408(void); +void sub_8129424(void); +void sub_8129454(void); +void sub_8129470(void); +u8 *sub_81294C8(void); +u8 *sub_81294EC(void); +void sub_8129560(u8 *ptr); +void sub_8129568(u8 *ptr); +void sub_8129590(u8 *ptr); +void sub_81295C0(u8 *ptr); +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, + sub_81286C4, + sub_81287B4, + sub_81288D4, + sub_8128DA4, + sub_8128E78, + sub_8128AA0, + sub_8128C04, + sub_8128CA8, + sub_8128FB8 +}; + +static const u8 sKeyboardPageMaxRow[] = +{ + [UNION_ROOM_KB_PAGE_UPPER] = 9, + [UNION_ROOM_KB_PAGE_LOWER] = 9, + [UNION_ROOM_KB_PAGE_EMOJI] = 9, + 9 +}; + +const u8 gUnknown_845A8AC[] = { + CHAR_SPACE, 0x16, 0x17, 0x68, 0x19, 0x1A, 0x1B, 0x1C, + 0x1D, 0x1E, CHAR_SPACE, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x25, 0x26, 0x27, 0x28, 0x29, 0x15, 0x01, 0x02, + CHAR_SPACE, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, CHAR_SPACE, + 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, + 0x13, 0x14, 0x2A, 0x2B, 0x2C, 0x2D, CHAR_SPACE, CHAR_SPACE, + CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, 0x35, 0x36, CHAR_SPACE, + CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, + CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, + CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, + CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, 0x53, 0x54, 0x55, 0x56, CHAR_SPACE, + CHAR_SPACE, CHAR_SPACE, 0x6F, 0x5B, 0x5C, 0x5D, CHAR_SPACE, CHAR_SPACE, + CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, + 0x03, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, 0x5A, + CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, + CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, + CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, 0x84, 0x85, 0x86, CHAR_SPACE, + CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, + CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, + CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, + 0xA0, CHAR_0, CHAR_1, CHAR_2, CHAR_3, CHAR_4, CHAR_5, CHAR_6, + CHAR_7, CHAR_8, CHAR_9, CHAR_EXCL_MARK, CHAR_QUESTION_MARK, CHAR_PERIOD, CHAR_HYPHEN, 0xAF, + CHAR_ELLIPSIS, CHAR_DBL_QUOT_LEFT, CHAR_DBL_QUOT_RIGHT, CHAR_SGL_QUOT_LEFT, CHAR_SGL_QUOT_RIGHT, CHAR_MALE, CHAR_FEMALE, CHAR_CURRENCY, + CHAR_COMMA, CHAR_MULT_SIGN, CHAR_SLASH, CHAR_a, CHAR_b, CHAR_c, CHAR_d, CHAR_e, + CHAR_f, CHAR_g, CHAR_h, CHAR_i, CHAR_j, CHAR_k, CHAR_l, CHAR_m, + CHAR_n, CHAR_o, CHAR_p, CHAR_q, CHAR_r, CHAR_s, CHAR_t, CHAR_u, + CHAR_v, CHAR_w, CHAR_x, CHAR_y, CHAR_z, CHAR_A, CHAR_B, CHAR_C, + CHAR_D, CHAR_E, CHAR_F, CHAR_G, CHAR_H, CHAR_I, CHAR_J, CHAR_K, + CHAR_L, CHAR_M, CHAR_N, CHAR_O, CHAR_P, CHAR_Q, CHAR_R, CHAR_S, + CHAR_T, CHAR_U, CHAR_V, CHAR_W, CHAR_X, CHAR_Y, CHAR_Z, 0xEF, + CHAR_COLON, 0xF4, 0xF5, 0xF6, 0xF1, 0xF2, 0xF3, CHAR_SPACE, + CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE +}; + +const u8 *const sUnionRoomKeyboardText[UNION_ROOM_KB_PAGE_COUNT][UNION_ROOM_KB_ROW_COUNT] = { + [UNION_ROOM_KB_PAGE_UPPER] = { + gText_UnionRoomChatKeyboard_ABCDE, + gText_UnionRoomChatKeyboard_FGHIJ, + gText_UnionRoomChatKeyboard_KLMNO, + gText_UnionRoomChatKeyboard_PQRST, + gText_UnionRoomChatKeyboard_UVWXY, + gText_UnionRoomChatKeyboard_Z, + gText_UnionRoomChatKeyboard_01234Upper, + gText_UnionRoomChatKeyboard_56789Upper, + gText_UnionRoomChatKeyboard_PunctuationUpper, + gText_UnionRoomChatKeyboard_SymbolsUpper + }, + [UNION_ROOM_KB_PAGE_LOWER] = { + gText_UnionRoomChatKeyboard_abcde, + gText_UnionRoomChatKeyboard_fghij, + gText_UnionRoomChatKeyboard_klmno, + gText_UnionRoomChatKeyboard_pqrst, + gText_UnionRoomChatKeyboard_uvwxy, + gText_UnionRoomChatKeyboard_z, + gText_UnionRoomChatKeyboard_01234Lower, + gText_UnionRoomChatKeyboard_56789Lower, + gText_UnionRoomChatKeyboard_PunctuationLower, + gText_UnionRoomChatKeyboard_SymbolsLower + }, + [UNION_ROOM_KB_PAGE_EMOJI] = { + gText_UnionRoomChatKeyboard_Emoji1, + gText_UnionRoomChatKeyboard_Emoji2, + gText_UnionRoomChatKeyboard_Emoji3, + gText_UnionRoomChatKeyboard_Emoji4, + gText_UnionRoomChatKeyboard_Emoji5, + gText_UnionRoomChatKeyboard_Emoji6, + gText_UnionRoomChatKeyboard_Emoji7, + gText_UnionRoomChatKeyboard_Emoji8, + gText_UnionRoomChatKeyboard_Emoji9, + gText_UnionRoomChatKeyboard_Emoji10 + } +}; + +void sub_8128420(void) +{ + gUnknown_203B0E0 = Alloc(sizeof(struct UnionRoomChat)); + sub_812845C(gUnknown_203B0E0); + gKeyRepeatStartDelay = 20; + sub_812B4AC(); + SetVBlankCallback(NULL); + SetMainCallback2(c2_081284E0); +} + +void sub_812845C(struct UnionRoomChat * unionRoomChat) +{ + int i; + + unionRoomChat->unk4 = 0; + unionRoomChat->unk6 = 0; + unionRoomChat->currentPage = 0; + unionRoomChat->unk11 = 0; + unionRoomChat->currentRow = 0; + unionRoomChat->unk14 = 0; + unionRoomChat->unk15 = 0; + unionRoomChat->unk16 = 0; + unionRoomChat->unk1A[0] = EOS; + unionRoomChat->unkD = GetLinkPlayerCount(); + unionRoomChat->unk13 = GetMultiplayerId(); + unionRoomChat->unk17 = 0; + unionRoomChat->unk18 = 0; + sub_8129560(unionRoomChat->unk190); + for (i = 0; i < UNION_ROOM_KB_ROW_COUNT; i++) + StringCopy(unionRoomChat->unkB9[i], gSaveBlock1Ptr->unk3AD4[i]); +} + +void sub_81284BC(void) +{ + DestroyTask(gUnknown_203B0E0->unkE); + DestroyTask(gUnknown_203B0E0->unkF); + Free(gUnknown_203B0E0); +} + +void c2_081284E0(void) +{ + switch (gMain.state) + { + case 0: + ResetTasks(); + ResetSpriteData(); + FreeAllSpritePalettes(); + sub_8129B14(); + gMain.state++; + break; + case 1: + sub_8129BFC(); + if (!sub_8129B78()) + { + BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK); + BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + SetVBlankCallback(sub_81285B4); + gMain.state++; + } + break; + case 2: + UpdatePaletteFade(); + if (!gPaletteFade.active) + { + SetMainCallback2(sub_81285CC); + SetQuestLogEvent(QL_EVENT_USED_UNION_ROOM_CHAT, NULL); + gUnknown_203B0E0->unkE = CreateTask(sub_81285E8, 8); + gUnknown_203B0E0->unkF = CreateTask(sub_81298F8, 7); + LoadWirelessStatusIndicatorSpriteGfx(); + CreateWirelessStatusIndicatorSprite(232, 150); + } + break; + } +} + +void sub_81285B4(void) +{ + TransferPlttBuffer(); + LoadOam(); + ProcessSpriteCopyRequests(); + ScanlineEffect_InitHBlankDmaTransfer(); +} + +void sub_81285CC(void) +{ + RunTasks(); + sub_8129BFC(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_81285E8(u8 taskId) +{ + switch (gUnknown_203B0E0->unk17) + { + case 1: + sub_8129218(6); + gUnknown_203B0E0->unk17 = 0; + break; + case 2: + sub_8129218(7); + gUnknown_203B0E0->unk17 = 0; + break; + case 3: + sub_8129218(8); + gUnknown_203B0E0->unk17 = 0; + break; + } + + gUnknown_845A880[gUnknown_203B0E0->unk4](); +} + +void sub_8128640(void) +{ + switch (gUnknown_203B0E0->unk6) + { + case 0: + sub_8129568(gUnknown_203B0E0->unk190); + gUnknown_203B0E0->unk6++; + // fall through + case 1: + if (IsLinkTaskFinished() && !sub_80FBA1C()) + { + if (SendBlock(0, gUnknown_203B0E0->unk190, sizeof(gUnknown_203B0E0->unk190))) + gUnknown_203B0E0->unk6++; + } + break; + case 2: + if (IsLinkTaskFinished()) + sub_8129218(1); + break; + } +} + +void sub_81286C4(void) +{ + bool8 var0, var1; + + switch (gUnknown_203B0E0->unk6) + { + case 0: + if (JOY_NEW(START_BUTTON)) + { + if (gUnknown_203B0E0->unk15) + sub_8129218(4); + } + else if (JOY_NEW(SELECT_BUTTON)) + { + sub_8129218(2); + } + else if (JOY_REPT(B_BUTTON)) + { + if (gUnknown_203B0E0->unk15) + { + sub_81293AC(); + sub_8129C34(8, 0); + gUnknown_203B0E0->unk6 = 1; + } + else + { + sub_8129218(3); + } + } + else if (JOY_NEW(A_BUTTON)) + { + sub_81292D8(); + sub_8129C34(8, 0); + sub_8129C34(2, 1); + gUnknown_203B0E0->unk6 = 1; + } + else if (JOY_NEW(R_BUTTON)) + { + if (gUnknown_203B0E0->currentPage != UNION_ROOM_KB_PAGE_COUNT) + { + sub_81293D8(); + sub_8129C34(8, 0); + gUnknown_203B0E0->unk6 = 1; + } + else + { + sub_8129218(5); + } + } + else if (sub_8129228()) + { + sub_8129C34(1, 0); + gUnknown_203B0E0->unk6 = 1; + } + break; + case 1: + var0 = sub_8129C8C(0); + var1 = sub_8129C8C(1); + if (!var0 && !var1) + gUnknown_203B0E0->unk6 = 0; + break; + } +} + +void sub_81287B4(void) +{ + s16 input; + int var0; + + switch (gUnknown_203B0E0->unk6) + { + case 0: + sub_8129C34(3, 0); + gUnknown_203B0E0->unk6++; + break; + case 1: + if (!sub_8129C8C(0)) + gUnknown_203B0E0->unk6++; + break; + case 2: + input = Menu_ProcessInput(); + switch (input) + { + default: + sub_8129C34(4, 0); + var0 = 1; + if (gUnknown_203B0E0->currentPage == input || input > UNION_ROOM_KB_PAGE_COUNT) + var0 = 0; + break; + case MENU_NOTHING_CHOSEN: + if (JOY_NEW(SELECT_BUTTON)) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(1); + } + return; + case MENU_B_PRESSED: + sub_8129C34(4, 0); + gUnknown_203B0E0->unk6 = 3; + return; + } + + if (!var0) + { + gUnknown_203B0E0->unk6 = 3; + return; + } + + gUnknown_203B0E0->unk11 = 0; + gUnknown_203B0E0->currentRow = 0; + sub_8129C34(5, 1); + gUnknown_203B0E0->currentPage = input; + gUnknown_203B0E0->unk6 = 4; + break; + case 3: + if (!sub_8129C8C(0)) + sub_8129218(1); + break; + case 4: + if (!sub_8129C8C(0) && !sub_8129C8C(1)) + sub_8129218(1); + break; + } +} + +void sub_81288D4(void) +{ + s8 input; + + switch (gUnknown_203B0E0->unk6) + { + case 0: + sub_8129C34(6, 0); + gUnknown_203B0E0->unk6 = 1; + break; + case 1: + if (!sub_8129C8C(0)) + gUnknown_203B0E0->unk6 = 2; + break; + case 2: + input = sub_812A568(); + switch (input) + { + case -1: + case 1: + sub_8129C34(7, 0); + gUnknown_203B0E0->unk6 = 3; + break; + case 0: + if (gUnknown_203B0E0->unk13 == 0) + { + sub_8129614(gUnknown_203B0E0->unk190); + sub_8129C34(7, 0); + gUnknown_203B0E0->unk6 = 9; + } + else + { + sub_81295C0(gUnknown_203B0E0->unk190); + gUnknown_203B0E0->unk6 = 4; + } + break; + } + break; + case 3: + if (!sub_8129C8C(0)) + sub_8129218(1); + break; + case 9: + if (!sub_8129C8C(0)) + { + sub_8129C34(20, 0); + gUnknown_203B0E0->unk6 = 10; + } + break; + case 10: + if (!sub_8129C8C(0)) + gUnknown_203B0E0->unk6 = 8; + break; + case 8: + input = sub_812A568(); + switch (input) + { + case -1: + case 1: + sub_8129C34(7, 0); + gUnknown_203B0E0->unk6 = 3; + break; + case 0: + sub_80FA4A8(); + sub_8129614(gUnknown_203B0E0->unk190); + gUnknown_203B0E0->unk6 = 4; + break; + } + break; + case 4: + if (IsLinkTaskFinished() && !sub_80FBA1C() && SendBlock(0, gUnknown_203B0E0->unk190, sizeof(gUnknown_203B0E0->unk190))) + { + if (!gUnknown_203B0E0->unk13) + gUnknown_203B0E0->unk6 = 6; + else + gUnknown_203B0E0->unk6 = 5; + } + break; + case 5: + if (!gReceivedRemoteLinkPlayers) + { + sub_8129218(9); + } + break; + } +} + +void sub_8128AA0(void) +{ + switch (gUnknown_203B0E0->unk6) + { + case 0: + if (!FuncIsActiveTask(sub_81298F8)) + { + sub_8129C34(7, 0); + gUnknown_203B0E0->unk6++; + } + break; + case 1: + if (!sub_8129C8C(0)) + { + sub_8129C34(18, 0); + gUnknown_203B0E0->unk6++; + } + break; + case 2: + if (!sub_8129C8C(0)) + { + sub_81295EC(gUnknown_203B0E0->unk190); + gUnknown_203B0E0->unk6++; + } + break; + case 3: + if (IsLinkTaskFinished() && !sub_80FBA1C() && SendBlock(0, gUnknown_203B0E0->unk190, sizeof(gUnknown_203B0E0->unk190))) + gUnknown_203B0E0->unk6++; + break; + case 4: + if ((GetBlockReceivedStatus() & 1) && !sub_80FBA1C()) + gUnknown_203B0E0->unk6++; + break; + case 5: + if (IsLinkTaskFinished() && !sub_80FBA1C()) + { + sub_800AAC0(); + gUnknown_203B0E0->unkA = 0; + gUnknown_203B0E0->unk6++; + } + break; + case 6: + if (gUnknown_203B0E0->unkA < 150) + gUnknown_203B0E0->unkA++; + + if (!gReceivedRemoteLinkPlayers) + gUnknown_203B0E0->unk6++; + break; + case 7: + if (gUnknown_203B0E0->unkA >= 150) + sub_8129218(9); + else + gUnknown_203B0E0->unkA++; + break; + } +} + +void sub_8128C04(void) +{ + switch (gUnknown_203B0E0->unk6) + { + case 0: + if (!FuncIsActiveTask(sub_81298F8)) + { + sub_8129C34(7, 0); + gUnknown_203B0E0->unk6++; + } + break; + case 1: + if (!sub_8129C8C(0) && IsLinkTaskFinished() && !sub_80FBA1C()) + { + sub_800AAC0(); + gUnknown_203B0E0->unkA = 0; + gUnknown_203B0E0->unk6++; + } + break; + case 2: + if (gUnknown_203B0E0->unkA < 150) + gUnknown_203B0E0->unkA++; + + if (!gReceivedRemoteLinkPlayers) + gUnknown_203B0E0->unk6++; + break; + case 3: + if (gUnknown_203B0E0->unkA >= 150) + sub_8129218(9); + else + gUnknown_203B0E0->unkA++; + break; + } +} + +void sub_8128CA8(void) +{ + switch (gUnknown_203B0E0->unk6) + { + case 0: + if (!FuncIsActiveTask(sub_81298F8)) + { + if (gUnknown_203B0E0->unk13) + sub_8129C34(7, 0); + + gUnknown_203B0E0->unk6++; + } + break; + case 1: + if (!sub_8129C8C(0)) + { + if (gUnknown_203B0E0->unk13) + sub_8129C34(19, 0); + + gUnknown_203B0E0->unk6++; + } + break; + case 2: + if (sub_8129C8C(0) != TRUE && IsLinkTaskFinished() && !sub_80FBA1C()) + { + sub_800AAC0(); + gUnknown_203B0E0->unkA = 0; + gUnknown_203B0E0->unk6++; + } + break; + case 3: + if (gUnknown_203B0E0->unkA < 150) + gUnknown_203B0E0->unkA++; + + if (!gReceivedRemoteLinkPlayers) + gUnknown_203B0E0->unk6++; + break; + case 4: + if (gUnknown_203B0E0->unkA >= 150) + sub_8129218(9); + else + gUnknown_203B0E0->unkA++; + break; + } +} + +void sub_8128DA4(void) +{ + switch (gUnknown_203B0E0->unk6) + { + case 0: + if (!gReceivedRemoteLinkPlayers) + { + sub_8129218(1); + break; + } + + sub_8129590(gUnknown_203B0E0->unk190); + gUnknown_203B0E0->unk6++; + // fall through + case 1: + if (IsLinkTaskFinished() == TRUE && !sub_80FBA1C() && SendBlock(0, gUnknown_203B0E0->unk190, sizeof(gUnknown_203B0E0->unk190))) + gUnknown_203B0E0->unk6++; + break; + case 2: + sub_8129454(); + sub_8129C34(8, 0); + gUnknown_203B0E0->unk6++; + break; + case 3: + if (!sub_8129C8C(0)) + gUnknown_203B0E0->unk6++; + break; + case 4: + if (IsLinkTaskFinished()) + sub_8129218(1); + break; + } +} + +void sub_8128E78(void) +{ + switch (gUnknown_203B0E0->unk6) + { + case 0: + if (sub_8129408()) + { + sub_8129C34(9, 0); + gUnknown_203B0E0->unk6 = 2; + } + else + { + sub_8129C34(13, 0); + gUnknown_203B0E0->unk6 = 5; + } + break; + case 1: + if (JOY_NEW(A_BUTTON)) + { + sub_8129424(); + sub_8129C34(11, 0); + gUnknown_203B0E0->unk6 = 3; + } + else if (JOY_NEW(B_BUTTON)) + { + sub_8129C34(10, 0); + gUnknown_203B0E0->unk6 = 4; + } + else if (sub_8129228()) + { + sub_8129C34(1, 0); + gUnknown_203B0E0->unk6 = 2; + } + break; + case 2: + if (!sub_8129C8C(0)) + gUnknown_203B0E0->unk6 = 1; + break; + case 3: + if (!sub_8129C8C(0)) + { + sub_8129C34(10, 0); + gUnknown_203B0E0->unk6 = 4; + } + break; + case 4: + if (!sub_8129C8C(0)) + sub_8129218(1); + break; + case 5: + if (!sub_8129C8C(0)) + gUnknown_203B0E0->unk6 = 6; + break; + case 6: + if (JOY_NEW(A_BUTTON | B_BUTTON)) + { + sub_8129C34(7, 0); + gUnknown_203B0E0->unk6 = 4; + } + break; + } +} + +void sub_8128FB8(void) +{ + s8 input; + + switch (gUnknown_203B0E0->unk6) + { + case 0: + if (!gUnknown_203B0E0->unk18) + { + gUnknown_203B0E0->unk6 = 12; + } + else + { + sub_8129C34(7, 0); + gUnknown_203B0E0->unk6 = 1; + } + break; + case 1: + if (!sub_8129C8C(0)) + { + sub_8129C34(14, 0); + gUnknown_203B0E0->unk6 = 2; + } + break; + case 2: + input = sub_812A568(); + switch (input) + { + case -1: + case 1: + gUnknown_203B0E0->unk6 = 12; + break; + case 0: + sub_8129C34(7, 0); + gUnknown_203B0E0->unk6 = 3; + break; + } + break; + case 3: + if (!sub_8129C8C(0)) + { + sub_8129C34(15, 0); + gUnknown_203B0E0->unk6 = 4; + } + break; + case 4: + if (!sub_8129C8C(0)) + gUnknown_203B0E0->unk6 = 5; + break; + case 5: + input = sub_812A568(); + switch (input) + { + case -1: + case 1: + gUnknown_203B0E0->unk6 = 12; + break; + case 0: + sub_8129C34(7, 0); + gUnknown_203B0E0->unk6 = 6; + break; + } + break; + case 6: + if (!sub_8129C8C(0)) + { + sub_8129C34(16, 0); + sub_8129470(); + gUnknown_203B0E0->unk6 = 7; + } + break; + case 7: + if (!sub_8129C8C(0)) + { + SetContinueGameWarpStatusToDynamicWarp(); + TrySavingData(SAVE_NORMAL); + gUnknown_203B0E0->unk6 = 8; + } + break; + case 8: + sub_8129C34(17, 0); + gUnknown_203B0E0->unk6 = 9; + break; + case 9: + if (!sub_8129C8C(0)) + { + PlaySE(SE_SAVE); + ClearContinueGameWarpStatus2(); + gUnknown_203B0E0->unk6 = 10; + } + break; + case 10: + gUnknown_203B0E0->unk19 = 0; + gUnknown_203B0E0->unk6 = 11; + break; + case 11: + gUnknown_203B0E0->unk19++; + if (gUnknown_203B0E0->unk19 > 120) + gUnknown_203B0E0->unk6 = 12; + break; + case 12: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); + gUnknown_203B0E0->unk6 = 13; + break; + case 13: + if (!gPaletteFade.active) + { + sub_812B4B8(); + sub_8129B88(); + sub_81284BC(); + SetMainCallback2(CB2_ReturnToField); + } + break; + } +} + +void sub_8129218(u16 arg0) +{ + gUnknown_203B0E0->unk4 = arg0; + gUnknown_203B0E0->unk6 = 0; +} + +bool32 sub_8129228(void) +{ + if (!(gMain.newAndRepeatedKeys & DPAD_UP)) + { + if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (gUnknown_203B0E0->currentRow < sKeyboardPageMaxRow[gUnknown_203B0E0->currentPage]) + gUnknown_203B0E0->currentRow++; + else + gUnknown_203B0E0->currentRow = 0; + + return TRUE; + } + + if (gUnknown_203B0E0->currentPage != UNION_ROOM_KB_PAGE_COUNT) + { + if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + if (gUnknown_203B0E0->unk11) + gUnknown_203B0E0->unk11--; + else + gUnknown_203B0E0->unk11 = 4; + } + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + if (gUnknown_203B0E0->unk11 > 3) + gUnknown_203B0E0->unk11 = 0; + else + gUnknown_203B0E0->unk11++; + } + else + { + return FALSE; + } + + return TRUE; + } + + return FALSE; + } + else + { + if (gUnknown_203B0E0->currentRow) + gUnknown_203B0E0->currentRow--; + else + gUnknown_203B0E0->currentRow = sKeyboardPageMaxRow[gUnknown_203B0E0->currentPage]; + + return TRUE; + } +} + +void sub_81292D8(void) +{ + int i; + const u8 *charsStr; + int strLength; + u8 *str; + u8 buffer[21]; + + if (gUnknown_203B0E0->currentPage != UNION_ROOM_KB_PAGE_COUNT) + { + charsStr = sUnionRoomKeyboardText[gUnknown_203B0E0->currentPage][gUnknown_203B0E0->currentRow]; + for (i = 0; i < gUnknown_203B0E0->unk11; i++) + { + if (*charsStr == CHAR_EXTRA_EMOJI) + charsStr++; + charsStr++; + } + + strLength = 1; + } + else + { + u8 *tempStr = StringCopy(buffer, gUnknown_203B0E0->unkB9[gUnknown_203B0E0->currentRow]); + tempStr[0] = CHAR_SPACE; + tempStr[1] = EOS; + charsStr = buffer; + strLength = StringLength_Multibyte(buffer); + } + + gUnknown_203B0E0->unk14 = gUnknown_203B0E0->unk15; + if (!charsStr) + return; + + str = sub_81294C8(); + while (--strLength != -1 && gUnknown_203B0E0->unk15 < 15) + { + if (*charsStr == CHAR_EXTRA_EMOJI) + { + *str = *charsStr; + charsStr++; + str++; + } + + *str = *charsStr; + charsStr++; + str++; + + gUnknown_203B0E0->unk15++; + } + + *str = EOS; +} + +void sub_81293AC(void) +{ + gUnknown_203B0E0->unk14 = gUnknown_203B0E0->unk15; + if (gUnknown_203B0E0->unk15) + { + u8 *str = sub_81294EC(); + *str = EOS; + gUnknown_203B0E0->unk15--; + } +} + +void sub_81293D8(void) +{ + u8 *str; + u8 character; + + gUnknown_203B0E0->unk14 = gUnknown_203B0E0->unk15 - 1; + str = sub_81294EC(); + if (*str != CHAR_EXTRA_EMOJI) + { + character = gUnknown_845A8AC[*str]; + if (character) + *str = character; + } +} + +bool32 sub_8129408(void) +{ + if (gUnknown_203B0E0->unk15) + return TRUE; + else + return FALSE; +} + +void sub_8129424(void) +{ + u8 *src = sub_8129758(); + StringCopy(gUnknown_203B0E0->unkB9[gUnknown_203B0E0->currentRow], src); + gUnknown_203B0E0->unk18 = 1; +} + +void sub_8129454(void) +{ + gUnknown_203B0E0->unk1A[0] = EOS; + gUnknown_203B0E0->unk14 = 15; + gUnknown_203B0E0->unk15 = 0; +} + +void sub_8129470(void) +{ + int i; + for (i = 0; i < UNION_ROOM_KB_ROW_COUNT; i++) + StringCopy(gSaveBlock1Ptr->unk3AD4[i], gUnknown_203B0E0->unkB9[i]); +} + +u8 *sub_81294B0(int arg0) +{ + return gUnknown_203B0E0->unkB9[arg0]; +} + +// GetEndOfUnk1A +u8 *sub_81294C8(void) +{ + u8 *str = gUnknown_203B0E0->unk1A; + while (*str != EOS) + str++; + + return str; +} + +// GetPtrToLastCharOfUnk1A +u8 *sub_81294EC(void) +{ + u8 *str = gUnknown_203B0E0->unk1A; + u8 *str2 = str; + while (*str != EOS) + { + str2 = str; + if (*str == CHAR_EXTRA_EMOJI) + str++; + str++; + } + + return str2; +} + +u16 sub_812951C(void) +{ + u8 *str; + u32 i, numChars, strLength; + + strLength = StringLength_Multibyte(gUnknown_203B0E0->unk1A); + str = gUnknown_203B0E0->unk1A; + numChars = 0; + if (strLength > 10) + { + strLength -= 10; + for (i = 0; i < strLength; i++) + { + if (*str == CHAR_EXTRA_EMOJI) + str++; + + str++; + numChars++; + } + } + + return numChars; +} + +void sub_8129560(u8 *arg0) +{ + arg0[0] = CHAR_SPACE; +} |