summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPikalaxALT <PikalaxALT@gmail.com>2020-01-20 14:46:01 -0500
committerPikalaxALT <PikalaxALT@gmail.com>2020-01-20 14:46:01 -0500
commitac5bfcf1ce9c0f1dfe240dca3aeb0f3fcaa83280 (patch)
treed5fc9e8f137d06ff17c7beb4f22744c318d19b4f /src
parent8d5af5332934f47f022907d2acb2e71d96b04449 (diff)
through sub_8117A0C
Diffstat (limited to 'src')
-rw-r--r--src/credits.c4
-rw-r--r--src/field_fadetransition.c22
-rw-r--r--src/item_use.c10
-rw-r--r--src/mevent.c4
-rw-r--r--src/player_pc.c8
-rw-r--r--src/quest_log.c4
-rw-r--r--src/scrcmd.c4
-rw-r--r--src/shop.c4
-rw-r--r--src/start_menu.c4
-rw-r--r--src/union_room.c767
10 files changed, 794 insertions, 37 deletions
diff --git a/src/credits.c b/src/credits.c
index a0138e57a..ceb2028f9 100644
--- a/src/credits.c
+++ b/src/credits.c
@@ -920,7 +920,7 @@ static s32 RollCredits(void)
case CREDITSSCRCMD_MON:
sCreditsMgr->mainseqno = CREDITSSCENE_MON_DESTROY_ASSETS;
sCreditsMgr->whichMon = sCreditsScript[sCreditsMgr->scrcmdidx].param;
- fade_screen(1, 0);
+ FadeScreen(1, 0);
break;
case CREDITSSCRCMD_THEENDGFX:
sCreditsMgr->mainseqno = CREDITSSCENE_THEEND_DESTROY_ASSETS;
@@ -1342,7 +1342,7 @@ static s32 RollCredits(void)
"\tstrb r0, [r2, 0x9]\n"
"\tmovs r0, 0x1\n"
"\tmovs r1, 0\n"
- "\tbl fade_screen\n"
+ "\tbl FadeScreen\n"
"\tb _080F3E94\n"
"\t.align 2, 0\n"
"_080F3E50: .4byte sCreditsMgr\n"
diff --git a/src/field_fadetransition.c b/src/field_fadetransition.c
index dbc5f23b5..0af5f462c 100644
--- a/src/field_fadetransition.c
+++ b/src/field_fadetransition.c
@@ -56,12 +56,12 @@ void pal_fill_for_maplights(void)
{
case 0:
palette_bg_faded_fill_black();
- fade_screen(0, 0);
+ FadeScreen(0, 0);
palette_bg_faded_fill_black();
break;
case 1:
palette_bg_faded_fill_white();
- fade_screen(2, 0);
+ FadeScreen(2, 0);
palette_bg_faded_fill_white();
break;
}
@@ -73,12 +73,12 @@ static void sub_807DBAC(void)
{
case 0:
palette_bg_faded_fill_black();
- fade_screen(0, 3);
+ FadeScreen(0, 3);
palette_bg_faded_fill_black();
break;
case 1:
palette_bg_faded_fill_white();
- fade_screen(2, 3);
+ FadeScreen(2, 3);
palette_bg_faded_fill_white();
break;
}
@@ -87,7 +87,7 @@ static void sub_807DBAC(void)
void sub_807DC00(void)
{
palette_bg_faded_fill_black();
- fade_screen(0, 0);
+ FadeScreen(0, 0);
palette_bg_faded_fill_black();
}
@@ -95,16 +95,16 @@ void sub_807DC18(void)
{
const struct MapHeader *header = warp1_get_mapheader();
if (header->regionMapSectionId != gMapHeader.regionMapSectionId && sub_80F8110(header->regionMapSectionId, FALSE))
- fade_screen(1, 0);
+ FadeScreen(1, 0);
else
{
switch (sub_80C9D7C(GetCurrentMapType(), header->mapType))
{
case 0:
- fade_screen(1, 0);
+ FadeScreen(1, 0);
break;
case 1:
- fade_screen(3, 0);
+ FadeScreen(3, 0);
break;
}
}
@@ -115,10 +115,10 @@ static void sub_807DC70(void)
switch (sub_80C9D7C(GetCurrentMapType(), warp1_get_mapheader()->mapType))
{
case 0:
- fade_screen(1, 3);
+ FadeScreen(1, 3);
break;
case 1:
- fade_screen(3, 3);
+ FadeScreen(3, 3);
break;
}
}
@@ -654,7 +654,7 @@ static void sub_807E678(u8 taskId)
{
case 0:
ClearLinkCallback_2();
- fade_screen(1, 0);
+ FadeScreen(1, 0);
sub_8055F88();
PlaySE(SE_KAIDAN);
data[0]++;
diff --git a/src/item_use.c b/src/item_use.c
index fc5703a75..57771754a 100644
--- a/src/item_use.c
+++ b/src/item_use.c
@@ -458,7 +458,7 @@ void FieldUseFunc_TmCase(u8 taskId)
else
{
StopPokemonLeagueLightingEffectTask();
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].func = Task_InitTMCaseFromField;
}
}
@@ -489,7 +489,7 @@ void FieldUseFunc_BerryPouch(u8 taskId)
else
{
StopPokemonLeagueLightingEffectTask();
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].func = Task_InitBerryPouchFromField;
}
}
@@ -532,7 +532,7 @@ void FieldUseFunc_TeachyTv(u8 taskId)
else
{
StopPokemonLeagueLightingEffectTask();
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].func = Task_InitTeachyTvFromField;
}
}
@@ -662,7 +662,7 @@ void FieldUseFunc_TownMap(u8 taskId)
else
{
StopPokemonLeagueLightingEffectTask();
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].func = sub_80A1CC0;
}
}
@@ -694,7 +694,7 @@ void FieldUseFunc_FameChecker(u8 taskId)
else
{
StopPokemonLeagueLightingEffectTask();
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].func = sub_80A1D68;
}
}
diff --git a/src/mevent.c b/src/mevent.c
index b22d02cbc..c8ce39e23 100644
--- a/src/mevent.c
+++ b/src/mevent.c
@@ -652,7 +652,7 @@ void BlankMEventBuffer2(void)
gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.crc = 0;
}
-u16 sub_81440E8(void)
+u16 GetWonderCardFlagID(void)
{
if (ValidateReceivedWonderCard())
return gSaveBlock1Ptr->mysteryEventBuffers.mecard.data.unk_00;
@@ -674,7 +674,7 @@ bool32 sub_8144124(u16 a0)
bool32 CheckReceivedGiftFromWonderCard(void)
{
- u16 value = sub_81440E8();
+ u16 value = GetWonderCardFlagID();
if (!sub_8144124(value))
return FALSE;
if (FlagGet(gUnknown_8466F00[value - 1000]) == TRUE)
diff --git a/src/player_pc.c b/src/player_pc.c
index 63870c86a..928676844 100644
--- a/src/player_pc.c
+++ b/src/player_pc.c
@@ -331,7 +331,7 @@ static void Task_DepositItem_WaitFadeAndGoToBag(u8 taskId)
static void Task_PlayerPcDepositItem(u8 taskId)
{
gTasks[taskId].func = Task_DepositItem_WaitFadeAndGoToBag;
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
static void Task_ReturnToItemStorageSubmenu(u8 taskId)
@@ -394,7 +394,7 @@ static void Task_WithdrawItemBeginFade(u8 taskId)
{
gTasks[taskId].func = Task_WithdrawItem_WaitFadeAndGoToItemStorage;
ItemPc_SetInitializedFlag(0);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
static void Task_PlayerPcCancel(u8 taskId)
@@ -556,7 +556,7 @@ static void Task_MailSubmenuHandleInput(u8 taskId)
static void Task_PlayerPcReadMail(u8 taskId)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].func = Task_WaitFadeAndReadSelectedMail;
}
@@ -663,7 +663,7 @@ static void Task_PlayerPcGiveMailToMon(u8 taskId)
}
else
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].func = Task_WaitFadeAndGoToPartyMenu;
}
}
diff --git a/src/quest_log.c b/src/quest_log.c
index 38b3733ea..0cda4eb77 100644
--- a/src/quest_log.c
+++ b/src/quest_log.c
@@ -1049,7 +1049,7 @@ static void sub_811175C(u8 sceneNum, struct UnkStruct_203AE98 * a1)
static void sub_81118F4(s8 a0)
{
- fade_screen(1, a0);
+ FadeScreen(1, a0);
sQuestLogCB = QuestLog_AdvancePlayhead;
}
@@ -1309,7 +1309,7 @@ static void QuestLog_CloseTextWindow(void)
static void QuestLog_SkipToEndOfPlayback(s8 a0)
{
- fade_screen(1, a0);
+ FadeScreen(1, a0);
sQuestLogCB = QuestLog_WaitFadeAndCancelPlayback;
}
diff --git a/src/scrcmd.c b/src/scrcmd.c
index 51e7d2c35..c083546eb 100644
--- a/src/scrcmd.c
+++ b/src/scrcmd.c
@@ -630,7 +630,7 @@ static bool8 IsPaletteNotActive(void)
bool8 ScrCmd_fadescreen(struct ScriptContext *ctx)
{
- fade_screen(ScriptReadByte(ctx), 0);
+ FadeScreen(ScriptReadByte(ctx), 0);
SetupNativeScript(ctx, IsPaletteNotActive);
return TRUE;
}
@@ -640,7 +640,7 @@ bool8 ScrCmd_fadescreenspeed(struct ScriptContext *ctx)
u8 mode = ScriptReadByte(ctx);
u8 speed = ScriptReadByte(ctx);
- fade_screen(mode, speed);
+ FadeScreen(mode, speed);
SetupNativeScript(ctx, IsPaletteNotActive);
return TRUE;
}
diff --git a/src/shop.c b/src/shop.c
index 865688928..97061f8c0 100644
--- a/src/shop.c
+++ b/src/shop.c
@@ -294,14 +294,14 @@ static void Task_ShopMenu(u8 taskId)
static void Task_HandleShopMenuBuy(u8 taskId)
{
SetWordTaskArg(taskId, 0xE, (u32)CB2_InitBuyMenu);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].func = Task_GoToBuyOrSellMenu;
}
static void Task_HandleShopMenuSell(u8 taskId)
{
SetWordTaskArg(taskId, 0xE, (u32)CB2_GoToSellMenu);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].func = Task_GoToBuyOrSellMenu;
}
diff --git a/src/start_menu.c b/src/start_menu.c
index 59bfb8643..b159f0375 100644
--- a/src/start_menu.c
+++ b/src/start_menu.c
@@ -446,7 +446,7 @@ static void StartMenu_FadeScreenIfLeavingOverworld(void)
&& sStartMenuCallback != StartMenuSafariZoneRetireCallback)
{
StopPokemonLeagueLightingEffectTask();
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
}
@@ -554,7 +554,7 @@ static bool8 StartMenuLinkPlayerCallback(void)
{
PlayRainStoppingSoundEffect();
CleanupOverworldWindowsAndTilemaps();
- ShowTrainerCardInLink(gUnknown_300502C, CB2_ReturnToFieldWithOpenMenu);
+ ShowTrainerCardInLink(gLocalLinkPlayerId, CB2_ReturnToFieldWithOpenMenu);
return TRUE;
}
return FALSE;
diff --git a/src/union_room.c b/src/union_room.c
index 37c3e7c0a..6b6ef5b98 100644
--- a/src/union_room.c
+++ b/src/union_room.c
@@ -1,23 +1,41 @@
#include "global.h"
#include "gflib.h"
+#include "battle.h"
+#include "berry_crush.h"
+#include "cable_club.h"
+#include "dodrio_berry_picking.h"
#include "event_data.h"
+#include "field_control_avatar.h"
+#include "field_weather.h"
#include "link.h"
#include "link_rfu.h"
#include "list_menu.h"
+#include "load_save.h"
+#include "mevent.h"
+#include "mystery_gift_menu.h"
#include "new_menu_helpers.h"
+#include "overworld.h"
+#include "party_menu.h"
+#include "pokemon_jump.h"
+#include "save_location.h"
#include "script.h"
+#include "script_pokemon_util.h"
#include "task.h"
+#include "trade.h"
+#include "trade_scene.h"
+#include "trainer_card.h"
#include "union_room.h"
+#include "union_room_chat.h"
+#include "union_room_player_avatar.h"
#include "constants/songs.h"
-
-#define sub_8018404(dest, arg1) ({ \
- StringCopy7(dest, (arg1).unk.playerName); \
- ConvertInternationalString(dest, (arg1).unk.field_0.unk_00.unk_00_0); \
-})
+#include "constants/maps.h"
+#include "constants/cable_club.h"
+#include "constants/field_weather.h"
EWRAM_DATA union UnkUnion_Main gUnknown_203B05C = {};
EWRAM_DATA u8 gUnknown_203B058 = 0;
EWRAM_DATA u8 gUnknown_203B059 = 0;
+EWRAM_DATA struct UnionRoomTrade gUnknown_203B06C = {};
IWRAM_DATA struct UnkStruct_Leader *gUnknown_3002024;
IWRAM_DATA struct UnkStruct_Group *gUnknown_3002028;
@@ -30,8 +48,11 @@ u8 sub_81165E8(struct UnkStruct_Main0 * a0);
void sub_8116738(u8 taskId);
u32 sub_8116D10(struct UnkStruct_Group * group, s32 id);
void sub_8116D60(struct UnkStruct_Group * group, s32 id);
+void sub_8116E1C(u8 taskId);
u8 sub_8116FE4(void);
void sub_8117990(void);
+void sub_81179A4(void);
+void sub_8117A0C(u8 taskId);
u16 sub_8118658(const u8 *data);
u8 sub_811A054(struct UnkStruct_Main4 *arg0, u32 arg1);
bool8 sub_811A0F8(u8 *textState, const u8 *str);
@@ -40,9 +61,13 @@ 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_811B148(struct UnionRoomTrade *trade);
+u32 sub_811B1EC(struct UnionRoomTrade *trade, u8 mpId);
extern const u8 *const gUnknown_8456C74[];
extern const struct WindowTemplate gUnknown_8456CD0;
@@ -54,8 +79,10 @@ extern const struct WindowTemplate gUnknown_8456D4C;
extern const struct WindowTemplate gUnknown_8456D54;
extern const struct ListMenuTemplate gUnknown_8456DDC;
extern const struct UnkStruct_Shared gUnknown_8457034;
+extern const u8 *const gUnknown_8457094[13];
extern const u8 gUnknown_84570C8[];
extern const u8 gUnknown_84571B4[];
+extern const u8 gUnknown_84571B8[];
extern const u8 gUnknown_8457234[];
extern const u8 gUnknown_8457264[];
extern const u8 *const gUnknown_845742C[][5];
@@ -74,6 +101,7 @@ extern const u8 gUnknown_84576C4[];
extern const u8 gUnknown_8457700[];
extern const u8 gUnknown_845771C[];
extern const u8 *const gUnknown_8457754[];
+extern const u8 gUnknown_84577F8[];
extern const u8 gUnknown_8457E28[];
extern const u8 gUnknown_8457E44[];
extern const u8 gUnknown_8458FC8[];
@@ -81,6 +109,18 @@ extern const u8 *const gUnknown_84591B8[];
extern const u8 gUnknown_8459238[];
extern const u8 gUnknown_8459250[];
+// These are functions in Emmerald but inlined in FireRed
+
+#define sub_8018404(dest, arg1) ({ \
+ StringCopy7(dest, (arg1).unk.playerName); \
+ ConvertInternationalString(dest, (arg1).unk.field_0.unk_00.unk_00_0); \
+})
+
+#define CopyTrainerCardData(dest, src, _version) ({ \
+ (dest) = *((struct TrainerCard *)(src)); \
+ (dest).version = _version; \
+})
+
void sub_811586C(u8 windowId, u8 arg1, u8 stringId)
{
FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
@@ -917,3 +957,720 @@ void sub_8116738(u8 taskId)
break;
}
}
+
+u32 sub_8116D10(struct UnkStruct_Group *arg0, s32 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)
+ {
+ if (!(gSaveBlock2Ptr->specialSaveWarpFlags & CHAMPION_SAVEWARP))
+ return 1;
+ else if (structPtr->unk.field_0.unk_00.isChampion)
+ return 0;
+ }
+ else
+ {
+ return 0;
+ }
+
+ return 2;
+}
+
+void sub_8116D60(struct UnkStruct_Group *data, s32 id)
+{
+ data->field_F = id;
+ LoadWirelessStatusIndicatorSpriteGfx();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ RedrawListMenu(data->listTaskId);
+ sub_8018404(gStringVar1, data->field_0->arr[data->field_F]);
+ sub_80FB008(gUnknown_84570C8[gSpecialVar_0x8004], 0, 1);
+ sub_80FBF54(data->field_0->arr[data->field_F].unk.playerName, sub_8118658(data->field_0->arr[data->field_F].unk.field_0.unk_00.playerTrainerId));
+}
+
+u8 sub_8116DE0(void)
+{
+ u8 taskId;
+ struct UnkStruct_Group *dataPtr;
+
+ taskId = CreateTask(sub_8116E1C, 0);
+ gUnknown_203B05C.group = dataPtr = (void*)(gTasks[taskId].data);
+
+ dataPtr->state = 0;
+ dataPtr->textState = 0;
+
+ gUnknown_3002028 = dataPtr;
+
+ return taskId;
+}
+
+void sub_8116E1C(u8 taskId)
+{
+ struct UnkStruct_Group *data = gUnknown_203B05C.group;
+
+ switch (data->state)
+ {
+ case 0:
+ sub_80FAF58(0, 0, 0);
+ sub_800B1F4();
+ OpenLink();
+ sub_80FBBD8();
+ sub_80FB128(TRUE);
+ data->field_4 = AllocZeroed(0x70);
+ data->field_0 = AllocZeroed(0x200);
+ data->state = 2;
+ break;
+ case 2:
+ sub_811A650(data->field_4, 4);
+ sub_811A5E4(data->field_0->arr, 16);
+ data->field_11 = sub_811A054(data->field_4, 0xFF);
+ data->field_F = 0;
+ data->state = 3;
+ break;
+ case 3:
+ if (sub_8116FE4() == 1)
+ PlaySE(SE_PC_LOGIN);
+ if (gTasks[taskId].data[15] == 0xFF)
+ data->state = 10;
+ break;
+ case 10:
+ DestroyTask(data->field_11);
+ Free(data->field_0);
+ Free(data->field_4);
+ sub_80F8DC0();
+ data->state++;
+ break;
+ case 11:
+ sub_80F8DC0();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+bool32 sub_8116F28(u32 arg0, u32 id)
+{
+ if (id == 0xFF)
+ return TRUE;
+
+ if (id <= NELEMS(gUnknown_8457094)) // UB: <= may access data outside the array
+ {
+ const u8 *bytes = gUnknown_8457094[id];
+
+ while ((*(bytes) != 0xFF))
+ {
+ if ((*bytes) == arg0)
+ return TRUE;
+ bytes++;
+ }
+ }
+
+ return FALSE;
+}
+
+u8 sub_8116F5C(struct UnkStruct_Group *data, u32 id)
+{
+ if (data->field_0->arr[id].field_1A_0 == 1)
+ {
+ if (data->field_0->arr[id].unk.field_0.unk_0a_7)
+ return 3;
+ else if (data->field_0->arr[id].field_1A_1 != 0)
+ return 1;
+ else if (data->field_0->arr[id].field_1B != 0)
+ return 2;
+ }
+
+ return 0;
+}
+
+void sub_8116F94(u8 arg0, s32 id, u8 arg2)
+{
+ 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);
+}
+
+u8 sub_8116FE4(void)
+{
+ struct UnkStruct_Group *data = gUnknown_203B05C.group;
+ u8 ret = 0;
+ u8 i;
+ s32 id;
+
+ for (i = 0; i < 16; i++)
+ {
+ if (data->field_0->arr[i].field_1A_0 != 0)
+ {
+ id = sub_811A748(&data->field_0->arr[i], data->field_4->arr);
+ if (id != 0xFF)
+ {
+ if (data->field_0->arr[i].field_1A_0 == 1)
+ {
+ if (sub_811A6DC(&data->field_0->arr[i].unk, &data->field_4->arr[id].unk0))
+ {
+ data->field_0->arr[i].unk = data->field_4->arr[id].unk0;
+ data->field_0->arr[i].field_1B = 0x40;
+ ret = 1;
+ }
+ else
+ {
+ if (data->field_0->arr[i].field_1B != 0)
+ {
+ data->field_0->arr[i].field_1B--;
+ if (data->field_0->arr[i].field_1B == 0)
+ ret = 2;
+ }
+ }
+ }
+ else
+ {
+ data->field_0->arr[i].field_1A_0 = 1;
+ data->field_0->arr[i].field_1B = 0x40;
+ ret = 1;
+ }
+
+ data->field_0->arr[i].field_18 = 0;
+ }
+ else
+ {
+ if (data->field_0->arr[i].field_1A_0 != 2)
+ {
+ data->field_0->arr[i].field_18++;
+ if (data->field_0->arr[i].field_18 >= 300)
+ {
+ data->field_0->arr[i].field_1A_0 = 2;
+ ret = 2;
+ }
+ }
+ }
+ }
+ }
+
+ for (id = 0; id < 4; id++)
+ {
+ if (sub_811A798(data->field_0->arr, &data->field_4->arr[id], 16) != 0xFF)
+ ret = 1;
+ }
+
+ return ret;
+}
+
+void sub_8117100(u8 taskId)
+{
+ CB2_ReturnFromLinkTrade();
+ DestroyTask(taskId);
+}
+
+u8 sub_8117118(void)
+{
+ u8 taskId = CreateTask(sub_8117100, 0);
+
+ return taskId;
+}
+
+void sub_8117130(u8 taskId)
+{
+ u32 monId = sub_811B1EC(&gUnknown_203B06C, GetMultiplayerId());
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ gTasks[taskId].data[0]++;
+ SendBlock(0, &gPlayerParty[monId], sizeof(struct Pokemon));
+ break;
+ case 1:
+ if (GetBlockReceivedStatus() == 3)
+ {
+ gEnemyParty[0] = *(struct Pokemon*)(gBlockRecvBuffer[GetMultiplayerId() ^ 1]);
+ IncrementGameStat(GAME_STAT_NUM_UNION_ROOM_BATTLES);
+ ResetBlockReceivedFlags();
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 2:
+ memcpy(gBlockSendBuffer, gSaveBlock1Ptr->mail, sizeof(struct MailStruct) * PARTY_SIZE + 4);
+ if (SendBlock(0, gBlockSendBuffer, sizeof(struct MailStruct) * PARTY_SIZE + 4))
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ if (GetBlockReceivedStatus() == 3)
+ {
+ memcpy(gLinkPartnerMail, gBlockRecvBuffer[GetMultiplayerId() ^ 1], sizeof(struct MailStruct) * PARTY_SIZE);
+ ResetBlockReceivedFlags();
+ gSelectedTradeMonPositions[TRADE_PLAYER] = monId;
+ gSelectedTradeMonPositions[TRADE_PARTNER] = PARTY_SIZE;
+ gMain.savedCallback = CB2_ReturnToField;
+ SetMainCallback2(CB2_InitTradeAnim_LinkTrade);
+ sub_811B148(&gUnknown_203B06C);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_8117280(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (GetMultiplayerId() == 0)
+ sub_800A474(2);
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ if (GetBlockReceivedStatus() == sub_800A8D4())
+ {
+ s32 i;
+ u16 *recvBuff;
+
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ recvBuff = gBlockRecvBuffer[i];
+ CopyTrainerCardData(gTrainerCards[i], recvBuff, gLinkPlayers[i].version);
+ }
+
+ if (GetLinkPlayerCount() == 2)
+ {
+ recvBuff = gBlockRecvBuffer[GetMultiplayerId() ^ 1];
+ sub_81446D0(recvBuff[48]);
+ }
+ else
+ {
+ sub_81446C4();
+ }
+
+ ResetBlockReceivedFlags();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_8117354(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ CreateTask(sub_8117280, 5);
+ gMain.state++;
+ break;
+ case 1:
+ if (!FuncIsActiveTask(sub_8117280))
+ ShowTrainerCardInLink(GetMultiplayerId() ^ 1, CB2_ReturnToField);
+ break;
+ }
+
+ RunTasks();
+ RunTextPrinters();
+ AnimateSprites();
+ BuildOamBuffer();
+}
+
+void sub_81173C0(u16 battleFlags)
+{
+ HealPlayerParty();
+ SavePlayerParty();
+ LoadPlayerBag();
+ gLinkPlayers[0].linkType = LINKTYPE_BATTLE;
+ gLinkPlayers[GetMultiplayerId()].id = GetMultiplayerId();
+ gLinkPlayers[GetMultiplayerId() ^ 1].id = GetMultiplayerId() ^ 1;
+ gMain.savedCallback = sub_8081668;
+ gBattleTypeFlags = battleFlags;
+ PlayBattleBGM();
+}
+
+void sub_8117440(u16 linkService, u16 x, u16 y)
+{
+ VarSet(VAR_CABLE_CLUB_STATE, linkService);
+ SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y);
+ SetDynamicWarpWithCoords(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y);
+ WarpIntoMap();
+}
+
+void sub_81174B4(s8 mapGroup, s8 mapNum, s32 x, s32 y, u16 linkService)
+{
+ gSpecialVar_0x8004 = linkService;
+ VarSet(VAR_CABLE_CLUB_STATE, linkService);
+ gFieldLinkPlayerCount = GetLinkPlayerCount();
+ gLocalLinkPlayerId = GetMultiplayerId();
+ SetCableClubWarp();
+ SetWarpDestination(mapGroup, mapNum, -1, x, y);
+ WarpIntoMap();
+}
+
+void sub_8117534(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ CreateTask(sub_8117280, 5);
+ gMain.state++;
+ break;
+ case 1:
+ if (!FuncIsActiveTask(sub_8117280))
+ SetMainCallback2(sub_8056788);
+ break;
+ }
+
+ RunTasks();
+ RunTextPrinters();
+ AnimateSprites();
+ BuildOamBuffer();
+}
+
+void sub_8117594(void *arg0, bool32 arg1)
+{
+ TrainerCard_GenerateCardForLinkPlayer((struct TrainerCard *)arg0);
+ if (arg1)
+ *((u16 *)(arg0 + sizeof(struct TrainerCard))) = GetWonderCardFlagID();
+ else
+ *((u16 *)(arg0 + sizeof(struct TrainerCard))) = 0;
+}
+
+void sub_81175BC(u8 taskId)
+{
+ sub_81446C4();
+ switch (gUnknown_203B058)
+ {
+ case 1 ... 4:
+ case 9 ... 11:
+ case 13:
+ case 14:
+ RecordMixTrainerNames();
+ break;
+ }
+
+ switch (gUnknown_203B058)
+ {
+ case 65:
+ case 81:
+ CleanupOverworldWindowsAndTilemaps();
+ gMain.savedCallback = sub_811C1C8;
+ InitChooseHalfPartyForBattle(2);
+ break;
+ case 1:
+ CleanupOverworldWindowsAndTilemaps();
+ sub_8117594(gBlockSendBuffer, TRUE);
+ HealPlayerParty();
+ SavePlayerParty();
+ LoadPlayerBag();
+ sub_81174B4(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_SINGLE_BATTLE);
+ SetMainCallback2(sub_8117534);
+ break;
+ case 2:
+ CleanupOverworldWindowsAndTilemaps();
+ HealPlayerParty();
+ SavePlayerParty();
+ LoadPlayerBag();
+ sub_8117594(gBlockSendBuffer, TRUE);
+ sub_81174B4(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_DOUBLE_BATTLE);
+ SetMainCallback2(sub_8117534);
+ break;
+ case 3:
+ CleanupOverworldWindowsAndTilemaps();
+ HealPlayerParty();
+ SavePlayerParty();
+ LoadPlayerBag();
+ sub_8117594(gBlockSendBuffer, TRUE);
+ sub_81174B4(MAP_GROUP(BATTLE_COLOSSEUM_4P), MAP_NUM(BATTLE_COLOSSEUM_4P), 5, 8, USING_MULTI_BATTLE);
+ SetMainCallback2(sub_8117534);
+ break;
+ case 4:
+ sub_8117594(gBlockSendBuffer, TRUE);
+ CleanupOverworldWindowsAndTilemaps();
+ sub_81174B4(MAP_GROUP(TRADE_CENTER), MAP_NUM(TRADE_CENTER), 5, 8, USING_TRADE_CENTER);
+ SetMainCallback2(sub_8117534);
+ break;
+ case 68:
+ CreateTask(sub_8117130, 0);
+ break;
+ case 5:
+ case 69:
+ if (GetMultiplayerId() == 0)
+ {
+ sub_80F8CFC();
+ }
+ else
+ {
+ sub_80F8D14();
+ sub_80FAF58(69, 0, 1);
+ }
+ sub_8128420();
+ break;
+ case 8:
+ case 72:
+ sub_8117594(gBlockSendBuffer, FALSE);
+ SetMainCallback2(sub_8117354);
+ break;
+ case 9:
+ sub_8117440(USING_MINIGAME, 5, 1);
+ sub_8147AA8(GetCursorSelectionMonId(), CB2_LoadMap);
+ break;
+ case 10:
+ sub_8117440(USING_BERRY_CRUSH, 9, 1);
+ sub_814B754(CB2_LoadMap);
+ break;
+ case 11:
+ sub_8117440(USING_MINIGAME, 5, 1);
+ sub_81507FC(GetCursorSelectionMonId(), CB2_LoadMap);
+ break;
+ }
+
+ DestroyTask(taskId);
+ gSpecialVar_Result = 1;
+ ScriptContext2_Disable();
+}
+
+void sub_8117900(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ u16 *sendBuff = (u16*)(gBlockSendBuffer);
+
+ switch (data[0])
+ {
+ case 0:
+ gSpecialVar_Result = 1;
+ EnableBothScriptContexts();
+ data[0]++;
+ break;
+ case 1:
+ if (!ScriptContext1_IsScriptSetUp())
+ {
+ FadeScreen(FADE_TO_BLACK, 0);
+ data[0]++;
+ }
+ break;
+ case 2:
+ if (!gPaletteFade.active)
+ {
+ sub_800AB9C();
+ data[0]++;
+ }
+ break;
+ case 3:
+ if (IsLinkTaskFinished())
+ {
+ DestroyTask(taskId);
+ sub_81179A4();
+ }
+ break;
+ }
+}
+
+void sub_8117990(void)
+{
+ CreateTask(sub_8117900, 0);
+}
+
+void sub_81179A4(void)
+{
+ u8 taskId = CreateTask(sub_81175BC, 0);
+ gTasks[taskId].data[0] = 0;
+}
+
+void MEvent_CreateTask_Leader(u32 arg0)
+{
+ u8 taskId;
+ struct UnkStruct_Leader *dataPtr;
+
+ taskId = CreateTask(sub_8117A0C, 0);
+ gUnknown_203B05C.leader = dataPtr = (void*)(gTasks[taskId].data);
+
+ dataPtr->state = 0;
+ dataPtr->textState = 0;
+ dataPtr->field_18 = arg0;
+ gSpecialVar_Result = 0;
+}
+
+void sub_8117A0C(u8 taskId)
+{
+ struct UnkStruct_Leader *data = gUnknown_203B05C.leader;
+ struct WindowTemplate winTemplate;
+ s32 val;
+
+ switch (data->state)
+ {
+ case 0:
+ gUnknown_203B058 = data->field_18;
+ gUnknown_203B059 = 2;
+ sub_80FAF58(data->field_18, 0, 0);
+ sub_80FAF74(FALSE, FALSE);
+ sub_800B1F4();
+ OpenLink();
+ sub_80FBB8C(2);
+ data->state = 1;
+ break;
+ case 1:
+ data->field_4 = AllocZeroed(0x70);
+ data->field_0 = AllocZeroed(0xA0);
+ data->field_8 = AllocZeroed(0xA0);
+ sub_811A650(data->field_4, 4);
+ sub_811A5E4(data->field_0->arr, 5);
+ LinkRfu3_SetGnameUnameFromStaticBuffers(&data->field_0->arr[0].unk.field_0, data->field_0->arr[0].unk.playerName);
+ data->field_0->arr[0].field_18 = 0;
+ data->field_0->arr[0].field_1A_0 = 1;
+ data->field_0->arr[0].field_1A_1 = 0;
+ data->field_0->arr[0].field_1B = 0;
+ data->field_17 = sub_811A054(data->field_4, 0xFF);
+
+ winTemplate = gUnknown_8456CFC;
+ winTemplate.baseBlock = GetMysteryGiftBaseBlock();
+ data->listWindowId = AddWindow(&winTemplate);
+ MG_DrawTextBorder(data->listWindowId);
+ gMultiuseListMenuTemplate = gUnknown_8456D34;
+ gMultiuseListMenuTemplate.windowId = data->listWindowId;
+ data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
+
+ CopyBgTilemapBufferToVram(0);
+ data->field_13 = 1;
+ data->state = 2;
+ break;
+ case 2:
+ StringCopy(gStringVar1, gUnknown_8456C74[gUnknown_203B058]);
+ sub_811599C(gStringVar4, gUnknown_203B058);
+ data->state = 3;
+ break;
+ case 3:
+ AddTextPrinterToWindow1(gStringVar4);
+ data->state = 4;
+ break;
+ case 4:
+ sub_8116444(data, 5, 6);
+ if (gMain.newKeys & B_BUTTON)
+ {
+ data->state = 13;
+ DestroyWirelessStatusIndicatorSprite();
+ }
+ break;
+ case 6:
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gUnknown_84577F8))
+ {
+ data->field_13 = sub_81165E8(data->field_0);
+ RedrawListMenu(data->listTaskId);
+ data->state = 2;
+ }
+ break;
+ case 5:
+ data->state = 7;
+ break;
+ case 7:
+ switch (mevent_message_print_and_prompt_yes_no(&data->textState, (u16 *)&data->field_14, FALSE, gStringVar4))
+ {
+ case 0:
+ LoadWirelessStatusIndicatorSpriteGfx();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ data->field_0->arr[data->field_13].field_1B = 0;
+ RedrawListMenu(data->listTaskId);
+ data->field_19 = 5;
+ sub_80FA670(5, sub_8118658(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ data->state = 8;
+ break;
+ case 1:
+ case -1:
+ data->field_19 = 6;
+ sub_80FA670(6, sub_8118658(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ data->state = 8;
+ break;
+ }
+ break;
+ case 8:
+ val = sub_80FA6FC(sub_8118658(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ if (val == 1)
+ {
+ if (data->field_19 == 5)
+ {
+ data->field_0->arr[data->field_13].field_1B = 0;
+ RedrawListMenu(data->listTaskId);
+ data->field_13++;
+ sub_8018404(gStringVar1, data->field_0->arr[data->field_13 - 1]);
+ StringExpandPlaceholders(gStringVar4, gUnknown_8457554);
+ data->state = 9;
+ sub_80F8F5C();
+ }
+ else
+ {
+ sub_80FBD4C(data->field_0->arr[data->field_13].unk.playerName, sub_8118658(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId));
+ data->field_0->arr[data->field_13].field_1A_0 = 0;
+ sub_81165E8(data->field_0);
+ RedrawListMenu(data->listTaskId);
+ data->state = 2;
+ }
+
+ data->field_19 = 0;
+ }
+ else if (val == 2)
+ {
+ sub_80FB9E4(0, 0);
+ data->state = 2;
+ }
+ break;
+ case 9:
+ AddTextPrinterToWindow1(gStringVar4);
+ data->state = 10;
+ break;
+ case 10:
+ if (++data->field_E > 120)
+ data->state = 11;
+ break;
+ case 11:
+ if (!sub_8116444(data, 5, 6))
+ data->state = 12;
+ break;
+ case 12:
+ if (sub_80F8F40())
+ {
+ sub_80F8F7C(FALSE);
+ data->state = 15;
+ }
+ else
+ {
+ data->state = 6;
+ }
+ break;
+ case 13:
+ DestroyWirelessStatusIndicatorSprite();
+ sub_80F8DC0();
+ DestroyListMenuTask(data->listTaskId, 0, 0);
+ CopyBgTilemapBufferToVram(0);
+ RemoveWindow(data->listWindowId);
+ DestroyTask(data->field_17);
+ Free(data->field_8);
+ Free(data->field_0);
+ Free(data->field_4);
+ data->state++;
+ break;
+ case 14:
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gUnknown_84571B8))
+ {
+ DestroyTask(taskId);
+ gSpecialVar_Result = 5;
+ }
+ break;
+ case 15:
+ if (sub_80FB9F4() == 1 || sub_80FB9F4() == 2)
+ {
+ data->state = 13;
+ }
+ else if (gReceivedRemoteLinkPlayers != 0)
+ {
+ sub_80FAFE0(1);
+ data->state++;
+ }
+ break;
+ case 16:
+ DestroyListMenuTask(data->listTaskId, 0, 0);
+ CopyBgTilemapBufferToVram(0);
+ RemoveWindow(data->listWindowId);
+ DestroyTask(data->field_17);
+ Free(data->field_8);
+ Free(data->field_0);
+ Free(data->field_4);
+ sub_800AB9C();
+ data->state++;
+ break;
+ case 17:
+ if (IsLinkTaskFinished())
+ DestroyTask(taskId);
+ break;
+ }
+}