summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGriffinR <griffin.g.richards@gmail.com>2021-11-13 23:19:08 -0500
committerGitHub <noreply@github.com>2021-11-13 23:19:08 -0500
commit9a932cd9c3089c03adada30ace4c79a84bf73cf0 (patch)
treeb8dfc2d147b8e5f92c0f8e67e3d06bcc2f8453cc
parentb14fe9dce369b1a78c5f4f653b4c7e2e2d67d98d (diff)
parent8e8b70c15c1e34074d27acaa07f8e28d0d3d9e89 (diff)
Merge pull request #1549 from GriffinRichards/doc-binterface
Document remaining symbols in battle_interface, palette, and save
-rw-r--r--common_syms/save.txt6
-rw-r--r--include/constants/battle.h3
-rw-r--r--include/load_save.h4
-rw-r--r--include/palette.h8
-rw-r--r--include/save.h129
-rw-r--r--include/strings.h4
-rw-r--r--src/battle_anim_mons.c5
-rw-r--r--src/battle_interface.c288
-rw-r--r--src/battle_main.c6
-rw-r--r--src/berry_blender.c4
-rwxr-xr-xsrc/berry_crush.c4
-rw-r--r--src/dodrio_berry_picking.c4
-rwxr-xr-xsrc/ereader_helpers.c4
-rw-r--r--src/hall_of_fame.c12
-rw-r--r--src/intro.c2
-rw-r--r--src/load_save.c4
-rw-r--r--src/palette.c244
-rwxr-xr-xsrc/pokemon_jump.c4
-rw-r--r--src/record_mixing.c10
-rw-r--r--src/recorded_battle.c16
-rw-r--r--src/reload_save.c2
-rw-r--r--src/save.c549
-rw-r--r--src/save_failed_screen.c6
-rw-r--r--src/start_menu.c18
-rw-r--r--src/strings.c8
-rw-r--r--src/trade.c19
26 files changed, 723 insertions, 640 deletions
diff --git a/common_syms/save.txt b/common_syms/save.txt
index 190a65840..131031d50 100644
--- a/common_syms/save.txt
+++ b/common_syms/save.txt
@@ -3,11 +3,11 @@ gLastSaveCounter
gLastKnownGoodSector
gDamagedSaveSectors
gSaveCounter
-gFastSaveSection
-gUnknown_03006208
+gReadWriteSector
+gIncrementalSectorId
gSaveUnusedVar
gSaveFileStatus
gGameContinueCallback
-gRamSaveSectionLocations
+gRamSaveSectorLocations
gSaveUnusedVar2
gSaveAttemptStatus
diff --git a/include/constants/battle.h b/include/constants/battle.h
index 2534ade4b..d87a800e2 100644
--- a/include/constants/battle.h
+++ b/include/constants/battle.h
@@ -358,4 +358,7 @@
// Flag for BattlePutTextOnWindow. Never set
#define B_WIN_COPYTOVRAM (1 << 7)
+// Indicator for the party summary bar to display an empty slot.
+#define HP_EMPTY_SLOT 0xFFFF
+
#endif // GUARD_CONSTANTS_BATTLE_H
diff --git a/include/load_save.h b/include/load_save.h
index 2f4a9ace6..14a979b45 100644
--- a/include/load_save.h
+++ b/include/load_save.h
@@ -24,8 +24,8 @@ void SavePlayerParty(void);
void LoadPlayerParty(void);
void SaveObjectEvents(void);
void LoadObjectEvents(void);
-void SaveSerializedGame(void);
-void LoadSerializedGame(void);
+void CopyPartyAndObjectsToSave(void);
+void CopyPartyAndObjectsFromSave(void);
void LoadPlayerBag(void);
void SavePlayerBag(void);
void ApplyNewEncryptionKeyToHword(u16 *hWord, u32 newKey);
diff --git a/include/palette.h b/include/palette.h
index be2a0dd48..81a1e1cae 100644
--- a/include/palette.h
+++ b/include/palette.h
@@ -58,15 +58,9 @@ void FillPalette(u16, u16, u16);
void TransferPlttBuffer(void);
u8 UpdatePaletteFade(void);
void ResetPaletteFade(void);
-void ReadPlttIntoBuffers(void);
bool8 BeginNormalPaletteFade(u32, s8, u8, u8, u16);
-bool8 unref_sub_8073D3C(u32, u8, u8, u8, u16);
-void unref_sub_8073D84(u8, u32 *);
-void ResetPaletteStructByUid(u16);
-void ResetPaletteStruct(u8);
+void PaletteStruct_ResetById(u16);
void ResetPaletteFadeControl(void);
-void unref_sub_8074168(u16);
-void unref_sub_8074194(u16);
void InvertPlttBuffer(u32);
void TintPlttBuffer(u32, s8, s8, s8);
void UnfadePlttBuffer(u32);
diff --git a/include/save.h b/include/save.h
index 406e2e492..be7961136 100644
--- a/include/save.h
+++ b/include/save.h
@@ -1,43 +1,43 @@
#ifndef GUARD_SAVE_H
#define GUARD_SAVE_H
-struct SaveSectionLocation
-{
- void *data;
- u16 size;
-};
-
-struct SaveSection
-{
- u8 data[0xFF4];
- u16 id;
- u16 checksum;
- u32 security;
- u32 counter;
-}; // size is 0x1000
-
-// headless save section?
-struct UnkSaveSection
-{
- u8 data[0xFF4];
- u32 security;
-}; // size is 0xFF8
-
-struct SaveSectionOffsets
-{
- u16 toAdd;
- u16 size;
-};
-
-// Each 4 KiB flash sector contains 3968 bytes of actual data followed by a 128 byte footer
+// Each 4 KiB flash sector contains 3968 bytes of actual data followed by a 128 byte footer.
+// Only 12 bytes of the footer are used.
#define SECTOR_DATA_SIZE 3968
#define SECTOR_FOOTER_SIZE 128
#define SECTOR_SIZE (SECTOR_DATA_SIZE + SECTOR_FOOTER_SIZE)
#define NUM_SAVE_SLOTS 2
-#define UNKNOWN_CHECK_VALUE 0x8012025
-#define SPECIAL_SECTION_SENTINEL 0xB39D
+// If the sector's security field is not this value then the sector is either invalid or empty.
+#define SECTOR_SECURITY_NUM 0x8012025
+
+#define SPECIAL_SECTOR_SENTINEL 0xB39D
+
+#define SECTOR_ID_SAVEBLOCK2 0
+#define SECTOR_ID_SAVEBLOCK1_START 1
+#define SECTOR_ID_SAVEBLOCK1_END 4
+#define SECTOR_ID_PKMN_STORAGE_START 5
+#define SECTOR_ID_PKMN_STORAGE_END 13
+#define NUM_SECTORS_PER_SLOT 14
+// Save Slot 1: 0-13; Save Slot 2: 14-27
+#define SECTOR_ID_HOF_1 28
+#define SECTOR_ID_HOF_2 29
+#define SECTOR_ID_TRAINER_HILL 30
+#define SECTOR_ID_RECORDED_BATTLE 31
+#define SECTORS_COUNT 32
+
+#define NUM_HOF_SECTORS 2
+
+#define SAVE_STATUS_EMPTY 0
+#define SAVE_STATUS_OK 1
+#define SAVE_STATUS_CORRUPT 2
+#define SAVE_STATUS_NO_FLASH 4
+#define SAVE_STATUS_ERROR 0xFF
+
+// Special sector id value for certain save functions to
+// indicate that no specific sector should be used.
+#define FULL_SAVE_SLOT 0xFFFF
// SetDamagedSectorBits states
enum
@@ -51,7 +51,7 @@ enum
enum
{
SAVE_NORMAL,
- SAVE_LINK,
+ SAVE_LINK, // Link / Battle Frontier
//EREADER_SAVE, // deprecated in Emerald
SAVE_LINK2, // unknown 2nd link save
SAVE_HALL_OF_FAME,
@@ -59,54 +59,55 @@ enum
SAVE_HALL_OF_FAME_ERASE_BEFORE // unused
};
-#define SECTOR_ID_SAVEBLOCK2 0
-#define SECTOR_ID_SAVEBLOCK1_START 1
-#define SECTOR_ID_SAVEBLOCK1_END 4
-#define SECTOR_ID_PKMN_STORAGE_START 5
-#define SECTOR_ID_PKMN_STORAGE_END 13
-#define NUM_SECTORS_PER_SLOT 14
-// Save Slot 1: 0-13; Save Slot 2: 14-27
-#define SECTOR_ID_HOF_1 28
-#define SECTOR_ID_HOF_2 29
-#define SECTOR_ID_TRAINER_HILL 30
-#define SECTOR_ID_RECORDED_BATTLE 31
-#define SECTORS_COUNT 32
+// A save sector location holds a pointer to the data for a particular sector
+// and the size of that data. Size cannot be greater than SECTOR_DATA_SIZE.
+struct SaveSectorLocation
+{
+ void *data;
+ u16 size;
+};
-#define SAVE_STATUS_EMPTY 0
-#define SAVE_STATUS_OK 1
-#define SAVE_STATUS_CORRUPT 2
-#define SAVE_STATUS_NO_FLASH 4
-#define SAVE_STATUS_ERROR 0xFF
+struct SaveSector
+{
+ u8 data[SECTOR_DATA_SIZE];
+ u8 unused[SECTOR_FOOTER_SIZE - 12]; // Unused portion of the footer
+ u16 id;
+ u16 checksum;
+ u32 security;
+ u32 counter;
+}; // size is SECTOR_SIZE (0x1000)
+
+#define SECTOR_SECURITY_OFFSET offsetof(struct SaveSector, security)
+#define SECTOR_COUNTER_OFFSET offsetof(struct SaveSector, counter)
extern u16 gLastWrittenSector;
extern u32 gLastSaveCounter;
extern u16 gLastKnownGoodSector;
extern u32 gDamagedSaveSectors;
extern u32 gSaveCounter;
-extern struct SaveSection *gFastSaveSection;
-extern u16 gUnknown_03006208;
+extern struct SaveSector *gFastSaveSector;
+extern u16 gIncrementalSectorId;
extern u16 gSaveFileStatus;
extern void (*gGameContinueCallback)(void);
-extern struct SaveSectionLocation gRamSaveSectionLocations[];
-extern u16 gUnknown_03006294;
+extern struct SaveSectorLocation gRamSaveSectorLocations[];
-extern struct SaveSection gSaveDataBuffer;
+extern struct SaveSector gSaveDataBuffer;
void ClearSaveData(void);
void Save_ResetSaveCounters(void);
u8 HandleSavingData(u8 saveType);
u8 TrySavingData(u8 saveType);
-bool8 sub_8153380(void);
-bool8 sub_81533AC(void);
-bool8 sub_81533E0(void);
-bool8 sub_8153408(void);
-bool8 FullSaveGame(void);
-bool8 CheckSaveFile(void);
-u8 Save_LoadGameData(u8 saveType);
+bool8 LinkFullSave_Init(void);
+bool8 LinkFullSave_WriteSector(void);
+bool8 LinkFullSave_ReplaceLastSector(void);
+bool8 LinkFullSave_SetLastSectorSecurity(void);
+bool8 WriteSaveBlock2(void);
+bool8 WriteSaveBlock1Sector(void);
+u8 LoadGameSave(u8 saveType);
u16 GetSaveBlocksPointersBaseOffset(void);
-u32 TryReadSpecialSaveSection(u8 sector, u8* dst);
-u32 TryWriteSpecialSaveSection(u8 sector, u8* src);
-void Task_LinkSave(u8 taskId);
+u32 TryReadSpecialSaveSector(u8 sector, u8* dst);
+u32 TryWriteSpecialSaveSector(u8 sector, u8* src);
+void Task_LinkFullSave(u8 taskId);
// save_failed_screen.c
void DoSaveFailedScreen(u8 saveType);
diff --git a/include/strings.h b/include/strings.h
index 7317f8aac..845e96a8c 100644
--- a/include/strings.h
+++ b/include/strings.h
@@ -611,6 +611,10 @@ extern const u8 gText_PlayersBattleResults[];
extern const u8 gText_WinLoseDraw[];
extern const u8 gText_ColorTransparent[];
extern const u8 gText_Slash[];
+extern const u8 gText_HealthboxNickname[];
+extern const u8 gText_HealthboxGender_None[];
+extern const u8 gText_HealthboxGender_Male[];
+extern const u8 gText_HealthboxGender_Female[];
extern const u8 gText_99TimesPlus[];
extern const u8 gText_1MinutePlus[];
diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c
index d0ddfdd77..6471c67d5 100644
--- a/src/battle_anim_mons.c
+++ b/src/battle_anim_mons.c
@@ -665,9 +665,10 @@ void sub_80A6760(struct Sprite *sprite)
sprite->callback = sub_80A64D0;
}
-void sub_80A67A4(struct Sprite *sprite)
+// Unused
+static void EndUnkPaletteAnim(struct Sprite *sprite)
{
- ResetPaletteStructByUid(sprite->data[5]);
+ PaletteStruct_ResetById(sprite->data[5]);
DestroySpriteAndMatrix(sprite);
}
diff --git a/src/battle_interface.c b/src/battle_interface.c
index 94850ec57..96bab7f90 100644
--- a/src/battle_interface.c
+++ b/src/battle_interface.c
@@ -9,7 +9,6 @@
#include "string_util.h"
#include "text.h"
#include "sound.h"
-#include "constants/songs.h"
#include "decompress.h"
#include "task.h"
#include "util.h"
@@ -20,10 +19,12 @@
#include "international_string_util.h"
#include "safari_zone.h"
#include "battle_anim.h"
-#include "constants/battle_anim.h"
-#include "constants/rgb.h"
#include "data.h"
#include "pokemon_summary_screen.h"
+#include "strings.h"
+#include "constants/battle_anim.h"
+#include "constants/rgb.h"
+#include "constants/songs.h"
struct TestingBar
{
@@ -157,15 +158,6 @@ enum
HEALTHBOX_GFX_FRAME_END_BAR,
};
-// strings
-extern const u8 gText_Slash[];
-extern const u8 gText_HighlightDarkGray[];
-extern const u8 gText_DynColor2[];
-extern const u8 gText_DynColor2Male[];
-extern const u8 gText_DynColor1Female[];
-
-// this file's functions
-
static const u8 *GetHealthboxElementGfxPtr(u8 elementId);
static u8* AddTextPrinterAndCreateWindowOnHealthbox(const u8 *str, u32 x, u32 y, u32 bgColor, u32 *windowId);
@@ -178,27 +170,26 @@ static void SafariTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 wi
static void HpTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 windowWidth);
static void FillHealthboxObject(void *dest, u32 arg1, u32 arg2);
-static void sub_8073E08(u8 taskId);
-static void sub_8073F98(u8 taskId);
-static void sub_8073E64(u8 taskId);
+static void Task_HidePartyStatusSummary_BattleStart_1(u8 taskId);
+static void Task_HidePartyStatusSummary_BattleStart_2(u8 taskId);
+static void Task_HidePartyStatusSummary_DuringBattle(u8 taskId);
static void SpriteCB_HealthBoxOther(struct Sprite *sprite);
static void SpriteCB_HealthBar(struct Sprite *sprite);
-static void sub_8074158(struct Sprite *sprite);
-static void sub_8074090(struct Sprite *sprite);
-static void SpriteCB_StatusSummaryBar(struct Sprite *sprite);
-static void SpriteCB_StatusSummaryBallsOnBattleStart(struct Sprite *sprite);
-static void SpriteCB_StatusSummaryBallsOnSwitchout(struct Sprite *sprite);
+static void SpriteCB_StatusSummaryBar_Enter(struct Sprite *sprite);
+static void SpriteCB_StatusSummaryBar_Exit(struct Sprite *sprite);
+static void SpriteCB_StatusSummaryBalls_Enter(struct Sprite *sprite);
+static void SpriteCB_StatusSummaryBalls_Exit(struct Sprite *sprite);
+static void SpriteCB_StatusSummaryBalls_OnSwitchout(struct Sprite *sprite);
static u8 GetStatusIconForBattlerId(u8 statusElementId, u8 battlerId);
static s32 CalcNewBarValue(s32 maxValue, s32 currValue, s32 receivedValue, s32 *arg3, u8 arg4, u16 arg5);
static u8 GetScaledExpFraction(s32 currValue, s32 receivedValue, s32 maxValue, u8 scale);
static void MoveBattleBarGraphically(u8 battlerId, u8 whichBar);
static u8 CalcBarFilledPixels(s32 maxValue, s32 oldValue, s32 receivedValue, s32 *currValue, u8 *arg4, u8 scale);
-static void sub_8074F88(struct TestingBar *barInfo, s32 *arg1, u16 *arg2);
+static void Debug_TestHealthBar_Helper(struct TestingBar *barInfo, s32 *arg1, u16 *arg2);
-// const rom data
-static const struct OamData sUnknown_0832C138 =
+static const struct OamData sOamData_64x32 =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
@@ -220,7 +211,7 @@ static const struct SpriteTemplate sHealthboxPlayerSpriteTemplates[2] =
{
.tileTag = TAG_HEALTHBOX_PLAYER1_TILE,
.paletteTag = TAG_HEALTHBOX_PAL,
- .oam = &sUnknown_0832C138,
+ .oam = &sOamData_64x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -229,7 +220,7 @@ static const struct SpriteTemplate sHealthboxPlayerSpriteTemplates[2] =
{
.tileTag = TAG_HEALTHBOX_PLAYER2_TILE,
.paletteTag = TAG_HEALTHBOX_PAL,
- .oam = &sUnknown_0832C138,
+ .oam = &sOamData_64x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -242,7 +233,7 @@ static const struct SpriteTemplate sHealthboxOpponentSpriteTemplates[2] =
{
.tileTag = TAG_HEALTHBOX_OPPONENT1_TILE,
.paletteTag = TAG_HEALTHBOX_PAL,
- .oam = &sUnknown_0832C138,
+ .oam = &sOamData_64x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -251,7 +242,7 @@ static const struct SpriteTemplate sHealthboxOpponentSpriteTemplates[2] =
{
.tileTag = TAG_HEALTHBOX_OPPONENT2_TILE,
.paletteTag = TAG_HEALTHBOX_PAL,
- .oam = &sUnknown_0832C138,
+ .oam = &sOamData_64x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -263,7 +254,7 @@ static const struct SpriteTemplate sHealthboxSafariSpriteTemplate =
{
.tileTag = TAG_HEALTHBOX_SAFARI_TILE,
.paletteTag = TAG_HEALTHBOX_PAL,
- .oam = &sUnknown_0832C138,
+ .oam = &sOamData_64x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -327,7 +318,7 @@ static const struct SpriteTemplate sHealthbarSpriteTemplates[MAX_BATTLERS_COUNT]
}
};
-static const struct Subsprite sUnknown_0832C220[] =
+static const struct Subsprite sUnused_Subsprites_0[] =
{
{
.x = DISPLAY_WIDTH,
@@ -371,7 +362,7 @@ static const struct Subsprite sUnknown_0832C220[] =
}
};
-static const struct Subsprite sUnknown_0832C234[] =
+static const struct Subsprite sUnused_Subsprites_2[] =
{
{
.x = DISPLAY_WIDTH,
@@ -415,7 +406,7 @@ static const struct Subsprite sUnknown_0832C234[] =
}
};
-static const struct Subsprite sUnknown_0832C248[] =
+static const struct Subsprite sUnused_Subsprites_1[] =
{
{
.x = DISPLAY_WIDTH,
@@ -435,7 +426,7 @@ static const struct Subsprite sUnknown_0832C248[] =
}
};
-static const struct Subsprite sUnknown_0832C250[] =
+static const struct Subsprite sUnused_Subsprites_3[] =
{
{
.x = DISPLAY_WIDTH,
@@ -455,7 +446,7 @@ static const struct Subsprite sUnknown_0832C250[] =
}
};
-static const struct Subsprite sUnknown_0832C258[] =
+static const struct Subsprite sHealthBar_Subsprites_Player[] =
{
{
.x = DISPLAY_WIDTH,
@@ -475,7 +466,7 @@ static const struct Subsprite sUnknown_0832C258[] =
}
};
-static const struct Subsprite sUnknown_0832C260[] =
+static const struct Subsprite sHealthBar_Subsprites_Opponent[] =
{
{
.x = DISPLAY_WIDTH,
@@ -503,25 +494,24 @@ static const struct Subsprite sUnknown_0832C260[] =
}
};
-// unused subsprite table
-static const struct SubspriteTable sUnknown_0832C26C[] =
+static const struct SubspriteTable sUnused_SubspriteTable[] =
{
- {ARRAY_COUNT(sUnknown_0832C220), sUnknown_0832C220},
- {ARRAY_COUNT(sUnknown_0832C248), sUnknown_0832C248},
- {ARRAY_COUNT(sUnknown_0832C234), sUnknown_0832C234},
- {ARRAY_COUNT(sUnknown_0832C250), sUnknown_0832C250}
+ {ARRAY_COUNT(sUnused_Subsprites_0), sUnused_Subsprites_0},
+ {ARRAY_COUNT(sUnused_Subsprites_1), sUnused_Subsprites_1},
+ {ARRAY_COUNT(sUnused_Subsprites_2), sUnused_Subsprites_2},
+ {ARRAY_COUNT(sUnused_Subsprites_3), sUnused_Subsprites_3}
};
-static const struct SubspriteTable sUnknown_0832C28C[] =
+static const struct SubspriteTable sHealthBar_SubspriteTables[] =
{
- {ARRAY_COUNT(sUnknown_0832C258), sUnknown_0832C258},
- {ARRAY_COUNT(sUnknown_0832C260), sUnknown_0832C260}
+ [B_SIDE_PLAYER] = {ARRAY_COUNT(sHealthBar_Subsprites_Player), sHealthBar_Subsprites_Player},
+ [B_SIDE_OPPONENT] = {ARRAY_COUNT(sHealthBar_Subsprites_Opponent), sHealthBar_Subsprites_Opponent}
};
-static const struct Subsprite sStatusSummaryBar_Subsprites_0[] =
+static const struct Subsprite sStatusSummaryBar_Subsprites_Enter[] =
{
{
- .x = 160,
+ .x = 32 * 5,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
@@ -529,7 +519,7 @@ static const struct Subsprite sStatusSummaryBar_Subsprites_0[] =
.priority = 1
},
{
- .x = 192,
+ .x = 32 * 6,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
@@ -537,7 +527,7 @@ static const struct Subsprite sStatusSummaryBar_Subsprites_0[] =
.priority = 1
},
{
- .x = 224,
+ .x = 32 * 7,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
@@ -554,10 +544,10 @@ static const struct Subsprite sStatusSummaryBar_Subsprites_0[] =
}
};
-static const struct Subsprite sUnknown_0832C2AC[] =
+static const struct Subsprite sStatusSummaryBar_Subsprites_Exit[] =
{
{
- .x = 160,
+ .x = 32 * 5,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
@@ -565,7 +555,7 @@ static const struct Subsprite sUnknown_0832C2AC[] =
.priority = 1
},
{
- .x = 192,
+ .x = 32 * 6,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
@@ -573,7 +563,7 @@ static const struct Subsprite sUnknown_0832C2AC[] =
.priority = 1
},
{
- .x = 224,
+ .x = 32 * 7,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
@@ -581,7 +571,7 @@ static const struct Subsprite sUnknown_0832C2AC[] =
.priority = 1
},
{
- .x = 0,
+ .x = 32 * 0,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
@@ -589,7 +579,7 @@ static const struct Subsprite sUnknown_0832C2AC[] =
.priority = 1
},
{
- .x = 32,
+ .x = 32 * 1,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
@@ -597,7 +587,7 @@ static const struct Subsprite sUnknown_0832C2AC[] =
.priority = 1
},
{
- .x = 64,
+ .x = 32 * 2,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
@@ -606,14 +596,14 @@ static const struct Subsprite sUnknown_0832C2AC[] =
}
};
-static const struct SubspriteTable sStatusSummaryBar_SubspriteTable[] =
+static const struct SubspriteTable sStatusSummaryBar_SubspriteTable_Enter[] =
{
- {ARRAY_COUNT(sStatusSummaryBar_Subsprites_0), sStatusSummaryBar_Subsprites_0}
+ {ARRAY_COUNT(sStatusSummaryBar_Subsprites_Enter), sStatusSummaryBar_Subsprites_Enter}
};
-static const struct SubspriteTable sUnknown_0832C2CC[] =
+static const struct SubspriteTable sStatusSummaryBar_SubspriteTable_Exit[] =
{
- {ARRAY_COUNT(sUnknown_0832C2AC), sUnknown_0832C2AC}
+ {ARRAY_COUNT(sStatusSummaryBar_Subsprites_Exit), sStatusSummaryBar_Subsprites_Exit}
};
// unused unknown image
@@ -676,23 +666,23 @@ static const struct OamData sOamData_StatusSummaryBalls =
static const struct SpriteTemplate sStatusSummaryBarSpriteTemplates[2] =
{
- {
+ { // Player
.tileTag = TAG_STATUS_SUMMARY_BAR_TILE,
.paletteTag = TAG_STATUS_SUMMARY_BAR_PAL,
- .oam = &sUnknown_0832C138,
+ .oam = &sOamData_64x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCB_StatusSummaryBar
+ .callback = SpriteCB_StatusSummaryBar_Enter
},
- {
+ { // Opponent
.tileTag = TAG_STATUS_SUMMARY_BAR_TILE,
.paletteTag = TAG_STATUS_SUMMARY_BAR_PAL,
- .oam = &sUnknown_0832C138,
+ .oam = &sOamData_64x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCB_StatusSummaryBar
+ .callback = SpriteCB_StatusSummaryBar_Enter
}
};
@@ -705,7 +695,7 @@ static const struct SpriteTemplate sStatusSummaryBallsSpriteTemplates[2] =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCB_StatusSummaryBallsOnBattleStart
+ .callback = SpriteCB_StatusSummaryBalls_Enter
},
{
.tileTag = TAG_STATUS_SUMMARY_BALLS_TILE,
@@ -714,7 +704,7 @@ static const struct SpriteTemplate sStatusSummaryBallsSpriteTemplates[2] =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCB_StatusSummaryBallsOnBattleStart
+ .callback = SpriteCB_StatusSummaryBalls_Enter
}
};
@@ -739,23 +729,28 @@ static const u16 sStatusIconColors[] =
[PAL_STATUS_BRN] = RGB(28, 14, 10),
};
-static const struct WindowTemplate sHealthboxWindowTemplate = {0, 0, 0, 8, 2, 0, 0}; // width = 8, height = 2
-
-// code
+static const struct WindowTemplate sHealthboxWindowTemplate = {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 0,
+ .width = 8,
+ .height = 2,
+ .paletteNum = 0,
+ .baseBlock = 0
+};
static s32 DummiedOutFunction(s16 unused1, s16 unused2, s32 unused3)
{
return 9;
}
-void sub_8072308(s16 number, u16 *dest, bool8 unk)
+
+static void Debug_DrawNumber(s16 number, u16 *dest, bool8 unk)
{
s8 i, j;
u8 buff[4];
for (i = 0; i < 4; i++)
- {
buff[i] = 0;
- }
for (i = 3; ; i--)
{
@@ -767,9 +762,8 @@ void sub_8072308(s16 number, u16 *dest, bool8 unk)
else
{
for (; i > -1; i--)
- {
buff[i] = 0xFF;
- }
+
if (buff[3] == 0xFF)
buff[3] = 0;
break;
@@ -819,12 +813,12 @@ void sub_8072308(s16 number, u16 *dest, bool8 unk)
}
}
-
-void sub_80724A8(s16 arg0, s16 arg1, u16 *arg2)
+// Unused
+static void Debug_DrawNumberPair(s16 number1, s16 number2, u16 *arg2)
{
arg2[4] = 0x1E;
- sub_8072308(arg1, arg2, 0);
- sub_8072308(arg0, arg2 + 5, 1);
+ Debug_DrawNumber(number2, arg2, 0);
+ Debug_DrawNumber(number1, arg2 + 5, 1);
}
// Because the healthbox is too large to fit into one sprite, it is divided into two sprites.
@@ -910,7 +904,7 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId)
healthbarSpriteId = CreateSpriteAtEnd(&sHealthbarSpriteTemplates[gBattlerPositions[battlerId]], 140, 60, 0);
healthBarSpritePtr = &gSprites[healthbarSpriteId];
- SetSubspriteTables(healthBarSpritePtr, &sUnknown_0832C28C[GetBattlerSide(battlerId)]);
+ SetSubspriteTables(healthBarSpritePtr, &sHealthBar_SubspriteTables[GetBattlerSide(battlerId)]);
healthBarSpritePtr->subspriteMode = SUBSPRITES_IGNORE_PRIORITY;
healthBarSpritePtr->oam.priority = 1;
@@ -1299,7 +1293,7 @@ static void PrintSafariMonInfo(u8 healthboxSpriteId, struct Pokemon *mon)
barFontGfx = &gMonSpritesGfxPtr->barFontGfx[0x520 + (GetBattlerPosition(gSprites[healthboxSpriteId].hMain_Battler) * 384)];
var = 5;
nature = GetNature(mon);
- StringCopy(text + 6, gNatureNamePointers[nature]);
+ StringCopy(&text[6], gNatureNamePointers[nature]);
RenderTextHandleBold(barFontGfx, FONT_BOLD, text);
for (j = 6, i = 0; i < var; i++, j++)
@@ -1328,8 +1322,8 @@ static void PrintSafariMonInfo(u8 healthboxSpriteId, struct Pokemon *mon)
}
healthBarSpriteId = gSprites[healthboxSpriteId].hMain_HealthBarSpriteId;
- ConvertIntToDecimalStringN(text + 6, gBattleStruct->safariCatchFactor, STR_CONV_MODE_RIGHT_ALIGN, 2);
- ConvertIntToDecimalStringN(text + 9, gBattleStruct->safariEscapeFactor, STR_CONV_MODE_RIGHT_ALIGN, 2);
+ ConvertIntToDecimalStringN(&text[6], gBattleStruct->safariCatchFactor, STR_CONV_MODE_RIGHT_ALIGN, 2);
+ ConvertIntToDecimalStringN(&text[9], gBattleStruct->safariEscapeFactor, STR_CONV_MODE_RIGHT_ALIGN, 2);
text[5] = CHAR_SPACE;
text[8] = CHAR_SLASH;
RenderTextHandleBold(gMonSpritesGfxPtr->barFontGfx, FONT_BOLD, text);
@@ -1424,7 +1418,7 @@ void SwapHpBarsWithHpText(void)
#define tSummaryBarSpriteId data[1]
#define tBallIconSpriteId(n) data[3 + n]
#define tIsBattleStart data[10]
-#define tData15 data[15]
+#define tBlend data[15]
u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, u8 arg2, bool8 isBattleStart)
{
@@ -1471,7 +1465,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo,
LoadSpritePalette(&sStatusSummaryBallsSpritePal);
summaryBarSpriteId = CreateSprite(&sStatusSummaryBarSpriteTemplates[isOpponent], bar_X, bar_Y, 10);
- SetSubspriteTables(&gSprites[summaryBarSpriteId], sStatusSummaryBar_SubspriteTable);
+ SetSubspriteTables(&gSprites[summaryBarSpriteId], sStatusSummaryBar_SubspriteTable_Enter);
gSprites[summaryBarSpriteId].x2 = bar_pos2_X;
gSprites[summaryBarSpriteId].data[0] = bar_data0;
@@ -1490,7 +1484,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo,
ballIconSpritesIds[i] = CreateSpriteAtEnd(&sStatusSummaryBallsSpriteTemplates[isOpponent], bar_X, bar_Y - 4, 9);
if (!isBattleStart)
- gSprites[ballIconSpritesIds[i]].callback = SpriteCB_StatusSummaryBallsOnSwitchout;
+ gSprites[ballIconSpritesIds[i]].callback = SpriteCB_StatusSummaryBalls_OnSwitchout;
if (!isOpponent)
{
@@ -1522,42 +1516,49 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo,
{
for (i = 0; i < PARTY_SIZE; i++)
{
- if (partyInfo[i].hp == 0xFFFF) // empty slot or an egg
+ if (partyInfo[i].hp == HP_EMPTY_SLOT)
{
+ // empty slot or an egg
gSprites[ballIconSpritesIds[i]].oam.tileNum += 1;
gSprites[ballIconSpritesIds[i]].data[7] = 1;
}
- else if (partyInfo[i].hp == 0) // fainted mon
+ else if (partyInfo[i].hp == 0)
{
+ // fainted mon
gSprites[ballIconSpritesIds[i]].oam.tileNum += 3;
}
- else if (partyInfo[i].status != 0) // mon with major status
+ else if (partyInfo[i].status != 0)
{
+ // mon with major status
gSprites[ballIconSpritesIds[i]].oam.tileNum += 2;
}
}
}
else
{
- for (i = 0, var = 5, j = 0; j < PARTY_SIZE; j++)
+ for (i = 0, var = PARTY_SIZE - 1, j = 0; j < PARTY_SIZE; j++)
{
- if (partyInfo[j].hp == 0xFFFF) // empty slot or an egg
+ if (partyInfo[j].hp == HP_EMPTY_SLOT)
{
+ // empty slot or an egg
gSprites[ballIconSpritesIds[var]].oam.tileNum += 1;
gSprites[ballIconSpritesIds[var]].data[7] = 1;
var--;
continue;
}
- else if (partyInfo[j].hp == 0) // fainted mon
+ else if (partyInfo[j].hp == 0)
{
+ // fainted mon
gSprites[ballIconSpritesIds[i]].oam.tileNum += 3;
}
else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->arenaLostPlayerMons & gBitTable[j])
{
+ // fainted arena mon
gSprites[ballIconSpritesIds[i]].oam.tileNum += 3;
}
- else if (partyInfo[j].status != 0) // mon with major status
+ else if (partyInfo[j].status != 0)
{
+ // mon with primary status
gSprites[ballIconSpritesIds[i]].oam.tileNum += 2;
}
i++;
@@ -1568,19 +1569,22 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo,
{
if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS))
{
- for (var = 5, i = 0; i < PARTY_SIZE; i++)
+ for (var = PARTY_SIZE - 1, i = 0; i < PARTY_SIZE; i++)
{
- if (partyInfo[i].hp == 0xFFFF) // empty slot or an egg
+ if (partyInfo[i].hp == HP_EMPTY_SLOT)
{
+ // empty slot or an egg
gSprites[ballIconSpritesIds[var]].oam.tileNum += 1;
gSprites[ballIconSpritesIds[var]].data[7] = 1;
}
- else if (partyInfo[i].hp == 0) // fainted mon
+ else if (partyInfo[i].hp == 0)
{
+ // fainted mon
gSprites[ballIconSpritesIds[var]].oam.tileNum += 3;
}
- else if (partyInfo[i].status != 0) // mon with major status
+ else if (partyInfo[i].status != 0)
{
+ // mon with primary status
gSprites[ballIconSpritesIds[var]].oam.tileNum += 2;
}
var--;
@@ -1590,24 +1594,28 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo,
{
for (var = 0, i = 0, j = 0; j < PARTY_SIZE; j++)
{
- if (partyInfo[j].hp == 0xFFFF) // empty slot or an egg
+ if (partyInfo[j].hp == HP_EMPTY_SLOT)
{
+ // empty slot or an egg
gSprites[ballIconSpritesIds[i]].oam.tileNum += 1;
gSprites[ballIconSpritesIds[i]].data[7] = 1;
i++;
continue;
}
- else if (partyInfo[j].hp == 0) // fainted mon
+ else if (partyInfo[j].hp == 0)
{
- gSprites[ballIconSpritesIds[5 - var]].oam.tileNum += 3;
+ // fainted mon
+ gSprites[ballIconSpritesIds[PARTY_SIZE - 1 - var]].oam.tileNum += 3;
}
- else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->arenaLostOpponentMons & gBitTable[j]) // hmm...?
+ else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->arenaLostOpponentMons & gBitTable[j])
{
- gSprites[ballIconSpritesIds[5 - var]].oam.tileNum += 3;
+ // fainted arena mon
+ gSprites[ballIconSpritesIds[PARTY_SIZE - 1 - var]].oam.tileNum += 3;
}
- else if (partyInfo[j].status != 0) // mon with major status
+ else if (partyInfo[j].status != 0)
{
- gSprites[ballIconSpritesIds[5 - var]].oam.tileNum += 2;
+ // mon with primary status
+ gSprites[ballIconSpritesIds[PARTY_SIZE - 1 - var]].oam.tileNum += 2;
}
var++;
}
@@ -1632,6 +1640,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo,
return taskId;
}
+// Slide the party summary tray back offscreen
void Task_HidePartyStatusSummary(u8 taskId)
{
u8 ballIconSpriteIds[PARTY_SIZE];
@@ -1650,7 +1659,7 @@ void Task_HidePartyStatusSummary(u8 taskId)
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));
- gTasks[taskId].tData15 = 16;
+ gTasks[taskId].tBlend = 16;
for (i = 0; i < PARTY_SIZE; i++)
gSprites[ballIconSpriteIds[i]].oam.objMode = ST_OAM_OBJ_BLEND;
@@ -1663,51 +1672,51 @@ void Task_HidePartyStatusSummary(u8 taskId)
{
if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
{
- gSprites[ballIconSpriteIds[5 - i]].data[1] = 7 * i;
- gSprites[ballIconSpriteIds[5 - i]].data[3] = 0;
- gSprites[ballIconSpriteIds[5 - i]].data[4] = 0;
- gSprites[ballIconSpriteIds[5 - i]].callback = sub_8074158;
+ gSprites[ballIconSpriteIds[PARTY_SIZE - 1 - i]].data[1] = 7 * i;
+ gSprites[ballIconSpriteIds[PARTY_SIZE - 1 - i]].data[3] = 0;
+ gSprites[ballIconSpriteIds[PARTY_SIZE - 1 - i]].data[4] = 0;
+ gSprites[ballIconSpriteIds[PARTY_SIZE - 1 - i]].callback = SpriteCB_StatusSummaryBalls_Exit;
}
else
{
gSprites[ballIconSpriteIds[i]].data[1] = 7 * i;
gSprites[ballIconSpriteIds[i]].data[3] = 0;
gSprites[ballIconSpriteIds[i]].data[4] = 0;
- gSprites[ballIconSpriteIds[i]].callback = sub_8074158;
+ gSprites[ballIconSpriteIds[i]].callback = SpriteCB_StatusSummaryBalls_Exit;
}
}
gSprites[summaryBarSpriteId].data[0] /= 2;
gSprites[summaryBarSpriteId].data[1] = 0;
- gSprites[summaryBarSpriteId].callback = sub_8074090;
- SetSubspriteTables(&gSprites[summaryBarSpriteId], sUnknown_0832C2CC);
- gTasks[taskId].func = sub_8073E08;
+ gSprites[summaryBarSpriteId].callback = SpriteCB_StatusSummaryBar_Exit;
+ SetSubspriteTables(&gSprites[summaryBarSpriteId], sStatusSummaryBar_SubspriteTable_Exit);
+ gTasks[taskId].func = Task_HidePartyStatusSummary_BattleStart_1;
}
else
{
- gTasks[taskId].func = sub_8073F98;
+ gTasks[taskId].func = Task_HidePartyStatusSummary_DuringBattle;
}
}
-static void sub_8073E08(u8 taskId)
+static void Task_HidePartyStatusSummary_BattleStart_1(u8 taskId)
{
if ((gTasks[taskId].data[11]++ % 2) == 0)
{
- if (--gTasks[taskId].tData15 < 0)
+ if (--gTasks[taskId].tBlend < 0)
return;
- SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[15], 16 - gTasks[taskId].data[15]));
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].tBlend, 16 - gTasks[taskId].tBlend));
}
- if (gTasks[taskId].tData15 == 0)
- gTasks[taskId].func = sub_8073E64;
+ if (gTasks[taskId].tBlend == 0)
+ gTasks[taskId].func = Task_HidePartyStatusSummary_BattleStart_2;
}
-static void sub_8073E64(u8 taskId)
+static void Task_HidePartyStatusSummary_BattleStart_2(u8 taskId)
{
u8 ballIconSpriteIds[PARTY_SIZE];
s32 i;
u8 battlerId = gTasks[taskId].tBattler;
- if (--gTasks[taskId].tData15 == -1)
+ if (--gTasks[taskId].tBlend == -1)
{
u8 summaryBarSpriteId = gTasks[taskId].tSummaryBarSpriteId;
@@ -1731,7 +1740,7 @@ static void sub_8073E64(u8 taskId)
for (i = 1; i < PARTY_SIZE; i++)
DestroySprite(&gSprites[ballIconSpriteIds[i]]);
}
- else if (gTasks[taskId].tData15 == -3)
+ else if (gTasks[taskId].tBlend == -3)
{
gBattleSpritesDataPtr->healthBoxesData[battlerId].partyStatusSummaryShown = 0;
SetGpuReg(REG_OFFSET_BLDCNT, 0);
@@ -1740,17 +1749,17 @@ static void sub_8073E64(u8 taskId)
}
}
-static void sub_8073F98(u8 taskId)
+static void Task_HidePartyStatusSummary_DuringBattle(u8 taskId)
{
u8 ballIconSpriteIds[PARTY_SIZE];
s32 i;
u8 battlerId = gTasks[taskId].tBattler;
- if (--gTasks[taskId].tData15 >= 0)
+ if (--gTasks[taskId].tBlend >= 0)
{
- SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[15], 16 - gTasks[taskId].data[15]));
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].tBlend, 16 - gTasks[taskId].tBlend));
}
- else if (gTasks[taskId].tData15 == -1)
+ else if (gTasks[taskId].tBlend == -1)
{
u8 summaryBarSpriteId = gTasks[taskId].tSummaryBarSpriteId;
@@ -1763,7 +1772,7 @@ static void sub_8073F98(u8 taskId)
for (i = 1; i < PARTY_SIZE; i++)
DestroySprite(&gSprites[ballIconSpriteIds[i]]);
}
- else if (gTasks[taskId].tData15 == -3)
+ else if (gTasks[taskId].tBlend == -3)
{
gBattleSpritesDataPtr->healthBoxesData[battlerId].partyStatusSummaryShown = 0;
SetGpuReg(REG_OFFSET_BLDCNT, 0);
@@ -1776,15 +1785,15 @@ static void sub_8073F98(u8 taskId)
#undef tSummaryBarSpriteId
#undef tBallIconSpriteId
#undef tIsBattleStart
-#undef tData15
+#undef tBlend
-static void SpriteCB_StatusSummaryBar(struct Sprite *sprite)
+static void SpriteCB_StatusSummaryBar_Enter(struct Sprite *sprite)
{
if (sprite->x2 != 0)
sprite->x2 += sprite->data[0];
}
-static void sub_8074090(struct Sprite *sprite)
+static void SpriteCB_StatusSummaryBar_Exit(struct Sprite *sprite)
{
sprite->data[1] += 32;
if (sprite->data[0] > 0)
@@ -1794,7 +1803,7 @@ static void sub_8074090(struct Sprite *sprite)
sprite->data[1] &= 0xF;
}
-static void SpriteCB_StatusSummaryBallsOnBattleStart(struct Sprite *sprite)
+static void SpriteCB_StatusSummaryBalls_Enter(struct Sprite *sprite)
{
u8 var1;
u16 var2;
@@ -1839,7 +1848,7 @@ static void SpriteCB_StatusSummaryBallsOnBattleStart(struct Sprite *sprite)
}
}
-static void sub_8074158(struct Sprite *sprite)
+static void SpriteCB_StatusSummaryBalls_Exit(struct Sprite *sprite)
{
u8 var1;
u16 var2;
@@ -1865,7 +1874,7 @@ static void sub_8074158(struct Sprite *sprite)
}
}
-static void SpriteCB_StatusSummaryBallsOnSwitchout(struct Sprite *sprite)
+static void SpriteCB_StatusSummaryBalls_OnSwitchout(struct Sprite *sprite)
{
u8 barSpriteId = sprite->data[0];
@@ -1882,7 +1891,7 @@ static void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon)
u16 species;
u8 gender;
- StringCopy(gDisplayedStringBattle, gText_HighlightDarkGray);
+ StringCopy(gDisplayedStringBattle, gText_HealthboxNickname);
GetMonData(mon, MON_DATA_NICKNAME, nickname);
StringGetEnd10(nickname);
ptr = StringAppend(gDisplayedStringBattle, nickname);
@@ -1898,15 +1907,15 @@ static void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon)
switch (gender)
{
default:
- StringCopy(ptr, gText_DynColor2);
+ StringCopy(ptr, gText_HealthboxGender_None);
windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gDisplayedStringBattle, 0, 3, 2, &windowId);
break;
case MON_MALE:
- StringCopy(ptr, gText_DynColor2Male);
+ StringCopy(ptr, gText_HealthboxGender_Male);
windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gDisplayedStringBattle, 0, 3, 2, &windowId);
break;
case MON_FEMALE:
- StringCopy(ptr, gText_DynColor1Female);
+ StringCopy(ptr, gText_HealthboxGender_Female);
windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gDisplayedStringBattle, 0, 3, 2, &windowId);
break;
}
@@ -2422,8 +2431,9 @@ static u8 CalcBarFilledPixels(s32 maxValue, s32 oldValue, s32 receivedValue, s32
return filledPixels;
}
+// Unused
// These two functions seem as if they were made for testing the health bar.
-static s16 sub_8074F28(struct TestingBar *barInfo, s32 *currValue, u16 *arg2, s32 arg3)
+static s16 Debug_TestHealthBar(struct TestingBar *barInfo, s32 *currValue, u16 *arg2, s32 arg3)
{
s16 ret, var;
@@ -2431,7 +2441,7 @@ static s16 sub_8074F28(struct TestingBar *barInfo, s32 *currValue, u16 *arg2, s3
barInfo->oldValue,
barInfo->receivedValue,
currValue, B_HEALTHBAR_PIXELS / 8, 1);
- sub_8074F88(barInfo, currValue, arg2);
+ Debug_TestHealthBar_Helper(barInfo, currValue, arg2);
if (barInfo->maxValue < B_HEALTHBAR_PIXELS)
var = *currValue >> 8;
@@ -2443,7 +2453,7 @@ static s16 sub_8074F28(struct TestingBar *barInfo, s32 *currValue, u16 *arg2, s3
return ret;
}
-static void sub_8074F88(struct TestingBar *barInfo, s32 *currValue, u16 *arg2)
+static void Debug_TestHealthBar_Helper(struct TestingBar *barInfo, s32 *currValue, u16 *arg2)
{
u8 sp8[6];
u16 sp10[6];
diff --git a/src/battle_main.c b/src/battle_main.c
index 8079546d4..2d2afed71 100644
--- a/src/battle_main.c
+++ b/src/battle_main.c
@@ -3492,7 +3492,7 @@ static void BattleIntroDrawPartySummaryScreens(void)
if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_NONE
|| GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG)
{
- hpStatus[i].hp = 0xFFFF;
+ hpStatus[i].hp = HP_EMPTY_SLOT;
hpStatus[i].status = 0;
}
else
@@ -3510,7 +3510,7 @@ static void BattleIntroDrawPartySummaryScreens(void)
if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_NONE
|| GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG)
{
- hpStatus[i].hp = 0xFFFF;
+ hpStatus[i].hp = HP_EMPTY_SLOT;
hpStatus[i].status = 0;
}
else
@@ -3536,7 +3536,7 @@ static void BattleIntroDrawPartySummaryScreens(void)
if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_NONE
|| GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG)
{
- hpStatus[i].hp = 0xFFFF;
+ hpStatus[i].hp = HP_EMPTY_SLOT;
hpStatus[i].status = 0;
}
else
diff --git a/src/berry_blender.c b/src/berry_blender.c
index 7d22eae77..27ea641ce 100644
--- a/src/berry_blender.c
+++ b/src/berry_blender.c
@@ -2785,7 +2785,7 @@ static bool8 LinkPlayAgainHandleSaving(void)
}
break;
case 2:
- FullSaveGame();
+ WriteSaveBlock2();
sBerryBlender->linkPlayAgainState++;
sBerryBlender->framesToWait = 0;
break;
@@ -2799,7 +2799,7 @@ static bool8 LinkPlayAgainHandleSaving(void)
case 4:
if (IsLinkTaskFinished())
{
- if (CheckSaveFile())
+ if (WriteSaveBlock1Sector())
{
sBerryBlender->linkPlayAgainState = 5;
}
diff --git a/src/berry_crush.c b/src/berry_crush.c
index 6f432a3f9..9b8323e2d 100755
--- a/src/berry_crush.c
+++ b/src/berry_crush.c
@@ -3244,10 +3244,10 @@ static u32 Cmd_SaveGame(struct BerryCrushGame *game, u8 *args)
DrawDialogueFrame(0, 0);
AddTextPrinterParameterized2(0, FONT_NORMAL, gText_SavingDontTurnOffPower, 0, 0, 2, 1, 3);
CopyWindowToVram(0, COPYWIN_FULL);
- CreateTask(Task_LinkSave, 0);
+ CreateTask(Task_LinkFullSave, 0);
break;
case 3:
- if (FuncIsActiveTask(Task_LinkSave))
+ if (FuncIsActiveTask(Task_LinkFullSave))
return 0;
break;
case 4:
diff --git a/src/dodrio_berry_picking.c b/src/dodrio_berry_picking.c
index b94678174..691ca6b2a 100644
--- a/src/dodrio_berry_picking.c
+++ b/src/dodrio_berry_picking.c
@@ -5035,12 +5035,12 @@ static void Msg_SavingDontTurnOff(void)
case 2:
if (!IsDma3ManagerBusyWithBgCopy())
{
- CreateTask(Task_LinkSave, 0);
+ CreateTask(Task_LinkFullSave, 0);
sGfx->state++;
}
break;
case 3:
- if (!FuncIsActiveTask(Task_LinkSave))
+ if (!FuncIsActiveTask(Task_LinkFullSave))
sGfx->state++;
break;
default:
diff --git a/src/ereader_helpers.c b/src/ereader_helpers.c
index 9a93707d8..0de87602e 100755
--- a/src/ereader_helpers.c
+++ b/src/ereader_helpers.c
@@ -481,7 +481,7 @@ static bool32 TryWriteTrainerHill_Internal(struct EReaderTrainerHillSet * hillSe
}
hillTag->checksum = CalcByteArraySum((u8 *)hillTag->floors, NUM_TRAINER_HILL_FLOORS * sizeof(struct TrHillFloor));
- if (TryWriteSpecialSaveSection(SECTOR_ID_TRAINER_HILL, (u8 *)hillTag) != SAVE_STATUS_OK)
+ if (TryWriteSpecialSaveSector(SECTOR_ID_TRAINER_HILL, (u8 *)hillTag) != SAVE_STATUS_OK)
return FALSE;
return TRUE;
@@ -497,7 +497,7 @@ bool32 TryWriteTrainerHill(struct EReaderTrainerHillSet * hillSet)
static bool32 TryReadTrainerHill_Internal(struct EReaderTrainerHillSet * dest, u8 * buffer)
{
- if (TryReadSpecialSaveSection(SECTOR_ID_TRAINER_HILL, buffer) != SAVE_STATUS_OK)
+ if (TryReadSpecialSaveSector(SECTOR_ID_TRAINER_HILL, buffer) != SAVE_STATUS_OK)
return FALSE;
memcpy(dest, buffer, sizeof(struct EReaderTrainerHillSet));
diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c
index 94334052c..d134f2265 100644
--- a/src/hall_of_fame.c
+++ b/src/hall_of_fame.c
@@ -486,12 +486,12 @@ static void Task_Hof_InitTeamSaveData(u8 taskId)
if (!gHasHallOfFameRecords)
{
- memset(gDecompressionBuffer, 0, 0x2000);
+ memset(gDecompressionBuffer, 0, SECTOR_SIZE * NUM_HOF_SECTORS);
}
else
{
- if (Save_LoadGameData(SAVE_HALL_OF_FAME) != SAVE_STATUS_OK)
- memset(gDecompressionBuffer, 0, 0x2000);
+ if (LoadGameSave(SAVE_HALL_OF_FAME) != SAVE_STATUS_OK)
+ memset(gDecompressionBuffer, 0, SECTOR_SIZE * NUM_HOF_SECTORS);
}
for (i = 0; i < HALL_OF_FAME_MAX_TEAMS; i++, lastSavedTeam++)
@@ -852,7 +852,7 @@ void CB2_DoHallOfFamePC(void)
gTasks[taskId].tMonSpriteId(i) = SPRITE_NONE;
}
- sHofMonPtr = AllocZeroed(0x2000);
+ sHofMonPtr = AllocZeroed(SECTOR_SIZE * NUM_HOF_SECTORS);
SetMainCallback2(CB2_HallOfFame);
}
break;
@@ -862,7 +862,7 @@ void CB2_DoHallOfFamePC(void)
static void Task_HofPC_CopySaveData(u8 taskId)
{
HofPCTopBar_AddWindow(0, 30, 0, 12, 0x226);
- if (Save_LoadGameData(SAVE_HALL_OF_FAME) != SAVE_STATUS_OK)
+ if (LoadGameSave(SAVE_HALL_OF_FAME) != SAVE_STATUS_OK)
{
gTasks[taskId].func = Task_HofPC_PrintDataIsCorrupted;
}
@@ -871,7 +871,7 @@ static void Task_HofPC_CopySaveData(u8 taskId)
u16 i;
struct HallofFameTeam* savedTeams;
- CpuCopy16(gDecompressionBuffer, sHofMonPtr, 0x2000);
+ CpuCopy16(gDecompressionBuffer, sHofMonPtr, SECTOR_SIZE * NUM_HOF_SECTORS);
savedTeams = sHofMonPtr;
for (i = 0; i < HALL_OF_FAME_MAX_TEAMS; i++, savedTeams++)
{
diff --git a/src/intro.c b/src/intro.c
index 3e805dca4..418e143cf 100644
--- a/src/intro.c
+++ b/src/intro.c
@@ -1145,7 +1145,7 @@ void CB2_InitCopyrightScreenAfterBootup(void)
SetSaveBlocksPointers(GetSaveBlocksPointersBaseOffset());
ResetMenuAndMonGlobals();
Save_ResetSaveCounters();
- Save_LoadGameData(SAVE_NORMAL);
+ LoadGameSave(SAVE_NORMAL);
if (gSaveFileStatus == SAVE_STATUS_EMPTY || gSaveFileStatus == SAVE_STATUS_CORRUPT)
Sav2_ClearSetDefault();
SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound);
diff --git a/src/load_save.c b/src/load_save.c
index 1ba5a1600..4e788859c 100644
--- a/src/load_save.c
+++ b/src/load_save.c
@@ -198,13 +198,13 @@ void LoadObjectEvents(void)
gObjectEvents[i] = gSaveBlock1Ptr->objectEvents[i];
}
-void SaveSerializedGame(void)
+void CopyPartyAndObjectsToSave(void)
{
SavePlayerParty();
SaveObjectEvents();
}
-void LoadSerializedGame(void)
+void CopyPartyAndObjectsFromSave(void)
{
LoadPlayerParty();
LoadObjectEvents();
diff --git a/src/palette.c b/src/palette.c
index e106ce685..9fec449bc 100644
--- a/src/palette.c
+++ b/src/palette.c
@@ -16,36 +16,38 @@ enum
// These are structs for some unused palette system.
// The full functionality of this system is unknown.
+#define NUM_PALETTE_STRUCTS 16
+
struct PaletteStructTemplate
{
- u16 uid;
+ u16 id;
u16 *src;
- u16 pst_field_8_0:1;
- u16 pst_field_8_1:9;
+ bool16 pst_field_8_0:1;
+ u16 unused:9;
u16 size:5;
- u16 pst_field_9_7:1;
- u8 pst_field_A;
+ u8 time1;
u8 srcCount:5;
- u8 pst_field_B_5:3;
- u8 pst_field_C;
+ u8 state:3;
+ u8 time2;
};
struct PaletteStruct
{
- const struct PaletteStructTemplate *base;
- u32 ps_field_4_0:1;
- u16 ps_field_4_1:1;
+ const struct PaletteStructTemplate *template;
+ bool32 active:1;
+ bool32 flag:1;
u32 baseDestOffset:9;
- u16 destOffset:10;
- u16 srcIndex:7;
- u8 ps_field_8;
- u8 ps_field_9;
+ u32 destOffset:10;
+ u32 srcIndex:7;
+ u8 countdown1;
+ u8 countdown2;
};
-static void unused_sub_80A1CDC(struct PaletteStruct *, u32 *);
-static void unused_sub_80A1E40(struct PaletteStruct *, u32 *);
-static void unused_sub_80A1F00(struct PaletteStruct *);
-static u8 GetPaletteNumByUid(u16);
+static void PaletteStruct_Copy(struct PaletteStruct *, u32 *);
+static void PaletteStruct_Blend(struct PaletteStruct *, u32 *);
+static void PaletteStruct_TryEnd(struct PaletteStruct *);
+static void PaletteStruct_Reset(u8);
+static u8 PaletteStruct_GetPalNum(u16);
static u8 UpdateNormalPaletteFade(void);
static void BeginFastPaletteFadeInternal(u8);
static u8 UpdateFastPaletteFade(void);
@@ -58,15 +60,15 @@ static void Task_BlendPalettesGradually(u8 taskId);
// unaligned word reads are issued in BlendPalette otherwise
ALIGNED(4) EWRAM_DATA u16 gPlttBufferUnfaded[PLTT_BUFFER_SIZE] = {0};
ALIGNED(4) EWRAM_DATA u16 gPlttBufferFaded[PLTT_BUFFER_SIZE] = {0};
-EWRAM_DATA struct PaletteStruct sPaletteStructs[0x10] = {0};
+EWRAM_DATA struct PaletteStruct sPaletteStructs[NUM_PALETTE_STRUCTS] = {0};
EWRAM_DATA struct PaletteFadeControl gPaletteFade = {0};
static EWRAM_DATA u32 sFiller = 0;
static EWRAM_DATA u32 sPlttBufferTransferPending = 0;
EWRAM_DATA u8 gPaletteDecompressionBuffer[PLTT_DECOMP_BUFFER_SIZE] = {0};
static const struct PaletteStructTemplate gDummyPaletteStructTemplate = {
- .uid = 0xFFFF,
- .pst_field_B_5 = 1
+ .id = 0xFFFF,
+ .state = 1
};
static const u8 sRoundedDownGrayscaleMap[] = {
@@ -82,20 +84,20 @@ static const u8 sRoundedDownGrayscaleMap[] = {
void LoadCompressedPalette(const u32 *src, u16 offset, u16 size)
{
LZDecompressWram(src, gPaletteDecompressionBuffer);
- CpuCopy16(gPaletteDecompressionBuffer, gPlttBufferUnfaded + offset, size);
- CpuCopy16(gPaletteDecompressionBuffer, gPlttBufferFaded + offset, size);
+ CpuCopy16(gPaletteDecompressionBuffer, &gPlttBufferUnfaded[offset], size);
+ CpuCopy16(gPaletteDecompressionBuffer, &gPlttBufferFaded[offset], size);
}
void LoadPalette(const void *src, u16 offset, u16 size)
{
- CpuCopy16(src, gPlttBufferUnfaded + offset, size);
- CpuCopy16(src, gPlttBufferFaded + offset, size);
+ CpuCopy16(src, &gPlttBufferUnfaded[offset], size);
+ CpuCopy16(src, &gPlttBufferFaded[offset], size);
}
void FillPalette(u16 value, u16 offset, u16 size)
{
- CpuFill16(value, gPlttBufferUnfaded + offset, size);
- CpuFill16(value, gPlttBufferFaded + offset, size);
+ CpuFill16(value, &gPlttBufferUnfaded[offset], size);
+ CpuFill16(value, &gPlttBufferFaded[offset], size);
}
void TransferPlttBuffer(void)
@@ -105,7 +107,7 @@ void TransferPlttBuffer(void)
void *src = gPlttBufferFaded;
void *dest = (void *)PLTT;
DmaCopy16(3, src, dest, PLTT_SIZE);
- sPlttBufferTransferPending = 0;
+ sPlttBufferTransferPending = FALSE;
if (gPaletteFade.mode == HARDWARE_FADE && gPaletteFade.active)
UpdateBlendRegisters();
}
@@ -135,13 +137,13 @@ void ResetPaletteFade(void)
{
u8 i;
- for (i = 0; i < 16; i++)
- ResetPaletteStruct(i);
+ for (i = 0; i < NUM_PALETTE_STRUCTS; i++)
+ PaletteStruct_Reset(i);
ResetPaletteFadeControl();
}
-void ReadPlttIntoBuffers(void)
+static void ReadPlttIntoBuffers(void)
{
u16 i;
u16 *pltt = (u16 *)PLTT;
@@ -178,7 +180,7 @@ bool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targe
gPaletteFade.y = startY;
gPaletteFade.targetY = targetY;
gPaletteFade.blendColor = color;
- gPaletteFade.active = 1;
+ gPaletteFade.active = TRUE;
gPaletteFade.mode = NORMAL_FADE;
if (startY < targetY)
@@ -189,9 +191,9 @@ bool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targe
UpdatePaletteFade();
temp = gPaletteFade.bufferTransferDisabled;
- gPaletteFade.bufferTransferDisabled = 0;
+ gPaletteFade.bufferTransferDisabled = FALSE;
CpuCopy32(gPlttBufferFaded, (void *)PLTT, PLTT_SIZE);
- sPlttBufferTransferPending = 0;
+ sPlttBufferTransferPending = FALSE;
if (gPaletteFade.mode == HARDWARE_FADE && gPaletteFade.active)
UpdateBlendRegisters();
gPaletteFade.bufferTransferDisabled = temp;
@@ -199,55 +201,55 @@ bool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targe
}
}
-bool8 unref_sub_80A1C1C(u32 a1, u8 a2, u8 a3, u8 a4, u16 a5)
+// Unused
+static bool8 BeginPlttFade(u32 selectedPalettes, u8 delay, u8 startY, u8 targetY, u16 blendColor)
{
ReadPlttIntoBuffers();
- return BeginNormalPaletteFade(a1, a2, a3, a4, a5);
+ return BeginNormalPaletteFade(selectedPalettes, delay, startY, targetY, blendColor);
}
-void unref_sub_80A1C64(u8 a1, u32 *a2)
+// Unused
+static void PaletteStruct_Run(u8 a1, u32 *unkFlags)
{
u8 i;
- for (i = 0; i < 16; i++)
+ for (i = 0; i < NUM_PALETTE_STRUCTS; i++)
{
struct PaletteStruct *palstruct = &sPaletteStructs[i];
- if (palstruct->ps_field_4_0)
+ if (palstruct->active)
{
- if (palstruct->base->pst_field_8_0 == a1)
+ if (palstruct->template->pst_field_8_0 == a1)
{
- u8 val1 = palstruct->srcIndex;
- u8 val2 = palstruct->base->srcCount;
- if (val1 == val2)
+ if (palstruct->srcIndex == palstruct->template->srcCount)
{
- unused_sub_80A1F00(palstruct);
- if (!palstruct->ps_field_4_0)
+ PaletteStruct_TryEnd(palstruct);
+ if (!palstruct->active)
continue;
}
- if (palstruct->ps_field_8 == 0)
- unused_sub_80A1CDC(palstruct, a2);
+ if (palstruct->countdown1 == 0)
+ PaletteStruct_Copy(palstruct, unkFlags);
else
- palstruct->ps_field_8--;
+ palstruct->countdown1--;
- unused_sub_80A1E40(palstruct, a2);
+ PaletteStruct_Blend(palstruct, unkFlags);
}
}
}
}
-static void unused_sub_80A1CDC(struct PaletteStruct *a1, u32 *a2)
+static void PaletteStruct_Copy(struct PaletteStruct *a1, u32 *unkFlags)
{
s32 srcIndex;
s32 srcCount;
u8 i = 0;
- u16 srcOffset = a1->srcIndex * a1->base->size;
+ u16 srcOffset = a1->srcIndex * a1->template->size;
- if (!a1->base->pst_field_8_0)
+ if (!a1->template->pst_field_8_0)
{
- while (i < a1->base->size)
+ while (i < a1->template->size)
{
- gPlttBufferUnfaded[a1->destOffset] = a1->base->src[srcOffset];
- gPlttBufferFaded[a1->destOffset] = a1->base->src[srcOffset];
+ gPlttBufferUnfaded[a1->destOffset] = a1->template->src[srcOffset];
+ gPlttBufferFaded[a1->destOffset] = a1->template->src[srcOffset];
i++;
a1->destOffset++;
srcOffset++;
@@ -255,9 +257,9 @@ static void unused_sub_80A1CDC(struct PaletteStruct *a1, u32 *a2)
}
else
{
- while (i < a1->base->size)
+ while (i < a1->template->size)
{
- gPlttBufferFaded[a1->destOffset] = a1->base->src[srcOffset];
+ gPlttBufferFaded[a1->destOffset] = a1->template->src[srcOffset];
i++;
a1->destOffset++;
srcOffset++;
@@ -265,33 +267,33 @@ static void unused_sub_80A1CDC(struct PaletteStruct *a1, u32 *a2)
}
a1->destOffset = a1->baseDestOffset;
- a1->ps_field_8 = a1->base->pst_field_A;
+ a1->countdown1 = a1->template->time1;
a1->srcIndex++;
srcIndex = a1->srcIndex;
- srcCount = a1->base->srcCount;
+ srcCount = a1->template->srcCount;
if (srcIndex >= srcCount)
{
- if (a1->ps_field_9)
- a1->ps_field_9--;
+ if (a1->countdown2)
+ a1->countdown2--;
a1->srcIndex = 0;
}
- *a2 |= 1 << (a1->baseDestOffset >> 4);
+ *unkFlags |= 1 << (a1->baseDestOffset >> 4);
}
-static void unused_sub_80A1E40(struct PaletteStruct *a1, u32 *a2)
+static void PaletteStruct_Blend(struct PaletteStruct *a1, u32 *unkFlags)
{
if (gPaletteFade.active && ((1 << (a1->baseDestOffset >> 4)) & gPaletteFade_selectedPalettes))
{
- if (!a1->base->pst_field_8_0)
+ if (!a1->template->pst_field_8_0)
{
if (gPaletteFade.delayCounter != gPaletteFade_delay)
{
BlendPalette(
a1->baseDestOffset,
- a1->base->size,
+ a1->template->size,
gPaletteFade.y,
gPaletteFade.blendColor);
}
@@ -300,64 +302,64 @@ static void unused_sub_80A1E40(struct PaletteStruct *a1, u32 *a2)
{
if (!gPaletteFade.delayCounter)
{
- if (a1->ps_field_8 != a1->base->pst_field_A)
+ if (a1->countdown1 != a1->template->time1)
{
- u32 srcOffset = a1->srcIndex * a1->base->size;
+ u32 srcOffset = a1->srcIndex * a1->template->size;
u8 i;
- for (i = 0; i < a1->base->size; i++)
- gPlttBufferFaded[a1->baseDestOffset + i] = a1->base->src[srcOffset + i];
+ for (i = 0; i < a1->template->size; i++)
+ gPlttBufferFaded[a1->baseDestOffset + i] = a1->template->src[srcOffset + i];
}
}
}
}
}
-static void unused_sub_80A1F00(struct PaletteStruct *a1)
+static void PaletteStruct_TryEnd(struct PaletteStruct *pal)
{
- if (!a1->ps_field_9)
+ if (pal->countdown2 == 0)
{
- s32 val = a1->base->pst_field_B_5;
+ s32 state = pal->template->state;
- if (!val)
+ if (state == 0)
{
- a1->srcIndex = 0;
- a1->ps_field_8 = a1->base->pst_field_A;
- a1->ps_field_9 = a1->base->pst_field_C;
- a1->destOffset = a1->baseDestOffset;
+ pal->srcIndex = 0;
+ pal->countdown1 = pal->template->time1;
+ pal->countdown2 = pal->template->time2;
+ pal->destOffset = pal->baseDestOffset;
}
else
{
- if (val < 0)
+ if (state < 0)
return;
- if (val > 2)
+ if (state > 2)
return;
- ResetPaletteStructByUid(a1->base->uid);
+ PaletteStruct_ResetById(pal->template->id);
}
}
else
{
- a1->ps_field_9--;
+ pal->countdown2--;
}
}
-void ResetPaletteStructByUid(u16 a1)
+void PaletteStruct_ResetById(u16 id)
{
- u8 paletteNum = GetPaletteNumByUid(a1);
- if (paletteNum != 16)
- ResetPaletteStruct(paletteNum);
+ u8 paletteNum = PaletteStruct_GetPalNum(id);
+ if (paletteNum != NUM_PALETTE_STRUCTS)
+ PaletteStruct_Reset(paletteNum);
}
-void ResetPaletteStruct(u8 paletteNum)
+static void PaletteStruct_Reset(u8 paletteNum)
{
- sPaletteStructs[paletteNum].base = &gDummyPaletteStructTemplate;
- sPaletteStructs[paletteNum].ps_field_4_0 = 0;
+ sPaletteStructs[paletteNum].template = &gDummyPaletteStructTemplate;
+ sPaletteStructs[paletteNum].active = FALSE;
sPaletteStructs[paletteNum].baseDestOffset = 0;
sPaletteStructs[paletteNum].destOffset = 0;
sPaletteStructs[paletteNum].srcIndex = 0;
- sPaletteStructs[paletteNum].ps_field_4_1 = 0;
- sPaletteStructs[paletteNum].ps_field_8 = 0;
- sPaletteStructs[paletteNum].ps_field_9 = 0;
+ sPaletteStructs[paletteNum].flag = 0;
+ sPaletteStructs[paletteNum].countdown1 = 0;
+ sPaletteStructs[paletteNum].countdown2 = 0;
}
void ResetPaletteFadeControl(void)
@@ -368,41 +370,41 @@ void ResetPaletteFadeControl(void)
gPaletteFade.y = 0;
gPaletteFade.targetY = 0;
gPaletteFade.blendColor = 0;
- gPaletteFade.active = 0;
+ gPaletteFade.active = FALSE;
gPaletteFade.multipurpose2 = 0; // assign same value twice
gPaletteFade.yDec = 0;
- gPaletteFade.bufferTransferDisabled = 0;
- gPaletteFade.shouldResetBlendRegisters = 0;
- gPaletteFade.hardwareFadeFinishing = 0;
- gPaletteFade.softwareFadeFinishing = 0;
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ gPaletteFade.shouldResetBlendRegisters = FALSE;
+ gPaletteFade.hardwareFadeFinishing = FALSE;
+ gPaletteFade.softwareFadeFinishing = FALSE;
gPaletteFade.softwareFadeFinishingCounter = 0;
gPaletteFade.objPaletteToggle = 0;
gPaletteFade.deltaY = 2;
}
-void unref_sub_80A2048(u16 uid)
+static void PaletteStruct_SetUnusedFlag(u16 id)
{
- u8 paletteNum = GetPaletteNumByUid(uid);
- if (paletteNum != 16)
- sPaletteStructs[paletteNum].ps_field_4_1 = 1;
+ u8 paletteNum = PaletteStruct_GetPalNum(id);
+ if (paletteNum != NUM_PALETTE_STRUCTS)
+ sPaletteStructs[paletteNum].flag = TRUE;
}
-void unref_sub_80A2074(u16 uid)
+static void PaletteStruct_ClearUnusedFlag(u16 id)
{
- u8 paletteNum = GetPaletteNumByUid(uid);
- if (paletteNum != 16)
- sPaletteStructs[paletteNum].ps_field_4_1 = 0;
+ u8 paletteNum = PaletteStruct_GetPalNum(id);
+ if (paletteNum != NUM_PALETTE_STRUCTS)
+ sPaletteStructs[paletteNum].flag = FALSE;
}
-static u8 GetPaletteNumByUid(u16 uid)
+static u8 PaletteStruct_GetPalNum(u16 id)
{
u8 i;
- for (i = 0; i < 16; i++)
- if (sPaletteStructs[i].base->uid == uid)
+ for (i = 0; i < NUM_PALETTE_STRUCTS; i++)
+ if (sPaletteStructs[i].template->id == id)
return i;
- return 16;
+ return NUM_PALETTE_STRUCTS;
}
static u8 UpdateNormalPaletteFade(void)
@@ -460,7 +462,7 @@ static u8 UpdateNormalPaletteFade(void)
if (gPaletteFade.y == gPaletteFade.targetY)
{
gPaletteFade_selectedPalettes = 0;
- gPaletteFade.softwareFadeFinishing = 1;
+ gPaletteFade.softwareFadeFinishing = TRUE;
}
else
{
@@ -557,7 +559,7 @@ static void BeginFastPaletteFadeInternal(u8 submode)
{
gPaletteFade.y = 31;
gPaletteFade_submode = submode & 0x3F;
- gPaletteFade.active = 1;
+ gPaletteFade.active = TRUE;
gPaletteFade.mode = FAST_FADE;
if (submode == FAST_FADE_IN_FROM_BLACK)
@@ -719,7 +721,7 @@ static u8 UpdateFastPaletteFade(void)
}
gPaletteFade.mode = NORMAL_FADE;
- gPaletteFade.softwareFadeFinishing = 1;
+ gPaletteFade.softwareFadeFinishing = TRUE;
}
// gPaletteFade.active cannot change since the last time it was checked. So this
@@ -734,10 +736,10 @@ void BeginHardwarePaletteFade(u8 blendCnt, u8 delay, u8 y, u8 targetY, u8 should
gPaletteFade_delay = delay;
gPaletteFade.y = y;
gPaletteFade.targetY = targetY;
- gPaletteFade.active = 1;
+ gPaletteFade.active = TRUE;
gPaletteFade.mode = HARDWARE_FADE;
gPaletteFade.shouldResetBlendRegisters = shouldResetBlendRegisters & 1;
- gPaletteFade.hardwareFadeFinishing = 0;
+ gPaletteFade.hardwareFadeFinishing = FALSE;
if (y < targetY)
gPaletteFade.yDec = 0;
@@ -784,7 +786,7 @@ static u8 UpdateHardwarePaletteFade(void)
gPaletteFade_blendCnt = 0;
gPaletteFade.y = 0;
}
- gPaletteFade.shouldResetBlendRegisters = 0;
+ gPaletteFade.shouldResetBlendRegisters = FALSE;
}
// gPaletteFade.active cannot change since the last time it was checked. So this
@@ -798,11 +800,11 @@ static void UpdateBlendRegisters(void)
SetGpuReg(REG_OFFSET_BLDY, gPaletteFade.y);
if (gPaletteFade.hardwareFadeFinishing)
{
- gPaletteFade.hardwareFadeFinishing = 0;
+ gPaletteFade.hardwareFadeFinishing = FALSE;
gPaletteFade.mode = 0;
gPaletteFade_blendCnt = 0;
gPaletteFade.y = 0;
- gPaletteFade.active = 0;
+ gPaletteFade.active = FALSE;
}
}
@@ -812,8 +814,8 @@ static bool8 IsSoftwarePaletteFadeFinishing(void)
{
if (gPaletteFade.softwareFadeFinishingCounter == 4)
{
- gPaletteFade.active = 0;
- gPaletteFade.softwareFadeFinishing = 0;
+ gPaletteFade.active = FALSE;
+ gPaletteFade.softwareFadeFinishing = FALSE;
gPaletteFade.softwareFadeFinishingCounter = 0;
}
else
@@ -950,7 +952,7 @@ void TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 b
#define tId data[8]
// Blend the selected palettes in a series of steps toward or away from the color.
-// Only used by the Groudon/Kyogre fight scene to flash the screen for lightning
+// Only used by the Groudon/Kyogre fight scene to flash the screen for lightning.
// One call is used to fade the bg from white, while another fades the duo from black
void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id)
{
@@ -987,8 +989,8 @@ static bool32 IsBlendPalettesGraduallyTaskActive(u8 id)
for (i = 0; i < NUM_TASKS; i++)
if ((gTasks[i].isActive == TRUE)
- && (gTasks[i].func == Task_BlendPalettesGradually)
- && (gTasks[i].tId == id))
+ && (gTasks[i].func == Task_BlendPalettesGradually)
+ && (gTasks[i].tId == id))
return TRUE;
return FALSE;
diff --git a/src/pokemon_jump.c b/src/pokemon_jump.c
index 85acb2fee..f6aa82391 100755
--- a/src/pokemon_jump.c
+++ b/src/pokemon_jump.c
@@ -1282,12 +1282,12 @@ static bool32 SavePokeJump(void)
case 2:
if (AreLinkQueuesEmpty())
{
- CreateTask(Task_LinkSave, 6);
+ CreateTask(Task_LinkFullSave, 6);
sPokemonJump->mainState++;
}
break;
case 3:
- if (!FuncIsActiveTask(Task_LinkSave))
+ if (!FuncIsActiveTask(Task_LinkFullSave))
{
ClearMessageWindow();
sPokemonJump->mainState++;
diff --git a/src/record_mixing.c b/src/record_mixing.c
index f308e5b3d..6efded838 100644
--- a/src/record_mixing.c
+++ b/src/record_mixing.c
@@ -1002,11 +1002,11 @@ static void Task_DoRecordMixing(u8 taskId)
case 2:
// Mixing Ruby/Sapphire records.
SetContinueGameWarpStatusToDynamicWarp();
- FullSaveGame();
+ WriteSaveBlock2();
task->tState++;
break;
case 3:
- if (CheckSaveFile())
+ if (WriteSaveBlock1Sector())
{
ClearContinueGameWarpStatus2();
task->tState = 4;
@@ -1030,12 +1030,12 @@ static void Task_DoRecordMixing(u8 taskId)
case 6:
if (!Rfu_SetLinkRecovery(FALSE))
{
- CreateTask(Task_LinkSave, 5);
+ CreateTask(Task_LinkFullSave, 5);
task->tState++;
}
break;
- case 7: // wait for Task_LinkSave to finish.
- if (!FuncIsActiveTask(Task_LinkSave))
+ case 7: // wait for Task_LinkFullSave to finish.
+ if (!FuncIsActiveTask(Task_LinkFullSave))
{
if (gWirelessCommType)
{
diff --git a/src/recorded_battle.c b/src/recorded_battle.c
index e6d5b165b..fd2b3a06b 100644
--- a/src/recorded_battle.c
+++ b/src/recorded_battle.c
@@ -306,14 +306,14 @@ static bool32 IsRecordedBattleSaveValid(struct RecordedBattleSave *save)
return TRUE;
}
-static bool32 RecordedBattleToSave(struct RecordedBattleSave *battleSave, struct RecordedBattleSave *saveSection)
+static bool32 RecordedBattleToSave(struct RecordedBattleSave *battleSave, struct RecordedBattleSave *saveSector)
{
- memset(saveSection, 0, SECTOR_SIZE);
- memcpy(saveSection, battleSave, sizeof(*battleSave));
+ memset(saveSector, 0, SECTOR_SIZE);
+ memcpy(saveSector, battleSave, sizeof(*battleSave));
- saveSection->checksum = CalcByteArraySum((void*)(saveSection), sizeof(*saveSection) - 4);
+ saveSector->checksum = CalcByteArraySum((void*)(saveSector), sizeof(*saveSector) - 4);
- if (TryWriteSpecialSaveSection(SECTOR_ID_RECORDED_BATTLE, (void*)(saveSection)) != SAVE_STATUS_OK)
+ if (TryWriteSpecialSaveSector(SECTOR_ID_RECORDED_BATTLE, (void*)(saveSector)) != SAVE_STATUS_OK)
return FALSE;
else
return TRUE;
@@ -477,9 +477,9 @@ bool32 MoveRecordedBattleToSaveData(void)
return ret;
}
-static bool32 TryCopyRecordedBattleSaveData(struct RecordedBattleSave *dst, struct SaveSection *saveBuffer)
+static bool32 TryCopyRecordedBattleSaveData(struct RecordedBattleSave *dst, struct SaveSector *saveBuffer)
{
- if (TryReadSpecialSaveSection(SECTOR_ID_RECORDED_BATTLE, (void*)(saveBuffer)) != SAVE_STATUS_OK)
+ if (TryReadSpecialSaveSector(SECTOR_ID_RECORDED_BATTLE, (void*)(saveBuffer)) != SAVE_STATUS_OK)
return FALSE;
memcpy(dst, saveBuffer, sizeof(struct RecordedBattleSave));
@@ -492,7 +492,7 @@ static bool32 TryCopyRecordedBattleSaveData(struct RecordedBattleSave *dst, stru
static bool32 CopyRecordedBattleFromSave(struct RecordedBattleSave *dst)
{
- struct SaveSection *savBuffer = AllocZeroed(sizeof(struct SaveSection));
+ struct SaveSector *savBuffer = AllocZeroed(SECTOR_SIZE);
bool32 ret = TryCopyRecordedBattleSaveData(dst, savBuffer);
Free(savBuffer);
diff --git a/src/reload_save.c b/src/reload_save.c
index cdbb2f227..5425d1c7c 100644
--- a/src/reload_save.c
+++ b/src/reload_save.c
@@ -21,7 +21,7 @@ void ReloadSave(void)
SetSaveBlocksPointers(GetSaveBlocksPointersBaseOffset());
ResetMenuAndMonGlobals();
Save_ResetSaveCounters();
- Save_LoadGameData(SAVE_NORMAL);
+ LoadGameSave(SAVE_NORMAL);
if (gSaveFileStatus == SAVE_STATUS_EMPTY || gSaveFileStatus == SAVE_STATUS_CORRUPT)
Sav2_ClearSetDefault();
SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound);
diff --git a/src/save.c b/src/save.c
index 3c8f4360d..4cd2982a1 100644
--- a/src/save.c
+++ b/src/save.c
@@ -13,13 +13,13 @@
#include "link.h"
#include "constants/game_stat.h"
-static u16 CalculateChecksum(void *data, u16 size);
-static bool8 DoReadFlashWholeSection(u8 sector, struct SaveSection *section);
-static u8 GetSaveValidStatus(const struct SaveSectionLocation *location);
-static u8 sub_8152E10(u16 a1, const struct SaveSectionLocation *location);
-static u8 ClearSaveData_2(u16 a1, const struct SaveSectionLocation *location);
-static u8 TryWriteSector(u8 sector, u8 *data);
-static u8 HandleWriteSector(u16 a1, const struct SaveSectionLocation *location);
+static u16 CalculateChecksum(void *, u16);
+static bool8 ReadFlashSector(u8, struct SaveSector *);
+static u8 GetSaveValidStatus(const struct SaveSectorLocation *);
+static u8 CopySaveSlotData(u16, struct SaveSectorLocation *);
+static u8 TryWriteSector(u8, u8 *);
+static u8 HandleWriteSector(u16, const struct SaveSectorLocation *);
+static u8 HandleReplaceSector(u16, const struct SaveSectorLocation *);
// Divide save blocks into individual chunks to be written to flash sectors
@@ -38,11 +38,10 @@ static u8 HandleWriteSector(u16 a1, const struct SaveSectionLocation *location);
* so that the same data is not always being written to the same sector. This
* might be done to reduce wear on the flash memory, but I'm not sure, since all
* 14 sectors get written anyway.
+ *
+ * See SECTOR_ID_* constants in save.h
*/
-// (u8 *)structure was removed from the first statement of the macro in Emerald.
-// This is because malloc is used to allocate addresses so storing the raw
-// addresses should not be done in the offsets information.
#define SAVEBLOCK_CHUNK(structure, chunkNum) \
{ \
chunkNum * SECTOR_DATA_SIZE, \
@@ -50,16 +49,20 @@ static u8 HandleWriteSector(u16 a1, const struct SaveSectionLocation *location);
min(sizeof(structure) - chunkNum * SECTOR_DATA_SIZE, SECTOR_DATA_SIZE) : 0 \
}
-static const struct SaveSectionOffsets sSaveSectionOffsets[] =
+struct
+{
+ u16 offset;
+ u16 size;
+} static const sSaveSlotLayout[NUM_SECTORS_PER_SLOT] =
{
- SAVEBLOCK_CHUNK(gSaveblock2, 0),
+ SAVEBLOCK_CHUNK(gSaveblock2, 0), // SECTOR_ID_SAVEBLOCK2
- SAVEBLOCK_CHUNK(gSaveblock1, 0),
+ SAVEBLOCK_CHUNK(gSaveblock1, 0), // SECTOR_ID_SAVEBLOCK1_START
SAVEBLOCK_CHUNK(gSaveblock1, 1),
SAVEBLOCK_CHUNK(gSaveblock1, 2),
- SAVEBLOCK_CHUNK(gSaveblock1, 3),
+ SAVEBLOCK_CHUNK(gSaveblock1, 3), // SECTOR_ID_SAVEBLOCK1_END
- SAVEBLOCK_CHUNK(gPokemonStorage, 0),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 0), // SECTOR_ID_PKMN_STORAGE_START
SAVEBLOCK_CHUNK(gPokemonStorage, 1),
SAVEBLOCK_CHUNK(gPokemonStorage, 2),
SAVEBLOCK_CHUNK(gPokemonStorage, 3),
@@ -67,25 +70,24 @@ static const struct SaveSectionOffsets sSaveSectionOffsets[] =
SAVEBLOCK_CHUNK(gPokemonStorage, 5),
SAVEBLOCK_CHUNK(gPokemonStorage, 6),
SAVEBLOCK_CHUNK(gPokemonStorage, 7),
- SAVEBLOCK_CHUNK(gPokemonStorage, 8),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 8), // SECTOR_ID_PKMN_STORAGE_END
};
-// iwram common
u16 gLastWrittenSector;
u32 gLastSaveCounter;
u16 gLastKnownGoodSector;
u32 gDamagedSaveSectors;
u32 gSaveCounter;
-struct SaveSection *gFastSaveSection;
-u16 gUnknown_03006208;
+struct SaveSector *gReadWriteSector; // Pointer to a buffer for reading/writing a sector
+u16 gIncrementalSectorId;
u16 gSaveUnusedVar;
u16 gSaveFileStatus;
void (*gGameContinueCallback)(void);
-struct SaveSectionLocation gRamSaveSectionLocations[NUM_SECTORS_PER_SLOT];
+struct SaveSectorLocation gRamSaveSectorLocations[NUM_SECTORS_PER_SLOT];
u16 gSaveUnusedVar2;
u16 gSaveAttemptStatus;
-EWRAM_DATA struct SaveSection gSaveDataBuffer = {0};
+EWRAM_DATA struct SaveSector gSaveDataBuffer = {0}; // Buffer used for reading/writing sectors
EWRAM_DATA static u8 sUnusedVar = 0;
void ClearSaveData(void)
@@ -107,20 +109,20 @@ void Save_ResetSaveCounters(void)
gDamagedSaveSectors = 0;
}
-static bool32 SetDamagedSectorBits(u8 op, u8 bit)
+static bool32 SetDamagedSectorBits(u8 op, u8 sectorId)
{
bool32 retVal = FALSE;
switch (op)
{
case ENABLE:
- gDamagedSaveSectors |= (1 << bit);
+ gDamagedSaveSectors |= (1 << sectorId);
break;
case DISABLE:
- gDamagedSaveSectors &= ~(1 << bit);
+ gDamagedSaveSectors &= ~(1 << sectorId);
break;
case CHECK: // unused
- if (gDamagedSaveSectors & (1 << bit))
+ if (gDamagedSaveSectors & (1 << sectorId))
retVal = TRUE;
break;
}
@@ -128,31 +130,35 @@ static bool32 SetDamagedSectorBits(u8 op, u8 bit)
return retVal;
}
-static u8 SaveWriteToFlash(u16 sectorId, const struct SaveSectionLocation *location)
+static u8 WriteSaveSectorOrSlot(u16 sectorId, const struct SaveSectorLocation *locations)
{
u32 status;
u16 i;
- gFastSaveSection = &gSaveDataBuffer;
+ gReadWriteSector = &gSaveDataBuffer;
- if (sectorId != 0xFFFF) // for link
+ if (sectorId != FULL_SAVE_SLOT)
{
- status = HandleWriteSector(sectorId, location);
+ // A sector was specified, just write that sector.
+ // This is never reached, FULL_SAVE_SLOT is always used instead.
+ status = HandleWriteSector(sectorId, locations);
}
else
{
+ // No sector was specified, write full save slot.
gLastKnownGoodSector = gLastWrittenSector; // backup the current written sector before attempting to write.
gLastSaveCounter = gSaveCounter;
gLastWrittenSector++;
- gLastWrittenSector = gLastWrittenSector % NUM_SECTORS_PER_SLOT; // array count save sector locations
+ gLastWrittenSector = gLastWrittenSector % NUM_SECTORS_PER_SLOT;
gSaveCounter++;
status = SAVE_STATUS_OK;
for (i = 0; i < NUM_SECTORS_PER_SLOT; i++)
- HandleWriteSector(i, location);
+ HandleWriteSector(i, locations);
- if (gDamagedSaveSectors != 0) // skip the damaged sector.
+ if (gDamagedSaveSectors)
{
+ // At least one sector save failed
status = SAVE_STATUS_ERROR;
gLastWrittenSector = gLastKnownGoodSector;
gSaveCounter = gLastSaveCounter;
@@ -162,98 +168,107 @@ static u8 SaveWriteToFlash(u16 sectorId, const struct SaveSectionLocation *locat
return status;
}
-static u8 HandleWriteSector(u16 sectorId, const struct SaveSectionLocation *location)
+static u8 HandleWriteSector(u16 sectorId, const struct SaveSectorLocation *locations)
{
u16 i;
u16 sector;
u8 *data;
u16 size;
+ // Adjust sector id for current save slot
sector = sectorId + gLastWrittenSector;
sector %= NUM_SECTORS_PER_SLOT;
sector += NUM_SECTORS_PER_SLOT * (gSaveCounter % NUM_SAVE_SLOTS);
- data = location[sectorId].data;
- size = location[sectorId].size;
+ // Get current save data
+ data = locations[sectorId].data;
+ size = locations[sectorId].size;
- // clear save section.
- for (i = 0; i < sizeof(struct SaveSection); i++)
- ((char *)gFastSaveSection)[i] = 0;
+ // Clear temp save sector
+ for (i = 0; i < SECTOR_SIZE; i++)
+ ((u8 *)gReadWriteSector)[i] = 0;
- gFastSaveSection->id = sectorId;
- gFastSaveSection->security = UNKNOWN_CHECK_VALUE;
- gFastSaveSection->counter = gSaveCounter;
+ // Set footer data
+ gReadWriteSector->id = sectorId;
+ gReadWriteSector->security = SECTOR_SECURITY_NUM;
+ gReadWriteSector->counter = gSaveCounter;
+ // Copy current data to temp buffer for writing
for (i = 0; i < size; i++)
- gFastSaveSection->data[i] = data[i];
+ gReadWriteSector->data[i] = data[i];
+
+ gReadWriteSector->checksum = CalculateChecksum(data, size);
- gFastSaveSection->checksum = CalculateChecksum(data, size);
- return TryWriteSector(sector, gFastSaveSection->data);
+ return TryWriteSector(sector, gReadWriteSector->data);
}
-static u8 HandleWriteSectorNBytes(u8 sector, u8 *data, u16 size)
+static u8 HandleWriteSectorNBytes(u8 sectorId, u8 *data, u16 size)
{
u16 i;
- struct SaveSection *section = &gSaveDataBuffer;
+ struct SaveSector *sector = &gSaveDataBuffer;
- for (i = 0; i < sizeof(struct SaveSection); i++)
- ((char *)section)[i] = 0;
+ // Clear temp save sector
+ for (i = 0; i < SECTOR_SIZE; i++)
+ ((u8 *)sector)[i] = 0;
- section->security = UNKNOWN_CHECK_VALUE;
+ sector->security = SECTOR_SECURITY_NUM;
+ // Copy data to temp buffer for writing
for (i = 0; i < size; i++)
- section->data[i] = data[i];
+ sector->data[i] = data[i];
- section->id = CalculateChecksum(data, size); // though this appears to be incorrect, it might be some sector checksum instead of a whole save checksum and only appears to be relevent to HOF data, if used.
- return TryWriteSector(sector, section->data);
+ sector->id = CalculateChecksum(data, size); // though this appears to be incorrect, it might be some sector checksum instead of a whole save checksum and only appears to be relevent to HOF data, if used.
+ return TryWriteSector(sectorId, sector->data);
}
static u8 TryWriteSector(u8 sector, u8 *data)
{
- if (ProgramFlashSectorAndVerify(sector, data) != 0) // is damaged?
+ if (ProgramFlashSectorAndVerify(sector, data)) // is damaged?
{
- SetDamagedSectorBits(ENABLE, sector); // set damaged sector bits.
+ // Failed
+ SetDamagedSectorBits(ENABLE, sector);
return SAVE_STATUS_ERROR;
}
else
{
- SetDamagedSectorBits(DISABLE, sector); // unset damaged sector bits. it's safe now.
+ // Succeeded
+ SetDamagedSectorBits(DISABLE, sector);
return SAVE_STATUS_OK;
}
}
-static u32 RestoreSaveBackupVarsAndIncrement(const struct SaveSectionLocation *location) // location is unused
+static u32 RestoreSaveBackupVarsAndIncrement(const struct SaveSectorLocation *locations)
{
- gFastSaveSection = &gSaveDataBuffer;
+ gReadWriteSector = &gSaveDataBuffer;
gLastKnownGoodSector = gLastWrittenSector;
gLastSaveCounter = gSaveCounter;
gLastWrittenSector++;
gLastWrittenSector %= NUM_SECTORS_PER_SLOT;
gSaveCounter++;
- gUnknown_03006208 = 0;
+ gIncrementalSectorId = 0;
gDamagedSaveSectors = 0;
return 0;
}
-static u32 RestoreSaveBackupVars(const struct SaveSectionLocation *location) // only ever called once, and gSaveBlock2 is passed to this function. location is unused
+static u32 RestoreSaveBackupVars(const struct SaveSectorLocation *locations)
{
- gFastSaveSection = &gSaveDataBuffer;
+ gReadWriteSector = &gSaveDataBuffer;
gLastKnownGoodSector = gLastWrittenSector;
gLastSaveCounter = gSaveCounter;
- gUnknown_03006208 = 0;
+ gIncrementalSectorId = 0;
gDamagedSaveSectors = 0;
return 0;
}
-static u8 sub_81529D4(u16 sectorId, const struct SaveSectionLocation *location)
+static u8 HandleWriteIncrementalSector(u16 numSectors, const struct SaveSectorLocation *locations)
{
u8 status;
- if (gUnknown_03006208 < sectorId - 1)
+ if (gIncrementalSectorId < numSectors - 1)
{
status = SAVE_STATUS_OK;
- HandleWriteSector(gUnknown_03006208, location);
- gUnknown_03006208++;
+ HandleWriteSector(gIncrementalSectorId, locations);
+ gIncrementalSectorId++;
if (gDamagedSaveSectors)
{
status = SAVE_STATUS_ERROR;
@@ -263,17 +278,18 @@ static u8 sub_81529D4(u16 sectorId, const struct SaveSectionLocation *location)
}
else
{
+ // Exceeded max sector, finished
status = SAVE_STATUS_ERROR;
}
return status;
}
-static u8 sub_8152A34(u16 sectorId, const struct SaveSectionLocation *location)
+static u8 HandleReplaceSectorAndVerify(u16 sectorId, const struct SaveSectorLocation *locations)
{
u8 status = SAVE_STATUS_OK;
- ClearSaveData_2(sectorId - 1, location);
+ HandleReplaceSector(sectorId - 1, locations);
if (gDamagedSaveSectors)
{
@@ -284,7 +300,8 @@ static u8 sub_8152A34(u16 sectorId, const struct SaveSectionLocation *location)
return status;
}
-static u8 ClearSaveData_2(u16 sectorId, const struct SaveSectionLocation *location)
+// Similar to HandleWriteSector, but fully erases the sector first, and skips writing the first security byte
+static u8 HandleReplaceSector(u16 sectorId, const struct SaveSectorLocation *locations)
{
u16 i;
u16 sector;
@@ -292,35 +309,39 @@ static u8 ClearSaveData_2(u16 sectorId, const struct SaveSectionLocation *locati
u16 size;
u8 status;
+ // Adjust sector id for current save slot
sector = sectorId + gLastWrittenSector;
sector %= NUM_SECTORS_PER_SLOT;
sector += NUM_SECTORS_PER_SLOT * (gSaveCounter % NUM_SAVE_SLOTS);
- data = location[sectorId].data;
- size = location[sectorId].size;
+ // Get current save data
+ data = locations[sectorId].data;
+ size = locations[sectorId].size;
- // clear temp save section.
- for (i = 0; i < sizeof(struct SaveSection); i++)
- ((char *)gFastSaveSection)[i] = 0;
+ // Clear temp save sector.
+ for (i = 0; i < SECTOR_SIZE; i++)
+ ((u8 *)gReadWriteSector)[i] = 0;
- gFastSaveSection->id = sectorId;
- gFastSaveSection->security = UNKNOWN_CHECK_VALUE;
- gFastSaveSection->counter = gSaveCounter;
+ // Set footer data
+ gReadWriteSector->id = sectorId;
+ gReadWriteSector->security = SECTOR_SECURITY_NUM;
+ gReadWriteSector->counter = gSaveCounter;
- // set temp section's data.
+ // Copy current data to temp buffer for writing
for (i = 0; i < size; i++)
- gFastSaveSection->data[i] = data[i];
+ gReadWriteSector->data[i] = data[i];
- // calculate checksum.
- gFastSaveSection->checksum = CalculateChecksum(data, size);
+ gReadWriteSector->checksum = CalculateChecksum(data, size);
+ // Erase old save data
EraseFlashSector(sector);
status = SAVE_STATUS_OK;
- for (i = 0; i < sizeof(struct UnkSaveSection); i++)
+ // Write new save data up to security field
+ for (i = 0; i < SECTOR_SECURITY_OFFSET; i++)
{
- if (ProgramFlashByte(sector, i, ((u8 *)gFastSaveSection)[i]))
+ if (ProgramFlashByte(sector, i, ((u8 *)gReadWriteSector)[i]))
{
status = SAVE_STATUS_ERROR;
break;
@@ -329,16 +350,20 @@ static u8 ClearSaveData_2(u16 sectorId, const struct SaveSectionLocation *locati
if (status == SAVE_STATUS_ERROR)
{
+ // Writing save data failed
SetDamagedSectorBits(ENABLE, sector);
return SAVE_STATUS_ERROR;
}
else
{
+ // Writing save data succeeded, write security and counter
status = SAVE_STATUS_OK;
- for (i = 0; i < 7; i++)
+ // Write security (skipping the first byte) and counter fields.
+ // The byte of security that is skipped is instead written by WriteSectorSecurityByte or WriteSectorSecurityByte_NoOffset
+ for (i = 0; i < SECTOR_SIZE - (SECTOR_SECURITY_OFFSET + 1); i++)
{
- if (ProgramFlashByte(sector, 0xFF9 + i, ((u8 *)gFastSaveSection)[0xFF9 + i]))
+ if (ProgramFlashByte(sector, SECTOR_SECURITY_OFFSET + 1 + i, ((u8 *)gReadWriteSector)[SECTOR_SECURITY_OFFSET + 1 + i]))
{
status = SAVE_STATUS_ERROR;
break;
@@ -347,28 +372,31 @@ static u8 ClearSaveData_2(u16 sectorId, const struct SaveSectionLocation *locati
if (status == SAVE_STATUS_ERROR)
{
+ // Writing security/counter failed
SetDamagedSectorBits(ENABLE, sector);
return SAVE_STATUS_ERROR;
}
else
{
+ // Succeeded
SetDamagedSectorBits(DISABLE, sector);
return SAVE_STATUS_OK;
}
}
}
-static u8 sav12_xor_get(u16 sectorId, const struct SaveSectionLocation *location)
+static u8 WriteSectorSecurityByte_NoOffset(u16 sectorId, const struct SaveSectorLocation *locations)
{
- u16 sector;
-
- sector = sectorId + gLastWrittenSector; // no sub 1?
+ // Adjust sector id for current save slot
+ // This first line lacking -1 is the only difference from WriteSectorSecurityByte
+ u16 sector = sectorId + gLastWrittenSector;
sector %= NUM_SECTORS_PER_SLOT;
sector += NUM_SECTORS_PER_SLOT * (gSaveCounter % NUM_SAVE_SLOTS);
- if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), 0x25))
+ // Write just the first byte of the security field, which was skipped by HandleReplaceSector
+ if (ProgramFlashByte(sector, SECTOR_SECURITY_OFFSET, SECTOR_SECURITY_NUM & 0xFF))
{
- // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter.
+ // Sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter.
SetDamagedSectorBits(ENABLE, sector);
gLastWrittenSector = gLastKnownGoodSector;
gSaveCounter = gLastSaveCounter;
@@ -376,22 +404,23 @@ static u8 sav12_xor_get(u16 sectorId, const struct SaveSectionLocation *location
}
else
{
+ // Succeeded
SetDamagedSectorBits(DISABLE, sector);
return SAVE_STATUS_OK;
}
}
-static u8 sub_8152CAC(u16 sectorId, const struct SaveSectionLocation *location)
+static u8 CopySectorSecurityByte(u16 sectorId, const struct SaveSectorLocation *locations)
{
- u16 sector;
-
- sector = sectorId + gLastWrittenSector - 1;
+ // Adjust sector id for current save slot
+ u16 sector = sectorId + gLastWrittenSector - 1;
sector %= NUM_SECTORS_PER_SLOT;
sector += NUM_SECTORS_PER_SLOT * (gSaveCounter % NUM_SAVE_SLOTS);
- if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), ((u8 *)gFastSaveSection)[sizeof(struct UnkSaveSection)]))
+ // Copy just the first byte of the security field from the read/write buffer
+ if (ProgramFlashByte(sector, SECTOR_SECURITY_OFFSET, ((u8 *)gReadWriteSector)[SECTOR_SECURITY_OFFSET]))
{
- // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter.
+ // Sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter.
SetDamagedSectorBits(ENABLE, sector);
gLastWrittenSector = gLastKnownGoodSector;
gSaveCounter = gLastSaveCounter;
@@ -399,22 +428,23 @@ static u8 sub_8152CAC(u16 sectorId, const struct SaveSectionLocation *location)
}
else
{
+ // Succeded
SetDamagedSectorBits(DISABLE, sector);
return SAVE_STATUS_OK;
}
}
-static u8 sub_8152D44(u16 sectorId, const struct SaveSectionLocation *location)
+static u8 WriteSectorSecurityByte(u16 sectorId, const struct SaveSectorLocation *locations)
{
- u16 sector;
-
- sector = sectorId + gLastWrittenSector - 1; // no sub 1?
+ // Adjust sector id for current save slot
+ u16 sector = sectorId + gLastWrittenSector - 1;
sector %= NUM_SECTORS_PER_SLOT;
sector += NUM_SECTORS_PER_SLOT * (gSaveCounter % NUM_SAVE_SLOTS);
- if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), 0x25))
+ // Write just the first byte of the security field, which was skipped by HandleReplaceSector
+ if (ProgramFlashByte(sector, SECTOR_SECURITY_OFFSET, SECTOR_SECURITY_NUM & 0xFF))
{
- // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter.
+ // Sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter.
SetDamagedSectorBits(ENABLE, sector);
gLastWrittenSector = gLastKnownGoodSector;
gSaveCounter = gLastSaveCounter;
@@ -422,29 +452,32 @@ static u8 sub_8152D44(u16 sectorId, const struct SaveSectionLocation *location)
}
else
{
+ // Succeeded
SetDamagedSectorBits(DISABLE, sector);
return SAVE_STATUS_OK;
}
}
-static u8 sub_8152DD0(u16 a1, const struct SaveSectionLocation *location)
+static u8 TryLoadSaveSlot(u16 sectorId, struct SaveSectorLocation *locations)
{
u8 status;
- gFastSaveSection = &gSaveDataBuffer;
- if (a1 != 0xFFFF)
+ gReadWriteSector = &gSaveDataBuffer;
+ if (sectorId != FULL_SAVE_SLOT)
{
+ // This function may not be used with a specific sector id
status = SAVE_STATUS_ERROR;
}
else
{
- status = GetSaveValidStatus(location);
- sub_8152E10(0xFFFF, location);
+ status = GetSaveValidStatus(locations);
+ CopySaveSlotData(FULL_SAVE_SLOT, locations);
}
return status;
}
-static u8 sub_8152E10(u16 a1, const struct SaveSectionLocation *location)
+// sectorId arg is ignored, this always reads the full save slot
+static u8 CopySaveSlotData(u16 sectorId, struct SaveSectorLocation *locations)
{
u16 i;
u16 checksum;
@@ -453,96 +486,102 @@ static u8 sub_8152E10(u16 a1, const struct SaveSectionLocation *location)
for (i = 0; i < NUM_SECTORS_PER_SLOT; i++)
{
- DoReadFlashWholeSection(i + slotOffset, gFastSaveSection);
- id = gFastSaveSection->id;
+ ReadFlashSector(i + slotOffset, gReadWriteSector);
+
+ id = gReadWriteSector->id;
if (id == 0)
gLastWrittenSector = i;
- checksum = CalculateChecksum(gFastSaveSection->data, location[id].size);
- if (gFastSaveSection->security == UNKNOWN_CHECK_VALUE
- && gFastSaveSection->checksum == checksum)
+
+ checksum = CalculateChecksum(gReadWriteSector->data, locations[id].size);
+
+ // Only copy data for sectors whose security and checksum fields are correct
+ if (gReadWriteSector->security == SECTOR_SECURITY_NUM && gReadWriteSector->checksum == checksum)
{
u16 j;
- for (j = 0; j < location[id].size; j++)
- ((u8 *)location[id].data)[j] = gFastSaveSection->data[j];
+ for (j = 0; j < locations[id].size; j++)
+ ((u8 *)locations[id].data)[j] = gReadWriteSector->data[j];
}
}
return SAVE_STATUS_OK;
}
-static u8 GetSaveValidStatus(const struct SaveSectionLocation *location)
+static u8 GetSaveValidStatus(const struct SaveSectorLocation *locations)
{
u16 i;
u16 checksum;
u32 saveSlot1Counter = 0;
u32 saveSlot2Counter = 0;
- u32 slotCheckField = 0;
+ u32 validSectorFlags = 0;
bool8 securityPassed = FALSE;
u8 saveSlot1Status;
u8 saveSlot2Status;
- // check save slot 1.
+ // Check save slot 1
for (i = 0; i < NUM_SECTORS_PER_SLOT; i++)
{
- DoReadFlashWholeSection(i, gFastSaveSection);
- if (gFastSaveSection->security == UNKNOWN_CHECK_VALUE)
+ ReadFlashSector(i, gReadWriteSector);
+ if (gReadWriteSector->security == SECTOR_SECURITY_NUM)
{
securityPassed = TRUE;
- checksum = CalculateChecksum(gFastSaveSection->data, location[gFastSaveSection->id].size);
- if (gFastSaveSection->checksum == checksum)
+ checksum = CalculateChecksum(gReadWriteSector->data, locations[gReadWriteSector->id].size);
+ if (gReadWriteSector->checksum == checksum)
{
- saveSlot1Counter = gFastSaveSection->counter;
- slotCheckField |= 1 << gFastSaveSection->id;
+ saveSlot1Counter = gReadWriteSector->counter;
+ validSectorFlags |= 1 << gReadWriteSector->id;
}
}
}
if (securityPassed)
{
- if (slotCheckField == 0x3FFF)
+ if (validSectorFlags == (1 << NUM_SECTORS_PER_SLOT) - 1)
saveSlot1Status = SAVE_STATUS_OK;
else
saveSlot1Status = SAVE_STATUS_ERROR;
}
else
{
+ // No sectors in slot 1 have the security number, treat it as empty
saveSlot1Status = SAVE_STATUS_EMPTY;
}
- slotCheckField = 0;
+ validSectorFlags = 0;
securityPassed = FALSE;
- // check save slot 2.
+ // Check save slot 2
for (i = 0; i < NUM_SECTORS_PER_SLOT; i++)
{
- DoReadFlashWholeSection(i + NUM_SECTORS_PER_SLOT, gFastSaveSection);
- if (gFastSaveSection->security == UNKNOWN_CHECK_VALUE)
+ ReadFlashSector(i + NUM_SECTORS_PER_SLOT, gReadWriteSector);
+ if (gReadWriteSector->security == SECTOR_SECURITY_NUM)
{
securityPassed = TRUE;
- checksum = CalculateChecksum(gFastSaveSection->data, location[gFastSaveSection->id].size);
- if (gFastSaveSection->checksum == checksum)
+ checksum = CalculateChecksum(gReadWriteSector->data, locations[gReadWriteSector->id].size);
+ if (gReadWriteSector->checksum == checksum)
{
- saveSlot2Counter = gFastSaveSection->counter;
- slotCheckField |= 1 << gFastSaveSection->id;
+ saveSlot2Counter = gReadWriteSector->counter;
+ validSectorFlags |= 1 << gReadWriteSector->id;
}
}
}
if (securityPassed)
{
- if (slotCheckField == 0x3FFF)
+ if (validSectorFlags == (1 << NUM_SECTORS_PER_SLOT) - 1)
saveSlot2Status = SAVE_STATUS_OK;
else
saveSlot2Status = SAVE_STATUS_ERROR;
}
else
{
+ // No sectors in slot 2 have the security number, treat it as empty.
saveSlot2Status = SAVE_STATUS_EMPTY;
}
if (saveSlot1Status == SAVE_STATUS_OK && saveSlot2Status == SAVE_STATUS_OK)
{
- if ((saveSlot1Counter == -1 && saveSlot2Counter == 0) || (saveSlot1Counter == 0 && saveSlot2Counter == -1))
+ if ((saveSlot1Counter == -1 && saveSlot2Counter == 0)
+ || (saveSlot1Counter == 0 && saveSlot2Counter == -1))
{
if ((unsigned)(saveSlot1Counter + 1) < (unsigned)(saveSlot2Counter + 1))
gSaveCounter = saveSlot2Counter;
@@ -559,63 +598,71 @@ static u8 GetSaveValidStatus(const struct SaveSectionLocation *location)
return SAVE_STATUS_OK;
}
+ // One or both save slots are not OK
+
if (saveSlot1Status == SAVE_STATUS_OK)
{
gSaveCounter = saveSlot1Counter;
if (saveSlot2Status == SAVE_STATUS_ERROR)
- return SAVE_STATUS_ERROR;
- return SAVE_STATUS_OK;
+ return SAVE_STATUS_ERROR; // Slot 2 errored
+ return SAVE_STATUS_OK; // Slot 1 is OK, slot 2 is empty
}
if (saveSlot2Status == SAVE_STATUS_OK)
{
gSaveCounter = saveSlot2Counter;
if (saveSlot1Status == SAVE_STATUS_ERROR)
- return SAVE_STATUS_ERROR;
- return SAVE_STATUS_OK;
+ return SAVE_STATUS_ERROR; // Slot 1 errored
+ return SAVE_STATUS_OK; // Slot 2 is OK, slot 1 is empty
}
- if (saveSlot1Status == SAVE_STATUS_EMPTY && saveSlot2Status == SAVE_STATUS_EMPTY)
+ // Neither slot is OK, check if both are empty
+ if (saveSlot1Status == SAVE_STATUS_EMPTY
+ && saveSlot2Status == SAVE_STATUS_EMPTY)
{
gSaveCounter = 0;
gLastWrittenSector = 0;
return SAVE_STATUS_EMPTY;
}
+ // Both slots errored
gSaveCounter = 0;
gLastWrittenSector = 0;
return SAVE_STATUS_CORRUPT;
}
-static u8 sub_81530DC(u8 sectorId, u8 *data, u16 size)
+static u8 TryLoadSaveSector(u8 sectorId, u8 *data, u16 size)
{
u16 i;
- struct SaveSection *section = &gSaveDataBuffer;
- DoReadFlashWholeSection(sectorId, section);
- if (section->security == UNKNOWN_CHECK_VALUE)
+ struct SaveSector *sector = &gSaveDataBuffer;
+ ReadFlashSector(sectorId, sector);
+ if (sector->security == SECTOR_SECURITY_NUM)
{
- u16 checksum = CalculateChecksum(section->data, size);
- if (section->id == checksum)
+ u16 checksum = CalculateChecksum(sector->data, size);
+ if (sector->id == checksum)
{
+ // Security and checksum are correct, copy data
for (i = 0; i < size; i++)
- data[i] = section->data[i];
+ data[i] = sector->data[i];
return SAVE_STATUS_OK;
}
else
{
+ // Incorrect checksum
return SAVE_STATUS_CORRUPT;
}
}
else
{
+ // Incorrect security value
return SAVE_STATUS_EMPTY;
}
}
// Return value always ignored
-static bool8 DoReadFlashWholeSection(u8 sector, struct SaveSection *section)
+static bool8 ReadFlashSector(u8 sectorId, struct SaveSector *sector)
{
- ReadFlash(sector, 0, section->data, sizeof(struct SaveSection));
+ ReadFlash(sectorId, 0, sector->data, SECTOR_SIZE);
return TRUE;
}
@@ -635,21 +682,20 @@ static u16 CalculateChecksum(void *data, u16 size)
static void UpdateSaveAddresses(void)
{
- int i = 0;
-
- gRamSaveSectionLocations[i].data = (void*)(gSaveBlock2Ptr) + sSaveSectionOffsets[i].toAdd;
- gRamSaveSectionLocations[i].size = sSaveSectionOffsets[i].size;
+ int i = SECTOR_ID_SAVEBLOCK2;
+ gRamSaveSectorLocations[i].data = (void*)(gSaveBlock2Ptr) + sSaveSlotLayout[i].offset;
+ gRamSaveSectorLocations[i].size = sSaveSlotLayout[i].size;
for (i = SECTOR_ID_SAVEBLOCK1_START; i <= SECTOR_ID_SAVEBLOCK1_END; i++)
{
- gRamSaveSectionLocations[i].data = (void*)(gSaveBlock1Ptr) + sSaveSectionOffsets[i].toAdd;
- gRamSaveSectionLocations[i].size = sSaveSectionOffsets[i].size;
+ gRamSaveSectorLocations[i].data = (void*)(gSaveBlock1Ptr) + sSaveSlotLayout[i].offset;
+ gRamSaveSectorLocations[i].size = sSaveSlotLayout[i].size;
}
for (; i <= SECTOR_ID_PKMN_STORAGE_END; i++) //setting i to SECTOR_ID_PKMN_STORAGE_START does not match
{
- gRamSaveSectionLocations[i].data = (void*)(gPokemonStoragePtr) + sSaveSectionOffsets[i].toAdd;
- gRamSaveSectionLocations[i].size = sSaveSectionOffsets[i].size;
+ gRamSaveSectorLocations[i].data = (void*)(gPokemonStoragePtr) + sSaveSlotLayout[i].offset;
+ gRamSaveSectorLocations[i].size = sSaveSlotLayout[i].size;
}
}
@@ -663,43 +709,48 @@ u8 HandleSavingData(u8 saveType)
UpdateSaveAddresses();
switch (saveType)
{
- case SAVE_HALL_OF_FAME_ERASE_BEFORE: // deletes HOF before overwriting HOF completely. unused
+ case SAVE_HALL_OF_FAME_ERASE_BEFORE:
+ // Unused. Erases the special save sectors (HOF, Trainer Hill, Recorded Battle)
+ // before overwriting HOF.
for (i = SECTOR_ID_HOF_1; i < SECTORS_COUNT; i++)
EraseFlashSector(i);
- case SAVE_HALL_OF_FAME: // hall of fame.
+ // fallthrough
+ case SAVE_HALL_OF_FAME:
if (GetGameStat(GAME_STAT_ENTERED_HOF) < 999)
IncrementGameStat(GAME_STAT_ENTERED_HOF);
- SaveSerializedGame();
- SaveWriteToFlash(0xFFFF, gRamSaveSectionLocations);
+
+ // Write the full save slot first
+ CopyPartyAndObjectsToSave();
+ WriteSaveSectorOrSlot(FULL_SAVE_SLOT, gRamSaveSectorLocations);
+
+ // Save the Hall of Fame
tempAddr = gDecompressionBuffer;
HandleWriteSectorNBytes(SECTOR_ID_HOF_1, tempAddr, SECTOR_DATA_SIZE);
HandleWriteSectorNBytes(SECTOR_ID_HOF_2, tempAddr + SECTOR_DATA_SIZE, SECTOR_DATA_SIZE);
break;
- case SAVE_NORMAL: // normal save. also called by overwriting your own save.
+ case SAVE_NORMAL:
default:
- SaveSerializedGame();
- SaveWriteToFlash(0xFFFF, gRamSaveSectionLocations);
+ CopyPartyAndObjectsToSave();
+ WriteSaveSectorOrSlot(FULL_SAVE_SLOT, gRamSaveSectorLocations);
break;
- case SAVE_LINK: // Link and Battle Frontier
- case SAVE_LINK2: // Unused
- SaveSerializedGame();
+ case SAVE_LINK:
+ case SAVE_LINK2:
+ // Used by link / Battle Frontier
+ // Write only SaveBlocks 1 and 2 (skips the PC)
+ CopyPartyAndObjectsToSave();
for(i = SECTOR_ID_SAVEBLOCK2; i <= SECTOR_ID_SAVEBLOCK1_END; i++)
- ClearSaveData_2(i, gRamSaveSectionLocations);
+ HandleReplaceSector(i, gRamSaveSectorLocations);
for(i = SECTOR_ID_SAVEBLOCK2; i <= SECTOR_ID_SAVEBLOCK1_END; i++)
- sav12_xor_get(i, gRamSaveSectionLocations);
+ WriteSectorSecurityByte_NoOffset(i, gRamSaveSectorLocations);
break;
- // Support for Ereader was removed in Emerald.
- /*
- case EREADER_SAVE: // used in mossdeep "game corner" before/after battling old man e-reader trainer
- SaveSerializedGame();
- SaveWriteToFlash(0, gRamSaveSectionLocations);
- break;
- */
case SAVE_OVERWRITE_DIFFERENT_FILE:
+ // Erase Hall of Fame
for (i = SECTOR_ID_HOF_1; i < SECTORS_COUNT; i++)
- EraseFlashSector(i); // erase HOF.
- SaveSerializedGame();
- SaveWriteToFlash(0xFFFF, gRamSaveSectionLocations);
+ EraseFlashSector(i);
+
+ // Overwrite save slot
+ CopyPartyAndObjectsToSave();
+ WriteSaveSectorOrSlot(FULL_SAVE_SLOT, gRamSaveSectorLocations);
break;
}
gTrainerHillVBlankCounter = backupVar;
@@ -728,75 +779,91 @@ u8 TrySavingData(u8 saveType)
}
}
-bool8 sub_8153380(void) // trade.c
+bool8 LinkFullSave_Init(void)
{
if (gFlashMemoryPresent != TRUE)
return TRUE;
UpdateSaveAddresses();
- SaveSerializedGame();
- RestoreSaveBackupVarsAndIncrement(gRamSaveSectionLocations);
+ CopyPartyAndObjectsToSave();
+ RestoreSaveBackupVarsAndIncrement(gRamSaveSectorLocations);
return FALSE;
}
-bool8 sub_81533AC(void) // trade.c
+bool8 LinkFullSave_WriteSector(void)
{
- u8 status = sub_81529D4(NUM_SECTORS_PER_SLOT, gRamSaveSectionLocations);
+ u8 status = HandleWriteIncrementalSector(NUM_SECTORS_PER_SLOT, gRamSaveSectorLocations);
if (gDamagedSaveSectors)
DoSaveFailedScreen(SAVE_NORMAL);
+
+ // In this case "error" either means that an actual error was encountered
+ // or that the given max sector has been reached (meaning it has finished successfully).
+ // If there was an actual error the save failed screen above will also be shown.
if (status == SAVE_STATUS_ERROR)
return TRUE;
else
return FALSE;
}
-bool8 sub_81533E0(void) // trade.c
+bool8 LinkFullSave_ReplaceLastSector(void)
{
- sub_8152A34(NUM_SECTORS_PER_SLOT, gRamSaveSectionLocations);
+ HandleReplaceSectorAndVerify(NUM_SECTORS_PER_SLOT, gRamSaveSectorLocations);
if (gDamagedSaveSectors)
DoSaveFailedScreen(SAVE_NORMAL);
return FALSE;
}
-bool8 sub_8153408(void) // trade.c
+bool8 LinkFullSave_SetLastSectorSecurity(void)
{
- sub_8152CAC(NUM_SECTORS_PER_SLOT, gRamSaveSectionLocations);
+ CopySectorSecurityByte(NUM_SECTORS_PER_SLOT, gRamSaveSectorLocations);
if (gDamagedSaveSectors)
DoSaveFailedScreen(SAVE_NORMAL);
return FALSE;
}
-u8 FullSaveGame(void)
+u8 WriteSaveBlock2(void)
{
if (gFlashMemoryPresent != TRUE)
return TRUE;
UpdateSaveAddresses();
- SaveSerializedGame();
- RestoreSaveBackupVars(gRamSaveSectionLocations);
- sub_8152A34(gUnknown_03006208 + 1, gRamSaveSectionLocations);
+ CopyPartyAndObjectsToSave();
+ RestoreSaveBackupVars(gRamSaveSectorLocations);
+
+ // Because RestoreSaveBackupVars is called immediately prior, gIncrementalSectorId will always be 0 below,
+ // so this function only saves the first sector (SECTOR_ID_SAVEBLOCK2)
+ HandleReplaceSectorAndVerify(gIncrementalSectorId + 1, gRamSaveSectorLocations);
return FALSE;
}
-bool8 CheckSaveFile(void)
+// Used in conjunction with WriteSaveBlock2 to write both for certain link saves.
+// This will be called repeatedly in a task, writing each sector of SaveBlock1 incrementally.
+// It returns TRUE when finished.
+bool8 WriteSaveBlock1Sector(void)
{
- u8 retVal = FALSE;
- u16 sectorId = ++gUnknown_03006208;
+ u8 finished = FALSE;
+ u16 sectorId = ++gIncrementalSectorId; // Because WriteSaveBlock2 will have been called prior, this will be SECTOR_ID_SAVEBLOCK1_START
if (sectorId <= SECTOR_ID_SAVEBLOCK1_END)
{
- sub_8152A34(gUnknown_03006208 + 1, gRamSaveSectionLocations);
- sub_8152D44(sectorId, gRamSaveSectionLocations);
+ // Write a single sector of SaveBlock1
+ HandleReplaceSectorAndVerify(gIncrementalSectorId + 1, gRamSaveSectorLocations);
+ WriteSectorSecurityByte(sectorId, gRamSaveSectorLocations);
}
else
{
- sub_8152D44(sectorId, gRamSaveSectionLocations);
- retVal = TRUE;
+ // Beyond SaveBlock1, don't write the sector.
+ // Does write 1 byte of the next sector's security field, but as these
+ // are the same for all valid sectors it doesn't matter.
+ WriteSectorSecurityByte(sectorId, gRamSaveSectorLocations);
+ finished = TRUE;
}
+
if (gDamagedSaveSectors)
DoSaveFailedScreen(SAVE_LINK);
- return retVal;
+
+ return finished;
}
-u8 Save_LoadGameData(u8 saveType)
+u8 LoadGameSave(u8 saveType)
{
u8 status;
@@ -811,15 +878,15 @@ u8 Save_LoadGameData(u8 saveType)
{
case SAVE_NORMAL:
default:
- status = sub_8152DD0(0xFFFF, gRamSaveSectionLocations);
- LoadSerializedGame();
+ status = TryLoadSaveSlot(FULL_SAVE_SLOT, gRamSaveSectorLocations);
+ CopyPartyAndObjectsFromSave();
gSaveFileStatus = status;
gGameContinueCallback = 0;
break;
case SAVE_HALL_OF_FAME:
- status = sub_81530DC(SECTOR_ID_HOF_1, gDecompressionBuffer, SECTOR_DATA_SIZE);
+ status = TryLoadSaveSector(SECTOR_ID_HOF_1, gDecompressionBuffer, SECTOR_DATA_SIZE);
if (status == SAVE_STATUS_OK)
- status = sub_81530DC(SECTOR_ID_HOF_2, gDecompressionBuffer + SECTOR_DATA_SIZE, SECTOR_DATA_SIZE);
+ status = TryLoadSaveSector(SECTOR_ID_HOF_2, &gDecompressionBuffer[SECTOR_DATA_SIZE], SECTOR_DATA_SIZE);
break;
}
@@ -829,29 +896,29 @@ u8 Save_LoadGameData(u8 saveType)
u16 GetSaveBlocksPointersBaseOffset(void)
{
u16 i, slotOffset;
- struct SaveSection* savSection;
+ struct SaveSector* sector;
- savSection = gFastSaveSection = &gSaveDataBuffer;
+ sector = gReadWriteSector = &gSaveDataBuffer;
if (gFlashMemoryPresent != TRUE)
return 0;
UpdateSaveAddresses();
- GetSaveValidStatus(gRamSaveSectionLocations);
+ GetSaveValidStatus(gRamSaveSectorLocations);
slotOffset = NUM_SECTORS_PER_SLOT * (gSaveCounter % NUM_SAVE_SLOTS);
for (i = 0; i < NUM_SECTORS_PER_SLOT; i++)
{
- DoReadFlashWholeSection(i + slotOffset, gFastSaveSection);
+ ReadFlashSector(i + slotOffset, gReadWriteSector);
// Base offset for SaveBlock2 is calculated using the trainer id
- if (gFastSaveSection->id == SECTOR_ID_SAVEBLOCK2)
- return savSection->data[offsetof(struct SaveBlock2, playerTrainerId[0])] +
- savSection->data[offsetof(struct SaveBlock2, playerTrainerId[1])] +
- savSection->data[offsetof(struct SaveBlock2, playerTrainerId[2])] +
- savSection->data[offsetof(struct SaveBlock2, playerTrainerId[3])];
+ if (gReadWriteSector->id == SECTOR_ID_SAVEBLOCK2)
+ return sector->data[offsetof(struct SaveBlock2, playerTrainerId[0])] +
+ sector->data[offsetof(struct SaveBlock2, playerTrainerId[1])] +
+ sector->data[offsetof(struct SaveBlock2, playerTrainerId[2])] +
+ sector->data[offsetof(struct SaveBlock2, playerTrainerId[3])];
}
return 0;
}
-u32 TryReadSpecialSaveSection(u8 sector, u8* dst)
+u32 TryReadSpecialSaveSector(u8 sector, u8* dst)
{
s32 i;
s32 size;
@@ -859,19 +926,21 @@ u32 TryReadSpecialSaveSection(u8 sector, u8* dst)
if (sector != SECTOR_ID_TRAINER_HILL && sector != SECTOR_ID_RECORDED_BATTLE)
return SAVE_STATUS_ERROR;
- ReadFlash(sector, 0, (u8 *)&gSaveDataBuffer, sizeof(struct SaveSection));
- if (*(u32*)(&gSaveDataBuffer.data[0]) != SPECIAL_SECTION_SENTINEL)
+
+ ReadFlash(sector, 0, (u8 *)&gSaveDataBuffer, SECTOR_SIZE);
+ if (*(u32*)(&gSaveDataBuffer.data[0]) != SPECIAL_SECTOR_SENTINEL)
return SAVE_STATUS_ERROR;
- // copies whole save section except u32 counter
+
+ // Copies whole save sector except u32 counter
i = 0;
- size = 0xFFB;
- savData = &gSaveDataBuffer.data[4];
+ size = SECTOR_COUNTER_OFFSET - 1;
+ savData = &gSaveDataBuffer.data[4]; // data[4] to skip past SPECIAL_SECTOR_SENTINEL
for (; i <= size; i++)
dst[i] = savData[i];
return SAVE_STATUS_OK;
}
-u32 TryWriteSpecialSaveSection(u8 sector, u8* src)
+u32 TryWriteSpecialSaveSector(u8 sector, u8* src)
{
s32 i;
s32 size;
@@ -882,12 +951,12 @@ u32 TryWriteSpecialSaveSection(u8 sector, u8* src)
return SAVE_STATUS_ERROR;
savDataBuffer = &gSaveDataBuffer;
- *(u32*)(savDataBuffer) = SPECIAL_SECTION_SENTINEL;
+ *(u32*)(savDataBuffer) = SPECIAL_SECTOR_SENTINEL;
- // copies whole save section except u32 counter
+ // Copies whole save sector except u32 counter
i = 0;
- size = 0xFFB;
- savData = &gSaveDataBuffer.data[4];
+ size = SECTOR_COUNTER_OFFSET - 1;
+ savData = &gSaveDataBuffer.data[4]; // data[4] to skip past SPECIAL_SECTOR_SENTINEL
for (; i <= size; i++)
savData[i] = src[i];
if (ProgramFlashSectorAndVerify(sector, savDataBuffer) != 0)
@@ -895,11 +964,13 @@ u32 TryWriteSpecialSaveSection(u8 sector, u8* src)
return SAVE_STATUS_OK;
}
-#define tState data[0]
-#define tTimer data[1]
-#define tPartialSave data[2]
+#define tState data[0]
+#define tTimer data[1]
+#define tInBattleTower data[2]
-void Task_LinkSave(u8 taskId)
+// Note that this is very different from TrySavingData(SAVE_LINK).
+// Most notably it does save the PC data.
+void Task_LinkFullSave(u8 taskId)
{
s16* data = gTasks[taskId].data;
@@ -916,15 +987,15 @@ void Task_LinkSave(u8 taskId)
case 2:
if (IsLinkTaskFinished())
{
- if (!tPartialSave)
+ if (!tInBattleTower)
SaveMapView();
tState = 3;
}
break;
case 3:
- if (!tPartialSave)
+ if (!tInBattleTower)
SetContinueGameWarpStatusToDynamicWarp();
- sub_8153380();
+ LinkFullSave_Init();
tState = 4;
break;
case 4:
@@ -935,17 +1006,17 @@ void Task_LinkSave(u8 taskId)
}
break;
case 5:
- if (sub_81533AC())
+ if (LinkFullSave_WriteSector())
tState = 6;
else
- tState = 4;
+ tState = 4; // Not finished, delay again
break;
case 6:
- sub_81533E0();
+ LinkFullSave_ReplaceLastSector();
tState = 7;
break;
case 7:
- if (!tPartialSave)
+ if (!tInBattleTower)
ClearContinueGameWarpStatus2();
SetLinkStandbyCallback();
tState = 8;
@@ -953,7 +1024,7 @@ void Task_LinkSave(u8 taskId)
case 8:
if (IsLinkTaskFinished())
{
- sub_8153408();
+ LinkFullSave_SetLastSectorSecurity();
tState = 9;
}
break;
@@ -974,7 +1045,3 @@ void Task_LinkSave(u8 taskId)
break;
}
}
-
-#undef tState
-#undef tTimer
-#undef tPartialSave
diff --git a/src/save_failed_screen.c b/src/save_failed_screen.c
index e7bdc3400..9b32a938f 100644
--- a/src/save_failed_screen.c
+++ b/src/save_failed_screen.c
@@ -363,9 +363,10 @@ static bool8 VerifySectorWipe(u16 sector)
ReadFlash(sector, 0, (u8 *)ptr, SECTOR_SIZE);
- for (i = 0; i < 0x400; i++, ptr++)
+ // 1/4 because ptr is u32
+ for (i = 0; i < SECTOR_SIZE / 4; i++, ptr++)
if (*ptr)
- return TRUE;
+ return TRUE; // Sector has nonzero data, failed
return FALSE;
}
@@ -375,6 +376,7 @@ static bool8 WipeSector(u16 sector)
u16 i, j;
bool8 failed = TRUE;
+ // Attempt to wipe sector with an arbitrary attempt limit of 130
for (i = 0; failed && i < 130; i++)
{
for (j = 0; j < SECTOR_SIZE; j++)
diff --git a/src/start_menu.c b/src/start_menu.c
index ef4c67832..90230c3dd 100644
--- a/src/start_menu.c
+++ b/src/start_menu.c
@@ -1269,11 +1269,11 @@ static void Task_SaveAfterLinkBattle(u8 taskId)
break;
case 1:
SetContinueGameWarpStatusToDynamicWarp();
- FullSaveGame();
+ WriteSaveBlock2();
*state = 2;
break;
case 2:
- if (CheckSaveFile())
+ if (WriteSaveBlock1Sector())
{
ClearContinueGameWarpStatus2();
*state = 3;
@@ -1290,11 +1290,11 @@ static void Task_SaveAfterLinkBattle(u8 taskId)
DestroyTask(taskId);
break;
case 5:
- CreateTask(Task_LinkSave, 5);
+ CreateTask(Task_LinkFullSave, 5);
*state = 6;
break;
case 6:
- if (!FuncIsActiveTask(Task_LinkSave))
+ if (!FuncIsActiveTask(Task_LinkFullSave))
{
*state = 3;
}
@@ -1374,23 +1374,23 @@ static void RemoveSaveInfoWindow(void)
static void Task_WaitForBattleTowerLinkSave(u8 taskId)
{
- if (!FuncIsActiveTask(Task_LinkSave))
+ if (!FuncIsActiveTask(Task_LinkFullSave))
{
DestroyTask(taskId);
EnableBothScriptContexts();
}
}
-#define tPartialSave data[2]
+#define tInBattleTower data[2]
void SaveForBattleTowerLink(void)
{
- u8 taskId = CreateTask(Task_LinkSave, 5);
- gTasks[taskId].tPartialSave = TRUE;
+ u8 taskId = CreateTask(Task_LinkFullSave, 5);
+ gTasks[taskId].tInBattleTower = TRUE;
gTasks[CreateTask(Task_WaitForBattleTowerLinkSave, 6)].data[1] = taskId;
}
-#undef tPartialSave
+#undef tInBattleTower
static void HideStartMenuWindow(void)
{
diff --git a/src/strings.c b/src/strings.c
index 3785766ce..a77e67a84 100644
--- a/src/strings.c
+++ b/src/strings.c
@@ -1242,11 +1242,11 @@ const u8 gText_ContestantsMonWon[] = _("{STR_VAR_1}'s {STR_VAR_2} won!");
const u8 gText_CommunicationStandby[] = _("Communication standby…");
const u8 gText_ColorDarkGray[] = _("{COLOR DARK_GRAY}");
const u8 gText_ColorDynamic6WhiteDynamic5[] = _("{COLOR_HIGHLIGHT_SHADOW DYNAMIC_COLOR6 WHITE DYNAMIC_COLOR5}"); // Unused
-const u8 gText_HighlightDarkGray[] = _("{HIGHLIGHT DARK_GRAY}");
+const u8 gText_HealthboxNickname[] = _("{HIGHLIGHT DARK_GRAY}");
const u8 gText_EmptySpace2[] = _(" "); // Unused
-const u8 gText_DynColor2Male[] = _("{COLOR DYNAMIC_COLOR2}♂");
-const u8 gText_DynColor1Female[] = _("{COLOR DYNAMIC_COLOR1}♀");
-const u8 gText_DynColor2[] = _("{COLOR DYNAMIC_COLOR2}");
+const u8 gText_HealthboxGender_Male[] = _("{COLOR DYNAMIC_COLOR2}♂");
+const u8 gText_HealthboxGender_Female[] = _("{COLOR DYNAMIC_COLOR1}♀");
+const u8 gText_HealthboxGender_None[] = _("{COLOR DYNAMIC_COLOR2}");
const u8 gText_Upper[] = _("UPPER");
const u8 gText_Lower[] = _("lower");
const u8 gText_Others[] = _("OTHERS");
diff --git a/src/trade.c b/src/trade.c
index ffed77eef..a1e4f7094 100644
--- a/src/trade.c
+++ b/src/trade.c
@@ -4654,30 +4654,29 @@ static void CB2_SaveAndEndTrade(void)
MysteryGift_TryIncrementStat(CARD_STAT_NUM_TRADES, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);
SetContinueGameWarpStatusToDynamicWarp();
- sub_8153380();
+ LinkFullSave_Init();
gMain.state++;
sTradeData->timer = 0;
break;
case 51:
if (++sTradeData->timer == 5)
- {
gMain.state++;
- }
break;
case 52:
- if (sub_81533AC())
+ if (LinkFullSave_WriteSector())
{
ClearContinueGameWarpStatus2();
gMain.state = 4;
}
else
{
+ // Save isn't finished, delay again
sTradeData->timer = 0;
gMain.state = 51;
}
break;
case 4:
- sub_81533E0();
+ LinkFullSave_ReplaceLastSector();
gMain.state = 40;
sTradeData->timer = 0;
break;
@@ -4709,7 +4708,7 @@ static void CB2_SaveAndEndTrade(void)
case 42:
if (_IsLinkTaskFinished())
{
- sub_8153408();
+ LinkFullSave_SetLastSectorSecurity();
gMain.state = 5;
}
break;
@@ -4965,7 +4964,7 @@ static void CB2_SaveAndEndWirelessTrade(void)
StringExpandPlaceholders(gStringVar4, gText_SavingDontTurnOffPower);
DrawTextOnTradeWindow(0, gStringVar4, 0);
IncrementGameStat(GAME_STAT_POKEMON_TRADES);
- sub_8153380();
+ LinkFullSave_Init();
sTradeData->timer = 0;
}
break;
@@ -4974,7 +4973,7 @@ static void CB2_SaveAndEndWirelessTrade(void)
gMain.state = 4;
break;
case 4:
- if (sub_81533AC())
+ if (LinkFullSave_WriteSector())
{
gMain.state = 5;
}
@@ -4985,7 +4984,7 @@ static void CB2_SaveAndEndWirelessTrade(void)
}
break;
case 5:
- sub_81533E0();
+ LinkFullSave_ReplaceLastSector();
gMain.state = 6;
sTradeData->timer = 0;
break;
@@ -5013,7 +5012,7 @@ static void CB2_SaveAndEndWirelessTrade(void)
case 8:
if (_IsLinkTaskFinished())
{
- sub_8153408();
+ LinkFullSave_SetLastSectorSecurity();
gMain.state = 9;
}
break;