link_rfu_2 through rfufunc_80FA020

This commit is contained in:
PikalaxALT
2020-01-13 22:08:11 -05:00
parent 36306a82d1
commit d9ea5a0815
6 changed files with 743 additions and 2320 deletions
-2298
View File
File diff suppressed because it is too large Load Diff
-12
View File
@@ -6,18 +6,6 @@
.section .rodata
.align 2
.align 2
gUnknown_843ED94:: @ 843ED94
abspath "rfu.c"
.align 2
gUnknown_843EDC4:: @ 843EDC4
.asciz "Rfu.RfuFunc == NULL"
.align 2
gUnknown_843EDD8:: @ 843EDD8
.asciz "size<=252"
.align 2
gUnknown_843EDE4:: @ 843EDE4
.asciz "PokemonSioInfo"
+1
View File
@@ -188,6 +188,7 @@ extern bool8 gLinkVSyncDisabled;
extern u8 gWirelessCommType;
extern u8 gShouldAdvanceLinkState;
extern u16 gLinkPartnersHeldKeys[6];
void Task_DestroySelf(u8);
void OpenLink(void);
+15 -1
View File
@@ -97,6 +97,14 @@ struct UnkRfuStruct_2_Sub_9e8
/* 0x233 */ vu8 unk_233;
};
struct UnkRfuStruct_2_Sub_c1c
{
/* 0x00 */ u8 unk_00[2][14];
/* 0x1c */ vu8 unk_1c;
/* 0x1d */ vu8 unk_1d;
/* 0x1e */ vu8 unk_1e;
};
extern struct UnkRfuStruct_1 gUnknown_3005E10;
void AddTextPrinterToWindow1(const u8 *str);
@@ -120,7 +128,7 @@ void Rfu_set_zero(void);
u8 GetRfuPlayerCount(void);
void sub_80F9828(void);
u8 rfu_get_multiplayer_id(void);
bool8 Rfu_InitBlockSend(const void * src, u16 size);
bool32 Rfu_InitBlockSend(const u8 * src, size_t size);
bool8 sub_80FA0F8(u8 a0);
u8 Rfu_GetBlockReceivedStatus(void);
void Rfu_SetBlockReceivedFlag(u8 who);
@@ -139,6 +147,7 @@ struct UnkLinkRfuStruct_02022B14 *sub_80F9800(void);
void sub_80FCF34(void);
void InitRFU(void);
void sub_80FEB14(void);
bool32 sub_80FBA00(void);
void sub_80FC478(struct UnkRfuStruct_2_Sub_124 *ptr);
void sub_80FC4D4(struct UnkRfuStruct_2_Sub_9e8 *ptr);
@@ -153,6 +162,11 @@ void LinkRfu_REQ_SendData_HandleParentRelationship(bool8 clockChangeFlag);
void sub_80FC588(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2);
void sub_80FD52C(void);
u8 sub_80FD610(u16 parentId, u16 unk_1a);
bool8 sub_80FC79C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2);
bool8 sub_80FC888(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2);
bool8 sub_80FC828(struct UnkRfuStruct_2_Sub_c1c *q1, const u8 *q2);
bool8 sub_80FC6E8(struct UnkRfuStruct_2_Sub_124 * a0, u8 *a1);
bool8 sub_80FC63C(struct UnkRfuStruct_2_Sub_9e8 * a0, u8 *a1);
#include "mevent_server.h"
extern const struct mevent_server_cmd gMEventSrvScript_OtherTrainerCanceled[];
+25
View File
@@ -4,6 +4,29 @@
#include "global.h"
#include "main.h"
#define LINK_KEY_CODE_NULL 0x00
#define LINK_KEY_CODE_EMPTY 0x11
#define LINK_KEY_CODE_DPAD_DOWN 0x12
#define LINK_KEY_CODE_DPAD_UP 0x13
#define LINK_KEY_CODE_DPAD_LEFT 0x14
#define LINK_KEY_CODE_DPAD_RIGHT 0x15
#define LINK_KEY_CODE_UNK_2 0x16
#define LINK_KEY_CODE_EXIT_ROOM 0x17
#define LINK_KEY_CODE_START_BUTTON 0x18
#define LINK_KEY_CODE_A_BUTTON 0x19
#define LINK_KEY_CODE_UNK_4 0x1A // I'd guess this is the B button?
// These two are a hack to stop user input until link stuff can be
// resolved.
#define LINK_KEY_CODE_HANDLE_RECV_QUEUE 0x1B
#define LINK_KEY_CODE_HANDLE_SEND_QUEUE 0x1C
#define LINK_KEY_CODE_UNK_7 0x1D
#define LINK_KEY_CODE_UNK_8 0x1E
#define MOVEMENT_MODE_FREE 0
#define MOVEMENT_MODE_FROZEN 1
#define MOVEMENT_MODE_SCRIPTED 2
struct UnkPlayerStruct
{
u8 player_field_0;
@@ -153,4 +176,6 @@ void sub_805546C(u8 a0);
bool32 sub_80582E0(void);
bool32 sub_8058274(void);
extern u16 gHeldKeyCodeToSend;
#endif //GUARD_OVERWORLD_H
+702 -9
View File
@@ -2,6 +2,7 @@
#include "librfu.h"
#include "link.h"
#include "link_rfu.h"
#include "overworld.h"
#include "quest_log.h"
#include "task.h"
@@ -17,15 +18,7 @@ struct UnkRfuStruct_2_Sub_6c
/* 0x12 */ u8 unk_12;
};
struct UnkRfuStruct_2_Sub_c1c
{
/* 0x00 */ u8 unk_00[2][14];
/* 0x1c */ vu8 unk_1c;
/* 0x1d */ vu8 unk_1d;
/* 0x1e */ vu8 unk_1e;
};
struct
struct UnkRfuStruct_2
{
/* 0x000 */ void (*RfuFunc)(void);
/* 0x004 */ u16 unk_04;
@@ -112,13 +105,23 @@ void sub_80F8AEC(void);
void sub_80F8D20(u16 a0);
void sub_80F8DA8(u16 a0);
void sub_80F906C(void);
void sub_80F9868(u8 unused);
void sub_80F9CB4(struct UnkRfuStruct_2_Sub_6c *data);
void sub_80F9D04(u16 command);
void rfufunc_80F9F44(void);
void sub_80F9FA8(void);
void rfufunc_80FA020(void);
void sub_80FA510(void);
void sub_80FA738(void);
int sub_80FA788(void);
void sub_80FA834(u8 taskId);
void sub_80FA9D0(u16 a0);
bool32 sub_80FAA58(void * a0);
void sub_80FAA94(u8 taskId);
void sub_80FACF0(u8 taskId);
void sub_80FAFE0(u8 a0);
void sub_80FB0E8(u32 a0);
void sub_80FBCF8(u32 a0);
void sub_80FC208(void);
const struct UnkLinkRfuStruct_02022B2C gUnknown_843EBB4 = {
@@ -636,3 +639,693 @@ void sub_80F8F5C(void)
Rfu.unk_04 = 4;
Rfu.unk_ce7 = gUnknown_3005E10.unk_00;
}
bool32 sub_80F8F7C(bool32 a0)
{
if (Rfu.unk_04 == 17 || a0)
{
Rfu.unk_04 = 18;
return TRUE;
}
return FALSE;
}
void sub_80F8FA0(void)
{
Rfu.unk_04 = 14;
}
void sub_80F8FAC(u8 a0)
{
u8 i;
for (i = 0; i < 4; i++)
{
if (a0 & 1)
{
rfu_UNI_readySendData(i);
break;
}
a0 >>= 1;
}
}
void sub_80F8FD4(void)
{
s32 i, j;
for (i = 0; i < 5; i++)
{
struct UnkRfuStruct_2 *ptr = &Rfu;
for (j = 0; j < 7; j++)
{
ptr->unk_c87[i][j][1] = gRecvCmds[i][j] >> 8;
ptr->unk_c87[i][j][0] = gRecvCmds[i][j];
}
}
CpuFill16(0, gRecvCmds, sizeof gRecvCmds);
}
void sub_80F9038(void)
{
s32 i;
for (i = 0; i < 7; i++)
{
gRecvCmds[0][i] = gSendCmd[i];
}
for (i = 0; i < 7; i++)
{
gSendCmd[i] = 0;
}
}
void sub_80F906C(void)
{
if (Rfu.unk_c3c)
{
u8 r2 = sub_80FC888(&Rfu.unk_c1c, Rfu.unk_4c);
if (Rfu.unk_c1c.unk_1e == 0)
{
Rfu.unk_c3c = 0;
}
if (r2)
{
return;
}
}
if (Rfu.unk_c3c == 0)
{
sub_80FC79C(&Rfu.unk_9e8, Rfu.unk_4c);
sub_80FC828(&Rfu.unk_c1c, Rfu.unk_4c);
}
}
bool32 IsRfuRecvQueueEmpty(void)
{
s32 i;
s32 j;
if (gRfuLinkStatus->sendSlotUNIFlag == 0)
{
return FALSE;
}
for (i = 0; i < 5; i++)
{
for (j = 0; j < 7; j++)
{
if (gRecvCmds[i][j] != 0)
{
return FALSE;
}
}
}
return TRUE;
}
bool32 sub_80F911C(void)
{
if (Rfu.unk_04 < 20)
{
rfu_REQ_recvData();
rfu_waitREQComplete();
LinkRfu_REQ_SendData_HandleParentRelationship(FALSE);
}
else
{
Rfu.unk_cdb = 0;
if ((Rfu.unk_ce2 & gRfuLinkStatus->connSlotFlag) == Rfu.unk_ce2 && (Rfu.unk_ce2 & gRfuLinkStatus->connSlotFlag))
{
if (!Rfu.unk_cdc)
{
if (Rfu.unk_ce3)
{
sub_80FBCF8(Rfu.unk_ce3);
Rfu.unk_ce3 = 0;
if (Rfu.unk_ce4 == 1)
{
sub_80FB9E4(2, 0x8000);
sub_80FB0E8(0x8000);
return FALSE;
}
if (!gUnknown_3005E10.unk_00)
{
sub_80F8DC0();
gReceivedRemoteLinkPlayers = 0;
return FALSE;
}
}
sub_80F8FD4();
rfu_UNI_readySendData(Rfu.unk_cda);
LinkRfu_REQ_SendData_HandleParentRelationship(TRUE);
}
else
{
rfu_REQ_PARENT_resumeRetransmitAndChange();
}
Rfu.unk_0e = 1;
}
}
return FALSE;
}
bool32 sub_80F9204(void)
{
u16 i;
u16 flags;
u8 r0;
u16 j;
u8 retval;
if (Rfu.unk_04 >= 20 && Rfu.unk_0e == 1)
{
rfu_waitREQComplete();
while (Rfu.unk_cdb == 0)
{
if (Rfu.unk_ee != 0)
{
return FALSE;
}
}
rfu_REQ_recvData();
rfu_waitREQComplete();
if ((gUnknown_3005E10.unk_03 & Rfu.unk_ce2) == Rfu.unk_ce2)
{
Rfu.unk_cdc = 0;
gUnknown_203AC08.unk_06++;
flags = gUnknown_3005E10.unk_00;
for (i = 0; i < 4; i++)
{
if (flags & 1)
{
if (Rfu.unk_14[i][1])
{
if (Rfu.unk_cee[i] != 0xFF && (Rfu.unk_14[i][0] >> 5) != ((Rfu.unk_cee[i] + 1) & 7))
{
if (++Rfu.unk_cea[i] > 4)
sub_80FB0E8(0x8100);
}
else
{
Rfu.unk_cee[i] = Rfu.unk_14[i][0] / 32;
Rfu.unk_cea[i] = 0;
Rfu.unk_14[i][0] &= 0x1f;
r0 = Rfu.unk_cde[i];
for (j = 0; j < 7; j++)
{
gRecvCmds[r0][j] = (Rfu.unk_14[i][(j << 1) + 1] << 8) | Rfu.unk_14[i][(j << 1) + 0];
Rfu.unk_14[i][(j << 1) + 1] = 0;
Rfu.unk_14[i][(j << 1) + 0] = 0;
}
}
}
rfu_UNI_clearRecvNewDataFlag(i);
}
flags >>= 1;
}
sub_80F9038();
sub_80F9868(0);
sub_80FA510();
if (Rfu.unk_ce5 && !Rfu.unk_cd9)
{
gUnknown_203AC08.unk_0e = 0;
rfu_clearSlot(3, Rfu.unk_cda);
for (i = 0; i < 4; i++)
{
if ((Rfu.unk_ce5 >> i) & 1)
{
rfu_setRecvBuffer(0x10, i, Rfu.unk_14[i], 14);
}
}
sub_80F887C(Rfu.unk_ce2, Rfu.unk_ce2 | Rfu.unk_ce5);
Rfu.unk_ce9 = Rfu.unk_ce5;
Rfu.unk_ce2 |= Rfu.unk_ce5;
Rfu.unk_ce5 = 0;
rfu_UNI_setSendData(Rfu.unk_ce2, Rfu.unk_c87, 70);
Rfu.unk_cda = sub_80F886C(Rfu.unk_ce2);
CreateTask(sub_80FAA94, 0);
}
}
else
{
Rfu.unk_cdc = 1;
Rfu.unk_0e = 0;
}
Rfu.unk_0e = 0;
}
retval = Rfu.unk_cdc;
return gRfuLinkStatus->sendSlotUNIFlag ? retval & 1 : FALSE;
}
void sub_80F94BC(u16 *a0, u8 *a1)
{
s32 i;
if (a0[0])
{
a0[0] |= (Rfu.unk_102 << 5);
Rfu.unk_102 = (Rfu.unk_102 + 1) & 7;
for (i = 0; i < 7; i++)
{
a1[2 * i + 1] = a0[i] >> 8;
a1[2 * i + 0] = a0[i];
}
}
else
{
for (i = 0; i < 14; i++)
a1[i] = 0;
}
}
bool32 sub_80F9514(void)
{
u8 i;
u8 j;
u8 sp00[MAX_RFU_PLAYERS * (2 * (CMD_LENGTH - 1))];
u8 sp48[2 * (CMD_LENGTH - 1)];
u8 switchval;
sub_80FC6E8(&Rfu.unk_124, sp00);
for (i = 0; i < MAX_RFU_PLAYERS; i++)
{
for (j = 0; j < CMD_LENGTH - 1; j++)
{
gRecvCmds[i][j] = (sp00[i * 14 + (j << 1) + 1] << 8) | sp00[i * 14 + (j << 1) + 0];
}
}
sub_80F9868(0);
if (gUnknown_3005E10.unk_02 == 0 && Rfu.unk_ce4)
{
rfu_REQ_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag);
rfu_waitREQComplete();
switchval = sub_80FB9F4();
if (switchval != 1 && switchval != 6 && switchval != 9)
sub_80FB9E4(2, 0x9000);
rfu_clearAllSlot();
gReceivedRemoteLinkPlayers = FALSE;
Rfu.RfuFunc = NULL;
if (Rfu.unk_ce4 == 1)
{
sub_80FB9E4(2, 0x9000);
sub_80FB0E8(0x9000);
}
gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0;
Rfu.unk_ce4 = 0;
}
if (Rfu.unk_cd0)
{
Rfu.unk_cd0--;
sub_80FA510();
sub_80F94BC(gSendCmd, sp48);
sub_80FC63C(&Rfu.unk_9e8, sp48);
for (i = 0; i < CMD_LENGTH - 1; i++)
gSendCmd[i] = 0;
}
return IsRfuRecvQueueEmpty();
}
void sub_80F965C(u8 unused, u32 flags)
{
s32 i, j;
const u8 *r10 = Rfu.unk_6c.unk_04;
for (i = 0; i < Rfu.unk_6c.unk_02; i++)
{
if (!(flags & 1))
{
gUnknown_3002008[0] = (~0x76ff) | i;
for (j = 0; j < 7; j++)
{
gUnknown_3002008[j + 1] = (r10[12 * i + (j << 1) + 1] << 8) | r10[12 * i + (j << 1) + 0];
}
for (j = 0; j < 7; j++)
{
gUnknown_3001FF8[2 * j + 1] = gUnknown_3002008[j] >> 8;
gUnknown_3001FF8[2 * j + 0] = gUnknown_3002008[j];
j++;j--; // Needed to match;
}
sub_80FC63C(&Rfu.unk_9e8, gUnknown_3001FF8);
Rfu.unk_6c.unk_0c |= (1 << i);
}
flags >>= 1;
}
}
void Rfu_SetBlockReceivedFlag(u8 a0)
{
if (Rfu.unk_0c == 1 && a0)
Rfu.unk_61[a0] = 1;
else
Rfu.unk_5c[a0] = 1;
}
void Rfu_ResetBlockReceivedFlag(u8 a0)
{
Rfu.unk_5c[a0] = 0;
Rfu.unk_80[a0].unk_12 = 0;
}
u8 sub_80F9770(const u8 *a0)
{
u8 i;
if (Rfu.unk_0c == 1)
return FALSE;
for (i = 0; i < 4; i++)
{
Rfu.unk_cde[i] = a0[i];
}
return a0[Rfu.unk_c3e];
}
void rfu_func_080F97B8(void)
{
// static u8 gUnknown_3001188;
if (gReceivedRemoteLinkPlayers
&& gHeldKeyCodeToSend != LINK_KEY_CODE_NULL
&& gLinkTransferringData != TRUE)
{
gUnknown_3001188++;
gHeldKeyCodeToSend |= (gUnknown_3001188 << 8);
sub_80F9D04(0xbe00);
}
}
struct UnkLinkRfuStruct_02022B14 *sub_80F9800(void)
{
return &gUnknown_3005440;
}
bool32 IsSendingKeysToRfu(void)
{
return Rfu.RfuFunc == rfu_func_080F97B8;
}
void sub_80F9828(void)
{
AGB_ASSERT_EX(Rfu.RfuFunc == NULL, ABSPATH("rfu.c"), 1473);
Rfu.RfuFunc = rfu_func_080F97B8;
}
void Rfu_set_zero(void)
{
Rfu.RfuFunc = NULL;
}
void sub_80F9868(u8 unused)
{
u16 i;
u16 j;
for (i = 0; i < MAX_RFU_PLAYERS; i++)
{
switch (gRecvCmds[i][0] & 0xff00)
{
case 0x7800:
if (Rfu.unk_0c == 0 && gReceivedRemoteLinkPlayers != 0)
return;
// fallthrough
case 0x7700:
if (gRfuLinkStatus->parentChild == MODE_CHILD)
{
Rfu.playerCount = gRecvCmds[i][1];
Rfu.unk_cce = sub_80F9770((u8 *)(gRecvCmds[i] + 2));
}
break;
case 0x8800:
if (Rfu.unk_80[i].unk_12 == 0)
{
Rfu.unk_80[i].unk_00 = 0;
Rfu.unk_80[i].unk_02 = gRecvCmds[i][1];
Rfu.unk_80[i].unk_11 = gRecvCmds[i][2];
Rfu.unk_80[i].unk_08 = 0;
Rfu.unk_80[i].unk_12 = 1;
Rfu.unk_5c[i] = 0;
}
break;
case 0x8900:
if (Rfu.unk_80[i].unk_12 == 1)
{
Rfu.unk_80[i].unk_00 = gRecvCmds[i][0] & 0xff;
Rfu.unk_80[i].unk_08 |= (1 << Rfu.unk_80[i].unk_00);
for (j = 0; j < 6; j++)
gBlockRecvBuffer[i][Rfu.unk_80[i].unk_00 * 6 + j] = gRecvCmds[i][j + 1];
if (Rfu.unk_80[i].unk_08 == gUnknown_843EBD4[Rfu.unk_80[i].unk_02])
{
Rfu.unk_80[i].unk_12 = 2;
Rfu_SetBlockReceivedFlag(i);
if (sub_80F9800()->unk_0a_0 == 0x45 && gReceivedRemoteLinkPlayers != 0 && Rfu.unk_0c == 0)
sub_80FAA58(gBlockRecvBuffer);
}
}
break;
case 0xa100:
Rfu_InitBlockSend(gUnknown_843EC64[gRecvCmds[i][1]].buffer, (u16)gUnknown_843EC64[gRecvCmds[i][1]].size);
break;
case 0x5f00:
Rfu.unk_e4[i] = 1;
break;
case 0x6600:
if (Rfu.unk_100 == gRecvCmds[i][1])
Rfu.unk_e9[i] = 1;
break;
case 0xed00:
if (Rfu.unk_0c == 0)
{
if (gReceivedRemoteLinkPlayers != 0)
{
if (gRecvCmds[i][1] & gRfuLinkStatus->connSlotFlag)
{
gReceivedRemoteLinkPlayers = 0;
sub_80FEB14();
Rfu.unk_ce4 = gRecvCmds[i][2];
}
Rfu.playerCount = gRecvCmds[i][3];
sub_80FA9D0(gRecvCmds[i][1]);
}
}
else
{
sub_80F9D04(0xee00);
gSendCmd[1] = gRecvCmds[i][1];
gSendCmd[2] = gRecvCmds[i][2];
gSendCmd[3] = gRecvCmds[i][3];
}
break;
case 0xee00:
if (Rfu.unk_0c == 1)
{
Rfu.unk_ce3 |= gRecvCmds[i][1];
Rfu.unk_ce4 = gRecvCmds[i][2];
sub_80FA9D0(gRecvCmds[i][1]);
}
break;
case 0xbe00:
gLinkPartnersHeldKeys[i] = gRecvCmds[i][1];
break;
}
if (Rfu.unk_0c == 1 && Rfu.unk_61[i])
{
if (Rfu.unk_61[i] == 4)
{
Rfu.unk_5c[i] = 1;
Rfu.unk_61[i] = 0;
}
else
Rfu.unk_61[i]++;
}
}
}
bool8 sub_80F9C50(void)
{
s32 i;
for (i = 0; i < 5; i++)
{
if (Rfu.unk_80[i].unk_12)
return FALSE;
}
return TRUE;
}
bool8 sub_80F9C78(void)
{
s32 i;
for (i = 0; i < Rfu.playerCount; i++)
{
if (Rfu.unk_80[i].unk_12 != 2 || Rfu.unk_5c[i] != 1)
return FALSE;
}
return TRUE;
}
void sub_80F9CB4(struct UnkRfuStruct_2_Sub_6c *data)
{
data->unk_00 = 0;
data->unk_02 = 0;
data->unk_04 = NULL;
data->unk_08 = 0;
data->unk_10 = 0;
data->unk_11 = 0;
data->unk_12 = 0;
}
u8 Rfu_GetBlockReceivedStatus(void)
{
u8 flags = 0;
s32 i;
for (i = 0; i < 5; i++)
{
if (Rfu.unk_80[i].unk_12 == 2 && Rfu.unk_5c[i] == 1)
{
flags |= (1 << i);
}
}
return flags;
}
void sub_80F9D04(u16 command)
{
u8 i;
u8 *buff;
u8 tmp;
gSendCmd[0] = command;
switch (command)
{
case 0x8800:
gSendCmd[1] = Rfu.unk_6c.unk_02;
gSendCmd[2] = Rfu.unk_6c.unk_11 + 0x80;
break;
case 0xa100:
if (sub_80F9C50())
gSendCmd[1] = Rfu.unk_5a;
break;
case 0x7700:
case 0x7800:
tmp = Rfu.unk_ce2 ^ Rfu.unk_ce3;
Rfu.playerCount = gUnknown_843EC41[tmp] + 1;
gSendCmd[1] = Rfu.playerCount;
buff = (u8 *)(gSendCmd + 2);
for (i = 0; i < 4; i++)
buff[i] = Rfu.unk_cde[i];
break;
case 0x6600:
case 0x5f00:
gSendCmd[1] = Rfu.unk_100;
break;
case 0x2f00:
for (i = 0; i < 6; i++)
gSendCmd[1 + i] = Rfu.unk_f2[i];
break;
case 0xbe00:
gSendCmd[1] = gHeldKeyCodeToSend;
break;
case 0xee00:
break;
case 0xed00:
break;
}
}
void sub_80F9E2C(void *a0)
{
if (gSendCmd[0] == 0 && !sub_80FBA00())
{
memcpy(Rfu.unk_f2, a0, sizeof(Rfu.unk_f2));
sub_80F9D04(0x2f00);
}
}
bool32 Rfu_InitBlockSend(const u8 *src, size_t size)
{
bool8 r4;
AGB_ASSERT_EX(size<=252, ABSPATH("rfu.c"), 1793);
if (Rfu.RfuFunc != NULL)
return FALSE;
if (gSendCmd[0] != 0)
return FALSE;
if (Rfu.unk_6c.unk_10 != 0)
{
gUnknown_203AC08.unk_83++;
return FALSE;
}
r4 = (size % 12) != 0;
Rfu.unk_6c.unk_11 = GetMultiplayerId();
Rfu.unk_6c.unk_10 = 1;
Rfu.unk_6c.unk_02 = (size / 12) + r4;
Rfu.unk_6c.unk_00 = 0;
if (size > 0x100)
Rfu.unk_6c.unk_04 = src;
else
{
if (src != gBlockSendBuffer)
memcpy(gBlockSendBuffer, src, size);
Rfu.unk_6c.unk_04 = gBlockSendBuffer;
}
sub_80F9D04(0x8800);
Rfu.RfuFunc = rfufunc_80F9F44;
Rfu.unk_5b = 0;
return TRUE;
}
void rfufunc_80F9F44(void)
{
if (gSendCmd[0] == 0)
{
sub_80F9D04(0x8800);
if (Rfu.unk_0c == 1)
{
if (++Rfu.unk_5b > 2)
Rfu.RfuFunc = sub_80F9FA8;
}
else
{
if ((gRecvCmds[GetMultiplayerId()][0] & 0xff00) == 0x8800)
Rfu.RfuFunc = sub_80F9FA8;
}
}
}
void sub_80F9FA8(void)
{
s32 i;
const u8 *src = Rfu.unk_6c.unk_04;
gSendCmd[0] = 0x8900 | Rfu.unk_6c.unk_00;
for (i = 0; i < 7; i++)
gSendCmd[i + 1] = (src[(i << 1) + Rfu.unk_6c.unk_00 * 12 + 1] << 8) | src[(i << 1) + Rfu.unk_6c.unk_00 * 12 + 0];
Rfu.unk_6c.unk_00++;
if (Rfu.unk_6c.unk_02 <= Rfu.unk_6c.unk_00)
{
Rfu.unk_6c.unk_10 = 0;
Rfu.RfuFunc = rfufunc_80FA020;
}
}
void rfufunc_80FA020(void)
{
const u8 *src = Rfu.unk_6c.unk_04;
u8 mpId = GetMultiplayerId();
s32 i;
if (Rfu.unk_0c == 0)
{
gSendCmd[0] = (~0x76ff) | (Rfu.unk_6c.unk_02 - 1);
for (i = 0; i < 7; i++)
gSendCmd[i + 1] = (src[(i << 1) + (Rfu.unk_6c.unk_02 - 1) * 12 + 1] << 8) | src[(i << 1) + (Rfu.unk_6c.unk_02 - 1) * 12 + 0];
if ((u8)gRecvCmds[mpId][0] == Rfu.unk_6c.unk_02 - 1)
{
if (Rfu.unk_80[mpId].unk_08 != gUnknown_843EBD4[Rfu.unk_80[mpId].unk_02])
{
sub_80F965C(mpId, Rfu.unk_80[mpId].unk_08);
gUnknown_203AC08.unk_64++;
}
else
Rfu.RfuFunc = NULL;
}
}
else
Rfu.RfuFunc = NULL;
}