Document link_rfu_3.c

This commit is contained in:
GriffinR 2020-06-07 17:37:09 -04:00
parent e6f5c4f264
commit c98342c973
4 changed files with 421 additions and 316 deletions

View File

@ -24,12 +24,11 @@ struct GFtgtGnameSub
u16 language:4;
u16 hasNews:1;
u16 hasCard:1;
u16 unk_00_6:1;
u16 unknown:1; // Never read
u16 isChampion:1;
u16 hasNationalDex:1;
u16 gameClear:1;
u16 version:4;
u16 unk_01_6:2;
u8 playerTrainerId[2];
};
@ -92,39 +91,30 @@ struct RfuBlockSend
struct RfuRecvQueue
{
/* 0x000 */ u8 unk_00[32][70];
/* 0x8c0 */ vu8 unk_8c0;
/* 0x8c1 */ vu8 unk_8c1;
/* 0x000 */ u8 slots[32][70];
/* 0x8c0 */ vu8 recvSlot;
/* 0x8c1 */ vu8 sendSlot;
/* 0x8c2 */ vu8 count;
/* 0x8c3 */ vu8 full;
};
struct RfuSendQueue
{
/* 0x000 */ u8 unk_00[40][14];
/* 0x230 */ vu8 unk_230;
/* 0x231 */ vu8 unk_231;
/* 0x000 */ u8 slots[40][14];
/* 0x230 */ vu8 recvSlot;
/* 0x231 */ vu8 sendSlot;
/* 0x232 */ vu8 count;
/* 0x233 */ vu8 full;
};
struct UnkRfuStruct_2_Sub_c1c
struct RfuBackupQueue
{
/* 0x00 */ u8 unk_00[2][14];
/* 0x1c */ vu8 unk_1c;
/* 0x1d */ vu8 unk_1d;
/* 0x00 */ u8 slots[2][14];
/* 0x1c */ vu8 recvSlot;
/* 0x1d */ vu8 sendSlot;
/* 0x1e */ vu8 count;
};
struct UnkRfuStruct_Sub_Unused
{
/* 0x000 */ u8 unk_00[2][256];
/* 0x200 */ vu8 unk_200;
/* 0x201 */ vu8 unk_201;
/* 0x202 */ vu8 unk_202;
/* 0x203 */ vu8 unk_203;
};
struct GFRfuManager
{
/* 0x000 */ void (*callback)(void);
@ -141,8 +131,8 @@ struct GFRfuManager
/* 0x04c */ u8 unk_4c[14];
/* 0x05a */ u8 unk_5a;
/* 0x05b */ u8 unk_5b;
/* 0x05c */ bool8 unk_5c[MAX_RFU_PLAYERS];
/* 0x061 */ bool8 unk_61[MAX_RFU_PLAYERS];
/* 0x05c */ bool8 blockReceived[MAX_RFU_PLAYERS];
/* 0x061 */ bool8 numBlocksReceived[MAX_RFU_PLAYERS];
/* 0x066 */ u8 idleTaskId;
/* 0x067 */ u8 searchTaskId;
/* 0x068 */ u8 filler_68[4];
@ -164,8 +154,8 @@ struct GFRfuManager
u8 playerName[PLAYER_NAME_LENGTH + 1];
/* 0x124 */ struct RfuRecvQueue recvQueue;
/* 0x9e8 */ struct RfuSendQueue sendQueue;
/* 0xc1c */ struct UnkRfuStruct_2_Sub_c1c unk_c1c;
/* 0xc3c */ vu8 unk_c3c;
/* 0xc1c */ struct RfuBackupQueue backupQueue;
/* 0xc3c */ vu8 linkRecovered;
/* 0xc3d */ u8 unk_c3d;
/* 0xc3e */ vu8 childSlot;
/* 0xc3f */ u8 unk_c3f[70];
@ -223,7 +213,7 @@ bool8 Rfu_IsMaster(void);
void task_add_05_task_del_08FA224_when_no_RfuFunc(void);
void sub_8010434(void);
void ResetLinkRfuGFLayer(void);
void sub_800E174(void);
void UpdateWirelessStatusIndicatorSprite(void);
void InitRFU(void);
bool32 sub_8010EC0(void);
bool32 sub_8010F1C(void);
@ -250,7 +240,6 @@ u32 WaitSendByteToPartnerByIdAndName(u16 a0, const u8 *a1);
void RequestDisconnectSlotByTrainerNameAndId(const u8 *a0, u16 a1);
bool8 LmanAcceptSlotFlagIsNotZero(void);
bool32 WaitRfuState(bool32 a0);
void DestroyWirelessStatusIndicatorSprite(void);
void sub_801103C(void);
void InitializeRfuLinkManager_JoinGroup(void);
void LinkRfuNIsend8(void);
@ -282,36 +271,24 @@ bool32 sub_8011A9C(void);
void sub_80104B0(void);
void sub_8011A50(void);
void sub_80110B8(u32 a0);
bool8 sub_800DAC8(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2);
void sub_800ED34(u16 unused);
bool32 RfuSerialNumberIsValid(u32 serialNo);
bool8 sub_8012224(void);
bool32 IsRfuSerialNumberValid(u32 serialNo);
bool8 IsRfuRecoveringFromLinkLoss(void);
void sub_8011BA4(void);
void sub_800D6C8(struct RfuRecvQueue *ptr);
void sub_800D724(struct RfuSendQueue *ptr);
void sub_800D780(struct UnkRfuStruct_Sub_Unused *ptr);
void sub_800D7D8(struct RfuRecvQueue *q1, u8 *q2);
void sub_800D888(struct RfuSendQueue *q1, u8 *q2);
bool8 sub_800D934(struct RfuRecvQueue *q1, u8 *q2);
bool8 sub_800D9DC(struct RfuSendQueue *q1, u8 *q2);
void sub_800DA68(struct UnkRfuStruct_2_Sub_c1c *q1, const u8 *q2);
bool8 sub_800DAC8(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2);
void sub_800DB18(struct UnkRfuStruct_Sub_Unused *q1, u8 *q2);
bool8 sub_800DB84(struct UnkRfuStruct_Sub_Unused *q1, u8 *q2);
void RfuRecvQueue_Reset(struct RfuRecvQueue *queue);
void RfuSendQueue_Reset(struct RfuSendQueue *queue);
void RfuRecvQueue_Enqueue(struct RfuRecvQueue *queue, u8 *data);
void RfuSendQueue_Enqueue(struct RfuSendQueue *queue, u8 *data);
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);
void PkmnStrToASCII(u8 *q1, const u8 *q2);
void ASCIIToPkmnStr(u8 *q1, const u8 *q2);
u8 sub_800DD1C(u8 maxFlags);
void sub_800DD94(struct GFtgtGname *data, u8 r9, bool32 r2, s32 r3);
void InitHostRFUtgtGname(struct GFtgtGname *data, u8 r9, bool32 r2, s32 r3);
void CreateWirelessStatusIndicatorSprite(u8 x, u8 y);
void DestroyWirelessStatusIndicatorSprite(void);
void LoadWirelessStatusIndicatorSpriteGfx(void);
u8 sub_800E124(void);
void sub_800E15C(struct Sprite *sprite, s32 signalStrengthAnimNum);
void sub_800E174(void);
void CopyTrainerRecord(struct TrainerNameRecord *dest, u32 trainerId, const u8 *name);
bool32 NameIsNotEmpty(const u8 *name);
void RecordMixTrainerNames(void);
void WipeTrainerNameRecords(void);
#endif //GUARD_LINK_RFU_H

