mirror of
https://github.com/zeldaret/oot.git
synced 2025-10-20 05:30:26 +00:00
Split SaveContext
into sub-structs (#1393)
* Split SaveContext struct * run formatter * Remove temporary-until-split stuff in z_sram * . * run formatter
This commit is contained in:
parent
e272186b5f
commit
6e7a6d4181
107 changed files with 1819 additions and 1751 deletions
|
@ -34,8 +34,8 @@
|
|||
|
||||
#define GET_ACTIVE_CAM(play) ((play)->cameraPtrs[(play)->activeCamId])
|
||||
|
||||
#define LINK_IS_ADULT (gSaveContext.linkAge == LINK_AGE_ADULT)
|
||||
#define LINK_IS_CHILD (gSaveContext.linkAge == LINK_AGE_CHILD)
|
||||
#define LINK_IS_ADULT (gSaveContext.save.linkAge == LINK_AGE_ADULT)
|
||||
#define LINK_IS_CHILD (gSaveContext.save.linkAge == LINK_AGE_CHILD)
|
||||
|
||||
#define YEARS_CHILD 5
|
||||
#define YEARS_ADULT 17
|
||||
|
@ -43,50 +43,50 @@
|
|||
|
||||
#define CLOCK_TIME(hr, min) ((s32)(((hr) * 60 + (min)) * (f32)0x10000 / (24 * 60) + 0.5f))
|
||||
|
||||
#define IS_DAY (gSaveContext.nightFlag == 0)
|
||||
#define IS_NIGHT (gSaveContext.nightFlag == 1)
|
||||
#define IS_DAY (gSaveContext.save.nightFlag == 0)
|
||||
#define IS_NIGHT (gSaveContext.save.nightFlag == 1)
|
||||
|
||||
#define SLOT(item) gItemSlots[item]
|
||||
#define INV_CONTENT(item) gSaveContext.inventory.items[SLOT(item)]
|
||||
#define AMMO(item) gSaveContext.inventory.ammo[SLOT(item)]
|
||||
#define INV_CONTENT(item) gSaveContext.save.info.inventory.items[SLOT(item)]
|
||||
#define AMMO(item) gSaveContext.save.info.inventory.ammo[SLOT(item)]
|
||||
#define BEANS_BOUGHT AMMO(ITEM_MAGIC_BEAN + 1)
|
||||
|
||||
#define ALL_EQUIP_VALUE(equip) ((s32)(gSaveContext.inventory.equipment & gEquipMasks[equip]) >> gEquipShifts[equip])
|
||||
#define CUR_EQUIP_VALUE(equip) ((s32)(gSaveContext.equips.equipment & gEquipMasks[equip]) >> gEquipShifts[equip])
|
||||
#define ALL_EQUIP_VALUE(equip) ((s32)(gSaveContext.save.info.inventory.equipment & gEquipMasks[equip]) >> gEquipShifts[equip])
|
||||
#define CUR_EQUIP_VALUE(equip) ((s32)(gSaveContext.save.info.equips.equipment & gEquipMasks[equip]) >> gEquipShifts[equip])
|
||||
#define OWNED_EQUIP_FLAG(equip, value) (gBitFlags[value] << gEquipShifts[equip])
|
||||
#define OWNED_EQUIP_FLAG_ALT(equip, value) ((1 << (value)) << gEquipShifts[equip])
|
||||
#define CHECK_OWNED_EQUIP(equip, value) (OWNED_EQUIP_FLAG(equip, value) & gSaveContext.inventory.equipment)
|
||||
#define CHECK_OWNED_EQUIP_ALT(equip, value) (gBitFlags[(value) + (equip) * 4] & gSaveContext.inventory.equipment)
|
||||
#define CHECK_OWNED_EQUIP(equip, value) (OWNED_EQUIP_FLAG(equip, value) & gSaveContext.save.info.inventory.equipment)
|
||||
#define CHECK_OWNED_EQUIP_ALT(equip, value) (gBitFlags[(value) + (equip) * 4] & gSaveContext.save.info.inventory.equipment)
|
||||
|
||||
#define SWORD_EQUIP_TO_PLAYER(swordEquip) (swordEquip)
|
||||
#define SHIELD_EQUIP_TO_PLAYER(shieldEquip) (shieldEquip)
|
||||
#define TUNIC_EQUIP_TO_PLAYER(tunicEquip) ((tunicEquip) - 1)
|
||||
#define BOOTS_EQUIP_TO_PLAYER(bootsEquip) ((bootsEquip) - 1)
|
||||
|
||||
#define CUR_UPG_VALUE(upg) ((s32)(gSaveContext.inventory.upgrades & gUpgradeMasks[upg]) >> gUpgradeShifts[upg])
|
||||
#define CUR_UPG_VALUE(upg) ((s32)(gSaveContext.save.info.inventory.upgrades & gUpgradeMasks[upg]) >> gUpgradeShifts[upg])
|
||||
#define CAPACITY(upg, value) gUpgradeCapacities[upg][value]
|
||||
#define CUR_CAPACITY(upg) CAPACITY(upg, CUR_UPG_VALUE(upg))
|
||||
|
||||
#define CHECK_QUEST_ITEM(item) (gBitFlags[item] & gSaveContext.inventory.questItems)
|
||||
#define CHECK_DUNGEON_ITEM(item, dungeonIndex) (gSaveContext.inventory.dungeonItems[dungeonIndex] & gBitFlags[item])
|
||||
#define CHECK_QUEST_ITEM(item) (gBitFlags[item] & gSaveContext.save.info.inventory.questItems)
|
||||
#define CHECK_DUNGEON_ITEM(item, dungeonIndex) (gSaveContext.save.info.inventory.dungeonItems[dungeonIndex] & gBitFlags[item])
|
||||
|
||||
#define GET_GS_FLAGS(index) \
|
||||
((gSaveContext.gsFlags[(index) >> 2] & gGsFlagsMasks[(index) & 3]) >> gGsFlagsShifts[(index) & 3])
|
||||
((gSaveContext.save.info.gsFlags[(index) >> 2] & gGsFlagsMasks[(index) & 3]) >> gGsFlagsShifts[(index) & 3])
|
||||
#define SET_GS_FLAGS(index, value) \
|
||||
(gSaveContext.gsFlags[(index) >> 2] |= (value) << gGsFlagsShifts[(index) & 3])
|
||||
(gSaveContext.save.info.gsFlags[(index) >> 2] |= (value) << gGsFlagsShifts[(index) & 3])
|
||||
|
||||
#define HIGH_SCORE(score) (gSaveContext.highScores[score])
|
||||
#define HIGH_SCORE(score) (gSaveContext.save.info.highScores[score])
|
||||
|
||||
#define GET_EVENTCHKINF(flag) (gSaveContext.eventChkInf[(flag) >> 4] & (1 << ((flag) & 0xF)))
|
||||
#define SET_EVENTCHKINF(flag) (gSaveContext.eventChkInf[(flag) >> 4] |= (1 << ((flag) & 0xF)))
|
||||
#define CLEAR_EVENTCHKINF(flag) (gSaveContext.eventChkInf[(flag) >> 4] &= ~(1 << ((flag) & 0xF)))
|
||||
#define GET_EVENTCHKINF(flag) (gSaveContext.save.info.eventChkInf[(flag) >> 4] & (1 << ((flag) & 0xF)))
|
||||
#define SET_EVENTCHKINF(flag) (gSaveContext.save.info.eventChkInf[(flag) >> 4] |= (1 << ((flag) & 0xF)))
|
||||
#define CLEAR_EVENTCHKINF(flag) (gSaveContext.save.info.eventChkInf[(flag) >> 4] &= ~(1 << ((flag) & 0xF)))
|
||||
|
||||
#define GET_ITEMGETINF(flag) (gSaveContext.itemGetInf[(flag) >> 4] & (1 << ((flag) & 0xF)))
|
||||
#define SET_ITEMGETINF(flag) (gSaveContext.itemGetInf[(flag) >> 4] |= (1 << ((flag) & 0xF)))
|
||||
#define GET_ITEMGETINF(flag) (gSaveContext.save.info.itemGetInf[(flag) >> 4] & (1 << ((flag) & 0xF)))
|
||||
#define SET_ITEMGETINF(flag) (gSaveContext.save.info.itemGetInf[(flag) >> 4] |= (1 << ((flag) & 0xF)))
|
||||
|
||||
#define GET_INFTABLE(flag) (gSaveContext.infTable[(flag) >> 4] & (1 << ((flag) & 0xF)))
|
||||
#define SET_INFTABLE(flag) (gSaveContext.infTable[(flag) >> 4] |= (1 << ((flag) & 0xF)))
|
||||
#define CLEAR_INFTABLE(flag) (gSaveContext.infTable[(flag) >> 4] &= ~(1 << ((flag) & 0xF)))
|
||||
#define GET_INFTABLE(flag) (gSaveContext.save.info.infTable[(flag) >> 4] & (1 << ((flag) & 0xF)))
|
||||
#define SET_INFTABLE(flag) (gSaveContext.save.info.infTable[(flag) >> 4] |= (1 << ((flag) & 0xF)))
|
||||
#define CLEAR_INFTABLE(flag) (gSaveContext.save.info.infTable[(flag) >> 4] &= ~(1 << ((flag) & 0xF)))
|
||||
|
||||
#define GET_EVENTINF(flag) (gSaveContext.eventInf[(flag) >> 4] & (1 << ((flag) & 0xF)))
|
||||
#define SET_EVENTINF(flag) (gSaveContext.eventInf[(flag) >> 4] |= (1 << ((flag) & 0xF)))
|
||||
|
@ -94,12 +94,12 @@
|
|||
|
||||
#define B_BTN_ITEM ((gSaveContext.buttonStatus[0] == ITEM_NONE) \
|
||||
? ITEM_NONE \
|
||||
: (gSaveContext.equips.buttonItems[0] == ITEM_GIANTS_KNIFE) \
|
||||
: (gSaveContext.save.info.equips.buttonItems[0] == ITEM_GIANTS_KNIFE) \
|
||||
? ITEM_SWORD_BIGGORON \
|
||||
: gSaveContext.equips.buttonItems[0])
|
||||
: gSaveContext.save.info.equips.buttonItems[0])
|
||||
|
||||
#define C_BTN_ITEM(button) ((gSaveContext.buttonStatus[(button) + 1] != BTN_DISABLED) \
|
||||
? gSaveContext.equips.buttonItems[(button) + 1] \
|
||||
? gSaveContext.save.info.equips.buttonItems[(button) + 1] \
|
||||
: ITEM_NONE)
|
||||
|
||||
#define CHECK_BTN_ALL(state, combo) (~((state) | ~(combo)) == 0)
|
||||
|
|
|
@ -171,58 +171,72 @@ typedef enum {
|
|||
#define ENV_HAZARD_TEXT_TRIGGER_HOTROOM (1 << 0)
|
||||
#define ENV_HAZARD_TEXT_TRIGGER_UNDERWATER (1 << 1)
|
||||
|
||||
// offsets in SavePlayerData and SaveContext/Save
|
||||
typedef struct {
|
||||
/* 0x0000 */ s32 entranceIndex; // start of `save` substruct, originally called "memory"
|
||||
/* 0x0004 */ s32 linkAge; // 0: Adult; 1: Child (see enum `LinkAge`)
|
||||
/* 0x0008 */ s32 cutsceneIndex;
|
||||
/* 0x000C */ u16 dayTime; // "zelda_time"
|
||||
/* 0x0010 */ s32 nightFlag;
|
||||
/* 0x0014 */ s32 totalDays;
|
||||
/* 0x0018 */ s32 bgsDayCount; // increments with totalDays, can be cleared with `Environment_ClearBgsDayCount`
|
||||
/* 0x001C */ char newf[6]; // string "ZELDAZ". start of `info` substruct, originally called "information"
|
||||
/* 0x0022 */ u16 deaths;
|
||||
/* 0x0024 */ char playerName[8];
|
||||
/* 0x002C */ s16 n64ddFlag;
|
||||
/* 0x002E */ s16 healthCapacity; // "max_life"
|
||||
/* 0x0030 */ s16 health; // "now_life"
|
||||
/* 0x0032 */ s8 magicLevel; // 0 for no magic/new load, 1 for magic, 2 for double magic
|
||||
/* 0x0033 */ s8 magic; // current magic available for use
|
||||
/* 0x0034 */ s16 rupees;
|
||||
/* 0x0036 */ u16 swordHealth;
|
||||
/* 0x0038 */ u16 naviTimer;
|
||||
/* 0x003A */ u8 isMagicAcquired;
|
||||
/* 0x003B */ char unk_3B[0x01];
|
||||
/* 0x003C */ u8 isDoubleMagicAcquired;
|
||||
/* 0x003D */ u8 isDoubleDefenseAcquired;
|
||||
/* 0x003E */ u8 bgsFlag;
|
||||
/* 0x003F */ u8 ocarinaGameRoundNum;
|
||||
/* 0x0040 */ ItemEquips childEquips;
|
||||
/* 0x004A */ ItemEquips adultEquips;
|
||||
/* 0x0054 */ u32 unk_54; // this may be incorrect, currently used for alignment
|
||||
/* 0x0058 */ char unk_58[0x0E];
|
||||
/* 0x0066 */ s16 savedSceneId;
|
||||
/* 0x0068 */ ItemEquips equips;
|
||||
/* 0x0074 */ Inventory inventory;
|
||||
/* 0x00D4 */ SavedSceneFlags sceneFlags[124];
|
||||
/* 0x0E64 */ FaroresWindData fw;
|
||||
/* 0x0E8C */ char unk_E8C[0x10];
|
||||
/* 0x0E9C */ s32 gsFlags[6];
|
||||
/* 0x0EB4 */ char unk_EB4[0x4];
|
||||
/* 0x0EB8 */ s32 highScores[7];
|
||||
/* 0x0ED4 */ u16 eventChkInf[14]; // "event_chk_inf"
|
||||
/* 0x0EF0 */ u16 itemGetInf[4]; // "item_get_inf"
|
||||
/* 0x0EF8 */ u16 infTable[30]; // "inf_table"
|
||||
/* 0x0F34 */ char unk_F34[0x04];
|
||||
/* 0x0F38 */ u32 worldMapAreaData; // "area_arrival"
|
||||
/* 0x0F3C */ char unk_F3C[0x4];
|
||||
/* 0x0F40 */ u8 scarecrowLongSongSet;
|
||||
/* 0x0F41 */ u8 scarecrowLongSong[0x360];
|
||||
/* 0x12A1 */ char unk_12A1[0x24];
|
||||
/* 0x12C5 */ u8 scarecrowSpawnSongSet;
|
||||
/* 0x12C6 */ u8 scarecrowSpawnSong[0x80];
|
||||
/* 0x1346 */ char unk_1346[0x02];
|
||||
/* 0x1348 */ HorseData horseData;
|
||||
/* 0x1352 */ u16 checksum; // "check_sum"
|
||||
/* 0x00 0x001C */ char newf[6]; // string "ZELDAZ"
|
||||
/* 0x06 0x0022 */ u16 deaths;
|
||||
/* 0x08 0x0024 */ char playerName[8];
|
||||
/* 0x10 0x002C */ s16 n64ddFlag;
|
||||
/* 0x12 0x002E */ s16 healthCapacity; // "max_life"
|
||||
/* 0x14 0x0030 */ s16 health; // "now_life"
|
||||
/* 0x16 0x0032 */ s8 magicLevel; // 0 for no magic/new load, 1 for magic, 2 for double magic
|
||||
/* 0x17 0x0033 */ s8 magic; // current magic available for use
|
||||
/* 0x18 0x0034 */ s16 rupees;
|
||||
/* 0x1A 0x0036 */ u16 swordHealth;
|
||||
/* 0x1C 0x0038 */ u16 naviTimer;
|
||||
/* 0x1E 0x003A */ u8 isMagicAcquired;
|
||||
/* 0x1F 0x003B */ char unk_3B[0x01];
|
||||
/* 0x20 0x003C */ u8 isDoubleMagicAcquired;
|
||||
/* 0x21 0x003D */ u8 isDoubleDefenseAcquired;
|
||||
/* 0x22 0x003E */ u8 bgsFlag;
|
||||
/* 0x23 0x003F */ u8 ocarinaGameRoundNum;
|
||||
/* 0x24 0x0040 */ ItemEquips childEquips;
|
||||
/* 0x2E 0x004A */ ItemEquips adultEquips;
|
||||
/* 0x38 0x0054 */ u32 unk_54; // this may be incorrect, currently used for alignment
|
||||
/* 0x3C 0x0058 */ char unk_58[0x0E];
|
||||
/* 0x4A 0x0066 */ s16 savedSceneId;
|
||||
} SavePlayerData;
|
||||
|
||||
// offsets in SaveInfo and SaveContext/Save
|
||||
typedef struct {
|
||||
/* 0x0000 0x001C */ SavePlayerData playerData; // "S_Private"
|
||||
/* 0x004C 0x0068 */ ItemEquips equips;
|
||||
/* 0x0058 0x0074 */ Inventory inventory;
|
||||
/* 0x00B8 0x00D4 */ SavedSceneFlags sceneFlags[124];
|
||||
/* 0x0E48 0x0E64 */ FaroresWindData fw;
|
||||
/* 0x0E70 0x0E8C */ char unk_E8C[0x10];
|
||||
/* 0x0E80 0x0E9C */ s32 gsFlags[6];
|
||||
/* 0x0E98 0x0EB4 */ char unk_EB4[0x4];
|
||||
/* 0x0E9C 0x0EB8 */ s32 highScores[7];
|
||||
/* 0x0EB8 0x0ED4 */ u16 eventChkInf[14]; // "event_chk_inf"
|
||||
/* 0x0ED4 0x0EF0 */ u16 itemGetInf[4]; // "item_get_inf"
|
||||
/* 0x0EDC 0x0EF8 */ u16 infTable[30]; // "inf_table"
|
||||
/* 0x0F18 0x0F34 */ char unk_F34[0x04];
|
||||
/* 0x0F1C 0x0F38 */ u32 worldMapAreaData; // "area_arrival"
|
||||
/* 0x0F20 0x0F3C */ char unk_F3C[0x4];
|
||||
/* 0x0F24 0x0F40 */ u8 scarecrowLongSongSet;
|
||||
/* 0x0F25 0x0F41 */ u8 scarecrowLongSong[0x360];
|
||||
/* 0x1285 0x12A1 */ char unk_12A1[0x24];
|
||||
/* 0x12A9 0x12C5 */ u8 scarecrowSpawnSongSet;
|
||||
/* 0x12AA 0x12C6 */ u8 scarecrowSpawnSong[0x80];
|
||||
/* 0x132A 0x1346 */ char unk_1346[0x02];
|
||||
/* 0x132C 0x1348 */ HorseData horseData;
|
||||
/* 0x1336 0x1352 */ u16 checksum; // "check_sum"
|
||||
} SaveInfo;
|
||||
|
||||
typedef struct {
|
||||
/* 0x00 */ s32 entranceIndex;
|
||||
/* 0x04 */ s32 linkAge; // 0: Adult; 1: Child (see enum `LinkAge`)
|
||||
/* 0x08 */ s32 cutsceneIndex;
|
||||
/* 0x0C */ u16 dayTime; // "zelda_time"
|
||||
/* 0x10 */ s32 nightFlag;
|
||||
/* 0x14 */ s32 totalDays;
|
||||
/* 0x18 */ s32 bgsDayCount; // increments with totalDays, can be cleared with `Environment_ClearBgsDayCount`
|
||||
/* 0x1C */ SaveInfo info; // "information"
|
||||
} Save;
|
||||
|
||||
typedef struct {
|
||||
/* 0x0000 */ Save save; // "memory"
|
||||
/* 0x1354 */ s32 fileNum; // "file_no"
|
||||
/* 0x1358 */ char unk_1358[0x0004];
|
||||
/* 0x135C */ s32 gameMode;
|
||||
|
@ -464,7 +478,7 @@ typedef enum {
|
|||
| EVENTCHKINF_CARPENTERS_FREE_MASK(2) \
|
||||
| EVENTCHKINF_CARPENTERS_FREE_MASK(3) )
|
||||
#define GET_EVENTCHKINF_CARPENTERS_FREE_ALL() \
|
||||
CHECK_FLAG_ALL(gSaveContext.eventChkInf[EVENTCHKINF_CARPENTERS_FREE_INDEX], EVENTCHKINF_CARPENTERS_FREE_MASK_ALL)
|
||||
CHECK_FLAG_ALL(gSaveContext.save.info.eventChkInf[EVENTCHKINF_CARPENTERS_FREE_INDEX], EVENTCHKINF_CARPENTERS_FREE_MASK_ALL)
|
||||
|
||||
#define EVENTCHKINF_94 0x94
|
||||
#define EVENTCHKINF_95 0x95
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue