Document link contest connection

This commit is contained in:
GriffinR 2020-08-13 03:09:47 -04:00
parent aca50c87be
commit 4911849723
32 changed files with 458 additions and 445 deletions

View File

@ -12,9 +12,9 @@ gRecvCmds
gLinkStatus gLinkStatus
gLinkDummy1 gLinkDummy1
gLinkDummy2 gLinkDummy2
gUnknown_030030EC gReadyToExitStandby
gUnknown_030030F0 gReadyToCloseLink
gUnknown_030030F4 gReadyCloseLinkType
gSuppressLinkErrorMessage gSuppressLinkErrorMessage
gWirelessCommType gWirelessCommType
gSavedLinkPlayerCount gSavedLinkPlayerCount

View File

@ -322,7 +322,7 @@ extern u8 gContestMonPartyIndex;
extern u8 gContestPlayerMonIndex; extern u8 gContestPlayerMonIndex;
extern u8 gContestantTurnOrder[CONTESTANT_COUNT]; extern u8 gContestantTurnOrder[CONTESTANT_COUNT];
extern u8 gLinkContestFlags; extern u8 gLinkContestFlags;
extern u8 gUnknown_02039F2B; extern u8 gContestLinkLeaderIndex;
extern u16 gSpecialVar_ContestCategory; extern u16 gSpecialVar_ContestCategory;
extern u16 gSpecialVar_ContestRank; extern u16 gSpecialVar_ContestRank;
extern u8 gNumLinkContestPlayers; extern u8 gNumLinkContestPlayers;
@ -342,7 +342,7 @@ void CreateContestMonFromParty(u8 partyIndex);
void SetContestants(u8 contestType, u8 rank); void SetContestants(u8 contestType, u8 rank);
void SetLinkAIContestants(u8 contestType, u8 rank, bool32 isPostgame); void SetLinkAIContestants(u8 contestType, u8 rank, bool32 isPostgame);
u8 GetContestEntryEligibility(struct Pokemon *pkmn); u8 GetContestEntryEligibility(struct Pokemon *pkmn);
void sub_80DB09C(u8 contestCategory); void CalculateRound1Points(u8 contestCategory);
bool8 IsSpeciesNotUnown(u16 species); bool8 IsSpeciesNotUnown(u16 species);
bool8 Contest_IsMonsTurnDisabled(u8 a); bool8 Contest_IsMonsTurnDisabled(u8 a);
void SaveLinkContestResults(void); void SaveLinkContestResults(void);

View File

@ -1,24 +1,23 @@
#ifndef GUARD_CONTEST_LINK_H #ifndef GUARD_CONTEST_LINK_H
#define GUARD_CONTEST_LINK_H #define GUARD_CONTEST_LINK_H
void sub_80FCC88(u8);
void sub_80FCC88(u8); void sub_80FCC88(u8);
void Task_LinkContest_CommunicateFinalStandings(u8); void Task_LinkContest_CommunicateFinalStandings(u8);
void sub_80FC580(u8); void Task_LinkContest_Init(u8);
void sub_80FC6BC(u8); void Task_LinkContest_CommunicateMonsRS(u8);
void sub_80FC804(u8); void Task_LinkContest_CommunicateRngRS(u8);
void sub_80FCE48(u8); void Task_LinkContest_CommunicateLeaderIdsRS(u8);
void sub_80FC894(u8); void Task_LinkContest_CommunicateCategoryRS(u8);
void Task_LinkContest_CommunicateMonIdxs(u8 taskId); void Task_LinkContest_CommunicateMonIdxs(u8);
void sub_81D9DE4(u8 taskId); void Task_LinkContest_StartCommunicationEm(u8);
void Task_LinkContest_CommunicateRound1Points(u8); void Task_LinkContest_CommunicateRound1Points(u8);
void Task_LinkContest_CommunicateTurnOrder(u8); void Task_LinkContest_CommunicateTurnOrder(u8);
void sub_80F8714(u8); void Task_LinkContest_FinalizeConnection(u8);
bool32 sub_80FC670(s16 *); void Task_LinkContest_CommunicateMoveSelections(u8);
bool32 LinkContest_TryLinkStandby(s16 *);
bool32 LinkContest_SendBlock(void *, u16); bool32 LinkContest_SendBlock(void *, u16);
bool8 LinkContest_GetBlockReceivedFromAllPlayers(void); bool8 LinkContest_GetBlockReceivedFromAllPlayers(void);
bool8 LinkContest_GetBlockReceived(u8); bool8 LinkContest_GetBlockReceived(u8);
u8 sub_80F86E0(u8 *); u8 LinkContest_GetLeaderIndex(u8 *);
void Task_LinkContest_CommunicateMoveSelections(u8 taskId);
#endif //GUARD_CONTEST_LINK_H #endif //GUARD_CONTEST_LINK_H

View File

@ -49,11 +49,11 @@
(((status) & LINK_STAT_ERRORS) >> LINK_STAT_ERRORS_SHIFT) (((status) & LINK_STAT_ERRORS) >> LINK_STAT_ERRORS_SHIFT)
#define LINKCMD_SEND_LINK_TYPE 0x2222 #define LINKCMD_SEND_LINK_TYPE 0x2222
#define LINKCMD_0x2FFE 0x2FFE #define LINKCMD_READY_EXIT_STANDBY 0x2FFE
#define LINKCMD_SEND_HELD_KEYS 0x4444 #define LINKCMD_SEND_HELD_KEYS 0x4444
#define LINKCMD_0x5555 0x5555 #define LINKCMD_0x5555 0x5555
#define LINKCMD_0x5566 0x5566 #define LINKCMD_0x5566 0x5566
#define LINKCMD_0x5FFF 0x5FFF #define LINKCMD_READY_CLOSE_LINK 0x5FFF
#define LINKCMD_0x6666 0x6666 #define LINKCMD_0x6666 0x6666
#define LINKCMD_0x7777 0x7777 #define LINKCMD_0x7777 0x7777
#define LINKCMD_CONT_BLOCK 0x8888 #define LINKCMD_CONT_BLOCK 0x8888
@ -64,7 +64,7 @@
#define LINKCMD_INIT_BLOCK 0xBBBB #define LINKCMD_INIT_BLOCK 0xBBBB
#define LINKCMD_READY_CANCEL_TRADE 0xBBCC #define LINKCMD_READY_CANCEL_TRADE 0xBBCC
#define LINKCMD_SEND_HELD_KEYS_2 0xCAFE #define LINKCMD_SEND_HELD_KEYS_2 0xCAFE
#define LINKCMD_0xCCCC 0xCCCC #define LINKCMD_SEND_BLOCK_REQ 0xCCCC
#define LINKCMD_START_TRADE 0xCCDD #define LINKCMD_START_TRADE 0xCCDD
#define LINKCMD_CONFIRM_FINISH_TRADE 0xDCBA #define LINKCMD_CONFIRM_FINISH_TRADE 0xDCBA
#define LINKCMD_SET_MONS_TO_TRADE 0xDDDD #define LINKCMD_SET_MONS_TO_TRADE 0xDDDD
@ -273,11 +273,11 @@ bool32 InUnionRoom(void);
void LoadWirelessStatusIndicatorSpriteGfx(void); void LoadWirelessStatusIndicatorSpriteGfx(void);
bool8 IsLinkTaskFinished(void); bool8 IsLinkTaskFinished(void);
void CreateWirelessStatusIndicatorSprite(u8, u8); void CreateWirelessStatusIndicatorSprite(u8, u8);
void sub_800ADF8(void); void SetLinkStandbyCallback(void);
void SetWirelessCommType1(void); void SetWirelessCommType1(void);
void CheckShouldAdvanceLinkState(void); void CheckShouldAdvanceLinkState(void);
u8 IsLinkMaster(void); u8 IsLinkMaster(void);
void sub_800AC34(void); void SetCloseLinkCallback(void);
bool8 HandleLinkConnection(void); bool8 HandleLinkConnection(void);
void SetLinkDebugValues(u32 seed, u32 flags); void SetLinkDebugValues(u32 seed, u32 flags);
void sub_800A418(void); void sub_800A418(void);
@ -305,9 +305,9 @@ extern u16 gLinkHeldKeys;
extern u32 gLinkStatus; extern u32 gLinkStatus;
extern u8 gUnknown_030030E4; extern u8 gUnknown_030030E4;
extern u8 gUnknown_030030E8; extern u8 gUnknown_030030E8;
extern u8 gUnknown_030030EC[MAX_LINK_PLAYERS]; extern bool8 gReadyToExitStandby[MAX_LINK_PLAYERS];
extern u8 gUnknown_030030F0[MAX_LINK_PLAYERS]; extern bool8 gReadyToCloseLink[MAX_LINK_PLAYERS];
extern u16 gUnknown_030030F4; extern u16 gReadyCloseLinkType;
extern u8 gSuppressLinkErrorMessage; extern u8 gSuppressLinkErrorMessage;
extern u8 gWirelessCommType; extern u8 gWirelessCommType;
extern bool8 gSavedLinkPlayerCount; extern bool8 gSavedLinkPlayerCount;
@ -334,15 +334,15 @@ bool32 LinkDummy_Return2(void);
void SetLocalLinkPlayerId(u8); void SetLocalLinkPlayerId(u8);
u8 GetSavedPlayerCount(void); u8 GetSavedPlayerCount(void);
void sub_8009FAC(void); void sub_8009FAC(void);
bool8 sub_800A4D8(u8 a0); bool8 SendBlockRequest(u8 type);
u8 GetLinkPlayerCountAsBitFlags(void); u8 GetLinkPlayerCountAsBitFlags(void);
u8 sub_800A0C8(s32, s32); u8 sub_800A0C8(s32, s32);
u8 GetSavedLinkPlayerCountAsBitFlags(void); u8 GetSavedLinkPlayerCountAsBitFlags(void);
void sub_800AD10(void); void SetCloseLinkCallbackHandleJP(void);
void CheckLinkPlayersMatchSaved(void); void CheckLinkPlayersMatchSaved(void);
void StartSendingKeysToLink(void); void StartSendingKeysToLink(void);
bool8 DoesLinkPlayerCountMatchSaved(void); bool8 DoesLinkPlayerCountMatchSaved(void);
void sub_800ABF4(u16 a0); void SetCloseLinkCallbackAndType(u16 type);
bool32 IsSendingKeysToLink(void); bool32 IsSendingKeysToLink(void);
u32 GetLinkRecvQueueLength(void); u32 GetLinkRecvQueueLength(void);

View File

@ -8,11 +8,11 @@
#define RFU_COMMAND_0x4400 0x4400 #define RFU_COMMAND_0x4400 0x4400
#define RFU_COMMAND_0x8800 0x8800 #define RFU_COMMAND_0x8800 0x8800
#define RFU_COMMAND_0x8900 0x8900 #define RFU_COMMAND_0x8900 0x8900
#define RFU_COMMAND_0xA100 0xA100 #define RFU_COMMAND_SEND_BLOCK_REQ 0xA100
#define RFU_COMMAND_0x7700 0x7700 #define RFU_COMMAND_0x7700 0x7700
#define RFU_COMMAND_0x7800 0x7800 #define RFU_COMMAND_0x7800 0x7800
#define RFU_COMMAND_0x6600 0x6600 #define RFU_COMMAND_READY_EXIT_STANDBY 0x6600
#define RFU_COMMAND_0x5F00 0x5F00 #define RFU_COMMAND_READY_CLOSE_LINK 0x5F00
#define RFU_COMMAND_0x2F00 0x2F00 #define RFU_COMMAND_0x2F00 0x2F00
#define RFU_COMMAND_0xBE00 0xBE00 #define RFU_COMMAND_0xBE00 0xBE00
#define RFU_COMMAND_0xEE00 0xEE00 #define RFU_COMMAND_0xEE00 0xEE00
@ -125,7 +125,7 @@ struct GFRfuManager
/* 0x012 */ u16 unk_12; /* 0x012 */ u16 unk_12;
/* 0x014 */ u8 unk_14[RFU_CHILD_MAX][14]; /* 0x014 */ u8 unk_14[RFU_CHILD_MAX][14];
/* 0x04c */ u8 unk_4c[14]; /* 0x04c */ u8 unk_4c[14];
/* 0x05a */ u8 unk_5a; /* 0x05a */ u8 blockRequestType;
/* 0x05b */ u8 unk_5b; /* 0x05b */ u8 unk_5b;
/* 0x05c */ bool8 blockReceived[MAX_RFU_PLAYERS]; /* 0x05c */ bool8 blockReceived[MAX_RFU_PLAYERS];
/* 0x061 */ bool8 numBlocksReceived[MAX_RFU_PLAYERS]; /* 0x061 */ bool8 numBlocksReceived[MAX_RFU_PLAYERS];
@ -134,14 +134,14 @@ struct GFRfuManager
/* 0x068 */ u8 filler_68[4]; /* 0x068 */ u8 filler_68[4];
/* 0x06c */ struct RfuBlockSend sendBlock; /* 0x06c */ struct RfuBlockSend sendBlock;
/* 0x080 */ struct RfuBlockSend recvBlock[MAX_RFU_PLAYERS]; /* 0x080 */ struct RfuBlockSend recvBlock[MAX_RFU_PLAYERS];
/* 0x0e4 */ u8 unk_e4[5]; /* 0x0e4 */ bool8 readyCloseLink[MAX_RFU_PLAYERS];
/* 0x0e9 */ u8 unk_e9[5]; /* 0x0e9 */ bool8 readyExitStandby[MAX_RFU_PLAYERS];
/* 0x0ee */ vu8 errorState; /* 0x0ee */ vu8 errorState;
/* 0x0ef */ bool8 isShuttingDown; /* 0x0ef */ bool8 isShuttingDown;
/* 0x0f0 */ u8 linkLossRecoveryState; /* 0x0f0 */ u8 linkLossRecoveryState;
/* 0x0f1 */ u8 status; /* 0x0f1 */ u8 status;
/* 0x0f2 */ u16 unk_f2[6]; /* 0x0f2 */ u16 unk_f2[6];
/* 0x0fe */ u16 unk_fe; /* 0x0fe */ u16 resendExitStandbyTimer;
/* 0x100 */ u16 unk_100; /* 0x100 */ u16 unk_100;
/* 0x102 */ u8 unk_102; /* 0x102 */ u8 unk_102;
/* 0x103 */ u8 filler_103[0x10A - 0x103]; /* 0x103 */ u8 filler_103[0x10A - 0x103];
@ -203,11 +203,11 @@ bool32 Rfu_InitBlockSend(const u8 *src, size_t size);
void ClearLinkRfuCallback(void); void ClearLinkRfuCallback(void);
u8 Rfu_GetLinkPlayerCount(void); u8 Rfu_GetLinkPlayerCount(void);
u8 Rfu_GetMultiplayerId(void); u8 Rfu_GetMultiplayerId(void);
bool8 sub_8010100(u8 a0); bool8 Rfu_SendBlockRequest(u8 type);
bool8 IsLinkRfuTaskFinished(void); bool8 IsLinkRfuTaskFinished(void);
bool8 Rfu_IsMaster(void); bool8 Rfu_IsMaster(void);
void task_add_05_task_del_08FA224_when_no_RfuFunc(void); void Rfu_SetCloseLinkCallback(void);
void sub_8010434(void); void Rfu_SetLinkStandbyCallback(void);
void ResetLinkRfuGFLayer(void); void ResetLinkRfuGFLayer(void);
void UpdateWirelessStatusIndicatorSprite(void); void UpdateWirelessStatusIndicatorSprite(void);
void InitRFU(void); void InitRFU(void);

View File

@ -886,9 +886,9 @@ void sub_80587B0(void)
if (IsLinkTaskFinished()) if (IsLinkTaskFinished())
{ {
if (gWirelessCommType == 0) if (gWirelessCommType == 0)
sub_800AC34(); SetCloseLinkCallback();
else else
sub_800ADF8(); SetLinkStandbyCallback();
gBattlerControllerFuncs[gActiveBattler] = sub_80586F8; gBattlerControllerFuncs[gActiveBattler] = sub_80586F8;
} }