View File

@ -43,8 +43,9 @@ EWRAM_DATA struct UnkLinkRfuStruct_02022B44 gUnknown_02022B44 = {};
static void ResetSendDataManager(struct RfuBlockSend *);
static void sub_800EAB4(void);
static void sub_800EAFC(void);
static void sub_800ED34(u16);
static void sub_800EDBC(u16);
static void sub_800F048(void);
static void UpdateBackupQueue(void);
static void Task_ExchangeLinkPlayers(u8);
static void RfuHandleReceiveCommand(u8);
static void CallRfuFunc(void);
@ -56,7 +57,7 @@ static u8 GetPartnerIndexByNameAndTrainerID(const u8 *, u16);
static void sub_8010750(void);
static s32 sub_80107A0(void);
static void sub_801084C(u8);
static void sub_80109E8(u16);
static void ClearSelectedLinkPlayerIds(u16);
static void ValidateAndReceivePokemonSioInfo(void *);
static void sub_8010D0C(u8);
static void sub_80115EC(s32);
@ -229,8 +230,8 @@ void ResetLinkRfuGFLayer(void)
ResetSendDataManager(Rfu.unk_80 + i);
}
ResetSendDataManager(&Rfu.unk_6c);
sub_800D6C8(&Rfu.recvQueue);
sub_800D724(&Rfu.sendQueue);
RfuRecvQueue_Reset(&Rfu.recvQueue);
RfuSendQueue_Reset(&Rfu.sendQueue);
CpuFill16(0, gSendCmd, sizeof gSendCmd);
CpuFill16(0, gRecvCmds, sizeof gRecvCmds);
CpuFill16(0, gLinkPlayers, sizeof gLinkPlayers);
@ -498,7 +499,7 @@ void LinkRfu_StopManagerBeforeEnteringChat(void)
rfu_LMAN_stopManager(FALSE);
}
void sub_800ED34(u16 unused)
static void sub_800ED34(u16 unused)
{
s32 i;
@ -511,9 +512,9 @@ void sub_800ED34(u16 unused)
if (gRfuSlotStatusUNI[Rfu.childSlot]->recv.newDataFlag)
{
Rfu.unk_cd0++;
sub_800D7D8(&Rfu.recvQueue, Rfu.unk_c3f);
RfuRecvQueue_Enqueue(&Rfu.recvQueue, Rfu.unk_c3f);
gUnknown_02022B44.unk_06++;
sub_800F048();
UpdateBackupQueue();
rfu_UNI_readySendData(Rfu.childSlot);
rfu_UNI_clearRecvNewDataFlag(Rfu.childSlot);
}
@ -666,24 +667,22 @@ static void sub_800F014(void)
}
}
static void sub_800F048(void)
static void UpdateBackupQueue(void)
{
if (Rfu.unk_c3c)
if (Rfu.linkRecovered)
{
u8 r2 = sub_800DAC8(&Rfu.unk_c1c, Rfu.unk_4c);
if (Rfu.unk_c1c.count == 0)
{
Rfu.unk_c3c = 0;
}
if (r2)
{
bool8 backupEmpty = RfuBackupQueue_Dequeue(&Rfu.backupQueue, Rfu.unk_4c);
if (Rfu.backupQueue.count == 0)
Rfu.linkRecovered = FALSE;
if (backupEmpty)
return;
}
}
if (Rfu.unk_c3c == 0)
if (!Rfu.linkRecovered)
{
sub_800D9DC(&Rfu.sendQueue, Rfu.unk_4c);
sub_800DA68(&Rfu.unk_c1c, Rfu.unk_4c);
RfuSendQueue_Dequeue(&Rfu.sendQueue, Rfu.unk_4c);
RfuBackupQueue_Enqueue(&Rfu.backupQueue, Rfu.unk_4c);
}
}
@ -872,7 +871,7 @@ static bool32 RfuProcessEnqueuedRecvBlock(void)
u8 sp48[2 * (CMD_LENGTH - 1)];
u8 switchval;
sub_800D934(&Rfu.recvQueue, sp00);
RfuRecvQueue_Dequeue(&Rfu.recvQueue, sp00);
for (i = 0; i < MAX_RFU_PLAYERS; i++)
{
for (j = 0; j < CMD_LENGTH - 1; j++)
@ -904,7 +903,7 @@ static bool32 RfuProcessEnqueuedRecvBlock(void)
Rfu.unk_cd0--;
CallRfuFunc();
sub_800F498(gSendCmd, sp48);
sub_800D888(&Rfu.sendQueue, sp48);
RfuSendQueue_Enqueue(&Rfu.sendQueue, sp48);
for (i = 0; i < CMD_LENGTH - 1; i++)
gSendCmd[i] = 0;
}
@ -932,7 +931,7 @@ static void HandleSendFailure(u8 unused, u32 flags)
j++;j--; // Needed to match;
}
sub_800D888(&Rfu.sendQueue, sResendBlock8);
RfuSendQueue_Enqueue(&Rfu.sendQueue, sResendBlock8);
Rfu.unk_6c.failedFlags |= (1 << i);
}
flags >>= 1;
@ -942,14 +941,14 @@ static void HandleSendFailure(u8 unused, u32 flags)
void Rfu_SetBlockReceivedFlag(u8 linkPlayerId)
{
if (Rfu.parentChild == MODE_PARENT && linkPlayerId)
Rfu.unk_61[linkPlayerId] = TRUE;
Rfu.numBlocksReceived[linkPlayerId] = 1;
else
Rfu.unk_5c[linkPlayerId] = TRUE;
Rfu.blockReceived[linkPlayerId] = TRUE;
}
void Rfu_ResetBlockReceivedFlag(u8 linkPlayerId)
{
Rfu.unk_5c[linkPlayerId] = FALSE;
Rfu.blockReceived[linkPlayerId] = FALSE;
Rfu.unk_80[linkPlayerId].receiving = 0;
}
@ -1040,7 +1039,7 @@ static void RfuHandleReceiveCommand(u8 unused)
Rfu.unk_80[i].owner = gRecvCmds[i][2];
Rfu.unk_80[i].receivedFlags = 0;
Rfu.unk_80[i].receiving = 1;
Rfu.unk_5c[i] = 0;
Rfu.blockReceived[i] = FALSE;
}
break;
case RFU_COMMAND_0x8900:
@ -1081,7 +1080,7 @@ static void RfuHandleReceiveCommand(u8 unused)
Rfu.unk_ce4 = gRecvCmds[i][2];
}
Rfu.playerCount = gRecvCmds[i][3];
sub_80109E8(gRecvCmds[i][1]);
ClearSelectedLinkPlayerIds(gRecvCmds[i][1]);
}
}
else
@ -1097,7 +1096,7 @@ static void RfuHandleReceiveCommand(u8 unused)
{
Rfu.unk_ce3 |= gRecvCmds[i][1];
Rfu.unk_ce4 = gRecvCmds[i][2];
sub_80109E8(gRecvCmds[i][1]);
ClearSelectedLinkPlayerIds(gRecvCmds[i][1]);
}
break;
case RFU_COMMAND_0x4400:
@ -1105,20 +1104,20 @@ static void RfuHandleReceiveCommand(u8 unused)
gLinkPartnersHeldKeys[i] = gRecvCmds[i][1];
break;
}
if (Rfu.parentChild == MODE_PARENT && Rfu.unk_61[i])
if (Rfu.parentChild == MODE_PARENT && Rfu.numBlocksReceived[i])
{
if (Rfu.unk_61[i] == 4)
if (Rfu.numBlocksReceived[i] == 4)
{
Rfu.unk_5c[i] = 1;
Rfu.unk_61[i] = 0;
Rfu.blockReceived[i] = TRUE;
Rfu.numBlocksReceived[i] = 0;
}
else
Rfu.unk_61[i]++;
Rfu.numBlocksReceived[i]++;
}
}
}
static bool8 sub_800FC60(void)
static bool8 AreNoPlayersReceiving(void)
{
s32 i;
@ -1136,7 +1135,7 @@ static bool8 sub_800FC88(void)
for (i = 0; i < Rfu.playerCount; i++)
{
if (Rfu.unk_80[i].receiving != 2 || Rfu.unk_5c[i] != 1)
if (Rfu.unk_80[i].receiving != 2 || Rfu.blockReceived[i] != TRUE)
return FALSE;
}
return TRUE;
@ -1160,7 +1159,7 @@ u8 Rfu_GetBlockReceivedStatus(void)
for (i = 0; i < MAX_RFU_PLAYERS; i++)
{
if (Rfu.unk_80[i].receiving == 2 && Rfu.unk_5c[i] == 1)
if (Rfu.unk_80[i].receiving == 2 && Rfu.blockReceived[i] == TRUE)
{
flags |= (1 << i);
}
@ -1182,7 +1181,7 @@ static void RfuPrepareSendBuffer(u16 command)
gSendCmd[2] = Rfu.unk_6c.owner + 0x80;
break;
case RFU_COMMAND_0xA100:
if (sub_800FC60())
if (AreNoPlayersReceiving())
gSendCmd[1] = Rfu.unk_5a;
break;
case RFU_COMMAND_0x7700:
@ -1483,7 +1482,7 @@ void sub_8010434(void)
}
}
bool32 RfuSerialNumberIsValid(u32 serialNo)
bool32 IsRfuSerialNumberValid(u32 serialNo)
{
s32 i;
for (i = 0; sAcceptedSerialNos[i] != serialNo; i++)
@ -1554,7 +1553,7 @@ static bool8 sub_8010540(void)
}
}
else if (gRfuSlotStatusNI[Rfu.childSlot]->recv.state == 0x47)
else if (gRfuSlotStatusNI[Rfu.childSlot]->recv.state == SLOT_STATE_RECV_FAILED)
rfu_clearSlot(TYPE_NI_RECV, i);
{
@ -1657,7 +1656,7 @@ static s32 sub_80107A0(void)
RfuSetErrorStatus(Rfu.unk_c86, 0);
retval = Rfu.unk_c86;
}
else if (gRfuSlotStatusNI[Rfu.childSlot]->recv.state == 0x47)
else if (gRfuSlotStatusNI[Rfu.childSlot]->recv.state == SLOT_STATE_RECV_FAILED)
{
rfu_clearSlot(TYPE_NI_RECV, Rfu.childSlot);
retval = 6;
@ -1677,7 +1676,7 @@ static void sub_801084C(u8 taskId)
switch (gTasks[taskId].data[0])
{
case 0:
if (sub_800FC60())
if (AreNoPlayersReceiving())
{
ResetBlockReceivedFlags();
sub_800B348();
@ -1707,7 +1706,7 @@ static void sub_801084C(u8 taskId)
case 3:
if (Rfu.parentChild == MODE_PARENT)
{
if (sub_800FC60())
if (AreNoPlayersReceiving())
{
Rfu.unk_5a = 0;
RfuPrepareSendBuffer(RFU_COMMAND_0xA100);
@ -1749,13 +1748,13 @@ static void sub_801084C(u8 taskId)
}
}
static void sub_80109E8(u16 a0)
static void ClearSelectedLinkPlayerIds(u16 selected)
{
s32 i;
for (i = 0; i < RFU_CHILD_MAX; i++)
{
if ((a0 >> i) & 1)
if ((selected >> i) & 1)
Rfu.linkPlayerIdx[i] = 0;
}
}
@ -1965,12 +1964,12 @@ static void CopyPlayerNameToUnameBuffer(void)
void ClearAndInitHostRFUtgtGname(void)
{
memset(&gHostRFUtgtGnameBuffer, 0, RFU_GAME_NAME_LENGTH);
sub_800DD94(&gHostRFUtgtGnameBuffer, 0, FALSE, 0);
InitHostRFUtgtGname(&gHostRFUtgtGnameBuffer, 0, FALSE, 0);
}
void SetHostRFUtgtGname(u8 activity, u32 child_sprite_genders, u32 started)
{
sub_800DD94(&gHostRFUtgtGnameBuffer, activity, started, child_sprite_genders);
InitHostRFUtgtGname(&gHostRFUtgtGnameBuffer, activity, started, child_sprite_genders);
}
void SetGnameBufferWonderFlags(bool32 hasNews, bool32 hasCard)
@ -2123,7 +2122,7 @@ static void sub_801120C(u8 msg, u8 paramCount)
rfu_REQ_disconnect(Rfu.acceptSlot_flag ^ lman.acceptSlot_flag);
rfu_waitREQComplete();
}
Rfu.state = 0x11;
Rfu.state = 17;
break;
case LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY:
Rfu.linkLossRecoveryState = 1;
@ -2213,7 +2212,7 @@ void sub_8011404(u8 msg, u8 unused1)
break;
case LMAN_MSG_LINK_RECOVERY_SUCCESSED:
Rfu.linkLossRecoveryState = 3;
Rfu.unk_c3c = 1;
Rfu.linkRecovered = TRUE;
break;
case 0x34:
break;
@ -2256,7 +2255,7 @@ static u8 GetNewChildrenInUnionRoomChat(s32 a0)
u8 ret = 0;
u8 i;
for (i = 0; i < 4; i++)
for (i = 0; i < RFU_CHILD_MAX; i++)
{
if ((a0 >> i) & 1)
{
@ -2362,7 +2361,7 @@ static void sub_8011674(u8 msg, u8 paramCount)
case LMAN_MSG_LINK_RECOVERY_SUCCESSED:
Rfu.linkLossRecoveryState = 3;
if (gRfuLinkStatus->parentChild == MODE_CHILD)
Rfu.unk_c3c = 1;
Rfu.linkRecovered = TRUE;
break;
case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED:
Rfu.linkLossRecoveryState = 2;
@ -2562,7 +2561,7 @@ static u8 GetPartnerIndexByNameAndTrainerID(const u8 *name, u16 id)
for (i = 0; i < RFU_CHILD_MAX; i++)
{
u16 trainerId = ReadU16(gRfuLinkStatus->partner[i].gname + 2);
if (RfuSerialNumberIsValid(gRfuLinkStatus->partner[i].serialNo)
if (IsRfuSerialNumberValid(gRfuLinkStatus->partner[i].serialNo)
&& !StringCompare(name, gRfuLinkStatus->partner[i].uname)
&& id == trainerId)
{
@ -2784,7 +2783,7 @@ void sub_8012188(const u8 *name, struct GFtgtGname *structPtr, u8 activity)
}
}
bool8 sub_8012224(void)
bool8 IsRfuRecoveringFromLinkLoss(void)
{
if (Rfu.linkLossRecoveryState == 1)
return TRUE;

File diff suppressed because it is too large Load Diff

View File

@ -367,7 +367,7 @@ static void VBlankIntr(void)
if (!gMain.inBattle || !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_RECORDED)))
Random();
sub_800E174();
UpdateWirelessStatusIndicatorSprite();
INTR_CHECK |= INTR_FLAG_VBLANK;
gMain.intrCheck |= INTR_FLAG_VBLANK;