Continue misc link documentation, rename reset_save_heap

This commit is contained in:
GriffinR 2021-08-15 18:26:09 -04:00
parent dfdcfc1568
commit 4efa6c882a
20 changed files with 487 additions and 441 deletions

View File

@ -5,20 +5,25 @@
#include "link.h" #include "link.h"
#include "AgbRfu_LinkManager.h" #include "AgbRfu_LinkManager.h"
#define RFUCMD_MASK 0xFF00
#define RFUCMD_SEND_PACKET 0x2F00 #define RFUCMD_SEND_PACKET 0x2F00
#define RFUCMD_BLENDER_SEND_KEYS 0x4400 #define RFUCMD_BLENDER_SEND_KEYS 0x4400
#define RFUCMD_READY_CLOSE_LINK 0x5F00 #define RFUCMD_READY_CLOSE_LINK 0x5F00
#define RFUCMD_READY_EXIT_STANDBY 0x6600 #define RFUCMD_READY_EXIT_STANDBY 0x6600
#define RFUCMD_0x7700 0x7700 #define RFUCMD_SEND_PLAYER_IDS 0x7700
#define RFUCMD_0x7800 0x7800 #define RFUCMD_SEND_PLAYER_IDS_NEW 0x7800
#define RFUCMD_0x8800 0x8800 #define RFUCMD_SEND_BLOCK_INIT 0x8800
#define RFUCMD_0x8900 0x8900 #define RFUCMD_SEND_BLOCK 0x8900
#define RFUCMD_SEND_BLOCK_REQ 0xA100 #define RFUCMD_SEND_BLOCK_REQ 0xA100
#define RFUCMD_SEND_HELD_KEYS 0xBE00 #define RFUCMD_SEND_HELD_KEYS 0xBE00
#define RFUCMD_0xED00 0xED00 #define RFUCMD_DISCONNECT 0xED00
#define RFUCMD_0xEE00 0xEE00 #define RFUCMD_DISCONNECT_PARENT 0xEE00
#define RFU_SERIAL_7F7D 0x7F7D #define RFU_SERIAL_A 0x0002
#define RFU_SERIAL_B 0x7F7D
#define RFU_SERIAL_C 0x0000
#define RFU_SERIAL_END 0xFFFF
#define RECV_QUEUE_NUM_SLOTS 32 #define RECV_QUEUE_NUM_SLOTS 32
#define RECV_QUEUE_SLOT_LENGTH (14 * MAX_RFU_PLAYERS) #define RECV_QUEUE_SLOT_LENGTH (14 * MAX_RFU_PLAYERS)
@ -45,6 +50,24 @@
#define RFU_STATUS_CHILD_LEAVE 11 #define RFU_STATUS_CHILD_LEAVE 11
#define RFU_STATUS_ACK_JOIN_GROUP 12 #define RFU_STATUS_ACK_JOIN_GROUP 12
#define CHILD_DATA_LENGTH 14
// Values for disconnectMode
enum {
RFU_DISCONNECT_NONE,
RFU_DISCONNECT_ERROR,
RFU_DISCONNECT_NORMAL,
};
// Values for errorState
enum {
RFU_ERROR_STATE_NONE,
RFU_ERROR_STATE_1,
RFU_ERROR_STATE_2,
RFU_ERROR_STATE_3,
RFU_ERROR_STATE_IGNORE,
};
// RfuTgtData.gname is read as these structs. // RfuTgtData.gname is read as these structs.
struct GFtgtGnameSub struct GFtgtGnameSub
{ {
@ -125,8 +148,8 @@ struct GFRfuManager
/* 0x00f */ u8 unk_0f; /* 0x00f */ u8 unk_0f;
/* 0x010 */ u16 unk_10; /* 0x010 */ u16 unk_10;
/* 0x012 */ u16 unk_12; /* 0x012 */ u16 unk_12;
/* 0x014 */ u8 unk_14[RFU_CHILD_MAX][14]; /* 0x014 */ u8 childRecvBuffer[RFU_CHILD_MAX][CHILD_DATA_LENGTH];
/* 0x04c */ u8 unk_4c[14]; /* 0x04c */ u8 childSendBuffer[CHILD_DATA_LENGTH];
/* 0x05a */ u8 blockRequestType; /* 0x05a */ u8 blockRequestType;
/* 0x05b */ u8 unk_5b; /* 0x05b */ u8 unk_5b;
/* 0x05c */ bool8 blockReceived[MAX_RFU_PLAYERS]; /* 0x05c */ bool8 blockReceived[MAX_RFU_PLAYERS];
@ -144,9 +167,9 @@ struct GFRfuManager
/* 0x0f1 */ u8 status; /* 0x0f1 */ u8 status;
/* 0x0f2 */ u16 packet[RFU_PACKET_SIZE]; /* 0x0f2 */ u16 packet[RFU_PACKET_SIZE];
/* 0x0fe */ u16 resendExitStandbyTimer; /* 0x0fe */ u16 resendExitStandbyTimer;
/* 0x100 */ u16 unk_100; /* 0x100 */ u16 allReadyNum;
/* 0x102 */ u8 unk_102; /* 0x102 */ u8 unk_102;
/* 0x103 */ u8 filler_103[0x10A - 0x103]; /* 0x103 */ u8 filler_103[7];
/* 0x10A */ struct GFtgtGname unk_10A; /* 0x10A */ struct GFtgtGname unk_10A;
u8 filler_; u8 filler_;
u8 playerName[PLAYER_NAME_LENGTH + 1]; u8 playerName[PLAYER_NAME_LENGTH + 1];
@ -162,36 +185,33 @@ struct GFRfuManager
/* 0xc87 */ u8 recvCmds[5][7][2]; /* 0xc87 */ u8 recvCmds[5][7][2];
/* 0xccd */ u8 parentId; /* 0xccd */ u8 parentId;
/* 0xcce */ u8 multiplayerId; /* 0xcce */ u8 multiplayerId;
/* 0xccf */ u8 unk_ccf; /* 0xccf */ u8 connectParentFailures;
/* 0xcd0 */ vu8 unk_cd0; /* 0xcd0 */ vu8 childSendCount;
/* 0xcd1 */ u8 partnerSendStatuses[RFU_CHILD_MAX]; /* 0xcd1 */ u8 partnerSendStatuses[RFU_CHILD_MAX];
/* 0xcd5 */ u8 partnerRecvStatuses[RFU_CHILD_MAX]; /* 0xcd5 */ u8 partnerRecvStatuses[RFU_CHILD_MAX];
/* 0xcd9 */ u8 unk_cd9; /* 0xcd9 */ bool8 stopNewConnections;
/* 0xcda */ u8 unk_cda; /* 0xcda */ u8 unk_cda;
/* 0xcdb */ vbool8 unk_cdb; /* 0xcdb */ vbool8 unk_cdb;
/* 0xcdc */ vbool8 unk_cdc; /* 0xcdc */ vbool8 unk_cdc;
/* 0xcdd */ u8 unk_cdd; /* 0xcdd */ u8 unk_cdd;
/* 0xcde */ u8 linkPlayerIdx[RFU_CHILD_MAX]; /* 0xcde */ u8 linkPlayerIdx[RFU_CHILD_MAX];
/* 0xce2 */ u8 unk_ce2; /* 0xce2 */ u8 unk_ce2;
/* 0xce2 */ u8 unk_ce3; /* 0xce2 */ u8 disconnectSlots;
/* 0xce4 */ u8 unk_ce4; /* 0xce4 */ u8 disconnectMode;
/* 0xce5 */ u8 unk_ce5; /* 0xce5 */ u8 unk_ce5;
/* 0xce5 */ u8 unk_ce6; /* 0xce5 */ u8 unk_ce6;
/* 0xce7 */ u8 acceptSlot_flag; /* 0xce7 */ u8 acceptSlot_flag;
/* 0xce8 */ u8 unk_ce8; /* 0xce8 */ bool8 unk_ce8;
/* 0xce9 */ u8 unk_ce9; /* 0xce9 */ u8 unk_ce9;
/* 0xcea */ u8 unk_cea[4]; /* 0xcea */ u8 unk_cea[4];
/* 0xcee */ u8 unk_cee[4]; /* 0xcee */ u8 unk_cee[4];
}; // size = 0xcf4 }; // size = 0xcf4
// Exported RAM declarations
extern struct GFtgtGname gHostRFUtgtGnameBuffer; extern struct GFtgtGname gHostRFUtgtGnameBuffer;
extern u8 gHostRFUtgtUnameBuffer[]; extern u8 gHostRFUtgtUnameBuffer[];
extern struct GFRfuManager Rfu; extern struct GFRfuManager Rfu;
extern u8 gWirelessStatusIndicatorSpriteId; extern u8 gWirelessStatusIndicatorSpriteId;
// Exported ROM declarations
void WipeTrainerNameRecords(void); void WipeTrainerNameRecords(void);
void InitRFUAPI(void); void InitRFUAPI(void);
void LinkRfu_Shutdown(void); void LinkRfu_Shutdown(void);
@ -219,13 +239,13 @@ bool32 RfuHasErrored(void);
bool32 IsRfuRecvQueueEmpty(void); bool32 IsRfuRecvQueueEmpty(void);
u32 GetRfuRecvQueueLength(void); u32 GetRfuRecvQueueLength(void);
void RfuVSync(void); void RfuVSync(void);
void sub_80111B0(bool32 a0); void RfuSetIgnoreError(bool32 enable);
u8 RfuGetStatus(void); u8 RfuGetStatus(void);
struct GFtgtGname *GetHostRFUtgtGname(void); struct GFtgtGname *GetHostRFUtgtGname(void);
void UpdateGameData_GroupLockedIn(u8 a0); void UpdateGameData_GroupLockedIn(u8 started);
void GetLinkmanErrorParams(u32 a0); void GetLinkmanErrorParams(u32 msg);
void RfuSetStatus(u8 a0, u16 a1); void RfuSetStatus(u8 status, u16 msg);
u8 sub_801048C(bool32 a0); u8 Rfu_SetLinkRecovery(bool32 enable);
void LinkRfu3_SetGnameUnameFromStaticBuffers(struct GFtgtGname *buff1, u8 *buff2); void LinkRfu3_SetGnameUnameFromStaticBuffers(struct GFtgtGname *buff1, u8 *buff2);
void SetHostRFUtgtGname(u8 activity, u32 child_sprite_genders, bool32 started); void SetHostRFUtgtGname(u8 activity, u32 child_sprite_genders, bool32 started);
void InitializeRfuLinkManager_LinkLeader(u32 a0); void InitializeRfuLinkManager_LinkLeader(u32 a0);
@ -235,10 +255,10 @@ bool32 RfuTryDisconnectLeavingChildren(void);
bool32 HasTrainerLeftPartnersList(u16 trainerId, const u8 *name); bool32 HasTrainerLeftPartnersList(u16 trainerId, const u8 *name);
void SendRfuStatusToPartner(u8 status, u16 trainerId, const u8 *name); void SendRfuStatusToPartner(u8 status, u16 trainerId, const u8 *name);
u32 WaitSendRfuStatusToPartner(u16 trainerId, const u8 *name); u32 WaitSendRfuStatusToPartner(u16 trainerId, const u8 *name);
void RequestDisconnectSlotByTrainerNameAndId(const u8 *a0, u16 a1); void RequestDisconnectSlotByTrainerNameAndId(const u8 *name, u16 id);
bool8 LmanAcceptSlotFlagIsNotZero(void); bool8 LmanAcceptSlotFlagIsNotZero(void);
bool32 WaitRfuState(bool32 a0); bool32 WaitRfuState(bool32 force);
void sub_801103C(void); void GetOtherPlayersInfoFlags(void);
void InitializeRfuLinkManager_JoinGroup(void); void InitializeRfuLinkManager_JoinGroup(void);
void SendLeaveGroupNotice(void); void SendLeaveGroupNotice(void);
void RecordMixTrainerNames(void); void RecordMixTrainerNames(void);
@ -246,7 +266,7 @@ void LinkRfu_CreateConnectionAsParent(void);
void LinkRfu_StopManagerBeforeEnteringChat(void); void LinkRfu_StopManagerBeforeEnteringChat(void);
void UpdateGameData_SetActivity(u8 activity, u32 flags, bool32 started); void UpdateGameData_SetActivity(u8 activity, u32 flags, bool32 started);
void CreateTask_RfuReconnectWithParent(const u8 *src, u16 trainerId); void CreateTask_RfuReconnectWithParent(const u8 *src, u16 trainerId);
void SetGnameBufferWonderFlags(bool32 a0, bool32 a1); void SetGnameBufferWonderFlags(bool32 hasNews, bool32 hasCard);
void ClearAndInitHostRFUtgtGname(void); void ClearAndInitHostRFUtgtGname(void);
void SetTradeBoardRegisteredMonInfo(u32 type, u32 species, u32 level); void SetTradeBoardRegisteredMonInfo(u32 type, u32 species, u32 level);
void InitializeRfuLinkManager_EnterUnionRoom(void); void InitializeRfuLinkManager_EnterUnionRoom(void);
@ -254,8 +274,8 @@ void sub_8012188(const u8 *name, struct GFtgtGname *structPtr, u8 a2);
bool32 IsUnionRoomListenTaskActive(void); bool32 IsUnionRoomListenTaskActive(void);
void Rfu_SendPacket(void *data); void Rfu_SendPacket(void *data);
bool32 PlayerHasMetTrainerBefore(u16 id, u8 *name); bool32 PlayerHasMetTrainerBefore(u16 id, u8 *name);
void sub_8011DE0(u32 arg0); void Rfu_DisconnectPlayerById(u32 playerIdx);
u8 sub_801100C(s32 a0); u8 GetLinkPlayerInfoFlags(s32 playerId);
void sub_800EF7C(void); void sub_800EF7C(void);
bool8 LinkRfu_GetNameIfCompatible(struct GFtgtGname *buff1, u8 *buff2, u8 idx); bool8 LinkRfu_GetNameIfCompatible(struct GFtgtGname *buff1, u8 *buff2, u8 idx);
bool8 LinkRfu_GetNameIfSerial7F7D(struct GFtgtGname *buff1, u8 *buff2, u8 idx); bool8 LinkRfu_GetNameIfSerial7F7D(struct GFtgtGname *buff1, u8 *buff2, u8 idx);
@ -265,9 +285,9 @@ void DestroyTask_RfuIdle(void);
void ClearRecvCommands(void); void ClearRecvCommands(void);
void LinkRfu_FatalError(void); void LinkRfu_FatalError(void);
bool32 sub_8011A9C(void); bool32 sub_8011A9C(void);
void sub_80104B0(void); void Rfu_StopPartnerSearch(void);
void sub_8011A50(void); void RfuSetNormalDisconnectMode(void);
void sub_80110B8(u32 a0); void SetUnionRoomChatPlayerData(u32 numPlayers);
bool32 IsRfuSerialNumberValid(u32 serialNo); bool32 IsRfuSerialNumberValid(u32 serialNo);
bool8 IsRfuRecoveringFromLinkLoss(void); bool8 IsRfuRecoveringFromLinkLoss(void);
void RfuRecvQueue_Reset(struct RfuRecvQueue *queue); void RfuRecvQueue_Reset(struct RfuRecvQueue *queue);

6
include/reload_save.h Normal file
View File

@ -0,0 +1,6 @@
#ifndef GUARD_RELOAD_SAVE_H
#define GUARD_RELOAD_SAVE_H
void ReloadSave(void);
#endif // GUARD_RELOAD_SAVE_H

View File

@ -1,12 +0,0 @@
#ifndef GUARD_RESET_SAVE_HEAP_H
#define GUARD_RESET_SAVE_HEAP_H
// Exported type declarations
// Exported RAM declarations
// Exported ROM declarations
void sub_81700F8(void);
#endif //GUARD_RESET_SAVE_HEAP_H

View File

@ -36,6 +36,7 @@ struct SaveSectionOffsets
// Emerald changes this definition to be the sectors per slot. // Emerald changes this definition to be the sectors per slot.
#define NUM_SECTORS_PER_SLOT 16 #define NUM_SECTORS_PER_SLOT 16
#define NUM_SAVE_SLOTS 2
#define UNKNOWN_CHECK_VALUE 0x8012025 #define UNKNOWN_CHECK_VALUE 0x8012025
#define SPECIAL_SECTION_SENTINEL 0xB39D #define SPECIAL_SECTION_SENTINEL 0xB39D
@ -104,7 +105,7 @@ bool8 sub_8153408(void);
bool8 FullSaveGame(void); bool8 FullSaveGame(void);
bool8 CheckSaveFile(void); bool8 CheckSaveFile(void);
u8 Save_LoadGameData(u8 saveType); u8 Save_LoadGameData(u8 saveType);
u16 sub_815355C(void); u16 GetSaveBlocksPointersBaseOffset(void);
u32 TryReadSpecialSaveSection(u8 sector, u8* dst); u32 TryReadSpecialSaveSection(u8 sector, u8* dst);
u32 TryWriteSpecialSaveSection(u8 sector, u8* src); u32 TryWriteSpecialSaveSection(u8 sector, u8* src);
void Task_LinkSave(u8 taskId); void Task_LinkSave(u8 taskId);

View File

@ -256,7 +256,7 @@ SECTIONS {
src/battle_controller_wally.o(.text); src/battle_controller_wally.o(.text);
src/player_pc.o(.text); src/player_pc.o(.text);
src/intro.o(.text); src/intro.o(.text);
src/reset_save_heap.o(.text); src/reload_save.o(.text);
src/field_region_map.o(.text); src/field_region_map.o(.text);
src/battle_anim_throw.o(.text); src/battle_anim_throw.o(.text);
src/hall_of_fame.o(.text); src/hall_of_fame.o(.text);

View File

@ -2069,7 +2069,7 @@ static bool32 CheckRecvCmdMatches(u16 recvCmd, u16 linkCmd, u16 rfuCmd)
{ {
if (gReceivedRemoteLinkPlayers && gWirelessCommType) if (gReceivedRemoteLinkPlayers && gWirelessCommType)
{ {
if ((recvCmd & 0xFF00) == rfuCmd) if ((recvCmd & RFUCMD_MASK) == rfuCmd)
return TRUE; return TRUE;
} }
else else
@ -3135,7 +3135,7 @@ static void UpdateBlenderCenter(void)
} }
else else
{ {
if ((gRecvCmds[0][BLENDER_COMM_INPUT_STATE] & 0xFF00) == RFUCMD_BLENDER_SEND_KEYS) if ((gRecvCmds[0][BLENDER_COMM_INPUT_STATE] & RFUCMD_MASK) == RFUCMD_BLENDER_SEND_KEYS)
{ {
sBerryBlender->progressBarValue = gRecvCmds[0][BLENDER_COMM_PROGRESS_BAR]; sBerryBlender->progressBarValue = gRecvCmds[0][BLENDER_COMM_PROGRESS_BAR];
sBerryBlender->arrowPos = gRecvCmds[0][BLENDER_COMM_ARROW_POS]; sBerryBlender->arrowPos = gRecvCmds[0][BLENDER_COMM_ARROW_POS];

View File

@ -984,12 +984,12 @@ static u32 QuitBerryCrush(MainCallback exitCallback)
return 0; return 0;
} }
#define ERROR_EXIT(exitCallback) \ #define ERROR_EXIT(exitCallback) \
{ \ { \
SetMainCallback2(exitCallback); \ SetMainCallback2(exitCallback); \
Rfu.unk_10 = 0; \ Rfu.unk_10 = 0; \
Rfu.unk_12 = 0; \ Rfu.unk_12 = 0; \
Rfu.errorState = 1; \ Rfu.errorState = RFU_ERROR_STATE_1; \
} }
void StartBerryCrush(MainCallback exitCallback) void StartBerryCrush(MainCallback exitCallback)
@ -2565,7 +2565,7 @@ static void HandlePartnerInput(struct BerryCrushGame *game)
linkState = (struct BerryCrushGame_LinkState *)gRecvCmds[i]; linkState = (struct BerryCrushGame_LinkState *)gRecvCmds[i];
// Skip player if we have not received a packet from them // Skip player if we have not received a packet from them
if ((linkState->rfuCmd & 0xFF00) != RFUCMD_SEND_PACKET) if ((linkState->rfuCmd & RFUCMD_MASK) != RFUCMD_SEND_PACKET)
continue; continue;
if (linkState->sendFlag != SEND_GAME_STATE) if (linkState->sendFlag != SEND_GAME_STATE)
continue; continue;
@ -2805,7 +2805,7 @@ static void RecvLinkData(struct BerryCrushGame *game)
for (i = 0; i < game->playerCount; i++) for (i = 0; i < game->playerCount; i++)
game->players[i].inputState = INPUT_STATE_NONE; game->players[i].inputState = INPUT_STATE_NONE;
if ((gRecvCmds[0][0] & 0xFF00) != RFUCMD_SEND_PACKET) if ((gRecvCmds[0][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET)
{ {
game->playedSound = FALSE; game->playedSound = FALSE;
return; return;

View File

@ -3106,7 +3106,7 @@ static u32 RecvPacket_ReadyToStart(u32 playerId)
{ {
struct ReadyToStartPacket *packet; struct ReadyToStartPacket *packet;
if ((gRecvCmds[0][0] & 0xFF00) != RFUCMD_SEND_PACKET) if ((gRecvCmds[0][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET)
return FALSE; return FALSE;
packet = (void *)&gRecvCmds[playerId][1]; packet = (void *)&gRecvCmds[playerId][1];
@ -3233,7 +3233,7 @@ static bool32 RecvPacket_GameState(u32 playerId,
struct GameStatePacket *packet; struct GameStatePacket *packet;
struct DodrioGame_Berries *berries = &player->berries; struct DodrioGame_Berries *berries = &player->berries;
if ((gRecvCmds[0][0] & 0xFF00) != RFUCMD_SEND_PACKET) if ((gRecvCmds[0][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET)
return FALSE; return FALSE;
packet = (void *)&gRecvCmds[0][1]; packet = (void *)&gRecvCmds[0][1];
@ -3310,7 +3310,7 @@ static bool32 RecvPacket_PickState(u32 playerId, u8 *pickState)
{ {
struct PickStatePacket *packet; struct PickStatePacket *packet;
if ((gRecvCmds[0][0] & 0xFF00) != RFUCMD_SEND_PACKET) if ((gRecvCmds[0][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET)
return FALSE; return FALSE;
packet = (void *)&gRecvCmds[playerId][1]; packet = (void *)&gRecvCmds[playerId][1];
@ -3341,7 +3341,7 @@ static bool32 RecvPacket_ReadyToEnd(u32 playerId)
{ {
struct ReadyToEndPacket *packet; struct ReadyToEndPacket *packet;
if ((gRecvCmds[0][0] & 0xFF00) != RFUCMD_SEND_PACKET) if ((gRecvCmds[0][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET)
return FALSE; return FALSE;
packet = (void *)&gRecvCmds[playerId][1]; packet = (void *)&gRecvCmds[playerId][1];

View File

@ -1142,7 +1142,7 @@ void CB2_InitCopyrightScreenAfterBootup(void)
{ {
if (!SetUpCopyrightScreen()) if (!SetUpCopyrightScreen())
{ {
SetSaveBlocksPointers(sub_815355C()); SetSaveBlocksPointers(GetSaveBlocksPointersBaseOffset());
ResetMenuAndMonGlobals(); ResetMenuAndMonGlobals();
Save_ResetSaveCounters(); Save_ResetSaveCounters();
Save_LoadGameData(SAVE_NORMAL); Save_LoadGameData(SAVE_NORMAL);

View File

@ -1,7 +1,7 @@
#include "global.h" #include "global.h"
#include "m4a.h" #include "m4a.h"
#include "malloc.h" #include "malloc.h"
#include "reset_save_heap.h" #include "reload_save.h"
#include "save.h" #include "save.h"
#include "bg.h" #include "bg.h"
#include "window.h" #include "window.h"
@ -1705,7 +1705,7 @@ static void CB2_PrintErrorMessage(void)
PlaySE(SE_PIN); PlaySE(SE_PIN);
gWirelessCommType = 0; gWirelessCommType = 0;
sLinkErrorBuffer.disconnected = FALSE; sLinkErrorBuffer.disconnected = FALSE;
sub_81700F8(); ReloadSave();
} }
} }
else if (gWirelessCommType == 2) else if (gWirelessCommType == 2)

File diff suppressed because it is too large Load Diff

View File

@ -719,7 +719,7 @@ bool8 LinkRfu_GetNameIfCompatible(struct GFtgtGname *buff1, u8 *buff2, u8 idx)
bool8 LinkRfu_GetNameIfSerial7F7D(struct GFtgtGname *buff1, u8 *buff2, u8 idx) bool8 LinkRfu_GetNameIfSerial7F7D(struct GFtgtGname *buff1, u8 *buff2, u8 idx)
{ {
bool8 retVal = FALSE; bool8 retVal = FALSE;
if (gRfuLinkStatus->partner[idx].serialNo == RFU_SERIAL_7F7D) if (gRfuLinkStatus->partner[idx].serialNo == RFU_SERIAL_B)
{ {
memcpy(buff1, gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH); memcpy(buff1, gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH);
memcpy(buff2, gRfuLinkStatus->partner[idx].uname, PLAYER_NAME_LENGTH + 1); memcpy(buff2, gRfuLinkStatus->partner[idx].uname, PLAYER_NAME_LENGTH + 1);

View File

@ -71,6 +71,7 @@ void ClearSav1(void)
CpuFill16(0, &gSaveblock1, sizeof(struct SaveBlock1) + sizeof(gSaveblock1_DMA)); CpuFill16(0, &gSaveblock1, sizeof(struct SaveBlock1) + sizeof(gSaveblock1_DMA));
} }
// Offset is the sum of the trainer id bytes
void SetSaveBlocksPointers(u16 offset) void SetSaveBlocksPointers(u16 offset)
{ {
struct SaveBlock1** sav1_LocalVar = &gSaveBlock1Ptr; struct SaveBlock1** sav1_LocalVar = &gSaveBlock1Ptr;

View File

@ -3945,7 +3945,7 @@ static bool32 RecvPacket_MonInfo(int multiplayerId, struct PokemonJump_MonInfo *
{ {
struct MonInfoPacket packet; struct MonInfoPacket packet;
if ((gRecvCmds[multiplayerId][0] & 0xFF00) != RFUCMD_SEND_PACKET) if ((gRecvCmds[multiplayerId][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET)
return FALSE; return FALSE;
memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet)); memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet));
@ -4010,7 +4010,7 @@ static bool32 RecvPacket_LeaderState(struct PokemonJump_Player *player, struct P
{ {
struct LeaderStatePacket packet; struct LeaderStatePacket packet;
if ((gRecvCmds[0][0] & 0xFF00) != RFUCMD_SEND_PACKET) if ((gRecvCmds[0][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET)
return FALSE; return FALSE;
memcpy(&packet, &gRecvCmds[0][1], sizeof(packet)); memcpy(&packet, &gRecvCmds[0][1], sizeof(packet));
@ -4057,7 +4057,7 @@ static bool32 RecvPacket_MemberStateToLeader(struct PokemonJump_Player *player,
{ {
struct MemberStatePacket packet; struct MemberStatePacket packet;
if ((gRecvCmds[multiplayerId][0] & 0xFF00) != RFUCMD_SEND_PACKET) if ((gRecvCmds[multiplayerId][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET)
return FALSE; return FALSE;
memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet)); memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet));
@ -4078,7 +4078,7 @@ static bool32 RecvPacket_MemberStateToMember(struct PokemonJump_Player *player,
{ {
struct MemberStatePacket packet; struct MemberStatePacket packet;
if ((gRecvCmds[multiplayerId][0] & 0xFF00) != RFUCMD_SEND_PACKET) if ((gRecvCmds[multiplayerId][0] & RFUCMD_MASK) != RFUCMD_SEND_PACKET)
return FALSE; return FALSE;
memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet)); memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet));

View File

@ -981,7 +981,7 @@ static void Task_DoRecordMixing(u8 taskId)
// Mixing Emerald records. // Mixing Emerald records.
case 6: case 6:
if (!sub_801048C(FALSE)) if (!Rfu_SetLinkRecovery(FALSE))
{ {
CreateTask(Task_LinkSave, 5); CreateTask(Task_LinkSave, 5);
task->data[0]++; task->data[0]++;
@ -992,7 +992,7 @@ static void Task_DoRecordMixing(u8 taskId)
{ {
if (gWirelessCommType) if (gWirelessCommType)
{ {
sub_801048C(TRUE); Rfu_SetLinkRecovery(TRUE);
task->data[0] = 8; task->data[0] = 8;
} }
else else

View File

@ -8,17 +8,17 @@
#include "overworld.h" #include "overworld.h"
#include "malloc.h" #include "malloc.h"
void sub_81700F8(void) // Reloads the game, continuing from the point of the last save
// Used to gracefully exit after a link connection error
void ReloadSave(void)
{ {
u16 imeBackup; u16 imeBackup = REG_IME;
imeBackup = REG_IME;
REG_IME = 0; REG_IME = 0;
RegisterRamReset(RESET_EWRAM); RegisterRamReset(RESET_EWRAM);
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK);
REG_IME = imeBackup; REG_IME = imeBackup;
gMain.inBattle = FALSE; gMain.inBattle = FALSE;
SetSaveBlocksPointers(sub_815355C()); SetSaveBlocksPointers(GetSaveBlocksPointersBaseOffset());
ResetMenuAndMonGlobals(); ResetMenuAndMonGlobals();
Save_ResetSaveCounters(); Save_ResetSaveCounters();
Save_LoadGameData(SAVE_NORMAL); Save_LoadGameData(SAVE_NORMAL);

View File

@ -126,16 +126,16 @@ static bool32 SetDamagedSectorBits(u8 op, u8 bit)
return retVal; return retVal;
} }
static u8 SaveWriteToFlash(u16 a1, const struct SaveSectionLocation *location) static u8 SaveWriteToFlash(u16 sectorId, const struct SaveSectionLocation *location)
{ {
u32 status; u32 status;
u16 i; u16 i;
gFastSaveSection = &gSaveDataBuffer; gFastSaveSection = &gSaveDataBuffer;
if (a1 != 0xFFFF) // for link if (sectorId != 0xFFFF) // for link
{ {
status = HandleWriteSector(a1, location); status = HandleWriteSector(sectorId, location);
} }
else else
{ {
@ -169,7 +169,7 @@ static u8 HandleWriteSector(u16 sectorId, const struct SaveSectionLocation *loca
sector = sectorId + gLastWrittenSector; sector = sectorId + gLastWrittenSector;
sector %= SECTOR_SAVE_SLOT_LENGTH; sector %= SECTOR_SAVE_SLOT_LENGTH;
sector += SECTOR_SAVE_SLOT_LENGTH * (gSaveCounter % 2); sector += SECTOR_SAVE_SLOT_LENGTH * (gSaveCounter % NUM_SAVE_SLOTS);
data = location[sectorId].data; data = location[sectorId].data;
size = location[sectorId].size; size = location[sectorId].size;
@ -292,7 +292,7 @@ static u8 ClearSaveData_2(u16 sectorId, const struct SaveSectionLocation *locati
sector = sectorId + gLastWrittenSector; sector = sectorId + gLastWrittenSector;
sector %= SECTOR_SAVE_SLOT_LENGTH; sector %= SECTOR_SAVE_SLOT_LENGTH;
sector += SECTOR_SAVE_SLOT_LENGTH * (gSaveCounter % 2); sector += SECTOR_SAVE_SLOT_LENGTH * (gSaveCounter % NUM_SAVE_SLOTS);
data = location[sectorId].data; data = location[sectorId].data;
size = location[sectorId].size; size = location[sectorId].size;
@ -362,7 +362,7 @@ static u8 sav12_xor_get(u16 sectorId, const struct SaveSectionLocation *location
sector = sectorId + gLastWrittenSector; // no sub 1? sector = sectorId + gLastWrittenSector; // no sub 1?
sector %= SECTOR_SAVE_SLOT_LENGTH; sector %= SECTOR_SAVE_SLOT_LENGTH;
sector += SECTOR_SAVE_SLOT_LENGTH * (gSaveCounter % 2); sector += SECTOR_SAVE_SLOT_LENGTH * (gSaveCounter % NUM_SAVE_SLOTS);
if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), 0x25)) if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), 0x25))
{ {
@ -385,7 +385,7 @@ static u8 sub_8152CAC(u16 sectorId, const struct SaveSectionLocation *location)
sector = sectorId + gLastWrittenSector - 1; sector = sectorId + gLastWrittenSector - 1;
sector %= SECTOR_SAVE_SLOT_LENGTH; sector %= SECTOR_SAVE_SLOT_LENGTH;
sector += SECTOR_SAVE_SLOT_LENGTH * (gSaveCounter % 2); sector += SECTOR_SAVE_SLOT_LENGTH * (gSaveCounter % NUM_SAVE_SLOTS);
if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), ((u8 *)gFastSaveSection)[sizeof(struct UnkSaveSection)])) if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), ((u8 *)gFastSaveSection)[sizeof(struct UnkSaveSection)]))
{ {
@ -408,7 +408,7 @@ static u8 sub_8152D44(u16 sectorId, const struct SaveSectionLocation *location)
sector = sectorId + gLastWrittenSector - 1; // no sub 1? sector = sectorId + gLastWrittenSector - 1; // no sub 1?
sector %= SECTOR_SAVE_SLOT_LENGTH; sector %= SECTOR_SAVE_SLOT_LENGTH;
sector += SECTOR_SAVE_SLOT_LENGTH * (gSaveCounter % 2); sector += SECTOR_SAVE_SLOT_LENGTH * (gSaveCounter % NUM_SAVE_SLOTS);
if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), 0x25)) if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), 0x25))
{ {
@ -446,12 +446,12 @@ static u8 sub_8152E10(u16 a1, const struct SaveSectionLocation *location)
{ {
u16 i; u16 i;
u16 checksum; u16 checksum;
u16 v3 = SECTOR_SAVE_SLOT_LENGTH * (gSaveCounter % 2); u16 slotOffset = SECTOR_SAVE_SLOT_LENGTH * (gSaveCounter % NUM_SAVE_SLOTS);
u16 id; u16 id;
for (i = 0; i < SECTOR_SAVE_SLOT_LENGTH; i++) for (i = 0; i < SECTOR_SAVE_SLOT_LENGTH; i++)
{ {
DoReadFlashWholeSection(i + v3, gFastSaveSection); DoReadFlashWholeSection(i + slotOffset, gFastSaveSection);
id = gFastSaveSection->id; id = gFastSaveSection->id;
if (id == 0) if (id == 0)
gLastWrittenSector = i; gLastWrittenSector = i;
@ -824,27 +824,29 @@ u8 Save_LoadGameData(u8 saveType)
return status; return status;
} }
u16 sub_815355C(void) u16 GetSaveBlocksPointersBaseOffset(void)
{ {
u16 i, v3; u16 i, slotOffset;
struct SaveSection* savSection; struct SaveSection* savSection;
savSection = gFastSaveSection = &gSaveDataBuffer; savSection = gFastSaveSection = &gSaveDataBuffer;
if (gFlashMemoryPresent != TRUE) if (gFlashMemoryPresent != TRUE)
return SAVE_STATUS_EMPTY; return 0;
UpdateSaveAddresses(); UpdateSaveAddresses();
GetSaveValidStatus(gRamSaveSectionLocations); GetSaveValidStatus(gRamSaveSectionLocations);
v3 = SECTOR_SAVE_SLOT_LENGTH * (gSaveCounter % 2); slotOffset = SECTOR_SAVE_SLOT_LENGTH * (gSaveCounter % NUM_SAVE_SLOTS);
for (i = 0; i < SECTOR_SAVE_SLOT_LENGTH; i++) for (i = 0; i < SECTOR_SAVE_SLOT_LENGTH; i++)
{ {
DoReadFlashWholeSection(i + v3, gFastSaveSection); DoReadFlashWholeSection(i + slotOffset, gFastSaveSection);
if (gFastSaveSection->id == 0)
return savSection->data[10] + // Base offset for SaveBlock2 is calculated using the trainer id
savSection->data[11] + if (gFastSaveSection->id == SECTOR_ID_SAVEBLOCK2)
savSection->data[12] + return savSection->data[offsetof(struct SaveBlock2, playerTrainerId[0])] +
savSection->data[13]; savSection->data[offsetof(struct SaveBlock2, playerTrainerId[1])] +
savSection->data[offsetof(struct SaveBlock2, playerTrainerId[2])] +
savSection->data[offsetof(struct SaveBlock2, playerTrainerId[3])];
} }
return SAVE_STATUS_EMPTY; return 0;
} }
u32 TryReadSpecialSaveSection(u8 sector, u8* dst) u32 TryReadSpecialSaveSection(u8 sector, u8* dst)

View File

@ -459,7 +459,7 @@ static void CB2_CreateTradeMenu(void)
sTradeMenuData->timer = 0; sTradeMenuData->timer = 0;
if (gWirelessCommType) if (gWirelessCommType)
{ {
sub_801048C(TRUE); Rfu_SetLinkRecovery(TRUE);
SetLinkStandbyCallback(); SetLinkStandbyCallback();
} }
} }
@ -1709,7 +1709,7 @@ static void CancelTrade_2(void)
static void LinkTradeWaitForQueue(void) static void LinkTradeWaitForQueue(void)
{ {
if (!sub_801048C(FALSE) && GetNumQueuedActions() == 0) if (!Rfu_SetLinkRecovery(FALSE) && GetNumQueuedActions() == 0)
{ {
SetLinkStandbyCallback(); SetLinkStandbyCallback();
sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_START_LINK_TRADE; sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_START_LINK_TRADE;

View File

@ -680,7 +680,7 @@ static void Task_TryBecomeLinkLeader(u8 taskId)
if (gReceivedRemoteLinkPlayers != 0) if (gReceivedRemoteLinkPlayers != 0)
{ {
if (IsActivityWithVariableGroupSize(gPlayerCurrActivity)) if (IsActivityWithVariableGroupSize(gPlayerCurrActivity))
sub_801103C(); GetOtherPlayersInfoFlags();
UpdateGameData_GroupLockedIn(TRUE); UpdateGameData_GroupLockedIn(TRUE);
CreateTask_RunScriptAndFadeToActivity(); CreateTask_RunScriptAndFadeToActivity();
Leader_DestroyResources(data); Leader_DestroyResources(data);
@ -1291,7 +1291,7 @@ static void Task_ListenToWireless(u8 taskId)
SetWirelessCommType1(); SetWirelessCommType1();
OpenLink(); OpenLink();
InitializeRfuLinkManager_JoinGroup(); InitializeRfuLinkManager_JoinGroup();
sub_80111B0(TRUE); RfuSetIgnoreError(TRUE);
data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C)); data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
data->field_0 = AllocZeroed(16 * sizeof(struct UnkStruct_x20)); data->field_0 = AllocZeroed(16 * sizeof(struct UnkStruct_x20));
data->state = 2; data->state = 2;
@ -2894,7 +2894,7 @@ static void Task_RunUnionRoom(u8 taskId)
ReceiveUnionRoomActivityPacket(uroom); ReceiveUnionRoomActivityPacket(uroom);
if (UnionRoom_HandleContactFromOtherPlayer(uroom) && JOY_NEW(B_BUTTON)) if (UnionRoom_HandleContactFromOtherPlayer(uroom) && JOY_NEW(B_BUTTON))
{ {
sub_8011DE0(1); Rfu_DisconnectPlayerById(1);
StringCopy(gStringVar4, sText_ChatEnded); StringCopy(gStringVar4, sText_ChatEnded);
uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG; uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG;
} }
@ -2908,9 +2908,9 @@ static void Task_RunUnionRoom(u8 taskId)
case 0: // ACCEPT case 0: // ACCEPT
uroom->playerSendBuffer[0] = ACTIVITY_ACCEPT | IN_UNION_ROOM; uroom->playerSendBuffer[0] = ACTIVITY_ACCEPT | IN_UNION_ROOM;
if (gPlayerCurrActivity == (ACTIVITY_CHAT | IN_UNION_ROOM)) if (gPlayerCurrActivity == (ACTIVITY_CHAT | IN_UNION_ROOM))
UpdateGameData_SetActivity(gPlayerCurrActivity | IN_UNION_ROOM, sub_801100C(1), FALSE); UpdateGameData_SetActivity(gPlayerCurrActivity | IN_UNION_ROOM, GetLinkPlayerInfoFlags(1), FALSE);
else else
UpdateGameData_SetActivity(gPlayerCurrActivity | IN_UNION_ROOM, sub_801100C(1), TRUE); UpdateGameData_SetActivity(gPlayerCurrActivity | IN_UNION_ROOM, GetLinkPlayerInfoFlags(1), TRUE);
uroom->field_8->arr[0].field_1B = 0; uroom->field_8->arr[0].field_1B = 0;
taskData[3] = 0; taskData[3] = 0;
@ -3213,7 +3213,7 @@ void SetUsingUnionRoomStartMenu(void)
static void ReceiveUnionRoomActivityPacket(struct WirelessLink_URoom *data) static void ReceiveUnionRoomActivityPacket(struct WirelessLink_URoom *data)
{ {
if (gRecvCmds[1][1] != 0 && (gRecvCmds[1][0] & 0xFF00) == 0x2F00) if (gRecvCmds[1][1] != 0 && (gRecvCmds[1][0] & RFUCMD_MASK) == RFUCMD_SEND_PACKET)
{ {
data->recvActivityRequest[0] = gRecvCmds[1][1]; data->recvActivityRequest[0] = gRecvCmds[1][1];
if (gRecvCmds[1][1] == (ACTIVITY_TRADE | IN_UNION_ROOM)) if (gRecvCmds[1][1] == (ACTIVITY_TRADE | IN_UNION_ROOM))
@ -3282,7 +3282,7 @@ static void Task_InitUnionRoom(u8 taskId)
SetWirelessCommType1(); SetWirelessCommType1();
OpenLink(); OpenLink();
InitializeRfuLinkManager_EnterUnionRoom(); InitializeRfuLinkManager_EnterUnionRoom();
sub_80111B0(TRUE); RfuSetIgnoreError(TRUE);
data->state = 2; data->state = 2;
break; break;
case 2: case 2:
@ -3877,32 +3877,22 @@ static bool32 AreUnionRoomPlayerGnamesDifferent(struct WirelessGnameUnamePair *p
s32 i; s32 i;
if (pair1->gname.activity != pair2->gname.activity) if (pair1->gname.activity != pair2->gname.activity)
{
return TRUE; return TRUE;
}
if (pair1->gname.started != pair2->gname.started) if (pair1->gname.started != pair2->gname.started)
{
return TRUE; return TRUE;
}
for (i = 0; i < RFU_CHILD_MAX; i++) for (i = 0; i < RFU_CHILD_MAX; i++)
{ {
if (pair1->gname.child_sprite_gender[i] != pair2->gname.child_sprite_gender[i]) if (pair1->gname.child_sprite_gender[i] != pair2->gname.child_sprite_gender[i])
{
return TRUE; return TRUE;
}
} }
if (pair1->gname.species != pair2->gname.species) if (pair1->gname.species != pair2->gname.species)
{
return TRUE; return TRUE;
}
if (pair1->gname.type != pair2->gname.type) if (pair1->gname.type != pair2->gname.type)
{
return TRUE; return TRUE;
}
return FALSE; return FALSE;
} }
@ -4246,7 +4236,7 @@ static s32 GetChatLeaderActionRequestMessage(u8 *dst, u32 gender, u16 *activityD
StringCopy(uroom->activityRequestStrbufs[1], gSpeciesNames[sUnionRoomTrade.playerSpecies]); StringCopy(uroom->activityRequestStrbufs[1], gSpeciesNames[sUnionRoomTrade.playerSpecies]);
for (i = 0; i < RFU_CHILD_MAX; i++) for (i = 0; i < RFU_CHILD_MAX; i++)
{ {
if (gRfuLinkStatus->partner[i].serialNo == 2) if (gRfuLinkStatus->partner[i].serialNo == RFU_SERIAL_A)
{ {
ConvertIntToDecimalStringN(uroom->activityRequestStrbufs[2], activityData[2], STR_CONV_MODE_LEFT_ALIGN, 3); ConvertIntToDecimalStringN(uroom->activityRequestStrbufs[2], activityData[2], STR_CONV_MODE_LEFT_ALIGN, 3);
StringCopy(uroom->activityRequestStrbufs[3], gSpeciesNames[activityData[1]]); StringCopy(uroom->activityRequestStrbufs[3], gSpeciesNames[activityData[1]]);

View File

@ -1198,7 +1198,7 @@ static void Chat_AskQuitChatting(void)
sChat->funcState = 3; sChat->funcState = 3;
break; break;
case 0: case 0:
sub_80104B0(); Rfu_StopPartnerSearch();
PrepareSendBuffer_Disband(sChat->sendMessageBuffer); PrepareSendBuffer_Disband(sChat->sendMessageBuffer);
sChat->funcState = 4; sChat->funcState = 4;
sChat->tryQuitAgainTimer = 0; sChat->tryQuitAgainTimer = 0;
@ -1819,7 +1819,7 @@ static void PrepareSendBuffer_Leave(u8 *buffer)
buffer[0] = CHAT_MESSAGE_LEAVE; buffer[0] = CHAT_MESSAGE_LEAVE;
StringCopy(&buffer[1], gSaveBlock2Ptr->playerName); StringCopy(&buffer[1], gSaveBlock2Ptr->playerName);
buffer[1 + (PLAYER_NAME_LENGTH + 1)] = sChat->multiplayerId; buffer[1 + (PLAYER_NAME_LENGTH + 1)] = sChat->multiplayerId;
sub_8011A50(); RfuSetNormalDisconnectMode();
} }
static void PrepareSendBuffer_Drop(u8 *buffer) static void PrepareSendBuffer_Drop(u8 *buffer)
@ -2079,13 +2079,12 @@ static void Task_ReceiveChatMessage(u8 taskId)
{ {
if (GetLinkPlayerCount() == 2) if (GetLinkPlayerCount() == 2)
{ {
sub_80104B0(); Rfu_StopPartnerSearch();
sChat->exitType = 1; sChat->exitType = 1;
DestroyTask(taskId); DestroyTask(taskId);
return; return;
} }
Rfu_DisconnectPlayerById(tCurrLinkPlayer);
sub_8011DE0(tCurrLinkPlayer);
} }
tState = 3; tState = 3;
@ -2104,7 +2103,7 @@ static void Task_ReceiveChatMessage(u8 taskId)
if (!sub_8011A9C()) if (!sub_8011A9C())
{ {
if (!sChat->multiplayerId) if (!sChat->multiplayerId)
sub_80110B8(sChat->linkPlayerCount); SetUnionRoomChatPlayerData(sChat->linkPlayerCount);
tState = 1; tState = 1;
} }