View File

@ -1484,9 +1484,9 @@ static void CB2_PreInitMultiBattle(void)
{ {
gBattleCommunication[MULTIUSE_STATE]++; gBattleCommunication[MULTIUSE_STATE]++;
if (gWirelessCommType) if (gWirelessCommType)
sub_800ADF8(); SetLinkStandbyCallback();
else else
sub_800AC34(); SetCloseLinkCallback();
} }
break; break;
case 3: case 3:
@ -2368,7 +2368,7 @@ static void sub_8038F34(void)
case 6: case 6:
if (IsLinkTaskFinished() == TRUE) if (IsLinkTaskFinished() == TRUE)
{ {
sub_800ADF8(); SetLinkStandbyCallback();
BattlePutTextOnWindow(gText_LinkStandby3, 0); BattlePutTextOnWindow(gText_LinkStandby3, 0);
gBattleCommunication[MULTIUSE_STATE]++; gBattleCommunication[MULTIUSE_STATE]++;
} }
@ -2382,7 +2382,7 @@ static void sub_8038F34(void)
break; break;
case 8: case 8:
if (!gWirelessCommType) if (!gWirelessCommType)
sub_800AC34(); SetCloseLinkCallback();
gBattleCommunication[MULTIUSE_STATE]++; gBattleCommunication[MULTIUSE_STATE]++;
break; break;
case 9: case 9:
@ -2556,7 +2556,7 @@ static void sub_803939C(void)
HandleBattleWindow(0x18, 8, 0x1D, 0xD, WINDOW_CLEAR); HandleBattleWindow(0x18, 8, 0x1D, 0xD, WINDOW_CLEAR);
if (gMain.field_439_x4) if (gMain.field_439_x4)
{ {
sub_800ADF8(); SetLinkStandbyCallback();
BattlePutTextOnWindow(gText_LinkStandby3, 0); BattlePutTextOnWindow(gText_LinkStandby3, 0);
} }
gBattleCommunication[MULTIUSE_STATE]++; gBattleCommunication[MULTIUSE_STATE]++;
@ -2566,7 +2566,7 @@ static void sub_803939C(void)
if (--gBattleCommunication[1] == 0) if (--gBattleCommunication[1] == 0)
{ {
if (gMain.field_439_x4 && !gWirelessCommType) if (gMain.field_439_x4 && !gWirelessCommType)
sub_800AC34(); SetCloseLinkCallback();
gBattleCommunication[MULTIUSE_STATE]++; gBattleCommunication[MULTIUSE_STATE]++;
} }
break; break;
@ -2605,7 +2605,7 @@ static void sub_803939C(void)
{ {
if (gMain.field_439_x4) if (gMain.field_439_x4)
{ {
sub_800ADF8(); SetLinkStandbyCallback();
BattlePutTextOnWindow(gText_LinkStandby3, 0); BattlePutTextOnWindow(gText_LinkStandby3, 0);
} }
gBattleCommunication[MULTIUSE_STATE]++; gBattleCommunication[MULTIUSE_STATE]++;

View File

@ -2627,7 +2627,7 @@ static void LoadLinkMultiOpponentsData(void)
} }
break; break;
case 4: case 4:
sub_800AC34(); SetCloseLinkCallback();
gSpecialVar_Result = 5; gSpecialVar_Result = 5;
break; break;
case 5: case 5:
@ -2644,7 +2644,7 @@ static void LoadLinkMultiOpponentsData(void)
static void sub_8164DCC(void) static void sub_8164DCC(void)
{ {
if (gWirelessCommType != 0) if (gWirelessCommType != 0)
sub_800AC34(); SetCloseLinkCallback();
} }
static void SetMultiPartnerGfx(void) static void SetMultiPartnerGfx(void)

View File

