summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/event_object_lock.c2
-rw-r--r--src/union_room.c1476
2 files changed, 1420 insertions, 58 deletions
diff --git a/src/event_object_lock.c b/src/event_object_lock.c
index ea4fa00b9..e91642aa2 100644
--- a/src/event_object_lock.c
+++ b/src/event_object_lock.c
@@ -9,7 +9,7 @@
bool8 walkrun_is_standing_still(void)
{
- if (gPlayerAvatar.running1 == 1)
+ if (gPlayerAvatar.tileTransitionState == 1)
return FALSE;
else
return TRUE;
diff --git a/src/union_room.c b/src/union_room.c
index babacd299..dc1c2a3fa 100644
--- a/src/union_room.c
+++ b/src/union_room.c
@@ -6,9 +6,13 @@
#include "data.h"
#include "decompress.h"
#include "dodrio_berry_picking.h"
+#include "dynamic_placeholder_text_util.h"
+#include "easy_chat.h"
#include "event_data.h"
+#include "event_object_lock.h"
#include "field_control_avatar.h"
#include "field_fadetransition.h"
+#include "field_player_avatar.h"
#include "field_weather.h"
#include "link.h"
#include "link_rfu.h"
@@ -21,6 +25,8 @@
#include "overworld.h"
#include "party_menu.h"
#include "pokemon_jump.h"
+#include "quest_log.h"
+#include "random.h"
#include "save_location.h"
#include "script.h"
#include "script_pokemon_util.h"
@@ -38,6 +44,7 @@
#include "constants/field_weather.h"
#include "constants/species.h"
+EWRAM_DATA u8 sUnionRoomPlayerName[12] = {};
EWRAM_DATA union UnkUnion_Main gUnknown_203B05C = {};
EWRAM_DATA u8 gUnknown_203B058 = 0;
EWRAM_DATA u8 gUnknown_203B059 = 0;
@@ -66,46 +73,50 @@ void sub_81186E0(u8 taskId);
u16 ReadAsU16(const u8 *data);
void sub_8119904(struct UnkStruct_URoom * uRoom);
bool32 sub_8119944(struct UnkStruct_URoom * uRoom);
+void sub_81199FC(u8 taskId);
u8 sub_8119B94(void);
-u8 sub_8119E84(struct UnkStruct_Main4 *arg0, struct UnkStruct_Main4 *arg1, u32 arg2);
-bool32 sub_8119FB0(struct GFtgtGname *arg0, s16 arg1);
-u8 sub_811A054(struct UnkStruct_Main4 *arg0, u32 arg1);
-u8 sub_811A084(struct UnkStruct_Main4 *arg0, u32 arg1);
-void sub_811A0B4(const u8 * str);
-void sub_811A0E0(void);
+u8 sub_8119E84(struct UnkStruct_Main4 * arg0, struct UnkStruct_Main4 * arg1, u32 arg2);
+bool32 sub_8119FB0(struct GFtgtGname * arg0, s16 arg1);
+u8 sub_811A054(struct UnkStruct_Main4 * arg0, u32 arg1);
+u8 sub_811A084(struct UnkStruct_Main4 * arg0, u32 arg1);
+bool32 sub_811A0B4(const u8 * str);
+bool32 sub_811A0E0(void);
bool8 PrintOnTextbox(u8 *textState, const u8 *str);
s8 sub_811A14C(u8 *dest, bool32 arg1);
-s32 sub_811A218(u8 *arg0, u8 *arg1, u8 *arg2, const struct WindowTemplate *winTemplate, const struct ListMenuTemplate *menuTemplate);
-s32 sub_811A2EC(u8 *arg0, u8 *arg1, u8 *arg2, u8 *arg3, const struct WindowTemplate *winTemplate, const struct ListMenuTemplate *menuTemplate, struct UnkStruct_Main0 *arg6);
+s32 sub_811A218(u8 *arg0, u8 *arg1, u8 *arg2, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate);
+s32 sub_811A2EC(u8 *arg0, u8 *arg1, u8 *arg2, u8 *arg3, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate, struct UnkStruct_Main0 * arg6);
void sub_811A3F8(void);
void sub_811A41C(void);
void sub_811A444(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx);
-void sub_811A5E4(struct UnkStruct_x20 *arg0, u8 count);
-void sub_811A650(struct UnkStruct_Main4 *arg0, u8 count);
-bool32 sub_811A6DC(struct UnkStruct_Shared *arg0, struct UnkStruct_Shared *arg1);
-u32 sub_811A748(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1);
-u8 sub_811A798(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1, u8 arg2);
-void sub_811A81C(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 *arg3, u8 arg4, u8 id);
-void sub_811A910(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 *arg3, u8 arg4, u8 id);
+void sub_811A5E4(struct UnkStruct_x20 * arg0, u8 count);
+void sub_811A650(struct UnkStruct_Main4 * arg0, u8 count);
+bool8 sub_811A694(struct UnkStruct_Shared * arg0, const struct UnkStruct_Shared * arg1);
+bool32 sub_811A6DC(struct UnkStruct_Shared * arg0, struct UnkStruct_Shared * arg1);
+u32 sub_811A748(struct UnkStruct_x20 * arg0, struct UnkStruct_x1C * arg1);
+u8 sub_811A798(struct UnkStruct_x20 * arg0, struct UnkStruct_x1C * arg1, u8 arg2);
+void sub_811A81C(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 * arg3, u8 arg4, u8 id);
+void sub_811A910(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 * arg3, u8 arg4, u8 id);
bool32 sub_811A9B8(void);
-u32 sub_811A9FC(u32 a0);
+u32 sub_811A9FC(s32 a0);
u32 sub_811AA24(struct UnkStruct_x20 * unkX20);
s32 sub_811AA5C(struct UnkStruct_Main0 * arg0, u8 arg1, u8 arg2, u32 playerGender);
-u32 sub_811ADC4(s16 a0, struct UnkStruct_Main0 * a1);
+s32 sub_811AD7C(struct UnkStruct_x20 * arg, s32 arg1);
+s32 sub_811ADC4(s32 a0, struct UnkStruct_Main0 * a1);
s32 sub_811ADD0(u32 type, u32 species);
void sub_811AE68(u8 *dst, s32 arg1, u32 playerGender);
void sub_811AECC(u8 *dst, u8 arg1);
-bool32 sub_811B0A4(struct UnkStruct_URoom *arg0);
+s32 sub_811AF6C(u8 *dst, u32 gender, u16 *arg2, struct UnkStruct_URoom * arg3);
+bool32 sub_811B0A4(struct UnkStruct_URoom * arg0);
bool32 HasAtLeastTwoMonsOfLevel30OrLower(void);
-void ResetUnionRoomTrade(struct UnionRoomTrade *trade);
-bool32 RegisterTradeMonAndGetIsEgg(u32 monId, struct UnionRoomTrade *trade);
-void RegisterTradeMon(u32 monId, struct UnionRoomTrade *trade);
-u32 sub_811B1EC(struct UnionRoomTrade *trade, u8 mpId);
+void ResetUnionRoomTrade(struct UnionRoomTrade * trade);
+bool32 RegisterTradeMonAndGetIsEgg(u32 monId, struct UnionRoomTrade * trade);
+void RegisterTradeMon(u32 monId, struct UnionRoomTrade * trade);
+u32 GetPartyPositionOfRegisteredMon(struct UnionRoomTrade * trade, u8 mpId);
void sub_811B258(bool32 a0);
void sub_811B298(void);
u8 sub_811B2A8(s32 a0);
-u8 sub_811B2D8(struct UnkStruct_URoom *arg0);
-void sub_811B31C(u8 *dest, struct UnkStruct_URoom *uRoom, bool8 gender);
+u8 sub_811B2D8(struct UnkStruct_URoom * arg0);
+void sub_811B31C(u8 *dest, struct UnkStruct_URoom * uRoom, bool8 gender);
u8 sub_811B754(struct UnkStruct_8019BA8 * ptr);
void sub_811BA78(void);
@@ -124,11 +135,13 @@ extern const struct WindowTemplate gUnknown_8456E34;
extern const struct ListMenuTemplate gUnknown_8456E54;
extern const struct WindowTemplate gUnknown_8456E6C;
extern const struct ListMenuTemplate gUnknown_8456F04;
+extern const struct WindowTemplate gUnknown_8456F1C;
extern const struct WindowTemplate gUnknown_8456F24;
extern const struct ListMenuTemplate gUnknown_8456F7C;
extern const struct UnkStruct_Shared gUnknown_8457034;
extern const u8 *const gUnknown_8457094[13];
extern const u8 gUnknown_84570C8[];
+extern const u8 gUnknown_84571B0[];
extern const u8 gUnknown_84571B4[];
extern const u8 gUnknown_84571B8[];
extern const u8 gUnknown_84571E0[];
@@ -159,17 +172,31 @@ extern const u8 *const gUnknown_8457A34[];
extern const u8 *const gUnknown_8457B04[][2];
extern const u8 *const gUnknown_8457BCC[];
extern const u8 *const gUnknown_8457C20[];
+extern const u8 gUnknown_8457C48[];
+extern const u8 gUnknown_8457CA4[];
+extern const u8 gUnknown_8457CF8[];
+extern const u8 gUnknown_8457D44[];
+extern const u8 gUnknown_8457DB8[];
+extern const u8 gUnknown_8457E0C[];
extern const u8 gUnknown_8457E28[];
extern const u8 gUnknown_8457E44[];
extern const u8 gUnknown_8457E60[];
+extern const u8 *const gUnknown_8457F80[][2];
extern const u8 gUnknown_8457F90[];
extern const u8 *const gUnknown_84580F4[][4];
+extern const u8 *const gUnknown_8458230[][2][3];
+extern const u8 *const gUnknown_8458314[];
+extern const u8 *const gUnknown_84583B4[];
extern const u8 *const gUnknown_845842C[];
extern const u8 gUnknown_8458434[];
extern const u8 gUnknown_845847C[];
extern const u8 gUnknown_84584C0[];
extern const u8 *const gUnknown_8458548[];
extern const u8 *const gUnknown_84585E8[];
+extern const u8 *const gUnknown_8458758[2][4];
+extern const u8 *const gUnknown_84588BC[2][4];
+extern const u8 *const gUnknown_84589AC[2][2];
+extern const u8 *const gUnknown_8458A78[2][4];
extern const u8 gUnknown_8458A98[];
extern const u8 gUnknown_8458AB8[];
extern const u8 gUnknown_8458B44[];
@@ -184,6 +211,8 @@ extern const u8 gUnknown_8458E10[];
extern const u8 gUnknown_8458E70[];
extern const u8 gUnknown_8458ED0[];
extern const u8 gUnknown_8458F04[];
+extern const u8 gUnknown_8458F9C[];
+extern const u8 gUnknown_8458FBC[];
extern const u8 gUnknown_8458FC8[];
extern const u8 gUnknown_8458FE4[];
extern const u8 gUnknown_84591DC[];
@@ -192,6 +221,12 @@ extern const u8 gUnknown_8459238[];
extern const u8 gUnknown_8459250[];
extern const u8 gUnknown_845928C[];
extern const u8 *const gUnknown_845933C[];
+extern const u8 gUnknown_8459378[];
+extern const u8 *const gUnknown_84594B0[];
+extern const u8 gUnknown_84594C4[];
+extern const u8 gUnknown_8459504[];
+extern const u8 *const gUnknown_8459580[];
+extern const u8 gUnknown_8459588[];
// These are functions in Emmerald but inlined in FireRed
@@ -206,10 +241,15 @@ extern const u8 *const gUnknown_845933C[];
})
#define CopyTrainerCardData(dest, src, _version) ({ \
- (dest) = *((struct TrainerCard *)(src)); \
+ (dest) = *((struct TrainerCard * )(src)); \
(dest).version = _version; \
})
+#define GetStringRightAlignXOffset(_fontId, _string, _maxWidth) ({ \
+ u16 strWidth = GetStringWidth(_fontId, _string, 0); \
+ _maxWidth - strWidth; \
+})
+
void sub_811586C(u8 windowId, u8 arg1, u8 stringId)
{
FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
@@ -260,7 +300,7 @@ void sub_811599C(u8 *dst, u8 caseId)
void TryBecomeLinkLeader(void)
{
u8 taskId;
- struct UnkStruct_Leader *dataPtr;
+ struct UnkStruct_Leader * dataPtr;
taskId = CreateTask(sub_8115A68, 0);
gUnknown_203B05C.leader = dataPtr = (void*)(gTasks[taskId].data);
@@ -274,7 +314,7 @@ void TryBecomeLinkLeader(void)
void sub_8115A68(u8 taskId)
{
u32 id, val;
- struct UnkStruct_Leader *data = gUnknown_203B05C.leader;
+ struct UnkStruct_Leader * data = gUnknown_203B05C.leader;
switch (data->state)
{
@@ -570,7 +610,7 @@ void sub_8115A68(u8 taskId)
}
}
-void sub_81161E4(struct UnkStruct_Leader *data)
+void sub_81161E4(struct UnkStruct_Leader * data)
{
ClearWindowTilemap(data->field_11);
ClearStdWindowAndFrame(data->field_11, FALSE);
@@ -665,7 +705,7 @@ void sub_81163B0(u8 *dst, u8 caseId)
}
}
-bool8 sub_8116444(struct UnkStruct_Leader *data, u32 arg1, u32 arg2)
+bool8 sub_8116444(struct UnkStruct_Leader * data, u32 arg1, u32 arg2)
{
switch (sub_8116524(data->field_0))
{
@@ -688,7 +728,7 @@ bool8 sub_8116444(struct UnkStruct_Leader *data, u32 arg1, u32 arg2)
void sub_81164C8(u8 arg0, s32 id, u8 arg2)
{
- struct UnkStruct_Leader *data = gUnknown_203B05C.leader;
+ struct UnkStruct_Leader * data = gUnknown_203B05C.leader;
u8 var = 0;
switch (data->field_0->arr[id].field_1A_0)
@@ -705,9 +745,9 @@ void sub_81164C8(u8 arg0, s32 id, u8 arg2)
sub_811A910(arg0, 0, arg2, &data->field_0->arr[id], var, id);
}
-u8 sub_8116524(struct UnkStruct_Main0 *arg0)
+u8 sub_8116524(struct UnkStruct_Main0 * arg0)
{
- struct UnkStruct_Leader *data = gUnknown_203B05C.leader;
+ struct UnkStruct_Leader * data = gUnknown_203B05C.leader;
u8 ret = 0;
u8 i;
s32 id;
@@ -746,9 +786,9 @@ u8 sub_8116524(struct UnkStruct_Main0 *arg0)
return ret;
}
-u8 sub_81165E8(struct UnkStruct_Main0 *arg0)
+u8 sub_81165E8(struct UnkStruct_Main0 * arg0)
{
- struct UnkStruct_Leader *data = gUnknown_203B05C.leader;
+ struct UnkStruct_Leader * data = gUnknown_203B05C.leader;
u8 copiedCount;
s32 i;
u8 ret;
@@ -793,7 +833,7 @@ u8 sub_81165E8(struct UnkStruct_Main0 *arg0)
void TryJoinLinkGroup(void)
{
u8 taskId;
- struct UnkStruct_Group *dataPtr;
+ struct UnkStruct_Group * dataPtr;
taskId = CreateTask(sub_8116738, 0);
gUnknown_203B05C.group = dataPtr = (void*)(gTasks[taskId].data);
@@ -807,7 +847,7 @@ void TryJoinLinkGroup(void)
void sub_8116738(u8 taskId)
{
s32 id;
- struct UnkStruct_Group *data = gUnknown_203B05C.group;
+ struct UnkStruct_Group * data = gUnknown_203B05C.group;
switch (data->state)
{
@@ -1047,9 +1087,9 @@ void sub_8116738(u8 taskId)
}
}
-u32 sub_8116D10(struct UnkStruct_Group *arg0, s32 id)
+u32 sub_8116D10(struct UnkStruct_Group * arg0, s32 id)
{
- struct UnkStruct_x20 *structPtr = &arg0->field_0->arr[id];
+ struct UnkStruct_x20 * structPtr = &arg0->field_0->arr[id];
if (gUnknown_203B058 == 4 && structPtr->unk.field_0.unk_00.unk_01_2 != VERSION_FIRE_RED && structPtr->unk.field_0.unk_00.unk_01_2 != VERSION_LEAF_GREEN)
{
@@ -1066,7 +1106,7 @@ u32 sub_8116D10(struct UnkStruct_Group *arg0, s32 id)
return 2;
}
-void sub_8116D60(struct UnkStruct_Group *data, s32 id)
+void sub_8116D60(struct UnkStruct_Group * data, s32 id)
{
data->field_F = id;
LoadWirelessStatusIndicatorSpriteGfx();
@@ -1080,7 +1120,7 @@ void sub_8116D60(struct UnkStruct_Group *data, s32 id)
u8 sub_8116DE0(void)
{
u8 taskId;
- struct UnkStruct_Group *dataPtr;
+ struct UnkStruct_Group * dataPtr;
taskId = CreateTask(sub_8116E1C, 0);
gUnknown_203B05C.group = dataPtr = (void*)(gTasks[taskId].data);
@@ -1095,7 +1135,7 @@ u8 sub_8116DE0(void)
void sub_8116E1C(u8 taskId)
{
- struct UnkStruct_Group *data = gUnknown_203B05C.group;
+ struct UnkStruct_Group * data = gUnknown_203B05C.group;
switch (data->state)
{
@@ -1156,7 +1196,7 @@ bool32 sub_8116F28(u32 arg0, u32 id)
return FALSE;
}
-u8 sub_8116F5C(struct UnkStruct_Group *data, u32 id)
+u8 sub_8116F5C(struct UnkStruct_Group * data, u32 id)
{
if (data->field_0->arr[id].field_1A_0 == 1)
{
@@ -1173,7 +1213,7 @@ u8 sub_8116F5C(struct UnkStruct_Group *data, u32 id)
void sub_8116F94(u8 arg0, s32 id, u8 arg2)
{
- struct UnkStruct_Group *data = gUnknown_203B05C.group;
+ struct UnkStruct_Group * data = gUnknown_203B05C.group;
u8 var = sub_8116F5C(data, id);
sub_811A81C(arg0, 8, arg2, &data->field_0->arr[id], var, id);
@@ -1181,7 +1221,7 @@ void sub_8116F94(u8 arg0, s32 id, u8 arg2)
u8 sub_8116FE4(void)
{
- struct UnkStruct_Group *data = gUnknown_203B05C.group;
+ struct UnkStruct_Group * data = gUnknown_203B05C.group;
u8 ret = 0;
u8 i;
s32 id;
@@ -1259,7 +1299,7 @@ u8 sub_8117118(void)
void sub_8117130(u8 taskId)
{
- u32 monId = sub_811B1EC(&sUnionRoomTrade, GetMultiplayerId());
+ u32 monId = GetPartyPositionOfRegisteredMon(&sUnionRoomTrade, GetMultiplayerId());
switch (gTasks[taskId].data[0])
{
@@ -1409,7 +1449,7 @@ void sub_8117534(void)
void sub_8117594(void *arg0, bool32 arg1)
{
- TrainerCard_GenerateCardForLinkPlayer((struct TrainerCard *)arg0);
+ TrainerCard_GenerateCardForLinkPlayer((struct TrainerCard * )arg0);
if (arg1)
*((u16 *)(arg0 + sizeof(struct TrainerCard))) = GetWonderCardFlagID();
else
@@ -1560,7 +1600,7 @@ void sub_81179A4(void)
void MEvent_CreateTask_Leader(u32 arg0)
{
u8 taskId;
- struct UnkStruct_Leader *dataPtr;
+ struct UnkStruct_Leader * dataPtr;
taskId = CreateTask(sub_8117A0C, 0);
gUnknown_203B05C.leader = dataPtr = (void*)(gTasks[taskId].data);
@@ -1573,7 +1613,7 @@ void MEvent_CreateTask_Leader(u32 arg0)
void sub_8117A0C(u8 taskId)
{
- struct UnkStruct_Leader *data = gUnknown_203B05C.leader;
+ struct UnkStruct_Leader * data = gUnknown_203B05C.leader;
struct WindowTemplate winTemplate;
s32 val;
@@ -1767,7 +1807,7 @@ void sub_8117A0C(u8 taskId)
void MEvent_CreateTask_CardOrNewsWithFriend(u32 arg0)
{
u8 taskId;
- struct UnkStruct_Group *dataPtr;
+ struct UnkStruct_Group * dataPtr;
taskId = CreateTask(sub_8117F20, 0);
gUnknown_203B05C.group = dataPtr = (void*)(gTasks[taskId].data);
@@ -1783,7 +1823,7 @@ void sub_8117F20(u8 taskId)
{
s32 id;
struct WindowTemplate winTemplate1, winTemplate2;
- struct UnkStruct_Group *data = gUnknown_203B05C.group;
+ struct UnkStruct_Group * data = gUnknown_203B05C.group;
switch (data->state)
{
@@ -1933,7 +1973,7 @@ void sub_8117F20(u8 taskId)
void MEvent_CreateTask_CardOrNewsOverWireless(u32 arg0)
{
u8 taskId;
- struct UnkStruct_Group *dataPtr;
+ struct UnkStruct_Group * dataPtr;
taskId = CreateTask(sub_81182DC, 0);
gUnknown_203B05C.group = dataPtr = (void*)(gTasks[taskId].data);
@@ -1949,7 +1989,7 @@ void sub_81182DC(u8 taskId)
{
s32 id;
struct WindowTemplate winTemplate;
- struct UnkStruct_Group *data = gUnknown_203B05C.group;
+ struct UnkStruct_Group * data = gUnknown_203B05C.group;
switch (data->state)
{
@@ -2111,7 +2151,7 @@ void sub_81182DC(u8 taskId)
void UnionRoomSpecial(void)
{
- struct UnkStruct_URoom *dataPtr;
+ struct UnkStruct_URoom * dataPtr;
ClearAndInitHostRFUtgtGname();
CreateTask(sub_81186E0, 10);
@@ -2139,7 +2179,7 @@ u16 ReadAsU16(const u8 *ptr)
void sub_8118664(u32 nextState, const u8 *src)
{
- struct UnkStruct_URoom *data = gUnknown_203B05C.uRoom;
+ struct UnkStruct_URoom * data = gUnknown_203B05C.uRoom;
data->state = 8;
data->stateAfterPrint = nextState;
@@ -2149,19 +2189,19 @@ void sub_8118664(u32 nextState, const u8 *src)
void sub_811868C(const u8 *src)
{
- struct UnkStruct_URoom *data = gUnknown_203B05C.uRoom;
+ struct UnkStruct_URoom * data = gUnknown_203B05C.uRoom;
data->state = 26;
if (src != gStringVar4)
StringExpandPlaceholders(gStringVar4, src);
}
-void sub_81186B0(struct UnkStruct_URoom *data)
+void sub_81186B0(struct UnkStruct_URoom * data)
{
memcpy(&gDecompressionBuffer[0x3F00], data->field_0, sizeof(*data->field_0));
}
-void sub_81186C8(struct UnkStruct_URoom *data)
+void sub_81186C8(struct UnkStruct_URoom * data)
{
memcpy(data->field_0, &gDecompressionBuffer[0x3F00], sizeof(*data->field_0));
}
@@ -2915,3 +2955,1325 @@ void sub_81186E0(u8 taskId)
break;
}
}
+
+void var_800D_set_xB(void)
+{
+ if (InUnionRoom() == TRUE)
+ gSpecialVar_Result = 11;
+}
+
+void sub_8119904(struct UnkStruct_URoom * arg0)
+{
+ if (gRecvCmds[1][1] != 0 && (gRecvCmds[1][0] & 0xFF00) == 0x2F00)
+ {
+ arg0->field_9A[0] = gRecvCmds[1][1];
+ if (gRecvCmds[1][1] == 0x44)
+ {
+ arg0->field_9A[1] = gRecvCmds[1][2];
+ arg0->field_9A[2] = gRecvCmds[1][3];
+ }
+ }
+}
+
+bool32 sub_8119944(struct UnkStruct_URoom * arg0)
+{
+ if (arg0->field_9A[0] != 0)
+ {
+ s32 var = sub_811AF6C(gStringVar4, gLinkPlayers[1].gender, &arg0->field_9A[0], arg0);
+ if (var == 0)
+ {
+ return TRUE;
+ }
+ else if (var == 1)
+ {
+ arg0->state = 35;
+ gUnknown_203B058 = arg0->field_9A[0];
+ return FALSE;
+ }
+ else if (var == 2)
+ {
+ arg0->state = 36;
+ sub_800AAC0();
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+void InitUnionRoom(void)
+{
+ struct UnkStruct_URoom * ptr;
+
+ sUnionRoomPlayerName[0] = EOS;
+ if (gQuestLogState == 2 || gQuestLogState == 3)
+ return;
+ CreateTask(sub_81199FC, 0);
+ gUnknown_203B05C.uRoom = gUnknown_203B05C.uRoom; // Needed to match.
+ gUnknown_203B05C.uRoom = ptr = AllocZeroed(sizeof(struct UnkStruct_URoom));
+ gUnknown_300202C = gUnknown_203B05C.uRoom;
+ ptr->state = 0;
+ ptr->textState = 0;
+ ptr->field_10 = 0;
+ ptr->field_12 = 0;
+ sUnionRoomPlayerName[0] = EOS;
+}
+
+void sub_81199FC(u8 taskId)
+{
+ s32 i;
+ u8 text[32];
+ struct UnkStruct_URoom * structPtr = gUnknown_203B05C.uRoom;
+
+ switch (structPtr->state)
+ {
+ case 0:
+ structPtr->state = 1;
+ break;
+ case 1:
+ sub_80FAF58(0xC, 0, 0);
+ sub_800B1F4();
+ OpenLink();
+ sub_80FBC00();
+ sub_80FB128(1);
+ structPtr->state = 2;
+ break;
+ case 2:
+ structPtr->field_4 = AllocZeroed(0x70);
+ sub_811A650(structPtr->field_4, 4);
+ structPtr->field_C = AllocZeroed(0x70);
+ sub_811A650(structPtr->field_C, 4);
+ structPtr->field_0 = AllocZeroed(0x100);
+ sub_811A5E4(structPtr->field_0->arr, 8);
+ structPtr->field_8 = AllocZeroed(0x20);
+ sub_811A5E4(&structPtr->field_8->arr[0], 1);
+ structPtr->field_20 = sub_8119E84(structPtr->field_C, structPtr->field_4, 10);
+ structPtr->state = 3;
+ break;
+ case 3:
+ switch (sub_8119B94())
+ {
+ case 1:
+ case 2:
+ if (sUnionRoomPlayerName[0] == EOS)
+ {
+ for (i = 0; i < PLAYER_NAME_LENGTH; i++)
+ {
+ if (structPtr->field_0->arr[i].field_1A_0 == 1)
+ {
+ sub_8018404_2(text, structPtr->field_0->arr[i]);
+ if (sub_80FD338(ReadAsU16(structPtr->field_0->arr[i].unk.field_0.unk_00.playerTrainerId), text))
+ {
+ StringCopy(sUnionRoomPlayerName, text);
+ break;
+ }
+ }
+ }
+ }
+ break;
+ case 3:
+ break;
+ }
+ break;
+ case 4:
+ Free(structPtr->field_8);
+ Free(structPtr->field_0);
+ Free(structPtr->field_C);
+ Free(structPtr->field_4);
+ DestroyTask(structPtr->field_20);
+ Free(gUnknown_203B05C.uRoom);
+ sub_80F8DC0();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+bool16 BufferUnionRoomPlayerName(void)
+{
+ if (sUnionRoomPlayerName[0] != EOS)
+ {
+ StringCopy(gStringVar1, sUnionRoomPlayerName);
+ sUnionRoomPlayerName[0] = EOS;
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+u8 sub_8119B94(void)
+{
+ s32 i;
+ u8 j;
+ struct UnkStruct_URoom * structPtr = gUnknown_203B05C.uRoom;
+ s32 r7 = 0;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (sub_811A694(&structPtr->field_C->arr[i].unk0, &gUnknown_8457034) == TRUE)
+ {
+ structPtr->field_8->arr[0].unk = structPtr->field_C->arr[i].unk0;
+ structPtr->field_8->arr[0].field_18 = 0;
+ structPtr->field_8->arr[0].field_1A_0 = 1;
+ structPtr->field_8->arr[0].field_1B = 1;
+ return 4;
+ }
+ }
+ for (j = 0; j < 8; j++)
+ {
+ if (structPtr->field_0->arr[j].field_1A_0 != 0)
+ {
+ i = sub_811A748(&structPtr->field_0->arr[j], &structPtr->field_4->arr[0]);
+ if (i != 0xFF)
+ {
+ if (structPtr->field_0->arr[j].field_1A_0 == 1)
+ {
+ if (sub_811A6DC(&structPtr->field_0->arr[j].unk, &structPtr->field_4->arr[i].unk0))
+ {
+ structPtr->field_0->arr[j].unk = structPtr->field_4->arr[i].unk0;
+ structPtr->field_0->arr[j].field_1B = 0x40;
+ r7 = 1;
+ }
+ else if (structPtr->field_0->arr[j].field_1B != 0)
+ {
+ structPtr->field_0->arr[j].field_1B--;
+ if (structPtr->field_0->arr[j].field_1B == 0)
+ r7 = 2;
+ }
+ }
+ else
+ {
+ structPtr->field_0->arr[j].field_1A_0 = 1;
+ structPtr->field_0->arr[j].field_1B = 0;
+ r7 = 2;
+ }
+ structPtr->field_0->arr[j].field_18 = 0;
+ }
+ else if (structPtr->field_0->arr[j].field_1A_0 != 2)
+ {
+ structPtr->field_0->arr[j].field_18++;
+ if (structPtr->field_0->arr[j].field_18 >= 600)
+ {
+ structPtr->field_0->arr[j].field_1A_0 = 2;
+ r7 = 2;
+ }
+ }
+ else if (structPtr->field_0->arr[j].field_1A_0 == 2)
+ {
+ structPtr->field_0->arr[j].field_18++;
+ if (structPtr->field_0->arr[j].field_18 >= 900)
+ {
+ sub_811A5E4(&structPtr->field_0->arr[j], 1);
+ }
+ }
+ }
+ }
+ for (i = 0; i < 4; i++)
+ {
+ if (sub_811A798(&structPtr->field_0->arr[0], &structPtr->field_4->arr[i], 8) != 0xFF)
+ r7 = 1;
+ }
+
+ return r7;
+}
+
+void sub_8119D34(u8 taskId)
+{
+ s32 i, j;
+ struct UnkStruct_Shared sp0;
+ struct UnkStruct_Main4 **ptr = (void*) gTasks[taskId].data;
+ bool8 r4;
+
+ for (i = 0; i < 4; i++)
+ {
+ r4 = sub_80FCC3C(&sp0.field_0, sp0.playerName, i);
+ if (!sub_8116F28(sp0.field_0.unk_0a_0, gTasks[taskId].data[4]))
+ {
+ sp0 = gUnknown_8457034;
+ }
+ if (sp0.field_0.unk_00.unk_00_0 == 1)
+ {
+ sp0 = gUnknown_8457034;
+ }
+ if (!r4)
+ {
+ for (j = 0; j < i; j++)
+ {
+ if (!sub_811A694(&ptr[1]->arr[j].unk0, &sp0))
+ {
+ sp0 = gUnknown_8457034;
+ }
+ }
+ ptr[1]->arr[i].unk0 = sp0;
+ ptr[1]->arr[i].unk18 = sub_811A694(&ptr[1]->arr[i].unk0, &gUnknown_8457034);
+ }
+ else
+ {
+ ptr[0]->arr[i].unk0 = sp0;
+ ptr[0]->arr[i].unk18 = sub_811A694(&ptr[0]->arr[i].unk0, &gUnknown_8457034);
+ }
+ }
+}
+
+u8 sub_8119E84(struct UnkStruct_Main4 * a0, struct UnkStruct_Main4 * a1, u32 a2)
+{
+ u8 taskId = CreateTask(sub_8119D34, 0);
+ struct UnkStruct_Main4 ** data = (void *)gTasks[taskId].data;
+ data[0] = a0;
+ data[1] = a1;
+ gTasks[taskId].data[4] = a2;
+ return taskId;
+}
+
+void sub_8119EB8(u8 taskId)
+{
+ s32 i, j;
+ struct UnkStruct_Main4 **ptr = (void*) gTasks[taskId].data;
+
+ for (i = 0; i < 4; i++)
+ {
+ sub_80FCC3C(&ptr[0]->arr[i].unk0.field_0, ptr[0]->arr[i].unk0.playerName, i);
+ if (!sub_8116F28(ptr[0]->arr[i].unk0.field_0.unk_0a_0, gTasks[taskId].data[2]))
+ {
+ ptr[0]->arr[i].unk0 = gUnknown_8457034;
+ }
+ for (j = 0; j < i; j++)
+ {
+ if (!sub_811A694(&ptr[0]->arr[j].unk0, &ptr[0]->arr[i].unk0))
+ {
+ ptr[0]->arr[i].unk0 = gUnknown_8457034;
+ }
+ }
+ ptr[0]->arr[i].unk18 = sub_811A694(&ptr[0]->arr[i].unk0, &gUnknown_8457034);
+ }
+}
+
+bool32 sub_8119FB0(struct GFtgtGname *arg0, s16 arg1)
+{
+ if (arg1 == 7)
+ {
+ if (!arg0->unk_00.unk_00_5)
+ {
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+ }
+ else if (arg1 == 8)
+ {
+ if (!arg0->unk_00.unk_00_4)
+ {
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+void sub_8119FD8(u8 taskId)
+{
+ s32 i;
+ struct UnkStruct_Main4 **ptr = (void*) gTasks[taskId].data;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (sub_80FCCF4(&ptr[0]->arr[i].unk0.field_0, ptr[0]->arr[i].unk0.playerName, i))
+ {
+ sub_8119FB0(&ptr[0]->arr[i].unk0.field_0, gTasks[taskId].data[2]);
+ }
+ ptr[0]->arr[i].unk18 = sub_811A694(&ptr[0]->arr[i].unk0, &gUnknown_8457034);
+ }
+}
+
+u8 sub_811A054(struct UnkStruct_Main4 * a0, u32 a1)
+{
+ u8 taskId = CreateTask(sub_8119EB8, 0);
+ struct UnkStruct_Main4 **ptr = (void*) gTasks[taskId].data;
+ ptr[0] = a0;
+ gTasks[taskId].data[2] = a1;
+ return taskId;
+}
+
+u8 sub_811A084(struct UnkStruct_Main4 * a0, u32 a1)
+{
+ u8 taskId = CreateTask(sub_8119FD8, 0);
+ struct UnkStruct_Main4 **ptr = (void*) gTasks[taskId].data;
+ ptr[0] = a0;
+ gTasks[taskId].data[2] = a1;
+ return taskId;
+}
+
+bool32 sub_811A0B4(const u8 *src)
+{
+ LoadStdWindowFrameGfx();
+ DrawDialogueFrame(0, 1);
+ StringExpandPlaceholders(gStringVar4, src);
+ AddTextPrinterWithCustomSpeedForMessage(FALSE, 1);
+ return FALSE;
+}
+
+bool32 sub_811A0E0(void)
+{
+ if (!RunTextPrinters_CheckPrinter0Active())
+ {
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+bool8 PrintOnTextbox(u8 *textState, const u8 *str)
+{
+ switch (*textState)
+ {
+ case 0:
+ LoadStdWindowFrameGfx();
+ DrawDialogueFrame(0, 1);
+ StringExpandPlaceholders(gStringVar4, str);
+ AddTextPrinterForMessage(TRUE);
+ (*textState)++;
+ break;
+ case 1:
+ if (!RunTextPrinters_CheckPrinter0Active())
+ {
+ *textState = 0;
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+s8 sub_811A14C(u8 *arg0, bool32 arg1)
+{
+ s8 r1;
+
+ switch (*arg0)
+ {
+ case 0:
+ if (arg1)
+ {
+ return -3;
+ }
+ DisplayYesNoMenuDefaultYes();
+ (*arg0)++;
+ break;
+ case 1:
+ if (arg1)
+ {
+ DestroyYesNoMenu();
+ *arg0 = 0;
+ return -3;
+ }
+ r1 = Menu_ProcessInputNoWrapClearOnChoose();
+ if (r1 == -1 || r1 == 0 || r1 == 1)
+ {
+ *arg0 = 0;
+ return r1;
+ }
+ break;
+ }
+ return -2;
+}
+
+u8 sub_811A1AC(const struct WindowTemplate * template)
+{
+ u8 windowId = AddWindow(template);
+ DrawStdWindowFrame(windowId, FALSE);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(15));
+ sub_811A444(windowId, 0, gUnknown_8459378, 8, 1, 6);
+ PutWindowTilemap(windowId);
+ CopyWindowToVram(windowId, 2);
+ return windowId;
+}
+
+void sub_811A1FC(u8 windowId)
+{
+ ClearStdWindowAndFrame(windowId, TRUE);
+ RemoveWindow(windowId);
+}
+
+s32 sub_811A218(u8 *arg0, u8 *arg1, u8 *arg2, const struct WindowTemplate *winTemplate, const struct ListMenuTemplate *menuTemplate)
+{
+ s32 r1, r8;
+
+ switch (*arg0)
+ {
+ case 0:
+ *arg1 = AddWindow(winTemplate);
+ DrawStdWindowFrame(*arg1, FALSE);
+ gMultiuseListMenuTemplate = *menuTemplate;
+ gMultiuseListMenuTemplate.windowId = *arg1;
+ *arg2 = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
+ CopyWindowToVram(*arg1, TRUE);
+ (*arg0)++;
+ break;
+ case 1:
+ r8 = ListMenu_ProcessInput(*arg2);
+ if (JOY_NEW(A_BUTTON))
+ {
+ DestroyListMenuTask(*arg2, NULL, NULL);
+ ClearStdWindowAndFrame(*arg1, TRUE);
+ RemoveWindow(*arg1);
+ *arg0 = 0;
+ return r8;
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ DestroyListMenuTask(*arg2, NULL, NULL);
+ ClearStdWindowAndFrame(*arg1, TRUE);
+ RemoveWindow(*arg1);
+ *arg0 = 0;
+ return -2;
+ }
+ break;
+ }
+
+ return -1;
+}
+
+s32 sub_811A2EC(u8 *arg0, u8 *arg1, u8 *arg2, u8 *arg3, const struct WindowTemplate *winTemplate, const struct ListMenuTemplate *menuTemplate, struct UnkStruct_Main0 *arg6)
+{
+ s32 input;
+ s32 r4;
+
+ switch (*arg0)
+ {
+ case 0:
+ *arg3 = sub_811A1AC(&gUnknown_8456F1C);
+ *arg1 = AddWindow(winTemplate);
+ DrawStdWindowFrame(*arg1, FALSE);
+ gMultiuseListMenuTemplate = *menuTemplate;
+ gMultiuseListMenuTemplate.windowId = *arg1;
+ *arg2 = ListMenuInit(&gMultiuseListMenuTemplate, 0, 1);
+ CopyWindowToVram(*arg1, TRUE);
+ (*arg0)++;
+ break;
+ case 1:
+ input = ListMenu_ProcessInput(*arg2);
+ if (JOY_NEW(A_BUTTON | B_BUTTON))
+ {
+ if (input == 8 || JOY_NEW(B_BUTTON))
+ {
+ DestroyListMenuTask(*arg2, NULL, NULL);
+ ClearStdWindowAndFrame(*arg1, TRUE);
+ RemoveWindow(*arg1);
+ sub_811A1FC(*arg3);
+ *arg0 = 0;
+ return -2;
+ }
+ else
+ {
+ r4 = sub_811AD7C(arg6->arr, input);
+ if (r4 >= 0)
+ {
+ DestroyListMenuTask(*arg2, NULL, NULL);
+ ClearStdWindowAndFrame(*arg1, TRUE);
+ RemoveWindow(*arg1);
+ sub_811A1FC(*arg3);
+ *arg0 = 0;
+ return r4;
+ }
+ else
+ {
+ PlaySE(SE_WALL_HIT);
+ }
+ }
+ }
+ break;
+ }
+
+ return -1;
+}
+
+void sub_811A3F8(void)
+{
+ FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 0);
+ CopyBgTilemapBufferToVram(0);
+}
+
+void sub_811A41C(void)
+{
+ FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 0);
+ CopyBgTilemapBufferToVram(0);
+ EnableBothScriptContexts();
+}
+
+void sub_811A444(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx)
+{
+ struct TextPrinterTemplate printerTemplate;
+
+ printerTemplate.currentChar = str;
+ printerTemplate.windowId = windowId;
+ printerTemplate.fontId = fontId;
+ printerTemplate.x = x;
+ printerTemplate.y = y;
+ printerTemplate.currentX = x;
+ printerTemplate.currentY = y;
+ printerTemplate.unk = 0;
+
+ gTextFlags.useAlternateDownArrow = FALSE;
+ switch (colorIdx)
+ {
+ case 0:
+ printerTemplate.letterSpacing = 0;
+ printerTemplate.lineSpacing = 0;
+ printerTemplate.fgColor = 2;
+ printerTemplate.bgColor = 1;
+ printerTemplate.shadowColor = 3;
+ break;
+ case 1:
+ printerTemplate.letterSpacing = 0;
+ printerTemplate.lineSpacing = 0;
+ printerTemplate.fgColor = 4;
+ printerTemplate.bgColor = 1;
+ printerTemplate.shadowColor = 5;
+ break;
+ case 2:
+ printerTemplate.letterSpacing = 0;
+ printerTemplate.lineSpacing = 0;
+ printerTemplate.fgColor = 6;
+ printerTemplate.bgColor = 1;
+ printerTemplate.shadowColor = 7;
+ break;
+ case 3:
+ printerTemplate.letterSpacing = 0;
+ printerTemplate.lineSpacing = 0;
+ printerTemplate.fgColor = 1;
+ printerTemplate.bgColor = 1;
+ printerTemplate.shadowColor = 3;
+ break;
+ case 4:
+ printerTemplate.letterSpacing = 0;
+ printerTemplate.lineSpacing = 0;
+ printerTemplate.fgColor = 1;
+ printerTemplate.bgColor = 2;
+ printerTemplate.shadowColor = 3;
+ break;
+ case 5:
+ printerTemplate.letterSpacing = 0;
+ printerTemplate.lineSpacing = 0;
+ printerTemplate.fgColor = 7;
+ printerTemplate.bgColor = 15;
+ printerTemplate.shadowColor = 9;
+ break;
+ case 6:
+ printerTemplate.letterSpacing = 0;
+ printerTemplate.lineSpacing = 0;
+ printerTemplate.fgColor = 14;
+ printerTemplate.bgColor = 15;
+ printerTemplate.shadowColor = 9;
+ break;
+ }
+
+ AddTextPrinter(&printerTemplate, 0xFF, NULL);
+}
+
+void sub_811A5E4(struct UnkStruct_x20 *arg0, u8 count)
+{
+ s32 i;
+
+ for (i = 0; i < count; i++)
+ {
+ arg0[i].unk = gUnknown_8457034;
+ arg0[i].field_18 = 0xFF;
+ arg0[i].field_1A_0 = 0;
+ arg0[i].field_1A_1 = 0;
+ arg0[i].field_1B = 0;
+ }
+}
+
+void sub_811A650(struct UnkStruct_Main4 *arg0, u8 count)
+{
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ arg0->arr[i].unk0 = gUnknown_8457034;
+ arg0->arr[i].unk18 = 0;
+ }
+}
+
+bool8 sub_811A694(struct UnkStruct_Shared* arg0, const struct UnkStruct_Shared* arg1)
+{
+ s32 i;
+
+ for (i = 0; i < 2; i++)
+ {
+ if (arg0->field_0.unk_00.playerTrainerId[i] != arg1->field_0.unk_00.playerTrainerId[i])
+ {
+ return TRUE;
+ }
+ }
+
+ for (i = 0; i < 8; i++)
+ {
+ if (arg0->playerName[i] != arg1->playerName[i])
+ {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+bool32 sub_811A6DC(struct UnkStruct_Shared *arg0, struct UnkStruct_Shared *arg1)
+{
+ s32 i;
+
+ if (arg0->field_0.unk_0a_0 != arg1->field_0.unk_0a_0)
+ {
+ return TRUE;
+ }
+
+ if (arg0->field_0.unk_0a_7 != arg1->field_0.unk_0a_7)
+ {
+ return TRUE;
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ if (arg0->field_0.unk_04[i] != arg1->field_0.unk_04[i])
+ {
+ return TRUE;
+ }
+ }
+
+ if (arg0->field_0.species != arg1->field_0.species)
+ {
+ return TRUE;
+ }
+
+ if (arg0->field_0.type != arg1->field_0.type)
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+u32 sub_811A748(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1)
+{
+ u8 result = 0xFF;
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (arg1[i].unk18 && !sub_811A694(&arg0->unk, &arg1[i].unk0))
+ {
+ result = i;
+ arg1[i].unk18 = FALSE;
+ }
+ }
+
+ return result;
+}
+
+u8 sub_811A798(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1, u8 arg2)
+{
+ s32 i;
+
+ if (arg1->unk18)
+ {
+ for (i = 0; i < arg2; i++)
+ {
+ if (arg0[i].field_1A_0 == 0)
+ {
+ arg0[i].unk = arg1->unk0;
+ arg0[i].field_18 = 0;
+ arg0[i].field_1A_0 = 1;
+ arg0[i].field_1B = 64;
+ arg1->unk18 = FALSE;
+ return i;
+ }
+ }
+ }
+
+ return 0xFF;
+}
+
+void sub_811A81C(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 *arg3, u8 arg4, u8 id)
+{
+ u8 r2;
+ u8 sp0[6];
+ u8 sp10[30];
+
+ ConvertIntToDecimalStringN(gStringVar4, id + 1, STR_CONV_MODE_LEADING_ZEROS, 2);
+ StringAppend(gStringVar4, gUnknown_84571B0);
+ sub_811A444(arg0, 0, gStringVar4, arg1, arg2, 0);
+ arg1 += 18;
+ r2 = arg3->unk.field_0.unk_0a_0;
+ if (arg3->field_1A_0 == 1 && !(r2 & 0x40))
+ {
+ sub_8018404_2(sp10, *arg3);
+ sub_811A444(arg0, 2, sp10, arg1, arg2, arg4);
+ ConvertIntToDecimalStringN(sp0, arg3->unk.field_0.unk_00.playerTrainerId[0] | (arg3->unk.field_0.unk_00.playerTrainerId[1] << 8), STR_CONV_MODE_LEADING_ZEROS, 5);
+ StringCopy(gStringVar4, gUnknown_84571B4);
+ StringAppend(gStringVar4, sp0);
+ arg1 += 77;
+ sub_811A444(arg0, 0, gStringVar4, arg1, arg2, arg4);
+ }
+}
+
+void sub_811A910(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 *arg3, u8 arg4, u8 id)
+{
+ u8 sp0[6];
+ u8 sp10[30];
+
+ if (arg3->field_1A_0 == 1)
+ {
+ sub_8018404_2(sp10, *arg3);
+ sub_811A444(arg0, 2, sp10, arg1, arg2, arg4);
+ ConvertIntToDecimalStringN(sp0, arg3->unk.field_0.unk_00.playerTrainerId[0] | (arg3->unk.field_0.unk_00.playerTrainerId[1] << 8), STR_CONV_MODE_LEADING_ZEROS, 5);
+ StringCopy(gStringVar4, gUnknown_84571B4);
+ StringAppend(gStringVar4, sp0);
+ arg1 += 71;
+ sub_811A444(arg0, 0, gStringVar4, arg1, arg2, arg4);
+ }
+}
+
+bool32 sub_811A9B8(void)
+{
+ s16 x, y;
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ if (x != 9)
+ {
+ return FALSE;
+ }
+ if (y != 8)
+ {
+ return FALSE;
+ }
+ if (gPlayerAvatar.tileTransitionState == 2 || gPlayerAvatar.tileTransitionState == 0)
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+u32 sub_811A9FC(s32 arg0)
+{
+ switch (arg0)
+ {
+ case 5:
+ return 1;
+ case 4:
+ return 2;
+ case 8:
+ return 3;
+ case 3:
+ default:
+ return 0;
+ }
+}
+
+u32 sub_811AA24(struct UnkStruct_x20 *arg0)
+{
+ u8 sp0[30];
+ sub_8018404_2(sp0, *arg0);
+ return sub_80FD338(ReadAsU16(arg0->unk.field_0.unk_00.playerTrainerId), sp0);
+}
+
+s32 sub_811AA5C(struct UnkStruct_Main0 *arg0, u8 arg1, u8 arg2, u32 playerGender)
+{
+ bool32 r2;
+
+ struct UnkStruct_x20 * r5 = &arg0->arr[arg2];
+
+ if (!r5->unk.field_0.unk_0a_7 && arg1 == 0)
+ {
+ sub_8018404_2(gStringVar1, *r5);
+ r2 = sub_80FD338(ReadAsU16(r5->unk.field_0.unk_00.playerTrainerId), gStringVar1);
+ if (r5->unk.field_0.unk_0a_0 == 0x45)
+ {
+ StringExpandPlaceholders(gStringVar4, gUnknown_8457F80[r2][playerGender]);
+ return 2;
+ }
+ else
+ {
+ sub_811A0B4(gUnknown_8457A34[r2]);
+ return 1;
+ }
+ }
+ else
+ {
+ sub_8018404_2(gStringVar1, *r5);
+ if (arg1 != 0)
+ {
+ playerGender = (r5->unk.field_0.unk_00.playerTrainerId[arg1 + 1] >> 3) & 1;
+ }
+ switch (r5->unk.field_0.unk_0a_0 & 0x3F)
+ {
+ case 1:
+ StringExpandPlaceholders(gStringVar4, gUnknown_8458758[playerGender][Random() % 4]);
+ break;
+ case 4:
+ StringExpandPlaceholders(gStringVar4, gUnknown_8458A78[playerGender][Random() % 2]);
+ break;
+ case 5:
+ StringExpandPlaceholders(gStringVar4, gUnknown_84588BC[playerGender][Random() % 4]);
+ break;
+ case 8:
+ StringExpandPlaceholders(gStringVar4, gUnknown_84589AC[playerGender][Random() % 2]);
+ break;
+ default:
+ StringExpandPlaceholders(gStringVar4, gUnknown_8457F90);
+ break;
+ }
+ return 0;
+ }
+}
+
+void nullsub_92(u8 windowId, s32 itemId, u8 y)
+{
+
+}
+
+void sub_811ABE4(u8 arg0, u8 arg1, struct GFtgtGname * arg2, const u8 * str, u8 arg4)
+{
+ u8 sp8[4];
+ u16 r8 = arg2->species;
+ u8 r7 = arg2->type;
+ u8 r9 = arg2->level;
+
+ sub_811A444(arg0, 2, str, 8, arg1, arg4);
+ if (r8 == SPECIES_EGG)
+ {
+ sub_811A444(arg0, 2, gUnknown_8458FBC, 0x44, arg1, arg4);
+ }
+ else
+ {
+ BlitMoveInfoIcon(arg0, r7 + 1, 0x44, arg1);
+ sub_811A444(arg0, 2, gSpeciesNames[r8], 0x76, arg1, arg4);
+ ConvertIntToDecimalStringN(sp8, r9, STR_CONV_MODE_LEFT_ALIGN, 3);
+ sub_811A444(arg0, 2, sp8, GetStringRightAlignXOffset(2, sp8, 218), arg1, arg4);
+ }
+}
+
+void sub_811ACA4(u8 windowId, s32 itemId, u8 y)
+{
+ struct UnkStruct_Leader *leader = gUnknown_203B05C.leader;
+ struct GFtgtGname *rfu;
+ s32 i, j;
+ u8 sp4[8];
+
+ if (itemId == -3 && y == gUnknown_8456F7C.upText_Y)
+ {
+ rfu = sub_80F9800();
+ if (rfu->species != SPECIES_NONE)
+ {
+ sub_811ABE4(windowId, y, rfu, gSaveBlock2Ptr->playerName, 5);
+ }
+ }
+ else
+ {
+ j = 0;
+ for (i = 0; i < 8; i++)
+ {
+ if (leader->field_0->arr[i].field_1A_0 == 1 && leader->field_0->arr[i].unk.field_0.species != SPECIES_NONE)
+ {
+ j++;
+ }
+ if (j == itemId + 1)
+ {
+ sub_8018404_2(sp4, leader->field_0->arr[i]);
+ sub_811ABE4(windowId, y, &leader->field_0->arr[i].unk.field_0, sp4, 6);
+ break;
+ }
+ }
+ }
+}
+
+s32 sub_811AD7C(struct UnkStruct_x20 * arg, s32 arg1)
+{
+ s32 i;
+ s32 j = 0;
+
+ for (i = 0; i < 8; i++)
+ {
+ if (arg[i].field_1A_0 == 1 && arg[i].unk.field_0.species != SPECIES_NONE)
+ {
+ j++;
+ }
+ if (j == arg1 + 1)
+ {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+s32 sub_811ADC4(s32 arg1, struct UnkStruct_Main0 *arg0)
+{
+ return arg0->arr[arg1].unk.field_0.playerGender;
+}
+
+s32 sub_811ADD0(u32 type, u32 species)
+{
+ s32 i;
+
+ if (species == SPECIES_EGG)
+ {
+ for (i = 0; i < gPlayerPartyCount; i++)
+ {
+ species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
+ if (species == SPECIES_EGG)
+ {
+ return 0;
+ }
+ }
+ return 2;
+ }
+ else
+ {
+ for (i = 0; i < gPlayerPartyCount; i++)
+ {
+ species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
+ if (gBaseStats[species].type1 == type || gBaseStats[species].type2 == type)
+ {
+ return 0;
+ }
+ }
+ return 1;
+ }
+}
+
+void sub_811AE68(u8 *dst, s32 arg1, u32 playerGender)
+{
+ switch (arg1)
+ {
+ case 0x41:
+ StringExpandPlaceholders(dst, gUnknown_8458314[playerGender]);
+ break;
+ case 0x45:
+ StringExpandPlaceholders(dst, gUnknown_84585E8[playerGender]);
+ break;
+ case 0x44:
+ StringExpandPlaceholders(dst, gUnknown_8458F9C);
+ break;
+ case 0x48:
+ StringExpandPlaceholders(dst, gUnknown_84583B4[playerGender]);
+ break;
+ }
+}
+
+void sub_811AECC(u8 *dst, u8 arg1)
+{
+ u8 mpId = GetMultiplayerId();
+ u8 gender = gLinkPlayers[mpId ^ 1].gender;
+
+ switch (arg1)
+ {
+ case 0x41:
+ StringCopy(dst, gUnknown_8458230[mpId][gender][0]);
+ break;
+ case 0x44:
+ StringCopy(dst, gUnknown_8458230[mpId][gender][2]);
+ break;
+ case 0x45:
+ StringCopy(dst, gUnknown_8458230[mpId][gender][1]);
+ break;
+ }
+}
+
+s32 sub_811AF6C(u8 *dst, u32 gender, u16 *arg2, struct UnkStruct_URoom *arg3)
+{
+ s32 result = 0;
+ u16 species = SPECIES_NONE;
+ s32 i;
+
+ switch (arg2[0])
+ {
+ case 0x41:
+ StringExpandPlaceholders(dst, gUnknown_8457CA4);
+ result = 1;
+ break;
+ case 0x45:
+ StringExpandPlaceholders(dst, gUnknown_8457CF8);
+ result = 1;
+ break;
+ case 0x44:
+ ConvertIntToDecimalStringN(arg3->field_58[0], sUnionRoomTrade.playerLevel, STR_CONV_MODE_LEFT_ALIGN, 3);
+ StringCopy(arg3->field_58[1], gSpeciesNames[sUnionRoomTrade.playerSpecies]);
+ for (i = 0; i < 4; i++)
+ {
+ if (gRfuLinkStatus->partner[i].serialNo == 2)
+ {
+ ConvertIntToDecimalStringN(arg3->field_58[2], arg2[2], STR_CONV_MODE_LEFT_ALIGN, 3);
+ StringCopy(arg3->field_58[3], gSpeciesNames[arg2[1]]);
+ species = arg2[1];
+ break;
+ }
+ }
+ if (species == SPECIES_EGG)
+ {
+ StringCopy(dst, gUnknown_8457DB8);
+ }
+ else
+ {
+ for (i = 0; i < 4; i++)
+ {
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(i, arg3->field_58[i]);
+ }
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(dst, gUnknown_8457D44);
+ }
+ result = 1;
+ break;
+ case 0x48:
+ StringExpandPlaceholders(dst, gUnknown_8457C48);
+ result = 1;
+ break;
+ case 0x40:
+ StringExpandPlaceholders(dst, gUnknown_8457E0C);
+ result = 2;
+ break;
+ }
+
+ return result;
+}
+
+bool32 sub_811B0A4(struct UnkStruct_URoom *arg0)
+{
+ if (gRecvCmds[0][1] != 0)
+ {
+ if (gRecvCmds[0][1] == 0x51)
+ {
+ arg0->field_98 = 0x51;
+ return TRUE;
+ }
+ else if (gRecvCmds[0][1] == 0x52)
+ {
+ arg0->field_98 = 0x52;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+bool32 InUnionRoom(void)
+{
+ return gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(UNION_ROOM)
+ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(UNION_ROOM)
+ ? TRUE : FALSE;
+}
+
+bool32 HasAtLeastTwoMonsOfLevel30OrLower(void)
+{
+ s32 i;
+ s32 count = 0;
+
+ for (i = 0; i < gPlayerPartyCount; i++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_LEVEL) <= 30
+ && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) != SPECIES_EGG)
+ {
+ count++;
+ }
+ }
+
+ if (count > 1)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void ResetUnionRoomTrade(struct UnionRoomTrade *arg0)
+{
+ arg0->field_0 = 0;
+ arg0->type = 0;
+ arg0->playerPersonality = 0;
+ arg0->playerSpecies = 0;
+ arg0->playerLevel = 0;
+ arg0->species = 0;
+ arg0->level = 0;
+ arg0->personality = 0;
+}
+
+void Script_ResetUnionRoomTrade(void)
+{
+ ResetUnionRoomTrade(&sUnionRoomTrade);
+}
+
+bool32 RegisterTradeMonAndGetIsEgg(u32 monId, struct UnionRoomTrade *trade)
+{
+ trade->playerSpecies = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES2);
+ trade->playerLevel = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL);
+ trade->playerPersonality = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY);
+ if (trade->playerSpecies == SPECIES_EGG)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void RegisterTradeMon(u32 monId, struct UnionRoomTrade *trade)
+{
+ trade->species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES2);
+ trade->level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL);
+ trade->personality = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY);
+}
+
+u32 GetPartyPositionOfRegisteredMon(struct UnionRoomTrade *trade, u8 multiplayerId)
+{
+ u16 response = 0;
+ u16 species;
+ u32 personality;
+ u32 cur_personality;
+ u16 cur_species;
+ s32 i;
+
+ // player
+ if (multiplayerId == 0)
+ {
+ species = trade->playerSpecies;
+ personality = trade->playerPersonality;
+ }
+ // partner
+ else
+ {
+ species = trade->species;
+ personality = trade->personality;
+ }
+
+ for (i = 0; i < gPlayerPartyCount; i++)
+ {
+ cur_personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY);
+ if (cur_personality != personality)
+ {
+ continue;
+ }
+ cur_species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
+ if (cur_species != species)
+ {
+ continue;
+ }
+ response = i;
+ break;
+ }
+
+ return response;
+}
+
+void sub_811B258(bool32 arg0)
+{
+ sub_811A3F8();
+ ScriptContext2_Disable();
+ sub_80696F0();
+ gUnknown_203B058 = 0;
+ if (arg0)
+ {
+ sub_80FAFA0(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel);
+ sub_80FB008(0x40, 0, 0);
+ }
+}
+
+void sub_811B298(void)
+{
+ ScriptContext2_Enable();
+ ScriptFreezeObjectEvents();
+}
+
+u8 sub_811B2A8(s32 linkPlayer)
+{
+ u8 retval = 0x80;
+ retval |= gLinkPlayers[linkPlayer].gender << 3;
+ retval |= gLinkPlayers[linkPlayer].trainerId & 7;
+ return retval;
+}
+
+u8 sub_811B2D8(struct UnkStruct_URoom *arg0)
+{
+ u8 retVal = 0x80;
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (arg0->field_C->arr[i].unk18)
+ {
+ retVal |= arg0->field_C->arr[i].unk0.field_0.playerGender << 3;
+ retVal |= arg0->field_C->arr[i].unk0.field_0.unk_00.playerTrainerId[0] & 7;
+ break;
+ }
+ }
+
+ return retVal;
+}
+
+void sub_811B31C(u8 *unused, struct UnkStruct_URoom *arg1, bool8 arg2)
+{
+ struct TrainerCard *trainerCard = &gTrainerCards[GetMultiplayerId() ^ 1];
+ s32 i;
+ s32 n;
+
+ DynamicPlaceholderTextUtil_Reset();
+
+ StringCopy(arg1->field_C0[0], gTrainerClassNames[sub_80447F0()]);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, arg1->field_C0[0]);
+
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, trainerCard->playerName);
+
+ StringCopy(arg1->field_174, gUnknown_84594B0[trainerCard->stars]);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, arg1->field_174);
+
+ ConvertIntToDecimalStringN(arg1->field_C0[2], trainerCard->caughtMonsCount, STR_CONV_MODE_LEFT_ALIGN, 3);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, arg1->field_C0[2]);
+
+ ConvertIntToDecimalStringN(arg1->field_C0[3], trainerCard->playTimeHours, STR_CONV_MODE_LEFT_ALIGN, 3);
+ ConvertIntToDecimalStringN(arg1->field_C0[4], trainerCard->playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, arg1->field_C0[3]);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(5, arg1->field_C0[4]);
+
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(arg1->field_1A4, gUnknown_84594C4);
+ StringCopy(gStringVar4, arg1->field_1A4);
+
+ n = trainerCard->linkBattleWins;
+ if (n > 9999)
+ {
+ n = 9999;
+ }
+ ConvertIntToDecimalStringN(arg1->field_C0[0], n, STR_CONV_MODE_LEFT_ALIGN, 4);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, arg1->field_C0[0]);
+
+ n = trainerCard->linkBattleLosses;
+ if (n > 9999)
+ {
+ n = 9999;
+ }
+ ConvertIntToDecimalStringN(arg1->field_C0[1], n, STR_CONV_MODE_LEFT_ALIGN, 4);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, arg1->field_C0[1]);
+
+ ConvertIntToDecimalStringN(arg1->field_C0[2], trainerCard->pokemonTrades, STR_CONV_MODE_LEFT_ALIGN, 5);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, arg1->field_C0[2]);
+
+ for (i = 0; i < 4; i++)
+ {
+ CopyEasyChatWord(arg1->field_C0[i + 3], trainerCard->var_28[i]);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(i + 4, arg1->field_C0[i + 3]);
+ }
+
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(arg1->field_1A4, gUnknown_8459504);
+ StringAppend(gStringVar4, arg1->field_1A4);
+
+ if (arg2 == TRUE)
+ {
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(arg1->field_1A4, gUnknown_8459588);
+ StringAppend(gStringVar4, arg1->field_1A4);
+ }
+ else if (arg2 == FALSE)
+ {
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(arg1->field_1A4, gUnknown_8459580[trainerCard->gender]);
+ StringAppend(gStringVar4, arg1->field_1A4);
+ }
+}