From 35867f531bbcfaf360045160734a1ff09ce0f6d8 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Mon, 8 Jun 2020 00:45:06 -0400 Subject: [PATCH] Some link rfu cleanup / link.c documentation --- common_syms/link.txt | 18 +-- include/gba/types.h | 3 + include/link.h | 20 ++-- include/link_rfu.h | 68 ++++------- src/berry_blender.c | 4 +- src/cable_club.c | 16 +-- src/contest_link_80FC4F4.c | 2 +- src/dodrio_berry_picking.c | 6 +- src/field_screen_effect.c | 4 +- src/link.c | 162 +++++++++++--------------- src/link_rfu_2.c | 188 ++++++++++++++++-------------- src/link_rfu_3.c | 231 +++++++++++++++++++------------------ src/record_mixing.c | 4 +- src/start_menu.c | 2 +- src/union_room.c | 2 +- 15 files changed, 354 insertions(+), 376 deletions(-) diff --git a/common_syms/link.txt b/common_syms/link.txt index a6d096116..09def0aed 100644 --- a/common_syms/link.txt +++ b/common_syms/link.txt @@ -3,15 +3,15 @@ gLinkDebugSeed gLocalLinkPlayerBlock gLinkErrorOccurred gLinkDebugFlags -gFiller_03003074 +gLinkFiller1 gRemoteLinkPlayersNotReceived gBlockReceivedStatus -gFiller_03003080 +gLinkFiller2 gLinkHeldKeys gRecvCmds gLinkStatus -gUnknown_030030E4 -gUnknown_030030E8 +gLinkDummy1 +gLinkDummy2 gUnknown_030030EC gUnknown_030030F0 gUnknown_030030F4 @@ -26,12 +26,12 @@ gLinkCallback gShouldAdvanceLinkState gLinkTestBlockChecksums gBlockRequestType -gFiller_03003154 -gFiller_03003158 -gFiller_0300315c +gLinkFiller3 +gLinkFiller4 +gLinkFiller5 gLastSendQueueCount gLink gLastRecvQueueCount gLinkSavedIme -gFiller_03004138 -gFiller_0300413C +gLinkFiller6 +gLinkFiller7 diff --git a/include/gba/types.h b/include/gba/types.h index 7163f925f..35d02e263 100644 --- a/include/gba/types.h +++ b/include/gba/types.h @@ -27,6 +27,9 @@ typedef double f64; typedef u8 bool8; typedef u16 bool16; typedef u32 bool32; +typedef vu8 vbool8; +typedef vu16 vbool16; +typedef vu32 vbool32; struct BgCnt { diff --git a/include/link.h b/include/link.h index d33b84c79..25e62ff1e 100644 --- a/include/link.h +++ b/include/link.h @@ -284,13 +284,13 @@ void sub_800A418(void); void SetSuppressLinkErrorMessage(bool8 flag); void sub_800B524(struct LinkPlayer *linkPlayer); u8 GetSioMultiSI(void); -void sub_800AAF4(void); -void sub_800AF18(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06); +void ClearSavedLinkPlayers(void); +void BufferLinkErrorInfo(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06); void sub_800B348(void); void LinkPlayerFromBlock(u32 who); -bool32 sub_800A07C(void); +bool32 Link_AnyPartnersPlayingFRLG_JP(void); void ResetLinkPlayerCount(void); -void sub_800AA04(u8 a0); +void SaveLinkPlayers(u8 a0); void SetWirelessCommType0(void); bool32 sub_800B504(void); @@ -330,18 +330,18 @@ extern u32 gFiller_03003080; extern struct LinkPlayer gLocalLinkPlayer; bool32 Link_AnyPartnersPlayingRubyOrSapphire(void); -bool32 sub_800A03C(void); +bool32 LinkDummy_Return2(void); void SetLocalLinkPlayerId(u8); u8 GetSavedPlayerCount(void); void sub_8009FAC(void); bool8 sub_800A4D8(u8 a0); -u8 sub_800A9D8(void); +u8 GetLinkPlayerCountAsBitFlags(void); u8 sub_800A0C8(s32, s32); -u8 sub_800A9A8(void); +u8 GetSavedLinkPlayerCountAsBitFlags(void); void sub_800AD10(void); -void sub_800AB18(void); -void sub_8009F18(void); -bool8 sub_800AA60(void); +void CheckLinkPlayersMatchSaved(void); +void StartSendingKeysToLink(void); +bool8 DoesLinkPlayerCountMatchSaved(void); void sub_800ABF4(u16 a0); bool32 IsSendingKeysToLink(void); u32 GetLinkRecvQueueLength(void); diff --git a/include/link_rfu.h b/include/link_rfu.h index 46ed3c30a..b88d0af83 100644 --- a/include/link_rfu.h +++ b/include/link_rfu.h @@ -18,6 +18,17 @@ #define RFU_COMMAND_0xEE00 0xEE00 #define RFU_COMMAND_0xED00 0xED00 +#define RFU_SERIAL_7F7D 0x7F7D + +#define RECV_QUEUE_NUM_SLOTS 32 +#define RECV_QUEUE_SLOT_LENGTH (14 * MAX_RFU_PLAYERS) + +#define SEND_QUEUE_NUM_SLOTS 40 +#define SEND_QUEUE_SLOT_LENGTH 14 + +#define BACKUP_QUEUE_NUM_SLOTS 2 +#define BACKUP_QUEUE_SLOT_LENGTH 14 + // RfuTgtData.gname is read as these structs. struct GFtgtGnameSub { @@ -48,35 +59,6 @@ struct __attribute__((packed, aligned(2))) GFtgtGname u8 padding; }; // size: RFU_GNAME_SIZE -struct UnkLinkRfuStruct_02022B2C -{ - u8 unk_00; - u8 unk_01; - u16 unk_02; - u8 unk_04; - u16 unk_06; - struct GFtgtGname *unk_08; - u8 *unk_0c; - u8 unk_10; - u8 unk_11; - u16 unk_12; - u16 unk_14; -}; - -struct UnkLinkRfuStruct_02022B44 -{ - u8 fill_00[6]; - u16 unk_06; - u8 fill_08[6]; - vu8 unk_0e; - u8 unk_0f; - u8 fill_10[0x54]; - u16 unk_64; - u8 fill_66[0x1d]; - u8 unk_83; - u8 fill_84[0x58]; -}; - struct RfuBlockSend { /* 0x00 */ u16 next; @@ -91,7 +73,7 @@ struct RfuBlockSend struct RfuRecvQueue { - /* 0x000 */ u8 slots[32][70]; + /* 0x000 */ u8 slots[RECV_QUEUE_NUM_SLOTS][RECV_QUEUE_SLOT_LENGTH]; /* 0x8c0 */ vu8 recvSlot; /* 0x8c1 */ vu8 sendSlot; /* 0x8c2 */ vu8 count; @@ -100,7 +82,7 @@ struct RfuRecvQueue struct RfuSendQueue { - /* 0x000 */ u8 slots[40][14]; + /* 0x000 */ u8 slots[SEND_QUEUE_NUM_SLOTS][SEND_QUEUE_SLOT_LENGTH]; /* 0x230 */ vu8 recvSlot; /* 0x231 */ vu8 sendSlot; /* 0x232 */ vu8 count; @@ -109,7 +91,7 @@ struct RfuSendQueue struct RfuBackupQueue { - /* 0x00 */ u8 slots[2][14]; + /* 0x00 */ u8 slots[BACKUP_QUEUE_NUM_SLOTS][BACKUP_QUEUE_SLOT_LENGTH]; /* 0x1c */ vu8 recvSlot; /* 0x1d */ vu8 sendSlot; /* 0x1e */ vu8 count; @@ -123,11 +105,11 @@ struct GFRfuManager /* 0x00a */ u16 linkmanMsg; /* 0x00c */ u8 parentChild; /* 0x00d */ u8 playerCount; - /* 0x00e */ u8 unk_0e; + /* 0x00e */ bool8 unk_0e; /* 0x00f */ u8 unk_0f; /* 0x010 */ u16 unk_10; /* 0x012 */ u16 unk_12; - /* 0x014 */ u8 unk_14[4][14]; + /* 0x014 */ u8 unk_14[RFU_CHILD_MAX][14]; /* 0x04c */ u8 unk_4c[14]; /* 0x05a */ u8 unk_5a; /* 0x05b */ u8 unk_5b; @@ -136,8 +118,8 @@ struct GFRfuManager /* 0x066 */ u8 idleTaskId; /* 0x067 */ u8 searchTaskId; /* 0x068 */ u8 filler_68[4]; - /* 0x06c */ struct RfuBlockSend unk_6c; - /* 0x080 */ struct RfuBlockSend unk_80[MAX_RFU_PLAYERS]; + /* 0x06c */ struct RfuBlockSend sendBlock; + /* 0x080 */ struct RfuBlockSend recvBlock[MAX_RFU_PLAYERS]; /* 0x0e4 */ u8 unk_e4[5]; /* 0x0e9 */ u8 unk_e9[5]; /* 0x0ee */ vu8 errorState; @@ -170,8 +152,8 @@ struct GFRfuManager /* 0xcd5 */ u8 unk_cd5[4]; /* 0xcd9 */ u8 unk_cd9; /* 0xcda */ u8 unk_cda; - /* 0xcdb */ vu8 unk_cdb; - /* 0xcdc */ vu8 unk_cdc; + /* 0xcdb */ vbool8 unk_cdb; + /* 0xcdc */ vbool8 unk_cdc; /* 0xcdd */ u8 unk_cdd; /* 0xcde */ u8 linkPlayerIdx[RFU_CHILD_MAX]; /* 0xce2 */ u8 unk_ce2; @@ -195,7 +177,7 @@ extern u8 gWirelessStatusIndicatorSpriteId; // Exported ROM declarations void WipeTrainerNameRecords(void); -void sub_800E700(void); +void InitRFUAPI(void); void LinkRfu_Shutdown(void); void Rfu_SetBlockReceivedFlag(u8 who); void Rfu_ResetBlockReceivedFlag(u8 who); @@ -264,7 +246,6 @@ bool8 LinkRfu_GetNameIfSerial7F7D(struct GFtgtGname *buff1, u8 *buff2, u8 idx); s32 sub_800E87C(u8 idx); void CreateTask_RfuIdle(void); void DestroyTask_RfuIdle(void); -void sub_8010198(void); void sub_8011AC8(void); void LinkRfu_FatalError(void); bool32 sub_8011A9C(void); @@ -273,7 +254,6 @@ void sub_8011A50(void); void sub_80110B8(u32 a0); bool32 IsRfuSerialNumberValid(u32 serialNo); bool8 IsRfuRecoveringFromLinkLoss(void); -void sub_8011BA4(void); void RfuRecvQueue_Reset(struct RfuRecvQueue *queue); void RfuSendQueue_Reset(struct RfuSendQueue *queue); void RfuRecvQueue_Enqueue(struct RfuRecvQueue *queue, u8 *data); @@ -282,13 +262,9 @@ bool8 RfuRecvQueue_Dequeue(struct RfuRecvQueue *queue, u8 *dest); bool8 RfuSendQueue_Dequeue(struct RfuSendQueue *queue, u8 *dest); void RfuBackupQueue_Enqueue(struct RfuBackupQueue *queue, const u8 *q2); bool8 RfuBackupQueue_Dequeue(struct RfuBackupQueue *queue, u8 *q2); -void sub_800DBF8(u8 *q1, u8 mode); -u8 sub_800DD1C(u8 maxFlags); -void InitHostRFUtgtGname(struct GFtgtGname *data, u8 r9, bool32 r2, s32 r3); +void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 started, s32 child_sprite_genders); void CreateWirelessStatusIndicatorSprite(u8 x, u8 y); void DestroyWirelessStatusIndicatorSprite(void); void LoadWirelessStatusIndicatorSpriteGfx(void); -u8 sub_800E124(void); -void sub_800E15C(struct Sprite *sprite, s32 signalStrengthAnimNum); #endif //GUARD_LINK_RFU_H diff --git a/src/berry_blender.c b/src/berry_blender.c index dfa378552..f999b750b 100644 --- a/src/berry_blender.c +++ b/src/berry_blender.c @@ -1246,7 +1246,7 @@ static void sub_8080018(void) if (++sBerryBlenderData->framesToWait > 20) { ClearDialogWindowAndFrameToTransparent(4, TRUE); - if (GetBlockReceivedStatus() == sub_800A9D8()) + if (GetBlockReceivedStatus() == GetLinkPlayerCountAsBitFlags()) { for (i = 0; i < GetLinkPlayerCount(); i++) { @@ -1664,7 +1664,7 @@ static void sub_80808D4(void) static void sub_8080DF8(void) { s32 i; - for (i = 0; i < 4; i++) + for (i = 0; i < CMD_LENGTH / 2; i++) { gSendCmd[0] = 0; gSendCmd[2] = 0; diff --git a/src/cable_club.c b/src/cable_club.c index ffd7bcd8f..15e468390 100644 --- a/src/cable_club.c +++ b/src/cable_club.c @@ -283,7 +283,7 @@ static void Task_LinkupAwaitConfirmation(u8 taskId) if (linkPlayerCount < tMinPlayers) return; - sub_800AA04(linkPlayerCount); + SaveLinkPlayers(linkPlayerCount); ClearLinkPlayerCountWindow(tWindowId); ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1); ShowFieldAutoScrollMessage(gText_ConfirmStartLinkWithXPlayers); @@ -372,7 +372,7 @@ static void Task_LinkupExchangeDataWithLeader(u8 taskId) { gFieldLinkPlayerCount = GetLinkPlayerCount_2(); gLocalLinkPlayerId = GetMultiplayerId(); - sub_800AA04(gFieldLinkPlayerCount); + SaveLinkPlayers(gFieldLinkPlayerCount); card = (struct TrainerCard *)gBlockSendBuffer; TrainerCard_GenerateCardForPlayer(card); card->monSpecies[0] = GetMonData(&gPlayerParty[gSelectedOrderFromParty[0] - 1], MON_DATA_SPECIES, NULL); @@ -420,7 +420,7 @@ static void Task_LinkupCheckStatusAfterConfirm(u8 taskId) { gFieldLinkPlayerCount = GetLinkPlayerCount_2(); gLocalLinkPlayerId = GetMultiplayerId(); - sub_800AA04(gFieldLinkPlayerCount); + SaveLinkPlayers(gFieldLinkPlayerCount); card = (struct TrainerCard *)gBlockSendBuffer; TrainerCard_GenerateCardForPlayer(card); card->monSpecies[0] = GetMonData(&gPlayerParty[gSelectedOrderFromParty[0] - 1], MON_DATA_SPECIES, NULL); @@ -516,7 +516,7 @@ static void Task_LinkupAwaitTrainerCardData(u8 taskId) if (CheckLinkErrored(taskId) == TRUE) return; - if (GetBlockReceivedStatus() != sub_800A9A8()) + if (GetBlockReceivedStatus() != GetSavedLinkPlayerCountAsBitFlags()) return; for (index = 0; index < GetLinkPlayerCount(); index++) @@ -800,8 +800,8 @@ static void Task_ReestablishLinkAwaitConfirmation(u8 taskId) if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE) { - sub_800AB18(); - sub_8009F18(); + CheckLinkPlayersMatchSaved(); + StartSendingKeysToLink(); DestroyTask(taskId); } } @@ -901,7 +901,7 @@ static void Task_StartWirelessCableClubBattle(u8 taskId) tState = 3; break; case 3: - if (GetBlockReceivedStatus() == sub_800A9D8()) + if (GetBlockReceivedStatus() == GetLinkPlayerCountAsBitFlags()) { for (i = 0; i < GetLinkPlayerCount(); i++) { @@ -1236,7 +1236,7 @@ void Task_WaitForLinkPlayerConnection(u8 taskId) // Players connected, destroy task if (gWirelessCommType == 0) { - if (!sub_800AA60()) + if (!DoesLinkPlayerCountMatchSaved()) { CloseLink(); SetMainCallback2(CB2_LinkError); diff --git a/src/contest_link_80FC4F4.c b/src/contest_link_80FC4F4.c index d6cfea638..64591e00b 100644 --- a/src/contest_link_80FC4F4.c +++ b/src/contest_link_80FC4F4.c @@ -36,7 +36,7 @@ bool8 sub_80FC530(u8 arg0) bool8 sub_80FC55C(void) { - if (GetBlockReceivedStatus() == sub_800A9D8()) + if (GetBlockReceivedStatus() == GetLinkPlayerCountAsBitFlags()) { ResetBlockReceivedFlags(); return TRUE; diff --git a/src/dodrio_berry_picking.c b/src/dodrio_berry_picking.c index ccb1e28eb..cfc5643b4 100644 --- a/src/dodrio_berry_picking.c +++ b/src/dodrio_berry_picking.c @@ -832,9 +832,9 @@ static void sub_8025158(void) static bool32 sub_8025170(void) { - u8 r4 = GetBlockReceivedStatus(); - u8 r0 = sub_800A9D8(); - if (r4 == r0) + u8 recvStatus = GetBlockReceivedStatus(); + u8 playerFlags = GetLinkPlayerCountAsBitFlags(); + if (recvStatus == playerFlags) { ResetBlockReceivedFlags(); return TRUE; diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index e5815e6ae..b1ca8b831 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -215,7 +215,7 @@ static void Task_ReturnToFieldWirelessLink(u8 taskId) case 2: if (WaitForWeatherFadeIn() == TRUE) { - sub_8009F18(); + StartSendingKeysToLink(); ScriptContext2_Disable(); DestroyTask(taskId); } @@ -240,7 +240,7 @@ void Task_ReturnToFieldRecordMixing(u8 taskId) } break; case 2: - sub_8009F18(); + StartSendingKeysToLink(); ResetAllMultiplayerState(); ScriptContext2_Disable(); DestroyTask(taskId); diff --git a/src/link.c b/src/link.c index 3e4cc0c05..2f19d7aea 100644 --- a/src/link.c +++ b/src/link.c @@ -1,5 +1,3 @@ - -// Includes #include "global.h" #include "m4a.h" #include "malloc.h" @@ -30,10 +28,6 @@ #include "constants/rgb.h" #include "constants/trade.h" -extern u16 gHeldKeyCodeToSend; - -// Static type declarations - struct BlockTransfer { u16 pos; @@ -51,15 +45,13 @@ struct LinkTestBGInfo u32 dummy_C; }; -// Static RAM declarations - static struct BlockTransfer sBlockSend; static struct BlockTransfer sBlockRecv[MAX_LINK_PLAYERS]; static u32 sBlockSendDelayCounter; -static u32 gUnknown_03000D54; -static u8 gUnknown_03000D58; +static bool32 sDummy1; // Never read +static bool8 sDummy2; // Never assigned, read in unused function static u32 sPlayerDataExchangeStatus; -static u32 gUnknown_03000D60; +static bool32 sDummy3; // Never read static u8 sLinkTestLastBlockSendPos; static u8 sLinkTestLastBlockRecvPos[MAX_LINK_PLAYERS]; static u8 sNumVBlanksWithoutSerialIntr; @@ -74,15 +66,15 @@ u32 gLinkDebugSeed; struct LinkPlayerBlock gLocalLinkPlayerBlock; bool8 gLinkErrorOccurred; u32 gLinkDebugFlags; -u32 gFiller_03003074; +u32 gLinkFiller1; bool8 gRemoteLinkPlayersNotReceived[MAX_LINK_PLAYERS]; u8 gBlockReceivedStatus[MAX_LINK_PLAYERS]; -u32 gFiller_03003080; +u32 gLinkFiller2; u16 gLinkHeldKeys; u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH]; u32 gLinkStatus; -bool8 gUnknown_030030E4; -bool8 gUnknown_030030E8; +bool8 gLinkDummy1; // Never read +bool8 gLinkDummy2; // Never read bool8 gUnknown_030030EC[MAX_LINK_PLAYERS]; bool8 gUnknown_030030F0[MAX_LINK_PLAYERS]; u16 gUnknown_030030F4; @@ -97,15 +89,15 @@ void (*gLinkCallback)(void); u8 gShouldAdvanceLinkState; u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS]; u8 gBlockRequestType; -u32 gFiller_03003154; -u32 gFiller_03003158; -u32 gFiller_0300315c; +u32 gLinkFiller3; +u32 gLinkFiller4; +u32 gLinkFiller5; u8 gLastSendQueueCount; struct Link gLink; u8 gLastRecvQueueCount; u16 gLinkSavedIme; -u32 gFiller_03004138; -u32 gFiller_0300413C; +u32 gLinkFiller6; +u32 gLinkFiller7; EWRAM_DATA u8 gLinkTestDebugValuesEnabled = 0; EWRAM_DATA u8 gUnknown_020223BD = 0; @@ -130,10 +122,10 @@ static EWRAM_DATA void *sLinkErrorBgTilemapBuffer = NULL; // Static ROM declarations static void InitLocalLinkPlayer(void); -static void sub_80096BC(void); +static void VBlankCB_LinkError(void); static void CB2_LinkTest(void); static void ProcessRecvCmds(u8 unused); -static void sub_8009F70(void); +static void LinkCB_SendHeldKeys(void); static void ResetBlockSend(void); static bool32 InitBlockSend(const void *src, size_t size); static void LinkCB_BlockSendBegin(void); @@ -243,7 +235,7 @@ static const u8 sUnused_082ED224[] = {0x00, 0xFF, 0xFE, 0xFF, 0x00}; bool8 IsWirelessAdapterConnected(void) { SetWirelessCommType1(); - sub_800E700(); + InitRFUAPI(); if (rfu_LMAN_REQBN_softReset_and_checkID() == 0x8001) { rfu_REQ_stopMode(); @@ -301,7 +293,7 @@ void LinkTestScreen(void) ResetSpriteData(); FreeAllSpritePalettes(); ResetTasks(); - SetVBlankCallback(sub_80096BC); + SetVBlankCallback(VBlankCB_LinkError); ResetBlockSend(); gLinkType = LINKTYPE_TRADE; OpenLink(); @@ -317,7 +309,7 @@ void LinkTestScreen(void) AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); - gUnknown_03000D60 = 0; + sDummy3 = FALSE; InitLocalLinkPlayer(); CreateTask(Task_PrintTestData, 0); SetMainCallback2(CB2_LinkTest); @@ -344,7 +336,7 @@ static void InitLocalLinkPlayer(void) } } -static void sub_80096BC(void) +static void VBlankCB_LinkError(void) { LoadOam(); ProcessSpriteCopyRequests(); @@ -355,9 +347,9 @@ static void InitLink(void) { int i; - for (i = 0; i < 8; i++) + for (i = 0; i < CMD_LENGTH; i++) { - gSendCmd[i] = 0xefff; + gSendCmd[i] = 0xEfff; } gLinkOpen = TRUE; EnableSerial(); @@ -386,15 +378,15 @@ void OpenLink(void) gSuppressLinkErrorMessage = FALSE; ResetBlockReceivedFlags(); ResetBlockSend(); - gUnknown_03000D54 = 0; - gUnknown_030030E8 = FALSE; - gUnknown_030030E4 = FALSE; + sDummy1 = FALSE; + gLinkDummy2 = FALSE; + gLinkDummy1 = FALSE; gUnknown_030030F4 = 0; CreateTask(Task_TriggerHandshake, 2); } else { - sub_800E700(); + InitRFUAPI(); } gReceivedRemoteLinkPlayers = 0; for (i = 0; i < MAX_LINK_PLAYERS; i++) @@ -503,7 +495,7 @@ u16 LinkMain2(const u16 *heldKeys) { return 0; } - for (i = 0; i < 8; i++) + for (i = 0; i < CMD_LENGTH; i++) { gSendCmd[i] = 0; } @@ -566,10 +558,10 @@ static void ProcessRecvCmds(u8 unused) gLinkPartnersHeldKeys[i] = gRecvCmds[i][1]; break; case LINKCMD_0x5555: - gUnknown_030030E8 = TRUE; + gLinkDummy2 = TRUE; break; case LINKCMD_0x5566: - gUnknown_030030E8 = TRUE; + gLinkDummy2 = TRUE; break; case LINKCMD_INIT_BLOCK: { @@ -726,70 +718,56 @@ static void BuildSendCmd(u16 command) } } -void sub_8009F18(void) +void StartSendingKeysToLink(void) { if (gWirelessCommType) - { StartSendingKeysToRfu(); - } - gLinkCallback = sub_8009F70; + + gLinkCallback = LinkCB_SendHeldKeys; } bool32 IsSendingKeysToLink(void) { if (gWirelessCommType) - { return IsSendingKeysToRfu(); - } - if (gLinkCallback == sub_8009F70) - { + + if (gLinkCallback == LinkCB_SendHeldKeys) return TRUE; - } + return FALSE; } -static void sub_8009F70(void) +static void LinkCB_SendHeldKeys(void) { if (gReceivedRemoteLinkPlayers == TRUE) - { BuildSendCmd(LINKCMD_SEND_HELD_KEYS_2); - } } void ClearLinkCallback(void) { if (gWirelessCommType) - { ClearLinkRfuCallback(); - } else - { gLinkCallback = NULL; - } } void ClearLinkCallback_2(void) { if (gWirelessCommType) - { ClearLinkRfuCallback(); - } else - { gLinkCallback = NULL; - } } u8 GetLinkPlayerCount(void) { if (gWirelessCommType) - { return Rfu_GetLinkPlayerCount(); - } + return EXTRACT_PLAYER_COUNT(gLinkStatus); } -static int sub_8009FF8(u32 version1, u32 version2) +static int AreAnyLinkPlayersUsingVersions(u32 version1, u32 version2) { int i; u8 nPlayers; @@ -797,22 +775,22 @@ static int sub_8009FF8(u32 version1, u32 version2) nPlayers = GetLinkPlayerCount(); for (i = 0; i < nPlayers; i++) { - if ((gLinkPlayers[i].version & 0xFF) == version1 || (gLinkPlayers[i].version & 0xFF) == version2) - { + if ((gLinkPlayers[i].version & 0xFF) == version1 + || (gLinkPlayers[i].version & 0xFF) == version2) return 1; - } } return -1; } -u32 sub_800A03C(void) +u32 LinkDummy_Return2(void) { return 2; } -bool32 sub_800A040(void) +// Unused +static bool32 IsFullLinkGroupWithNoRS(void) { - if (GetLinkPlayerCount() != 4 || sub_8009FF8(VERSION_RUBY, VERSION_SAPPHIRE) < 0) + if (GetLinkPlayerCount() != MAX_LINK_PLAYERS || AreAnyLinkPlayersUsingVersions(VERSION_RUBY, VERSION_SAPPHIRE) < 0) { return FALSE; } @@ -821,18 +799,18 @@ bool32 sub_800A040(void) bool32 Link_AnyPartnersPlayingRubyOrSapphire(void) { - if (sub_8009FF8(VERSION_RUBY, VERSION_SAPPHIRE) >= 0) + if (AreAnyLinkPlayersUsingVersions(VERSION_RUBY, VERSION_SAPPHIRE) >= 0) { return TRUE; } return FALSE; } -bool32 sub_800A07C(void) +bool32 Link_AnyPartnersPlayingFRLG_JP(void) { int i; - i = sub_8009FF8(VERSION_FIRE_RED, VERSION_LEAF_GREEN); + i = AreAnyLinkPlayersUsingVersions(VERSION_FIRE_RED, VERSION_LEAF_GREEN); if (i >= 0 && gLinkPlayers[i].language == LANGUAGE_JAPANESE) { return TRUE; @@ -983,7 +961,7 @@ static bool32 InitBlockSend(const void *src, size_t size) sBlockSend.active = TRUE; sBlockSend.size = size; sBlockSend.pos = 0; - if (size > 0x100) + if (size > BLOCK_BUFFER_SIZE) { sBlockSend.src = src; } @@ -1016,7 +994,7 @@ static void LinkCB_BlockSend(void) src = sBlockSend.src; gSendCmd[0] = LINKCMD_CONT_BLOCK; - for (i = 0; i < 7; i++) + for (i = 0; i < CMD_LENGTH - 1; i++) { gSendCmd[i + 1] = (src[sBlockSend.pos + i * 2 + 1] << 8) | src[sBlockSend.pos + i * 2]; } @@ -1313,7 +1291,7 @@ void SetLinkDebugValues(u32 seed, u32 flags) gLinkDebugFlags = flags; } -u8 sub_800A9A8(void) +u8 GetSavedLinkPlayerCountAsBitFlags(void) { int i; u8 flags; @@ -1326,7 +1304,7 @@ u8 sub_800A9A8(void) return flags; } -u8 sub_800A9D8(void) +u8 GetLinkPlayerCountAsBitFlags(void) { int i; u8 flags; @@ -1339,11 +1317,11 @@ u8 sub_800A9D8(void) return flags; } -void sub_800AA04(u8 a0) +void SaveLinkPlayers(u8 playerCount) { int i; - gSavedLinkPlayerCount = a0; + gSavedLinkPlayerCount = playerCount; gSavedMultiplayerId = GetMultiplayerId(); for (i = 0; i < MAX_RFU_PLAYERS; i++) { @@ -1358,17 +1336,17 @@ u8 GetSavedPlayerCount(void) return gSavedLinkPlayerCount; } -u8 sub_800AA54(void) +// Unused +static u8 GetSavedMultiplayerId(void) { return gSavedMultiplayerId; } -bool8 sub_800AA60(void) +bool8 DoesLinkPlayerCountMatchSaved(void) { int i; - unsigned count; + u32 count = 0; - count = 0; for (i = 0; i < gSavedLinkPlayerCount; i++) { if (gLinkPlayers[i].trainerId == gSavedLinkPlayers[i].trainerId) @@ -1376,9 +1354,7 @@ bool8 sub_800AA60(void) if (gLinkType == LINKTYPE_BATTLE_TOWER) { if (gLinkType == gLinkPlayers[i].linkType) - { count++; - } } else { @@ -1396,7 +1372,7 @@ bool8 sub_800AA60(void) return FALSE; } -void sub_800AAF4(void) +void ClearSavedLinkPlayers(void) { int i; @@ -1407,13 +1383,14 @@ void sub_800AAF4(void) } } -void sub_800AB18(void) +void CheckLinkPlayersMatchSaved(void) { u8 i; for (i = 0; i < gSavedLinkPlayerCount; i++) { - if (gSavedLinkPlayers[i].trainerId != gLinkPlayers[i].trainerId || StringCompare(gSavedLinkPlayers[i].name, gLinkPlayers[i].name) != 0) + if (gSavedLinkPlayers[i].trainerId != gLinkPlayers[i].trainerId + || StringCompare(gSavedLinkPlayers[i].name, gLinkPlayers[i].name) != 0) { gLinkErrorOccurred = TRUE; CloseLink(); @@ -1442,9 +1419,10 @@ bool8 IsLinkMaster(void) return EXTRACT_MASTER(gLinkStatus); } -u8 sub_800ABE8(void) +// Unused +static u8 GetDummy2(void) { - return gUnknown_03000D58; + return sDummy2; } void sub_800ABF4(u16 a0) @@ -1458,7 +1436,7 @@ void sub_800ABF4(u16 a0) if (gLinkCallback == NULL) { gLinkCallback = sub_800AC80; - gUnknown_030030E4 = FALSE; + gLinkDummy1 = FALSE; gUnknown_030030F4 = a0; } } @@ -1479,7 +1457,7 @@ void sub_800AC34(void) else { gLinkCallback = sub_800AC80; - gUnknown_030030E4 = FALSE; + gLinkDummy1 = FALSE; gUnknown_030030F4 = 0; } } @@ -1515,7 +1493,7 @@ static void sub_800ACAC(void) gLinkVSyncDisabled = TRUE; CloseLink(); gLinkCallback = NULL; - gUnknown_030030E4 = TRUE; + gLinkDummy1 = TRUE; } } @@ -1534,7 +1512,7 @@ void sub_800AD10(void) else { gLinkCallback = sub_800AD5C; - gUnknown_030030E4 = FALSE; + gLinkDummy1 = FALSE; gUnknown_030030F4 = 0; } } @@ -1574,7 +1552,7 @@ static void sub_800AD88(void) gLinkVSyncDisabled = TRUE; CloseLink(); gLinkCallback = NULL; - gUnknown_030030E4 = TRUE; + gLinkDummy1 = TRUE; } } @@ -1590,7 +1568,7 @@ void sub_800ADF8(void) { gLinkCallback = sub_800AE30; } - gUnknown_030030E4 = FALSE; + gLinkDummy1 = FALSE; } } @@ -1642,7 +1620,7 @@ static void CheckErrorStatus(void) } } -void sub_800AF18(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06) +void BufferLinkErrorInfo(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, bool8 unk_06) { sLinkErrorBuffer.status = status; sLinkErrorBuffer.lastSendQueueCount = lastSendQueueCount; @@ -1673,7 +1651,7 @@ void CB2_LinkError(void) } ResetLinkRfuGFLayer(); } - SetVBlankCallback(sub_80096BC); + SetVBlankCallback(VBlankCB_LinkError); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sLinkErrorBgTemplates, ARRAY_COUNT(sLinkErrorBgTemplates)); sLinkErrorBgTilemapBuffer = tilemapBuffer = malloc(0x800); diff --git a/src/link_rfu_2.c b/src/link_rfu_2.c index 6c6f12077..ac1488167 100644 --- a/src/link_rfu_2.c +++ b/src/link_rfu_2.c @@ -28,17 +28,31 @@ struct SioInfo u8 filler[92]; }; +struct RfuDebug +{ + u8 filler0[6]; + u16 unk_06; + u8 filler1[6]; + vu8 unk_0e; + u8 unk_0f; + u8 filler2[84]; + u16 unk_64; + u8 filler3[29]; + u8 unk_83; + u8 filler4[88]; +}; + u32 gf_rfu_REQ_api[RFU_API_BUFF_SIZE_RAM / 4]; struct GFRfuManager Rfu; -BSS_DATA u8 gUnknown_03000D78[8]; -BSS_DATA u8 sResendBlock8[16]; -BSS_DATA u16 sResendBlock16[8]; +static u8 sHeldKeyCount; +static u8 sResendBlock8[16]; +static u16 sResendBlock16[8]; EWRAM_DATA struct GFtgtGname gHostRFUtgtGnameBuffer = {}; -EWRAM_DATA ALIGNED(2) u8 gHostRFUtgtUnameBuffer[PLAYER_NAME_LENGTH + 1] = {}; -EWRAM_DATA INIT_PARAM sRfuReqConfig = {}; -EWRAM_DATA struct UnkLinkRfuStruct_02022B44 gUnknown_02022B44 = {}; +EWRAM_DATA u8 gHostRFUtgtUnameBuffer[PLAYER_NAME_LENGTH + 1] = {}; +static EWRAM_DATA INIT_PARAM sRfuReqConfig = {}; +static EWRAM_DATA struct RfuDebug sRfuDebug = {}; static void ResetSendDataManager(struct RfuBlockSend *); static void sub_800EAB4(void); @@ -146,8 +160,8 @@ static const struct { }; static const u16 sAcceptedSerialNos[] = { - 0x0002, // Pokemon FR/LG/EM - 0x7f7d, + 0x0002, + RFU_SERIAL_7F7D, 0x0000, 0xFFFF }; @@ -225,11 +239,11 @@ void ResetLinkRfuGFLayer(void) { Rfu.errorState = 0; } - for (i = 0; i < 5; i++) + for (i = 0; i < MAX_RFU_PLAYERS; i++) { - ResetSendDataManager(Rfu.unk_80 + i); + ResetSendDataManager(&Rfu.recvBlock[i]); } - ResetSendDataManager(&Rfu.unk_6c); + ResetSendDataManager(&Rfu.sendBlock); RfuRecvQueue_Reset(&Rfu.recvQueue); RfuSendQueue_Reset(&Rfu.sendQueue); CpuFill16(0, gSendCmd, sizeof gSendCmd); @@ -241,7 +255,7 @@ void InitRFU(void) { IntrFunc serialIntr = gIntrTable[1]; IntrFunc timerIntr = gIntrTable[2]; - sub_800E700(); + InitRFUAPI(); rfu_REQ_stopMode(); rfu_waitREQComplete(); REG_IME = 0; @@ -250,12 +264,12 @@ void InitRFU(void) REG_IME = INTR_FLAG_VBLANK; } -void sub_800E700(void) +void InitRFUAPI(void) { if (!rfu_initializeAPI((void *)gf_rfu_REQ_api, sizeof gf_rfu_REQ_api, gIntrTable + 1, TRUE)) { gLinkType = 0; - sub_800AAF4(); + ClearSavedLinkPlayers(); sub_80111B0(FALSE); ResetLinkRfuGFLayer(); rfu_setTimerInterrupt(3, gIntrTable + 2); @@ -288,7 +302,7 @@ static void Task_LinkLeaderSearchForChildren(u8 taskId) case 5: break; case 18: - Rfu.unk_cdb = 0; + Rfu.unk_cdb = FALSE; rfu_LMAN_setMSCCallback(sub_800EDBC); sub_800EAB4(); sub_800EAFC(); @@ -392,10 +406,10 @@ static void Task_JoinGroupSearchForParent(u8 taskId) rfu_UNI_setSendData(bmChildSlot, Rfu.unk_4c, sizeof(Rfu.unk_4c)); gTasks[taskId].data[1] = 8; DestroyTask(taskId); - if (gUnknown_02022B44.unk_0f == 0) + if (sRfuDebug.unk_0f == 0) { Debug_PrintEmpty(); - gUnknown_02022B44.unk_0f++; + sRfuDebug.unk_0f++; } CreateTask(sub_801084C, 5); break; @@ -474,7 +488,7 @@ static void Task_LinkRfu_UnionRoomListen(u8 taskId) case 15: break; case 16: - Rfu.unk_cdb = 0; + Rfu.unk_cdb = FALSE; rfu_LMAN_setMSCCallback(sub_800EDBC); UpdateGameData_GroupLockedIn(TRUE); sub_800EAB4(); @@ -513,7 +527,7 @@ static void sub_800ED34(u16 unused) { Rfu.unk_cd0++; RfuRecvQueue_Enqueue(&Rfu.recvQueue, Rfu.unk_c3f); - gUnknown_02022B44.unk_06++; + sRfuDebug.unk_06++; UpdateBackupQueue(); rfu_UNI_readySendData(Rfu.childSlot); rfu_UNI_clearRecvNewDataFlag(Rfu.childSlot); @@ -523,7 +537,7 @@ static void sub_800ED34(u16 unused) static void sub_800EDBC(u16 unused) { - Rfu.unk_cdb = 1; + Rfu.unk_cdb = TRUE; } void LinkRfu_Shutdown(void) @@ -657,11 +671,11 @@ static void sub_800EFB0(void) static void sub_800F014(void) { s32 i; - for (i = 0; i < 7; i++) + for (i = 0; i < CMD_LENGTH - 1; i++) { gRecvCmds[0][i] = gSendCmd[i]; } - for (i = 0; i < 7; i++) + for (i = 0; i < CMD_LENGTH - 1; i++) { gSendCmd[i] = 0; } @@ -695,9 +709,9 @@ bool32 IsRfuRecvQueueEmpty(void) { return FALSE; } - for (i = 0; i < 5; i++) + for (i = 0; i < MAX_RFU_PLAYERS; i++) { - for (j = 0; j < 7; j++) + for (j = 0; j < CMD_LENGTH - 1; j++) { if (gRecvCmds[i][j] != 0) { @@ -718,7 +732,7 @@ static bool32 sub_800F0F8(void) } else { - Rfu.unk_cdb = 0; + Rfu.unk_cdb = FALSE; if ((Rfu.unk_ce2 & gRfuLinkStatus->connSlotFlag) == Rfu.unk_ce2 && (Rfu.unk_ce2 & gRfuLinkStatus->connSlotFlag)) { if (!Rfu.unk_cdc) @@ -748,7 +762,7 @@ static bool32 sub_800F0F8(void) { rfu_REQ_PARENT_resumeRetransmitAndChange(); } - Rfu.unk_0e = 1; + Rfu.unk_0e = TRUE; } } return FALSE; @@ -762,10 +776,10 @@ static bool32 sub_800F1E0(void) u16 j; u8 retval; - if (Rfu.state >= 20 && Rfu.unk_0e == 1) + if (Rfu.state >= 20 && Rfu.unk_0e == TRUE) { rfu_waitREQComplete(); - while (Rfu.unk_cdb == 0) + while (Rfu.unk_cdb == FALSE) { if (Rfu.errorState != 0) { @@ -776,8 +790,8 @@ static bool32 sub_800F1E0(void) rfu_waitREQComplete(); if ((lman.parentAck_flag & Rfu.unk_ce2) == Rfu.unk_ce2) { - Rfu.unk_cdc = 0; - gUnknown_02022B44.unk_06++; + Rfu.unk_cdc = FALSE; + sRfuDebug.unk_06++; flags = lman.acceptSlot_flag; for (i = 0; i < RFU_CHILD_MAX; i++) { @@ -813,7 +827,7 @@ static bool32 sub_800F1E0(void) CallRfuFunc(); if (Rfu.unk_ce5 && !Rfu.unk_cd9) { - gUnknown_02022B44.unk_0e = 0; + sRfuDebug.unk_0e = FALSE; rfu_clearSlot(TYPE_UNI_SEND | TYPE_UNI_RECV, Rfu.unk_cda); for (i = 0; i < RFU_CHILD_MAX; i++) { @@ -833,10 +847,10 @@ static bool32 sub_800F1E0(void) } else { - Rfu.unk_cdc = 1; - Rfu.unk_0e = 0; + Rfu.unk_cdc = TRUE; + Rfu.unk_0e = FALSE; } - Rfu.unk_0e = 0; + Rfu.unk_0e = FALSE; } retval = Rfu.unk_cdc; return gRfuLinkStatus->sendSlotUNIFlag ? retval & 1 : FALSE; @@ -914,8 +928,8 @@ static void HandleSendFailure(u8 unused, u32 flags) { s32 i, j; - const u8 *r10 = Rfu.unk_6c.payload; - for (i = 0; i < Rfu.unk_6c.count; i++) + const u8 *r10 = Rfu.sendBlock.payload; + for (i = 0; i < Rfu.sendBlock.count; i++) { if (!(flags & 1)) { @@ -932,7 +946,7 @@ static void HandleSendFailure(u8 unused, u32 flags) j++;j--; // Needed to match; } RfuSendQueue_Enqueue(&Rfu.sendQueue, sResendBlock8); - Rfu.unk_6c.failedFlags |= (1 << i); + Rfu.sendBlock.failedFlags |= (1 << i); } flags >>= 1; } @@ -949,7 +963,7 @@ void Rfu_SetBlockReceivedFlag(u8 linkPlayerId) void Rfu_ResetBlockReceivedFlag(u8 linkPlayerId) { Rfu.blockReceived[linkPlayerId] = FALSE; - Rfu.unk_80[linkPlayerId].receiving = 0; + Rfu.recvBlock[linkPlayerId].receiving = 0; } static u8 sub_800F74C(const u8 *a0) @@ -971,8 +985,8 @@ static void RfuFunc_SendKeysToRfu(void) && gHeldKeyCodeToSend != LINK_KEY_CODE_NULL && gLinkTransferringData != TRUE) { - gUnknown_03000D78[0]++; - gHeldKeyCodeToSend |= (gUnknown_03000D78[0] << 8); + sHeldKeyCount++; + gHeldKeyCodeToSend |= (sHeldKeyCount << 8); RfuPrepareSendBuffer(RFU_COMMAND_0xBE00); } } @@ -1032,28 +1046,28 @@ static void RfuHandleReceiveCommand(u8 unused) } break; case RFU_COMMAND_0x8800: - if (Rfu.unk_80[i].receiving == 0) + if (Rfu.recvBlock[i].receiving == 0) { - Rfu.unk_80[i].next = 0; - Rfu.unk_80[i].count = gRecvCmds[i][1]; - Rfu.unk_80[i].owner = gRecvCmds[i][2]; - Rfu.unk_80[i].receivedFlags = 0; - Rfu.unk_80[i].receiving = 1; + Rfu.recvBlock[i].next = 0; + Rfu.recvBlock[i].count = gRecvCmds[i][1]; + Rfu.recvBlock[i].owner = gRecvCmds[i][2]; + Rfu.recvBlock[i].receivedFlags = 0; + Rfu.recvBlock[i].receiving = 1; Rfu.blockReceived[i] = FALSE; } break; case RFU_COMMAND_0x8900: - if (Rfu.unk_80[i].receiving == 1) + if (Rfu.recvBlock[i].receiving == 1) { - Rfu.unk_80[i].next = gRecvCmds[i][0] & 0xff; - Rfu.unk_80[i].receivedFlags |= (1 << Rfu.unk_80[i].next); + Rfu.recvBlock[i].next = gRecvCmds[i][0] & 0xff; + Rfu.recvBlock[i].receivedFlags |= (1 << Rfu.recvBlock[i].next); for (j = 0; j < 6; j++) - gBlockRecvBuffer[i][Rfu.unk_80[i].next * 6 + j] = gRecvCmds[i][j + 1]; - if (Rfu.unk_80[i].receivedFlags == sAllBlocksReceived[Rfu.unk_80[i].count]) + gBlockRecvBuffer[i][Rfu.recvBlock[i].next * 6 + j] = gRecvCmds[i][j + 1]; + if (Rfu.recvBlock[i].receivedFlags == sAllBlocksReceived[Rfu.recvBlock[i].count]) { - Rfu.unk_80[i].receiving = 2; + Rfu.recvBlock[i].receiving = 2; Rfu_SetBlockReceivedFlag(i); - if (GetHostRFUtgtGname()->activity == 0x45 && gReceivedRemoteLinkPlayers != 0 && Rfu.parentChild == MODE_CHILD) + if (GetHostRFUtgtGname()->activity == (ACTIVITY_CHAT | IN_UNION_ROOM) && gReceivedRemoteLinkPlayers != 0 && Rfu.parentChild == MODE_CHILD) ValidateAndReceivePokemonSioInfo(gBlockRecvBuffer); } } @@ -1123,7 +1137,7 @@ static bool8 AreNoPlayersReceiving(void) for (i = 0; i < MAX_RFU_PLAYERS; i++) { - if (Rfu.unk_80[i].receiving) + if (Rfu.recvBlock[i].receiving) return FALSE; } return TRUE; @@ -1135,7 +1149,7 @@ static bool8 sub_800FC88(void) for (i = 0; i < Rfu.playerCount; i++) { - if (Rfu.unk_80[i].receiving != 2 || Rfu.blockReceived[i] != TRUE) + if (Rfu.recvBlock[i].receiving != 2 || Rfu.blockReceived[i] != TRUE) return FALSE; } return TRUE; @@ -1159,7 +1173,7 @@ u8 Rfu_GetBlockReceivedStatus(void) for (i = 0; i < MAX_RFU_PLAYERS; i++) { - if (Rfu.unk_80[i].receiving == 2 && Rfu.blockReceived[i] == TRUE) + if (Rfu.recvBlock[i].receiving == 2 && Rfu.blockReceived[i] == TRUE) { flags |= (1 << i); } @@ -1177,8 +1191,8 @@ static void RfuPrepareSendBuffer(u16 command) switch (command) { case RFU_COMMAND_0x8800: - gSendCmd[1] = Rfu.unk_6c.count; - gSendCmd[2] = Rfu.unk_6c.owner + 0x80; + gSendCmd[1] = Rfu.sendBlock.count; + gSendCmd[2] = Rfu.sendBlock.owner + 0x80; break; case RFU_COMMAND_0xA100: if (AreNoPlayersReceiving()) @@ -1231,23 +1245,23 @@ bool32 Rfu_InitBlockSend(const u8 *src, size_t size) return FALSE; if (gSendCmd[0] != 0) return FALSE; - if (Rfu.unk_6c.sending) + if (Rfu.sendBlock.sending) { - gUnknown_02022B44.unk_83++; + sRfuDebug.unk_83++; return FALSE; } r4 = (size % 12) != 0; - Rfu.unk_6c.owner = GetMultiplayerId(); - Rfu.unk_6c.sending = TRUE; - Rfu.unk_6c.count = (size / 12) + r4; - Rfu.unk_6c.next = 0; + Rfu.sendBlock.owner = GetMultiplayerId(); + Rfu.sendBlock.sending = TRUE; + Rfu.sendBlock.count = (size / 12) + r4; + Rfu.sendBlock.next = 0; if (size > 0x100) - Rfu.unk_6c.payload = src; + Rfu.sendBlock.payload = src; else { if (src != gBlockSendBuffer) memcpy(gBlockSendBuffer, src, size); - Rfu.unk_6c.payload = gBlockSendBuffer; + Rfu.sendBlock.payload = gBlockSendBuffer; } RfuPrepareSendBuffer(RFU_COMMAND_0x8800); Rfu.callback = HandleBlockSend; @@ -1276,34 +1290,34 @@ static void HandleBlockSend(void) static void SendNextBlock(void) { s32 i; - const u8 *src = Rfu.unk_6c.payload; - gSendCmd[0] = RFU_COMMAND_0x8900 | Rfu.unk_6c.next; - for (i = 0; i < 7; i++) - gSendCmd[i + 1] = (src[(i << 1) + Rfu.unk_6c.next * 12 + 1] << 8) | src[(i << 1) + Rfu.unk_6c.next * 12 + 0]; - Rfu.unk_6c.next++; - if (Rfu.unk_6c.count <= Rfu.unk_6c.next) + const u8 *src = Rfu.sendBlock.payload; + gSendCmd[0] = RFU_COMMAND_0x8900 | Rfu.sendBlock.next; + for (i = 0; i < CMD_LENGTH - 1; i++) + gSendCmd[i + 1] = (src[(i << 1) + Rfu.sendBlock.next * 12 + 1] << 8) | src[(i << 1) + Rfu.sendBlock.next * 12 + 0]; + Rfu.sendBlock.next++; + if (Rfu.sendBlock.count <= Rfu.sendBlock.next) { - Rfu.unk_6c.sending = FALSE; + Rfu.sendBlock.sending = FALSE; Rfu.callback = SendLastBlock; } } static void SendLastBlock(void) { - const u8 *src = Rfu.unk_6c.payload; + const u8 *src = Rfu.sendBlock.payload; u8 mpId = GetMultiplayerId(); s32 i; if (Rfu.parentChild == MODE_CHILD) { - gSendCmd[0] = RFU_COMMAND_0x8900 | (Rfu.unk_6c.count - 1); - for (i = 0; i < 7; i++) - gSendCmd[i + 1] = (src[(i << 1) + (Rfu.unk_6c.count - 1) * 12 + 1] << 8) | src[(i << 1) + (Rfu.unk_6c.count - 1) * 12 + 0]; - if ((u8)gRecvCmds[mpId][0] == Rfu.unk_6c.count - 1) + gSendCmd[0] = RFU_COMMAND_0x8900 | (Rfu.sendBlock.count - 1); + for (i = 0; i < CMD_LENGTH - 1; i++) + gSendCmd[i + 1] = (src[(i << 1) + (Rfu.sendBlock.count - 1) * 12 + 1] << 8) | src[(i << 1) + (Rfu.sendBlock.count - 1) * 12 + 0]; + if ((u8)gRecvCmds[mpId][0] == Rfu.sendBlock.count - 1) { - if (Rfu.unk_80[mpId].receivedFlags != sAllBlocksReceived[Rfu.unk_80[mpId].count]) + if (Rfu.recvBlock[mpId].receivedFlags != sAllBlocksReceived[Rfu.recvBlock[mpId].count]) { - HandleSendFailure(mpId, Rfu.unk_80[mpId].receivedFlags); - gUnknown_02022B44.unk_64++; + HandleSendFailure(mpId, Rfu.recvBlock[mpId].receivedFlags); + sRfuDebug.unk_64++; } else Rfu.callback = NULL; @@ -1898,7 +1912,7 @@ static void RfuCheckErrorStatus(void) gWirelessCommType = 2; SetMainCallback2(CB2_LinkError); gMain.savedCallback = CB2_LinkError; - sub_800AF18((Rfu.linkmanMsg << 16) | (Rfu.unk_10 << 8) | Rfu.unk_12, Rfu.recvQueue.count, Rfu.sendQueue.count, RfuGetErrorStatus() == 2); + BufferLinkErrorInfo((Rfu.linkmanMsg << 16) | (Rfu.unk_10 << 8) | Rfu.unk_12, Rfu.recvQueue.count, Rfu.sendQueue.count, RfuGetErrorStatus() == 2); Rfu.errorState = 2; CloseLink(); } @@ -1964,7 +1978,7 @@ static void CopyPlayerNameToUnameBuffer(void) void ClearAndInitHostRFUtgtGname(void) { memset(&gHostRFUtgtGnameBuffer, 0, RFU_GAME_NAME_LENGTH); - InitHostRFUtgtGname(&gHostRFUtgtGnameBuffer, 0, FALSE, 0); + InitHostRFUtgtGname(&gHostRFUtgtGnameBuffer, ACTIVITY_NONE, FALSE, 0); } void SetHostRFUtgtGname(u8 activity, u32 child_sprite_genders, u32 started) @@ -2160,7 +2174,7 @@ static void sub_801120C(u8 msg, u8 paramCount) case LMAN_MSG_RFU_FATAL_ERROR: GetLinkmanErrorParams(msg); RfuSetErrorStatus(1, msg); - Rfu.unk_cdb = 1; + Rfu.unk_cdb = TRUE; break; } } @@ -2231,7 +2245,7 @@ void sub_8011404(u8 msg, u8 unused1) case LMAN_MSG_RFU_FATAL_ERROR: RfuSetErrorStatus(1, msg); GetLinkmanErrorParams(msg); - Rfu.unk_cdb = 1; + Rfu.unk_cdb = TRUE; break; } } @@ -2304,7 +2318,7 @@ static void sub_8011674(u8 msg, u8 paramCount) Rfu.unk_ce4 = 2; } } - else if (GetHostRFUtgtGname()->activity == 0x54) + else if (GetHostRFUtgtGname()->activity == (ACTIVITY_PLYRTALK | IN_UNION_ROOM)) { rfu_REQ_disconnect(lman.acceptSlot_flag); rfu_waitREQComplete(); @@ -2408,7 +2422,7 @@ static void sub_8011674(u8 msg, u8 paramCount) case LMAN_MSG_RFU_FATAL_ERROR: GetLinkmanErrorParams(msg); RfuSetErrorStatus(1, msg); - Rfu.unk_cdb = 0; + Rfu.unk_cdb = FALSE; break; } } diff --git a/src/link_rfu_3.c b/src/link_rfu_3.c index 4946cb9f2..4393d14ac 100644 --- a/src/link_rfu_3.c +++ b/src/link_rfu_3.c @@ -7,9 +7,20 @@ #include "text.h" #include "event_data.h" +enum { + WIRELESS_STATUS_ANIM_3_BARS, + WIRELESS_STATUS_ANIM_2_BARS, + WIRELESS_STATUS_ANIM_1_BAR, + WIRELESS_STATUS_ANIM_SEARCHING, + WIRELESS_STATUS_ANIM_ERROR, +}; + +#define UNUSED_QUEUE_NUM_SLOTS 2 +#define UNUSED_QUEUE_SLOT_LENGTH 256 + struct RfuUnusedQueue { - u8 slots[2][256]; + u8 slots[UNUSED_QUEUE_NUM_SLOTS][UNUSED_QUEUE_SLOT_LENGTH]; vu8 recvSlot; vu8 sendSlot; vu8 count; @@ -234,8 +245,7 @@ static const struct OamData sWirelessStatusIndicatorOamData = .paletteNum = 0, }; -static const union AnimCmd sWirelessStatusIndicatorAnim0[] = { - // 3 bars +static const union AnimCmd sWirelessStatusIndicator_3Bars[] = { ANIMCMD_FRAME( 4, 5), ANIMCMD_FRAME( 8, 5), ANIMCMD_FRAME(12, 5), @@ -245,8 +255,7 @@ static const union AnimCmd sWirelessStatusIndicatorAnim0[] = { ANIMCMD_JUMP(0) }; -static const union AnimCmd sWirelessStatusIndicatorAnim1[] = { - // 2 bars +static const union AnimCmd sWirelessStatusIndicator_2Bars[] = { ANIMCMD_FRAME( 4, 5), ANIMCMD_FRAME( 8, 5), ANIMCMD_FRAME(12, 10), @@ -254,33 +263,30 @@ static const union AnimCmd sWirelessStatusIndicatorAnim1[] = { ANIMCMD_JUMP(0) }; -static const union AnimCmd sWirelessStatusIndicatorAnim2[] = { - // 1 bar +static const union AnimCmd sWirelessStatusIndicator_1Bar[] = { ANIMCMD_FRAME(4, 5), ANIMCMD_FRAME(8, 5), ANIMCMD_JUMP(0) }; -static const union AnimCmd sWirelessStatusIndicatorAnim3[] = { - // searching +static const union AnimCmd sWirelessStatusIndicator_Searching[] = { ANIMCMD_FRAME( 4, 10), ANIMCMD_FRAME(20, 10), ANIMCMD_JUMP(0) }; -static const union AnimCmd sWirelessStatusIndicatorAnim4[] = { - // error +static const union AnimCmd sWirelessStatusIndicator_Error[] = { ANIMCMD_FRAME(24, 10), ANIMCMD_FRAME( 4, 10), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sWirelessStatusIndicatorAnims[] = { - sWirelessStatusIndicatorAnim0, - sWirelessStatusIndicatorAnim1, - sWirelessStatusIndicatorAnim2, - sWirelessStatusIndicatorAnim3, - sWirelessStatusIndicatorAnim4 + [WIRELESS_STATUS_ANIM_3_BARS] = sWirelessStatusIndicator_3Bars, + [WIRELESS_STATUS_ANIM_2_BARS] = sWirelessStatusIndicator_2Bars, + [WIRELESS_STATUS_ANIM_1_BAR] = sWirelessStatusIndicator_1Bar, + [WIRELESS_STATUS_ANIM_SEARCHING] = sWirelessStatusIndicator_Searching, + [WIRELESS_STATUS_ANIM_ERROR] = sWirelessStatusIndicator_Error }; static const struct CompressedSpriteSheet sWirelessStatusIndicatorSpriteSheet = { @@ -292,13 +298,13 @@ static const struct SpritePalette sWirelessStatusIndicatorSpritePalette = { }; static const struct SpriteTemplate sWirelessStatusIndicatorSpriteTemplate = { - 0xD431, - 0xD432, - &sWirelessStatusIndicatorOamData, - sWirelessStatusIndicatorAnims, - NULL, - gDummySpriteAffineAnimTable, - SpriteCallbackDummy + .tileTag = 0xD431, + .paletteTag = 0xD432, + .oam = &sWirelessStatusIndicatorOamData, + .anims = sWirelessStatusIndicatorAnims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy }; void RfuRecvQueue_Reset(struct RfuRecvQueue *queue) @@ -306,9 +312,9 @@ void RfuRecvQueue_Reset(struct RfuRecvQueue *queue) s32 i; s32 j; - for (i = 0; i < 32; i++) + for (i = 0; i < RECV_QUEUE_NUM_SLOTS; i++) { - for (j = 0; j < 70; j++) + for (j = 0; j < RECV_QUEUE_SLOT_LENGTH; j++) { queue->slots[i][j] = 0; } @@ -324,9 +330,9 @@ void RfuSendQueue_Reset(struct RfuSendQueue *queue) s32 i; s32 j; - for (i = 0; i < 40; i++) + for (i = 0; i < SEND_QUEUE_NUM_SLOTS; i++) { - for (j = 0; j < 14; j++) + for (j = 0; j < SEND_QUEUE_SLOT_LENGTH; j++) { queue->slots[i][j] = 0; } @@ -342,9 +348,9 @@ static void RfuUnusedQueue_Reset(struct RfuUnusedQueue *queue) s32 i; s32 j; - for (i = 0; i < 2; i++) + for (i = 0; i < UNUSED_QUEUE_NUM_SLOTS; i++) { - for (j = 0; j < 256; j++) + for (j = 0; j < UNUSED_QUEUE_SLOT_LENGTH; j++) { queue->slots[i][j] = 0; } @@ -361,31 +367,27 @@ void RfuRecvQueue_Enqueue(struct RfuRecvQueue *queue, u8 *data) u16 imeBak; u8 count; - if (queue->count < 32) + if (queue->count < RECV_QUEUE_NUM_SLOTS) { imeBak = REG_IME; REG_IME = 0; count = 0; - for (i = 0; i < 70; i += 14) + for (i = 0; i < RECV_QUEUE_SLOT_LENGTH; i += RECV_QUEUE_SLOT_LENGTH / MAX_RFU_PLAYERS) { if (data[i] == 0 && data[i + 1] == 0) - { count++; - } } - if (count != 5) + if (count != MAX_RFU_PLAYERS) { - for (i = 0; i < 70; i++) - { + for (i = 0; i < RECV_QUEUE_SLOT_LENGTH; i++) queue->slots[queue->recvSlot][i] = data[i]; - } + queue->recvSlot++; - queue->recvSlot %= 32; + queue->recvSlot %= RECV_QUEUE_NUM_SLOTS; queue->count++; - for (i = 0; i < 70; i++) - { + + for (i = 0; i < RECV_QUEUE_SLOT_LENGTH; i++) data[i] = 0; - } } REG_IME = imeBak; } @@ -400,30 +402,27 @@ void RfuSendQueue_Enqueue(struct RfuSendQueue *queue, u8 *data) s32 i; u16 imeBak; - if (queue->count < 40) + if (queue->count < SEND_QUEUE_NUM_SLOTS) { imeBak = REG_IME; REG_IME = 0; - for (i = 0; i < 14; i++) + for (i = 0; i < SEND_QUEUE_SLOT_LENGTH; i++) { if (data[i] != 0) - { break; - } } - if (i != 14) + if (i != SEND_QUEUE_SLOT_LENGTH) { - for (i = 0; i < 14; i++) + for (i = 0; i < SEND_QUEUE_SLOT_LENGTH; i++) { queue->slots[queue->recvSlot][i] = data[i]; } queue->recvSlot++; - queue->recvSlot %= 40; + queue->recvSlot %= SEND_QUEUE_NUM_SLOTS; queue->count++; - for (i = 0; i < 14; i++) - { + + for (i = 0; i < SEND_QUEUE_SLOT_LENGTH; i++) data[i] = 0; - } } REG_IME = imeBak; } @@ -442,19 +441,18 @@ bool8 RfuRecvQueue_Dequeue(struct RfuRecvQueue *queue, u8 *src) REG_IME = 0; if (queue->recvSlot == queue->sendSlot || queue->full) { - for (i = 0; i < 70; i++) - { + for (i = 0; i < RECV_QUEUE_SLOT_LENGTH; i++) src[i] = 0; - } + REG_IME = imeBak; return FALSE; } - for (i = 0; i < 70; i++) + for (i = 0; i < RECV_QUEUE_SLOT_LENGTH; i++) { src[i] = queue->slots[queue->sendSlot][i]; } queue->sendSlot++; - queue->sendSlot %= 32; + queue->sendSlot %= RECV_QUEUE_NUM_SLOTS; queue->count--; REG_IME = imeBak; return TRUE; @@ -470,12 +468,11 @@ bool8 RfuSendQueue_Dequeue(struct RfuSendQueue *queue, u8 *src) imeBak = REG_IME; REG_IME = 0; - for (i = 0; i < 14; i++) - { + for (i = 0; i < SEND_QUEUE_SLOT_LENGTH; i++) src[i] = queue->slots[queue->sendSlot][i]; - } + queue->sendSlot++; - queue->sendSlot %= 40; + queue->sendSlot %= SEND_QUEUE_NUM_SLOTS; queue->count--; REG_IME = imeBak; return TRUE; @@ -491,20 +488,16 @@ void RfuBackupQueue_Enqueue(struct RfuBackupQueue *queue, const u8 *data) } else { - for (i = 0; i < 14; i++) - { + for (i = 0; i < BACKUP_QUEUE_SLOT_LENGTH; i++) queue->slots[queue->recvSlot][i] = data[i]; - } + queue->recvSlot++; - queue->recvSlot %= 2; - if (queue->count < 2) - { + queue->recvSlot %= BACKUP_QUEUE_NUM_SLOTS; + + if (queue->count < BACKUP_QUEUE_NUM_SLOTS) queue->count++; - } else - { queue->sendSlot = queue->recvSlot; - } } } @@ -517,13 +510,11 @@ bool8 RfuBackupQueue_Dequeue(struct RfuBackupQueue *queue, u8 *src) if (src != NULL) { - for (i = 0; i < 14; i++) - { + for (i = 0; i < BACKUP_QUEUE_SLOT_LENGTH; i++) src[i] = queue->slots[queue->sendSlot][i]; - } } queue->sendSlot++; - queue->sendSlot %= 2; + queue->sendSlot %= BACKUP_QUEUE_NUM_SLOTS; queue->count--; return TRUE; } @@ -532,14 +523,13 @@ static void RfuUnusedQueue_Enqueue(struct RfuUnusedQueue *queue, u8 *data) { s32 i; - if (queue->count < 2) + if (queue->count < UNUSED_QUEUE_NUM_SLOTS) { - for (i = 0; i < 256; i++) - { + for (i = 0; i < UNUSED_QUEUE_SLOT_LENGTH; i++) queue->slots[queue->recvSlot][i] = data[i]; - } + queue->recvSlot++; - queue->recvSlot %= 2; + queue->recvSlot %= UNUSED_QUEUE_NUM_SLOTS; queue->count++; } else @@ -555,17 +545,17 @@ static bool8 RfuUnusedQueue_Dequeue(struct RfuUnusedQueue *queue, u8 *dest) if (queue->recvSlot == queue->sendSlot || queue->full) return FALSE; - for (i = 0; i < 256; i++) - { + for (i = 0; i < UNUSED_QUEUE_SLOT_LENGTH; i++) dest[i] = queue->slots[queue->sendSlot][i]; - } + queue->sendSlot++; - queue->sendSlot %= 2; + queue->sendSlot %= UNUSED_QUEUE_NUM_SLOTS; queue->count--; return TRUE; } -void sub_800DBF8(u8 *q1, u8 mode) +// Unused +static void sub_800DBF8(u8 *q1, u8 mode) { s32 i; u8 rval; @@ -797,7 +787,7 @@ bool8 LinkRfu_GetNameIfCompatible(struct GFtgtGname *buff1, u8 *buff2, u8 idx) bool8 LinkRfu_GetNameIfSerial7F7D(struct GFtgtGname *buff1, u8 *buff2, u8 idx) { bool8 retVal = FALSE; - if (gRfuLinkStatus->partner[idx].serialNo == 0x7F7D) + if (gRfuLinkStatus->partner[idx].serialNo == RFU_SERIAL_7F7D) { memcpy(buff1, gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH); memcpy(buff2, gRfuLinkStatus->partner[idx].uname, PLAYER_NAME_LENGTH + 1); @@ -817,6 +807,15 @@ void LinkRfu3_SetGnameUnameFromStaticBuffers(struct GFtgtGname *buff1, u8 *buff2 memcpy(buff2, gHostRFUtgtUnameBuffer, PLAYER_NAME_LENGTH + 1); } +#define sNextAnimNum data[0] +#define sSavedAnimNum data[1] +#define sCurrAnimNum data[2] +#define sFrameDelay data[3] +#define sFrameIdx data[4] +#define sTileStart data[6] +#define sValidator data[7] +#define STATUS_INDICATOR_ACTIVE 0x1234 // Used to validate active indicator + void CreateWirelessStatusIndicatorSprite(u8 x, u8 y) { u8 sprId; @@ -829,25 +828,25 @@ void CreateWirelessStatusIndicatorSprite(u8 x, u8 y) if (gRfuLinkStatus->parentChild == MODE_PARENT) { sprId = CreateSprite(&sWirelessStatusIndicatorSpriteTemplate, x, y, 0); - gSprites[sprId].data[7] = 0x1234; - gSprites[sprId].data[6] = GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag); + gSprites[sprId].sValidator = STATUS_INDICATOR_ACTIVE; + gSprites[sprId].sTileStart = GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag); gSprites[sprId].invisible = TRUE; gWirelessStatusIndicatorSpriteId = sprId; } else { gWirelessStatusIndicatorSpriteId = CreateSprite(&sWirelessStatusIndicatorSpriteTemplate, x, y, 0); - gSprites[gWirelessStatusIndicatorSpriteId].data[7] = 0x1234; - gSprites[gWirelessStatusIndicatorSpriteId].data[6] = GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag); + gSprites[gWirelessStatusIndicatorSpriteId].sValidator = STATUS_INDICATOR_ACTIVE; + gSprites[gWirelessStatusIndicatorSpriteId].sTileStart = GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag); gSprites[gWirelessStatusIndicatorSpriteId].invisible = TRUE; } } void DestroyWirelessStatusIndicatorSprite(void) { - if (gSprites[gWirelessStatusIndicatorSpriteId].data[7] == 0x1234) + if (gSprites[gWirelessStatusIndicatorSpriteId].sValidator == STATUS_INDICATOR_ACTIVE) { - gSprites[gWirelessStatusIndicatorSpriteId].data[7] = 0; + gSprites[gWirelessStatusIndicatorSpriteId].sValidator = 0; DestroySprite(&gSprites[gWirelessStatusIndicatorSpriteId]); gMain.oamBuffer[125] = gDummyOamData; CpuCopy16(&gDummyOamData, (struct OamData *)OAM + 125, sizeof(struct OamData)); @@ -879,19 +878,19 @@ static u8 GetParentSignalStrength(void) return 0; } -static void SetWirelessStatusIndicatorAnim(struct Sprite *sprite, s32 signalStrengthAnimNum) +static void SetWirelessStatusIndicatorAnim(struct Sprite *sprite, s32 animNum) { - if (sprite->data[2] != signalStrengthAnimNum) + if (sprite->sCurrAnimNum != animNum) { - sprite->data[2] = signalStrengthAnimNum; - sprite->data[3] = 0; - sprite->data[4] = 0; + sprite->sCurrAnimNum = animNum; + sprite->sFrameDelay = 0; + sprite->sFrameIdx = 0; } } void UpdateWirelessStatusIndicatorSprite(void) { - if (gWirelessStatusIndicatorSpriteId != 0xFF && gSprites[gWirelessStatusIndicatorSpriteId].data[7] == 0x1234) + if (gWirelessStatusIndicatorSpriteId != 0xFF && gSprites[gWirelessStatusIndicatorSpriteId].sValidator == STATUS_INDICATOR_ACTIVE) { struct Sprite *sprite = &gSprites[gWirelessStatusIndicatorSpriteId]; u8 signalStrength = RFU_LINK_ICON_LEVEL4_MAX; @@ -912,47 +911,47 @@ void UpdateWirelessStatusIndicatorSprite(void) } if (IsRfuRecoveringFromLinkLoss() == TRUE) { - sprite->data[0] = 4; + sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_ERROR; } else if (signalStrength <= RFU_LINK_ICON_LEVEL1_MAX) { - sprite->data[0] = 3; + sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_SEARCHING; } else if (signalStrength >= RFU_LINK_ICON_LEVEL2_MIN && signalStrength <= RFU_LINK_ICON_LEVEL2_MAX) { - sprite->data[0] = 2; + sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_1_BAR; } else if (signalStrength >= RFU_LINK_ICON_LEVEL3_MIN && signalStrength <= RFU_LINK_ICON_LEVEL3_MAX) { - sprite->data[0] = 1; + sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_2_BARS; } else if (signalStrength >= RFU_LINK_ICON_LEVEL4_MIN) { - sprite->data[0] = 0; + sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_3_BARS; } - if (sprite->data[0] != sprite->data[1]) + if (sprite->sNextAnimNum != sprite->sSavedAnimNum) { - SetWirelessStatusIndicatorAnim(sprite, sprite->data[0]); - sprite->data[1] = sprite->data[0]; + SetWirelessStatusIndicatorAnim(sprite, sprite->sNextAnimNum); + sprite->sSavedAnimNum = sprite->sNextAnimNum; } - if (sprite->anims[sprite->data[2]][sprite->data[4]].frame.duration < sprite->data[3]) + if (sprite->anims[sprite->sCurrAnimNum][sprite->sFrameIdx].frame.duration < sprite->sFrameDelay) { - sprite->data[4]++; - sprite->data[3] = 0; - if (sprite->anims[sprite->data[2]][sprite->data[4]].type == -2) + sprite->sFrameIdx++; + sprite->sFrameDelay = 0; + if (sprite->anims[sprite->sCurrAnimNum][sprite->sFrameIdx].type == -2) { - sprite->data[4] = 0; + sprite->sFrameIdx = 0; } } else { - sprite->data[3]++; + sprite->sFrameDelay++; } gMain.oamBuffer[125] = sWirelessStatusIndicatorOamData; gMain.oamBuffer[125].x = sprite->pos1.x + sprite->centerToCornerVecX; gMain.oamBuffer[125].y = sprite->pos1.y + sprite->centerToCornerVecY; gMain.oamBuffer[125].paletteNum = sprite->oam.paletteNum; - gMain.oamBuffer[125].tileNum = sprite->data[6] + sprite->anims[sprite->data[2]][sprite->data[4]].frame.imageValue; + gMain.oamBuffer[125].tileNum = sprite->sTileStart + sprite->anims[sprite->sCurrAnimNum][sprite->sFrameIdx].frame.imageValue; CpuCopy16(gMain.oamBuffer + 125, (struct OamData *)OAM + 125, sizeof(struct OamData)); if (RfuGetErrorStatus() == 1) { @@ -961,6 +960,14 @@ void UpdateWirelessStatusIndicatorSprite(void) } } +#undef sNextAnimNum +#undef sSavedAnimNum +#undef sCurrAnimNum +#undef sFrameDelay +#undef sFrameIdx +#undef sTileStart +#undef sValidator + static void CopyTrainerRecord(struct TrainerNameRecord *dest, u32 trainerId, const u8 *name) { dest->trainerId = trainerId; @@ -988,7 +995,7 @@ void RecordMixTrainerNames(void) s32 j; s32 nextSpace; s32 connectedTrainerRecordIndices[5]; - struct TrainerNameRecord *newRecords = calloc(20, sizeof(struct TrainerNameRecord)); + struct TrainerNameRecord *newRecords = calloc(ARRAY_COUNT(gSaveBlock1Ptr->trainerNameRecords), sizeof(struct TrainerNameRecord)); // Check if we already have a record saved for connected trainers. for (i = 0; i < GetLinkPlayerCount(); i++) diff --git a/src/record_mixing.c b/src/record_mixing.c index 274a82e10..075bc6aee 100644 --- a/src/record_mixing.c +++ b/src/record_mixing.c @@ -231,7 +231,7 @@ static void PrepareExchangePacket(void) if (Link_AnyPartnersPlayingRubyOrSapphire()) { - if (sub_800A03C() == 0) + if (LinkDummy_Return2() == 0) PrepareUnknownExchangePacket(&sSentRecord->ruby); else PrepareExchangePacketForRubySapphire(&sSentRecord->ruby); @@ -526,7 +526,7 @@ static void Task_CopyReceiveBuffer(u8 taskId) u8 status = GetBlockReceivedStatus(); u8 handledPlayers = 0; - if (status == sub_800A9D8()) + if (status == GetLinkPlayerCountAsBitFlags()) { u8 i; diff --git a/src/start_menu.c b/src/start_menu.c index 781774f62..df45a3f12 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -1237,7 +1237,7 @@ static void Task_SaveAfterLinkBattle(u8 taskId) if (gWirelessCommType != 0 && InUnionRoom()) { - if (sub_800A07C()) + if (Link_AnyPartnersPlayingFRLG_JP()) { *state = 1; } diff --git a/src/union_room.c b/src/union_room.c index ac32e15f2..54d25046a 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -1361,7 +1361,7 @@ static void Task_ExchangeCards(u8 taskId) gTasks[taskId].data[0]++; break; case 1: - if (GetBlockReceivedStatus() == sub_800A9D8()) + if (GetBlockReceivedStatus() == GetLinkPlayerCountAsBitFlags()) { s32 i; u16 *recvBuff;