@ -1230,7 +1230,7 @@ static void sub_8080018(void)
sBerryBlenderData->field_114 = 0; sBerryBlenderData->field_114 = 0;
Blender_CopyBerryData(&sBerryBlenderData->blendedBerries[0], gSpecialVar_ItemId); Blender_CopyBerryData(&sBerryBlenderData->blendedBerries[0], gSpecialVar_ItemId);
memcpy(gBlockSendBuffer, &sBerryBlenderData->blendedBerries[0], sizeof(struct BlenderBerry)); memcpy(gBlockSendBuffer, &sBerryBlenderData->blendedBerries[0], sizeof(struct BlenderBerry));
sub_800ADF8(); SetLinkStandbyCallback();
sBerryBlenderData->framesToWait = 0; sBerryBlenderData->framesToWait = 0;
break; break;
case 9: case 9:
@ -1238,7 +1238,7 @@ static void sub_8080018(void)
{ {
ResetBlockReceivedFlags(); ResetBlockReceivedFlags();
if (GetMultiplayerId() == 0) if (GetMultiplayerId() == 0)
sub_800A4D8(4); SendBlockRequest(4);
sBerryBlenderData->mainState++; sBerryBlenderData->mainState++;
} }
break; break;
@ -1332,7 +1332,7 @@ static void sub_8080018(void)
sBerryBlenderData->mainState++; sBerryBlenderData->mainState++;
break; break;
case 19: case 19:
sub_800ADF8(); SetLinkStandbyCallback();
sBerryBlenderData->mainState++; sBerryBlenderData->mainState++;
break; break;
case 20: case 20:
@ -2587,7 +2587,7 @@ static bool8 LinkPlayAgainHandleSaving(void)
switch (sBerryBlenderData->field_1A0) switch (sBerryBlenderData->field_1A0)
{ {
case 0: case 0:
sub_800ADF8(); SetLinkStandbyCallback();
sBerryBlenderData->field_1A0 = 1; sBerryBlenderData->field_1A0 = 1;
sBerryBlenderData->framesToWait = 0; sBerryBlenderData->framesToWait = 0;
break; break;
@ -2606,7 +2606,7 @@ static bool8 LinkPlayAgainHandleSaving(void)
case 3: case 3:
if (++sBerryBlenderData->framesToWait == 10) if (++sBerryBlenderData->framesToWait == 10)
{ {
sub_800ADF8(); SetLinkStandbyCallback();
sBerryBlenderData->field_1A0++; sBerryBlenderData->field_1A0++;
} }
break; break;
@ -2682,7 +2682,7 @@ static void CB2_HandlePlayerLinkPlayAgainChoice(void)
break; break;
case 5: case 5:
Blender_PrintText(&sBerryBlenderData->textState, gText_SavingDontTurnOff2, 0); Blender_PrintText(&sBerryBlenderData->textState, gText_SavingDontTurnOff2, 0);
sub_800ADF8(); SetLinkStandbyCallback();
sBerryBlenderData->gameEndState++; sBerryBlenderData->gameEndState++;
break; break;
case 6: case 6:
@ -2702,7 +2702,7 @@ static void CB2_HandlePlayerLinkPlayAgainChoice(void)
break; break;
case 8: case 8:
sBerryBlenderData->gameEndState++; sBerryBlenderData->gameEndState++;
sub_800ADF8(); SetLinkStandbyCallback();
break; break;
case 9: case 9:
if (IsLinkTaskFinished()) if (IsLinkTaskFinished())
@ -2732,7 +2732,7 @@ static void CB2_HandlePlayerLinkPlayAgainChoice(void)
case 11: case 11:
if (++sBerryBlenderData->framesToWait > 30) if (++sBerryBlenderData->framesToWait > 30)
{ {
sub_800AC34(); SetCloseLinkCallback();
sBerryBlenderData->gameEndState++; sBerryBlenderData->gameEndState++;
} }
break; break;

View File

@ -1125,7 +1125,7 @@ int sub_802130C(void)
switch (var0->unkC) switch (var0->unkC)
{ {
case 0: case 0:
sub_8010434(); Rfu_SetLinkStandbyCallback();
break; break;
case 1: case 1:
if (!IsLinkTaskFinished()) if (!IsLinkTaskFinished())
@ -2027,7 +2027,7 @@ static u32 sub_8022CB0(struct BerryCrushGame *r4, u8 *r5)
r4->unkC = 3; r4->unkC = 3;
return 0; return 0;
case 1: case 1:
sub_8010434(); Rfu_SetLinkStandbyCallback();
++r4->unkC; ++r4->unkC;
return 0; return 0;
case 2: case 2:
@ -2110,7 +2110,7 @@ static u32 sub_8022E5C(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1
switch (r4->unkC) switch (r4->unkC)
{ {
case 0: case 0:
sub_8010434(); Rfu_SetLinkStandbyCallback();
break; break;
case 1: case 1:
if (IsLinkTaskFinished()) if (IsLinkTaskFinished())
@ -2167,7 +2167,7 @@ static u32 sub_8022F1C(struct BerryCrushGame *r5, u8 *r2)
sub_8022BEC(3, 1, NULL); sub_8022BEC(3, 1, NULL);
return 0; return 0;
case 1: case 1:
sub_8010434(); Rfu_SetLinkStandbyCallback();
break; break;
case 2: case 2:
if (!IsLinkTaskFinished()) if (!IsLinkTaskFinished())
@ -2213,7 +2213,7 @@ static u32 sub_8023070(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r
{ {
case 0: case 0:
sub_80214A8(r4, &r4->unk138); sub_80214A8(r4, &r4->unk138);
sub_8010434(); Rfu_SetLinkStandbyCallback();
break; break;
case 1: case 1:
if (!IsLinkTaskFinished()) if (!IsLinkTaskFinished())
@ -2233,7 +2233,7 @@ static u32 sub_8023070(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r
return 0; return 0;
r4->unk138.unk38[r4->unk138.unk0] = NULL; r4->unk138.unk38[r4->unk138.unk0] = NULL;
++r4->unk138.unk0; ++r4->unk138.unk0;
sub_8010434(); Rfu_SetLinkStandbyCallback();
break; break;
case 4: case 4:
if (!IsLinkTaskFinished()) if (!IsLinkTaskFinished())
@ -2247,7 +2247,7 @@ static u32 sub_8023070(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r
break; break;
case 5: case 5:
sub_80216A8(r4, &r4->unk138); sub_80216A8(r4, &r4->unk138);
sub_8010434(); Rfu_SetLinkStandbyCallback();
break; break;
case 6: case 6:
if (!IsLinkTaskFinished()) if (!IsLinkTaskFinished())
@ -2295,7 +2295,7 @@ static u32 sub_80231B8(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r
SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0);
SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0);
SetGpuReg(REG_OFFSET_BG3VOFS, 0); SetGpuReg(REG_OFFSET_BG3VOFS, 0);
sub_8010434(); Rfu_SetLinkStandbyCallback();
break; break;
case 3: case 3:
if (!IsLinkTaskFinished()) if (!IsLinkTaskFinished())
@ -2323,7 +2323,7 @@ static u32 sub_80232EC(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r
return 0; return 0;
// fallthrough // fallthrough
case 0: case 0:
sub_8010434(); Rfu_SetLinkStandbyCallback();
break; break;
case 3: case 3:
if (!IsLinkTaskFinished()) if (!IsLinkTaskFinished())
@ -2703,7 +2703,7 @@ static u32 sub_8023A30(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1
case 4: case 4:
if (!sub_80218D4(r4, &r4->unk138)) if (!sub_80218D4(r4, &r4->unk138))
return 0; return 0;
sub_8010434(); Rfu_SetLinkStandbyCallback();
r4->unk10 = 0; r4->unk10 = 0;
break; break;
case 5: case 5:
@ -2737,7 +2737,7 @@ static u32 sub_8023BC0(struct BerryCrushGame *r5, u8 *r6)
case 2: case 2:
if (!sub_80218D4(r5, &r5->unk138)) if (!sub_80218D4(r5, &r5->unk138))
return 0; return 0;
sub_8010434(); Rfu_SetLinkStandbyCallback();
r5->unk10 = 0; r5->unk10 = 0;
SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0);
SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0);
@ -3005,7 +3005,7 @@ static u32 sub_8024134(struct BerryCrushGame *r5, u8 *r4)
r5->unkC = 0; r5->unkC = 0;
return 0; return 0;
case 1: case 1:
sub_8010434(); Rfu_SetLinkStandbyCallback();
break; break;
case 2: case 2:
if (!IsLinkTaskFinished()) if (!IsLinkTaskFinished())
@ -3084,7 +3084,7 @@ static u32 sub_80242E0(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1
switch (r4->unkC) switch (r4->unkC)
{ {
case 0: case 0:
sub_8010434(); Rfu_SetLinkStandbyCallback();
break; break;
case 1: case 1:
if (!IsLinkTaskFinished()) if (!IsLinkTaskFinished())
@ -3184,12 +3184,12 @@ static u32 sub_8024508(struct BerryCrushGame *r5, __attribute__((unused)) u8 *r1
switch (r5->unkC) switch (r5->unkC)
{ {
case 0: case 0:
sub_8010434(); Rfu_SetLinkStandbyCallback();
break; break;
case 1: case 1:
if (!IsLinkTaskFinished()) if (!IsLinkTaskFinished())
return 0; return 0;
sub_800AC34(); SetCloseLinkCallback();
break; break;
case 2: case 2:
if (gReceivedRemoteLinkPlayers != 0) if (gReceivedRemoteLinkPlayers != 0)

View File

@ -203,7 +203,7 @@ static void sub_80B2600(u8 taskId)
gTasks[taskId].data[0]++; gTasks[taskId].data[0]++;
if (gTasks[taskId].data[0] == 10) if (gTasks[taskId].data[0] == 10)
{ {
sub_800A4D8(2); SendBlockRequest(2);
DestroyTask(taskId); DestroyTask(taskId);
} }
} }
@ -357,7 +357,7 @@ static void Task_LinkupExchangeDataWithLeader(u8 taskId)
if (gSpecialVar_Result == LINKUP_DIFF_SELECTIONS if (gSpecialVar_Result == LINKUP_DIFF_SELECTIONS
|| gSpecialVar_Result == LINKUP_WRONG_NUM_PLAYERS) || gSpecialVar_Result == LINKUP_WRONG_NUM_PLAYERS)
{ {
sub_800AC34(); SetCloseLinkCallback();
HideFieldMessageBox(); HideFieldMessageBox();
gTasks[taskId].func = Task_StopLinkup; gTasks[taskId].func = Task_StopLinkup;
} }
@ -392,7 +392,7 @@ static void Task_LinkupCheckStatusAfterConfirm(u8 taskId)
{ {
if (!Link_AnyPartnersPlayingRubyOrSapphire()) if (!Link_AnyPartnersPlayingRubyOrSapphire())
{ {
sub_800AC34(); SetCloseLinkCallback();
HideFieldMessageBox(); HideFieldMessageBox();
gTasks[taskId].func = Task_StopLinkup; gTasks[taskId].func = Task_StopLinkup;
} }
@ -405,7 +405,7 @@ static void Task_LinkupCheckStatusAfterConfirm(u8 taskId)
} }
else if (gSpecialVar_Result == LINKUP_DIFF_SELECTIONS) else if (gSpecialVar_Result == LINKUP_DIFF_SELECTIONS)
{ {
sub_800AC34(); SetCloseLinkCallback();
HideFieldMessageBox(); HideFieldMessageBox();
gTasks[taskId].func = Task_StopLinkup; gTasks[taskId].func = Task_StopLinkup;
} }
@ -426,7 +426,7 @@ static void Task_LinkupCheckStatusAfterConfirm(u8 taskId)
card->monSpecies[0] = GetMonData(&gPlayerParty[gSelectedOrderFromParty[0] - 1], MON_DATA_SPECIES, NULL); card->monSpecies[0] = GetMonData(&gPlayerParty[gSelectedOrderFromParty[0] - 1], MON_DATA_SPECIES, NULL);
card->monSpecies[1] = GetMonData(&gPlayerParty[gSelectedOrderFromParty[1] - 1], MON_DATA_SPECIES, NULL); card->monSpecies[1] = GetMonData(&gPlayerParty[gSelectedOrderFromParty[1] - 1], MON_DATA_SPECIES, NULL);
gTasks[taskId].func = Task_LinkupAwaitTrainerCardData; gTasks[taskId].func = Task_LinkupAwaitTrainerCardData;
sub_800A4D8(2); SendBlockRequest(2);
} }
} }
@ -481,7 +481,7 @@ static void FinishLinkup(u16 *linkupStatus, u32 taskId)
{ {
// Unsuccessful battle tower linkup // Unsuccessful battle tower linkup
*linkupStatus = LINKUP_FAILED_BATTLE_TOWER; *linkupStatus = LINKUP_FAILED_BATTLE_TOWER;
sub_800AC34(); SetCloseLinkCallback();
gTasks[taskId].func = Task_StopLinkup; gTasks[taskId].func = Task_StopLinkup;
} }
else else
@ -503,7 +503,7 @@ static void FinishLinkup(u16 *linkupStatus, u32 taskId)
else else
{ {
// Unsuccessful linkup // Unsuccessful linkup
sub_800AC34(); SetCloseLinkCallback();
gTasks[taskId].func = Task_StopLinkup; gTasks[taskId].func = Task_StopLinkup;
} }
} }
@ -686,7 +686,7 @@ static void Task_ValidateMixingGameLanguage(u8 taskId)
if (mixingForeignGames) if (mixingForeignGames)
{ {
gSpecialVar_Result = LINKUP_FOREIGN_GAME; gSpecialVar_Result = LINKUP_FOREIGN_GAME;
sub_800AD10(); SetCloseLinkCallbackHandleJP();
gTasks[taskId].tState = 1; gTasks[taskId].tState = 1;
return; return;
} }
@ -856,7 +856,7 @@ static void Task_StartWiredCableClubBattle(u8 taskId)
task->tState++; task->tState++;
break; break;
case 3: case 3:
sub_800AC34(); SetCloseLinkCallback();
task->tState++; task->tState++;
break; break;
case 4: case 4:
@ -919,7 +919,7 @@ static void Task_StartWirelessCableClubBattle(u8 taskId)
tState = 5; tState = 5;
break; break;
case 5: case 5:
sub_800ADF8(); SetLinkStandbyCallback();
tState = 6; tState = 6;
break; break;
case 6: case 6:
@ -974,7 +974,7 @@ static void CB2_ReturnFromUnionRoomBattle(void)
} }
else else
{ {
sub_800AC34(); SetCloseLinkCallback();
gMain.state = 1; gMain.state = 1;
} }
break; break;
@ -1113,7 +1113,7 @@ static void Task_StartWiredTrade(u8 taskId)
gSelectedTradeMonPositions[TRADE_PLAYER] = 0; gSelectedTradeMonPositions[TRADE_PLAYER] = 0;
gSelectedTradeMonPositions[TRADE_PARTNER] = 0; gSelectedTradeMonPositions[TRADE_PARTNER] = 0;
m4aMPlayAllStop(); m4aMPlayAllStop();
sub_800AC34(); SetCloseLinkCallback();
task->tState++; task->tState++;
break; break;
case 3: case 3:
@ -1146,7 +1146,7 @@ static void Task_StartWirelessTrade(u8 taskId)
gSelectedTradeMonPositions[TRADE_PLAYER] = 0; gSelectedTradeMonPositions[TRADE_PLAYER] = 0;
gSelectedTradeMonPositions[TRADE_PARTNER] = 0; gSelectedTradeMonPositions[TRADE_PARTNER] = 0;
m4aMPlayAllStop(); m4aMPlayAllStop();
sub_800ADF8(); SetLinkStandbyCallback();
tState++; tState++;
break; break;
case 3: case 3:
@ -1264,7 +1264,7 @@ static void sub_80B3AAC(u8 taskId)
// Unused // Unused
static void sub_80B3AD0(u8 taskId) static void sub_80B3AD0(u8 taskId)
{ {
sub_800AC34(); SetCloseLinkCallback();
gTasks[taskId].func = sub_80B3AAC; gTasks[taskId].func = sub_80B3AAC;
} }

View File

@ -69,7 +69,7 @@ static void Task_EndCommunicateMoveSelections(u8 taskId);
static void Task_HideMoveSelectScreen(u8 taskId); static void Task_HideMoveSelectScreen(u8 taskId);
static void Task_HideApplauseMeterForAppealStart(u8 taskId); static void Task_HideApplauseMeterForAppealStart(u8 taskId);
static void Task_WaitHideApplauseMeterForAppealStart(u8 taskId); static void Task_WaitHideApplauseMeterForAppealStart(u8 taskId);
static void sub_80D8A88(u8 taskId); static void Task_AppealSetup(u8 taskId);
static void Task_DoAppeals(u8 taskId); static void Task_DoAppeals(u8 taskId);
static void sub_80DA110(u8); static void sub_80DA110(u8);
static void sub_80DA134(struct Sprite *); static void sub_80DA134(struct Sprite *);
@ -94,7 +94,7 @@ static void Task_CommunicateFinalStandings(u8);
static void Task_EndCommunicateFinalStandings(u8); static void Task_EndCommunicateFinalStandings(u8);
static void Task_ContestReturnToField(u8); static void Task_ContestReturnToField(u8);
static void FieldCB_ContestReturnToField(void); static void FieldCB_ContestReturnToField(void);
static bool8 sub_80DA8A4(void); static bool8 IsPlayerLinkLeader(void);
static void PrintContestantTrainerName(u8); static void PrintContestantTrainerName(u8);
static void PrintContestantTrainerNameWithColor(u8 a0, u8 a1); static void PrintContestantTrainerNameWithColor(u8 a0, u8 a1);
static void PrintContestantMonName(u8); static void PrintContestantMonName(u8);
@ -250,7 +250,7 @@ EWRAM_DATA u8 gContestantTurnOrder[CONTESTANT_COUNT] = {0};
EWRAM_DATA u8 gLinkContestFlags = 0; EWRAM_DATA u8 gLinkContestFlags = 0;
// Bit 0: Is a link contest // Bit 0: Is a link contest
// Bit 1: Link contest uses wireless adapter // Bit 1: Link contest uses wireless adapter
EWRAM_DATA u8 gUnknown_02039F2B = 0; EWRAM_DATA u8 gContestLinkLeaderIndex = 0;
EWRAM_DATA u16 gSpecialVar_ContestCategory = 0; EWRAM_DATA u16 gSpecialVar_ContestCategory = 0;
EWRAM_DATA u16 gSpecialVar_ContestRank = 0; EWRAM_DATA u16 gSpecialVar_ContestRank = 0;
EWRAM_DATA u8 gNumLinkContestPlayers = 0; EWRAM_DATA u8 gNumLinkContestPlayers = 0;
@ -1118,7 +1118,7 @@ static void Task_TryStartLinkContest(u8 taskId)
case 1: case 1:
if (IsLinkTaskFinished()) if (IsLinkTaskFinished())
{ {
sub_800ADF8(); SetLinkStandbyCallback();
gTasks[taskId].data[0]++; gTasks[taskId].data[0]++;
} }
return; return;
@ -1566,16 +1566,16 @@ static void Task_HideApplauseMeterForAppealStart(u8 taskId)
static void Task_WaitHideApplauseMeterForAppealStart(u8 taskId) static void Task_WaitHideApplauseMeterForAppealStart(u8 taskId)
{ {
if (!eContest.applauseMeterIsMoving && !eContest.sliderHeartsAnimating) if (!eContest.applauseMeterIsMoving && !eContest.sliderHeartsAnimating)
gTasks[taskId].func = sub_80D8A88; gTasks[taskId].func = Task_AppealSetup;
} }
static void sub_80D8A88(u8 taskId) static void Task_AppealSetup(u8 taskId)
{ {
if (++gTasks[taskId].data[0] > 19) if (++gTasks[taskId].data[0] > 19)
{ {
eContest.turnNumber = 0; eContest.turnNumber = 0;
eContest.unk1921C = gRngValue; eContest.unk1921C = gRngValue;
if ((gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) && sub_80DA8A4()) if ((gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) && IsPlayerLinkLeader())
{ {
s32 i; s32 i;
@ -1611,7 +1611,7 @@ static void Task_DoAppeals(u8 taskId)
u8 taskId2; u8 taskId2;
eContest.unk1920B_2 = 1; eContest.unk1920B_2 = 1;
if (sub_80DA8A4()) if (IsPlayerLinkLeader())
sub_80DD080(eContest.currentContestant); sub_80DD080(eContest.currentContestant);
taskId2 = CreateTask(sub_80FCC88, 0); taskId2 = CreateTask(sub_80FCC88, 0);
SetTaskFuncWithFollowupFunc(taskId2, sub_80FCC88, sub_80DA110); SetTaskFuncWithFollowupFunc(taskId2, sub_80FCC88, sub_80DA110);
@ -2339,7 +2339,7 @@ static void sub_80DA198(u8 taskId)
u8 taskId2; u8 taskId2;
eContest.unk1920B_2 = 1; eContest.unk1920B_2 = 1;
if (sub_80DA8A4()) if (IsPlayerLinkLeader())
{ {
RankContestants(); RankContestants();
SetAttentionLevels(); SetAttentionLevels();
@ -2619,9 +2619,9 @@ static void TryPutPlayerLast(void)
gContestPlayerMonIndex = CONTESTANT_COUNT - 1; gContestPlayerMonIndex = CONTESTANT_COUNT - 1;
} }
static bool8 sub_80DA8A4(void) static bool8 IsPlayerLinkLeader(void)
{ {
if (gContestPlayerMonIndex == gUnknown_02039F2B) if (gContestPlayerMonIndex == gContestLinkLeaderIndex)
return TRUE; return TRUE;
return FALSE; return FALSE;
} }
@ -2902,7 +2902,7 @@ static void PrintContestantMonNameWithColor(u8 contestant, u8 color)
Contest_PrintTextToBg0WindowAt(gContestantTurnOrder[contestant], gDisplayedStringBattle, 5, 1, 7); Contest_PrintTextToBg0WindowAt(gContestantTurnOrder[contestant], gDisplayedStringBattle, 5, 1, 7);
} }
static u16 sub_80DAFE0(u8 who, u8 contestCategory) static u16 CalculateContestantRound1Points(u8 who, u8 contestCategory)
{ {
u8 statMain; u8 statMain;
u8 statSub1; u8 statSub1;
@ -2940,12 +2940,12 @@ static u16 sub_80DAFE0(u8 who, u8 contestCategory)
return statMain + (statSub1 + statSub2 + gContestMons[who].sheen) / 2; return statMain + (statSub1 + statSub2 + gContestMons[who].sheen) / 2;
} }
void sub_80DB09C(u8 contestCategory) void CalculateRound1Points(u8 contestCategory)
{ {
s32 i; s32 i;
for (i = 0; i < CONTESTANT_COUNT; i++) for (i = 0; i < CONTESTANT_COUNT; i++)
gContestMonRound1Points[i] = sub_80DAFE0(i, contestCategory); gContestMonRound1Points[i] = CalculateContestantRound1Points(i, contestCategory);
} }
static u8 sub_80DB0C4(void) static u8 sub_80DB0C4(void)
@ -4252,13 +4252,12 @@ static void sub_80DD080(u8 contestant)
u16 move; u16 move;
u8 effect; u8 effect;
u8 rnd; u8 rnd;
bool8 r8; bool8 canUseTurn;
s32 i; s32 i;
eContestantStatus[contestant].appeal2 = 0; eContestantStatus[contestant].appeal2 = 0;
eContestantStatus[contestant].appeal1 = 0; eContestantStatus[contestant].appeal1 = 0;
r8 = ContestantCanUseTurn(contestant); if (!ContestantCanUseTurn(contestant))
if (!r8)
return; return;
move = eContestantStatus[contestant].currMove; move = eContestantStatus[contestant].currMove;
@ -4974,7 +4973,7 @@ static void sub_80DE4A8(u8 taskId)
u8 taskId2; u8 taskId2;
eContest.unk1920B_2 = 1; eContest.unk1920B_2 = 1;
if (sub_80DA8A4()) if (IsPlayerLinkLeader())
sub_80DBAA0(); sub_80DBAA0();
taskId2 = CreateTask(sub_80FCC88, 0); taskId2 = CreateTask(sub_80FCC88, 0);
SetTaskFuncWithFollowupFunc(taskId2, sub_80FCC88, sub_80DA110); SetTaskFuncWithFollowupFunc(taskId2, sub_80FCC88, sub_80DA110);

View File

@ -9,8 +9,8 @@
#include "contest_link.h" #include "contest_link.h"
#include "constants/flags.h" #include "constants/flags.h"
static void sub_80FC5C0(u8); static void Task_LinkContest_StartInitFlags(u8);
static void sub_80FC5DC(u8); static void Task_LinkContest_InitFlags(u8);
#define tState data[0] #define tState data[0]
#define tCategory data[9] #define tCategory data[9]
@ -52,7 +52,7 @@ bool8 LinkContest_GetBlockReceivedFromAllPlayers(void)
} }
} }
void sub_80FC580(u8 taskId) void Task_LinkContest_Init(u8 taskId)
{ {
u8 i; u8 i;
@ -60,15 +60,15 @@ void sub_80FC580(u8 taskId)
gBlockRecvBuffer[i][0] = 0xFF; gBlockRecvBuffer[i][0] = 0xFF;
gTasks[taskId].tState = 0; gTasks[taskId].tState = 0;
gTasks[taskId].func = sub_80FC5C0; gTasks[taskId].func = Task_LinkContest_StartInitFlags;
} }
static void sub_80FC5C0(u8 taskId) static void Task_LinkContest_StartInitFlags(u8 taskId)
{ {
gTasks[taskId].func = sub_80FC5DC; gTasks[taskId].func = Task_LinkContest_InitFlags;
} }
static void sub_80FC5DC(u8 taskId) static void Task_LinkContest_InitFlags(u8 taskId)
{ {
int i; int i;
@ -91,8 +91,9 @@ static void sub_80FC5DC(u8 taskId)
SwitchTaskToFollowupFunc(taskId); SwitchTaskToFollowupFunc(taskId);
} }
bool32 sub_80FC670(s16 *state) bool32 LinkContest_TryLinkStandby(s16 *state)
{ {
// Skip standby for RS cabled links
if (gLinkContestFlags & LINK_CONTEST_FLAG_HAS_RS_PLAYER) if (gLinkContestFlags & LINK_CONTEST_FLAG_HAS_RS_PLAYER)
return TRUE; return TRUE;
@ -101,7 +102,7 @@ bool32 sub_80FC670(s16 *state)
case 0: case 0:
if (IsLinkTaskFinished()) if (IsLinkTaskFinished())
{ {
sub_800ADF8(); SetLinkStandbyCallback();
(*state)++; (*state)++;
} }
return FALSE; return FALSE;
@ -116,16 +117,17 @@ bool32 sub_80FC670(s16 *state)
} }
} }
void sub_80FC6BC(u8 taskId) void Task_LinkContest_CommunicateMonsRS(u8 taskId)
{ {
int i; int i;
if (!sub_80FC670(&gTasks[taskId].data[12])) if (!LinkContest_TryLinkStandby(&gTasks[taskId].data[12]))
return; return;
switch (gTasks[taskId].tState) switch (gTasks[taskId].tState)
{ {
case 0: case 0:
// Send players mon
if (GetMultiplayerId() == 0) if (GetMultiplayerId() == 0)
{ {
if (IsLinkTaskFinished()) if (IsLinkTaskFinished())
@ -141,6 +143,7 @@ void sub_80FC6BC(u8 taskId)
} }
break; break;
case 1: case 1:
// Wait for other players data
if (LinkContest_GetBlockReceivedFromAllPlayers()) if (LinkContest_GetBlockReceivedFromAllPlayers())
{ {
for (i = 0; i < gNumLinkContestPlayers; i++) for (i = 0; i < gNumLinkContestPlayers; i++)
@ -153,9 +156,10 @@ void sub_80FC6BC(u8 taskId)
} }
break; break;
case 10: case 10:
// Only if leader. Request other players data
if (++gTasks[taskId].tTimer > 300) if (++gTasks[taskId].tTimer > 300)
{ {
sub_800A4D8(2); SendBlockRequest(2);
gTasks[taskId].tState = 1; gTasks[taskId].tState = 1;
} }
break; break;
@ -168,7 +172,7 @@ void sub_80FC6BC(u8 taskId)
} }
} }
void sub_80FC804(u8 taskId) void Task_LinkContest_CommunicateRngRS(u8 taskId)
{ {
switch (gTasks[taskId].tState) switch (gTasks[taskId].tState)
{ {
@ -198,11 +202,11 @@ void sub_80FC804(u8 taskId)
} }
} }
void sub_80FC894(u8 taskId) void Task_LinkContest_CommunicateCategoryRS(u8 taskId)
{ {
int i; int i;
if (!sub_80FC670(&gTasks[taskId].data[12])) if (!LinkContest_TryLinkStandby(&gTasks[taskId].data[12]))
return; return;
switch (gTasks[taskId].tState) switch (gTasks[taskId].tState)
@ -231,7 +235,7 @@ void sub_80FC894(u8 taskId)
case 10: case 10:
if (++gTasks[taskId].tTimer > 10) if (++gTasks[taskId].tTimer > 10)
{ {
sub_800A4D8(2); SendBlockRequest(2);
gTasks[taskId].tState = 1; gTasks[taskId].tState = 1;
} }
break; break;
@ -311,7 +315,7 @@ void Task_LinkContest_CommunicateFinalStandings(u8 taskId)
case 1: case 1:
if (LinkContest_GetBlockReceivedFromAllPlayers()) if (LinkContest_GetBlockReceivedFromAllPlayers())
{ {
memcpy(gContestMonTotalPoints, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestMonTotalPoints)); memcpy(gContestMonTotalPoints, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof(gContestMonTotalPoints));
gTasks[taskId].tState++; gTasks[taskId].tState++;
} }
break; break;
@ -335,7 +339,7 @@ void Task_LinkContest_CommunicateFinalStandings(u8 taskId)
case 4: case 4:
if (LinkContest_GetBlockReceivedFromAllPlayers()) if (LinkContest_GetBlockReceivedFromAllPlayers())
{ {
memcpy(gContestMonAppealPointTotals, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestMonAppealPointTotals)); memcpy(gContestMonAppealPointTotals, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof(gContestMonAppealPointTotals));
gTasks[taskId].tState++; gTasks[taskId].tState++;
} }
break; break;
@ -349,7 +353,7 @@ void Task_LinkContest_CommunicateFinalStandings(u8 taskId)
case 7: case 7:
if (LinkContest_GetBlockReceivedFromAllPlayers()) if (LinkContest_GetBlockReceivedFromAllPlayers())
{ {
memcpy(gContestMonRound2Points, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestMonRound2Points)); memcpy(gContestMonRound2Points, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof(gContestMonRound2Points));
gTasks[taskId].tState++; gTasks[taskId].tState++;
} }
break; break;
@ -363,7 +367,7 @@ void Task_LinkContest_CommunicateFinalStandings(u8 taskId)
case 10: case 10:
if (LinkContest_GetBlockReceivedFromAllPlayers()) if (LinkContest_GetBlockReceivedFromAllPlayers())
{ {
memcpy(gContestFinalStandings, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestFinalStandings)); memcpy(gContestFinalStandings, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof(gContestFinalStandings));
gTasks[taskId].tState++; gTasks[taskId].tState++;
} }
break; break;
@ -388,7 +392,7 @@ void sub_80FCC88(u8 taskId)
case 1: case 1:
if (LinkContest_GetBlockReceivedFromAllPlayers()) if (LinkContest_GetBlockReceivedFromAllPlayers())
{ {
memcpy(eContestantStatus, gBlockRecvBuffer[gUnknown_02039F2B], CONTESTANT_COUNT * sizeof(struct ContestantStatus)); memcpy(eContestantStatus, gBlockRecvBuffer[gContestLinkLeaderIndex], CONTESTANT_COUNT * sizeof(struct ContestantStatus));
gTasks[taskId].tState++; gTasks[taskId].tState++;
} }
break; break;
@ -412,7 +416,7 @@ void sub_80FCC88(u8 taskId)
case 4: case 4:
if (LinkContest_GetBlockReceivedFromAllPlayers()) if (LinkContest_GetBlockReceivedFromAllPlayers())
{ {
memcpy(gContestResources->field_8, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(struct UnknownContestStruct7)); memcpy(gContestResources->field_8, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof(struct UnknownContestStruct7));
gTasks[taskId].tState++; gTasks[taskId].tState++;
} }
break; break;
@ -426,7 +430,7 @@ void sub_80FCC88(u8 taskId)
case 7: case 7:
if (LinkContest_GetBlockReceivedFromAllPlayers()) if (LinkContest_GetBlockReceivedFromAllPlayers())
{ {
memcpy(gContestResources->field_10, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(struct UnknownContestStruct5)); memcpy(gContestResources->field_10, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof(struct UnknownContestStruct5));
gTasks[taskId].tState++; gTasks[taskId].tState++;
} }
break; break;
@ -440,7 +444,7 @@ void sub_80FCC88(u8 taskId)
case 10: case 10:
if (LinkContest_GetBlockReceivedFromAllPlayers()) if (LinkContest_GetBlockReceivedFromAllPlayers())
{ {
memcpy(gContestantTurnOrder, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestantTurnOrder)); memcpy(gContestantTurnOrder, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof(gContestantTurnOrder));
gTasks[taskId].tState++; gTasks[taskId].tState++;
} }
break; break;
@ -451,11 +455,11 @@ void sub_80FCC88(u8 taskId)
} }
} }
void sub_80FCE48(u8 taskId) void Task_LinkContest_CommunicateLeaderIdsRS(u8 taskId)
{ {
int i; int i;
if (!sub_80FC670(&gTasks[taskId].data[12])) if (!LinkContest_TryLinkStandby(&gTasks[taskId].data[12]))
return; return;
switch (gTasks[taskId].tState) switch (gTasks[taskId].tState)
@ -484,7 +488,7 @@ void sub_80FCE48(u8 taskId)
case 10: case 10:
if (++gTasks[taskId].tTimer > 10) if (++gTasks[taskId].tTimer > 10)
{ {
sub_800A4D8(2); SendBlockRequest(2);
gTasks[taskId].tState = 1; gTasks[taskId].tState = 1;
} }
break; break;
@ -499,7 +503,7 @@ void sub_80FCE48(u8 taskId)
void Task_LinkContest_CommunicateRound1Points(u8 taskId) void Task_LinkContest_CommunicateRound1Points(u8 taskId)
{ {
if (!sub_80FC670(&gTasks[taskId].data[12])) if (!LinkContest_TryLinkStandby(&gTasks[taskId].data[12]))
return; return;
switch (gTasks[taskId].tState) switch (gTasks[taskId].tState)
@ -514,7 +518,7 @@ void Task_LinkContest_CommunicateRound1Points(u8 taskId)
case 1: case 1:
if (LinkContest_GetBlockReceivedFromAllPlayers()) if (LinkContest_GetBlockReceivedFromAllPlayers())
{ {
memcpy(gContestMonRound1Points, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestMonRound1Points)); memcpy(gContestMonRound1Points, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof(gContestMonRound1Points));
gTasks[taskId].tState++; gTasks[taskId].tState++;
} }
break; break;
@ -528,7 +532,7 @@ void Task_LinkContest_CommunicateRound1Points(u8 taskId)
void Task_LinkContest_CommunicateTurnOrder(u8 taskId) void Task_LinkContest_CommunicateTurnOrder(u8 taskId)
{ {
if (!sub_80FC670(&gTasks[taskId].data[12])) if (!LinkContest_TryLinkStandby(&gTasks[taskId].data[12]))
return; return;
switch (gTasks[taskId].tState) switch (gTasks[taskId].tState)
@ -543,7 +547,7 @@ void Task_LinkContest_CommunicateTurnOrder(u8 taskId)
case 1: case 1:
if (LinkContest_GetBlockReceivedFromAllPlayers()) if (LinkContest_GetBlockReceivedFromAllPlayers())
{ {
memcpy(gContestantTurnOrder, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestantTurnOrder)); memcpy(gContestantTurnOrder, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof(gContestantTurnOrder));
gTasks[taskId].tState++; gTasks[taskId].tState++;
} }
break; break;

View File

@ -6,21 +6,31 @@
#include "random.h" #include "random.h"
#include "task.h" #include "task.h"
static void sub_81D9F14(u8); /*
static void sub_81D9F30(u8); The functions in this file handle preliminary communication
static void sub_81D9F4C(u8); for Emerald-only link contests. If the link contest has an RS
static void sub_81D9F68(u8); player linked, none of these functions are used.
static void sub_81DA10C(u8);
static void sub_81DA138(u8); The equivalent functions for RS-linked contests are spread
static void sub_81DA160(u8); between contest_link.c and contest_util.c, and are suffixed RS
static void sub_81DA244(u8); instead of Em
static void sub_81DA2E8(u8); */
static void sub_81DA3B8(u8);
static void sub_81DA488(u8); static void Task_LinkContest_CommunicateMonsEm(u8);
static void Task_LinkContest_StartCommunicateRngEm(u8);
static void Task_LinkContest_CommunicateRngEm(u8);
static void Task_LinkContest_StartCommunicateLeaderIdsEm(u8);
static void Task_LinkContest_CommunicateLeaderIdsEm(u8);
static void Task_LinkContest_StartCommunicateCategoryEm(u8);
static void Task_LinkContest_CommunicateCategoryEm(u8);
static void Task_LinkContest_SetUpContestEm(u8);
static void Task_LinkContest_CommunicateAIMonsEm(u8);
static void Task_LinkContest_CalculateRound1Em(u8);
static void Task_LinkContest_CalculateTurnOrderEm(u8);
#define tCategory data[9] #define tCategory data[9]
void sub_81D9DE4(u8 taskId) void Task_LinkContest_StartCommunicationEm(u8 taskId)
{ {
int gameCleared; int gameCleared;
@ -47,57 +57,51 @@ void sub_81D9DE4(u8 taskId)
gContestMons[gContestPlayerMonIndex].highestRank = gHighestRibbonRank; gContestMons[gContestPlayerMonIndex].highestRank = gHighestRibbonRank;
gameCleared = FlagGet(FLAG_SYS_GAME_CLEAR) > 0; gameCleared = FlagGet(FLAG_SYS_GAME_CLEAR) > 0;
gContestMons[gContestPlayerMonIndex].gameCleared = gameCleared; gContestMons[gContestPlayerMonIndex].gameCleared = gameCleared;
SetTaskFuncWithFollowupFunc(taskId, sub_81DA160, sub_81D9F14); SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateMonsEm, Task_LinkContest_StartCommunicateRngEm);
} }
static void sub_81D9F14(u8 taskId) static void Task_LinkContest_StartCommunicateRngEm(u8 taskId)
{ {
SetTaskFuncWithFollowupFunc(taskId, sub_81DA244, sub_81D9F30); SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateRngEm, Task_LinkContest_StartCommunicateLeaderIdsEm);
} }
static void sub_81D9F30(u8 taskId) static void Task_LinkContest_StartCommunicateLeaderIdsEm(u8 taskId)
{ {
SetTaskFuncWithFollowupFunc(taskId, sub_81DA2E8, sub_81D9F4C); SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateLeaderIdsEm, Task_LinkContest_StartCommunicateCategoryEm);
} }
static void sub_81D9F4C(u8 taskId) static void Task_LinkContest_StartCommunicateCategoryEm(u8 taskId)
{ {
SetTaskFuncWithFollowupFunc(taskId, sub_81DA3B8, sub_81D9F68); SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateCategoryEm, Task_LinkContest_SetUpContestEm);
} }
static void sub_81D9F68(u8 taskId) static void Task_LinkContest_SetUpContestEm(u8 taskId)
{ {
u8 i; u8 i;
u8 rank; u8 rank;
int gameCleared; int gameCleared;
u8 contestCategories[CONTESTANT_COUNT]; u8 categories[CONTESTANT_COUNT];
u8 data2[CONTESTANT_COUNT]; u8 leaderIds[CONTESTANT_COUNT];
memset(contestCategories, 0, sizeof(contestCategories)); memset(categories, 0, sizeof(categories));
memset(data2, 0, sizeof(data2)); memset(leaderIds, 0, sizeof(leaderIds));
for (i = 0; i < gNumLinkContestPlayers; i++) for (i = 0; i < gNumLinkContestPlayers; i++)
contestCategories[i] = gTasks[taskId].data[i + 1]; categories[i] = gTasks[taskId].data[i + 1];
// Ensure all players are doing the same category // Ensure all players are doing the same category
i = 0; for (i = 0; i < gNumLinkContestPlayers && categories[0] == categories[i]; i++)
if (i < gNumLinkContestPlayers) ;
{
while (++i < gNumLinkContestPlayers)
{
if (contestCategories[0] != contestCategories[i])
break;
}
}
if (i == gNumLinkContestPlayers) if (i == gNumLinkContestPlayers)
gSpecialVar_0x8004 = FALSE; gSpecialVar_0x8004 = FALSE; // Category choices the same
else else
gSpecialVar_0x8004 = TRUE; gSpecialVar_0x8004 = TRUE; // Category choices differ
for (i = 0; i < gNumLinkContestPlayers; i++) for (i = 0; i < gNumLinkContestPlayers; i++)
data2[i] = gTasks[taskId].data[i + 5]; leaderIds[i] = gTasks[taskId].data[i + 5];
// If < 4 players and player is leader, set AI contestants based on rank and game clear
if (gNumLinkContestPlayers != CONTESTANT_COUNT && GetMultiplayerId() == 0) if (gNumLinkContestPlayers != CONTESTANT_COUNT && GetMultiplayerId() == 0)
{ {
rank = gContestMons[0].highestRank; rank = gContestMons[0].highestRank;
@ -110,43 +114,45 @@ static void sub_81D9F68(u8 taskId)
if (rank) if (rank)
rank--; rank--;
gameCleared = 1; gameCleared = TRUE;
for (i = 0; i < gNumLinkContestPlayers; i++) for (i = 0; i < gNumLinkContestPlayers; i++)
{ {
if (!gContestMons[i].gameCleared) if (!gContestMons[i].gameCleared)
{ {
gameCleared = 0; gameCleared = FALSE;
break; break;
} }
} }
SetLinkAIContestants(contestCategories[0], rank, gameCleared); SetLinkAIContestants(categories[0], rank, gameCleared);
} }
gUnknown_02039F2B = sub_80F86E0(data2); // Assign link leader. After initial communication all players will read data only from them
gContestLinkLeaderIndex = LinkContest_GetLeaderIndex(leaderIds);
if (gNumLinkContestPlayers < CONTESTANT_COUNT) if (gNumLinkContestPlayers < CONTESTANT_COUNT)
SetTaskFuncWithFollowupFunc(taskId, sub_81DA488, sub_81DA10C); SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateAIMonsEm, Task_LinkContest_CalculateRound1Em);
else else
gTasks[taskId].func = sub_81DA10C; gTasks[taskId].func = Task_LinkContest_CalculateRound1Em;
} }
static void sub_81DA10C(u8 taskId) static void Task_LinkContest_CalculateRound1Em(u8 taskId)
{ {
sub_80DB09C(gSpecialVar_ContestCategory); CalculateRound1Points(gSpecialVar_ContestCategory);
SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateRound1Points, sub_81DA138); SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateRound1Points, Task_LinkContest_CalculateTurnOrderEm);
} }
static void sub_81DA138(u8 taskId) static void Task_LinkContest_CalculateTurnOrderEm(u8 taskId)
{ {
SortContestants(FALSE); SortContestants(FALSE);
SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateTurnOrder, sub_80F8714); SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateTurnOrder, Task_LinkContest_FinalizeConnection);
} }
static void sub_81DA160(u8 taskId) static void Task_LinkContest_CommunicateMonsEm(u8 taskId)
{ {
int i; int i;
if (!sub_80FC670(&gTasks[taskId].data[12])) if (!LinkContest_TryLinkStandby(&gTasks[taskId].data[12]))
return; return;
switch (gTasks[taskId].data[0]) switch (gTasks[taskId].data[0])
@ -178,9 +184,9 @@ static void sub_81DA160(u8 taskId)
} }
} }
static void sub_81DA244(u8 taskId) static void Task_LinkContest_CommunicateRngEm(u8 taskId)
{ {
if (!sub_80FC670(&gTasks[taskId].data[12])) if (!LinkContest_TryLinkStandby(&gTasks[taskId].data[12]))
return; return;
switch (gTasks[taskId].data[0]) switch (gTasks[taskId].data[0])
@ -193,6 +199,7 @@ static void sub_81DA244(u8 taskId)
case 0: case 0:
if (GetMultiplayerId() == 0) if (GetMultiplayerId() == 0)
{ {
// Only the leader sends the RNG seed
if (!IsLinkTaskFinished()) if (!IsLinkTaskFinished())
return; return;
@ -201,10 +208,12 @@ static void sub_81DA244(u8 taskId)
} }
else else
{ {
// Other link members skip to waiting
gTasks[taskId].data[0]++; gTasks[taskId].data[0]++;
} }
break; break;
case 1: case 1:
// Wait to receive RNG data
if (LinkContest_GetBlockReceived(0)) if (LinkContest_GetBlockReceived(0))
{ {
memcpy(&gRngValue, gBlockRecvBuffer[0], sizeof(gRngValue)); memcpy(&gRngValue, gBlockRecvBuffer[0], sizeof(gRngValue));
@ -215,13 +224,13 @@ static void sub_81DA244(u8 taskId)
} }
} }
static void sub_81DA2E8(u8 taskId) static void Task_LinkContest_CommunicateLeaderIdsEm(u8 taskId)
{ {
int i; int i;
u16 data[4]; u16 data[CONTESTANT_COUNT];
u16 var0; u16 leaderId;
if (!sub_80FC670(&gTasks[taskId].data[12])) if (!LinkContest_TryLinkStandby(&gTasks[taskId].data[12]))
return; return;
switch (gTasks[taskId].data[0]) switch (gTasks[taskId].data[0])
@ -234,8 +243,8 @@ static void sub_81DA2E8(u8 taskId)
case 0: case 0:
if (IsLinkTaskFinished()) if (IsLinkTaskFinished())
{ {
var0 = 0x6E; leaderId = 0x6E;
if (LinkContest_SendBlock(&var0, sizeof(var0)) == 1) if (LinkContest_SendBlock(&leaderId, sizeof(leaderId)) == 1)
gTasks[taskId].data[0]++; gTasks[taskId].data[0]++;
} }
break; break;
@ -254,13 +263,13 @@ static void sub_81DA2E8(u8 taskId)
} }
} }
static void sub_81DA3B8(u8 taskId) static void Task_LinkContest_CommunicateCategoryEm(u8 taskId)
{ {
int i; int i;
u16 data[CONTESTANT_COUNT]; u16 data[CONTESTANT_COUNT];
u16 category; u16 category;
if (!sub_80FC670(&gTasks[taskId].data[12])) if (!LinkContest_TryLinkStandby(&gTasks[taskId].data[12]))
return; return;
switch (gTasks[taskId].data[0]) switch (gTasks[taskId].data[0])
@ -293,11 +302,11 @@ static void sub_81DA3B8(u8 taskId)
} }
} }
static void sub_81DA488(u8 taskId) static void Task_LinkContest_CommunicateAIMonsEm(u8 taskId)
{ {
int i; int i;
if (!sub_80FC670(&gTasks[taskId].data[12])) if (!LinkContest_TryLinkStandby(&gTasks[taskId].data[12]))
return; return;
switch (gTasks[taskId].data[0]) switch (gTasks[taskId].data[0])

View File

@ -151,14 +151,14 @@ static void Task_CreateConfetti(u8);
static void SpriteCB_TextBoxSlideIn(struct Sprite *); static void SpriteCB_TextBoxSlideIn(struct Sprite *);
static void SpriteCB_TextBoxSlideOut(struct Sprite *); static void SpriteCB_TextBoxSlideOut(struct Sprite *);
static void SpriteCB_EndTextBoxSlideIn(struct Sprite *); static void SpriteCB_EndTextBoxSlideIn(struct Sprite *);
static void sub_80F8508(u8); static void Task_StartCommunication(u8);
static void sub_80F8568(u8); static void Task_StartCommunicateRngRS(u8);
static void sub_80F8584(u8); static void Task_StartCommunicateLeaderIdsRS(u8);
static void sub_80F85A0(u8); static void Task_StartCommunicateCategoryRS(u8);
static void sub_80F85BC(u8); static void Task_LinkContest_SetUpContestRS(u8);
static void sub_80F86B8(u8); static void Task_LinkContest_CalculateTurnOrderRS(u8);
static void sub_80F878C(u8); static void Task_LinkContest_Disconnect(u8);
static void sub_80F87B4(u8); static void Task_LinkContest_WaitDisconnect(u8);
static void SpriteCB_Confetti(struct Sprite *sprite); static void SpriteCB_Confetti(struct Sprite *sprite);
static const u16 sUnknown_0858D6B0[] = INCBIN_U16("graphics/unknown/unknown_58D6B0.gbapal"); static const u16 sUnknown_0858D6B0[] = INCBIN_U16("graphics/unknown/unknown_58D6B0.gbapal");
@ -602,7 +602,7 @@ static void Task_ShowContestResults(u8 taskId)
case 2: case 2:
if (IsLinkTaskFinished()) if (IsLinkTaskFinished())
{ {
sub_800ADF8(); SetLinkStandbyCallback();
gTasks[taskId].tState++; gTasks[taskId].tState++;
} }
return; return;
@ -975,7 +975,7 @@ static void Task_TryDisconnectLinkPartners(u8 taskId)
if (!gTasks[taskId].data[10]) if (!gTasks[taskId].data[10])
{ {
ShowLinkResultsTextBox(gText_CommunicationStandby); ShowLinkResultsTextBox(gText_CommunicationStandby);
sub_800AC34(); SetCloseLinkCallback();
gTasks[taskId].func = Task_WaitForLinkPartnersDisconnect; gTasks[taskId].func = Task_WaitForLinkPartnersDisconnect;
} }
} }
@ -2207,7 +2207,7 @@ void TryEnterContestMon(void)
if (eligibility) if (eligibility)
{ {
SetContestants(gSpecialVar_ContestCategory, gSpecialVar_ContestRank); SetContestants(gSpecialVar_ContestCategory, gSpecialVar_ContestRank);
sub_80DB09C(gSpecialVar_ContestCategory); CalculateRound1Points(gSpecialVar_ContestCategory);
} }
gSpecialVar_Result = eligibility; gSpecialVar_Result = eligibility;
@ -2409,103 +2409,102 @@ void ContestLinkTransfer(u8 category)
{ {
u8 newTaskId; u8 newTaskId;
ScriptContext2_Enable(); ScriptContext2_Enable();
newTaskId = CreateTask(sub_80FC580, 0); newTaskId = CreateTask(Task_LinkContest_Init, 0);
SetTaskFuncWithFollowupFunc(newTaskId, sub_80FC580, sub_80F8508); SetTaskFuncWithFollowupFunc(newTaskId, Task_LinkContest_Init, Task_StartCommunication);
gTasks[newTaskId].data[9] = category; gTasks[newTaskId].data[9] = category;
} }
static void sub_80F8508(u8 taskId) static void Task_StartCommunication(u8 taskId)
{ {
if (gLinkContestFlags & LINK_CONTEST_FLAG_HAS_RS_PLAYER) if (gLinkContestFlags & LINK_CONTEST_FLAG_HAS_RS_PLAYER)
{ {
CreateContestMonFromParty(gContestMonPartyIndex); CreateContestMonFromParty(gContestMonPartyIndex);
SetTaskFuncWithFollowupFunc(taskId, sub_80FC6BC, sub_80F8568); SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateMonsRS, Task_StartCommunicateRngRS);
} }
else else
{ {
CreateContestMonFromParty(gContestMonPartyIndex); CreateContestMonFromParty(gContestMonPartyIndex);
gTasks[taskId].func = sub_81D9DE4; gTasks[taskId].func = Task_LinkContest_StartCommunicationEm;
} }
} }
static void sub_80F8568(u8 taskId) static void Task_StartCommunicateRngRS(u8 taskId)
{ {
SetTaskFuncWithFollowupFunc(taskId, sub_80FC804, sub_80F8584); SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateRngRS, Task_StartCommunicateLeaderIdsRS);
} }
static void sub_80F8584(u8 taskId) static void Task_StartCommunicateLeaderIdsRS(u8 taskId)
{ {
SetTaskFuncWithFollowupFunc(taskId, sub_80FCE48, sub_80F85A0); SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateLeaderIdsRS, Task_StartCommunicateCategoryRS);
} }
static void sub_80F85A0(u8 taskId) static void Task_StartCommunicateCategoryRS(u8 taskId)
{ {
SetTaskFuncWithFollowupFunc(taskId, sub_80FC894, sub_80F85BC); SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateCategoryRS, Task_LinkContest_SetUpContestRS);
} }
static void sub_80F85BC(u8 taskId) static void Task_LinkContest_SetUpContestRS(u8 taskId)
{ {
u8 i; u8 i;
u8 sp0[4]; u8 categories[CONTESTANT_COUNT];
u8 sp4[4]; u8 leaderIds[CONTESTANT_COUNT];
memset(sp0, 0, sizeof(sp0)); memset(categories, 0, sizeof(categories));
memset(sp4, 0, sizeof(sp4)); memset(leaderIds, 0, sizeof(leaderIds));
for (i = 0; i < gNumLinkContestPlayers; i++) for (i = 0; i < gNumLinkContestPlayers; i++)
sp0[i] = gTasks[taskId].data[i + 1]; categories[i] = gTasks[taskId].data[i + 1];
for (i = 0; i < gNumLinkContestPlayers;) // Ensure all players are doing the same category
{ for (i = 0; i < gNumLinkContestPlayers && categories[0] == categories[i]; i++)
i++; ;
if (i >= gNumLinkContestPlayers || sp0[0] != sp0[i])
break;
}
if (i == gNumLinkContestPlayers) if (i == gNumLinkContestPlayers)
gSpecialVar_0x8004 = 0; gSpecialVar_0x8004 = FALSE; // Category choices the same
else else
gSpecialVar_0x8004 = 1; gSpecialVar_0x8004 = TRUE; // Category choices differ
for (i = 0; i < gNumLinkContestPlayers; i++) for (i = 0; i < gNumLinkContestPlayers; i++)
sp4[i] = gTasks[taskId].data[i + 5]; leaderIds[i] = gTasks[taskId].data[i + 5];
gUnknown_02039F2B = sub_80F86E0(sp4); gContestLinkLeaderIndex = LinkContest_GetLeaderIndex(leaderIds);
sub_80DB09C(gSpecialVar_ContestCategory); CalculateRound1Points(gSpecialVar_ContestCategory);
SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateRound1Points, sub_80F86B8); SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateRound1Points, Task_LinkContest_CalculateTurnOrderRS);
} }
static void sub_80F86B8(u8 taskId) static void Task_LinkContest_CalculateTurnOrderRS(u8 taskId)
{ {
SortContestants(FALSE); SortContestants(FALSE);
SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateTurnOrder, sub_80F8714); SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateTurnOrder, Task_LinkContest_FinalizeConnection);
} }
u8 sub_80F86E0(u8 *arg0) u8 LinkContest_GetLeaderIndex(u8 *ids)
{ {
int i; int i;
u8 result = 0; u8 leaderIdx = 0;
for (i = 1; i < gNumLinkContestPlayers; i++) for (i = 1; i < gNumLinkContestPlayers; i++)
{ {
if (arg0[result] < arg0[i]) if (ids[leaderIdx] < ids[i])
result = i; leaderIdx = i;
} }
return result; return leaderIdx;
} }
void sub_80F8714(u8 taskId) void Task_LinkContest_FinalizeConnection(u8 taskId)
{ {
int i; int i;
if (gSpecialVar_0x8004 == 1) if (gSpecialVar_0x8004 == TRUE)
{ {
// Link partner data doesn't agree, disconnect
if (IsLinkTaskFinished()) if (IsLinkTaskFinished())
gTasks[taskId].func = sub_80F878C; gTasks[taskId].func = Task_LinkContest_Disconnect;
} }
else else
{ {
// Succesfully connected
for (i = 0; i < CONTESTANT_COUNT; i++) for (i = 0; i < CONTESTANT_COUNT; i++)
StringGetEnd10(gContestMons[i].nickname); StringGetEnd10(gContestMons[i].nickname);
@ -2516,13 +2515,13 @@ void sub_80F8714(u8 taskId)
} }
} }
static void sub_80F878C(u8 taskId) static void Task_LinkContest_Disconnect(u8 taskId)
{ {
sub_800AC34(); SetCloseLinkCallback();
gTasks[taskId].func = sub_80F87B4; gTasks[taskId].func = Task_LinkContest_WaitDisconnect;
} }
static void sub_80F87B4(u8 taskId) static void Task_LinkContest_WaitDisconnect(u8 taskId)
{ {
if (!gReceivedRemoteLinkPlayers) if (!gReceivedRemoteLinkPlayers)
{ {

View File

@ -558,7 +558,7 @@ static void sub_8024BC8(u8 taskId)
case 2: case 2:
if (!sub_802A770()) if (!sub_802A770())
{ {
sub_8010434(); Rfu_SetLinkStandbyCallback();
gUnknown_02022C98->unk0C++; gUnknown_02022C98->unk0C++;
} }
break; break;
@ -671,7 +671,7 @@ static void sub_8024E38(void)
gUnknown_02022C98->unk10++; gUnknown_02022C98->unk10++;
break; break;
case 1: case 1:
sub_8010434(); Rfu_SetLinkStandbyCallback();
gUnknown_02022C98->unk10++; gUnknown_02022C98->unk10++;
break; break;
case 2: case 2:
@ -690,7 +690,7 @@ static void sub_8024E38(void)
case 4: case 4:
if (++gUnknown_02022C98->unk30 > 5) if (++gUnknown_02022C98->unk30 > 5)
{ {
sub_8010434(); Rfu_SetLinkStandbyCallback();
gUnknown_02022C98->unk10++; gUnknown_02022C98->unk10++;
} }
break; break;
@ -1081,7 +1081,7 @@ static void sub_8025644(void)
switch (gUnknown_02022C98->unk10) switch (gUnknown_02022C98->unk10)
{ {
case 0: case 0:
sub_800AC34(); SetCloseLinkCallback();
sub_80292E0(7); sub_80292E0(7);
gUnknown_02022C98->unk10++; gUnknown_02022C98->unk10++;
break; break;

View File

@ -192,7 +192,7 @@ static u32 sub_81D4EE4(u8 *arg0, u16 *arg1)
} }
break; break;
case 4: case 4:
sub_800ABF4(0); SetCloseLinkCallbackAndType(0);
*arg0 = 5; *arg0 = 5;
break; break;
case 5: case 5:
@ -403,7 +403,7 @@ static void sub_81D5084(u8 taskId)
break; break;
case 15: case 15:
data->unkE = EReader_IsReceivedDataValid((struct EReaderTrainerHillSet *)gDecompressionBuffer); data->unkE = EReader_IsReceivedDataValid((struct EReaderTrainerHillSet *)gDecompressionBuffer);
sub_800ABF4(data->unkE); SetCloseLinkCallbackAndType(data->unkE);
data->unk8 = 16; data->unk8 = 16;
break; break;
case 16: case 16:

View File

@ -197,7 +197,7 @@ static void Task_ReturnToFieldWirelessLink(u8 taskId)
switch (task->data[0]) switch (task->data[0])
{ {
case 0: case 0:
sub_800ADF8(); SetLinkStandbyCallback();
task->data[0]++; task->data[0]++;
break; break;
case 1: case 1:
@ -230,7 +230,7 @@ void Task_ReturnToFieldRecordMixing(u8 taskId)
switch (task->data[0]) switch (task->data[0])
{ {
case 0: case 0:
sub_800ADF8(); SetLinkStandbyCallback();
task->data[0]++; task->data[0]++;
break; break;
case 1: case 1:
@ -623,7 +623,7 @@ static void Task_ReturnToWorldFromLinkRoom(u8 taskId)
case 1: case 1:
if (!PaletteFadeActive() && BGMusicStopped()) if (!PaletteFadeActive() && BGMusicStopped())
{ {
sub_800AC34(); SetCloseLinkCallback();
data[0]++; data[0]++;
} }
break; break;

View File

@ -3865,7 +3865,7 @@ static void Task_LinkRetireStatusWithBattleTowerPartner(u8 taskId)
case 7: case 7:
if (IsLinkTaskFinished() == 1) if (IsLinkTaskFinished() == 1)
{ {
sub_800ADF8(); SetLinkStandbyCallback();
gTasks[taskId].data[0]++; gTasks[taskId].data[0]++;
} }
break; break;
@ -3878,7 +3878,7 @@ static void Task_LinkRetireStatusWithBattleTowerPartner(u8 taskId)
case 9: case 9:
if (gWirelessCommType == 0) if (gWirelessCommType == 0)
{ {
sub_800AC34(); SetCloseLinkCallback();
} }
gBattleTypeFlags = sBattleTowerMultiBattleTypeFlags; gBattleTypeFlags = sBattleTowerMultiBattleTypeFlags;
EnableBothScriptContexts(); EnableBothScriptContexts();

View File

@ -75,9 +75,9 @@ u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH];
u32 gLinkStatus; u32 gLinkStatus;
bool8 gLinkDummy1; // Never read bool8 gLinkDummy1; // Never read
bool8 gLinkDummy2; // Never read bool8 gLinkDummy2; // Never read
bool8 gUnknown_030030EC[MAX_LINK_PLAYERS]; bool8 gReadyToExitStandby[MAX_LINK_PLAYERS];
bool8 gUnknown_030030F0[MAX_LINK_PLAYERS]; bool8 gReadyToCloseLink[MAX_LINK_PLAYERS];
u16 gUnknown_030030F4; u16 gReadyCloseLinkType; // Never read
u8 gSuppressLinkErrorMessage; u8 gSuppressLinkErrorMessage;
bool8 gWirelessCommType; bool8 gWirelessCommType;
bool8 gSavedLinkPlayerCount; bool8 gSavedLinkPlayerCount;
@ -114,7 +114,7 @@ EWRAM_DATA struct {
u8 lastSendQueueCount; u8 lastSendQueueCount;
u8 unk_06; u8 unk_06;
} sLinkErrorBuffer = {}; } sLinkErrorBuffer = {};
static EWRAM_DATA u16 sUnknown_02022B08 = 0; static EWRAM_DATA u16 sReadyCloseLinkAttempts = 0; // never read
static EWRAM_DATA void *sLinkErrorBgTilemapBuffer = NULL; static EWRAM_DATA void *sLinkErrorBgTilemapBuffer = NULL;
// Static ROM declarations // Static ROM declarations
@ -135,12 +135,12 @@ static void LinkTest_prnthex(u32 pos, u8 a0, u8 a1, u8 a2);
static void LinkCB_RequestPlayerDataExchange(void); static void LinkCB_RequestPlayerDataExchange(void);
static void Task_PrintTestData(u8 taskId); static void Task_PrintTestData(u8 taskId);
static void sub_800AC80(void); static void LinkCB_ReadyCloseLink(void);
static void sub_800ACAC(void); static void LinkCB_WaitCloseLink(void);
static void sub_800AD5C(void); static void LinkCB_ReadyCloseLinkWithJP(void);
static void sub_800AD88(void); static void LinkCB_WaitCloseLinkWithJP(void);
static void sub_800AE30(void); static void LinkCB_Standby(void);
static void sub_800AE5C(void); static void LinkCB_StandbyForAll(void);
static void CheckErrorStatus(void); static void CheckErrorStatus(void);
static void CB2_PrintErrorMessage(void); static void CB2_PrintErrorMessage(void);
@ -379,7 +379,7 @@ void OpenLink(void)
sDummy1 = FALSE; sDummy1 = FALSE;
gLinkDummy2 = FALSE; gLinkDummy2 = FALSE;
gLinkDummy1 = FALSE; gLinkDummy1 = FALSE;
gUnknown_030030F4 = 0; gReadyCloseLinkType = 0;
CreateTask(Task_TriggerHandshake, 2); CreateTask(Task_TriggerHandshake, 2);
} }
else else
@ -390,8 +390,8 @@ void OpenLink(void)
for (i = 0; i < MAX_LINK_PLAYERS; i++) for (i = 0; i < MAX_LINK_PLAYERS; i++)
{ {
gRemoteLinkPlayersNotReceived[i] = TRUE; gRemoteLinkPlayersNotReceived[i] = TRUE;
gUnknown_030030F0[i] = FALSE; gReadyToCloseLink[i] = FALSE;
gUnknown_030030EC[i] = FALSE; gReadyToExitStandby[i] = FALSE;
} }
} }
@ -467,7 +467,7 @@ static void LinkTestProcessKeyInput(void)
} }
if (gMain.newKeys & SELECT_BUTTON) if (gMain.newKeys & SELECT_BUTTON)
{ {
sub_800AC34(); SetCloseLinkCallback();
} }
if (gLinkTestDebugValuesEnabled) if (gLinkTestDebugValuesEnabled)
{ {
@ -630,16 +630,16 @@ static void ProcessRecvCmds(u8 unused)
} }
} }
break; break;
case LINKCMD_0x5FFF: case LINKCMD_READY_CLOSE_LINK:
gUnknown_030030F0[i] = TRUE; gReadyToCloseLink[i] = TRUE;
break; break;
case LINKCMD_0x2FFE: case LINKCMD_READY_EXIT_STANDBY:
gUnknown_030030EC[i] = TRUE; gReadyToExitStandby[i] = TRUE;
break; break;
case LINKCMD_0xAAAA: case LINKCMD_0xAAAA:
sub_800A418(); sub_800A418();
break; break;
case LINKCMD_0xCCCC: case LINKCMD_SEND_BLOCK_REQ:
SendBlock(0, sBlockRequests[gRecvCmds[i][1]].address, sBlockRequests[gRecvCmds[i][1]].size); SendBlock(0, sBlockRequests[gRecvCmds[i][1]].address, sBlockRequests[gRecvCmds[i][1]].size);
break; break;
case LINKCMD_SEND_HELD_KEYS_2: case LINKCMD_SEND_HELD_KEYS_2:
@ -657,8 +657,8 @@ static void BuildSendCmd(u16 command)
gSendCmd[0] = LINKCMD_SEND_LINK_TYPE; gSendCmd[0] = LINKCMD_SEND_LINK_TYPE;
gSendCmd[1] = gLinkType; gSendCmd[1] = gLinkType;
break; break;
case LINKCMD_0x2FFE: case LINKCMD_READY_EXIT_STANDBY:
gSendCmd[0] = LINKCMD_0x2FFE; gSendCmd[0] = LINKCMD_READY_EXIT_STANDBY;
break; break;
case LINKCMD_SEND_HELD_KEYS: case LINKCMD_SEND_HELD_KEYS:
gSendCmd[0] = LINKCMD_SEND_HELD_KEYS; gSendCmd[0] = LINKCMD_SEND_HELD_KEYS;
@ -694,13 +694,13 @@ static void BuildSendCmd(u16 command)
gSendCmd[0] = LINKCMD_0xAAAB; gSendCmd[0] = LINKCMD_0xAAAB;
gSendCmd[1] = gSpecialVar_ItemId; gSendCmd[1] = gSpecialVar_ItemId;
break; break;
case LINKCMD_0xCCCC: case LINKCMD_SEND_BLOCK_REQ:
gSendCmd[0] = LINKCMD_0xCCCC; gSendCmd[0] = LINKCMD_SEND_BLOCK_REQ;
gSendCmd[1] = gBlockRequestType; gSendCmd[1] = gBlockRequestType;
break; break;
case LINKCMD_0x5FFF: case LINKCMD_READY_CLOSE_LINK:
gSendCmd[0] = LINKCMD_0x5FFF; gSendCmd[0] = LINKCMD_READY_CLOSE_LINK;
gSendCmd[1] = gUnknown_030030F4; gSendCmd[1] = gReadyCloseLinkType;
break; break;
case LINKCMD_0x5566: case LINKCMD_0x5566:
gSendCmd[0] = LINKCMD_0x5566; gSendCmd[0] = LINKCMD_0x5566;
@ -1065,16 +1065,16 @@ bool8 SendBlock(u8 unused, const void *src, u16 size)
return InitBlockSend(src, size); return InitBlockSend(src, size);
} }
bool8 sub_800A4D8(u8 a0) bool8 SendBlockRequest(u8 blockReqType)
{ {
if (gWirelessCommType == TRUE) if (gWirelessCommType == TRUE)
{ {
return sub_8010100(a0); return Rfu_SendBlockRequest(blockReqType);
} }
if (gLinkCallback == NULL) if (gLinkCallback == NULL)
{ {
gBlockRequestType = a0; gBlockRequestType = blockReqType;
BuildSendCmd(LINKCMD_0xCCCC); BuildSendCmd(LINKCMD_SEND_BLOCK_REQ);
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
@ -1423,70 +1423,70 @@ static u8 GetDummy2(void)
return sDummy2; return sDummy2;
} }
void sub_800ABF4(u16 a0) void SetCloseLinkCallbackAndType(u16 type)
{ {
if (gWirelessCommType == TRUE) if (gWirelessCommType == TRUE)
{ {
task_add_05_task_del_08FA224_when_no_RfuFunc(); Rfu_SetCloseLinkCallback();
} }
else else
{ {
if (gLinkCallback == NULL) if (gLinkCallback == NULL)
{ {
gLinkCallback = sub_800AC80; gLinkCallback = LinkCB_ReadyCloseLink;
gLinkDummy1 = FALSE; gLinkDummy1 = FALSE;
gUnknown_030030F4 = a0; gReadyCloseLinkType = type;
} }
} }
} }
void sub_800AC34(void) void SetCloseLinkCallback(void)
{ {
if (gWirelessCommType == TRUE) if (gWirelessCommType == TRUE)
{ {
task_add_05_task_del_08FA224_when_no_RfuFunc(); Rfu_SetCloseLinkCallback();
} }
else else
{ {
if (gLinkCallback != NULL) if (gLinkCallback != NULL)
{ {
sUnknown_02022B08++; sReadyCloseLinkAttempts++;
} }
else else
{ {
gLinkCallback = sub_800AC80; gLinkCallback = LinkCB_ReadyCloseLink;
gLinkDummy1 = FALSE; gLinkDummy1 = FALSE;
gUnknown_030030F4 = 0; gReadyCloseLinkType = 0;
} }
} }
} }
static void sub_800AC80(void) static void LinkCB_ReadyCloseLink(void)
{ {
if (gLastRecvQueueCount == 0) if (gLastRecvQueueCount == 0)
{ {
BuildSendCmd(LINKCMD_0x5FFF); BuildSendCmd(LINKCMD_READY_CLOSE_LINK);
gLinkCallback = sub_800ACAC; gLinkCallback = LinkCB_WaitCloseLink;
} }
} }
static void sub_800ACAC(void) static void LinkCB_WaitCloseLink(void)
{ {
int i; int i;
unsigned count; unsigned count;
u8 linkPlayerCount;
linkPlayerCount = GetLinkPlayerCount(); // Wait for all players to be ready
u8 linkPlayerCount = GetLinkPlayerCount();
count = 0; count = 0;
for (i = 0; i < linkPlayerCount; i++) for (i = 0; i < linkPlayerCount; i++)
{ {
if (gUnknown_030030F0[i]) if (gReadyToCloseLink[i])
{
count++; count++;
} }
}
if (count == linkPlayerCount) if (count == linkPlayerCount)
{ {
// All ready, close link
gBattleTypeFlags &= ~BATTLE_TYPE_20; gBattleTypeFlags &= ~BATTLE_TYPE_20;
gLinkVSyncDisabled = TRUE; gLinkVSyncDisabled = TRUE;
CloseLink(); CloseLink();
@ -1495,37 +1495,38 @@ static void sub_800ACAC(void)
} }
} }
void sub_800AD10(void) // Used instead of SetCloseLinkCallback when disconnecting from an attempt to link with a foreign game
void SetCloseLinkCallbackHandleJP(void)
{ {
if (gWirelessCommType == TRUE) if (gWirelessCommType == TRUE)
{ {
task_add_05_task_del_08FA224_when_no_RfuFunc(); Rfu_SetCloseLinkCallback();
} }
else else
{ {
if (gLinkCallback != NULL) if (gLinkCallback != NULL)
{ {
sUnknown_02022B08++; sReadyCloseLinkAttempts++;
} }
else else
{ {
gLinkCallback = sub_800AD5C; gLinkCallback = LinkCB_ReadyCloseLinkWithJP;
gLinkDummy1 = FALSE; gLinkDummy1 = FALSE;
gUnknown_030030F4 = 0; gReadyCloseLinkType = 0;
} }
} }
} }
static void sub_800AD5C(void) static void LinkCB_ReadyCloseLinkWithJP(void)
{ {
if (gLastRecvQueueCount == 0) if (gLastRecvQueueCount == 0)
{ {
BuildSendCmd(LINKCMD_0x5FFF); BuildSendCmd(LINKCMD_READY_CLOSE_LINK);
gLinkCallback = sub_800AD88; gLinkCallback = LinkCB_WaitCloseLinkWithJP;
} }
} }
static void sub_800AD88(void) static void LinkCB_WaitCloseLinkWithJP(void)
{ {
int i; int i;
unsigned count; unsigned count;
@ -1533,19 +1534,21 @@ static void sub_800AD88(void)
linkPlayerCount = GetLinkPlayerCount(); linkPlayerCount = GetLinkPlayerCount();
count = 0; count = 0;
// Wait for all non-foreign players to be ready
for (i = 0; i < linkPlayerCount; i++) for (i = 0; i < linkPlayerCount; i++)
{ {
// Rather than communicate with the foreign game
// just assume they're ready to disconnect
if (gLinkPlayers[i].language == LANGUAGE_JAPANESE) if (gLinkPlayers[i].language == LANGUAGE_JAPANESE)
{ count++;
else if (gReadyToCloseLink[i])
count++; count++;
} }
else if (gUnknown_030030F0[i])
{
count++;
}
}
if (count == linkPlayerCount) if (count == linkPlayerCount)
{ {
// All ready, close link
gBattleTypeFlags &= ~BATTLE_TYPE_20; gBattleTypeFlags &= ~BATTLE_TYPE_20;
gLinkVSyncDisabled = TRUE; gLinkVSyncDisabled = TRUE;
CloseLink(); CloseLink();
@ -1554,50 +1557,47 @@ static void sub_800AD88(void)
} }
} }
void sub_800ADF8(void) void SetLinkStandbyCallback(void)
{ {
if (gWirelessCommType == TRUE) if (gWirelessCommType == TRUE)
{ {
sub_8010434(); Rfu_SetLinkStandbyCallback();
} }
else else
{ {
if (gLinkCallback == NULL) if (gLinkCallback == NULL)
{ {
gLinkCallback = sub_800AE30; gLinkCallback = LinkCB_Standby;
} }
gLinkDummy1 = FALSE; gLinkDummy1 = FALSE;
} }
} }
static void sub_800AE30(void) static void LinkCB_Standby(void)
{ {
if (gLastRecvQueueCount == 0) if (gLastRecvQueueCount == 0)
{ {
BuildSendCmd(LINKCMD_0x2FFE); BuildSendCmd(LINKCMD_READY_EXIT_STANDBY);
gLinkCallback = sub_800AE5C; gLinkCallback = LinkCB_StandbyForAll;
} }
} }
static void sub_800AE5C(void) static void LinkCB_StandbyForAll(void)
{ {
u8 i; u8 i;
u8 linkPlayerCount; u8 linkPlayerCount = GetLinkPlayerCount();
linkPlayerCount = GetLinkPlayerCount();
for (i = 0; i < linkPlayerCount; i++) for (i = 0; i < linkPlayerCount; i++)
{ {
if (!gUnknown_030030EC[i]) if (!gReadyToExitStandby[i])
{
break; break;
} }
}
// If true, all players ready to exit standby
if (i == linkPlayerCount) if (i == linkPlayerCount)
{ {
for (i = 0; i < MAX_LINK_PLAYERS; i++) for (i = 0; i < MAX_LINK_PLAYERS; i++)
{ gReadyToExitStandby[i] = FALSE;
gUnknown_030030EC[i] = FALSE;
}
gLinkCallback = NULL; gLinkCallback = NULL;
} }
} }

View File

@ -148,10 +148,7 @@ static const u8 sUnknown_082ED6A5[] = {
0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
}; };
static const struct { static const struct BlockRequest sBlockRequests[] = {
u8 *buffer;
u32 size;
} sUnknown_082ED6B8[] = {
{ gBlockSendBuffer, 200 }, { gBlockSendBuffer, 200 },
{ gBlockSendBuffer, 200 }, { gBlockSendBuffer, 200 },
{ gBlockSendBuffer, 100 }, { gBlockSendBuffer, 100 },
@ -1072,15 +1069,15 @@ static void RfuHandleReceiveCommand(u8 unused)
} }
} }
break; break;
case RFU_COMMAND_0xA100: case RFU_COMMAND_SEND_BLOCK_REQ:
Rfu_InitBlockSend(sUnknown_082ED6B8[gRecvCmds[i][1]].buffer, (u16)sUnknown_082ED6B8[gRecvCmds[i][1]].size); Rfu_InitBlockSend(sBlockRequests[gRecvCmds[i][1]].address, (u16)sBlockRequests[gRecvCmds[i][1]].size);
break; break;
case RFU_COMMAND_0x5F00: case RFU_COMMAND_READY_CLOSE_LINK:
Rfu.unk_e4[i] = 1; Rfu.readyCloseLink[i] = TRUE;
break; break;
case RFU_COMMAND_0x6600: case RFU_COMMAND_READY_EXIT_STANDBY:
if (Rfu.unk_100 == gRecvCmds[i][1]) if (Rfu.unk_100 == gRecvCmds[i][1])
Rfu.unk_e9[i] = 1; Rfu.readyExitStandby[i] = TRUE;
break; break;
case RFU_COMMAND_0xED00: case RFU_COMMAND_0xED00:
if (Rfu.parentChild == MODE_CHILD) if (Rfu.parentChild == MODE_CHILD)
@ -1194,9 +1191,9 @@ static void RfuPrepareSendBuffer(u16 command)
gSendCmd[1] = Rfu.sendBlock.count; gSendCmd[1] = Rfu.sendBlock.count;
gSendCmd[2] = Rfu.sendBlock.owner + 0x80; gSendCmd[2] = Rfu.sendBlock.owner + 0x80;
break; break;
case RFU_COMMAND_0xA100: case RFU_COMMAND_SEND_BLOCK_REQ:
if (AreNoPlayersReceiving()) if (AreNoPlayersReceiving())
gSendCmd[1] = Rfu.unk_5a; gSendCmd[1] = Rfu.blockRequestType;
break; break;
case RFU_COMMAND_0x7700: case RFU_COMMAND_0x7700:
case RFU_COMMAND_0x7800: case RFU_COMMAND_0x7800:
@ -1207,8 +1204,8 @@ static void RfuPrepareSendBuffer(u16 command)
for (i = 0; i < RFU_CHILD_MAX; i++) for (i = 0; i < RFU_CHILD_MAX; i++)
buff[i] = Rfu.linkPlayerIdx[i]; buff[i] = Rfu.linkPlayerIdx[i];
break; break;
case RFU_COMMAND_0x6600: case RFU_COMMAND_READY_EXIT_STANDBY:
case RFU_COMMAND_0x5F00: case RFU_COMMAND_READY_CLOSE_LINK:
gSendCmd[1] = Rfu.unk_100; gSendCmd[1] = Rfu.unk_100;
break; break;
case RFU_COMMAND_0x4400: case RFU_COMMAND_0x4400:
@ -1327,10 +1324,10 @@ static void SendLastBlock(void)
Rfu.callback = NULL; Rfu.callback = NULL;
} }
bool8 sub_8010100(u8 blockRequestType) bool8 Rfu_SendBlockRequest(u8 type)
{ {
Rfu.unk_5a = blockRequestType; Rfu.blockRequestType = type;
RfuPrepareSendBuffer(RFU_COMMAND_0xA100); RfuPrepareSendBuffer(RFU_COMMAND_SEND_BLOCK_REQ);
return TRUE; return TRUE;
} }
@ -1343,14 +1340,14 @@ static void sub_801011C(void)
Rfu.callback = NULL; Rfu.callback = NULL;
} }
static void sub_8010148(void) static void DisconnectRfu(void)
{ {
rfu_REQ_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag); rfu_REQ_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag);
rfu_waitREQComplete(); rfu_waitREQComplete();
sub_801011C(); sub_801011C();
} }
static void sub_8010168(void) static void TryDisconnectRfu(void)
{ {
if (Rfu.parentChild == MODE_CHILD) if (Rfu.parentChild == MODE_CHILD)
{ {
@ -1358,7 +1355,7 @@ static void sub_8010168(void)
Rfu.unk_ce4 = 2; Rfu.unk_ce4 = 2;
} }
else else
Rfu.callback = sub_8010148; Rfu.callback = DisconnectRfu;
} }
void LinkRfu_FatalError(void) void LinkRfu_FatalError(void)
@ -1368,131 +1365,137 @@ void LinkRfu_FatalError(void)
Rfu.unk_ce3 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; Rfu.unk_ce3 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag;
} }
static void sub_80101CC(void) // RFU equivalent of LinkCB_WaitCloseLink
static void WaitAllReadyToCloseLink(void)
{ {
s32 i; s32 i;
u8 playerCount = Rfu.playerCount; u8 playerCount = Rfu.playerCount;
s32 count = 0; s32 count = 0;
// Wait for all players to be ready
for (i = 0; i < MAX_RFU_PLAYERS; i++) for (i = 0; i < MAX_RFU_PLAYERS; i++)
{ {
if (Rfu.unk_e4[i]) if (Rfu.readyCloseLink[i])
count++; count++;
} }
if (count == playerCount) if (count == playerCount)
{ {
// All ready, close link
gBattleTypeFlags &= ~BATTLE_TYPE_20; gBattleTypeFlags &= ~BATTLE_TYPE_20;
if (Rfu.parentChild == MODE_CHILD) if (Rfu.parentChild == MODE_CHILD)
{ {
Rfu.errorState = 3; Rfu.errorState = 3;
sub_8010168(); TryDisconnectRfu();
} }
else else
Rfu.callback = sub_8010168; Rfu.callback = TryDisconnectRfu;
} }
} }
static void sub_801022C(void) static void SendReadyCloseLink(void)
{ {
if (gSendCmd[0] == 0 && Rfu.unk_ce8 == 0) if (gSendCmd[0] == 0 && Rfu.unk_ce8 == 0)
{ {
RfuPrepareSendBuffer(RFU_COMMAND_0x5F00); RfuPrepareSendBuffer(RFU_COMMAND_READY_CLOSE_LINK);
Rfu.callback = sub_80101CC; Rfu.callback = WaitAllReadyToCloseLink;
} }
} }
static void sub_8010264(u8 taskId) static void Task_TryReadyCloseLink(u8 taskId)
{ {
if (Rfu.callback == NULL) if (Rfu.callback == NULL)
{ {
Rfu.unk_cd9 = 1; Rfu.unk_cd9 = 1;
Rfu.callback = sub_801022C; Rfu.callback = SendReadyCloseLink;
DestroyTask(taskId); DestroyTask(taskId);
} }
} }
void task_add_05_task_del_08FA224_when_no_RfuFunc(void) void Rfu_SetCloseLinkCallback(void)
{ {
if (!FuncIsActiveTask(sub_8010264)) if (!FuncIsActiveTask(Task_TryReadyCloseLink))
CreateTask(sub_8010264, 5); CreateTask(Task_TryReadyCloseLink, 5);
} }
static void sub_80102B8(void) static void SendReadyExitStandbyUntilAllReady(void)
{ {
u8 playerCount; u8 playerCount;
u8 i; u8 i;
if (GetMultiplayerId() != 0) if (GetMultiplayerId() != 0)
{ {
if (Rfu.recvQueue.count == 0 && Rfu.unk_fe > 60) if (Rfu.recvQueue.count == 0 && Rfu.resendExitStandbyTimer > 60)
{ {
RfuPrepareSendBuffer(RFU_COMMAND_0x6600); RfuPrepareSendBuffer(RFU_COMMAND_READY_EXIT_STANDBY);
Rfu.unk_fe = 0; Rfu.resendExitStandbyTimer = 0;
} }
} }
playerCount = GetLinkPlayerCount(); playerCount = GetLinkPlayerCount();
for (i = 0; i < playerCount; i++) for (i = 0; i < playerCount; i++)
{ {
if (Rfu.unk_e9[i] == 0) if (!Rfu.readyExitStandby[i])
break; break;
} }
if (i == playerCount) if (i == playerCount)
{ {
for (i = 0; i < MAX_RFU_PLAYERS; i++) for (i = 0; i < MAX_RFU_PLAYERS; i++)
Rfu.unk_e9[i] = 0; Rfu.readyExitStandby[i] = FALSE;
Rfu.unk_100++; Rfu.unk_100++;
Rfu.callback = NULL; Rfu.callback = NULL;
} }
Rfu.unk_fe++; Rfu.resendExitStandbyTimer++;
} }
static void sub_8010358(void) static void LinkLeaderReadyToExitStandby(void)
{ {
if (Rfu.recvQueue.count == 0 && gSendCmd[0] == 0) if (Rfu.recvQueue.count == 0 && gSendCmd[0] == 0)
{ {
RfuPrepareSendBuffer(RFU_COMMAND_0x6600); RfuPrepareSendBuffer(RFU_COMMAND_READY_EXIT_STANDBY);
Rfu.callback = sub_80102B8; Rfu.callback = SendReadyExitStandbyUntilAllReady;
} }
} }
static void sub_8010390(void) // RFU equivalent of LinkCB_Standby and LinkCB_StandbyForAll
static void Rfu_LinkStandby(void)
{ {
u8 i; u8 i;
u8 playerCount; u8 playerCount;
if (GetMultiplayerId() != 0) if (GetMultiplayerId() != 0)
{ {
// Not link leader, send exit standby when ready
if (Rfu.recvQueue.count == 0 && gSendCmd[0] == 0) if (Rfu.recvQueue.count == 0 && gSendCmd[0] == 0)
{ {
RfuPrepareSendBuffer(RFU_COMMAND_0x6600); RfuPrepareSendBuffer(RFU_COMMAND_READY_EXIT_STANDBY);
Rfu.callback = sub_80102B8; Rfu.callback = SendReadyExitStandbyUntilAllReady;
} }
} }
else else
{ {
// Link leader, wait for all members to send exit ready
playerCount = GetLinkPlayerCount(); playerCount = GetLinkPlayerCount();
for (i = 1; i < playerCount; i++) for (i = 1; i < playerCount; i++)
{ {
if (Rfu.unk_e9[i] == 0) if (!Rfu.readyExitStandby[i])
break; break;
} }
if (i == playerCount) if (i == playerCount)
{ {
if (Rfu.recvQueue.count == 0 && gSendCmd[0] == 0) if (Rfu.recvQueue.count == 0 && gSendCmd[0] == 0)
{ {
RfuPrepareSendBuffer(RFU_COMMAND_0x6600); RfuPrepareSendBuffer(RFU_COMMAND_READY_EXIT_STANDBY);
Rfu.callback = sub_8010358; Rfu.callback = LinkLeaderReadyToExitStandby;
} }
} }
} }
} }
void sub_8010434(void) void Rfu_SetLinkStandbyCallback(void)
{ {
if (Rfu.callback == NULL) if (Rfu.callback == NULL)
{ {
Rfu.callback = sub_8010390; Rfu.callback = Rfu_LinkStandby;
Rfu.unk_fe = 0; Rfu.resendExitStandbyTimer = 0;
} }
} }
@ -1724,8 +1727,8 @@ static void sub_801084C(u8 taskId)
{ {
if (AreNoPlayersReceiving()) if (AreNoPlayersReceiving())
{ {
Rfu.unk_5a = 0; Rfu.blockRequestType = 0;
RfuPrepareSendBuffer(RFU_COMMAND_0xA100); RfuPrepareSendBuffer(RFU_COMMAND_SEND_BLOCK_REQ);
gTasks[taskId].data[0]++; gTasks[taskId].data[0]++;
} }
} }

