Add SaveInfo substruct to SaveContext (#1191)

* SaveInfo

* fix accesses in sram_NES.c

* some more fixing

* more fixes

* format

* fix unk

* namefixer

* format

* bss

* review

* weekeventregconvert

* namefixer

* bss
This commit is contained in:
Anghelo Carvajal
2023-04-18 18:54:32 -04:00
committed by GitHub
parent b8af819165
commit 3c107cb148
81 changed files with 1126 additions and 1051 deletions
+1 -1
View File
@@ -60,7 +60,7 @@
#define CUR_CAPACITY(upg) CAPACITY(upg, CUR_UPG_VALUE(upg))
// To be used with `Magic_Add`, but ensures enough magic is added to fill the magic bar to capacity
#define MAGIC_FILL_TO_CAPACITY (((void)0, gSaveContext.magicFillTarget) + (gSaveContext.save.playerData.isDoubleMagicAcquired + 1) * MAGIC_NORMAL_METER)
#define MAGIC_FILL_TO_CAPACITY (((void)0, gSaveContext.magicFillTarget) + (gSaveContext.save.saveInfo.playerData.isDoubleMagicAcquired + 1) * MAGIC_NORMAL_METER)
#define CONTROLLER1(gameState) (&(gameState)->input[0])
#define CONTROLLER2(gameState) (&(gameState)->input[1])
+86 -82
View File
@@ -252,61 +252,65 @@ typedef struct SavePlayerData {
/* 0x26 */ s16 savedSceneId; // "scene_data_ID"
} SavePlayerData; // size = 0x28
typedef struct SaveInfo {
/* 0x000 */ SavePlayerData playerData;
/* 0x028 */ ItemEquips equips;
/* 0x04C */ Inventory inventory;
/* 0x0D4 */ PermanentSceneFlags permanentSceneFlags[120];
/* 0xDF4 */ UNK_TYPE1 unk_DF4[0x54];
/* 0xE48 */ u32 dekuPlaygroundHighScores[3];
/* 0xE54 */ u32 pictoFlags0; // Flags set by `PictoActor`s if pictograph is valid
/* 0xE58 */ u32 pictoFlags1; // Flags set by Snap_ValidatePictograph() to record errors; volatile since that function is run many times in succession
/* 0xE5C */ u32 unk_E5C;
/* 0xE60 */ u32 unk_E60;
/* 0xE64 */ u32 unk_E64[7]; // Invadepoh flags
/* 0xE80 */ u32 scenesVisible[7]; // tingle maps and clouded regions on pause map. Stores scenes bitwise for up to 224 scenes even though there are not that many scenes
/* 0xE9C */ u32 skullTokenCount; // upper 16 bits store Swamp skulls, lower 16 bits store Ocean skulls
/* 0xEA0 */ u32 unk_EA0; // Gossic stone heart piece flags
/* 0xEA4 */ u32 unk_EA4;
/* 0xEA8 */ u32 unk_EA8[2]; // Related to blue warps
/* 0xEB0 */ u32 stolenItems; // Items stolen by Takkuri and given to Curiosity Shop Man
/* 0xEB4 */ u32 unk_EB4;
/* 0xEB8 */ u32 bankRupees;
/* 0xEBC */ u32 unk_EBC;
/* 0xEC0 */ u32 unk_EC0; // Fishing flags
/* 0xEC4 */ u32 unk_EC4;
/* 0xEC8 */ u32 horseBackBalloonHighScore;
/* 0xECC */ u32 lotteryCodeGuess; // Lottery code chosen by player (only uses lower three hex digits)
/* 0xED0 */ u32 shootingGalleryHighScores; // High scores for both shooting galleries. Town uses lower 16 bits, Swamp uses higher 16 bits.
/* 0xED4 */ u8 weekEventReg[100]; // "week_event_reg"
/* 0xF38 */ u32 regionsVisited; // "area_arrival"
/* 0xF3C */ u32 worldMapCloudVisibility; // "cloud_clear"
/* 0xF40 */ u8 unk_F40; // "oca_rec_flag" has scarecrows song
/* 0xF41 */ u8 unk_F41; // "oca_rec_flag8" scarecrows song set?
/* 0xF42 */ u8 scarecrowSpawnSong[128];
/* 0xFC2 */ s8 bombersCaughtNum; // "aikotoba_index"
/* 0xFC3 */ s8 bombersCaughtOrder[5]; // "aikotoba_table"
/* 0xFC8 */ s8 lotteryCodes[3][3]; // "numbers_table", Preset lottery codes
/* 0xFD1 */ s8 spiderHouseMaskOrder[6]; // "kinsta_color_table"
/* 0xFD7 */ s8 bomberCode[5]; // "bombers_aikotoba_table"
/* 0xFDC */ HorseData horseData;
/* 0xFE6 */ u16 checksum; // "check_sum"
} SaveInfo; // size = 0xFE8
typedef struct Save {
/* 0x0000 */ s32 entrance; // "scene_no"
/* 0x0004 */ u8 equippedMask; // "player_mask"
/* 0x0005 */ u8 isFirstCycle; // "opening_flag"
/* 0x0006 */ u8 unk_06;
/* 0x0007 */ u8 linkAge; // "link_age"
/* 0x0008 */ s32 cutscene; // "day_time"
/* 0x000C */ u16 time; // "zelda_time"
/* 0x000E */ u16 owlSaveLocation;
/* 0x0010 */ s32 isNight; // "asahiru_fg"
/* 0x0014 */ s32 timeSpeedOffset; // "change_zelda_time"
/* 0x0018 */ s32 day; // "totalday"
/* 0x001C */ s32 daysElapsed; // "eventday"
/* 0x0020 */ u8 playerForm; // "player_character"
/* 0x0021 */ u8 snowheadCleared; // "spring_flag"
/* 0x0022 */ u8 hasTatl; // "bell_flag"
/* 0x0023 */ u8 isOwlSave;
/* 0x0024 */ SavePlayerData playerData;
/* 0x004C */ ItemEquips equips;
/* 0x0070 */ Inventory inventory;
/* 0x00F8 */ PermanentSceneFlags permanentSceneFlags[120];
/* 0x0E18 */ u8 unk_E18[0x54];
/* 0x0E6C */ u32 dekuPlaygroundHighScores[3];
/* 0x0E78 */ u32 pictoFlags0; // Flags set by `PictoActor`s if pictograph is valid
/* 0x0E7C */ u32 pictoFlags1; // Flags set by Snap_ValidatePictograph() to record errors; volatile since that function is run many times in succession
/* 0x0E80 */ u32 unk_E80;
/* 0x0E84 */ u32 unk_E84;
/* 0x0E88 */ u32 unk_E88[7]; // Invadepoh flags
/* 0x0EA4 */ u32 scenesVisible[7]; // tingle maps and clouded regions on pause map. Stores scenes bitwise for up to 224 scenes even though there are not that many scenes
/* 0x0EC0 */ u32 skullTokenCount; // upper 16 bits store Swamp skulls, lower 16 bits store Ocean skulls
/* 0x0EC4 */ u32 unk_EC4; // Gossic stone heart piece flags
/* 0x0EC8 */ u32 unk_EC8;
/* 0x0ECC */ u32 unk_ECC[2]; // Related to blue warps
/* 0x0ED4 */ u32 stolenItems; // Items stolen by Takkuri and given to Curiosity Shop Man
/* 0x0ED8 */ u32 unk_DD8;
/* 0x0EDC */ u32 bankRupees;
/* 0x0EE0 */ u32 unk_EE0;
/* 0x0EE4 */ u32 unk_EE4; // Fishing flags
/* 0x0EE8 */ u32 unk_EE8;
/* 0x0EEC */ u32 horseBackBalloonHighScore;
/* 0x0EF0 */ u32 lotteryCodeGuess; // Lottery code chosen by player (only uses lower three hex digits)
/* 0x0EF4 */ u32 shootingGalleryHighScores; // High scores for both shooting galleries. Town uses lower 16 bits, Swamp uses higher 16 bits.
/* 0x0EF8 */ u8 weekEventReg[100]; // "week_event_reg"
/* 0x0F5C */ u32 regionsVisited; // "area_arrival"
/* 0x0F60 */ u32 worldMapCloudVisibility; // "cloud_clear"
/* 0x0F64 */ u8 unk_F64; // "oca_rec_flag" has scarecrows song
/* 0x0F65 */ u8 unk_F65; // "oca_rec_flag8" scarecrows song set?
/* 0x0F66 */ u8 scarecrowSpawnSong[128];
/* 0x0FE6 */ s8 bombersCaughtNum; // "aikotoba_index"
/* 0x0FE7 */ s8 bombersCaughtOrder[5]; // "aikotoba_table"
/* 0x0FEC */ s8 lotteryCodes[3][3]; // "numbers_table", Preset lottery codes
/* 0x0FF5 */ s8 spiderHouseMaskOrder[6]; // "kinsta_color_table"
/* 0x0FFB */ s8 bomberCode[5]; // "bombers_aikotoba_table"
/* 0x1000 */ HorseData horseData;
/* 0x100A */ u16 checksum; // "check_sum"
/* 0x00 */ s32 entrance; // "scene_no"
/* 0x04 */ u8 equippedMask; // "player_mask"
/* 0x05 */ u8 isFirstCycle; // "opening_flag"
/* 0x06 */ u8 unk_06;
/* 0x07 */ u8 linkAge; // "link_age"
/* 0x08 */ s32 cutscene; // "day_time"
/* 0x0C */ u16 time; // "zelda_time"
/* 0x0E */ u16 owlSaveLocation;
/* 0x10 */ s32 isNight; // "asahiru_fg"
/* 0x14 */ s32 timeSpeedOffset; // "change_zelda_time"
/* 0x18 */ s32 day; // "totalday"
/* 0x1C */ s32 daysElapsed; // "eventday"
/* 0x20 */ u8 playerForm; // "player_character"
/* 0x21 */ u8 snowheadCleared; // "spring_flag"
/* 0x22 */ u8 hasTatl; // "bell_flag"
/* 0x23 */ u8 isOwlSave;
/* 0x24 */ SaveInfo saveInfo;
} Save; // size = 0x100C
typedef struct SaveContext {
@@ -429,41 +433,41 @@ typedef enum {
#define GET_PLAYER_FORM ((void)0, gSaveContext.save.playerForm)
#define SLOT(item) gItemSlots[item]
#define AMMO(item) gSaveContext.save.inventory.ammo[SLOT(item)]
#define INV_CONTENT(item) gSaveContext.save.inventory.items[SLOT(item)]
#define GET_INV_CONTENT(item) ((void)0, gSaveContext.save.inventory.items)[SLOT(item)]
#define AMMO(item) gSaveContext.save.saveInfo.inventory.ammo[SLOT(item)]
#define INV_CONTENT(item) gSaveContext.save.saveInfo.inventory.items[SLOT(item)]
#define GET_INV_CONTENT(item) ((void)0, gSaveContext.save.saveInfo.inventory.items)[SLOT(item)]
#define CUR_FORM ((gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) ? 0 : gSaveContext.save.playerForm)
#define GET_SAVE_EQUIPS_EQUIPMENT ((void)0, gSaveContext.save.equips.equipment)
#define GET_SAVE_INVENTORY_UPGRADES ((void)0, gSaveContext.save.inventory.upgrades)
#define GET_SAVE_INVENTORY_QUEST_ITEMS ((void)0, gSaveContext.save.inventory.questItems)
#define GET_SAVE_EQUIPS_EQUIPMENT ((void)0, gSaveContext.save.saveInfo.equips.equipment)
#define GET_SAVE_INVENTORY_UPGRADES ((void)0, gSaveContext.save.saveInfo.inventory.upgrades)
#define GET_SAVE_INVENTORY_QUEST_ITEMS ((void)0, gSaveContext.save.saveInfo.inventory.questItems)
#define GET_CUR_EQUIP_VALUE(equip) ((GET_SAVE_EQUIPS_EQUIPMENT & gEquipMasks[equip]) >> gEquipShifts[equip])
#define CUR_UPG_VALUE(upg) ((gSaveContext.save.inventory.upgrades & gUpgradeMasks[upg]) >> gUpgradeShifts[upg])
#define CUR_UPG_VALUE(upg) ((gSaveContext.save.saveInfo.inventory.upgrades & gUpgradeMasks[upg]) >> gUpgradeShifts[upg])
#define GET_CUR_UPG_VALUE(upg) ((GET_SAVE_INVENTORY_UPGRADES & gUpgradeMasks[upg]) >> gUpgradeShifts[upg])
#define SET_EQUIP_VALUE(equip, value) (gSaveContext.save.equips.equipment = ((GET_SAVE_EQUIPS_EQUIPMENT & gEquipNegMasks[equip]) | (u16)((u16)(value) << gEquipShifts[equip])))
#define SET_EQUIP_VALUE(equip, value) (gSaveContext.save.saveInfo.equips.equipment = ((GET_SAVE_EQUIPS_EQUIPMENT & gEquipNegMasks[equip]) | (u16)((u16)(value) << gEquipShifts[equip])))
#define BUTTON_ITEM_EQUIP(form, button) (gSaveContext.save.equips.buttonItems[form][button])
#define BUTTON_ITEM_EQUIP(form, button) (gSaveContext.save.saveInfo.equips.buttonItems[form][button])
#define CUR_FORM_EQUIP(button) BUTTON_ITEM_EQUIP(CUR_FORM, button)
#define C_SLOT_EQUIP(form, button) (gSaveContext.save.equips.cButtonSlots[form][button])
#define C_SLOT_EQUIP(form, button) (gSaveContext.save.saveInfo.equips.cButtonSlots[form][button])
#define CHECK_QUEST_ITEM(item) (GET_SAVE_INVENTORY_QUEST_ITEMS & gBitFlags[item])
#define SET_QUEST_ITEM(item) (gSaveContext.save.inventory.questItems = (GET_SAVE_INVENTORY_QUEST_ITEMS | gBitFlags[item]))
#define REMOVE_QUEST_ITEM(item) (gSaveContext.save.inventory.questItems = (GET_SAVE_INVENTORY_QUEST_ITEMS & (-1 - gBitFlags[item])))
#define SET_QUEST_ITEM(item) (gSaveContext.save.saveInfo.inventory.questItems = (GET_SAVE_INVENTORY_QUEST_ITEMS | gBitFlags[item]))
#define REMOVE_QUEST_ITEM(item) (gSaveContext.save.saveInfo.inventory.questItems = (GET_SAVE_INVENTORY_QUEST_ITEMS & (-1 - gBitFlags[item])))
#define GET_QUEST_HEART_PIECE_COUNT ((GET_SAVE_INVENTORY_QUEST_ITEMS & 0xF0000000) >> QUEST_HEART_PIECE_COUNT)
#define EQ_MAX_QUEST_HEART_PIECE_COUNT ((GET_SAVE_INVENTORY_QUEST_ITEMS & 0xF0000000) == (4 << QUEST_HEART_PIECE_COUNT))
#define LEQ_MAX_QUEST_HEART_PIECE_COUNT ((GET_SAVE_INVENTORY_QUEST_ITEMS & 0xF0000000) <= (4 << QUEST_HEART_PIECE_COUNT))
#define INCREMENT_QUEST_HEART_PIECE_COUNT (gSaveContext.save.inventory.questItems += (1 << QUEST_HEART_PIECE_COUNT))
#define DECREMENT_QUEST_HEART_PIECE_COUNT (gSaveContext.save.inventory.questItems -= (1 << QUEST_HEART_PIECE_COUNT))
#define RESET_HEART_PIECE_COUNT (gSaveContext.save.inventory.questItems ^= (4 << QUEST_HEART_PIECE_COUNT))
#define INCREMENT_QUEST_HEART_PIECE_COUNT (gSaveContext.save.saveInfo.inventory.questItems += (1 << QUEST_HEART_PIECE_COUNT))
#define DECREMENT_QUEST_HEART_PIECE_COUNT (gSaveContext.save.saveInfo.inventory.questItems -= (1 << QUEST_HEART_PIECE_COUNT))
#define RESET_HEART_PIECE_COUNT (gSaveContext.save.saveInfo.inventory.questItems ^= (4 << QUEST_HEART_PIECE_COUNT))
#define CHECK_DUNGEON_ITEM(item, dungeonIndex) (gSaveContext.save.inventory.dungeonItems[(void)0, dungeonIndex] & gBitFlags[item])
#define SET_DUNGEON_ITEM(item, dungeonIndex) (gSaveContext.save.inventory.dungeonItems[(void)0, dungeonIndex] |= (u8)gBitFlags[item])
#define DUNGEON_KEY_COUNT(dungeonIndex) (gSaveContext.save.inventory.dungeonKeys[(void)0, dungeonIndex])
#define CHECK_DUNGEON_ITEM(item, dungeonIndex) (gSaveContext.save.saveInfo.inventory.dungeonItems[(void)0, dungeonIndex] & gBitFlags[item])
#define SET_DUNGEON_ITEM(item, dungeonIndex) (gSaveContext.save.saveInfo.inventory.dungeonItems[(void)0, dungeonIndex] |= (u8)gBitFlags[item])
#define DUNGEON_KEY_COUNT(dungeonIndex) (gSaveContext.save.saveInfo.inventory.dungeonKeys[(void)0, dungeonIndex])
#define GET_CUR_FORM_BTN_ITEM(btn) ((u8)((btn) == EQUIP_SLOT_B ? BUTTON_ITEM_EQUIP(CUR_FORM, btn) : BUTTON_ITEM_EQUIP(0, btn)))
#define GET_CUR_FORM_BTN_SLOT(btn) ((u8)((btn) == EQUIP_SLOT_B ? C_SLOT_EQUIP(CUR_FORM, btn) : C_SLOT_EQUIP(0, btn)))
@@ -491,21 +495,21 @@ typedef enum {
#define STOLEN_ITEM_NONE (0)
#define STOLEN_ITEM_1 ((gSaveContext.save.stolenItems & 0xFF000000) >> 0x18)
#define STOLEN_ITEM_2 ((gSaveContext.save.stolenItems & 0x00FF0000) >> 0x10)
#define STOLEN_ITEM_1 ((gSaveContext.save.saveInfo.stolenItems & 0xFF000000) >> 0x18)
#define STOLEN_ITEM_2 ((gSaveContext.save.saveInfo.stolenItems & 0x00FF0000) >> 0x10)
#define SET_STOLEN_ITEM_1(itemId) \
(gSaveContext.save.stolenItems = (gSaveContext.save.stolenItems & ~0xFF000000) | ((itemId & 0xFF) << 0x18))
(gSaveContext.save.saveInfo.stolenItems = (gSaveContext.save.saveInfo.stolenItems & ~0xFF000000) | ((itemId & 0xFF) << 0x18))
#define SET_STOLEN_ITEM_2(itemId) \
(gSaveContext.save.stolenItems = (gSaveContext.save.stolenItems & ~0x00FF0000) | ((itemId & 0xFF) << 0x10))
(gSaveContext.save.saveInfo.stolenItems = (gSaveContext.save.saveInfo.stolenItems & ~0x00FF0000) | ((itemId & 0xFF) << 0x10))
#define GET_TOWN_SHOOTING_GALLERY_HIGH_SCORE() ((s32)(gSaveContext.save.shootingGalleryHighScores & 0xFFFF))
#define GET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE() ((s32)((gSaveContext.save.shootingGalleryHighScores & 0xFFFF0000) >> 0x10))
#define SET_TOWN_SHOOTING_GALLERY_HIGH_SCORE(score) (gSaveContext.save.shootingGalleryHighScores = (gSaveContext.save.shootingGalleryHighScores & 0xFFFF0000) | ((u16)(score)))
#define SET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE(score) (gSaveContext.save.shootingGalleryHighScores = ((gSaveContext.save.shootingGalleryHighScores) & 0xFFFF) | ((u16)(score) << 0x10))
#define GET_TOWN_SHOOTING_GALLERY_HIGH_SCORE() ((s32)(gSaveContext.save.saveInfo.shootingGalleryHighScores & 0xFFFF))
#define GET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE() ((s32)((gSaveContext.save.saveInfo.shootingGalleryHighScores & 0xFFFF0000) >> 0x10))
#define SET_TOWN_SHOOTING_GALLERY_HIGH_SCORE(score) (gSaveContext.save.saveInfo.shootingGalleryHighScores = (gSaveContext.save.saveInfo.shootingGalleryHighScores & 0xFFFF0000) | ((u16)(score)))
#define SET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE(score) (gSaveContext.save.saveInfo.shootingGalleryHighScores = ((gSaveContext.save.saveInfo.shootingGalleryHighScores) & 0xFFFF) | ((u16)(score) << 0x10))
/**
* gSaveContext.save.weekEventReg
* gSaveContext.save.saveInfo.weekEventReg
*/
#define PACK_WEEKEVENTREG_FLAG(index, mask) (((index) << 8) | (mask))
@@ -1448,7 +1452,7 @@ typedef enum {
#define WEEKEVENTREG_99_40 PACK_WEEKEVENTREG_FLAG(99, 0x40)
#define WEEKEVENTREG_99_80 PACK_WEEKEVENTREG_FLAG(99, 0x80)
#define WEEKEVENTREG(index) (gSaveContext.save.weekEventReg[(index)])
#define WEEKEVENTREG(index) (gSaveContext.save.saveInfo.weekEventReg[(index)])
#define GET_WEEKEVENTREG(index) ((void)0, WEEKEVENTREG(index))
#define CHECK_WEEKEVENTREG(flag) (WEEKEVENTREG((flag) >> 8) & ((flag) & 0xFF))