summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-01-23 16:52:41 -0500
committerPikalaxALT <pikalaxalt@gmail.com>2020-01-23 16:52:41 -0500
commit4ff5769f4286212d6ca50f82647cdd3849e1a361 (patch)
tree11073166e9c625fa57814c36afbf2bd4c0d5fe50
parent85e5c57e8c86cca00e8bfc7d54e21d08c9e62e69 (diff)
union_room_chat through sub_81287B4
-rw-r--r--asm/union_room_chat.s587
-rw-r--r--data/union_room_chat.s12
-rw-r--r--include/global.h5
-rw-r--r--include/help_system.h1
-rw-r--r--include/link_rfu.h1
-rw-r--r--include/main.h1
-rw-r--r--ld_script.txt2
-rw-r--r--src/union_room_chat.c352
8 files changed, 361 insertions, 600 deletions
diff --git a/asm/union_room_chat.s b/asm/union_room_chat.s
index adfd66b5d..6f68a333f 100644
--- a/asm/union_room_chat.s
+++ b/asm/union_room_chat.s
@@ -5,593 +5,6 @@
.text
- thumb_func_start sub_8128420
-sub_8128420: @ 8128420
- push {r4,lr}
- ldr r4, _08128450 @ =gUnknown_203B0E0
- movs r0, 0xDC
- lsls r0, 1
- bl Alloc
- str r0, [r4]
- bl sub_812845C
- ldr r1, _08128454 @ =gKeyRepeatStartDelay
- movs r0, 0x14
- strh r0, [r1]
- bl sub_812B4AC
- movs r0, 0
- bl SetVBlankCallback
- ldr r0, _08128458 @ =c2_081284E0
- bl SetMainCallback2
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08128450: .4byte gUnknown_203B0E0
-_08128454: .4byte gKeyRepeatStartDelay
-_08128458: .4byte c2_081284E0
- thumb_func_end sub_8128420
-
- thumb_func_start sub_812845C
-sub_812845C: @ 812845C
- push {r4-r7,lr}
- adds r4, r0, 0
- movs r5, 0
- movs r0, 0
- strh r0, [r4, 0x4]
- strh r0, [r4, 0x6]
- strb r5, [r4, 0x10]
- strb r5, [r4, 0x11]
- strb r5, [r4, 0x12]
- strb r5, [r4, 0x14]
- strb r5, [r4, 0x15]
- strb r5, [r4, 0x16]
- movs r0, 0xFF
- strb r0, [r4, 0x1A]
- bl GetLinkPlayerCount
- strb r0, [r4, 0xD]
- bl GetMultiplayerId
- strb r0, [r4, 0x13]
- strb r5, [r4, 0x17]
- strb r5, [r4, 0x18]
- movs r1, 0xC8
- lsls r1, 1
- adds r0, r4, r1
- bl sub_8129560
- ldr r7, _081284B4 @ =gSaveBlock1Ptr
- ldr r6, _081284B8 @ =0x00003ad4
- adds r4, 0xB9
- movs r5, 0x9
-_0812849A:
- ldr r1, [r7]
- adds r1, r6
- adds r0, r4, 0
- bl StringCopy
- adds r6, 0x15
- adds r4, 0x15
- subs r5, 0x1
- cmp r5, 0
- bge _0812849A
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_081284B4: .4byte gSaveBlock1Ptr
-_081284B8: .4byte 0x00003ad4
- thumb_func_end sub_812845C
-
- thumb_func_start sub_81284BC
-sub_81284BC: @ 81284BC
- push {r4,lr}
- ldr r4, _081284DC @ =gUnknown_203B0E0
- ldr r0, [r4]
- ldrb r0, [r0, 0xE]
- bl DestroyTask
- ldr r0, [r4]
- ldrb r0, [r0, 0xF]
- bl DestroyTask
- ldr r0, [r4]
- bl Free
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_081284DC: .4byte gUnknown_203B0E0
- thumb_func_end sub_81284BC
-
- thumb_func_start c2_081284E0
-c2_081284E0: @ 81284E0
- push {r4-r6,lr}
- sub sp, 0x4
- ldr r0, _081284FC @ =gMain
- movs r1, 0x87
- lsls r1, 3
- adds r6, r0, r1
- ldrb r0, [r6]
- cmp r0, 0x1
- beq _08128518
- cmp r0, 0x1
- bgt _08128500
- cmp r0, 0
- beq _08128506
- b _08128598
- .align 2, 0
-_081284FC: .4byte gMain
-_08128500:
- cmp r0, 0x2
- beq _08128554
- b _08128598
-_08128506:
- bl ResetTasks
- bl ResetSpriteData
- bl FreeAllSpritePalettes
- bl sub_8129B14
- b _08128548
-_08128518:
- bl sub_8129BFC
- bl sub_8129B78
- adds r5, r0, 0
- cmp r5, 0
- bne _08128598
- movs r4, 0x1
- negs r4, r4
- adds r0, r4, 0
- movs r1, 0x10
- movs r2, 0
- bl BlendPalettes
- str r5, [sp]
- adds r0, r4, 0
- adds r1, r4, 0
- movs r2, 0x10
- movs r3, 0
- bl BeginNormalPaletteFade
- ldr r0, _08128550 @ =sub_81285B4
- bl SetVBlankCallback
-_08128548:
- ldrb r0, [r6]
- adds r0, 0x1
- strb r0, [r6]
- b _08128598
- .align 2, 0
-_08128550: .4byte sub_81285B4
-_08128554:
- bl UpdatePaletteFade
- ldr r0, _081285A0 @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _08128598
- ldr r0, _081285A4 @ =sub_81285CC
- bl SetMainCallback2
- movs r0, 0x11
- movs r1, 0
- bl SetQuestLogEvent
- ldr r0, _081285A8 @ =sub_81285E8
- movs r1, 0x8
- bl CreateTask
- ldr r4, _081285AC @ =gUnknown_203B0E0
- ldr r1, [r4]
- strb r0, [r1, 0xE]
- ldr r0, _081285B0 @ =sub_81298F8
- movs r1, 0x7
- bl CreateTask
- ldr r1, [r4]
- strb r0, [r1, 0xF]
- bl LoadWirelessStatusIndicatorSpriteGfx
- movs r0, 0xE8
- movs r1, 0x96
- bl CreateWirelessStatusIndicatorSprite
-_08128598:
- add sp, 0x4
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_081285A0: .4byte gPaletteFade
-_081285A4: .4byte sub_81285CC
-_081285A8: .4byte sub_81285E8
-_081285AC: .4byte gUnknown_203B0E0
-_081285B0: .4byte sub_81298F8
- thumb_func_end c2_081284E0
-
- thumb_func_start sub_81285B4
-sub_81285B4: @ 81285B4
- push {lr}
- bl TransferPlttBuffer
- bl LoadOam
- bl ProcessSpriteCopyRequests
- bl ScanlineEffect_InitHBlankDmaTransfer
- pop {r0}
- bx r0
- thumb_func_end sub_81285B4
-
- thumb_func_start sub_81285CC
-sub_81285CC: @ 81285CC
- push {lr}
- bl RunTasks
- bl sub_8129BFC
- bl AnimateSprites
- bl BuildOamBuffer
- bl UpdatePaletteFade
- pop {r0}
- bx r0
- thumb_func_end sub_81285CC
-
- thumb_func_start sub_81285E8
-sub_81285E8: @ 81285E8
- push {r4,lr}
- ldr r4, _08128600 @ =gUnknown_203B0E0
- ldr r0, [r4]
- ldrb r0, [r0, 0x17]
- cmp r0, 0x2
- beq _0812860E
- cmp r0, 0x2
- bgt _08128604
- cmp r0, 0x1
- beq _0812860A
- b _0812861E
- .align 2, 0
-_08128600: .4byte gUnknown_203B0E0
-_08128604:
- cmp r0, 0x3
- beq _08128612
- b _0812861E
-_0812860A:
- movs r0, 0x6
- b _08128614
-_0812860E:
- movs r0, 0x7
- b _08128614
-_08128612:
- movs r0, 0x8
-_08128614:
- bl sub_8129218
- ldr r1, [r4]
- movs r0, 0
- strb r0, [r1, 0x17]
-_0812861E:
- ldr r1, _08128638 @ =gUnknown_845A880
- ldr r0, _0812863C @ =gUnknown_203B0E0
- ldr r0, [r0]
- ldrh r0, [r0, 0x4]
- lsls r0, 2
- adds r0, r1
- ldr r0, [r0]
- bl _call_via_r0
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08128638: .4byte gUnknown_845A880
-_0812863C: .4byte gUnknown_203B0E0
- thumb_func_end sub_81285E8
-
- thumb_func_start sub_8128640
-sub_8128640: @ 8128640
- push {r4,lr}
- ldr r4, _08128658 @ =gUnknown_203B0E0
- ldr r0, [r4]
- ldrh r1, [r0, 0x6]
- cmp r1, 0x1
- beq _08128674
- cmp r1, 0x1
- bgt _0812865C
- cmp r1, 0
- beq _08128662
- b _081286BC
- .align 2, 0
-_08128658: .4byte gUnknown_203B0E0
-_0812865C:
- cmp r1, 0x2
- beq _081286AC
- b _081286BC
-_08128662:
- movs r1, 0xC8
- lsls r1, 1
- adds r0, r1
- bl sub_8129568
- ldr r1, [r4]
- ldrh r0, [r1, 0x6]
- adds r0, 0x1
- strh r0, [r1, 0x6]
-_08128674:
- bl IsLinkTaskFinished
- lsls r0, 24
- cmp r0, 0
- beq _081286BC
- bl sub_80FBA1C
- cmp r0, 0
- bne _081286BC
- ldr r4, _081286A8 @ =gUnknown_203B0E0
- ldr r1, [r4]
- movs r0, 0xC8
- lsls r0, 1
- adds r1, r0
- movs r0, 0
- movs r2, 0x28
- bl SendBlock
- lsls r0, 24
- cmp r0, 0
- beq _081286BC
- ldr r1, [r4]
- ldrh r0, [r1, 0x6]
- adds r0, 0x1
- strh r0, [r1, 0x6]
- b _081286BC
- .align 2, 0
-_081286A8: .4byte gUnknown_203B0E0
-_081286AC:
- bl IsLinkTaskFinished
- lsls r0, 24
- cmp r0, 0
- beq _081286BC
- movs r0, 0x1
- bl sub_8129218
-_081286BC:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_8128640
-
- thumb_func_start sub_81286C4
-sub_81286C4: @ 81286C4
- push {r4,r5,lr}
- ldr r5, _081286D8 @ =gUnknown_203B0E0
- ldr r3, [r5]
- ldrh r0, [r3, 0x6]
- cmp r0, 0
- beq _081286DC
- cmp r0, 0x1
- beq _0812878A
- b _081287AC
- .align 2, 0
-_081286D8: .4byte gUnknown_203B0E0
-_081286DC:
- ldr r1, _081286F8 @ =gMain
- ldrh r2, [r1, 0x2E]
- movs r0, 0x8
- ands r0, r2
- cmp r0, 0
- beq _081286FC
- ldrb r0, [r3, 0x15]
- cmp r0, 0
- beq _081287AC
- movs r0, 0x4
- bl sub_8129218
- b _081287AC
- .align 2, 0
-_081286F8: .4byte gMain
-_081286FC:
- movs r0, 0x4
- ands r0, r2
- cmp r0, 0
- beq _0812870C
- movs r0, 0x2
- bl sub_8129218
- b _081287AC
-_0812870C:
- ldrh r1, [r1, 0x30]
- movs r0, 0x2
- ands r0, r1
- cmp r0, 0
- beq _08128738
- ldrb r0, [r3, 0x15]
- cmp r0, 0
- beq _08128730
- bl sub_81293AC
- movs r0, 0x8
- movs r1, 0
- bl sub_8129C34
- ldr r1, [r5]
- movs r0, 0x1
- strh r0, [r1, 0x6]
- b _081287AC
-_08128730:
- movs r0, 0x3
- bl sub_8129218
- b _081287AC
-_08128738:
- movs r4, 0x1
- adds r0, r4, 0
- ands r0, r2
- cmp r0, 0
- beq _08128754
- bl sub_81292D8
- movs r0, 0x8
- movs r1, 0
- bl sub_8129C34
- movs r0, 0x2
- movs r1, 0x1
- b _08128780
-_08128754:
- movs r0, 0x80
- lsls r0, 1
- ands r0, r2
- cmp r0, 0
- beq _08128774
- ldrb r0, [r3, 0x10]
- cmp r0, 0x3
- beq _0812876C
- bl sub_81293D8
- movs r0, 0x8
- b _0812877E
-_0812876C:
- movs r0, 0x5
- bl sub_8129218
- b _081287AC
-_08128774:
- bl sub_8129228
- cmp r0, 0
- beq _081287AC
- movs r0, 0x1
-_0812877E:
- movs r1, 0
-_08128780:
- bl sub_8129C34
- ldr r0, [r5]
- strh r4, [r0, 0x6]
- b _081287AC
-_0812878A:
- movs r0, 0
- bl sub_8129C8C
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- movs r0, 0x1
- bl sub_8129C8C
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r4, 0
- bne _081287AC
- cmp r1, 0
- bne _081287AC
- ldr r0, [r5]
- strh r1, [r0, 0x6]
-_081287AC:
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end sub_81286C4
-
- thumb_func_start sub_81287B4
-sub_81287B4: @ 81287B4
- push {r4-r6,lr}
- ldr r0, _081287CC @ =gUnknown_203B0E0
- ldr r0, [r0]
- ldrh r0, [r0, 0x6]
- cmp r0, 0x4
- bls _081287C2
- b _081288CE
-_081287C2:
- lsls r0, 2
- ldr r1, _081287D0 @ =_081287D4
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_081287CC: .4byte gUnknown_203B0E0
-_081287D0: .4byte _081287D4
- .align 2, 0
-_081287D4:
- .4byte _081287E8
- .4byte _081287F2
- .4byte _08128810
- .4byte _0812889C
- .4byte _081288B0
-_081287E8:
- movs r0, 0x3
- movs r1, 0
- bl sub_8129C34
- b _081287FE
-_081287F2:
- movs r0, 0
- bl sub_8129C8C
- lsls r0, 24
- cmp r0, 0
- bne _081288CE
-_081287FE:
- ldr r0, _0812880C @ =gUnknown_203B0E0
- ldr r1, [r0]
- ldrh r0, [r1, 0x6]
- adds r0, 0x1
- strh r0, [r1, 0x6]
- b _081288CE
- .align 2, 0
-_0812880C: .4byte gUnknown_203B0E0
-_08128810:
- bl Menu_ProcessInput
- lsls r0, 24
- asrs r0, 8
- lsrs r6, r0, 16
- asrs r4, r0, 16
- movs r0, 0x2
- negs r0, r0
- cmp r4, r0
- beq _08128848
- adds r0, 0x1
- cmp r4, r0
- beq _08128868
- movs r0, 0x4
- movs r1, 0
- bl sub_8129C34
- ldr r5, _08128844 @ =gUnknown_203B0E0
- ldr r2, [r5]
- ldrb r0, [r2, 0x10]
- cmp r0, r4
- beq _08128870
- cmp r4, 0x3
- ble _08128880
- b _08128870
- .align 2, 0
-_08128844: .4byte gUnknown_203B0E0
-_08128848:
- ldr r0, _08128864 @ =gMain
- ldrh r1, [r0, 0x2E]
- movs r0, 0x4
- ands r0, r1
- cmp r0, 0
- beq _081288CE
- movs r0, 0x5
- bl PlaySE
- movs r0, 0x1
- bl Menu_MoveCursor
- b _081288CE
- .align 2, 0
-_08128864: .4byte gMain
-_08128868:
- movs r0, 0x4
- movs r1, 0
- bl sub_8129C34
-_08128870:
- ldr r0, _0812887C @ =gUnknown_203B0E0
- ldr r1, [r0]
- movs r0, 0x3
- strh r0, [r1, 0x6]
- b _081288CE
- .align 2, 0
-_0812887C: .4byte gUnknown_203B0E0
-_08128880:
- movs r1, 0
- strb r1, [r2, 0x11]
- ldr r0, [r5]
- strb r1, [r0, 0x12]
- movs r0, 0x5
- movs r1, 0x1
- bl sub_8129C34
- ldr r0, [r5]
- strb r6, [r0, 0x10]
- ldr r1, [r5]
- movs r0, 0x4
- strh r0, [r1, 0x6]
- b _081288CE
-_0812889C:
- movs r0, 0
- bl sub_8129C8C
- lsls r0, 24
- cmp r0, 0
- bne _081288CE
- movs r0, 0x1
- bl sub_8129218
- b _081288CE
-_081288B0:
- movs r0, 0
- bl sub_8129C8C
- lsls r0, 24
- cmp r0, 0
- bne _081288CE
- movs r0, 0x1
- bl sub_8129C8C
- lsls r0, 24
- cmp r0, 0
- bne _081288CE
- movs r0, 0x1
- bl sub_8129218
-_081288CE:
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end sub_81287B4
-
thumb_func_start sub_81288D4
sub_81288D4: @ 81288D4
push {r4,lr}
diff --git a/data/union_room_chat.s b/data/union_room_chat.s
index b61c5f44d..84f9d9c39 100644
--- a/data/union_room_chat.s
+++ b/data/union_room_chat.s
@@ -6,18 +6,6 @@
.section .rodata
.align 2
-gUnknown_845A880:: @ 845A880
- .4byte sub_8128640
- .4byte sub_81286C4
- .4byte sub_81287B4
- .4byte sub_81288D4
- .4byte sub_8128DA4
- .4byte sub_8128E78
- .4byte sub_8128AA0
- .4byte sub_8128C04
- .4byte sub_8128CA8
- .4byte sub_8128FB8
-
gUnknown_845A8A8:: @ 845A8A8
.byte 0x09, 0x09, 0x09, 0x09
diff --git a/include/global.h b/include/global.h
index 180a1e0a3..686ecb11c 100644
--- a/include/global.h
+++ b/include/global.h
@@ -718,6 +718,8 @@ struct TrainerNameRecord
u8 trainerName[PLAYER_NAME_LENGTH];
};
+#define UNION_ROOM_KB_ROW_COUNT 10
+
struct SaveBlock1
{
/*0x0000*/ struct Coords16 pos;
@@ -772,7 +774,8 @@ struct SaveBlock1
/*0x3A18*/ u8 seen2[DEX_FLAGS_NO];
/*0x3A4C*/ u8 rivalName[PLAYER_NAME_LENGTH];
/*0x3A54*/ struct FameCheckerSaveData fameChecker[NUM_FAMECHECKER_PERSONS];
- /*0x3A94*/ u8 filler3A94[0x114];
+ /*0x3A94*/ u8 filler3A94[0x40];
+ /*0x3AD4*/ u8 unk3AD4[UNION_ROOM_KB_ROW_COUNT][21];
/*0x3BA8*/ struct TrainerNameRecord trainerNameRecords[20];
/*0x3C98*/ struct DaycareMon route5DayCareMon;
/*0x3D24*/ u8 filler3D24[0x10];
diff --git a/include/help_system.h b/include/help_system.h
index 273b5e119..59adec912 100644
--- a/include/help_system.h
+++ b/include/help_system.h
@@ -92,5 +92,6 @@ bool8 MoveCursor(u8 by, u8 dirn);
void HelpSystem_BackupSomeVariable(void);
void HelpSystem_RestoreSomeVariable(void);
void HelpSystemRenderText(u8 font, u8 * dest, const u8 * src, u8 x, u8 y, u8 width, u8 height);
+void sub_812B4AC(void);
#endif //GUARD_HELP_SYSTEM_H
diff --git a/include/link_rfu.h b/include/link_rfu.h
index 790429870..2e502165a 100644
--- a/include/link_rfu.h
+++ b/include/link_rfu.h
@@ -325,6 +325,7 @@ void sub_80FC114(const u8 *name, struct GFtgtGname *structPtr, u8 a2);
bool32 PlayerHasMetTrainerBefore(u16 id, u8 *name);
bool8 sub_80FCC3C(struct GFtgtGname *gname, u8 *uname, u8 idx);
bool8 sub_80FCCF4(struct GFtgtGname *gname, u8 *uname, u8 idx);
+bool32 sub_80FBA1C(void);
#include "mevent_server.h"
extern const struct mevent_server_cmd gMEventSrvScript_OtherTrainerCanceled[];
diff --git a/include/main.h b/include/main.h
index c962cf7bd..f89ffbd63 100644
--- a/include/main.h
+++ b/include/main.h
@@ -73,5 +73,6 @@ extern const char RomHeaderGameCode[4];
extern const char RomHeaderSoftwareVersion;
extern u8 gLinkTransferringData;
+extern u16 gKeyRepeatStartDelay;
#endif // GUARD_MAIN_H
diff --git a/ld_script.txt b/ld_script.txt
index f0792ad9d..c21f61f53 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -246,6 +246,7 @@ SECTIONS {
src/union_room_battle.o(.text);
asm/pokemon_special_anim.o(.text);
src/party_menu.o(.text);
+ src/union_room_chat.o(.text);
asm/union_room_chat.o(.text);
src/help_system_812B1E0.o(.text);
src/quest_log_battle.o(.text);
@@ -534,6 +535,7 @@ SECTIONS {
src/union_room_message.o(.rodata);
data/pokemon_special_anim.o(.rodata);
src/party_menu.o(.rodata);
+ src/union_room_chat.o(.rodata);
data/union_room_chat.o(.rodata);
src/help_system_812B1E0.o(.rodata);
src/fame_checker.o(.rodata);
diff --git a/src/union_room_chat.c b/src/union_room_chat.c
new file mode 100644
index 000000000..813d20e5f
--- /dev/null
+++ b/src/union_room_chat.c
@@ -0,0 +1,352 @@
+#include "global.h"
+#include "gflib.h"
+#include "help_system.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "list_menu.h"
+#include "menu.h"
+#include "quest_log.h"
+#include "scanline_effect.h"
+#include "task.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_8128DA4(void);
+void sub_8128E78(void);
+void sub_8128AA0(void);
+void sub_8128C04(void);
+void sub_8128CA8(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);
+void sub_8129560(u8 *ptr);
+void sub_8129568(u8 *ptr);
+void sub_81298F8(u8 taskId);
+void sub_8129B14(void);
+bool32 sub_8129B78(void);
+void sub_8129BFC(void);
+void sub_8129C34(u16 a0, u8 a1);
+u8 sub_8129C8C(u8 a0);
+
+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
+};
+
+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 (gMain.newKeys & 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;
+ }
+}