View File

@ -208,7 +208,7 @@ static void CB2_MysteryEventMenu(void)
{ {
if (GetLinkPlayerDataExchangeStatusTimed(2, 2) == EXCHANGE_DIFF_SELECTIONS) if (GetLinkPlayerDataExchangeStatusTimed(2, 2) == EXCHANGE_DIFF_SELECTIONS)
{ {
sub_800AC34(); SetCloseLinkCallback();
GetEventLoadMessage(gStringVar4, 1); GetEventLoadMessage(gStringVar4, 1);
PrintMysteryMenuText(0, gStringVar4, 1, 2, 1); PrintMysteryMenuText(0, gStringVar4, 1, 2, 1);
gMain.state = 13; gMain.state = 13;
@ -249,7 +249,7 @@ static void CB2_MysteryEventMenu(void)
gMain.state++; gMain.state++;
break; break;
case 10: case 10:
sub_800AC34(); SetCloseLinkCallback();
gMain.state++; gMain.state++;
break; break;
case 11: case 11:

View File

@ -1284,7 +1284,7 @@ void task00_mystery_gift(u8 taskId)
switch (mevent_client_do_exec(&data->curPromptWindowId)) switch (mevent_client_do_exec(&data->curPromptWindowId))
{ {
case 6: case 6:
task_add_05_task_del_08FA224_when_no_RfuFunc(); Rfu_SetCloseLinkCallback();
data->prevPromptWindowId = data->curPromptWindowId; data->prevPromptWindowId = data->curPromptWindowId;
data->state = 13; data->state = 13;
break; break;
@ -1647,7 +1647,7 @@ void task00_mystery_gift(u8 taskId)
} }
break; break;
case 33: case 33:
task_add_05_task_del_08FA224_when_no_RfuFunc(); Rfu_SetCloseLinkCallback();
StringCopy(gStringVar1, gLinkPlayers[1].name); StringCopy(gStringVar1, gLinkPlayers[1].name);
data->state = 34; data->state = 34;
break; break;

View File

@ -1463,7 +1463,7 @@ static bool32 sub_802BC60(void)
case 4: case 4:
if (!gPaletteFade.active) if (!gPaletteFade.active)
{ {
sub_800AC34(); SetCloseLinkCallback();
gUnknown_02022CFC->unkA++; gUnknown_02022CFC->unkA++;
} }
break; break;

View File

@ -501,7 +501,7 @@ static void Task_SendPacket(u8 taskId)
break; break;
case 1: case 1:
if (GetMultiplayerId() == 0) if (GetMultiplayerId() == 0)
sub_800A4D8(1); SendBlockRequest(1);
task->data[0]++; task->data[0]++;
break; break;
case 2: case 2:
@ -973,7 +973,7 @@ static void Task_DoRecordMixing(u8 taskId)
case 4: // Wait 10 frames case 4: // Wait 10 frames
if (++task->data[1] > 10) if (++task->data[1] > 10)
{ {
sub_800AC34(); SetCloseLinkCallback();
task->data[0] ++; task->data[0] ++;
} }
break; break;
@ -1005,7 +1005,7 @@ static void Task_DoRecordMixing(u8 taskId)
} }
break; break;
case 8: case 8:
sub_800ADF8(); SetLinkStandbyCallback();
task->data[0] ++; task->data[0] ++;
break; break;
case 9: case 9:

View File

@ -912,7 +912,7 @@ void Task_LinkSave(u8 taskId)
tState = 1; tState = 1;
break; break;
case 1: case 1:
sub_800ADF8(); SetLinkStandbyCallback();
tState = 2; tState = 2;
break; break;
case 2: case 2:
@ -949,7 +949,7 @@ void Task_LinkSave(u8 taskId)
case 7: case 7:
if (!tPartialSave) if (!tPartialSave)
ClearContinueGameWarpStatus2(); ClearContinueGameWarpStatus2();
sub_800ADF8(); SetLinkStandbyCallback();
tState = 8; tState = 8;
break; break;
case 8: case 8:
@ -960,7 +960,7 @@ void Task_LinkSave(u8 taskId)
} }
break; break;
case 9: case 9:
sub_800ADF8(); SetLinkStandbyCallback();
tState = 10; tState = 10;
break; break;
case 10: case 10:

