summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/union_room_chat.c1114
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;
+}