diff --git a/data/scripts/cable_club.inc b/data/scripts/cable_club.inc index d4936ab7f..afa923a0a 100644 --- a/data/scripts/cable_club.inc +++ b/data/scripts/cable_club.inc @@ -275,12 +275,12 @@ CableClub_EventScript_TryEnterColosseum:: special TryBattleLinkup waitstate call EventScript_RestorePrevTextColor - goto_if_eq VAR_RESULT, 1, CableClub_EventScript_EnterColosseum - goto_if_eq VAR_RESULT, 2, CableClub_EventScript_AbortLinkSomeoneNotReady - goto_if_eq VAR_RESULT, 3, CableClub_EventScript_AbortLinkDifferentSelections - goto_if_eq VAR_RESULT, 4, CableClub_EventScript_AbortLinkIncorrectNumberOfBattlers - goto_if_eq VAR_RESULT, 5, CableClub_EventScript_AbortLink - goto_if_eq VAR_RESULT, 6, CableClub_EventScript_AbortLinkConnectionError + goto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterColosseum + goto_if_eq VAR_RESULT, LINKUP_SOMEONE_NOT_READY, CableClub_EventScript_AbortLinkSomeoneNotReady + goto_if_eq VAR_RESULT, LINKUP_DIFF_SELECTIONS, CableClub_EventScript_AbortLinkDifferentSelections + goto_if_eq VAR_RESULT, LINKUP_WRONG_NUM_PLAYERS, CableClub_EventScript_AbortLinkIncorrectNumberOfBattlers + goto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_AbortLink + goto_if_eq VAR_RESULT, LINKUP_CONNECTION_ERROR, CableClub_EventScript_AbortLinkConnectionError end CableClub_EventScript_EnterColosseum:: @@ -373,14 +373,14 @@ CableClub_EventScript_TradeCenter:: special TryTradeLinkup waitstate call EventScript_RestorePrevTextColor - goto_if_eq VAR_RESULT, 1, CableClub_EventScript_EnterTradeCenter - goto_if_eq VAR_RESULT, 2, CableClub_EventScript_AbortLinkSomeoneNotReady - goto_if_eq VAR_RESULT, 3, CableClub_EventScript_AbortLinkDifferentSelections - goto_if_eq VAR_RESULT, 4, CableClub_EventScript_AbortLinkIncorrectNumberOfParticipants - goto_if_eq VAR_RESULT, 5, CableClub_EventScript_AbortLink - goto_if_eq VAR_RESULT, 6, CableClub_EventScript_AbortLinkConnectionError - goto_if_eq VAR_RESULT, 7, CableClub_EventScript_AbortLinkPlayerNotReady - goto_if_eq VAR_RESULT, 9, CableClub_EventScript_AbortLinkOtherTrainerNotReady + goto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterTradeCenter + goto_if_eq VAR_RESULT, LINKUP_SOMEONE_NOT_READY, CableClub_EventScript_AbortLinkSomeoneNotReady + goto_if_eq VAR_RESULT, LINKUP_DIFF_SELECTIONS, CableClub_EventScript_AbortLinkDifferentSelections + goto_if_eq VAR_RESULT, LINKUP_WRONG_NUM_PLAYERS, CableClub_EventScript_AbortLinkIncorrectNumberOfParticipants + goto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_AbortLink + goto_if_eq VAR_RESULT, LINKUP_CONNECTION_ERROR, CableClub_EventScript_AbortLinkConnectionError + goto_if_eq VAR_RESULT, LINKUP_PLAYER_NOT_READY, CableClub_EventScript_AbortLinkPlayerNotReady + goto_if_eq VAR_RESULT, LINKUP_PARTNER_NOT_READY, CableClub_EventScript_AbortLinkOtherTrainerNotReady end CableClub_EventScript_EnterTradeCenter:: @@ -963,17 +963,17 @@ CableClub_EventScript_ChooseLinkLeaderFrom2:: CableClub_EventScript_TryLeadGroup2Players:: call CableClub_EventScript_TryBecomeLinkLeader - goto_if_eq VAR_RESULT, 1, CableClub_EventScript_EnterWirelessLinkRoom - goto_if_eq VAR_RESULT, 5, CableClub_EventScript_ChooseLinkLeaderFrom2 - goto_if_eq VAR_RESULT, 8, CableClub_EventScript_TryLeadGroup2Players + goto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterWirelessLinkRoom + goto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeaderFrom2 + goto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryLeadGroup2Players release return CableClub_EventScript_TryJoinGroup2Players:: call CableClub_EventScript_TryJoinLinkGroup - goto_if_eq VAR_RESULT, 1, CableClub_EventScript_EnterWirelessLinkRoom - goto_if_eq VAR_RESULT, 5, CableClub_EventScript_ChooseLinkLeaderFrom2 - goto_if_eq VAR_RESULT, 8, CableClub_EventScript_TryJoinGroup2Players + goto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterWirelessLinkRoom + goto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeaderFrom2 + goto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryJoinGroup2Players release return @@ -992,17 +992,17 @@ CableClub_EventScript_ChooseLinkLeaderFrom4:: CableClub_EventScript_TryLeadGroup4Players:: call CableClub_EventScript_TryBecomeLinkLeader - goto_if_eq VAR_RESULT, 1, CableClub_EventScript_EnterWirelessLinkRoom - goto_if_eq VAR_RESULT, 5, CableClub_EventScript_ChooseLinkLeaderFrom4 - goto_if_eq VAR_RESULT, 8, CableClub_EventScript_TryLeadGroup4Players + goto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterWirelessLinkRoom + goto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeaderFrom4 + goto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryLeadGroup4Players release return CableClub_EventScript_TryJoinGroup4Players:: call CableClub_EventScript_TryJoinLinkGroup - goto_if_eq VAR_RESULT, 1, CableClub_EventScript_EnterWirelessLinkRoom - goto_if_eq VAR_RESULT, 5, CableClub_EventScript_ChooseLinkLeaderFrom4 - goto_if_eq VAR_RESULT, 8, CableClub_EventScript_TryJoinGroup4Players + goto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterWirelessLinkRoom + goto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeaderFrom4 + goto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryJoinGroup4Players release return @@ -1021,17 +1021,17 @@ CableClub_EventScript_ChooseLinkLeader:: CableClub_EventScript_TryLeadGroupXPlayers:: call CableClub_EventScript_TryBecomeLinkLeader - goto_if_eq VAR_RESULT, 1, CableClub_EventScript_EnterWirelessLinkRoom - goto_if_eq VAR_RESULT, 5, CableClub_EventScript_ChooseLinkLeader - goto_if_eq VAR_RESULT, 8, CableClub_EventScript_TryLeadGroupXPlayers + goto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterWirelessLinkRoom + goto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeader + goto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryLeadGroupXPlayers release return CableClub_EventScript_TryJoinGroupXPlayers:: call CableClub_EventScript_TryJoinLinkGroup - goto_if_eq VAR_RESULT, 1, CableClub_EventScript_EnterWirelessLinkRoom - goto_if_eq VAR_RESULT, 5, CableClub_EventScript_ChooseLinkLeader - goto_if_eq VAR_RESULT, 8, CableClub_EventScript_TryJoinGroupXPlayers + goto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterWirelessLinkRoom + goto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeader + goto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryJoinGroupXPlayers release return @@ -1217,17 +1217,17 @@ CableClub_EventScript_ChooseLinkLeaderMinigame:: CableClub_EventScript_TryBecomeMinigameLinkLeader:: call CableClub_EventScript_TryBecomeLinkLeader - goto_if_eq VAR_RESULT, 1, CableClub_EventScript_EnterMinigame - goto_if_eq VAR_RESULT, 5, CableClub_EventScript_ChooseLinkLeaderMinigame - goto_if_eq VAR_RESULT, 8, CableClub_EventScript_TryBecomeMinigameLinkLeader + goto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterMinigame + goto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeaderMinigame + goto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryBecomeMinigameLinkLeader release return CableClub_EventScript_TryJoinMinigameLinkGroup:: call CableClub_EventScript_TryJoinLinkGroup - goto_if_eq VAR_RESULT, 1, CableClub_EventScript_EnterMinigame - goto_if_eq VAR_RESULT, 5, CableClub_EventScript_ChooseLinkLeaderMinigame - goto_if_eq VAR_RESULT, 8, CableClub_EventScript_TryJoinMinigameLinkGroup + goto_if_eq VAR_RESULT, LINKUP_SUCCESS, CableClub_EventScript_EnterMinigame + goto_if_eq VAR_RESULT, LINKUP_FAILED, CableClub_EventScript_ChooseLinkLeaderMinigame + goto_if_eq VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN, CableClub_EventScript_TryJoinMinigameLinkGroup release return diff --git a/include/battle_records.h b/include/battle_records.h index b66fbd686..cb6cd3747 100644 --- a/include/battle_records.h +++ b/include/battle_records.h @@ -2,6 +2,6 @@ #define GUARD_BATTLE_RECORDS_H void ClearPlayerLinkBattleRecords(void); -void TryRecordLinkBattleOutcome(s32 battlerId); +void UpdatePlayerLinkBattleRecords(s32 battlerId); #endif // GUARD_BATTLE_RECORDS_H diff --git a/include/cable_club.h b/include/cable_club.h index d89e8222c..7a36c5767 100644 --- a/include/cable_club.h +++ b/include/cable_club.h @@ -1,15 +1,8 @@ #ifndef GUARD_CABLE_CLUB_H #define GUARD_CABLE_CLUB_H -#include "task.h" - -// Exported type declarations - -// Exported RAM declarations - -// Exported ROM declarations -void Task_WaitForReceivedRemoteLinkPlayers5SecondTimeout(u8 taskId); -u8 CreateTask_ReestablishLinkInCableClubRoom(void); +void Task_WaitForLinkPlayerConnection(u8 taskId); +u8 CreateTask_ReestablishCableClubLink(void); void CB2_ReturnFromCableClubBattle(void); bool32 GetSeeingLinkPlayerCardMsg(u8 who); diff --git a/include/constants/cable_club.h b/include/constants/cable_club.h index f2aa4120c..7c2fedb42 100644 --- a/include/constants/cable_club.h +++ b/include/constants/cable_club.h @@ -12,4 +12,21 @@ #define USING_MINIGAME 8 #define USING_BATTLE_TOWER 9 +// Return states for the group of specials that use CreateLinkupTask +// A few also used by TryBecomeLinkLeader and TryJoinLinkGroup +#define LINKUP_ONGOING 0 +#define LINKUP_SUCCESS 1 +#define LINKUP_SOMEONE_NOT_READY 2 +#define LINKUP_DIFF_SELECTIONS 3 +#define LINKUP_WRONG_NUM_PLAYERS 4 +#define LINKUP_FAILED 5 +#define LINKUP_CONNECTION_ERROR 6 +#define LINKUP_PLAYER_NOT_READY 7 +#define LINKUP_RETRY_ROLE_ASSIGN 8 +#define LINKUP_PARTNER_NOT_READY 9 + +#define CABLE_SEAT_WAITING 0 +#define CABLE_SEAT_SUCCESS 1 +#define CABLE_SEAT_FAILED 2 + #endif //GUARD_CONSTANTS_CABLE_CLUB_H diff --git a/include/constants/maps.h b/include/constants/maps.h index 57cc1d078..6e127ede6 100644 --- a/include/constants/maps.h +++ b/include/constants/maps.h @@ -12,6 +12,8 @@ #define MAP(map) MAP_GROUP(map), MAP_NUM(map) +#define WARP_ID_DYNAMIC 0x7F + // Used to indicate an invalid warp id, for dummy warps or when a warp should // use the given coordinates rather than the coordinates of a target warp. #define WARP_ID_NONE (-1) diff --git a/include/field_message_box.h b/include/field_message_box.h index 0f81efb20..430f2baf0 100644 --- a/include/field_message_box.h +++ b/include/field_message_box.h @@ -3,6 +3,13 @@ #include "global.h" +enum { + FIELD_MESSAGE_BOX_HIDDEN, + FIELD_MESSAGE_BOX_UNUSED, + FIELD_MESSAGE_BOX_NORMAL, + FIELD_MESSAGE_BOX_AUTO_SCROLL, +}; + bool8 ShowFieldMessage(const u8 *message); bool8 ShowFieldAutoScrollMessage(const u8 *message); void HideFieldMessageBox(void); diff --git a/include/link.h b/include/link.h index 47f85bb9d..0f436ef8e 100644 --- a/include/link.h +++ b/include/link.h @@ -68,7 +68,7 @@ #define LINKTYPE_TRADE 0x1111 // trade #define LINKTYPE_0x1122 0x1122 // trade -#define LINKTYPE_0x1133 0x1133 // trade +#define LINKTYPE_TRADE_SETUP 0x1133 #define LINKTYPE_0x1144 0x1144 // trade #define LINKTYPE_BATTLE 0x2211 #define LINKTYPE_0x2222 0x2222 // unused battle? @@ -78,11 +78,19 @@ #define LINKTYPE_BATTLE_TOWER_50 0x2266 #define LINKTYPE_BATTLE_TOWER_OPEN 0x2277 #define LINKTYPE_BATTLE_TOWER 0x2288 -#define LINKTYPE_0x3311 0x3311 -#define LINKTYPE_0x3322 0x3322 +#define LINKTYPE_RECORD_MIX_BEFORE 0x3311 +#define LINKTYPE_RECORD_MIX_AFTER 0x3322 #define LINKTYPE_BERRY_BLENDER_SETUP 0x4411 #define LINKTYPE_CONTEST_GMODE 0x6601 +enum { + BLOCK_REQ_SIZE_NONE, // Identical to 200 + BLOCK_REQ_SIZE_200, + BLOCK_REQ_SIZE_100, + BLOCK_REQ_SIZE_220, + BLOCK_REQ_SIZE_40, +}; + #define MASTER_HANDSHAKE 0x8FFF #define SLAVE_HANDSHAKE 0xB9A0 @@ -102,11 +110,10 @@ enum EXCHANGE_NOT_STARTED, EXCHANGE_COMPLETE, EXCHANGE_TIMED_OUT, - EXCHANGE_IN_PROGRESS, - EXCHANGE_STAT_4, - EXCHANGE_STAT_5, - EXCHANGE_STAT_6, - EXCHANGE_STAT_7 + EXCHANGE_DIFF_SELECTIONS, + EXCHANGE_PLAYER_NOT_READY, + EXCHANGE_PARTNER_NOT_READY, + EXCHANGE_WRONG_NUM_PLAYERS, }; enum @@ -269,17 +276,17 @@ void ClearLinkCallback_2(void); void Rfu_SetLinkStandbyCallback(void); void ConvertLinkPlayerName(struct LinkPlayer * linkPlayer); bool8 IsWirelessAdapterConnected(void); -bool8 Link_PrepareCmd0xCCCC_Rfu0xA100(u8 blockRequestType); +bool8 SendBlockRequest(u8 blockRequestType); void LinkVSync(void); bool8 HandleLinkConnection(void); void LocalLinkPlayerToBlock(void); void LinkPlayerFromBlock(u32 who); void SetLinkErrorFromRfu(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 isConnectionError); -u8 sub_800A8D4(void); -void sub_800AA24(void); -void sub_800A900(u8 a0); -u8 sub_800A8A4(void); -void sub_800A9A4(void); +u8 GetLinkPlayerCountAsBitFlags(void); +void ResetLinkPlayerCount(void); +void SaveLinkPlayers(u8 numPlayers); +u8 GetSavedLinkPlayerCountAsBitFlags(void); +void CheckLinkPlayersMatchSaved(void); void SetLocalLinkPlayerId(u8 playerId); bool32 IsSendingKeysToLink(void); u32 GetLinkRecvQueueLength(void); diff --git a/include/mevent.h b/include/mevent.h index 3dc1621b0..8a75dde65 100644 --- a/include/mevent.h +++ b/include/mevent.h @@ -3,6 +3,12 @@ #include "global.h" +#define CARD_STAT_BATTLES_WON 0 +#define CARD_STAT_BATTLES_LOST 1 +#define CARD_STAT_NUM_TRADES 2 +#define CARD_STAT_NUM_STAMPS 3 +#define CARD_STAT_MAX_STAMPS 4 + struct MEventClientHeaderStruct { u32 unk_00; @@ -85,7 +91,7 @@ bool32 WonderCard_Test_Unk_08_6(void); u32 MENews_GetInput(u16 input); void InitMEventData(void); u16 MEvent_GetBattleCardCount(u32 command); -void MEvent_RecordIdOfWonderCardSenderByEventType(u32 eventId, u32 trainerId); +void MysteryGift_TryIncrementStat(u32 eventId, u32 trainerId); u16 *GetMEventProfileECWordsMaybe(void); void ResetReceivedWonderCardFlag(void); bool32 MEventHandleReceivedWonderCard(u16 flagId); diff --git a/include/new_menu_helpers.h b/include/new_menu_helpers.h index 99a8e1400..a44595257 100644 --- a/include/new_menu_helpers.h +++ b/include/new_menu_helpers.h @@ -31,7 +31,7 @@ void DrawDialogueFrame(u8 windowId, bool8 transfer); void DrawStdWindowFrame(u8 windowId, bool8 copyNow); void ClearDialogWindowAndFrame(u8 windowId, bool8 copyToVram); void ClearStdWindowAndFrame(u8 windowId, bool8 copyNow); -void sub_80F771C(bool8 copyToVram); +void EraseFieldMessageBox(bool8 copyToVram); void SetStdWindowBorderStyle(u8 windowId, bool8 copyToVram); void sub_80F7768(u8 windowId, bool8 copyToVram); void Menu_LoadStdPal(void); diff --git a/include/strings.h b/include/strings.h index 63fed5e97..d904442f1 100644 --- a/include/strings.h +++ b/include/strings.h @@ -1174,11 +1174,11 @@ extern const u8 gText_ExcellentsInARow[]; extern const u8 gText_PkmnJumpRecords[]; // cable_club -extern const u8 gUnknown_841DF82[]; -extern const u8 gUnknown_841DF8B[]; -extern const u8 gUnknown_841DF92[]; -extern const u8 gUnknown_841DF99[]; -extern const u8 gUnknown_841DFA0[]; +extern const u8 gText_NumPlayerLink[]; +extern const u8 gText_BronzeCard[]; +extern const u8 gText_CopperCard[]; +extern const u8 gText_SilverCard[]; +extern const u8 gText_GoldCard[]; // berry_crush extern const u8 gText_BerryCrush_AreYouReady[]; diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 205c49362..cd4f2c89d 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -36,7 +36,7 @@ void HandleLinkBattleSetup(void) SetWirelessCommType1(); if (!gReceivedRemoteLinkPlayers) OpenLink(); - CreateTask(Task_WaitForReceivedRemoteLinkPlayers5SecondTimeout, 0); + CreateTask(Task_WaitForLinkPlayerConnection, 0); CreateTasksForSendRecvLinkBuffers(); } } diff --git a/src/battle_records.c b/src/battle_records.c index 4bde6aec9..dbf8ccef2 100644 --- a/src/battle_records.c +++ b/src/battle_records.c @@ -440,7 +440,7 @@ static void UpdateBattleOutcomeOnTrainerCards(s32 battlerId) } } -void TryRecordLinkBattleOutcome(s32 battlerId) +void UpdatePlayerLinkBattleRecords(s32 battlerId) { if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(UNION_ROOM) || gSaveBlock1Ptr->location.mapNum != MAP_NUM(UNION_ROOM)) { diff --git a/src/cable_club.c b/src/cable_club.c index 42bf2bc59..8b08456c0 100644 --- a/src/cable_club.c +++ b/src/cable_club.c @@ -25,28 +25,38 @@ #include "constants/songs.h" #include "constants/cable_club.h" #include "constants/field_weather.h" +#include "constants/maps.h" u32 UnusedVarNeededToMatch[8]; -static void Task_Linkup0(u8 taskId); -static void Task_Linkup1(u8 taskId); -static void Task_LinkupMaster_2(u8 taskId); -static void Task_LinkupMaster_3(u8 taskId); -static void Task_LinkupMaster_4(u8 taskId); -static void Task_LinkupMaster_5(u8 taskId); -static void Task_LinkupSlave_2(u8 taskId); -static void Task_LinkupMaster_6(u8 taskId); -static void Task_Linkup_6a(u8 taskId); -static void Task_Linkup_7(u8 taskId); -static void Task_Linkup_Canceled(u8 taskId); -static void Task_Linkup_ErroredOut(u8 taskId); -static bool8 Task_Linkup_TimedOut(u8 taskId); -static void Task_ReestablishLinkInCableClubRoom_0(u8 taskId); -static void Task_ReestablishLinkInCableClubRoom_1(u8 taskId); -static void Task_ReestablishLinkInCableClubRoom_Master(u8 taskId); -static void Task_ReestablishLinkInCableClubRoom_2(u8 taskId); +static void Task_LinkupStart(u8 taskId); +static void Task_LinkupAwaitConnection(u8 taskId); +static void Task_LinkupConfirmWhenReady(u8 taskId); +static void Task_LinkupAwaitConfirmation(u8 taskId); +static void Task_LinkupTryConfirmation(u8 taskId); +static void Task_LinkupConfirm(u8 taskId); +static void Task_LinkupExchangeDataWithLeader(u8 taskId); +static void Task_LinkupCheckStatusAfterConfirm(u8 taskId); +static void Task_LinkupAwaitTrainerCardData(u8 taskId); +static void Task_StopLinkup(u8 taskId); +static void Task_LinkupFailed(u8 taskId); +static void Task_LinkupConnectionError(u8 taskId); +static bool8 TryLinkTimeout(u8 taskId); +static void Task_ReestablishLink(u8 taskId); +static void Task_ReestablishLinkAwaitConnection(u8 taskId); +static void Task_ReestablishLinkLeader(u8 taskId); +static void Task_ReestablishLinkAwaitConfirmation(u8 taskId); -static const struct WindowTemplate gUnknown_83C6AB0 = { +#define tState data[0] + + +#define tMinPlayers data[1] +#define tMaxPlayers data[2] +#define tNumPlayers data[3] +#define tTimer data[4] +#define tWindowId data[5] + +static const struct WindowTemplate sWindowTemplate_LinkPlayerCount = { .bg = 0, .tilemapLeft = 16, .tilemapTop = 11, @@ -56,270 +66,290 @@ static const struct WindowTemplate gUnknown_83C6AB0 = { .baseBlock = 0x125 }; -static const u8 *const sStarsMessagePtrs[] = { - gUnknown_841DF8B, - gUnknown_841DF92, - gUnknown_841DF99, - gUnknown_841DFA0 +static const u8 *const sTrainerCardColorNames[] = { + gText_BronzeCard, + gText_CopperCard, + gText_SilverCard, + gText_GoldCard }; -static void CreateLinkupTask(u8 lower, u8 higher) +static void CreateLinkupTask(u8 minPlayers, u8 maxPlayers) { u8 taskId; - if (FindTaskIdByFunc(Task_Linkup0) == 0xFF) + if (FindTaskIdByFunc(Task_LinkupStart) == TASK_NONE) { - taskId = CreateTask(Task_Linkup0, 80); - gTasks[taskId].data[1] = lower; - gTasks[taskId].data[2] = higher; + taskId = CreateTask(Task_LinkupStart, 80); + gTasks[taskId].tMinPlayers = minPlayers; + gTasks[taskId].tMaxPlayers = maxPlayers; } } -static void PrintNewCountOnLinkPlayerCountDisplayWindow(u16 windowId, s32 num) +static void PrintNumPlayersInLink(u16 windowId, s32 numPlayers) { - ConvertIntToDecimalStringN(gStringVar1, num, STR_CONV_MODE_LEFT_ALIGN, 1); + ConvertIntToDecimalStringN(gStringVar1, numPlayers, STR_CONV_MODE_LEFT_ALIGN, 1); SetStdWindowBorderStyle(windowId, FALSE); - StringExpandPlaceholders(gStringVar4, gUnknown_841DF82); + StringExpandPlaceholders(gStringVar4, gText_NumPlayerLink); AddTextPrinterParameterized(windowId, FONT_2, gStringVar4, 0, 0, TEXT_SKIP_DRAW, NULL); CopyWindowToVram(windowId, COPYWIN_FULL); } -static void DestroyLinkPlayerCountDisplayWindow(u16 windowId) +static void ClearLinkPlayerCountWindow(u16 windowId) { ClearStdWindowAndFrame(windowId, FALSE); CopyWindowToVram(windowId, COPYWIN_FULL); } -static void UpdateLinkPlayerCountDisplay(u8 taskId, u8 num) +static void UpdateLinkPlayerCountDisplay(u8 taskId, u8 numPlayers) { s16 *data = gTasks[taskId].data; - if (num != data[3]) + if (numPlayers != tNumPlayers) { - if (num < 2) - DestroyLinkPlayerCountDisplayWindow(data[5]); + if (numPlayers < 2) + ClearLinkPlayerCountWindow(tWindowId); else - PrintNewCountOnLinkPlayerCountDisplayWindow(data[5], num); - data[3] = num; + PrintNumPlayersInLink(tWindowId, numPlayers); + tNumPlayers = numPlayers; } } -static u16 sub_8080844(u8 lower, u8 higher) +static u16 ExchangeDataAndGetLinkupStatus(u8 minPlayers, u8 maxPlayers) { - switch (GetLinkPlayerDataExchangeStatusTimed(lower, higher)) + switch (GetLinkPlayerDataExchangeStatusTimed(minPlayers, maxPlayers)) { case EXCHANGE_COMPLETE: - return 1; - case EXCHANGE_IN_PROGRESS: - return 3; - case EXCHANGE_STAT_4: - return 7; - case EXCHANGE_STAT_5: - return 9; - case EXCHANGE_STAT_6: + return LINKUP_SUCCESS; + case EXCHANGE_DIFF_SELECTIONS: + return LINKUP_DIFF_SELECTIONS; + case EXCHANGE_PLAYER_NOT_READY: + return LINKUP_PLAYER_NOT_READY; + case EXCHANGE_PARTNER_NOT_READY: + return LINKUP_PARTNER_NOT_READY; + case EXCHANGE_WRONG_NUM_PLAYERS: ConvertIntToDecimalStringN(gStringVar1, GetLinkPlayerCount_2(), STR_CONV_MODE_LEFT_ALIGN, 1); - return 4; + return LINKUP_WRONG_NUM_PLAYERS; default: - return 0; + return LINKUP_ONGOING; } } -static bool32 sub_80808BC(u8 taskId) +static bool32 CheckLinkErrored(u8 taskId) { if (HasLinkErrorOccurred() == TRUE) { - gTasks[taskId].func = Task_Linkup_ErroredOut; + gTasks[taskId].func = Task_LinkupConnectionError; return TRUE; } return FALSE; } -static bool32 sub_80808F0(u8 taskId) +static bool32 CheckLinkCanceledBeforeConnection(u8 taskId) { if (JOY_NEW(B_BUTTON) && !IsLinkConnectionEstablished()) { gLinkType = 0; - gTasks[taskId].func = Task_Linkup_Canceled; + gTasks[taskId].func = Task_LinkupFailed; return TRUE; } return FALSE; } -static bool32 sub_808093C(u8 taskId) +static bool32 CheckLinkCanceled(u8 taskId) { if (IsLinkConnectionEstablished()) - { SetSuppressLinkErrorMessage(TRUE); - } + if (JOY_NEW(B_BUTTON)) { gLinkType = 0; - gTasks[taskId].func = Task_Linkup_Canceled; + gTasks[taskId].func = Task_LinkupFailed; return TRUE; } return FALSE; } -static bool32 sub_8080990(u8 taskId) +static bool32 CheckSioErrored(u8 taskId) { if (GetSioMultiSI() == TRUE) { - gTasks[taskId].func = Task_Linkup_ErroredOut; + gTasks[taskId].func = Task_LinkupConnectionError; return TRUE; } return FALSE; } -static void sub_80809C4(u8 taskId) +// Unused +static void Task_DelayedBlockRequest(u8 taskId) { gTasks[taskId].data[0]++; if (gTasks[taskId].data[0] == 10) { - Link_PrepareCmd0xCCCC_Rfu0xA100(2); + SendBlockRequest(BLOCK_REQ_SIZE_100); DestroyTask(taskId); } } -static void Task_Linkup0(u8 taskId) +static void Task_LinkupStart(u8 taskId) { s16 *data = gTasks[taskId].data; if (data[0] == 0) { OpenLinkTimed(); - sub_800AA24(); + ResetLinkPlayerCount(); ResetLinkPlayers(); - data[5] = AddWindow(&gUnknown_83C6AB0); + tWindowId = AddWindow(&sWindowTemplate_LinkPlayerCount); } else if (data[0] > 9) { - gTasks[taskId].func = Task_Linkup1; + gTasks[taskId].func = Task_LinkupAwaitConnection; } data[0]++; } -static void Task_Linkup1(u8 taskId) +static void Task_LinkupAwaitConnection(u8 taskId) { - u8 linkPlayerCount = GetLinkPlayerCount_2(); - if (sub_80808F0(taskId) != TRUE && sub_808093C(taskId) != TRUE && linkPlayerCount >= 2) + u8 playerCount = GetLinkPlayerCount_2(); + if (CheckLinkCanceledBeforeConnection(taskId) == TRUE + || CheckLinkCanceled(taskId) == TRUE + || playerCount < 2) + return; + + SetSuppressLinkErrorMessage(TRUE); + gTasks[taskId].data[3] = 0; + if (IsLinkMaster() == TRUE) { - SetSuppressLinkErrorMessage(TRUE); - gTasks[taskId].data[3] = 0; - if (IsLinkMaster() == TRUE) - { - PlaySE(SE_PIN); - ShowFieldAutoScrollMessage(CableClub_Text_WhenAllPlayersReadyAConfirmBCancel); - gTasks[taskId].func = Task_LinkupMaster_2; - } - else - { - PlaySE(SE_BOO); - ShowFieldAutoScrollMessage(CableClub_Text_AwaitingLinkupBCancel); - gTasks[taskId].func = Task_LinkupSlave_2; - } + PlaySE(SE_PIN); + ShowFieldAutoScrollMessage(CableClub_Text_WhenAllPlayersReadyAConfirmBCancel); + gTasks[taskId].func = Task_LinkupConfirmWhenReady; + } + else + { + PlaySE(SE_BOO); + ShowFieldAutoScrollMessage(CableClub_Text_AwaitingLinkupBCancel); + gTasks[taskId].func = Task_LinkupExchangeDataWithLeader; } } -static void Task_LinkupMaster_2(u8 taskId) +static void Task_LinkupConfirmWhenReady(u8 taskId) { - if (sub_80808F0(taskId) != TRUE && sub_8080990(taskId) != TRUE && sub_80808BC(taskId) != TRUE && !GetFieldMessageBoxType()) + if (CheckLinkCanceledBeforeConnection(taskId) == TRUE + || CheckSioErrored(taskId) == TRUE + || CheckLinkErrored(taskId) == TRUE) + return; + + if (GetFieldMessageBoxType() == FIELD_MESSAGE_BOX_HIDDEN) { - gTasks[taskId].data[3] = 0; - gTasks[taskId].func = Task_LinkupMaster_3; + gTasks[taskId].tNumPlayers = 0; + gTasks[taskId].func = Task_LinkupAwaitConfirmation; } } -static void Task_LinkupMaster_3(u8 taskId) +static void Task_LinkupAwaitConfirmation(u8 taskId) { s16 *data = gTasks[taskId].data; s32 linkPlayerCount = GetLinkPlayerCount_2(); - if (sub_80808F0(taskId) != TRUE && sub_8080990(taskId) != TRUE && sub_80808BC(taskId) != TRUE) + + if (CheckLinkCanceledBeforeConnection(taskId) == TRUE + || CheckSioErrored(taskId) == TRUE + || CheckLinkErrored(taskId) == TRUE) + return; + + UpdateLinkPlayerCountDisplay(taskId, linkPlayerCount); + if (JOY_NEW(A_BUTTON) && linkPlayerCount >= tMinPlayers) { - UpdateLinkPlayerCountDisplay(taskId, linkPlayerCount); - if (JOY_NEW(A_BUTTON) && linkPlayerCount >= data[1]) - { - sub_800A900(linkPlayerCount); - DestroyLinkPlayerCountDisplayWindow(data[5]); - ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1); - ShowFieldAutoScrollMessage(CableClub_Text_StartLinkWithXPlayersAConfirmBCancel); - gTasks[taskId].func = Task_LinkupMaster_4; - } + SaveLinkPlayers(linkPlayerCount); + ClearLinkPlayerCountWindow(tWindowId); + ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1); + ShowFieldAutoScrollMessage(CableClub_Text_StartLinkWithXPlayersAConfirmBCancel); + gTasks[taskId].func = Task_LinkupTryConfirmation; } + } -static void Task_LinkupMaster_4(u8 taskId) +static void Task_LinkupTryConfirmation(u8 taskId) { - if (sub_80808F0(taskId) != TRUE && sub_8080990(taskId) != TRUE && sub_80808BC(taskId) != TRUE && !GetFieldMessageBoxType()) + if (CheckLinkCanceledBeforeConnection(taskId) == TRUE + || CheckSioErrored(taskId) == TRUE + || CheckLinkErrored(taskId) == TRUE) + return; + + if (GetFieldMessageBoxType() == FIELD_MESSAGE_BOX_HIDDEN) { if (GetSavedPlayerCount() != GetLinkPlayerCount_2()) { ShowFieldAutoScrollMessage(CableClub_Text_WhenAllPlayersReadyAConfirmBCancel); - gTasks[taskId].func = Task_LinkupMaster_2; + gTasks[taskId].func = Task_LinkupConfirmWhenReady; } else if (JOY_HELD(B_BUTTON)) { ShowFieldAutoScrollMessage(CableClub_Text_WhenAllPlayersReadyAConfirmBCancel); - gTasks[taskId].func = Task_LinkupMaster_2; + gTasks[taskId].func = Task_LinkupConfirmWhenReady; } else if (JOY_HELD(A_BUTTON)) { PlaySE(SE_SELECT); CheckShouldAdvanceLinkState(); - gTasks[taskId].func = Task_LinkupMaster_5; + gTasks[taskId].func = Task_LinkupConfirm; } } } -static void Task_LinkupMaster_5(u8 taskId) +static void Task_LinkupConfirm(u8 taskId) { - u8 lower = gTasks[taskId].data[1]; - u8 higher = gTasks[taskId].data[2]; - u16 *res; - if (sub_80808BC(taskId) != TRUE && Task_Linkup_TimedOut(taskId) != TRUE) + u8 minPlayers = gTasks[taskId].tMinPlayers; + u8 maxPlayers = gTasks[taskId].tMaxPlayers; + + if (CheckLinkErrored(taskId) == TRUE + || TryLinkTimeout(taskId) == TRUE) + return; + + if (GetLinkPlayerCount_2() != GetSavedPlayerCount()) { - if (GetLinkPlayerCount_2() != GetSavedPlayerCount()) - { - gTasks[taskId].func = Task_Linkup_ErroredOut; - } - else - { - res = &gSpecialVar_Result; - *res = sub_8080844(lower, higher); - if (*res) - gTasks[taskId].func = Task_LinkupMaster_6; - } + gTasks[taskId].func = Task_LinkupConnectionError; + } + else + { + u16 *result = &gSpecialVar_Result; + *result = ExchangeDataAndGetLinkupStatus(minPlayers, maxPlayers); + if (*result) + gTasks[taskId].func = Task_LinkupCheckStatusAfterConfirm; } } -static void Task_LinkupSlave_2(u8 taskId) +static void Task_LinkupExchangeDataWithLeader(u8 taskId) { - u8 lower = gTasks[taskId].data[1]; - u8 higher = gTasks[taskId].data[2]; - u16 *res; - if (sub_80808F0(taskId) != TRUE && sub_80808BC(taskId) != TRUE) + u8 minPlayers = gTasks[taskId].tMinPlayers; + u8 maxPlayers = gTasks[taskId].tMaxPlayers; + u16 *result; + + if (CheckLinkCanceledBeforeConnection(taskId) == TRUE + || CheckLinkErrored(taskId) == TRUE) + return; + + result = &gSpecialVar_Result; + *result = ExchangeDataAndGetLinkupStatus(minPlayers, maxPlayers); + if (*result == LINKUP_ONGOING) + return; + if (*result == LINKUP_DIFF_SELECTIONS + || *result == LINKUP_WRONG_NUM_PLAYERS) { - res = &gSpecialVar_Result; - *res = sub_8080844(lower, higher); - if (*res) - { - if (*res == 3 || *res == 4) - { - SetCloseLinkCallback(); - HideFieldMessageBox(); - gTasks[taskId].func = Task_Linkup_7; - } - else if (*res == 7 || *res == 9) - { - CloseLink(); - HideFieldMessageBox(); - gTasks[taskId].func = Task_Linkup_7; - } - else - { - gFieldLinkPlayerCount = GetLinkPlayerCount_2(); - gLocalLinkPlayerId = GetMultiplayerId(); - sub_800A900(gFieldLinkPlayerCount); - TrainerCard_GenerateCardForLinkPlayer((void *)gBlockSendBuffer); - gTasks[taskId].func = Task_Linkup_6a; - } - } + SetCloseLinkCallback(); + HideFieldMessageBox(); + gTasks[taskId].func = Task_StopLinkup; + } + else if (*result == LINKUP_PLAYER_NOT_READY + || *result == LINKUP_PARTNER_NOT_READY) + { + CloseLink(); + HideFieldMessageBox(); + gTasks[taskId].func = Task_StopLinkup; + } + else + { + gFieldLinkPlayerCount = GetLinkPlayerCount_2(); + gLocalLinkPlayerId = GetMultiplayerId(); + SaveLinkPlayers(gFieldLinkPlayerCount); + TrainerCard_GenerateCardForLinkPlayer((void *)gBlockSendBuffer); + gTasks[taskId].func = Task_LinkupAwaitTrainerCardData; } } @@ -337,120 +367,124 @@ static bool32 AnyConnectedPartnersPlayingRS(void) return FALSE; } -static void Task_LinkupMaster_6(u8 taskId) +static void Task_LinkupCheckStatusAfterConfirm(u8 taskId) { - if (sub_80808BC(taskId) != TRUE) + if (CheckLinkErrored(taskId) == TRUE) + return; + + if (gSpecialVar_Result == LINKUP_WRONG_NUM_PLAYERS) { - if (gSpecialVar_Result == 4) - { - if (AnyConnectedPartnersPlayingRS() == TRUE) - CloseLink(); - else - SetCloseLinkCallback(); - HideFieldMessageBox(); - gTasks[taskId].func = Task_Linkup_7; - } - else if (gSpecialVar_Result == 3) - { - SetCloseLinkCallback(); - HideFieldMessageBox(); - gTasks[taskId].func = Task_Linkup_7; - } - else if (gSpecialVar_Result == 7 || gSpecialVar_Result == 9) - { + if (AnyConnectedPartnersPlayingRS() == TRUE) CloseLink(); - HideFieldMessageBox(); - gTasks[taskId].func = Task_Linkup_7; - } else - { - gFieldLinkPlayerCount = GetLinkPlayerCount_2(); - gLocalLinkPlayerId = GetMultiplayerId(); - sub_800A900(gFieldLinkPlayerCount); - TrainerCard_GenerateCardForLinkPlayer((void *)gBlockSendBuffer); - gTasks[taskId].func = Task_Linkup_6a; - Link_PrepareCmd0xCCCC_Rfu0xA100(2); - } + SetCloseLinkCallback(); + HideFieldMessageBox(); + gTasks[taskId].func = Task_StopLinkup; + } + else if (gSpecialVar_Result == LINKUP_DIFF_SELECTIONS) + { + SetCloseLinkCallback(); + HideFieldMessageBox(); + gTasks[taskId].func = Task_StopLinkup; + } + else if (gSpecialVar_Result == LINKUP_PLAYER_NOT_READY + || gSpecialVar_Result == LINKUP_PARTNER_NOT_READY) + { + CloseLink(); + HideFieldMessageBox(); + gTasks[taskId].func = Task_StopLinkup; + } + else + { + gFieldLinkPlayerCount = GetLinkPlayerCount_2(); + gLocalLinkPlayerId = GetMultiplayerId(); + SaveLinkPlayers(gFieldLinkPlayerCount); + TrainerCard_GenerateCardForLinkPlayer((void *)gBlockSendBuffer); + gTasks[taskId].func = Task_LinkupAwaitTrainerCardData; + SendBlockRequest(BLOCK_REQ_SIZE_100); } } -static void Task_Linkup_6a(u8 taskId) +static void Task_LinkupAwaitTrainerCardData(u8 taskId) { u8 i; u16 version; u8 * dest; - if (sub_80808BC(taskId) != TRUE && GetBlockReceivedStatus() == sub_800A8A4()) + + if (CheckLinkErrored(taskId) == TRUE) + return; + + if (GetBlockReceivedStatus() != GetSavedLinkPlayerCountAsBitFlags()) + return; + + for (i = 0; i < GetLinkPlayerCount(); i++) { - for(i = 0; i < GetLinkPlayerCount(); i++) + version = gLinkPlayers[i].version & 0xFF; + if (version != VERSION_FIRE_RED && version != VERSION_LEAF_GREEN) { - version = gLinkPlayers[i].version & 0xFF; - if (version != VERSION_FIRE_RED && version != VERSION_LEAF_GREEN) - { - const struct TrainerCardRSE * src = (const struct TrainerCardRSE *)gBlockRecvBuffer[i]; - gTrainerCards[i].rse = *src; - gTrainerCards[i].version = gLinkPlayers[i].version; - } - else - { - const struct TrainerCard * src = (const struct TrainerCard *)gBlockRecvBuffer[i]; - gTrainerCards[i] = *src; - } - } - SetSuppressLinkErrorMessage(FALSE); - ResetBlockReceivedFlags(); - HideFieldMessageBox(); - if (gSpecialVar_Result == 1) - { - // Dumb trick required to match - if (gLinkType == LINKTYPE_BERRY_BLENDER_SETUP) - *UnusedVarNeededToMatch += 0; - DestroyLinkPlayerCountDisplayWindow(gTasks[taskId].data[5]); - ScriptContext_Enable(); - DestroyTask(taskId); + const struct TrainerCardRSE * src = (const struct TrainerCardRSE *)gBlockRecvBuffer[i]; + gTrainerCards[i].rse = *src; + gTrainerCards[i].version = gLinkPlayers[i].version; } else { - SetCloseLinkCallback(); - gTasks[taskId].func = Task_Linkup_7; + const struct TrainerCard * src = (const struct TrainerCard *)gBlockRecvBuffer[i]; + gTrainerCards[i] = *src; } } + SetSuppressLinkErrorMessage(FALSE); + ResetBlockReceivedFlags(); + HideFieldMessageBox(); + if (gSpecialVar_Result == LINKUP_SUCCESS) + { + // Dumb trick required to match + if (gLinkType == LINKTYPE_BERRY_BLENDER_SETUP) + *UnusedVarNeededToMatch += 0; + ClearLinkPlayerCountWindow(gTasks[taskId].tWindowId); + ScriptContext_Enable(); + DestroyTask(taskId); + } + else + { + SetCloseLinkCallback(); + gTasks[taskId].func = Task_StopLinkup; + } } -static void Task_Linkup_7(u8 taskId) +static void Task_StopLinkup(u8 taskId) { if (!gReceivedRemoteLinkPlayers) { - DestroyLinkPlayerCountDisplayWindow(gTasks[taskId].data[5]); + ClearLinkPlayerCountWindow(gTasks[taskId].tWindowId); ScriptContext_Enable(); - RemoveWindow(gTasks[taskId].data[5]); + RemoveWindow(gTasks[taskId].tWindowId); DestroyTask(taskId); } } -static void Task_Linkup_Canceled(u8 taskId) +static void Task_LinkupFailed(u8 taskId) { - gSpecialVar_Result = 5; - DestroyLinkPlayerCountDisplayWindow(gTasks[taskId].data[5]); + gSpecialVar_Result = LINKUP_FAILED; + ClearLinkPlayerCountWindow(gTasks[taskId].tWindowId); HideFieldMessageBox(); ScriptContext_Enable(); DestroyTask(taskId); } -static void Task_Linkup_ErroredOut(u8 taskId) +static void Task_LinkupConnectionError(u8 taskId) { - gSpecialVar_Result = 6; - DestroyLinkPlayerCountDisplayWindow(gTasks[taskId].data[5]); + gSpecialVar_Result = LINKUP_CONNECTION_ERROR; + ClearLinkPlayerCountWindow(gTasks[taskId].tWindowId); HideFieldMessageBox(); ScriptContext_Enable(); DestroyTask(taskId); } -static bool8 Task_Linkup_TimedOut(u8 taskId) +static bool8 TryLinkTimeout(u8 taskId) { - gTasks[taskId].data[4]++; - if (gTasks[taskId].data[4] > 600) + if (++gTasks[taskId].tTimer > 600) { - gTasks[taskId].func = Task_Linkup_ErroredOut; + gTasks[taskId].func = Task_LinkupConnectionError; return TRUE; } return FALSE; @@ -458,37 +492,47 @@ static bool8 Task_Linkup_TimedOut(u8 taskId) void TryBattleLinkup(void) { - u8 lower, higher; - higher = lower = 2; + u8 minPlayers = 2; + u8 maxPlayers = 2; + switch (gSpecialVar_0x8004) { case USING_SINGLE_BATTLE: - higher = lower = 2; + minPlayers = 2; + maxPlayers = 2; gLinkType = LINKTYPE_SINGLE_BATTLE; break; case USING_DOUBLE_BATTLE: - higher = lower = 2; + minPlayers = 2; + maxPlayers = 2; gLinkType = LINKTYPE_DOUBLE_BATTLE; break; case USING_MULTI_BATTLE: - higher = lower = 4; + minPlayers = 4; + maxPlayers = 4; gLinkType = LINKTYPE_MULTI_BATTLE; break; } - CreateLinkupTask(lower, higher); + CreateLinkupTask(minPlayers, maxPlayers); } +#undef tMinPlayers +#undef tMaxPlayers +#undef tNumPlayers +#undef tTimer +#undef tWindowId + void TryTradeLinkup(void) { - gLinkType = LINKTYPE_0x1133; + gLinkType = LINKTYPE_TRADE_SETUP; gBattleTypeFlags = 0; CreateLinkupTask(2, 2); } void TryRecordMixLinkup(void) { - gSpecialVar_Result = 0; - gLinkType = LINKTYPE_0x3311; + gSpecialVar_Result = LINKUP_ONGOING; + gLinkType = LINKTYPE_RECORD_MIX_BEFORE; gBattleTypeFlags = 0; CreateLinkupTask(2, 4); } @@ -500,10 +544,11 @@ void TryContestLinkup(void) CreateLinkupTask(4, 4); } -u8 CreateTask_ReestablishLinkInCableClubRoom(void) +u8 CreateTask_ReestablishCableClubLink(void) { - if (FuncIsActiveTask(Task_ReestablishLinkInCableClubRoom_0)) - return 0xFF; + if (FuncIsActiveTask(Task_ReestablishLink)) + return TASK_NONE; + switch (gSpecialVar_0x8004) { case USING_SINGLE_BATTLE: @@ -519,92 +564,94 @@ u8 CreateTask_ReestablishLinkInCableClubRoom(void) gLinkType = LINKTYPE_TRADE; break; case USING_RECORD_CORNER: - gLinkType = LINKTYPE_0x3322; + gLinkType = LINKTYPE_RECORD_MIX_AFTER; break; } - return CreateTask(Task_ReestablishLinkInCableClubRoom_0, 80); + return CreateTask(Task_ReestablishLink, 80); } -static void Task_ReestablishLinkInCableClubRoom_0(u8 taskId) +static void Task_ReestablishLink(u8 taskId) { s16 *data = gTasks[taskId].data; + if (data[0] == 0) { OpenLink(); ResetLinkPlayers(); - CreateTask(Task_WaitForReceivedRemoteLinkPlayers5SecondTimeout, 80); + CreateTask(Task_WaitForLinkPlayerConnection, 80); } else if (data[0] > 9) - gTasks[taskId].func = Task_ReestablishLinkInCableClubRoom_1; + { + gTasks[taskId].func = Task_ReestablishLinkAwaitConnection; + } data[0]++; } -static void Task_ReestablishLinkInCableClubRoom_1(u8 taskId) +static void Task_ReestablishLinkAwaitConnection(u8 taskId) { if (GetLinkPlayerCount_2() >= 2) { if (IsLinkMaster() == TRUE) - { - gTasks[taskId].func = Task_ReestablishLinkInCableClubRoom_Master; - } + gTasks[taskId].func = Task_ReestablishLinkLeader; else - { - gTasks[taskId].func = Task_ReestablishLinkInCableClubRoom_2; - } + gTasks[taskId].func = Task_ReestablishLinkAwaitConfirmation; } } -static void Task_ReestablishLinkInCableClubRoom_Master(u8 taskId) +static void Task_ReestablishLinkLeader(u8 taskId) { if (GetSavedPlayerCount() == GetLinkPlayerCount_2()) { CheckShouldAdvanceLinkState(); - gTasks[taskId].func = Task_ReestablishLinkInCableClubRoom_2; + gTasks[taskId].func = Task_ReestablishLinkAwaitConfirmation; } } -static void Task_ReestablishLinkInCableClubRoom_2(u8 taskId) +static void Task_ReestablishLinkAwaitConfirmation(u8 taskId) { if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE) { - sub_800A9A4(); + CheckLinkPlayersMatchSaved(); StartSendingKeysToLink(); DestroyTask(taskId); } } +// Unused void CableClub_AskSaveTheGame(void) { Field_AskSaveTheGame(); } +#define tTimer data[1] + static void Task_StartWiredCableClubBattle(u8 taskId) { struct Task *task = &gTasks[taskId]; - switch (task->data[0]) + + switch (task->tState) { case 0: FadeScreen(FADE_TO_BLACK, 0); gLinkType = LINKTYPE_BATTLE; ClearLinkCallback_2(); - task->data[0]++; + task->tState++; break; case 1: if (!gPaletteFade.active) - task->data[0]++; + task->tState++; break; case 2: - task->data[1]++; - if (task->data[1] > 20) - task->data[0]++; + if (++task->tTimer > 20) + task->tState++; break; case 3: SetCloseLinkCallback(); - task->data[0]++; + task->tState++; break; case 4: if (!gReceivedRemoteLinkPlayers) - task->data[0]++; + task->tState++; break; case 5: if (gLinkPlayers[0].trainerId & 1) @@ -637,24 +684,25 @@ static void Task_StartWirelessCableClubBattle(u8 taskId) { s16 *data = gTasks[taskId].data; int i; - switch (data[0]) + + switch (tState) { case 0: FadeScreen(FADE_TO_BLACK, 0); gLinkType = LINKTYPE_BATTLE; ClearLinkCallback_2(); - data[0] = 1; + tState = 1; break; case 1: if (!gPaletteFade.active) - data[0] = 2; + tState = 2; break; case 2: - SendBlock(0, &gLocalLinkPlayer, sizeof(struct LinkPlayer)); - data[0] = 3; + SendBlock(0, &gLocalLinkPlayer, sizeof(gLocalLinkPlayer)); + tState = 3; break; case 3: - if (GetBlockReceivedStatus() == sub_800A8D4()) + if (GetBlockReceivedStatus() == GetLinkPlayerCountAsBitFlags()) { for (i = 0; i < GetLinkPlayerCount(); i++) { @@ -662,21 +710,20 @@ static void Task_StartWirelessCableClubBattle(u8 taskId) ConvertLinkPlayerName(&gLinkPlayers[i]); ResetBlockReceivedFlag(i); } - data[0] = 4; + tState = 4; } break; case 4: - data[1]++; - if (data[1] > 20) - data[0] = 5; + if (++tTimer > 20) + tState = 5; break; case 5: SetLinkStandbyCallback(); - data[0] = 6; + tState = 6; break; case 6: if (IsLinkTaskFinished()) - data[0] = 7; + tState = 7; break; case 7: if (gLinkPlayers[0].trainerId & 1) @@ -706,7 +753,9 @@ static void Task_StartWirelessCableClubBattle(u8 taskId) } } -static void sub_8081624(void) +#undef tTimer + +static void CB2_ReturnFromUnionRoomBattle(void) { switch (gMain.state) { @@ -728,41 +777,42 @@ void CB2_ReturnFromCableClubBattle(void) LoadPlayerParty(); SavePlayerBag(); Special_UpdateTrainerFansAfterLinkBattle(); + if (gSpecialVar_0x8004 != USING_MULTI_BATTLE) { - TryRecordLinkBattleOutcome(gLocalLinkPlayerId ^ 1); + UpdatePlayerLinkBattleRecords(gLocalLinkPlayerId ^ 1); if (gWirelessCommType != 0) { switch (gBattleOutcome) { case B_OUTCOME_WON: - MEvent_RecordIdOfWonderCardSenderByEventType(0, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId); + MysteryGift_TryIncrementStat(CARD_STAT_BATTLES_WON, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId); break; case B_OUTCOME_LOST: - MEvent_RecordIdOfWonderCardSenderByEventType(1, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId); + MysteryGift_TryIncrementStat(CARD_STAT_BATTLES_LOST, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId); break; } } } + if (InUnionRoom() == TRUE) - { - gMain.savedCallback = sub_8081624; - } + gMain.savedCallback = CB2_ReturnFromUnionRoomBattle; else - { gMain.savedCallback = CB2_ReturnToFieldFromMultiplayer; - } + SetMainCallback2(CB2_SetUpSaveAfterLinkBattle); } void CleanupLinkRoomState(void) { - if (gSpecialVar_0x8004 == USING_SINGLE_BATTLE || gSpecialVar_0x8004 == USING_DOUBLE_BATTLE || gSpecialVar_0x8004 == USING_MULTI_BATTLE) + if (gSpecialVar_0x8004 == USING_SINGLE_BATTLE + || gSpecialVar_0x8004 == USING_DOUBLE_BATTLE + || gSpecialVar_0x8004 == USING_MULTI_BATTLE) { LoadPlayerParty(); SavePlayerBag(); } - SetWarpDestinationToDynamicWarp(127); + SetWarpDestinationToDynamicWarp(WARP_ID_DYNAMIC); } void ExitLinkRoom(void) @@ -770,76 +820,79 @@ void ExitLinkRoom(void) QueueExitLinkRoomKey(); } +// Note: gSpecialVar_0x8005 contains the id of the seat the player entered static void Task_EnterCableClubSeat(u8 taskId) { struct Task *task = &gTasks[taskId]; - switch (task->data[0]) + switch (task->tState) { case 0: ShowFieldMessage(CableClub_Text_PleaseWaitBCancel); - task->data[0] = 1; + task->tState = 1; break; case 1: if (IsFieldMessageBoxHidden()) { SetInCableClubSeat(); SetLocalLinkPlayerId(gSpecialVar_0x8005); - task->data[0] = 2; + task->tState = 2; } break; case 2: switch (GetCableClubPartnersReady()) { - case 0: + case CABLE_SEAT_WAITING: break; - case 1: + case CABLE_SEAT_SUCCESS: + // Partners linked and ready, switch to relevant link function HideFieldMessageBox(); - task->data[0] = 0; + task->tState = 0; SetStartedCableClubActivity(); SwitchTaskToFollowupFunc(taskId); break; - case 2: - task->data[0] = 3; + case CABLE_SEAT_FAILED: + task->tState = 3; break; } break; case 3: + // Exit, failure SetLinkWaitingForScript(); - sub_80F771C(TRUE); + EraseFieldMessageBox(TRUE); DestroyTask(taskId); ScriptContext_Enable(); break; } } -static void CreateEnterCableClubSeatTaskWithFollowupFunc(TaskFunc followUpFunc) +static void CreateTask_EnterCableClubSeat(TaskFunc followUpFunc) { u8 taskId = CreateTask(Task_EnterCableClubSeat, 80); SetTaskFuncWithFollowupFunc(taskId, Task_EnterCableClubSeat, followUpFunc); ScriptContext_Stop(); } -static void Task_StartWiredCableClubTrade(u8 taskId) +static void Task_StartWiredTrade(u8 taskId) { struct Task *task = &gTasks[taskId]; - switch (task->data[0]) + switch (task->tState) { case 0: LockPlayerFieldControls(); FadeScreen(FADE_TO_BLACK, 0); ClearLinkCallback_2(); - task->data[0]++; + task->tState++; break; case 1: if (!gPaletteFade.active) - task->data[0]++; + task->tState++; break; case 2: - gSelectedTradeMonPositions[0] = 0; - gSelectedTradeMonPositions[1] = 0; + gSelectedTradeMonPositions[TRADE_PLAYER] = 0; + gSelectedTradeMonPositions[TRADE_PARTNER] = 0; m4aMPlayAllStop(); SetCloseLinkCallback(); - task->data[0]++; + task->tState++; break; case 3: if (!gReceivedRemoteLinkPlayers) @@ -851,27 +904,27 @@ static void Task_StartWiredCableClubTrade(u8 taskId) } } -static void Task_StartWirelessCableClubTrade(u8 taskId) +static void Task_StartWirelessTrade(u8 taskId) { s16 *data = gTasks[taskId].data; - switch (data[0]) + switch (tState) { case 0: LockPlayerFieldControls(); FadeScreen(FADE_TO_BLACK, 0); ClearLinkRfuCallback(); - data[0]++; + tState++; break; case 1: if (!gPaletteFade.active) - data[0]++; + tState++; break; case 2: - gSelectedTradeMonPositions[0] = 0; - gSelectedTradeMonPositions[1] = 0; + gSelectedTradeMonPositions[TRADE_PLAYER] = 0; + gSelectedTradeMonPositions[TRADE_PARTNER] = 0; m4aMPlayAllStop(); SetLinkStandbyCallback(); - data[0]++; + tState++; break; case 3: if (IsLinkTaskFinished()) @@ -886,19 +939,19 @@ static void Task_StartWirelessCableClubTrade(u8 taskId) void EnterTradeSeat(void) { if (gWirelessCommType) - CreateEnterCableClubSeatTaskWithFollowupFunc(Task_StartWirelessCableClubTrade); + CreateTask_EnterCableClubSeat(Task_StartWirelessTrade); else - CreateEnterCableClubSeatTaskWithFollowupFunc(Task_StartWiredCableClubTrade); + CreateTask_EnterCableClubSeat(Task_StartWiredTrade); } -static void CreateTask_StartWiredCableClubTrade(void) +static void CreateTask_StartWiredTrade(void) { - CreateTask(Task_StartWiredCableClubTrade, 80); + CreateTask(Task_StartWiredTrade, 80); } void StartWiredCableClubTrade(void) { - CreateTask_StartWiredCableClubTrade(); + CreateTask_StartWiredTrade(); ScriptContext_Stop(); } @@ -906,12 +959,13 @@ void EnterColosseumPlayerSpot(void) { gLinkType = LINKTYPE_BATTLE; if (gWirelessCommType) - CreateEnterCableClubSeatTaskWithFollowupFunc(Task_StartWirelessCableClubBattle); + CreateTask_EnterCableClubSeat(Task_StartWirelessCableClubBattle); else - CreateEnterCableClubSeatTaskWithFollowupFunc(Task_StartWiredCableClubBattle); + CreateTask_EnterCableClubSeat(Task_StartWiredCableClubBattle); } -static void Debug_CreateTaskEnterCableClubSeat(void) +// Unused +static void CreateTask_EnterCableClubSeatNoFollowup(void) { CreateTask(Task_EnterCableClubSeat, 80); ScriptContext_Stop(); @@ -922,23 +976,27 @@ void Script_ShowLinkTrainerCard(void) ShowTrainerCardInLink(gSpecialVar_0x8006, CB2_ReturnToFieldContinueScriptPlayMapMusic); } -bool32 GetSeeingLinkPlayerCardMsg(u8 who) +bool32 GetSeeingLinkPlayerCardMsg(u8 linkPlayerIndex) { - u8 stars; - gSpecialVar_0x8006 = who; - StringCopy(gStringVar1, gLinkPlayers[who].name); - stars = GetTrainerCardStars(who); - if (stars == 0) + u8 numStars; + + gSpecialVar_0x8006 = linkPlayerIndex; + StringCopy(gStringVar1, gLinkPlayers[linkPlayerIndex].name); + + numStars = GetTrainerCardStars(linkPlayerIndex); + if (numStars == 0) return FALSE; - StringCopy(gStringVar2, sStarsMessagePtrs[stars - 1]); + + StringCopy(gStringVar2, sTrainerCardColorNames[numStars - 1]); return TRUE; } -void Task_WaitForReceivedRemoteLinkPlayers5SecondTimeout(u8 taskId) +#define tTimer data[0] + +void Task_WaitForLinkPlayerConnection(u8 taskId) { struct Task *task = &gTasks[taskId]; - task->data[0]++; - if (task->data[0] > 300) + if (++task->tTimer > 300) { CloseLink(); SetMainCallback2(CB2_LinkError); @@ -948,7 +1006,7 @@ void Task_WaitForReceivedRemoteLinkPlayers5SecondTimeout(u8 taskId) DestroyTask(taskId); } -static void sub_8081AE4(u8 taskId) +static void Task_WaitExitToScript(u8 taskId) { if (!gReceivedRemoteLinkPlayers) { @@ -957,8 +1015,9 @@ static void sub_8081AE4(u8 taskId) } } -static void sub_8081B08(u8 taskId) +// Unused +static void ExitLinkToScript(u8 taskId) { SetCloseLinkCallback(); - gTasks[taskId].func = sub_8081AE4; + gTasks[taskId].func = Task_WaitExitToScript; } diff --git a/src/field_fadetransition.c b/src/field_fadetransition.c index 020798f46..696caf845 100644 --- a/src/field_fadetransition.c +++ b/src/field_fadetransition.c @@ -173,7 +173,7 @@ static void Task_ReturnToFieldCableLink(u8 taskId) switch (task->data[0]) { case 0: - task->data[1] = CreateTask_ReestablishLinkInCableClubRoom(); + task->data[1] = CreateTask_ReestablishCableClubLink(); task->data[0]++; break; case 1: diff --git a/src/field_message_box.c b/src/field_message_box.c index 5a682c382..8f75ce78d 100644 --- a/src/field_message_box.c +++ b/src/field_message_box.c @@ -1,18 +1,11 @@ #include "global.h" +#include "field_message_box.h" #include "gflib.h" #include "new_menu_helpers.h" #include "quest_log.h" #include "script.h" #include "text_window.h" -enum -{ - FIELD_MESSAGE_BOX_HIDDEN, - FIELD_MESSAGE_BOX_UNUSED, - FIELD_MESSAGE_BOX_NORMAL, - FIELD_MESSAGE_BOX_AUTO_SCROLL, -}; - static EWRAM_DATA u8 sMessageBoxType = 0; static void ExpandStringAndStartDrawFieldMessageBox(const u8 *str); diff --git a/src/link.c b/src/link.c index b5167198e..26fd943c0 100644 --- a/src/link.c +++ b/src/link.c @@ -163,11 +163,11 @@ static const u16 sLinkTestFontPal[] = INCBIN_U16("graphics/interface/link_test_f static const u16 sLinkTestFontGfx[] = INCBIN_U16("graphics/interface/link_test_font.4bpp"); static const struct BlockRequest sBlockRequests[] = { - {gBlockSendBuffer, 200}, - {gBlockSendBuffer, 200}, - {gBlockSendBuffer, 100}, - {gBlockSendBuffer, 220}, - {gBlockSendBuffer, 40} + [BLOCK_REQ_SIZE_NONE] = { gBlockSendBuffer, 200 }, + [BLOCK_REQ_SIZE_200] = { gBlockSendBuffer, 200 }, + [BLOCK_REQ_SIZE_100] = { gBlockSendBuffer, 100 }, + [BLOCK_REQ_SIZE_220] = { gBlockSendBuffer, 220 }, + [BLOCK_REQ_SIZE_40] = { gBlockSendBuffer, 40 } }; static const char sASCIIGameFreakInc[] = "GameFreak inc."; static const char sASCIITestPrint[] = "TEST PRINT\n" @@ -788,8 +788,8 @@ u8 GetLinkPlayerDataExchangeStatusTimed(int lower, int upper) cmpVal = GetLinkPlayerCount_2(); if (lower > cmpVal || cmpVal > upper) { - sPlayerDataExchangeStatus = EXCHANGE_STAT_6; - return EXCHANGE_STAT_6; + sPlayerDataExchangeStatus = EXCHANGE_WRONG_NUM_PLAYERS; + return sPlayerDataExchangeStatus; } else { @@ -815,10 +815,10 @@ u8 GetLinkPlayerDataExchangeStatusTimed(int lower, int upper) sPlayerDataExchangeStatus = EXCHANGE_COMPLETE; break; case 1: - sPlayerDataExchangeStatus = EXCHANGE_STAT_4; + sPlayerDataExchangeStatus = EXCHANGE_PLAYER_NOT_READY; break; case 2: - sPlayerDataExchangeStatus = EXCHANGE_STAT_5; + sPlayerDataExchangeStatus = EXCHANGE_PARTNER_NOT_READY; break; } } @@ -829,7 +829,7 @@ u8 GetLinkPlayerDataExchangeStatusTimed(int lower, int upper) } else { - sPlayerDataExchangeStatus = EXCHANGE_IN_PROGRESS; + sPlayerDataExchangeStatus = EXCHANGE_DIFF_SELECTIONS; } } } @@ -862,7 +862,7 @@ bool8 IsLinkPlayerDataExchangeComplete(void) else { retval = FALSE; - sPlayerDataExchangeStatus = EXCHANGE_IN_PROGRESS; + sPlayerDataExchangeStatus = EXCHANGE_DIFF_SELECTIONS; } return retval; } @@ -999,7 +999,7 @@ bool8 SendBlock(u8 unused, const void *src, u16 size) return InitBlockSend(src, size); } -bool8 Link_PrepareCmd0xCCCC_Rfu0xA100(u8 blockRequestType) +bool8 SendBlockRequest(u8 blockRequestType) { if (gWirelessCommType == 1) { @@ -1195,7 +1195,7 @@ void SetLinkDebugValues(u32 seed, u32 flags) gLinkDebugFlags = flags; } -u8 sub_800A8A4(void) +u8 GetSavedLinkPlayerCountAsBitFlags(void) { int i; u8 flags; @@ -1208,7 +1208,7 @@ u8 sub_800A8A4(void) return flags; } -u8 sub_800A8D4(void) +u8 GetLinkPlayerCountAsBitFlags(void) { int i; u8 flags; @@ -1221,11 +1221,11 @@ u8 sub_800A8D4(void) return flags; } -void sub_800A900(u8 a0) +void SaveLinkPlayers(u8 numPlayers) { int i; - gSavedLinkPlayerCount = a0; + gSavedLinkPlayerCount = numPlayers; gSavedMultiplayerId = GetMultiplayerId(); for (i = 0; i < MAX_RFU_PLAYERS; i++) { @@ -1265,7 +1265,7 @@ bool8 sub_800A95C(void) return FALSE; } -void sub_800A9A4(void) +void CheckLinkPlayersMatchSaved(void) { u8 i; @@ -1280,7 +1280,7 @@ void sub_800A9A4(void) } } -void sub_800AA24(void) +void ResetLinkPlayerCount(void) { gSavedLinkPlayerCount = 0; gSavedMultiplayerId = 0; diff --git a/src/link_rfu_2.c b/src/link_rfu_2.c index 2cac8210a..8860deb4f 100644 --- a/src/link_rfu_2.c +++ b/src/link_rfu_2.c @@ -168,11 +168,11 @@ static const u8 sNumTrailingZeroes[] = { }; static const struct BlockRequest sBlockRequests[] = { - { gBlockSendBuffer, 200 }, - { gBlockSendBuffer, 200 }, - { gBlockSendBuffer, 100 }, - { gBlockSendBuffer, 220 }, - { gBlockSendBuffer, 40 } + [BLOCK_REQ_SIZE_NONE] = { gBlockSendBuffer, 200 }, + [BLOCK_REQ_SIZE_200] = { gBlockSendBuffer, 200 }, + [BLOCK_REQ_SIZE_100] = { gBlockSendBuffer, 100 }, + [BLOCK_REQ_SIZE_220] = { gBlockSendBuffer, 220 }, + [BLOCK_REQ_SIZE_40] = { gBlockSendBuffer, 40 } }; static const u16 sAcceptedSerialNos[] = { @@ -1709,7 +1709,7 @@ static void sub_80FA834(u8 taskId) { if (AreNoPlayersReceiving()) { - Rfu.cmdA100_blockRequestType = 0; + Rfu.cmdA100_blockRequestType = BLOCK_REQ_SIZE_NONE; RfuPrepareSendBuffer(RFUCMD_SEND_BLOCK_REQ); gTasks[taskId].data[0]++; } diff --git a/src/mevent.c b/src/mevent.c index 68b3cd610..386437259 100644 --- a/src/mevent.c +++ b/src/mevent.c @@ -961,7 +961,7 @@ bool32 MEventHandleReceivedWonderCard(u16 flagId) return TRUE; } -void MEvent_RecordIdOfWonderCardSenderByEventType(u32 eventId, u32 trainerId) +void MysteryGift_TryIncrementStat(u32 eventId, u32 trainerId) { if (sReceivedWonderCardIsValid) { diff --git a/src/new_menu_helpers.c b/src/new_menu_helpers.c index e11dbb36b..58952c3c0 100644 --- a/src/new_menu_helpers.c +++ b/src/new_menu_helpers.c @@ -592,7 +592,7 @@ static void WindowFunc_ClearDialogWindowAndFrame(u8 bg, u8 tilemapLeft, u8 tilem FillBgTilemapBufferRect(bg, 0, tilemapLeft - 2, tilemapTop - 1, width + 4, height + 2, STD_WINDOW_PALETTE_NUM); } -void sub_80F771C(bool8 copyToVram) +void EraseFieldMessageBox(bool8 copyToVram) { FillBgTilemapBufferRect(0, 0, 0, 0, 0x20, 0x20, 0x11); if (copyToVram == TRUE) diff --git a/src/overworld.c b/src/overworld.c index a26c494d0..72fa19a7c 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -47,6 +47,7 @@ #include "trainer_pokemon_sprites.h" #include "vs_seeker.h" #include "wild_encounter.h" +#include "constants/cable_club.h" #include "constants/maps.h" #include "constants/region_map_sections.h" #include "constants/songs.h" @@ -2979,14 +2980,14 @@ static u16 KeyInterCB_SendNothing_2(u32 key) u32 GetCableClubPartnersReady(void) { if (IsAnyPlayerInLinkState(PLAYER_LINK_STATE_EXITING_ROOM) == TRUE) - return 2; + return CABLE_SEAT_FAILED; if (sPlayerKeyInterceptCallback == KeyInterCB_Ready && sPlayerLinkStates[gLocalLinkPlayerId] != PLAYER_LINK_STATE_READY) - return 0; + return CABLE_SEAT_WAITING; if (sPlayerKeyInterceptCallback == KeyInterCB_DoNothingAndKeepAlive && sPlayerLinkStates[gLocalLinkPlayerId] == PLAYER_LINK_STATE_BUSY) - return 2; + return CABLE_SEAT_FAILED; if (AreAllPlayersInLinkState(PLAYER_LINK_STATE_READY) != FALSE) - return 1; - return 0; + return CABLE_SEAT_SUCCESS; + return CABLE_SEAT_WAITING; } static bool32 IsAnyPlayerExitingCableClub(void) diff --git a/src/strings.c b/src/strings.c index abbcded06..c8f85b50f 100644 --- a/src/strings.c +++ b/src/strings.c @@ -1168,11 +1168,11 @@ const u8 gText_CommErrorEllipsis[] = _("Communication error…"); const u8 gText_MoveCloserToLinkPartner[] = _("Move closer to your link partner(s).\nAvoid obstacles between partners."); const u8 gText_ABtnRegistrationCounter[] = _("A Button: Registration Counter"); const u8 gText_ABtnTitleScreen[] = _("A Button: Title Screen"); -const u8 gUnknown_841DF82[] = _("{STR_VAR_1}P LINK"); -const u8 gUnknown_841DF8B[] = _("BRONZE"); -const u8 gUnknown_841DF92[] = _("COPPER"); -const u8 gUnknown_841DF99[] = _("SILVER"); -const u8 gUnknown_841DFA0[] = _("GOLD"); +const u8 gText_NumPlayerLink[] = _("{STR_VAR_1}P LINK"); +const u8 gText_BronzeCard[] = _("BRONZE"); +const u8 gText_CopperCard[] = _("COPPER"); +const u8 gText_SilverCard[] = _("SILVER"); +const u8 gText_GoldCard[] = _("GOLD"); const u8 gText_HelpSystemControls_A_Next[] = _("{A_BUTTON}NEXT"); const u8 gText_HelpSystemControls_PickOkEnd[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}OK {B_BUTTON}END"); const u8 gText_HelpSystemControls_AorBtoCancel[] = _("{A_BUTTON}{B_BUTTON}CANCEL"); diff --git a/src/trade.c b/src/trade.c index c5a580b1b..a442c14c1 100644 --- a/src/trade.c +++ b/src/trade.c @@ -767,7 +767,7 @@ static void CB2_ReturnFromLinkTrade2(void) gMain.state++; } if (gWirelessCommType == 0) - CreateTask(Task_WaitForReceivedRemoteLinkPlayers5SecondTimeout, 1); + CreateTask(Task_WaitForLinkPlayerConnection, 1); } else { @@ -1346,9 +1346,7 @@ static bool8 shedinja_maker_maybe(void) break; case 3: if (id == 0) - { - Link_PrepareCmd0xCCCC_Rfu0xA100(1); - } + SendBlockRequest(BLOCK_REQ_SIZE_200); sTradeMenuResourcesPtr->state++; break; case 4: @@ -1365,9 +1363,7 @@ static bool8 shedinja_maker_maybe(void) break; case 7: if (id == 0) - { - Link_PrepareCmd0xCCCC_Rfu0xA100(1); - } + SendBlockRequest(BLOCK_REQ_SIZE_200); sTradeMenuResourcesPtr->state++; break; case 8: @@ -1384,9 +1380,7 @@ static bool8 shedinja_maker_maybe(void) break; case 11: if (id == 0) - { - Link_PrepareCmd0xCCCC_Rfu0xA100(1); - } + SendBlockRequest(BLOCK_REQ_SIZE_200); sTradeMenuResourcesPtr->state++; break; case 12: @@ -1403,9 +1397,7 @@ static bool8 shedinja_maker_maybe(void) break; case 15: if (id == 0) - { - Link_PrepareCmd0xCCCC_Rfu0xA100(3); - } + SendBlockRequest(BLOCK_REQ_SIZE_220); sTradeMenuResourcesPtr->state++; break; case 16: @@ -1422,9 +1414,7 @@ static bool8 shedinja_maker_maybe(void) break; case 19: if (id == 0) - { - Link_PrepareCmd0xCCCC_Rfu0xA100(4); - } + SendBlockRequest(BLOCK_REQ_SIZE_40); sTradeMenuResourcesPtr->state++; break; case 20: diff --git a/src/trade_scene.c b/src/trade_scene.c index 4d0f72ee8..e0833b647 100644 --- a/src/trade_scene.c +++ b/src/trade_scene.c @@ -2583,9 +2583,7 @@ static void CB2_HandleTradeEnded(void) IncrementGameStat(GAME_STAT_POKEMON_TRADES); } if (gWirelessCommType) - { - MEvent_RecordIdOfWonderCardSenderByEventType(2, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId); - } + MysteryGift_TryIncrementStat(CARD_STAT_NUM_TRADES, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId); SetContinueGameWarpStatusToDynamicWarp(); LinkFullSave_Init(); gMain.state++; diff --git a/src/union_room.c b/src/union_room.c index 5bcaf6b85..01c89b211 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -1794,11 +1794,11 @@ static void Task_ExchangeCards(u8 taskId) { case 0: if (GetMultiplayerId() == 0) - Link_PrepareCmd0xCCCC_Rfu0xA100(2); + SendBlockRequest(BLOCK_REQ_SIZE_100); gTasks[taskId].data[0]++; break; case 1: - if (GetBlockReceivedStatus() == sub_800A8D4()) + if (GetBlockReceivedStatus() == GetLinkPlayerCountAsBitFlags()) { s32 i; u16 *recvBuff;