View File

@ -472,7 +472,7 @@ static void Task_LinkContestWaitForConnection(u8 taskId)
case 0: case 0:
if (IsLinkTaskFinished()) if (IsLinkTaskFinished())
{ {
sub_800ADF8(); SetLinkStandbyCallback();
gTasks[taskId].data[0]++; gTasks[taskId].data[0]++;
} }
break; break;

View File

@ -246,9 +246,9 @@ static bool8 SendLinkData(const void *linkData, u32 size)
} }
} }
static void sub_80771AC(u8 a0) static void RequestLinkData(u8 type)
{ {
sub_800A4D8(a0); SendBlockRequest(type);
} }
static bool32 sub_80771BC(void) static bool32 sub_80771BC(void)
@ -295,9 +295,9 @@ static bool32 IsWirelessTrade(void)
return FALSE; return FALSE;
} }
static void sub_8077288(u8 unused) static void SetTradeLinkStandbyCallback(u8 unused)
{ {
sub_800ADF8(); SetLinkStandbyCallback();
} }
static bool32 _IsLinkTaskFinished(void) static bool32 _IsLinkTaskFinished(void)
@ -445,7 +445,7 @@ static void CB2_CreateTradeMenu(void)
if (gWirelessCommType) if (gWirelessCommType)
{ {
sub_801048C(TRUE); sub_801048C(TRUE);
sub_800ADF8(); SetLinkStandbyCallback();
} }
} }
break; break;
@ -825,7 +825,7 @@ static void LinkTradeWaitForFade(void)
} }
else else
{ {
sub_800ABF4(32); SetCloseLinkCallbackAndType(32);
sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_START_LINK_TRADE; sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_START_LINK_TRADE;
} }
} }
@ -983,7 +983,7 @@ static bool8 BufferTradeParties(void)
case 3: case 3:
if (id == 0) if (id == 0)
{ {
sub_80771AC(1); RequestLinkData(1);
} }
sTradeMenuData->bufferPartyState++; sTradeMenuData->bufferPartyState++;
break; break;
@ -1002,7 +1002,7 @@ static bool8 BufferTradeParties(void)
case 7: case 7:
if (id == 0) if (id == 0)
{ {
sub_80771AC(1); RequestLinkData(1);
} }
sTradeMenuData->bufferPartyState++; sTradeMenuData->bufferPartyState++;
break; break;
@ -1021,7 +1021,7 @@ static bool8 BufferTradeParties(void)
case 11: case 11:
if (id == 0) if (id == 0)
{ {
sub_80771AC(1); RequestLinkData(1);
} }
sTradeMenuData->bufferPartyState++; sTradeMenuData->bufferPartyState++;
break; break;
@ -1040,7 +1040,7 @@ static bool8 BufferTradeParties(void)
case 15: case 15:
if (id == 0) if (id == 0)
{ {
sub_80771AC(3); RequestLinkData(3);
} }
sTradeMenuData->bufferPartyState++; sTradeMenuData->bufferPartyState++;
break; break;
@ -1059,7 +1059,7 @@ static bool8 BufferTradeParties(void)
case 19: case 19:
if (id == 0) if (id == 0)
{ {
sub_80771AC(4); RequestLinkData(4);
} }
sTradeMenuData->bufferPartyState++; sTradeMenuData->bufferPartyState++;
break; break;
@ -1652,11 +1652,11 @@ static void CancelTrade_1(void)
{ {
if (gWirelessCommType) if (gWirelessCommType)
{ {
sub_800ADF8(); SetLinkStandbyCallback();
} }
else else
{ {
sub_800ABF4(12); SetCloseLinkCallbackAndType(12);
} }
sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_CANCEL_TRADE_2; sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_CANCEL_TRADE_2;
@ -1692,7 +1692,7 @@ static void LinkTradeWaitForQueue(void)
{ {
if (!sub_801048C(FALSE) && GetNumQueuedActions() == 0) if (!sub_801048C(FALSE) && GetNumQueuedActions() == 0)
{ {
sub_800ADF8(); SetLinkStandbyCallback();
sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_START_LINK_TRADE; sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_START_LINK_TRADE;
} }
} }
@ -4566,7 +4566,7 @@ static void CB2_SaveAndEndTrade(void)
DrawTextOnTradeWindow(0, gStringVar4, 0); DrawTextOnTradeWindow(0, gStringVar4, 0);
break; break;
case 1: case 1:
sub_8077288(0); SetTradeLinkStandbyCallback(0);
gMain.state = 100; gMain.state = 100;
sTradeData->timer = 0; sTradeData->timer = 0;
break; break;
@ -4644,7 +4644,7 @@ static void CB2_SaveAndEndTrade(void)
case 41: case 41:
if (sTradeData->timer == 0) if (sTradeData->timer == 0)
{ {
sub_8077288(1); SetTradeLinkStandbyCallback(1);
gMain.state = 42; gMain.state = 42;
} }
else else
@ -4663,7 +4663,7 @@ static void CB2_SaveAndEndTrade(void)
if (++sTradeData->timer > 60) if (++sTradeData->timer > 60)
{ {
gMain.state++; gMain.state++;
sub_8077288(2); SetTradeLinkStandbyCallback(2);
} }
break; break;
case 6: case 6:
@ -4685,11 +4685,11 @@ static void CB2_SaveAndEndTrade(void)
{ {
if (gWirelessCommType && gMain.savedCallback == CB2_StartCreateTradeMenu) if (gWirelessCommType && gMain.savedCallback == CB2_StartCreateTradeMenu)
{ {
sub_8077288(3); SetTradeLinkStandbyCallback(3);
} }
else else
{ {
sub_800AC34(); SetCloseLinkCallback();
} }
gMain.state++; gMain.state++;
} }
@ -4902,7 +4902,7 @@ static void CB2_SaveAndEndWirelessTrade(void)
DrawTextOnTradeWindow(0, gStringVar4, 0); DrawTextOnTradeWindow(0, gStringVar4, 0);
break; break;
case 1: case 1:
sub_8077288(0); SetTradeLinkStandbyCallback(0);
gMain.state = 2; gMain.state = 2;
sTradeData->timer = 0; sTradeData->timer = 0;
break; break;
@ -4950,7 +4950,7 @@ static void CB2_SaveAndEndWirelessTrade(void)
case 7: case 7:
if (sTradeData->timer == 0) if (sTradeData->timer == 0)
{ {
sub_8077288(1); SetTradeLinkStandbyCallback(1);
gMain.state = 8; gMain.state = 8;
} }
else else
@ -4969,7 +4969,7 @@ static void CB2_SaveAndEndWirelessTrade(void)
if (++sTradeData->timer > 60) if (++sTradeData->timer > 60)
{ {
gMain.state++; gMain.state++;
sub_8077288(2); SetTradeLinkStandbyCallback(2);
} }
break; break;
case 10: case 10:
@ -4983,7 +4983,7 @@ static void CB2_SaveAndEndWirelessTrade(void)
case 11: case 11:
if (!gPaletteFade.active && IsBGMStopped() == TRUE) if (!gPaletteFade.active && IsBGMStopped() == TRUE)
{ {
sub_8077288(3); SetTradeLinkStandbyCallback(3);
gMain.state = 12; gMain.state = 12;
} }
break; break;

View File

@ -498,7 +498,7 @@ static void Task_TrainerCard(u8 taskId)
} }
break; break;
case STATE_WAIT_LINK_PARTNER: case STATE_WAIT_LINK_PARTNER:
sub_800AC34(); SetCloseLinkCallback();
DrawDialogueFrame(0, 1); DrawDialogueFrame(0, 1);
AddTextPrinterParameterized(0, 1, gText_WaitingTrainerFinishReading, 0, 1, 255, 0); AddTextPrinterParameterized(0, 1, gText_WaitingTrainerFinishReading, 0, 1, 255, 0);
CopyWindowToVram(0, 3); CopyWindowToVram(0, 3);

View File

@ -1483,7 +1483,7 @@ static void Task_ExchangeCards(u8 taskId)
{ {
case 0: case 0:
if (GetMultiplayerId() == 0) if (GetMultiplayerId() == 0)
sub_800A4D8(2); SendBlockRequest(2);
gTasks[taskId].data[0]++; gTasks[taskId].data[0]++;
break; break;
case 1: case 1:
@ -1759,7 +1759,7 @@ static void Task_RunScriptAndFadeToActivity(u8 taskId)
} }
else else
{ {
sub_800ADF8(); SetLinkStandbyCallback();
data[0] = 3; data[0] = 3;
} }
} }
@ -1795,7 +1795,7 @@ static void Task_RunScriptAndFadeToActivity(u8 taskId)
DestroyTask(taskId); DestroyTask(taskId);
break; break;
case 7: case 7:
sub_800AC34(); SetCloseLinkCallback();
data[0] = 8; data[0] = 8;
break; break;
case 8: case 8:
@ -2018,7 +2018,7 @@ static void Task_MEvent_Leader(u8 taskId)
Free(data->field_8); Free(data->field_8);
Free(data->field_0); Free(data->field_0);
Free(data->field_4); Free(data->field_4);
sub_800ADF8(); SetLinkStandbyCallback();
data->state++; data->state++;
break; break;
case 17: case 17:
@ -2188,7 +2188,7 @@ static void Task_CardOrNewsWithFriend(u8 taskId)
break; break;
case 11: case 11:
data->state++; data->state++;
sub_800ADF8(); SetLinkStandbyCallback();
break; break;
case 12: case 12:
if (IsLinkTaskFinished()) if (IsLinkTaskFinished())
@ -2367,7 +2367,7 @@ static void Task_CardOrNewsOverWireless(u8 taskId)
break; break;
case 13: case 13:
data->state++; data->state++;
sub_800ADF8(); SetLinkStandbyCallback();
break; break;
case 14: case 14:
if (IsLinkTaskFinished()) if (IsLinkTaskFinished())
@ -2714,7 +2714,7 @@ static void Task_RunUnionRoom(u8 taskId)
} }
break; break;
case UR_STATE_REQUEST_DECLINED: case UR_STATE_REQUEST_DECLINED:
sub_800AC34(); SetCloseLinkCallback();
uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG; uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG;
break; break;
case UR_STATE_SEND_TRADE_REQUST: case UR_STATE_SEND_TRADE_REQUST:
@ -2763,7 +2763,7 @@ static void Task_RunUnionRoom(u8 taskId)
if (PrintOnTextbox(&uroom->textState, gStringVar4)) if (PrintOnTextbox(&uroom->textState, gStringVar4))
{ {
uroom->state = UR_STATE_WAIT_FINISH_READING_CARD; uroom->state = UR_STATE_WAIT_FINISH_READING_CARD;
sub_800ADF8(); SetLinkStandbyCallback();
uroom->partnerYesNoResponse = 0; uroom->partnerYesNoResponse = 0;
uroom->recvActivityRequest[0] = 0; uroom->recvActivityRequest[0] = 0;
} }
@ -2940,7 +2940,7 @@ static void Task_RunUnionRoom(u8 taskId)
} }
break; break;
case UR_STATE_DECLINE_ACTIVITY_REQUEST: case UR_STATE_DECLINE_ACTIVITY_REQUEST:
sub_800AC34(); SetCloseLinkCallback();
uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG; uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG;
break; break;
case UR_STATE_CANCEL_REQUEST_PRINT_MSG: case UR_STATE_CANCEL_REQUEST_PRINT_MSG:
@ -2962,7 +2962,7 @@ static void Task_RunUnionRoom(u8 taskId)
ScheduleFieldMessageWithFollowupState(UR_STATE_START_ACTIVITY_LINK, gStringVar4); ScheduleFieldMessageWithFollowupState(UR_STATE_START_ACTIVITY_LINK, gStringVar4);
break; break;
case UR_STATE_START_ACTIVITY_LINK: case UR_STATE_START_ACTIVITY_LINK:
sub_800ADF8(); SetLinkStandbyCallback();
uroom->state = UR_STATE_START_ACTIVITY_WAIT_FOR_LINK; uroom->state = UR_STATE_START_ACTIVITY_WAIT_FOR_LINK;
break; break;
case UR_STATE_START_ACTIVITY_WAIT_FOR_LINK: case UR_STATE_START_ACTIVITY_WAIT_FOR_LINK:
@ -3231,7 +3231,7 @@ static bool32 UnionRoom_HandleContactFromOtherPlayer(struct WirelessLink_URoom *
else if (id == 2) // No activity else if (id == 2) // No activity
{ {
uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG; uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG;
sub_800AC34(); SetCloseLinkCallback();
return FALSE; return FALSE;
} }
} }

View File

@ -174,7 +174,7 @@ void CB2_UnionRoomBattle(void)
} }
else else
{ {
sub_800AC34(); SetCloseLinkCallback();
if (gBlockRecvBuffer[GetMultiplayerId()][0] == (ACTIVITY_DECLINE | IN_UNION_ROOM)) if (gBlockRecvBuffer[GetMultiplayerId()][0] == (ACTIVITY_DECLINE | IN_UNION_ROOM))
{ {
gMain.state = 6; gMain.state = 6;
@ -190,7 +190,7 @@ void CB2_UnionRoomBattle(void)
case 50: case 50:
if (!UpdatePaletteFade()) if (!UpdatePaletteFade())
{ {
sub_800ADF8(); SetLinkStandbyCallback();
gMain.state++; gMain.state++;
} }
break; break;

View File

@ -1267,7 +1267,7 @@ static void Chat_Exit(void)
case 5: case 5:
if (IsLinkTaskFinished() && !sub_8011A9C()) if (IsLinkTaskFinished() && !sub_8011A9C())
{ {
sub_800AC34(); SetCloseLinkCallback();
sChat->exitDelayTimer = 0; sChat->exitDelayTimer = 0;
sChat->funcState++; sChat->funcState++;
} }
@ -1302,7 +1302,7 @@ static void Chat_Drop(void)
case 1: case 1:
if (!IsDisplaySubtaskActive(0) && IsLinkTaskFinished() && !sub_8011A9C()) if (!IsDisplaySubtaskActive(0) && IsLinkTaskFinished() && !sub_8011A9C())
{ {
sub_800AC34(); SetCloseLinkCallback();
sChat->exitDelayTimer = 0; sChat->exitDelayTimer = 0;
sChat->funcState++; sChat->funcState++;
} }
@ -1348,7 +1348,7 @@ static void Chat_Disbanded(void)
case 2: case 2:
if (IsDisplaySubtaskActive(0) != TRUE && IsLinkTaskFinished() && !sub_8011A9C()) if (IsDisplaySubtaskActive(0) != TRUE && IsLinkTaskFinished() && !sub_8011A9C())
{ {
sub_800AC34(); SetCloseLinkCallback();
sChat->exitDelayTimer = 0; sChat->exitDelayTimer = 0;
sChat->funcState++; sChat->funcState++;
} }