summaryrefslogtreecommitdiff
path: root/src/code
diff options
context:
space:
mode:
Diffstat (limited to 'src/code')
-rw-r--r--src/code/code_8012EC80.c45
-rw-r--r--src/code/flg_set.c204
-rw-r--r--src/code/sched.c1
-rw-r--r--src/code/z_actor.c8
-rw-r--r--src/code/z_bgcheck.c10
-rw-r--r--src/code/z_common_data.c12
-rw-r--r--src/code/z_demo.c77
-rw-r--r--src/code/z_elf_message.c26
-rw-r--r--src/code/z_en_item00.c22
-rw-r--r--src/code/z_game_over.c8
-rw-r--r--src/code/z_lifemeter.c28
-rw-r--r--src/code/z_message.c12
-rw-r--r--src/code/z_message_nes.c14
-rw-r--r--src/code/z_play.c18
-rw-r--r--src/code/z_scene.c22
-rw-r--r--src/code/z_snap.c18
-rw-r--r--src/code/z_sram_NES.c1671
17 files changed, 1906 insertions, 290 deletions
diff --git a/src/code/code_8012EC80.c b/src/code/code_8012EC80.c
index f60d98568..5dee17fb5 100644
--- a/src/code/code_8012EC80.c
+++ b/src/code/code_8012EC80.c
@@ -504,7 +504,7 @@ void Inventory_ChangeEquipment(s16 value) {
u8 Inventory_DeleteEquipment(GlobalContext* globalCtx, s16 equipment) {
Player* player = GET_PLAYER(globalCtx);
- if (CUR_EQUIP_VALUE_VOID(EQUIP_SHIELD) != 0) {
+ if (GET_CUR_EQUIP_VALUE(EQUIP_SHIELD) != 0) {
SET_EQUIP_VALUE(EQUIP_SHIELD, 0);
Player_SetEquipmentData(globalCtx, player);
return true;
@@ -514,12 +514,12 @@ u8 Inventory_DeleteEquipment(GlobalContext* globalCtx, s16 equipment) {
}
void Inventory_ChangeUpgrade(s16 upgrade, u32 value) {
- u32 upgrades = gSaveContext.inventory.upgrades;
+ u32 upgrades = gSaveContext.save.inventory.upgrades;
upgrades &= gUpgradeNegMasks[upgrade];
upgrades |= value << gUpgradeShifts[upgrade];
- gSaveContext.inventory.upgrades = upgrades;
+ gSaveContext.save.inventory.upgrades = upgrades;
}
s32 Inventory_IsMapVisible(s16 sceneNum) {
@@ -546,7 +546,7 @@ s32 Inventory_IsMapVisible(s16 sceneNum) {
}
}
- if (gSaveContext.scenesVisible[index] & gBitFlags[sceneNum - (index << 5)]) {
+ if (gSaveContext.save.scenesVisible[index] & gBitFlags[sceneNum - (index << 5)]) {
return true;
}
@@ -659,23 +659,23 @@ void Inventory_SetMapVisibility(s16 tingleIndex) {
index = 6;
}
- gSaveContext.scenesVisible[index] =
- gSaveContext.scenesVisible[index] | gBitFlags[(s16)(*tingleMapSceneIndices)[i] - (index << 5)];
+ gSaveContext.save.scenesVisible[index] =
+ gSaveContext.save.scenesVisible[index] | gBitFlags[(s16)(*tingleMapSceneIndices)[i] - (index << 5)];
i++;
}
if ((*tingleMapSceneIndices) == sScenesPerTingleMap[0]) {
- gSaveContext.mapsVisible |= 3;
+ gSaveContext.save.mapsVisible |= 3;
} else if ((*tingleMapSceneIndices) == sScenesPerTingleMap[1]) {
- gSaveContext.mapsVisible |= 0x1C;
+ gSaveContext.save.mapsVisible |= 0x1C;
} else if ((*tingleMapSceneIndices) == sScenesPerTingleMap[2]) {
- gSaveContext.mapsVisible |= 0xE0;
+ gSaveContext.save.mapsVisible |= 0xE0;
} else if ((*tingleMapSceneIndices) == sScenesPerTingleMap[3]) {
- gSaveContext.mapsVisible |= 0x100;
+ gSaveContext.save.mapsVisible |= 0x100;
} else if ((*tingleMapSceneIndices) == sScenesPerTingleMap[4]) {
- gSaveContext.mapsVisible |= 0x1E00;
+ gSaveContext.save.mapsVisible |= 0x1E00;
} else if ((*tingleMapSceneIndices) == sScenesPerTingleMap[5]) {
- gSaveContext.mapsVisible |= 0x6000;
+ gSaveContext.save.mapsVisible |= 0x6000;
}
}
@@ -688,32 +688,34 @@ void Inventory_SetMapVisibility(s16 tingleIndex) {
void Inventory_SaveDekuPlaygroundHighScore(s16 timerId) {
s16 i;
- gSaveContext.dekuPlaygroundHighScores[CURRENT_DAY - 1] = gSaveContext.unk_3DE0[timerId];
+ gSaveContext.save.dekuPlaygroundHighScores[CURRENT_DAY - 1] = gSaveContext.unk_3DE0[timerId];
for (i = 0; i < 8; i++) {
- gSaveContext.inventory.dekuPlaygroundPlayerName[CURRENT_DAY - 1][i] = gSaveContext.playerName[i];
+ gSaveContext.save.inventory.dekuPlaygroundPlayerName[CURRENT_DAY - 1][i] =
+ gSaveContext.save.playerData.playerName[i];
}
}
void Inventory_IncrementSkullTokenCount(s16 sceneIndex) {
if (sceneIndex == SCENE_KINSTA1) {
// Swamp Spider House (increment high bits of skullTokenCount)
- gSaveContext.skullTokenCount = ((u16)(((gSaveContext.skullTokenCount & 0xFFFF0000) >> 0x10) + 1) << 0x10) |
- (gSaveContext.skullTokenCount & 0xFFFF);
+ gSaveContext.save.skullTokenCount =
+ ((u16)(((gSaveContext.save.skullTokenCount & 0xFFFF0000) >> 0x10) + 1) << 0x10) |
+ (gSaveContext.save.skullTokenCount & 0xFFFF);
} else {
// Ocean Spider House (increment low bits of skullTokenCount)
- gSaveContext.skullTokenCount =
- (((u16)gSaveContext.skullTokenCount + 1) & 0xFFFF) | (gSaveContext.skullTokenCount & 0xFFFF0000);
+ gSaveContext.save.skullTokenCount =
+ (((u16)gSaveContext.save.skullTokenCount + 1) & 0xFFFF) | (gSaveContext.save.skullTokenCount & 0xFFFF0000);
}
}
s16 Inventory_GetSkullTokenCount(s16 sceneIndex) {
if (sceneIndex == SCENE_KINSTA1) {
// Swamp Spider House
- return (gSaveContext.skullTokenCount & 0xFFFF0000) >> 0x10;
+ return (gSaveContext.save.skullTokenCount & 0xFFFF0000) >> 0x10;
} else {
// Ocean Spider House
- return gSaveContext.skullTokenCount & 0xFFFF;
+ return gSaveContext.save.skullTokenCount & 0xFFFF;
}
}
@@ -723,5 +725,6 @@ void Inventory_SaveLotteryCodeGuess(GlobalContext* globalCtx) {
lotteryCodeGuess = ((globalCtx->msgCtx.unk12054[0] & 0xF) << 8); // First Digit
lotteryCodeGuess |= ((globalCtx->msgCtx.unk12054[1] & 0xF) << 4); // Second Digit
lotteryCodeGuess |= (globalCtx->msgCtx.unk12054[2] & 0xF); // Third Digit
- gSaveContext.lotteryCodeGuess = (gSaveContext.lotteryCodeGuess & 0xFFFF0000) | (lotteryCodeGuess & 0xFFFF);
+ gSaveContext.save.lotteryCodeGuess =
+ (gSaveContext.save.lotteryCodeGuess & 0xFFFF0000) | (lotteryCodeGuess & 0xFFFF);
}
diff --git a/src/code/flg_set.c b/src/code/flg_set.c
index 780884c85..53be7b68d 100644
--- a/src/code/flg_set.c
+++ b/src/code/flg_set.c
@@ -12,106 +12,106 @@
#include "global.h"
static FlagSetEntry sFlagEntries[] = {
- { &gSaveContext.weekEventReg[0], "week_event_reg[0]" },
- { &gSaveContext.weekEventReg[1], "week_event_reg[1]" },
- { &gSaveContext.weekEventReg[2], "week_event_reg[2]" },
- { &gSaveContext.weekEventReg[3], "week_event_reg[3]" },
- { &gSaveContext.weekEventReg[4], "week_event_reg[4]" },
- { &gSaveContext.weekEventReg[5], "week_event_reg[5]" },
- { &gSaveContext.weekEventReg[6], "week_event_reg[6]" },
- { &gSaveContext.weekEventReg[7], "week_event_reg[7]" },
- { &gSaveContext.weekEventReg[8], "week_event_reg[8]" },
- { &gSaveContext.weekEventReg[9], "week_event_reg[9]" },
- { &gSaveContext.weekEventReg[10], "week_event_reg[10]" },
- { &gSaveContext.weekEventReg[11], "week_event_reg[11]" },
- { &gSaveContext.weekEventReg[12], "week_event_reg[12]" },
- { &gSaveContext.weekEventReg[13], "week_event_reg[13]" },
- { &gSaveContext.weekEventReg[14], "week_event_reg[14]" },
- { &gSaveContext.weekEventReg[15], "week_event_reg[15]" },
- { &gSaveContext.weekEventReg[16], "week_event_reg[16]" },
- { &gSaveContext.weekEventReg[17], "week_event_reg[17]" },
- { &gSaveContext.weekEventReg[18], "week_event_reg[18]" },
- { &gSaveContext.weekEventReg[19], "week_event_reg[19]" },
- { &gSaveContext.weekEventReg[20], "week_event_reg[20]" },
- { &gSaveContext.weekEventReg[21], "week_event_reg[21]" },
- { &gSaveContext.weekEventReg[22], "week_event_reg[22]" },
- { &gSaveContext.weekEventReg[23], "week_event_reg[23]" },
- { &gSaveContext.weekEventReg[24], "week_event_reg[24]" },
- { &gSaveContext.weekEventReg[25], "week_event_reg[25]" },
- { &gSaveContext.weekEventReg[26], "week_event_reg[26]" },
- { &gSaveContext.weekEventReg[27], "week_event_reg[27]" },
- { &gSaveContext.weekEventReg[28], "week_event_reg[28]" },
- { &gSaveContext.weekEventReg[29], "week_event_reg[29]" },
- { &gSaveContext.weekEventReg[30], "week_event_reg[30]" },
- { &gSaveContext.weekEventReg[31], "week_event_reg[31]" },
- { &gSaveContext.weekEventReg[32], "week_event_reg[32]" },
- { &gSaveContext.weekEventReg[33], "week_event_reg[33]" },
- { &gSaveContext.weekEventReg[34], "week_event_reg[34]" },
- { &gSaveContext.weekEventReg[35], "week_event_reg[35]" },
- { &gSaveContext.weekEventReg[36], "week_event_reg[36]" },
- { &gSaveContext.weekEventReg[37], "week_event_reg[37]" },
- { &gSaveContext.weekEventReg[38], "week_event_reg[38]" },
- { &gSaveContext.weekEventReg[39], "week_event_reg[39]" },
- { &gSaveContext.weekEventReg[40], "week_event_reg[40]" },
- { &gSaveContext.weekEventReg[41], "week_event_reg[41]" },
- { &gSaveContext.weekEventReg[42], "week_event_reg[42]" },
- { &gSaveContext.weekEventReg[43], "week_event_reg[43]" },
- { &gSaveContext.weekEventReg[44], "week_event_reg[44]" },
- { &gSaveContext.weekEventReg[45], "week_event_reg[45]" },
- { &gSaveContext.weekEventReg[46], "week_event_reg[46]" },
- { &gSaveContext.weekEventReg[47], "week_event_reg[47]" },
- { &gSaveContext.weekEventReg[48], "week_event_reg[48]" },
- { &gSaveContext.weekEventReg[49], "week_event_reg[49]" },
- { &gSaveContext.weekEventReg[50], "week_event_reg[50]" },
- { &gSaveContext.weekEventReg[51], "week_event_reg[51]" },
- { &gSaveContext.weekEventReg[52], "week_event_reg[52]" },
- { &gSaveContext.weekEventReg[53], "week_event_reg[53]" },
- { &gSaveContext.weekEventReg[54], "week_event_reg[54]" },
- { &gSaveContext.weekEventReg[55], "week_event_reg[55]" },
- { &gSaveContext.weekEventReg[56], "week_event_reg[56]" },
- { &gSaveContext.weekEventReg[57], "week_event_reg[57]" },
- { &gSaveContext.weekEventReg[58], "week_event_reg[58]" },
- { &gSaveContext.weekEventReg[59], "week_event_reg[59]" },
- { &gSaveContext.weekEventReg[60], "week_event_reg[60]" },
- { &gSaveContext.weekEventReg[61], "week_event_reg[61]" },
- { &gSaveContext.weekEventReg[62], "week_event_reg[62]" },
- { &gSaveContext.weekEventReg[63], "week_event_reg[63]" },
- { &gSaveContext.weekEventReg[64], "week_event_reg[64]" },
- { &gSaveContext.weekEventReg[65], "week_event_reg[65]" },
- { &gSaveContext.weekEventReg[66], "week_event_reg[66]" },
- { &gSaveContext.weekEventReg[67], "week_event_reg[67]" },
- { &gSaveContext.weekEventReg[68], "week_event_reg[68]" },
- { &gSaveContext.weekEventReg[69], "week_event_reg[69]" },
- { &gSaveContext.weekEventReg[70], "week_event_reg[70]" },
- { &gSaveContext.weekEventReg[71], "week_event_reg[71]" },
- { &gSaveContext.weekEventReg[72], "week_event_reg[72]" },
- { &gSaveContext.weekEventReg[73], "week_event_reg[73]" },
- { &gSaveContext.weekEventReg[74], "week_event_reg[74]" },
- { &gSaveContext.weekEventReg[75], "week_event_reg[75]" },
- { &gSaveContext.weekEventReg[76], "week_event_reg[76]" },
- { &gSaveContext.weekEventReg[77], "week_event_reg[77]" },
- { &gSaveContext.weekEventReg[78], "week_event_reg[78]" },
- { &gSaveContext.weekEventReg[79], "week_event_reg[79]" },
- { &gSaveContext.weekEventReg[80], "week_event_reg[80]" },
- { &gSaveContext.weekEventReg[81], "week_event_reg[81]" },
- { &gSaveContext.weekEventReg[82], "week_event_reg[82]" },
- { &gSaveContext.weekEventReg[83], "week_event_reg[83]" },
- { &gSaveContext.weekEventReg[84], "week_event_reg[84]" },
- { &gSaveContext.weekEventReg[85], "week_event_reg[85]" },
- { &gSaveContext.weekEventReg[86], "week_event_reg[86]" },
- { &gSaveContext.weekEventReg[87], "week_event_reg[87]" },
- { &gSaveContext.weekEventReg[88], "week_event_reg[88]" },
- { &gSaveContext.weekEventReg[89], "week_event_reg[89]" },
- { &gSaveContext.weekEventReg[90], "week_event_reg[90]" },
- { &gSaveContext.weekEventReg[91], "week_event_reg[91]" },
- { &gSaveContext.weekEventReg[92], "week_event_reg[92]" },
- { &gSaveContext.weekEventReg[93], "week_event_reg[93]" },
- { &gSaveContext.weekEventReg[94], "week_event_reg[94]" },
- { &gSaveContext.weekEventReg[95], "week_event_reg[95]" },
- { &gSaveContext.weekEventReg[96], "week_event_reg[96]" },
- { &gSaveContext.weekEventReg[97], "week_event_reg[97]" },
- { &gSaveContext.weekEventReg[98], "week_event_reg[98]" },
- { &gSaveContext.weekEventReg[99], "week_event_reg[99]" },
+ { &gSaveContext.save.weekEventReg[0], "week_event_reg[0]" },
+ { &gSaveContext.save.weekEventReg[1], "week_event_reg[1]" },
+ { &gSaveContext.save.weekEventReg[2], "week_event_reg[2]" },
+ { &gSaveContext.save.weekEventReg[3], "week_event_reg[3]" },
+ { &gSaveContext.save.weekEventReg[4], "week_event_reg[4]" },
+ { &gSaveContext.save.weekEventReg[5], "week_event_reg[5]" },
+ { &gSaveContext.save.weekEventReg[6], "week_event_reg[6]" },
+ { &gSaveContext.save.weekEventReg[7], "week_event_reg[7]" },
+ { &gSaveContext.save.weekEventReg[8], "week_event_reg[8]" },
+ { &gSaveContext.save.weekEventReg[9], "week_event_reg[9]" },
+ { &gSaveContext.save.weekEventReg[10], "week_event_reg[10]" },
+ { &gSaveContext.save.weekEventReg[11], "week_event_reg[11]" },
+ { &gSaveContext.save.weekEventReg[12], "week_event_reg[12]" },
+ { &gSaveContext.save.weekEventReg[13], "week_event_reg[13]" },
+ { &gSaveContext.save.weekEventReg[14], "week_event_reg[14]" },
+ { &gSaveContext.save.weekEventReg[15], "week_event_reg[15]" },
+ { &gSaveContext.save.weekEventReg[16], "week_event_reg[16]" },
+ { &gSaveContext.save.weekEventReg[17], "week_event_reg[17]" },
+ { &gSaveContext.save.weekEventReg[18], "week_event_reg[18]" },
+ { &gSaveContext.save.weekEventReg[19], "week_event_reg[19]" },
+ { &gSaveContext.save.weekEventReg[20], "week_event_reg[20]" },
+ { &gSaveContext.save.weekEventReg[21], "week_event_reg[21]" },
+ { &gSaveContext.save.weekEventReg[22], "week_event_reg[22]" },
+ { &gSaveContext.save.weekEventReg[23], "week_event_reg[23]" },
+ { &gSaveContext.save.weekEventReg[24], "week_event_reg[24]" },
+ { &gSaveContext.save.weekEventReg[25], "week_event_reg[25]" },
+ { &gSaveContext.save.weekEventReg[26], "week_event_reg[26]" },
+ { &gSaveContext.save.weekEventReg[27], "week_event_reg[27]" },
+ { &gSaveContext.save.weekEventReg[28], "week_event_reg[28]" },
+ { &gSaveContext.save.weekEventReg[29], "week_event_reg[29]" },
+ { &gSaveContext.save.weekEventReg[30], "week_event_reg[30]" },
+ { &gSaveContext.save.weekEventReg[31], "week_event_reg[31]" },
+ { &gSaveContext.save.weekEventReg[32], "week_event_reg[32]" },
+ { &gSaveContext.save.weekEventReg[33], "week_event_reg[33]" },
+ { &gSaveContext.save.weekEventReg[34], "week_event_reg[34]" },
+ { &gSaveContext.save.weekEventReg[35], "week_event_reg[35]" },
+ { &gSaveContext.save.weekEventReg[36], "week_event_reg[36]" },
+ { &gSaveContext.save.weekEventReg[37], "week_event_reg[37]" },
+ { &gSaveContext.save.weekEventReg[38], "week_event_reg[38]" },
+ { &gSaveContext.save.weekEventReg[39], "week_event_reg[39]" },
+ { &gSaveContext.save.weekEventReg[40], "week_event_reg[40]" },
+ { &gSaveContext.save.weekEventReg[41], "week_event_reg[41]" },
+ { &gSaveContext.save.weekEventReg[42], "week_event_reg[42]" },
+ { &gSaveContext.save.weekEventReg[43], "week_event_reg[43]" },
+ { &gSaveContext.save.weekEventReg[44], "week_event_reg[44]" },
+ { &gSaveContext.save.weekEventReg[45], "week_event_reg[45]" },
+ { &gSaveContext.save.weekEventReg[46], "week_event_reg[46]" },
+ { &gSaveContext.save.weekEventReg[47], "week_event_reg[47]" },
+ { &gSaveContext.save.weekEventReg[48], "week_event_reg[48]" },
+ { &gSaveContext.save.weekEventReg[49], "week_event_reg[49]" },
+ { &gSaveContext.save.weekEventReg[50], "week_event_reg[50]" },
+ { &gSaveContext.save.weekEventReg[51], "week_event_reg[51]" },
+ { &gSaveContext.save.weekEventReg[52], "week_event_reg[52]" },
+ { &gSaveContext.save.weekEventReg[53], "week_event_reg[53]" },
+ { &gSaveContext.save.weekEventReg[54], "week_event_reg[54]" },
+ { &gSaveContext.save.weekEventReg[55], "week_event_reg[55]" },
+ { &gSaveContext.save.weekEventReg[56], "week_event_reg[56]" },
+ { &gSaveContext.save.weekEventReg[57], "week_event_reg[57]" },
+ { &gSaveContext.save.weekEventReg[58], "week_event_reg[58]" },
+ { &gSaveContext.save.weekEventReg[59], "week_event_reg[59]" },
+ { &gSaveContext.save.weekEventReg[60], "week_event_reg[60]" },
+ { &gSaveContext.save.weekEventReg[61], "week_event_reg[61]" },
+ { &gSaveContext.save.weekEventReg[62], "week_event_reg[62]" },
+ { &gSaveContext.save.weekEventReg[63], "week_event_reg[63]" },
+ { &gSaveContext.save.weekEventReg[64], "week_event_reg[64]" },
+ { &gSaveContext.save.weekEventReg[65], "week_event_reg[65]" },
+ { &gSaveContext.save.weekEventReg[66], "week_event_reg[66]" },
+ { &gSaveContext.save.weekEventReg[67], "week_event_reg[67]" },
+ { &gSaveContext.save.weekEventReg[68], "week_event_reg[68]" },
+ { &gSaveContext.save.weekEventReg[69], "week_event_reg[69]" },
+ { &gSaveContext.save.weekEventReg[70], "week_event_reg[70]" },
+ { &gSaveContext.save.weekEventReg[71], "week_event_reg[71]" },
+ { &gSaveContext.save.weekEventReg[72], "week_event_reg[72]" },
+ { &gSaveContext.save.weekEventReg[73], "week_event_reg[73]" },
+ { &gSaveContext.save.weekEventReg[74], "week_event_reg[74]" },
+ { &gSaveContext.save.weekEventReg[75], "week_event_reg[75]" },
+ { &gSaveContext.save.weekEventReg[76], "week_event_reg[76]" },
+ { &gSaveContext.save.weekEventReg[77], "week_event_reg[77]" },
+ { &gSaveContext.save.weekEventReg[78], "week_event_reg[78]" },
+ { &gSaveContext.save.weekEventReg[79], "week_event_reg[79]" },
+ { &gSaveContext.save.weekEventReg[80], "week_event_reg[80]" },
+ { &gSaveContext.save.weekEventReg[81], "week_event_reg[81]" },
+ { &gSaveContext.save.weekEventReg[82], "week_event_reg[82]" },
+ { &gSaveContext.save.weekEventReg[83], "week_event_reg[83]" },
+ { &gSaveContext.save.weekEventReg[84], "week_event_reg[84]" },
+ { &gSaveContext.save.weekEventReg[85], "week_event_reg[85]" },
+ { &gSaveContext.save.weekEventReg[86], "week_event_reg[86]" },
+ { &gSaveContext.save.weekEventReg[87], "week_event_reg[87]" },
+ { &gSaveContext.save.weekEventReg[88], "week_event_reg[88]" },
+ { &gSaveContext.save.weekEventReg[89], "week_event_reg[89]" },
+ { &gSaveContext.save.weekEventReg[90], "week_event_reg[90]" },
+ { &gSaveContext.save.weekEventReg[91], "week_event_reg[91]" },
+ { &gSaveContext.save.weekEventReg[92], "week_event_reg[92]" },
+ { &gSaveContext.save.weekEventReg[93], "week_event_reg[93]" },
+ { &gSaveContext.save.weekEventReg[94], "week_event_reg[94]" },
+ { &gSaveContext.save.weekEventReg[95], "week_event_reg[95]" },
+ { &gSaveContext.save.weekEventReg[96], "week_event_reg[96]" },
+ { &gSaveContext.save.weekEventReg[97], "week_event_reg[97]" },
+ { &gSaveContext.save.weekEventReg[98], "week_event_reg[98]" },
+ { &gSaveContext.save.weekEventReg[99], "week_event_reg[99]" },
{ &gSaveContext.eventInf[0], "event_inf[0]" },
{ &gSaveContext.eventInf[1], "event_inf[1]" },
@@ -245,8 +245,8 @@ void FlagSet_Update(GameState* gameState) {
if (CHECK_BTN_ALL(input->cur.button, BTN_START)) {
if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
s16 i;
- for (i = 0; i < ARRAY_COUNT(gSaveContext.weekEventReg); i++) {
- gSaveContext.weekEventReg[i] = 0;
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.save.weekEventReg); i++) {
+ gSaveContext.save.weekEventReg[i] = 0;
}
for (i = 0; i < ARRAY_COUNT(gSaveContext.eventInf); i++) {
gSaveContext.eventInf[i] = 0;
diff --git a/src/code/sched.c b/src/code/sched.c
index 5f9cdf236..927a48f66 100644
--- a/src/code/sched.c
+++ b/src/code/sched.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
#define RSP_DONE_MSG 667
diff --git a/src/code/z_actor.c b/src/code/z_actor.c
index 6b7c863aa..a0f479f54 100644
--- a/src/code/z_actor.c
+++ b/src/code/z_actor.c
@@ -2224,7 +2224,7 @@ void func_800B90F4(GlobalContext* globalCtx) {
void func_800B9120(ActorContext* actorCtx) {
s32 phi_v0 = CURRENT_DAY * 2;
- if (gSaveContext.time < CLOCK_TIME(6, 0) || gSaveContext.time > CLOCK_TIME(18, 0)) {
+ if (gSaveContext.save.time < CLOCK_TIME(6, 0) || gSaveContext.save.time > CLOCK_TIME(18, 0)) {
phi_v0++;
}
@@ -2236,7 +2236,7 @@ void Actor_InitContext(GlobalContext* globalCtx, ActorContext* actorCtx, ActorEn
CycleSceneFlags* cycleFlags;
s32 i;
- gSaveContext.weekEventReg[92] |= 0x80;
+ gSaveContext.save.weekEventReg[92] |= 0x80;
cycleFlags = &gSaveContext.cycleSceneFlags[Play_GetOriginalSceneNumber(globalCtx->sceneNum)];
bzero(actorCtx, sizeof(ActorContext));
@@ -2252,8 +2252,8 @@ void Actor_InitContext(GlobalContext* globalCtx, ActorContext* actorCtx, ActorEn
}
actorCtx->flags.chest = cycleFlags->chest;
- actorCtx->flags.switches[0] = cycleFlags->swch0;
- actorCtx->flags.switches[1] = cycleFlags->swch1;
+ actorCtx->flags.switches[0] = cycleFlags->switch0;
+ actorCtx->flags.switches[1] = cycleFlags->switch1;
if (globalCtx->sceneNum == SCENE_INISIE_R) {
cycleFlags = &gSaveContext.cycleSceneFlags[globalCtx->sceneNum];
}
diff --git a/src/code/z_bgcheck.c b/src/code/z_bgcheck.c
index 910458b77..b2891de90 100644
--- a/src/code/z_bgcheck.c
+++ b/src/code/z_bgcheck.c
@@ -6,11 +6,11 @@
#define DYNA_RAYCAST_WALLS 2
#define DYNA_RAYCAST_CEILINGS 4
-static u32 sWallFlags[32] = {
+u32 sWallFlags[32] = {
0, 1, 3, 5, 8, 16, 32, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
-static u16 sSurfaceTypeSfx[] = {
+u16 sSurfaceTypeSfx[] = {
/* 0x00 */ NA_SE_PL_WALK_GROUND - SFX_FLAG,
/* 0x01 */ NA_SE_PL_WALK_SAND - SFX_FLAG,
/* 0x02 */ NA_SE_PL_WALK_CONCRETE - SFX_FLAG,
@@ -28,7 +28,7 @@ static u16 sSurfaceTypeSfx[] = {
/* 0x0E */ NA_SE_PL_WALK_SNOW - SFX_FLAG
};
-static u8 D_801B46C0[] = {
+u8 D_801B46C0[] = {
/* 0x00 */ 1,
/* 0x01 */ 1,
/* 0x02 */ 0,
@@ -46,7 +46,7 @@ static u8 D_801B46C0[] = {
/* 0x0E */ 1
};
-static s16 sSmallMemScenes[] = {
+s16 sSmallMemScenes[] = {
SCENE_F01,
};
@@ -55,7 +55,7 @@ typedef struct {
u32 memSize;
} BgCheckSceneMemEntry;
-static BgCheckSceneMemEntry sSceneMemList[] = {
+BgCheckSceneMemEntry sSceneMemList[] = {
{ SCENE_00KEIKOKU, 0xC800 },
};
diff --git a/src/code/z_common_data.c b/src/code/z_common_data.c
index 26fd324a7..3860cf153 100644
--- a/src/code/z_common_data.c
+++ b/src/code/z_common_data.c
@@ -3,8 +3,9 @@
SaveContext gSaveContext;
void SaveContext_Init(void) {
- bzero(&gSaveContext, sizeof(gSaveContext));
- gSaveContext.playerForm = 0;
+ bzero(&gSaveContext, sizeof(SaveContext));
+
+ gSaveContext.save.playerForm = 0;
gSaveContext.seqIndex = (u8)NA_BGM_DISABLED;
gSaveContext.nightSeqIndex = 0xFF;
gSaveContext.unk_3F46 = NA_BGM_GENERAL_SFX;
@@ -16,7 +17,8 @@ void SaveContext_Init(void) {
gSaveContext.dogIsLost = true;
gSaveContext.nextTransition = 0xFF;
gSaveContext.unk_3F26 = 50;
- gSaveContext.language = 1;
- gSaveContext.audioSetting = 0;
- gSaveContext.zTargetSetting = 0;
+
+ gSaveContext.options.language = 1;
+ gSaveContext.options.audioSetting = 0;
+ gSaveContext.options.zTargetSetting = 0;
}
diff --git a/src/code/z_demo.c b/src/code/z_demo.c
index 23dd435ec..e486bc769 100644
--- a/src/code/z_demo.c
+++ b/src/code/z_demo.c
@@ -68,7 +68,7 @@ CutsceneStateHandler sCsStateHandlers1[] = {
};
void Cutscene_Update1(GlobalContext* globalCtx, CutsceneContext* csCtx) {
- if (gSaveContext.cutscene < 0xFFF0) {
+ if (gSaveContext.save.cutscene < 0xFFF0) {
sCsStateHandlers1[csCtx->state](globalCtx, csCtx);
}
}
@@ -87,11 +87,11 @@ void Cutscene_Update2(GlobalContext* globalCtx, CutsceneContext* csCtx) {
}
if ((gSaveContext.cutsceneTrigger != 0) && (csCtx->state == CS_STATE_0)) {
- gSaveContext.cutscene = 0xFFFD;
+ gSaveContext.save.cutscene = 0xFFFD;
gSaveContext.cutsceneTrigger = 1;
}
- if (gSaveContext.cutscene >= 0xFFF0) {
+ if (gSaveContext.save.cutscene >= 0xFFF0) {
func_800EDA84(globalCtx, csCtx);
sCsStateHandlers2[csCtx->state](globalCtx, csCtx);
}
@@ -250,12 +250,12 @@ void Cutscene_Command_Misc(GlobalContext* globalCtx2, CutsceneContext* csCtx, Cs
gSaveContext.sunsSongState = SUNSSONG_START;
break;
case 0x12:
- if (!gSaveContext.isNight) {
- time = gSaveContext.time;
- gSaveContext.time = time - (u16)REG(15);
+ if (!gSaveContext.save.isNight) {
+ time = gSaveContext.save.time;
+ gSaveContext.save.time = time - (u16)REG(15);
} else {
- time = gSaveContext.time;
- gSaveContext.time = time - (u16)(2 * REG(15));
+ time = gSaveContext.save.time;
+ gSaveContext.save.time = time - (u16)(2 * REG(15));
}
break;
case 0x13:
@@ -270,7 +270,7 @@ void Cutscene_Command_Misc(GlobalContext* globalCtx2, CutsceneContext* csCtx, Cs
EnvFlags_Set(globalCtx, 4);
break;
case 0x16:
- gSaveContext.playerForm = PLAYER_FORM_DEKU;
+ gSaveContext.save.playerForm = PLAYER_FORM_DEKU;
break;
case 0x17:
player->stateFlags2 |= 0x4000000;
@@ -279,9 +279,9 @@ void Cutscene_Command_Misc(GlobalContext* globalCtx2, CutsceneContext* csCtx, Cs
player->stateFlags2 &= ~0x4000000;
break;
case 0x19:
- sCutsceneStoredPlayerForm = gSaveContext.playerForm;
- gSaveContext.playerForm = PLAYER_FORM_HUMAN;
- gSaveContext.equippedMask = PLAYER_MASK_NONE;
+ sCutsceneStoredPlayerForm = gSaveContext.save.playerForm;
+ gSaveContext.save.playerForm = PLAYER_FORM_HUMAN;
+ gSaveContext.save.equippedMask = PLAYER_MASK_NONE;
break;
case 0x1A:
func_8019F128(NA_SE_EV_EARTHQUAKE_LAST2 - SFX_FLAG);
@@ -306,7 +306,7 @@ void Cutscene_Command_Misc(GlobalContext* globalCtx2, CutsceneContext* csCtx, Cs
}
break;
case 0x1D:
- gSaveContext.playerForm = sCutsceneStoredPlayerForm;
+ gSaveContext.save.playerForm = sCutsceneStoredPlayerForm;
break;
case 0x1E:
D_801F4DE0 = true;
@@ -316,7 +316,7 @@ void Cutscene_Command_Misc(GlobalContext* globalCtx2, CutsceneContext* csCtx, Cs
break;
case 0x21:
if (isStartFrame) {
- func_80146EE8(globalCtx);
+ Sram_SaveSpecialEnterClockTown(globalCtx);
}
break;
case 0x22:
@@ -329,10 +329,10 @@ void Cutscene_Command_Misc(GlobalContext* globalCtx2, CutsceneContext* csCtx, Cs
D_801BB15C = csCtx->frames;
if (REG(15) != 0) {
- time = gSaveContext.time;
- gSaveContext.time = (u16)REG(15) + time;
- time = gSaveContext.time;
- gSaveContext.time = (u16)gSaveContext.unk_14 + time;
+ time = gSaveContext.save.time;
+ gSaveContext.save.time = (u16)REG(15) + time;
+ time = gSaveContext.save.time;
+ gSaveContext.save.time = (u16)gSaveContext.save.daySpeed + time;
}
}
break;
@@ -349,7 +349,7 @@ void Cutscene_Command_Misc(GlobalContext* globalCtx2, CutsceneContext* csCtx, Cs
case 0x26:
// Seems to be used to trigger "Dawn of A New Day"
- gSaveContext.day = 9;
+ gSaveContext.save.day = 9;
{
GameState* gameState = &globalCtx->state;
@@ -357,11 +357,11 @@ void Cutscene_Command_Misc(GlobalContext* globalCtx2, CutsceneContext* csCtx, Cs
}
SET_NEXT_GAMESTATE(&globalCtx->state, Daytelop_Init, DaytelopContext);
- func_80146F5C(globalCtx);
+ Sram_SaveSpecialNewDay(globalCtx);
break;
case 0x27:
- gSaveContext.playerForm = PLAYER_FORM_ZORA;
+ gSaveContext.save.playerForm = PLAYER_FORM_ZORA;
break;
case 0x28:
@@ -442,7 +442,7 @@ void func_800EADB0(GlobalContext* globalCtx, CutsceneContext* csCtx, CsCmdBase*
u8 dayMinusOne;
if (csCtx->frames == cmd->startFrame) {
- dayMinusOne = (gSaveContext.day - 1);
+ dayMinusOne = (gSaveContext.save.day - 1);
if (dayMinusOne >= 3) {
dayMinusOne = 0;
}
@@ -557,7 +557,7 @@ void Cutscene_Command_SetTime(GlobalContext* globalCtx, CutsceneContext* csCtx,
minutes = CLOCK_TIME_ALT_F(0, cmd->minute + 1);
nextTime = hourAsMinutes + minutes;
- gSaveContext.time = nextTime;
+ gSaveContext.save.time = nextTime;
gSaveContext.environmentTime = nextTime;
}
}
@@ -572,7 +572,7 @@ void Cutscene_TerminatorImpl(GlobalContext* globalCtx, CutsceneContext* csCtx, C
gSaveContext.unk_3F1E = 1;
}
- gSaveContext.cutscene = 0;
+ gSaveContext.save.cutscene = 0;
if (cmd->base == 1) {
globalCtx->nextEntranceIndex = globalCtx->csCtx.sceneCsList[globalCtx->csCtx.currentCsIndex].nextEntranceIndex;
gSaveContext.nextCutsceneIndex = 0;
@@ -607,7 +607,7 @@ void Cutscene_Command_Terminator(GlobalContext* globalCtx, CutsceneContext* csCt
switch (D_801F4DE2) {
case 0x1F:
- if (gSaveContext.weekEventReg[0x14] & 2) {
+ if (gSaveContext.save.weekEventReg[20] & 2) {
globalCtx->nextEntranceIndex = 0x3010;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->unk_1887F = 3;
@@ -620,7 +620,7 @@ void Cutscene_Command_Terminator(GlobalContext* globalCtx, CutsceneContext* csCt
break;
case 0x44:
- if (gSaveContext.weekEventReg[0x21] & 0x80) {
+ if (gSaveContext.save.weekEventReg[33] & 0x80) {
globalCtx->nextEntranceIndex = 0xAE70;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->unk_1887F = 3;
@@ -633,7 +633,7 @@ void Cutscene_Command_Terminator(GlobalContext* globalCtx, CutsceneContext* csCt
break;
case 0x5F:
- gSaveContext.weekEventReg[0x37] |= 0x80;
+ gSaveContext.save.weekEventReg[55] |= 0x80;
globalCtx->nextEntranceIndex = 0x6A80;
gSaveContext.nextCutsceneIndex = 0xFFF0;
globalCtx->sceneLoadFlag = 0x14;
@@ -641,7 +641,7 @@ void Cutscene_Command_Terminator(GlobalContext* globalCtx, CutsceneContext* csCt
break;
case 0x36:
- gSaveContext.weekEventReg[0x34] |= 0x20;
+ gSaveContext.save.weekEventReg[52] |= 0x20;
globalCtx->nextEntranceIndex = 0x2000;
gSaveContext.nextCutsceneIndex = 0xFFF1;
globalCtx->sceneLoadFlag = 0x14;
@@ -813,7 +813,7 @@ void Cutscene_Command_GiveTatlToPlayer(GlobalContext* globalCtx, CutsceneContext
if (csCtx->frames == cmd->startFrame) {
if (cmd->base == 1) {
- gSaveContext.hasTatl = true;
+ gSaveContext.save.hasTatl = true;
if (player->tatlActor != NULL) {
return;
}
@@ -1093,7 +1093,7 @@ void Cutscene_Command_Textbox(GlobalContext* globalCtx, CutsceneContext* csCtx,
}
}
- if (dialogState == 5 && Message_ShouldAdvance(globalCtx) != 0) {
+ if (dialogState == 5 && Message_ShouldAdvance(globalCtx)) {
func_80152434(globalCtx, cmd->base);
}
}
@@ -1424,7 +1424,7 @@ void Cutscene_ProcessCommands(GlobalContext* globalCtx, CutsceneContext* csCtx,
/* End of command handling section */
void func_800ED980(GlobalContext* globalCtx, CutsceneContext* csCtx) {
- if (gSaveContext.cutscene >= 0xFFF0) {
+ if (gSaveContext.save.cutscene >= 0xFFF0) {
csCtx->frames++;
Cutscene_ProcessCommands(globalCtx, csCtx, (u8*)globalCtx->csCtx.csData);
}
@@ -1448,7 +1448,7 @@ void func_800EDA04(GlobalContext* globalCtx, CutsceneContext* csCtx) {
csCtx->actorActions[i] = NULL;
}
- gSaveContext.cutscene = 0;
+ gSaveContext.save.cutscene = 0;
gSaveContext.gameMode = 0;
ActorCutscene_Stop(0x7F);
Audio_SetCutsceneFlag(false);
@@ -1458,10 +1458,10 @@ void func_800EDA04(GlobalContext* globalCtx, CutsceneContext* csCtx) {
void func_800EDA84(GlobalContext* globalCtx, CutsceneContext* csCtx) {
if ((gSaveContext.cutsceneTrigger != 0) && (csCtx->state == CS_STATE_0) && !Player_InCsMode(&globalCtx->state)) {
- gSaveContext.cutscene = 0xFFFD;
+ gSaveContext.save.cutscene = 0xFFFD;
}
- if ((gSaveContext.cutscene >= 0xFFF0) && (csCtx->state == CS_STATE_0)) {
+ if ((gSaveContext.save.cutscene >= 0xFFF0) && (csCtx->state == CS_STATE_0)) {
s16 i;
D_801BB124 = 0;
@@ -1515,8 +1515,9 @@ void func_800EDBE0(GlobalContext* globalCtx) {
ActorCutscene_Start(sp2A, NULL);
gSaveContext.showTitleCard = false;
} else if (!((1 << (temp_a3[temp_v0_3].unk7 % 8)) &
- gSaveContext.weekEventReg[temp_a3[temp_v0_3].unk7 / 8])) {
- gSaveContext.weekEventReg[(temp_a3[temp_v0_3].unk7 / 8)] |= 1 << (temp_a3[temp_v0_3].unk7 % 8);
+ gSaveContext.save.weekEventReg[temp_a3[temp_v0_3].unk7 / 8])) {
+ gSaveContext.save.weekEventReg[(temp_a3[temp_v0_3].unk7 / 8)] |=
+ 1 << (temp_a3[temp_v0_3].unk7 % 8);
ActorCutscene_Start(sp2A, NULL);
gSaveContext.showTitleCard = false;
}
@@ -1530,8 +1531,8 @@ void func_800EDBE0(GlobalContext* globalCtx) {
if ((gSaveContext.respawnFlag == 0) || (gSaveContext.respawnFlag == -2)) {
sp24 = globalCtx->loadedScene;
if ((sp24->titleTextId != 0) && gSaveContext.showTitleCard) {
- if ((Entrance_GetTransitionFlags(gSaveContext.sceneSetupIndex + gSaveContext.entranceIndex) & 0x4000) !=
- 0) {
+ if ((Entrance_GetTransitionFlags(gSaveContext.sceneSetupIndex + gSaveContext.save.entranceIndex) &
+ 0x4000) != 0) {
func_80151A68(globalCtx, sp24->titleTextId);
}
}
diff --git a/src/code/z_elf_message.c b/src/code/z_elf_message.c
index 7308b33f4..cd2fa96b6 100644
--- a/src/code/z_elf_message.c
+++ b/src/code/z_elf_message.c
@@ -7,17 +7,17 @@ u16 ElfMessage_GetFirstCycleHint(GlobalContext* globalCtx) {
if (CURRENT_DAY <= 0) {
return 0;
}
- if (gSaveContext.weekEventReg[88] & 0x20) {
+ if (gSaveContext.save.weekEventReg[88] & 0x20) {
return 0;
}
- if (gSaveContext.weekEventReg[79] & 0x10) {
- if (gSaveContext.weekEventReg[8] & 0x40) {
+ if (gSaveContext.save.weekEventReg[79] & 0x10) {
+ if (gSaveContext.save.weekEventReg[8] & 0x40) {
return 0;
}
return 0x224;
}
- if (!(gSaveContext.weekEventReg[8] & 0x80)) {
- if (gSaveContext.weekEventReg[9] & 1) {
+ if (!(gSaveContext.save.weekEventReg[8] & 0x80)) {
+ if (gSaveContext.save.weekEventReg[9] & 1) {
return 0x21E;
}
if (globalCtx->sceneNum == SCENE_YOUSEI_IZUMI) {
@@ -25,7 +25,7 @@ u16 ElfMessage_GetFirstCycleHint(GlobalContext* globalCtx) {
}
return 0x21D;
}
- if (gSaveContext.magicAcquired != true) {
+ if (gSaveContext.save.playerData.magicAcquired != true) {
return 0x21F;
}
if (INV_CONTENT(ITEM_DEED_LAND) == ITEM_DEED_LAND) {
@@ -35,27 +35,27 @@ u16 ElfMessage_GetFirstCycleHint(GlobalContext* globalCtx) {
return 0;
}
if (INV_CONTENT(ITEM_MOON_TEAR) == ITEM_MOON_TEAR) {
- if (gSaveContext.weekEventReg[86] & 4) {
+ if (gSaveContext.save.weekEventReg[86] & 4) {
return 0x242;
}
return 0x243;
}
- if (gSaveContext.weekEventReg[74] & 0x20) {
+ if (gSaveContext.save.weekEventReg[74] & 0x20) {
return 0x223;
}
- if (gSaveContext.weekEventReg[73] & 0x80) {
+ if (gSaveContext.save.weekEventReg[73] & 0x80) {
return 0x222;
}
- if (gSaveContext.weekEventReg[73] & 0x20) {
+ if (gSaveContext.save.weekEventReg[73] & 0x20) {
return 0x221;
}
- if (gSaveContext.weekEventReg[77] & 2) {
- if (gSaveContext.weekEventReg[73] & 0x10) {
+ if (gSaveContext.save.weekEventReg[77] & 2) {
+ if (gSaveContext.save.weekEventReg[73] & 0x10) {
return 0x240;
}
return 0x241;
}
- if ((gSaveContext.weekEventReg[86] & 2) || (gSaveContext.weekEventReg[73] & 0x40)) {
+ if ((gSaveContext.save.weekEventReg[86] & 2) || (gSaveContext.save.weekEventReg[73] & 0x40)) {
return 0x23F;
}
return 0x220;
diff --git a/src/code/z_en_item00.c b/src/code/z_en_item00.c
index 5c8a75f98..b8fa0f4f1 100644
--- a/src/code/z_en_item00.c
+++ b/src/code/z_en_item00.c
@@ -822,13 +822,14 @@ s16 func_800A7650(s16 dropId) {
(((dropId == ITEM00_ARROWS_10) || (dropId == ITEM00_ARROWS_30) || (dropId == ITEM00_ARROWS_40) ||
(dropId == ITEM00_ARROWS_50)) &&
(INV_CONTENT(ITEM_BOW) == ITEM_NONE)) ||
- (((dropId == ITEM00_MAGIC_LARGE) || (dropId == ITEM00_MAGIC_SMALL)) && (gSaveContext.magicLevel == 0))) {
+ (((dropId == ITEM00_MAGIC_LARGE) || (dropId == ITEM00_MAGIC_SMALL)) &&
+ (gSaveContext.save.playerData.magicLevel == 0))) {
return ITEM00_NO_DROP;
}
if (dropId == ITEM00_HEART) {
- healthCapacity = gSaveContext.healthCapacity;
- if (healthCapacity == gSaveContext.health) {
+ healthCapacity = gSaveContext.save.playerData.healthCapacity;
+ if (healthCapacity == gSaveContext.save.playerData.health) {
return ITEM00_RUPEE_GREEN;
}
}
@@ -1049,7 +1050,7 @@ void Item_DropCollectibleRandom(GlobalContext* globalCtx, Actor* fromActor, Vec3
dropQuantity = sDropTableAmounts[params + dropTableIndex];
if (dropId == ITEM00_MASK) {
- switch (gSaveContext.playerForm) {
+ switch (gSaveContext.save.playerForm) {
case PLAYER_FORM_HUMAN:
dropId = ITEM00_ARROWS_10;
break;
@@ -1085,26 +1086,27 @@ void Item_DropCollectibleRandom(GlobalContext* globalCtx, Actor* fromActor, Vec3
}
if (dropId == ITEM00_FLEXIBLE) {
- if (gSaveContext.health <= 0x10) {
+ if (gSaveContext.save.playerData.health <= 0x10) {
Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELF, spawnPos->x, spawnPos->y + 40.0f,
spawnPos->z, 0, 0, 0, 2);
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
return;
}
- if (gSaveContext.health <= 0x30) {
+ if (gSaveContext.save.playerData.health <= 0x30) {
params = 0x10;
dropId = ITEM00_HEART;
dropQuantity = 3;
- } else if (gSaveContext.health <= 0x50) {
+ } else if (gSaveContext.save.playerData.health <= 0x50) {
params = 0x10;
dropId = ITEM00_HEART;
dropQuantity = 1;
- } else if ((gSaveContext.magicLevel != 0) && (gSaveContext.magic == 0)) {
+ } else if ((gSaveContext.save.playerData.magicLevel != 0) && (gSaveContext.save.playerData.magic == 0)) {
params = 0xD0;
dropId = ITEM00_MAGIC_LARGE;
dropQuantity = 1;
- } else if ((gSaveContext.magicLevel != 0) && ((gSaveContext.magicLevel >> 1) >= gSaveContext.magic)) {
+ } else if ((gSaveContext.save.playerData.magicLevel != 0) &&
+ ((gSaveContext.save.playerData.magicLevel >> 1) >= gSaveContext.save.playerData.magic)) {
params = 0xD0;
dropId = ITEM00_MAGIC_LARGE;
dropQuantity = 1;
@@ -1116,7 +1118,7 @@ void Item_DropCollectibleRandom(GlobalContext* globalCtx, Actor* fromActor, Vec3
params = 0xB0;
dropId = ITEM00_BOMBS_A;
dropQuantity = 1;
- } else if (gSaveContext.rupees < 11) {
+ } else if (gSaveContext.save.playerData.rupees < 11) {
params = 0xA0;
dropId = ITEM00_RUPEE_RED;
dropQuantity = 1;
diff --git a/src/code/z_game_over.c b/src/code/z_game_over.c
index 411cb5d00..62d55bc00 100644
--- a/src/code/z_game_over.c
+++ b/src/code/z_game_over.c
@@ -44,7 +44,7 @@ void GameOver_Update(GlobalContext* globalCtx) {
}
gSaveContext.unk_3DC0 = 2000;
- gSaveContext.tatlTimer = 0;
+ gSaveContext.save.playerData.tatlTimer = 0;
gSaveContext.seqIndex = (u8)NA_BGM_DISABLED;
gSaveContext.nightSeqIndex = 0xFF;
gSaveContext.eventInf[0] = 0;
@@ -72,11 +72,11 @@ void GameOver_Update(GlobalContext* globalCtx) {
gSaveContext.respawnFlag = -6;
}
gSaveContext.nextTransition = 2;
- gSaveContext.health = 48;
+ gSaveContext.save.playerData.health = 48;
gameOverCtx->state++;
if (INV_CONTENT(ITEM_MASK_DEKU) == ITEM_MASK_DEKU) {
- gSaveContext.playerForm = PLAYER_FORM_HUMAN;
- gSaveContext.equippedMask = PLAYER_MASK_NONE;
+ gSaveContext.save.playerForm = PLAYER_FORM_HUMAN;
+ gSaveContext.save.equippedMask = PLAYER_MASK_NONE;
}
func_8013EE24();
}
diff --git a/src/code/z_lifemeter.c b/src/code/z_lifemeter.c
index 703b966de..d89b427e9 100644
--- a/src/code/z_lifemeter.c
+++ b/src/code/z_lifemeter.c
@@ -38,7 +38,7 @@ void LifeMeter_Init(GlobalContext* globalCtx) {
interfaceCtx->unkTimer = 320;
- interfaceCtx->health = gSaveContext.health;
+ interfaceCtx->health = gSaveContext.save.playerData.health;
interfaceCtx->lifeColorChange = 0;
interfaceCtx->lifeColorChangeDirection = 0;
@@ -168,7 +168,7 @@ void LifeMeter_UpdateColors(GlobalContext* globalCtx) {
}
s32 LifeMeter_SaveInterfaceHealth(GlobalContext* globalCtx) {
- gSaveContext.health = globalCtx->interfaceCtx.health;
+ gSaveContext.save.playerData.health = globalCtx->interfaceCtx.health;
return 1;
}
@@ -178,8 +178,8 @@ s32 LifeMeter_IncreaseInterfaceHealth(GlobalContext* globalCtx) {
interfaceCtx->unkTimer = 320;
interfaceCtx->health += 0x10;
- if (globalCtx->interfaceCtx.health >= gSaveContext.health) {
- globalCtx->interfaceCtx.health = gSaveContext.health;
+ if (globalCtx->interfaceCtx.health >= gSaveContext.save.playerData.health) {
+ globalCtx->interfaceCtx.health = gSaveContext.save.playerData.health;
return 1;
}
return 0;
@@ -195,7 +195,7 @@ s32 LifeMeter_DecreaseInterfaceHealth(GlobalContext* globalCtx) {
interfaceCtx->health -= 0x10;
if (interfaceCtx->health <= 0) {
interfaceCtx->health = 0;
- globalCtx->damagePlayer(globalCtx, -(((void)0, gSaveContext.health) + 1));
+ globalCtx->damagePlayer(globalCtx, -(((void)0, gSaveContext.save.playerData.health) + 1));
return 1;
}
}
@@ -216,18 +216,18 @@ void LifeMeter_Draw(GlobalContext* globalCtx) {
GraphicsContext* gfxCtx = globalCtx->state.gfxCtx;
InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx;
Vtx* beatingHeartVtx = interfaceCtx->beatingHeartVtx;
- s32 fractionHeartCount = gSaveContext.health % 0x10;
- s16 healthCapacity = gSaveContext.healthCapacity / 0x10;
- s16 fullHeartCount = gSaveContext.health / 0x10;
+ s32 fractionHeartCount = gSaveContext.save.playerData.health % 0x10;
+ s16 healthCapacity = gSaveContext.save.playerData.healthCapacity / 0x10;
+ s16 fullHeartCount = gSaveContext.save.playerData.health / 0x10;
s32 pad2;
f32 lifesize = interfaceCtx->lifeSizeChange * 0.1f;
u32 curCombineModeSet = 0;
TexturePtr temp = NULL;
- s32 ddCount = gSaveContext.inventory.dungeonKeys[9] - 1;
+ s32 ddCount = gSaveContext.save.inventory.dungeonKeys[9] - 1;
OPEN_DISPS(gfxCtx);
- if ((gSaveContext.health % 0x10) == 0) {
+ if ((gSaveContext.save.playerData.health % 0x10) == 0) {
fullHeartCount--;
}
offsetY = 0.0f;
@@ -417,19 +417,19 @@ void LifeMeter_UpdateSizeAndBeep(GlobalContext* globalCtx) {
u32 LifeMeter_IsCritical(void) {
s16 criticalThreshold;
- if (gSaveContext.healthCapacity <= 80) { // healthCapacity <= 5 hearts?
+ if (gSaveContext.save.playerData.healthCapacity <= 80) { // healthCapacity <= 5 hearts?
criticalThreshold = 16;
- } else if (gSaveContext.healthCapacity <= 160) { // healthCapacity <= 10 hearts?
+ } else if (gSaveContext.save.playerData.healthCapacity <= 160) { // healthCapacity <= 10 hearts?
criticalThreshold = 24;
- } else if (gSaveContext.healthCapacity <= 240) { // healthCapacity <= 15 hearts?
+ } else if (gSaveContext.save.playerData.healthCapacity <= 240) { // healthCapacity <= 15 hearts?
criticalThreshold = 32;
} else {
criticalThreshold = 44;
}
- if ((criticalThreshold >= gSaveContext.health) && (gSaveContext.health > 0)) {
+ if ((criticalThreshold >= gSaveContext.save.playerData.health) && (gSaveContext.save.playerData.health > 0)) {
return true;
}
return false;
diff --git a/src/code/z_message.c b/src/code/z_message.c
index 447c354c6..d7fdbff42 100644
--- a/src/code/z_message.c
+++ b/src/code/z_message.c
@@ -391,12 +391,12 @@ void func_80151BB4(GlobalContext* globalCtx, u8 arg1) {
u8 temp = arg1;
if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
- if ((gSaveContext.weekEventReg[D_801C6B28[arg1] >> 8] & (u8)D_801C6B28[arg1]) == 0) {
+ if ((gSaveContext.save.weekEventReg[D_801C6B28[arg1] >> 8] & (u8)D_801C6B28[arg1]) == 0) {
msgCtx->unk120B2[msgCtx->unk120B1] = temp;
msgCtx->unk120B1++;
}
} else if (arg1 >= 20) {
- if ((gSaveContext.weekEventReg[D_801C6B28[arg1] >> 8] & (u8)D_801C6B28[arg1]) == 0) {
+ if ((gSaveContext.save.weekEventReg[D_801C6B28[arg1] >> 8] & (u8)D_801C6B28[arg1]) == 0) {
msgCtx->unk120B2[msgCtx->unk120B1] = temp;
msgCtx->unk120B1++;
}
@@ -413,10 +413,10 @@ u32 func_80151C9C(GlobalContext* globalCtx) {
}
msgCtx->unk120B1--;
- if ((gSaveContext.weekEventReg[D_801C6B28[msgCtx->unk120B2[msgCtx->unk120B1]] >> 8] &
+ if ((gSaveContext.save.weekEventReg[D_801C6B28[msgCtx->unk120B2[msgCtx->unk120B1]] >> 8] &
(u8)D_801C6B28[msgCtx->unk120B2[msgCtx->unk120B1]]) == 0) {
- flag = gSaveContext.weekEventReg[D_801C6B28[msgCtx->unk120B2[msgCtx->unk120B1]] >> 8];
- gSaveContext.weekEventReg[D_801C6B28[msgCtx->unk120B2[msgCtx->unk120B1]] >> 8] =
+ flag = gSaveContext.save.weekEventReg[D_801C6B28[msgCtx->unk120B2[msgCtx->unk120B1]] >> 8];
+ gSaveContext.save.weekEventReg[D_801C6B28[msgCtx->unk120B2[msgCtx->unk120B1]] >> 8] =
flag | (u8)D_801C6B28[msgCtx->unk120B2[msgCtx->unk120B1]];
if ((D_801C6AB8[msgCtx->unk120B2[msgCtx->unk120B1]] != 0) && CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
func_80151938(globalCtx, D_801C6AB8[msgCtx->unk120B2[msgCtx->unk120B1]]);
@@ -474,7 +474,7 @@ void func_80152EC0(GlobalContext* globalCtx) {
#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_80153750.s")
void func_80153E7C(GlobalContext* globalCtx, void* arg1) {
- if ((gSaveContext.language == 0) && (globalCtx->msgCtx.unk12090 == 0)) {
+ if ((gSaveContext.options.language == 0) && (globalCtx->msgCtx.unk12090 == 0)) {
func_8014ADBC(globalCtx, arg1);
return;
}
diff --git a/src/code/z_message_nes.c b/src/code/z_message_nes.c
index 7a961c882..1de839d68 100644
--- a/src/code/z_message_nes.c
+++ b/src/code/z_message_nes.c
@@ -131,15 +131,15 @@ void Message_LoadLocalizedRupeesNES(GlobalContext* globalCtx, s16* decodedBufPos
msgCtx->decodedBuffer.schar[p] = ' ';
p++;
- for (j = 0; j < D_801D0710[gSaveContext.language - 1]; j++) {
- Font_LoadCharNES(globalCtx, D_801D06F0[gSaveContext.language - 1][j], o);
- msgCtx->decodedBuffer.schar[p] = D_801D06F0[gSaveContext.language - 1][j];
+ for (j = 0; j < D_801D0710[gSaveContext.options.language - 1]; j++) {
+ Font_LoadCharNES(globalCtx, D_801D06F0[gSaveContext.options.language - 1][j], o);
+ msgCtx->decodedBuffer.schar[p] = D_801D06F0[gSaveContext.options.language - 1][j];
o += FONT_CHAR_TEX_SIZE;
p++;
}
p--;
- f += 16.0f * msgCtx->unk12098 * (D_801D0710[gSaveContext.language - 1] + 1);
+ f += 16.0f * msgCtx->unk12098 * (D_801D0710[gSaveContext.options.language - 1] + 1);
*decodedBufPos = p;
*offset = o;
*arg3 = f;
@@ -200,10 +200,10 @@ void Message_LoadTimeNES(GlobalContext* globalCtx, u8 arg1, s32* offset, f32* ar
s16 i;
if (arg1 == 0xCF) {
- day = gSaveContext.day;
- dayTime = 0x40000 - ((day % 5) << 16) - (u16)(-0x4000 + gSaveContext.time);
+ day = gSaveContext.save.day;
+ dayTime = 0x40000 - ((day % 5) << 16) - (u16)(-0x4000 + gSaveContext.save.time);
} else {
- dayTime = 0x10000 - (u16)(-0x4000 + gSaveContext.time);
+ dayTime = 0x10000 - (u16)(-0x4000 + gSaveContext.save.time);
}
timeInMinutes = TIME_TO_MINUTES_F(dayTime);
diff --git a/src/code/z_play.c b/src/code/z_play.c
index b5c2b15c8..57b09f67e 100644
--- a/src/code/z_play.c
+++ b/src/code/z_play.c
@@ -158,8 +158,8 @@ void Play_SaveCycleSceneFlags(GameState* gameState) {
cycleSceneFlags = &gSaveContext.cycleSceneFlags[Play_GetOriginalSceneNumber(globalCtx->sceneNum)];
cycleSceneFlags->chest = globalCtx->actorCtx.flags.chest;
- cycleSceneFlags->swch0 = globalCtx->actorCtx.flags.switches[0];
- cycleSceneFlags->swch1 = globalCtx->actorCtx.flags.switches[1];
+ cycleSceneFlags->switch0 = globalCtx->actorCtx.flags.switches[0];
+ cycleSceneFlags->switch1 = globalCtx->actorCtx.flags.switches[1];
if (globalCtx->sceneNum == SCENE_INISIE_R) { // Inverted Stone Tower Temple
cycleSceneFlags = &gSaveContext.cycleSceneFlags[globalCtx->sceneNum];
@@ -178,7 +178,7 @@ void Play_SetRespawnData(GameState* gameState, s32 respawnMode, u16 entranceInde
gSaveContext.respawn[respawnMode].pos = *pos;
gSaveContext.respawn[respawnMode].yaw = yaw;
gSaveContext.respawn[respawnMode].playerParams = playerParams;
- gSaveContext.respawn[respawnMode].tempSwchFlags = globalCtx->actorCtx.flags.switches[2];
+ gSaveContext.respawn[respawnMode].tempSwitchFlags = globalCtx->actorCtx.flags.switches[2];
gSaveContext.respawn[respawnMode].unk_18 = globalCtx->actorCtx.flags.collectible[1];
gSaveContext.respawn[respawnMode].tempCollectFlags = globalCtx->actorCtx.flags.collectible[2];
}
@@ -188,7 +188,7 @@ void Play_SetupRespawnPoint(GameState* gameState, s32 respawnMode, s32 playerPar
Player* player = GET_PLAYER(globalCtx);
if (globalCtx->sceneNum != SCENE_KAKUSIANA) { // Grottos
- Play_SetRespawnData(&globalCtx->state, respawnMode, (u16)((void)0, gSaveContext.entranceIndex),
+ Play_SetRespawnData(&globalCtx->state, respawnMode, (u16)((void)0, gSaveContext.save.entranceIndex),
globalCtx->roomCtx.currRoom.num, playerParams, &player->actor.world.pos,
player->actor.shape.rot.y);
}
@@ -207,10 +207,10 @@ void func_80169ECC(GlobalContext* globalCtx) {
void func_80169EFC(GameState* gameState) {
GlobalContext* globalCtx = (GlobalContext*)gameState;
- gSaveContext.respawn[0].tempSwchFlags = globalCtx->actorCtx.flags.switches[2];
- gSaveContext.respawn[0].unk_18 = globalCtx->actorCtx.flags.collectible[1];
- gSaveContext.respawn[0].tempCollectFlags = globalCtx->actorCtx.flags.collectible[2];
- globalCtx->nextEntranceIndex = gSaveContext.respawn[0].entranceIndex;
+ gSaveContext.respawn[RESTART_MODE_DOWN].tempSwitchFlags = globalCtx->actorCtx.flags.switches[2];
+ gSaveContext.respawn[RESTART_MODE_DOWN].unk_18 = globalCtx->actorCtx.flags.collectible[1];
+ gSaveContext.respawn[RESTART_MODE_DOWN].tempCollectFlags = globalCtx->actorCtx.flags.collectible[2];
+ globalCtx->nextEntranceIndex = gSaveContext.respawn[RESTART_MODE_DOWN].entranceIndex;
gSaveContext.respawnFlag = 1;
func_80169ECC(globalCtx);
globalCtx->sceneLoadFlag = 0x14;
@@ -222,7 +222,7 @@ void func_80169EFC(GameState* gameState) {
void func_80169F78(GameState* gameState) {
GlobalContext* globalCtx = (GlobalContext*)gameState;
- globalCtx->nextEntranceIndex = gSaveContext.respawn[2].entranceIndex;
+ globalCtx->nextEntranceIndex = gSaveContext.respawn[RESTART_MODE_TOP].entranceIndex;
gSaveContext.respawnFlag = -1;
func_80169ECC(globalCtx);
globalCtx->sceneLoadFlag = 0x14;
diff --git a/src/code/z_scene.c b/src/code/z_scene.c
index 6ef6a6091..8a9bdd4e7 100644
--- a/src/code/z_scene.c
+++ b/src/code/z_scene.c
@@ -151,7 +151,7 @@ void Scene_HeaderCmdSpawnList(GlobalContext* globalCtx, SceneCmd* cmd) {
globalCtx->linkActorEntry = (ActorEntry*)Lib_SegmentedToVirtual(cmd->spawnList.segment) +
globalCtx->setupEntranceList[globalCtx->curSpawn].spawn;
if ((globalCtx->linkActorEntry->params & 0x0F00) >> 8 == 0x0C ||
- (gSaveContext.respawnFlag == 0x02 && gSaveContext.respawn[1].playerParams == 0x0CFF)) {
+ (gSaveContext.respawnFlag == 0x02 && gSaveContext.respawn[RESTART_MODE_RETURN].playerParams == 0x0CFF)) {
// Skull Kid Object
Object_Spawn(&globalCtx->objectCtx, OBJECT_STK);
return;
@@ -161,7 +161,7 @@ void Scene_HeaderCmdSpawnList(GlobalContext* globalCtx, SceneCmd* cmd) {
nextObject = globalCtx2->objectCtx.status[globalCtx2->objectCtx.num].segment;
globalCtx->objectCtx.num = loadedCount;
globalCtx->objectCtx.spawnedObjectCount = loadedCount;
- playerForm = gSaveContext.playerForm;
+ playerForm = gSaveContext.save.playerForm;
playerObjectId = gLinkFormObjectIndexes[playerForm];
gActorOverlayTable[0].initInfo->objectId = playerObjectId;
Object_Spawn(&globalCtx->objectCtx, playerObjectId);
@@ -383,7 +383,7 @@ void Scene_HeaderCmdTimeSettings(GlobalContext* globalCtx, SceneCmd* cmd) {
u32 dayTime;
if (cmd->timeSettings.hour != 0xFF && cmd->timeSettings.min != 0xFF) {
- gSaveContext.environmentTime = gSaveContext.time =
+ gSaveContext.environmentTime = gSaveContext.save.time =
(u16)(((cmd->timeSettings.hour + (cmd->timeSettings.min / 60.0f)) * 60.0f) / 0.021972656f);
}
@@ -393,7 +393,7 @@ void Scene_HeaderCmdTimeSettings(GlobalContext* globalCtx, SceneCmd* cmd) {
globalCtx->envCtx.timeIncrement = 0;
}
- if ((gSaveContext.inventory.items[SLOT_OCARINA] == ITEM_NONE) && (globalCtx->envCtx.timeIncrement != 0)) {
+ if ((gSaveContext.save.inventory.items[SLOT_OCARINA] == ITEM_NONE) && (globalCtx->envCtx.timeIncrement != 0)) {
globalCtx->envCtx.timeIncrement = 5;
}
@@ -401,15 +401,15 @@ void Scene_HeaderCmdTimeSettings(GlobalContext* globalCtx, SceneCmd* cmd) {
REG(15) = globalCtx->envCtx.timeIncrement;
}
- dayTime = gSaveContext.time;
+ dayTime = gSaveContext.save.time;
globalCtx->envCtx.unk_4 = -(Math_SinS(dayTime - 0x8000) * 120.0f) * 25.0f;
- dayTime = gSaveContext.time;
+ dayTime = gSaveContext.save.time;
globalCtx->envCtx.unk_8 = (Math_CosS(dayTime - 0x8000) * 120.0f) * 25.0f;
- dayTime = gSaveContext.time;
+ dayTime = gSaveContext.save.time;
globalCtx->envCtx.unk_C = (Math_CosS(dayTime - 0x8000) * 20.0f) * 25.0f;
- if (globalCtx->envCtx.timeIncrement == 0 && gSaveContext.cutscene < 0xFFF0) {
- gSaveContext.environmentTime = gSaveContext.time;
+ if (globalCtx->envCtx.timeIncrement == 0 && gSaveContext.save.cutscene < 0xFFF0) {
+ gSaveContext.environmentTime = gSaveContext.save.time;
if (gSaveContext.environmentTime >= CLOCK_TIME(4, 0) && gSaveContext.environmentTime < CLOCK_TIME(6, 30)) {
gSaveContext.environmentTime = CLOCK_TIME(5, 0);
@@ -527,7 +527,7 @@ void Scene_HeaderCmdSetAreaVisitedFlag(GlobalContext* globalCtx, SceneCmd* cmd)
}
if (i < ARRAY_COUNT(gScenesPerRegion)) {
- gSaveContext.mapsVisited = (gBitFlags[i] | gSaveContext.mapsVisited) | gSaveContext.mapsVisited;
+ gSaveContext.save.mapsVisited = (gBitFlags[i] | gSaveContext.save.mapsVisited) | gSaveContext.save.mapsVisited;
}
}
@@ -610,5 +610,5 @@ u16 Entrance_CreateIndex(s32 sceneIndex, s32 spawnIndex, s32 sceneSetup) {
* Creates an entrance index from the current entrance index with the given spawn index.
*/
u16 Entrance_CreateIndexFromSpawn(s32 spawnIndex) {
- return Entrance_CreateIndex(gSaveContext.entranceIndex >> 9, spawnIndex, 0);
+ return Entrance_CreateIndex(gSaveContext.save.entranceIndex >> 9, spawnIndex, 0);
}
diff --git a/src/code/z_snap.c b/src/code/z_snap.c
index bce1f67d7..f85f33f0a 100644
--- a/src/code/z_snap.c
+++ b/src/code/z_snap.c
@@ -12,8 +12,8 @@ s32 func_8013A240(GlobalContext* globalCtx) {
s32 seen;
s32 count = 0;
- gSaveContext.pictoFlags0 = 0;
- gSaveContext.pictoFlags1 = 0;
+ gSaveContext.save.pictoFlags0 = 0;
+ gSaveContext.save.pictoFlags1 = 0;
if (globalCtx->sceneNum == SCENE_20SICHITAI) {
func_8013A41C(1);
@@ -76,19 +76,19 @@ s32 func_8013A240(GlobalContext* globalCtx) {
void func_8013A41C(s32 flag) {
if (flag < 0x20) {
- gSaveContext.pictoFlags0 |= (1 << flag);
+ gSaveContext.save.pictoFlags0 |= (1 << flag);
} else {
flag &= 0x1F;
- gSaveContext.pictoFlags1 |= (1 << flag);
+ gSaveContext.save.pictoFlags1 |= (1 << flag);
}
}
void func_8013A46C(s32 flag) {
if (flag < 0x20) {
- gSaveContext.pictoFlags0 &= ~(1 << flag);
+ gSaveContext.save.pictoFlags0 &= ~(1 << flag);
} else {
flag &= 0x1F;
- gSaveContext.pictoFlags1 &= ~(1 << flag);
+ gSaveContext.save.pictoFlags1 &= ~(1 << flag);
}
}
@@ -96,10 +96,10 @@ u32 func_8013A4C4(s32 flag) {
SaveContext* saveCtx = &gSaveContext;
if (flag < 0x20) {
- return saveCtx->pictoFlags0 & (1 << flag);
+ return saveCtx->save.pictoFlags0 & (1 << flag);
} else {
flag &= 0x1F;
- return saveCtx->pictoFlags1 & (1 << flag);
+ return saveCtx->save.pictoFlags1 & (1 << flag);
}
}
@@ -135,7 +135,7 @@ s32 func_8013A530(GlobalContext* globalCtx, Actor* actor, s32 flag, Vec3f* pos,
Actor_GetProjectedPos(globalCtx, pos, &screenSpace, &distance);
x = (s16)(screenSpace.x * distance * 160.0f + 160.0f) - 85;
y = (s16)(screenSpace.y * distance * -120.0f + 120.0f) - 67;
- if ((x < 0) || (0x96 < x) || (y < 0) || (0x69 < y)) {
+ if ((x < 0) || (150 < x) || (y < 0) || (105 < y)) {
func_8013A41C(0x3D);
ret |= 0x3D;
}
diff --git a/src/code/z_sram_NES.c b/src/code/z_sram_NES.c
index 5b5b2f5f0..b1dbdb1fe 100644
--- a/src/code/z_sram_NES.c
+++ b/src/code/z_sram_NES.c
@@ -1,67 +1,1676 @@
#include "global.h"
+#include "overlays/gamestates/ovl_file_choose/z_file_choose.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80143A10.s")
+void func_80146EBC(SramContext* sramCtx, s32 curPage, s32 numPages);
+void func_80147314(SramContext* sramCtx, s32 fileNum);
+void func_80147414(SramContext* sramCtx, s32 fileNum, s32 arg2);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80143A54.s")
+#define CHECK_NEWF(newf) \
+ ((newf)[0] != 'Z' || (newf)[1] != 'E' || (newf)[2] != 'L' || (newf)[3] != 'D' || (newf)[4] != 'A' || \
+ (newf)[5] != '3')
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80143AC4.s")
+// default scene flags (?)
+// indices of subarray:
+// - 0: switch0
+// - 1: switch1
+// - 2: chest
+// - 3: collectible
+u32 D_801C5FC0[SCENE_MAX][4] = {
+ { 0xC00, 0, 0, 0x40000000 }, // SCENE_20SICHITAI2
+ { 0, 0, 0, 0 }, // SCENE_UNSET_1
+ { 0, 0, 0, 0 }, // SCENE_UNSET_2
+ { 0, 0, 0, 0 }, // SCENE_UNSET_3
+ { 0, 0, 0, 0 }, // SCENE_UNSET_4
+ { 0, 0, 0, 0 }, // SCENE_UNSET_5
+ { 0, 0, 0, 0 }, // SCENE_UNSET_6
+ { 0, 0, 0, 0xC04 }, // SCENE_KAKUSIANA
+ { 0, 0, 0, 0 }, // SCENE_SPOT00
+ { 0, 0, 0, 0 }, // SCENE_UNSET_9
+ { 0, 0, 0, 0 }, // SCENE_WITCH_SHOP
+ { 0, 0, 0, 0x80000000 }, // SCENE_LAST_BS
+ { 0, 0, 0, 0x80000000 }, // SCENE_HAKASHITA
+ { 0, 0, 0, 0 }, // SCENE_AYASHIISHOP
+ { 0, 0, 0, 0 }, // SCENE_UNSET_E
+ { 0, 0, 0, 0 }, // SCENE_UNSET_F
+ { 0, 0, 0, 0 }, // SCENE_OMOYA
+ { 0, 0, 0, 0 }, // SCENE_BOWLING
+ { 0, 0, 0, 0 }, // SCENE_SONCHONOIE
+ { 0x100000, 0, 0, 0x40000002 }, // SCENE_IKANA
+ { 0, 0, 0, 0 }, // SCENE_KAIZOKU
+ { 0, 0, 0, 0 }, // SCENE_MILK_BAR
+ { 0x4000000, 0, 0, 0 }, // SCENE_INISIE_N
+ { 2, 0, 0, 0 }, // SCENE_TAKARAYA
+ { 0x4000000, 0, 0, 0 }, // SCENE_INISIE_R
+ { 0, 0, 0, 0 }, // SCENE_OKUJOU
+ { 0xF, 0, 0, 0 }, // SCENE_OPENINGDAN
+ { 0x70B000, 0, 0, 0 }, // SCENE_MITURIN
+ { 0, 0, 0, 0 }, // SCENE_13HUBUKINOMITI
+ { 0, 0x80000000, 0, 0x400 }, // SCENE_CASTLE
+ { 0, 0, 0, 0 }, // SCENE_DEKUTES
+ { 0, 0, 0, 0x80000000 }, // SCENE_MITURIN_BS
+ { 0, 0, 0, 0 }, // SCENE_SYATEKI_MIZU
+ { 0x1A00020, 0, 0, 0 }, // SCENE_HAKUGIN
+ { 0x400, 0, 0, 0 }, // SCENE_ROMANYMAE
+ { 0, 0, 0, 0x1000 }, // SCENE_PIRATE
+ { 0, 0, 0, 0 }, // SCENE_SYATEKI_MORI
+ { 0, 0, 0, 2 }, // SCENE_SINKAI
+ { 0x400, 0, 0, 0 }, // SCENE_YOUSEI_IZUMI
+ { 0, 0, 0, 0 }, // SCENE_KINSTA1
+ { 0, 0, 0, 0x80000000 }, // SCENE_KINDAN2
+ { 0, 0, 0, 0 }, // SCENE_TENMON_DAI
+ { 0, 0, 0, 2 }, // SCENE_LAST_DEKU
+ { 0, 0, 0, 0x40000000 }, // SCENE_22DEKUCITY
+ { 0, 0, 0, 0 }, // SCENE_KAJIYA
+ { 0x10, 0, 0, 0 }, // SCENE_00KEIKOKU
+ { 3, 0, 0, 0 }, // SCENE_POSTHOUSE
+ { 0, 0, 0, 0 }, // SCENE_LABO
+ { 0, 0, 0, 0x80000000 }, // SCENE_DANPEI2TEST
+ { 0, 0, 0, 0 }, // SCENE_UNSET_31
+ { 0, 0, 0, 0 }, // SCENE_16GORON_HOUSE
+ { 0, 0, 0, 0 }, // SCENE_33ZORACITY
+ { 0, 0, 0, 0 }, // SCENE_8ITEMSHOP
+ { 0, 0, 0, 0 }, // SCENE_F01
+ { 0, 0, 0, 0x80000000 }, // SCENE_INISIE_BS
+ { 0x100400, 0, 0, 0x22 }, // SCENE_30GYOSON
+ { 0x400, 0, 0, 0x80 }, // SCENE_31MISAKI
+ { 0, 0, 0, 0 }, // SCENE_TAKARAKUJI
+ { 0, 0, 0, 0 }, // SCENE_UNSET_3A
+ { 0x400, 0, 0, 0 }, // SCENE_TORIDE
+ { 0, 0, 0, 0 }, // SCENE_FISHERMAN
+ { 0, 0, 0, 0 }, // SCENE_GORONSHOP
+ { 0, 0, 0, 0 }, // SCENE_DEKU_KING
+ { 0, 0, 0, 2 }, // SCENE_LAST_GORON
+ { 0, 0, 0, 0x80000002 }, // SCENE_24KEMONOMITI
+ { 0, 0, 0, 0 }, // SCENE_F01_B
+ { 0, 0, 0, 0 }, // SCENE_F01C
+ { 0, 0, 0, 0 }, // SCENE_BOTI
+ { 0, 0, 0, 0x80000000 }, // SCENE_HAKUGIN_BS
+ { 0xC00, 0, 0, 0x40000000 }, // SCENE_20SICHITAI
+ { 0x102, 0, 0, 0x400 }, // SCENE_21MITURINMAE
+ { 0, 0, 0, 2 }, // SCENE_LAST_ZORA
+ { 0, 0, 0, 0x40000000 }, // SCENE_11GORONNOSATO2
+ { 0x70, 0, 0, 0 }, // SCENE_SEA
+ { 0, 0, 0, 0 }, // SCENE_35TAKI
+ { 0, 0, 0, 0 }, // SCENE_REDEAD
+ { 0, 0, 0, 0x40000000 }, // SCENE_BANDROOM
+ { 0, 0, 0, 0x40000000 }, // SCENE_11GORONNOSATO
+ { 0, 0, 0, 0 }, // SCENE_GORON_HAKA
+ { 0, 0, 0, 0 }, // SCENE_SECOM
+ { 0x100000, 0, 0, 0x80000000 }, // SCENE_10YUKIYAMANOMURA
+ { 0, 0, 0, 0 }, // SCENE_TOUGITES
+ { 0, 0, 0, 0 }, // SCENE_DANPEI
+ { 0, 0, 0, 0 }, // SCENE_IKANAMAE
+ { 0, 0, 0, 0 }, // SCENE_DOUJOU
+ { 0, 0, 0, 0 }, // SCENE_MUSICHOUSE
+ { 0, 0, 0, 0 }, // SCENE_IKNINSIDE
+ { 0, 0, 0, 0 }, // SCENE_MAP_SHOP
+ { 0x400, 0, 0, 0 }, // SCENE_F40
+ { 0x400, 0, 0, 0 }, // SCENE_F41
+ { 0x100000, 0, 0, 0x80000000 }, // SCENE_10YUKIYAMANOMURA2
+ { 0, 0, 0, 0x100 }, // SCENE_14YUKIDAMANOMITI
+ { 0x400, 0, 0, 0 }, // SCENE_12HAKUGINMAE
+ { 0, 0, 0, 0x80 }, // SCENE_17SETUGEN
+ { 0, 0, 0, 0x80 }, // SCENE_17SETUGEN2
+ { 0, 0, 0, 0x80000000 }, // SCENE_SEA_BS
+ { 0, 0, 0, 0x400 }, // SCENE_RANDOM
+ { 0, 0, 0, 0 }, // SCENE_YADOYA
+ { 0, 0, 0, 0 }, // SCENE_KONPEKI_ENT
+ { 1, 0, 0, 0 }, // SCENE_INSIDETOWER
+ { 0, 0, 0, 0 }, // SCENE_26SARUNOMORI
+ { 0, 0, 0, 0 }, // SCENE_LOST_WOODS
+ { 0, 0, 0, 2 }, // SCENE_LAST_LINK
+ { 0, 0, 0, 0 }, // SCENE_SOUGEN
+ { 0, 0, 0, 0 }, // SCENE_BOMYA
+ { 0, 0, 0, 0 }, // SCENE_KYOJINNOMA
+ { 0, 0, 0, 0 }, // SCENE_KOEPONARACE
+ { 0, 0, 0, 0 }, // SCENE_GORONRACE
+ { 1, 0, 0, 0 }, // SCENE_TOWN
+ { 0, 0, 0, 0 }, // SCENE_ICHIBA
+ { 0, 0, 0, 0x400 }, // SCENE_BACKTOWN
+ { 0x100000, 0, 0, 0x400 }, // SCENE_CLOCKTOWER
+ { 0, 0, 1, 0 }, // SCENE_ALLEY
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80143B0C.s")
+// Related to weekEventReg
+u16 D_801C66D0[ARRAY_COUNT(gSaveContext.save.weekEventReg)] = {
+ 0xFFFC, 0xFFFF, 0xFFFF, 0xFFFF, 0, 0, 0, 0xC000, 0xC00, 0, 0xC0, 0, 0x300,
+ 0x3000, 0xC000, 0xC00, 0, 0, 0, 0, 0, 0, 0xC00C, 0xC00C, 0xC008, 3,
+ 0x3000, 0, 0, 0, 0xFF00, 0xC3F, 0x3F, 0, 0, 0xCFFF, 0, 0, 0xC00,
+ 0xC00, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3C, 0x20,
+ 0, 0x300C, 0x3000, 0, 0xC, 0xC0, 0, 0xFF0, 0x300, 0, 0, 0xC00, 0,
+ 0, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xC0, 0, 0xC000, 0, 3,
+ 0, 0xC000, 0, 0xC0, 0x300, 0, 0, 0, 0xC000, 0xFFF0, 0, 0, 0x300,
+ 0, 0xC000, 0xF0, 0, 0, 0, 0, 0, 0,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/Sram_IncrementDay.s")
+// used in other files
+s32 D_801C6798[] = {
+ 0x00000020, 0x00001470, 0x000028C0, 0x00003D10, 0x00005160, 0x000065B0,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/Sram_CalcChecksum.s")
+u8 D_801C67B0[24] = {
+ ITEM_NONE, ITEM_BOW, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_BOMB, ITEM_BOMBCHU,
+ ITEM_STICK, ITEM_NUT, ITEM_MAGIC_BEANS, ITEM_NONE, ITEM_POWDER_KEG, ITEM_PICTO_BOX, ITEM_NONE, ITEM_NONE,
+ ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80144628.s")
+s32 D_801C67C8[] = { 0, 0x40, 0x80, 0xC0, 0x100, 0x180, 0x200, 0x280 };
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/Sram_GenerateRandomSaveFields.s")
+s32 D_801C67E8[] = { 0x300, 0x380 };
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80144890.s")
+s32 D_801C67F0[] = { 0x40, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80 };
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/Sram_InitDebugSave.s")
+s32 D_801C6810[] = { 1, 1 };
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80144A94.s")
+s32 D_801C6818[] = { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 };
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80144E78.s")
+s32 D_801C6838[] = { 1, 1 };
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_8014546C.s")
+s32 D_801C6840[] = { 0x100, 0x180, 0x200, 0x280 };
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80145698.s")
+s32 D_801C6850[] = { 0x80, 0x80, 0x80, 0x80, 0x300, 0x380, 1, 1 };
+s32 D_801C6870[] = {
+ sizeof(Save),
+ sizeof(Save),
+ sizeof(Save),
+ sizeof(Save),
+ offsetof(SaveContext, fileNum),
+ offsetof(SaveContext, fileNum),
+ offsetof(SaveContext, fileNum),
+ offsetof(SaveContext, fileNum),
+};
+
+u8 D_801C6890[8] = { 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80 };
+
+u16 D_801F6AF0;
+u8 D_801F6AF2;
+
+void Sram_ActivateOwl(u8 owlId) {
+ gSaveContext.save.playerData.owlActivationFlags =
+ ((void)0, gSaveContext.save.playerData.owlActivationFlags) | (u16)gBitFlags[owlId];
+
+ if (gSaveContext.save.playerData.unk_20 == 0xFF) {
+ gSaveContext.save.playerData.unk_20 = owlId;
+ }
+}
+
+void Sram_ClearHighscores(void) {
+ gSaveContext.save.unk_EE8 = (gSaveContext.save.unk_EE8 & 0xFFFF) | 0x130000;
+ gSaveContext.save.unk_EE8 = (gSaveContext.save.unk_EE8 & 0xFFFF0000) | 0xA;
+ gSaveContext.save.horseBackBalloonHighScore = 6000; // 60 seconds
+ gSaveContext.save.unk_EF4 = (gSaveContext.save.unk_EF4 & 0xFFFF0000) | 0x27;
+ gSaveContext.save.unk_EF4 = (gSaveContext.save.unk_EF4 & 0xFFFF) | 0xA0000;
+
+ gSaveContext.save.dekuPlaygroundHighScores[0] = 7500; // 75 seconds
+ gSaveContext.save.dekuPlaygroundHighScores[1] = 7500; // 75 seconds
+ gSaveContext.save.dekuPlaygroundHighScores[2] = 7600; // 76 seconds
+}
+
+/**
+ * Clears specific weekEventReg flags. Used by the "Dawn of the First Day" message
+ */
+void Sram_ClearFlagsAtDawnOfTheFirstDay(void) {
+ // Unconfirmed: "Link the Goron Claims His Reservation: 4:30 PM"
+ gSaveContext.save.weekEventReg[55] &= (u8)~2;
+ // Unconfirmed: "Postman fleeing town"
+ gSaveContext.save.weekEventReg[90] &= (u8)~1;
+ // Unconfirmed: "Postman is about to flee"
+ gSaveContext.save.weekEventReg[89] &= (u8)~0x40;
+ // Unconfirmed: "Postman has delivered priority mail"
+ gSaveContext.save.weekEventReg[89] &= (u8)~8;
+ // Unconfirmed: "Postman showing priority mail to Madame"
+ gSaveContext.save.weekEventReg[85] &= (u8)~0x80;
+}
+
+/**
+ * Used by Song of Time (when clicking "Yes") and (indirectly) by the "Dawn of the New Day" cutscene
+ */
+void Sram_SaveEndOfCycle(GlobalContext* globalCtx) {
+ s16 sceneNum;
+ s32 j;
+ s32 i;
+ u8 temp;
+ u8 temp2;
+
+ gSaveContext.save.daySpeed = 0;
+ gSaveContext.save.daysElapsed = 0;
+ gSaveContext.save.day = 0;
+ gSaveContext.save.time = CLOCK_TIME(6, 0) - 1;
+
+ gSaveContext.save.playerData.deaths++;
+ if (gSaveContext.save.playerData.deaths > 999) {
+ gSaveContext.save.playerData.deaths = 999;
+ }
+
+ sceneNum = Play_GetOriginalSceneNumber(globalCtx->sceneNum);
+ Play_SaveCycleSceneFlags(&globalCtx->state);
+
+ globalCtx->actorCtx.flags.chest &= D_801C5FC0[sceneNum][2];
+ globalCtx->actorCtx.flags.switches[0] &= D_801C5FC0[sceneNum][0];
+ globalCtx->actorCtx.flags.switches[1] &= D_801C5FC0[sceneNum][1];
+ globalCtx->actorCtx.flags.collectible[0] &= D_801C5FC0[sceneNum][3];
+ globalCtx->actorCtx.flags.clearedRoom = 0;
+
+ for (i = 0; i < SCENE_MAX; i++) {
+ gSaveContext.cycleSceneFlags[i].switch0 = ((void)0, gSaveContext.cycleSceneFlags[i].switch0) & D_801C5FC0[i][0];
+ gSaveContext.cycleSceneFlags[i].switch1 = ((void)0, gSaveContext.cycleSceneFlags[i].switch1) & D_801C5FC0[i][1];
+ gSaveContext.cycleSceneFlags[i].chest = ((void)0, gSaveContext.cycleSceneFlags[i].chest) & D_801C5FC0[i][2];
+ gSaveContext.cycleSceneFlags[i].collectible =
+ ((void)0, gSaveContext.cycleSceneFlags[i].collectible) & D_801C5FC0[i][3];
+ gSaveContext.cycleSceneFlags[i].clearedRoom = 0;
+ gSaveContext.save.permanentSceneFlags[i].unk_14 = 0;
+ gSaveContext.save.permanentSceneFlags[i].unk_18 = 0;
+ }
+
+ for (; i < ARRAY_COUNT(gSaveContext.cycleSceneFlags); i++) {
+ gSaveContext.cycleSceneFlags[i].chest = 0;
+ gSaveContext.cycleSceneFlags[i].switch0 = 0;
+ gSaveContext.cycleSceneFlags[i].switch1 = 0;
+ gSaveContext.cycleSceneFlags[i].clearedRoom = 0;
+ gSaveContext.cycleSceneFlags[i].collectible = 0;
+ }
+
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.maskMaskBit); i++) {
+ gSaveContext.maskMaskBit[i] = 0;
+ }
+
+ if (gSaveContext.save.weekEventReg[84] & 0x20) {
+ func_801149A0(ITEM_MASK_FIERCE_DEITY, SLOT(ITEM_MASK_FIERCE_DEITY));
+ }
+
+ for (i = 0; i < ARRAY_COUNT(D_801C66D0); i++) {
+ u16 phi_v1_3 = D_801C66D0[i];
+
+ for (j = 0; j < ARRAY_COUNT(D_801C6890); j++) {
+ if ((phi_v1_3 & 3) == 0) {
+ gSaveContext.save.weekEventReg[i] =
+ ((void)0, gSaveContext.save.weekEventReg[i]) & (0xFF ^ D_801C6890[j]);
+ }
+ phi_v1_3 >>= 2;
+ }
+ }
+
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.eventInf); i++) {
+ gSaveContext.eventInf[i] = 0;
+ }
+
+ gSaveContext.eventInf[7] &= (u8)~1;
+ gSaveContext.eventInf[7] &= (u8)~2;
+ gSaveContext.eventInf[7] &= (u8)~4;
+ gSaveContext.eventInf[7] &= (u8)~8;
+ gSaveContext.eventInf[7] &= (u8)~0x10;
+
+ if (gSaveContext.save.playerData.rupees != 0) {
+ gSaveContext.eventInf[7] |= 1;
+ }
+
+ if (INV_CONTENT(ITEM_BOMB) == ITEM_BOMB) {
+ temp2 = INV_CONTENT(ITEM_BOMB);
+ if (AMMO(temp2) != 0) {
+ gSaveContext.eventInf[7] |= 2;
+ }
+ }
+ if (INV_CONTENT(ITEM_NUT) == ITEM_NUT) {
+ temp2 = INV_CONTENT(ITEM_NUT);
+ if (AMMO(temp2) != 0) {
+ gSaveContext.eventInf[7] |= 4;
+ }
+ }
+ if (INV_CONTENT(ITEM_STICK) == ITEM_STICK) {
+ temp2 = INV_CONTENT(ITEM_STICK);
+ if (AMMO(temp2) != 0) {
+ gSaveContext.eventInf[7] |= 8;
+ }
+ }
+ if (INV_CONTENT(ITEM_BOW) == ITEM_BOW) {
+ temp2 = INV_CONTENT(ITEM_BOW);
+ if (AMMO(temp2) != 0) {
+ gSaveContext.eventInf[7] |= 0x10;
+ }
+ }
+
+ for (i = 0; i < ARRAY_COUNT(D_801C67B0); i++) {
+ if (D_801C67B0[i] != ITEM_NONE) {
+ if ((gSaveContext.save.inventory.items[i] != ITEM_NONE) && (i != SLOT_PICTO_BOX)) {
+ temp2 = gSaveContext.save.inventory.items[i];
+ AMMO(temp2) = 0;
+ }
+ }
+ }
+
+ for (i = SLOT_BOTTLE_1; i <= SLOT_BOTTLE_6; i++) {
+ // Check for all bottled items
+ if (gSaveContext.save.inventory.items[i] >= ITEM_POTION_RED) {
+ if (gSaveContext.save.inventory.items[i] <= ITEM_OBABA_DRINK) {
+ for (j = 1; j < 4; j++) {
+ if (GET_CUR_FORM_BTN_ITEM(j) == gSaveContext.save.inventory.items[i]) {
+ SET_CUR_FORM_BTN_ITEM(j, ITEM_BOTTLE);
+ func_80112B40(globalCtx, j);
+ }
+ }
+ gSaveContext.save.inventory.items[i] = ITEM_BOTTLE;
+ }
+ }
+ }
+
+ REMOVE_QUEST_ITEM(QUEST_UNK_19);
+
+ if (gSaveContext.save.playerData.health < 0x30) {
+ gSaveContext.save.playerData.health = 0x30;
+ }
+
+ if (GET_CUR_EQUIP_VALUE(EQUIP_SWORD) < 3) {
+ SET_EQUIP_VALUE(EQUIP_SWORD, 1);
+
+ if (CUR_FORM == 0) {
+ if ((STOLEN_ITEM_1 >= ITEM_SWORD_GILDED) || (STOLEN_ITEM_2 >= ITEM_SWORD_GILDED)) {
+ BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_SWORD_GILDED;
+ SET_EQUIP_VALUE(EQUIP_SWORD, 3);
+ } else {
+ BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_SWORD_KOKIRI;
+ }
+ } else {
+ if ((STOLEN_ITEM_1 >= ITEM_SWORD_GILDED) || (STOLEN_ITEM_2 >= ITEM_SWORD_GILDED)) {
+ BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_B) = ITEM_SWORD_GILDED;
+ SET_EQUIP_VALUE(EQUIP_SWORD, 3);
+ } else {
+ BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_B) = ITEM_SWORD_KOKIRI;
+ }
+ }
+ }
+
+ if ((STOLEN_ITEM_1 == ITEM_SWORD_GREAT_FAIRY) || (STOLEN_ITEM_2 == ITEM_SWORD_GREAT_FAIRY)) {
+ INV_CONTENT(ITEM_SWORD_GREAT_FAIRY) = ITEM_SWORD_GREAT_FAIRY;
+ }
+
+ if (STOLEN_ITEM_1 == ITEM_BOTTLE) {
+ temp = SLOT(ITEM_BOTTLE);
+ for (i = 0; i < 6; i++) {
+ if (gSaveContext.save.inventory.items[temp + i] == ITEM_NONE) {
+ gSaveContext.save.inventory.items[temp + i] = ITEM_BOTTLE;
+ break;
+ }
+ }
+ }
+
+ if (STOLEN_ITEM_2 == ITEM_BOTTLE) {
+ temp = SLOT(ITEM_BOTTLE);
+ for (i = 0; i < 6; i++) {
+ if (gSaveContext.save.inventory.items[temp + i] == ITEM_NONE) {
+ gSaveContext.save.inventory.items[temp + i] = ITEM_BOTTLE;
+ break;
+ }
+ }
+ }
+
+ SET_STOLEN_ITEM_1(STOLEN_ITEM_NONE);
+ SET_STOLEN_ITEM_2(STOLEN_ITEM_NONE);
+
+ // ??
+ func_801149A0(ITEM_OCARINA_FAIRY, SLOT_TRADE_DEED);
+ func_801149A0(ITEM_SLINGSHOT, SLOT_TRADE_KEY_MAMA);
+ func_801149A0(ITEM_LONGSHOT, SLOT_TRADE_COUPLE);
+
+ for (j = 1; j < 4; j++) {
+ if (GET_CUR_FORM_BTN_ITEM(j) >= ITEM_MOON_TEAR && GET_CUR_FORM_BTN_ITEM(j) <= ITEM_PENDANT_MEMORIES) {
+ SET_CUR_FORM_BTN_ITEM(j, ITEM_NONE);
+ func_80112B40(globalCtx, j);
+ }
+ }
+
+ gSaveContext.save.skullTokenCount &= ~0xFFFF0000;
+ gSaveContext.save.skullTokenCount &= ~0x0000FFFF;
+ gSaveContext.save.unk_EC4 = 0;
+
+ gSaveContext.save.unk_E88[0] = 0;
+ gSaveContext.save.unk_E88[1] = 0;
+ gSaveContext.save.unk_E88[2] = 0;
+ gSaveContext.save.unk_E88[3] = 0;
+ gSaveContext.save.unk_E88[4] = 0;
+ gSaveContext.save.unk_E88[5] = 0;
+ gSaveContext.save.unk_E88[6] = 0;
+
+ Sram_ClearHighscores();
+
+ for (i = 0; i < 8; i++) {
+ gSaveContext.save.inventory.dungeonItems[i] &= (u8)~1;
+ gSaveContext.save.inventory.dungeonKeys[i] = 0;
+ gSaveContext.save.inventory.strayFairies[i] = 0;
+ }
+
+ gSaveContext.save.playerData.rupees = 0;
+ gSaveContext.save.unk_F65 = 0;
+ gSaveContext.powderKegTimer = 0;
+ gSaveContext.unk_1014 = 0;
+ gSaveContext.jinxTimer = 0;
+ gSaveContext.rupeeAccumulator = 0;
+
+ func_800F3B2C(globalCtx);
+}
+
+void Sram_IncrementDay(void) {
+ if (CURRENT_DAY <= 3) {
+ gSaveContext.save.day++;
+ gSaveContext.save.daysElapsed++;
+ }
+
+ gSaveContext.save.bombersCaughtNum = 0;
+ gSaveContext.save.bombersCaughtOrder[0] = 0;
+ gSaveContext.save.bombersCaughtOrder[1] = 0;
+ gSaveContext.save.bombersCaughtOrder[2] = 0;
+ gSaveContext.save.bombersCaughtOrder[3] = 0;
+ gSaveContext.save.bombersCaughtOrder[4] = 0;
+
+ // Unconfirmed: "Bombers Hide & Seek started on Day 1???"
+ gSaveContext.save.weekEventReg[73] &= (u8)~0x10;
+ // Unconfirmed: "Bombers Hide & Seek in Progress"
+ gSaveContext.save.weekEventReg[85] &= (u8)~2;
+}
+
+u16 Sram_CalcChecksum(void* data, size_t count) {
+ u8* dataPtr = data;
+ u16 chkSum = 0;
+
+ while (count-- > 0) {
+ chkSum += *dataPtr;
+ dataPtr++;
+ }
+ return chkSum;
+}
+
+// Resets `Save` substruct
+void Sram_ResetSave(void) {
+ gSaveContext.save.entranceIndex = 0x1C00;
+ gSaveContext.save.equippedMask = 0;
+ gSaveContext.save.isFirstCycle = false;
+ gSaveContext.save.unk_06 = 0;
+ gSaveContext.save.linkAge = 0;
+ gSaveContext.save.isNight = false;
+ gSaveContext.save.daySpeed = 0;
+ gSaveContext.save.snowheadCleared = 0;
+ gSaveContext.save.hasTatl = false;
+ gSaveContext.save.isOwlSave = false;
+
+ // Instead of bloating all save context accesses with an extra sub-struct, the size of the would-be sub-struct
+ // is calculated manually
+ bzero(&gSaveContext.save.playerData, sizeof(Save) - offsetof(Save, playerData));
+}
+
+/**
+ * Initializes with random values the following fields:
+ * - lotteryCodes
+ * - spiderHouseMaskOrder
+ * - bomberCode
+ */
+void Sram_GenerateRandomSaveFields(void) {
+ s32 randBombers;
+ s16 sp2A;
+ s16 pad;
+ s16 i;
+ s16 j;
+ s32 k;
+ s16 randSpiderHouse;
+
+ Sram_ClearHighscores();
+
+ gSaveContext.save.lotteryCodes[0][0] = Rand_S16Offset(0, 10);
+ gSaveContext.save.lotteryCodes[0][1] = Rand_S16Offset(0, 10);
+ gSaveContext.save.lotteryCodes[0][2] = Rand_S16Offset(0, 10);
+ gSaveContext.save.lotteryCodes[1][0] = Rand_S16Offset(0, 10);
+ gSaveContext.save.lotteryCodes[1][1] = Rand_S16Offset(0, 10);
+ gSaveContext.save.lotteryCodes[1][2] = Rand_S16Offset(0, 10);
+ gSaveContext.save.lotteryCodes[2][0] = Rand_S16Offset(0, 10);
+ gSaveContext.save.lotteryCodes[2][1] = Rand_S16Offset(0, 10);
+ gSaveContext.save.lotteryCodes[2][2] = Rand_S16Offset(0, 10);
+
+ // Needed to match...
+ for (i = 0; i < 3; i++) {
+ for (j = 0; j < 3; j++) {}
+ }
+
+ i = 0;
+ sp2A = Rand_S16Offset(0, 16) & 3;
+ k = 6;
+ while (i != k) {
+ randSpiderHouse = Rand_S16Offset(0, 16) & 3;
+ if (sp2A != randSpiderHouse) {
+ gSaveContext.save.spiderHouseMaskOrder[i] = randSpiderHouse;
+ i++;
+ sp2A = randSpiderHouse;
+ }
+ }
+
+ do {
+ randBombers = Rand_S16Offset(0, 6);
+ } while (randBombers <= 0 || randBombers >= 6);
+
+ gSaveContext.save.bomberCode[0] = randBombers;
+
+ i = 1;
+ while (i != 5) {
+ k = false;
+
+ do {
+ randBombers = Rand_S16Offset(0, 6);
+ } while (randBombers <= 0 || randBombers >= 6);
+
+ sp2A = 0;
+ do {
+ if (randBombers == gSaveContext.save.bomberCode[sp2A]) {
+ k = true;
+ }
+ sp2A++;
+ } while (sp2A < i);
+
+ if (k == false) {
+ gSaveContext.save.bomberCode[i] = randBombers;
+ i++;
+ }
+ }
+}
+
+SavePlayerData sSaveDefaultPlayerData = {
+ { '\0', '\0', '\0', '\0', '\0', '\0' }, // newf
+ 0, // deaths
+ { 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E }, // playerName " "
+ 0x30, // healthCapacity
+ 0x30, // health
+ 0, // magicLevel
+ 0x30, // magic
+ 0, // rupees
+ 0, // swordHealth
+ 0, // tatlTimer
+ 0, // magicAcquired
+ 0, // doubleMagic
+ 0, // doubleDefense
+ 0, // unk_1F
+ 0xFF, // unk_20
+ 0x0000, // owlActivationFlags
+ 0xFF, // unk_24
+ SCENE_SPOT00, // savedSceneNum
+};
+
+ItemEquips sSaveDefaultItemEquips = {
+ {
+ { ITEM_SWORD_KOKIRI, ITEM_NONE, ITEM_NONE, ITEM_NONE },
+ { ITEM_SWORD_KOKIRI, ITEM_NONE, ITEM_NONE, ITEM_NONE },
+ { ITEM_SWORD_KOKIRI, ITEM_NONE, ITEM_NONE, ITEM_NONE },
+ { ITEM_UNK_FD, ITEM_NONE, ITEM_NONE, ITEM_NONE },
+ },
+ {
+ { SLOT_OCARINA, SLOT_NONE, SLOT_NONE, SLOT_NONE },
+ { SLOT_NONE, SLOT_NONE, SLOT_NONE, SLOT_NONE },
+ { SLOT_NONE, SLOT_NONE, SLOT_NONE, SLOT_NONE },
+ { SLOT_NONE, SLOT_NONE, SLOT_NONE, SLOT_NONE },
+ },
+ 0x11,
+};
+
+Inventory sSaveDefaultInventory = {
+ // items
+ {
+ ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE,
+ ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE,
+ ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE,
+ ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE,
+ ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE,
+ },
+ // ammo
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ // upgrades
+ 0x120000,
+ // questItems
+ 0,
+ // dungeonItems
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ // dungeonKeys
+ { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0 },
+ // strayFairies
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ // dekuPlaygroundPlayerName
+ {
+ // "LINK "
+ { 0x15, 0x12, 0x17, 0x14, 0x3E, 0x3E, 0x3E, 0x3E },
+ // "LINK "
+ { 0x15, 0x12, 0x17, 0x14, 0x3E, 0x3E, 0x3E, 0x3E },
+ // "LINK "
+ { 0x15, 0x12, 0x17, 0x14, 0x3E, 0x3E, 0x3E, 0x3E },
+ },
+};
+
+u16 sSaveDefaultChecksum = 0;
+
+/**
+ * Initialize new save.
+ * This save has an empty inventory with 3 hearts, sword and shield.
+ */
+void Sram_InitNewSave(void) {
+ gSaveContext.save.playerForm = PLAYER_FORM_HUMAN;
+ gSaveContext.save.daysElapsed = 0;
+ gSaveContext.save.day = 0;
+ gSaveContext.save.time = CLOCK_TIME(6, 0) - 1;
+ Sram_ResetSave();
+
+ Lib_MemCpy(&gSaveContext.save.playerData, &sSaveDefaultPlayerData, sizeof(SavePlayerData));
+ Lib_MemCpy(&gSaveContext.save.equips, &sSaveDefaultItemEquips, sizeof(ItemEquips));
+ Lib_MemCpy(&gSaveContext.save.inventory, &sSaveDefaultInventory, sizeof(Inventory));
+ Lib_MemCpy(&gSaveContext.save.checksum, &sSaveDefaultChecksum, sizeof(gSaveContext.save.checksum));
+
+ gSaveContext.save.horseData.scene = SCENE_F01;
+ gSaveContext.save.horseData.pos.x = -1420;
+ gSaveContext.save.horseData.pos.y = 257;
+ gSaveContext.save.horseData.pos.z = -1285;
+ gSaveContext.save.horseData.yaw = -0x7554;
+
+ gSaveContext.nextCutsceneIndex = 0;
+ gSaveContext.save.playerData.magicLevel = 0;
+ Sram_GenerateRandomSaveFields();
+}
+
+SavePlayerData sSaveDebugPlayerData = {
+ { 'Z', 'E', 'L', 'D', 'A', '3' }, // newf
+ 0x0000, // deaths
+ { 0x15, 0x12, 0x17, 0x14, 0x3E, 0x3E, 0x3E, 0x3E }, // playerName "LINK "
+ 0x80, // healthCapacity
+ 0x80, // health
+ 0, // magicLevel
+ 0x30, // magic
+ 0x32, // rupees
+ 0x64, // swordHealth
+ 0, // tatlTimer
+ 1, // magicAcquired
+ 0, // doubleMagic
+ 0, // doubleDefense
+ 0, // unk_1F
+ 0xFF, // unk_20
+ 0, // owlActivationFlags
+ 0xFF, // unk_24
+ SCENE_SPOT00, // savedSceneNum
+};
+
+ItemEquips sSaveDebugItemEquips = {
+ {
+ { ITEM_SWORD_KOKIRI, ITEM_BOW, ITEM_POTION_RED, ITEM_OCARINA },
+ { ITEM_SWORD_KOKIRI, ITEM_BOW, ITEM_MASK_GORON, ITEM_OCARINA },
+ { ITEM_SWORD_KOKIRI, ITEM_BOW, ITEM_MASK_ZORA, ITEM_OCARINA },
+ { ITEM_NUT, ITEM_NUT, ITEM_MASK_DEKU, ITEM_OCARINA },
+ },
+ {
+ { SLOT_OCARINA, SLOT_BOW, SLOT_BOTTLE_2, SLOT_OCARINA },
+ { SLOT_OCARINA, SLOT_MAGIC_BEANS, SLOT_MASK_GORON, SLOT_BOMBCHU },
+ { SLOT_OCARINA, SLOT_POWDER_KEG, SLOT_MASK_ZORA, SLOT_BOMBCHU },
+ { SLOT_OCARINA, SLOT_BOW, SLOT_MASK_DEKU, SLOT_BOMBCHU },
+ },
+ 0x11,
+};
+
+Inventory sSaveDebugInventory = {
+ // items
+ {
+ ITEM_OCARINA,
+ ITEM_BOW,
+ ITEM_ARROW_FIRE,
+ ITEM_ARROW_ICE,
+ ITEM_ARROW_LIGHT,
+ ITEM_MOON_TEAR,
+ ITEM_BOMB,
+ ITEM_BOMBCHU,
+ ITEM_STICK,
+ ITEM_NUT,
+ ITEM_MAGIC_BEANS,
+ ITEM_ROOM_KEY,
+ ITEM_POWDER_KEG,
+ ITEM_PICTO_BOX,
+ ITEM_LENS,
+ ITEM_HOOKSHOT,
+ ITEM_SWORD_GREAT_FAIRY,
+ ITEM_LETTER_TO_KAFEI,
+ ITEM_BOTTLE,
+ ITEM_POTION_RED,
+ ITEM_POTION_GREEN,
+ ITEM_POTION_BLUE,
+ ITEM_NONE,
+ ITEM_NONE,
+ ITEM_MASK_POSTMAN,
+ ITEM_MASK_ALL_NIGHT,
+ ITEM_MASK_BLAST,
+ ITEM_MASK_STONE,
+ ITEM_MASK_GREAT_FAIRY,
+ ITEM_MASK_DEKU,
+ ITEM_MASK_KEATON,
+ ITEM_MASK_BREMEN,
+ ITEM_MASK_BUNNY,
+ ITEM_MASK_DON_GERO,
+ ITEM_MASK_SCENTS,
+ ITEM_MASK_GORON,
+ ITEM_MASK_ROMANI,
+ ITEM_MASK_CIRCUS_LEADER,
+ ITEM_MASK_KAFEIS_MASK,
+ ITEM_MASK_COUPLE,
+ ITEM_MASK_TRUTH,
+ ITEM_MASK_ZORA,
+ ITEM_MASK_KAMARO,
+ ITEM_MASK_GIBDO,
+ ITEM_MASK_GARO,
+ ITEM_MASK_CAPTAIN,
+ ITEM_MASK_GIANT,
+ ITEM_MASK_FIERCE_DEITY,
+ },
+ // ammo
+ { 1, 30, 1, 1, 1, 1, 30, 30, 30, 30, 1, 1, 1, 1, 30, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
+ // upgrades
+ 0x120009,
+ // questItems
+ (1 << QUEST_SONG_SONATA) | (1 << QUEST_SONG_LULLABY) | (1 << QUEST_SONG_BOSSA_NOVA) | (1 << QUEST_SONG_ELEGY) |
+ (1 << QUEST_SONG_OATH) | (1 << QUEST_SONG_TIME) | (1 << QUEST_SONG_HEALING) | (1 << QUEST_SONG_EPONA) |
+ (1 << QUEST_SONG_SOARING) | (1 << QUEST_SONG_STORMS) | (1 << QUEST_BOMBERS_NOTEBOOK) |
+ (1 << QUEST_SONG_LULLABY_INTRO),
+ // dungeonItems
+ { 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 },
+ // dungeonKeys
+ { 8, 8, 8, 8, 8, 8, 8, 8, 8, 0 },
+ // strayFairies
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ // dekuPlaygroundPlayerName
+ {
+ // "LINK "
+ { 0x15, 0x12, 0x17, 0x14, 0x3E, 0x3E, 0x3E, 0x3E },
+ // "LINK "
+ { 0x15, 0x12, 0x17, 0x14, 0x3E, 0x3E, 0x3E, 0x3E },
+ // "LINK "
+ { 0x15, 0x12, 0x17, 0x14, 0x3E, 0x3E, 0x3E, 0x3E },
+ },
+};
+
+u16 sSaveDebugChecksum = 0;
+
+u8 D_801C6A48[] = {
+ ITEM_MASK_FIERCE_DEITY, ITEM_MASK_GORON, ITEM_MASK_ZORA, ITEM_MASK_DEKU, ITEM_MASK_FIERCE_DEITY,
+};
+
+u8 D_801C6A50[] = {
+ SLOT_MASK_FIERCE_DEITY, SLOT_MASK_GORON, SLOT_MASK_ZORA, SLOT_MASK_DEKU, SLOT_MASK_FIERCE_DEITY,
+};
+
+/**
+ * Initialize debug save. This is also used on the Title Screen
+ * This save has a mostly full inventory, every mask and 10 hearts.
+ *
+ * Some noteable flags that are set:
+ * TODO: Investigate the flags
+ */
+void Sram_InitDebugSave(void) {
+ Sram_ResetSave();
+
+ Lib_MemCpy(&gSaveContext.save.playerData, &sSaveDebugPlayerData, sizeof(SavePlayerData));
+ Lib_MemCpy(&gSaveContext.save.equips, &sSaveDebugItemEquips, sizeof(ItemEquips));
+ Lib_MemCpy(&gSaveContext.save.inventory, &sSaveDebugInventory, sizeof(Inventory));
+ Lib_MemCpy(&gSaveContext.save.checksum, &sSaveDebugChecksum, sizeof(gSaveContext.save.checksum));
+
+ if (gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) {
+ BUTTON_ITEM_EQUIP(0, 2) = D_801C6A48[((void)0, gSaveContext.save.playerForm & 0xFF)];
+ C_SLOT_EQUIP(0, 2) = D_801C6A50[((void)0, gSaveContext.save.playerForm & 0xFF)];
+ }
+
+ gSaveContext.save.hasTatl = true;
+
+ gSaveContext.save.horseData.scene = SCENE_F01;
+ gSaveContext.save.horseData.pos.x = -1420;
+ gSaveContext.save.horseData.pos.y = 257;
+ gSaveContext.save.horseData.pos.z = -1285;
+ gSaveContext.save.horseData.yaw = -0x7554;
+
+ gSaveContext.save.entranceIndex = 0x1C00;
+ gSaveContext.save.isFirstCycle = true;
+
+ //
+ gSaveContext.save.weekEventReg[0x0F] |= 0x20;
+ // Unconfirmed: "Entered South Clock Town"
+ gSaveContext.save.weekEventReg[0x3B] |= 0x04;
+ // Unconfirmed: "Tatl's Second Cycle Text?"
+ gSaveContext.save.weekEventReg[0x1F] |= 0x04;
+
+ gSaveContext.cycleSceneFlags[SCENE_INSIDETOWER].switch0 = 1;
+ gSaveContext.save.permanentSceneFlags[SCENE_INSIDETOWER].switch0 = 1;
+ gSaveContext.save.playerData.magicLevel = 0;
+
+ Sram_GenerateRandomSaveFields();
+}
+
+// Unused
+void func_80144A94(SramContext* sramCtx) {
+ s32 i;
+ s32 cutscene = gSaveContext.save.cutscene;
+
+ bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
+
+ if (func_80185968(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2], D_801C67F0[gSaveContext.fileNum * 2]) !=
+ 0) {
+ func_80185968(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2 + 1],
+ D_801C67F0[gSaveContext.fileNum * 2 + 1]);
+ }
+ Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save));
+ if (CHECK_NEWF(gSaveContext.save.playerData.newf)) {
+ func_80185968(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2 + 1],
+ D_801C67F0[gSaveContext.fileNum * 2 + 1]);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, sizeof(Save));
+ }
+ gSaveContext.save.cutscene = cutscene;
+
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.eventInf); i++) {
+ gSaveContext.eventInf[i] = 0;
+ }
+
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.cycleSceneFlags); i++) {
+ gSaveContext.cycleSceneFlags[i].chest = gSaveContext.save.permanentSceneFlags[i].chest;
+ gSaveContext.cycleSceneFlags[i].switch0 = gSaveContext.save.permanentSceneFlags[i].switch0;
+ gSaveContext.cycleSceneFlags[i].switch1 = gSaveContext.save.permanentSceneFlags[i].switch1;
+ gSaveContext.cycleSceneFlags[i].clearedRoom = gSaveContext.save.permanentSceneFlags[i].clearedRoom;
+ gSaveContext.cycleSceneFlags[i].collectible = gSaveContext.save.permanentSceneFlags[i].collectible;
+ }
+
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.unk_3DD0); i++) {
+ gSaveContext.unk_3DD0[i] = 0;
+ gSaveContext.unk_3DE0[i] = 0;
+ gSaveContext.unk_3E18[i] = 0;
+ gSaveContext.unk_3E50[i] = 0;
+ gSaveContext.unk_3E88[i] = 0;
+ gSaveContext.unk_3EC0[i] = 0;
+ }
+
+ D_801BDAA0 = 1;
+ D_801BDA9C = 0;
+ gSaveContext.powderKegTimer = 0;
+ gSaveContext.unk_1014 = 0;
+ gSaveContext.jinxTimer = 0;
+}
+
+u16 D_801C6A58[] = { 0x68B0, 0x6A60, 0xB230, 0x9A80, 0xD890, 0x3E40, 0x8640, 0x84A0, 0x2040, 0xAA30 };
+
+#ifdef NON_MATCHING
+// Small regalloc between v0/t6/t7
+void Sram_OpenSave(FileChooseContext* fileChooseCtx, SramContext* sramCtx) {
+ s32 i;
+ s32 pad;
+ s32 phi_t1;
+ s32 pad1[2];
+ s32 fileNum;
+
+ if (gSaveContext.unk_3F3F) {
+ bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
+
+ if (gSaveContext.fileNum == 0xFF) {
+ func_80185968(sramCtx->saveBuf, D_801C67C8[0], D_801C67F0[0]);
+ } else if (fileChooseCtx->unk_2446A[gSaveContext.fileNum] != 0) {
+ phi_t1 = gSaveContext.fileNum + 2;
+ phi_t1 *= 2;
+
+ if (func_80185968(sramCtx->saveBuf, D_801C67C8[phi_t1], D_801C67F0[phi_t1]) != 0) {
+ func_80185968(sramCtx->saveBuf, D_801C67C8[phi_t1 + 1], D_801C67F0[phi_t1 + 1]);
+ }
+ } else {
+ phi_t1 = gSaveContext.fileNum;
+ phi_t1 *= 2;
+
+ if (func_80185968(sramCtx->saveBuf, D_801C67C8[phi_t1], D_801C67F0[phi_t1]) != 0) {
+ func_80185968(sramCtx->saveBuf, D_801C67C8[phi_t1 + 1], D_801C67F0[phi_t1 + 1]);
+ }
+ }
+
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[phi_t1]);
+
+ if (CHECK_NEWF(gSaveContext.save.playerData.newf)) {
+ func_80185968(sramCtx->saveBuf, D_801C67C8[phi_t1 + 1], D_801C67F0[phi_t1 + 1]);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[phi_t1]);
+ }
+ }
+
+ gSaveContext.save.playerData.magicLevel = 0;
+
+ if (!gSaveContext.save.isOwlSave) {
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.eventInf); i++) {
+ gSaveContext.eventInf[i] = 0;
+ }
+
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.cycleSceneFlags); i++) {
+ gSaveContext.cycleSceneFlags[i].chest = gSaveContext.save.permanentSceneFlags[i].chest;
+ gSaveContext.cycleSceneFlags[i].switch0 = gSaveContext.save.permanentSceneFlags[i].switch0;
+ gSaveContext.cycleSceneFlags[i].switch1 = gSaveContext.save.permanentSceneFlags[i].switch1;
+ gSaveContext.cycleSceneFlags[i].clearedRoom = gSaveContext.save.permanentSceneFlags[i].clearedRoom;
+ gSaveContext.cycleSceneFlags[i].collectible = gSaveContext.save.permanentSceneFlags[i].collectible;
+ }
+
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.unk_3DD0); i++) {
+ gSaveContext.unk_3DD0[i] = 0;
+ gSaveContext.unk_3DE0[i] = 0;
+ gSaveContext.unk_3E18[i] = 0;
+ gSaveContext.unk_3E50[i] = 0;
+ gSaveContext.unk_3E88[i] = 0;
+ gSaveContext.unk_3EC0[i] = 0;
+ }
+
+ if (gSaveContext.save.isFirstCycle) {
+ gSaveContext.save.entranceIndex = 0xD800;
+ gSaveContext.save.day = 0;
+ gSaveContext.save.time = 0x3FFF;
+ } else {
+ gSaveContext.save.entranceIndex = 0x1C00;
+ gSaveContext.nextCutsceneIndex = 0;
+ gSaveContext.save.playerForm = PLAYER_FORM_HUMAN;
+ }
+ } else {
+ gSaveContext.save.entranceIndex = D_801C6A58[gSaveContext.save.owlSaveLocation];
+ if (D_801C6A58[gSaveContext.save.owlSaveLocation] == 0x84A0 && (gSaveContext.save.weekEventReg[20] & 2)) {
+ // Unconfirmed weekEventReg: "Woodfall Temple Prison Entrance raised / Water cleansed"
+ gSaveContext.save.entranceIndex = 0xCA0;
+ } else if (D_801C6A58[gSaveContext.save.owlSaveLocation] == 0x9A80 &&
+ (gSaveContext.save.weekEventReg[33] & 0x80)) {
+ // Unconfirmed weekEventReg: "Mountain Village Unfrozen"
+ gSaveContext.save.entranceIndex = 0xAE80;
+ }
+
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.cycleSceneFlags); i++) {
+ gSaveContext.cycleSceneFlags[i].chest = gSaveContext.save.permanentSceneFlags[i].chest;
+ gSaveContext.cycleSceneFlags[i].switch0 = gSaveContext.save.permanentSceneFlags[i].switch0;
+ gSaveContext.cycleSceneFlags[i].switch1 = gSaveContext.save.permanentSceneFlags[i].switch1;
+ gSaveContext.cycleSceneFlags[i].clearedRoom = gSaveContext.save.permanentSceneFlags[i].clearedRoom;
+ gSaveContext.cycleSceneFlags[i].collectible = gSaveContext.save.permanentSceneFlags[i].collectible;
+ }
+
+ if (gSaveContext.save.unk_F65) {
+ Lib_MemCpy(D_801D88A0, gSaveContext.save.scarecrowsSong, sizeof(gSaveContext.save.scarecrowsSong));
+
+ for (i = 0; i != ARRAY_COUNT(gSaveContext.save.scarecrowsSong); i++) {}
+ }
+
+ fileNum = gSaveContext.fileNum;
+ func_80147314(sramCtx, fileNum);
+ }
+}
+#else
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/Sram_OpenSave.s")
+#endif
+
+// Similar to func_80145698, but accounts for owl saves?
+void func_8014546C(SramContext* sramCtx) {
+ s32 i;
+
+ if (gSaveContext.save.isOwlSave) {
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.cycleSceneFlags); i++) {
+ gSaveContext.save.permanentSceneFlags[i].chest = gSaveContext.cycleSceneFlags[i].chest;
+ gSaveContext.save.permanentSceneFlags[i].switch0 = gSaveContext.cycleSceneFlags[i].switch0;
+ gSaveContext.save.permanentSceneFlags[i].switch1 = gSaveContext.cycleSceneFlags[i].switch1;
+ gSaveContext.save.permanentSceneFlags[i].clearedRoom = gSaveContext.cycleSceneFlags[i].clearedRoom;
+ gSaveContext.save.permanentSceneFlags[i].collectible = gSaveContext.cycleSceneFlags[i].collectible;
+ }
+
+ gSaveContext.save.checksum = 0;
+ gSaveContext.save.checksum = Sram_CalcChecksum(&gSaveContext, offsetof(SaveContext, fileNum));
+
+ Lib_MemCpy(sramCtx->saveBuf, &gSaveContext, offsetof(SaveContext, fileNum));
+ } else {
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.cycleSceneFlags); i++) {
+ gSaveContext.save.permanentSceneFlags[i].chest = gSaveContext.cycleSceneFlags[i].chest;
+ gSaveContext.save.permanentSceneFlags[i].switch0 = gSaveContext.cycleSceneFlags[i].switch0;
+ gSaveContext.save.permanentSceneFlags[i].switch1 = gSaveContext.cycleSceneFlags[i].switch1;
+ gSaveContext.save.permanentSceneFlags[i].clearedRoom = gSaveContext.cycleSceneFlags[i].clearedRoom;
+ gSaveContext.save.permanentSceneFlags[i].collectible = gSaveContext.cycleSceneFlags[i].collectible;
+ }
+
+ gSaveContext.save.checksum = 0;
+ gSaveContext.save.checksum = Sram_CalcChecksum(&gSaveContext.save, sizeof(Save));
+
+ if (gSaveContext.unk_3F3F) {
+ Lib_MemCpy(sramCtx->saveBuf, &gSaveContext, sizeof(Save));
+ Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save));
+ }
+ }
+}
+
+/**
+ * Save permanent scene flags, calculate checksum, copy save context to the save buffer
+ */
+void func_80145698(SramContext* sramCtx) {
+ s32 i;
+
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.cycleSceneFlags); i++) {
+ gSaveContext.save.permanentSceneFlags[i].chest = gSaveContext.cycleSceneFlags[i].chest;
+ gSaveContext.save.permanentSceneFlags[i].switch0 = gSaveContext.cycleSceneFlags[i].switch0;
+ gSaveContext.save.permanentSceneFlags[i].switch1 = gSaveContext.cycleSceneFlags[i].switch1;
+ gSaveContext.save.permanentSceneFlags[i].clearedRoom = gSaveContext.cycleSceneFlags[i].clearedRoom;
+ gSaveContext.save.permanentSceneFlags[i].collectible = gSaveContext.cycleSceneFlags[i].collectible;
+ }
+
+ gSaveContext.save.checksum = 0;
+ gSaveContext.save.checksum = Sram_CalcChecksum(&gSaveContext.save, sizeof(Save));
+ if (gSaveContext.unk_3F3F) {
+ Lib_MemCpy(sramCtx->saveBuf, &gSaveContext, sizeof(Save));
+ Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save));
+ }
+}
+
+// Verifies save and use backup if corrupted?
+#ifdef NON_EQUIVALENT
+void func_801457CC(FileChooseContext* fileChooseCtx2, SramContext* sramCtx) {
+ FileChooseContext* fileChooseCtx = fileChooseCtx2;
+ u16 sp7A;
+ // u16 sp78;
+ u16 sp76;
+ // u16 sp74;
+ u16 sp6E; //!
+ // s32 sp68;
+ // u16 sp66;
+ u16 phi_s2; //!
+ u16 sp64;
+ // s32 sp60;
+ // s32 sp5C;
+ // s32 sp58;
+ // u32 new_var;
+ u16 phi_s2_3;
+ // s16 fakevar;
+
+ u16 temp_s2;
+ u16 temp_v0_2;
+ u16 phi_a0; // maskCount
+
+ if (gSaveContext.unk_3F3F) {
+ D_801F6AF0 = gSaveContext.save.time;
+ D_801F6AF2 = gSaveContext.unk_3F3F;
+ sp64 = 0;
+
+ for (sp76 = 0; sp76 < 5; sp76++, sp64 += 2) {
+ bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
+
+ phi_s2 = false;
+ sp6E = 0;
+ if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64], D_801C67F0[sp64])) {
+ sp6E = 1;
+ if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
+ phi_s2 = true;
+ }
+ }
+
+ if (sp76 < 2) {
+ fileChooseCtx->unk_24468[sp76] = 0;
+ if (phi_s2) {
+ bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
+ } else {
+ // Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
+ temp_s2 = gSaveContext.save.checksum;
+ gSaveContext.save.checksum = 0;
+ temp_v0_2 = Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64]);
+ gSaveContext.save.checksum = temp_s2;
+
+ if (CHECK_NEWF(gSaveContext.save.playerData.newf) || (temp_s2 != temp_v0_2)) {
+ sp6E = 1;
+ if (CHECK_NEWF2(gSaveContext.save.playerData.newf)) {}
+
+ phi_s2 = false;
+ if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
+ phi_s2 = true;
+ }
+
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
+ temp_s2 = gSaveContext.save.checksum;
+ gSaveContext.save.checksum = 0;
+ if (phi_s2 || CHECK_NEWF(gSaveContext.save.playerData.newf) ||
+ (temp_s2 != Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64]))) {
+ bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
+ Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save));
+ sp6E = 999;
+ }
+ }
+ }
+
+ gSaveContext.save.checksum = 0;
+ gSaveContext.save.checksum =
+ Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64 & 0xFFFFFFFF]); // TODO: Needed?
+
+ for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.playerData.newf); sp7A++) {
+ fileChooseCtx->newf[sp76][sp7A] = gSaveContext.save.playerData.newf[sp7A];
+ }
+
+ if (!CHECK_NEWF(fileChooseCtx->newf[sp76])) {
+ fileChooseCtx->unk_2440C[sp76] = gSaveContext.save.playerData.deaths;
+
+ for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.playerData.playerName); sp7A++) {
+ fileChooseCtx->unk_24414[sp76][sp7A] = gSaveContext.save.playerData.playerName[sp7A];
+ }
+
+ fileChooseCtx->healthCapacity[sp76] = gSaveContext.save.playerData.healthCapacity;
+ fileChooseCtx->health[sp76] = gSaveContext.save.playerData.health;
+ fileChooseCtx->unk_24454[sp76] = gSaveContext.save.inventory.dungeonKeys[9];
+ fileChooseCtx->unk_24444[sp76] = gSaveContext.save.inventory.questItems;
+ fileChooseCtx->unk_24458[sp76] = gSaveContext.save.time;
+ fileChooseCtx->unk_24460[sp76] = gSaveContext.save.day;
+ fileChooseCtx->unk_24468[sp76] = gSaveContext.save.isOwlSave;
+ fileChooseCtx->rupees[sp76] = gSaveContext.save.playerData.rupees;
+ fileChooseCtx->unk_24474[sp76] = CUR_UPG_VALUE(4);
+
+ for (sp7A = 0, phi_a0 = 0; sp7A < 24; sp7A++) {
+ if (gSaveContext.save.inventory.items[sp7A + 24] != 0xFF) {
+ phi_a0++;
+ }
+ }
+ fileChooseCtx->maskCount[sp76] = phi_a0;
+ fileChooseCtx->heartPieceCount[sp76] =
+ ((gSaveContext.save.inventory.questItems & 0xF0000000) >> 0x1C);
+ }
+
+ if (sp6E == 1) {
+ Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save));
+ func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C6818[sp64]);
+ } else if (sp6E == 0) { // TODO: == 0?
+ temp_s2 = gSaveContext.save.checksum;
+ if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
+ phi_s2_3 = 1;
+ } else {
+ Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save));
+ phi_s2_3 = gSaveContext.save.checksum;
+ gSaveContext.save.checksum = 0;
+ sp7A = Sram_CalcChecksum(&gSaveContext.save, sizeof(Save));
+ }
+
+ if (CHECK_NEWF(gSaveContext.save.playerData.newf) || (phi_s2_3 != sp7A) || (phi_s2_3 != temp_s2)) {
+ func_80185968(sramCtx->saveBuf, D_801C67C8[sp64], D_801C67F0[sp64]);
+ Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save));
+ Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save));
+ func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C6818[sp64]);
+ }
+ }
+ } else if (sp76 < 4) {
+ fileChooseCtx->unk_24468[sp76] = 0;
+
+ if (!CHECK_NEWF(fileChooseCtx->newf2[(s32)sp76])) { // TODO: Needed?
+ if (phi_s2) {
+ bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf,
+ D_801C6870[sp64]); // TODO: Needed?
+ } else {
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
+ temp_s2 = gSaveContext.save.checksum;
+
+ gSaveContext.save.checksum = 0;
+ temp_v0_2 = Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64]);
+ gSaveContext.save.checksum = temp_s2;
+ if (CHECK_NEWF(gSaveContext.save.playerData.newf) || (temp_s2 != temp_v0_2)) {
+ sp6E = 1;
+ if ((gSaveContext.save.playerData.newf[0] == 'Z') &&
+ (gSaveContext.save.playerData.newf[1] == 'E')) {
+ phi_s2 = false;
+ }
+
+ if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
+ phi_s2 = true;
+ }
+
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
+ temp_s2 = gSaveContext.save.checksum;
+ gSaveContext.save.checksum = 0;
+ if (phi_s2 || CHECK_NEWF(gSaveContext.save.playerData.newf) ||
+ (temp_s2 != Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64]))) {
+ bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
+ sp6E = 999;
+ }
+ }
+ }
+
+ gSaveContext.save.checksum = 0;
+ gSaveContext.save.checksum =
+ Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64 & 0xFFFFFFFF]); // TODO: Needed?
+
+ for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.playerData.newf); sp7A++) {
+ fileChooseCtx->newf[sp76][sp7A] = gSaveContext.save.playerData.newf[sp7A];
+ }
+
+ if (!CHECK_NEWF(fileChooseCtx->newf[sp76])) {
+ fileChooseCtx->unk_2440C[sp76] = gSaveContext.save.playerData.deaths;
+
+ for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.playerData.playerName); sp7A++) {
+ phi_s2 += 0; // TODO: Needed?
+ fileChooseCtx->unk_24414[sp76][sp7A] = gSaveContext.save.playerData.playerName[sp7A];
+ }
+
+ fileChooseCtx->healthCapacity[sp76] = gSaveContext.save.playerData.healthCapacity;
+ fileChooseCtx->health[sp76] = gSaveContext.save.playerData.health;
+ fileChooseCtx->unk_24454[sp76] = gSaveContext.save.inventory.dungeonKeys[9];
+ fileChooseCtx->unk_24444[sp76] = gSaveContext.save.inventory.questItems;
+ fileChooseCtx->unk_24458[sp76] = gSaveContext.save.time;
+ fileChooseCtx->unk_24460[sp76] = gSaveContext.save.day;
+ fileChooseCtx->unk_24468[sp76] = gSaveContext.save.isOwlSave;
+ fileChooseCtx->rupees[sp76] = gSaveContext.save.playerData.rupees;
+ fileChooseCtx->unk_24474[sp76] = CUR_UPG_VALUE(4);
+
+ for (sp7A = 0, phi_a0 = 0; sp7A < 24; sp7A++) {
+ if (gSaveContext.save.inventory.items[sp7A + 24] != 0xFF) {
+ phi_a0++;
+ }
+ }
+ fileChooseCtx->maskCount[sp76] = phi_a0;
+ fileChooseCtx->heartPieceCount[sp76] =
+ ((gSaveContext.save.inventory.questItems & 0xF0000000) >> 0x1C);
+ }
+
+ if (sp6E == 1) {
+ func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C67F0[sp64]);
+ func_80146EBC(sramCtx, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1]);
+ } else if (!sp6E) { // TODO: == 0?
+ temp_s2 = gSaveContext.save.checksum;
+ if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
+ phi_s2_3 = 1;
+ } else {
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
+ phi_s2_3 = gSaveContext.save.checksum;
+ gSaveContext.save.checksum = 0;
+ // phi_s2_3 = gSaveContext.save.checksum;
+ sp7A = Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64]);
+ }
+
+ if (CHECK_NEWF(gSaveContext.save.playerData.newf) || (phi_s2_3 != sp7A) ||
+ (phi_s2_3 != temp_s2)) {
+ func_80185968(sramCtx->saveBuf, D_801C67C8[sp64], D_801C67F0[sp64]);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
+ func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C67F0[sp64]);
+ func_80146EBC(sramCtx, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1]);
+ }
+ }
+ } else {
+ bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
+ func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C67F0[sp64]);
+ func_80146EBC(sramCtx, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1]);
+ }
+ } else {
+ if (phi_s2) {
+ gSaveContext.options.optionId = 0xA51D;
+ gSaveContext.options.language = 1;
+ gSaveContext.options.audioSetting = 0;
+ gSaveContext.options.languageSetting = 0;
+ gSaveContext.options.zTargetSetting = 0;
+ } else {
+ Lib_MemCpy(&gSaveContext.options, sramCtx->saveBuf, sizeof(SaveOptions));
+ if (gSaveContext.options.optionId != 0xA51D) {
+ gSaveContext.options.optionId = 0xA51D;
+ gSaveContext.options.language = 1;
+ gSaveContext.options.audioSetting = 0;
+ gSaveContext.options.languageSetting = 0;
+ gSaveContext.options.zTargetSetting = 0;
+ }
+ }
+ func_801A3D98(gSaveContext.options.audioSetting);
+ }
+ }
+
+ gSaveContext.save.time = D_801F6AF0;
+ gSaveContext.unk_3F3F = D_801F6AF2;
+ }
+
+ gSaveContext.options.language = 1;
+}
+#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_801457CC.s")
+#endif
+
+void func_80146580(FileChooseContext* fileChooseCtx2, SramContext* sramCtx, s32 fileNum) {
+ FileChooseContext* fileChooseCtx = fileChooseCtx2;
+ s32 pad;
+
+ if (gSaveContext.unk_3F3F) {
+ if (fileChooseCtx->unk_2446A[fileNum]) {
+ func_80147314(sramCtx, fileNum);
+ fileChooseCtx->unk_2446A[fileNum] = 0;
+ }
+ bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, sizeof(Save));
+ }
+
+ gSaveContext.save.time = D_801F6AF0;
+ gSaveContext.unk_3F3F = D_801F6AF2;
+}
+
+#ifdef NON_MATCHING
+// v0/v1
+void func_80146628(FileChooseContext* fileChooseCtx2, SramContext* sramCtx) {
+ FileChooseContext* fileChooseCtx = fileChooseCtx2;
+ u16 i;
+ s16 maskCount;
+
+ if (gSaveContext.unk_3F3F) {
+ if (fileChooseCtx->unk_2446A[fileChooseCtx->unk_2448E]) {
+ func_80147414(sramCtx, fileChooseCtx->unk_2448E, fileChooseCtx->fileNum);
+ fileChooseCtx->unk_24410[fileChooseCtx->fileNum] = gSaveContext.save.playerData.deaths;
+
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.save.playerData.playerName); i++) {
+ fileChooseCtx->unk_24424[fileChooseCtx->fileNum][i] = gSaveContext.save.playerData.playerName[i];
+ }
+
+ fileChooseCtx->unk_24438[fileChooseCtx->fileNum] = gSaveContext.save.playerData.healthCapacity;
+ fileChooseCtx->unk_24440[fileChooseCtx->fileNum] = gSaveContext.save.playerData.health;
+ fileChooseCtx->unk_24456[fileChooseCtx->fileNum] = gSaveContext.save.inventory.dungeonKeys[9];
+ fileChooseCtx->unk_2444C[fileChooseCtx->fileNum] = gSaveContext.save.inventory.questItems;
+ fileChooseCtx->unk_2445C[fileChooseCtx->fileNum] = gSaveContext.save.time;
+ fileChooseCtx->unk_24464[fileChooseCtx->fileNum] = gSaveContext.save.day;
+ fileChooseCtx->unk_2446A[fileChooseCtx->fileNum] = gSaveContext.save.isOwlSave;
+ fileChooseCtx->unk_24470[fileChooseCtx->fileNum] = gSaveContext.save.playerData.rupees;
+ // = CUR_UPG_VALUE(UPG_WALLET);
+ fileChooseCtx->unk_24476[fileChooseCtx->fileNum] =
+ (gSaveContext.save.inventory.upgrades & gUpgradeMasks[4]) >> gUpgradeShifts[4];
+
+ for (i = 0, maskCount = 0; i < 24; i++) {
+ if (gSaveContext.save.inventory.items[i + 24] != ITEM_NONE) {
+ maskCount++;
+ }
+ }
+
+ fileChooseCtx->unk_2447A[fileChooseCtx->fileNum] = maskCount;
+ fileChooseCtx->unk_2447E[fileChooseCtx->fileNum] =
+ (gSaveContext.save.inventory.questItems & 0xF0000000) >> 0x1C;
+ }
+
+ // clear buffer
+ bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
+ // read to buffer
+ func_80185968(sramCtx->saveBuf, D_801C67C8[fileChooseCtx->unk_2448E * 2],
+ D_801C67F0[fileChooseCtx->unk_2448E * 2]);
+
+ if (1) {}
+ func_80185968(&sramCtx->saveBuf[0x2000], D_801C67C8[fileChooseCtx->unk_2448E * 2 + 1],
+ D_801C67F0[fileChooseCtx->unk_2448E * 2 + 1]);
+ if (1) {}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80146580.s")
+ // copy buffer to save context
+ Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save));
+ fileChooseCtx->unk_2440C[fileChooseCtx->fileNum] = gSaveContext.save.playerData.deaths;
+
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.save.playerData.playerName); i++) {
+ fileChooseCtx->unk_24414[fileChooseCtx->fileNum][i] = gSaveContext.save.playerData.playerName[i];
+ }
+
+ fileChooseCtx->healthCapacity[fileChooseCtx->fileNum] = gSaveContext.save.playerData.healthCapacity;
+ fileChooseCtx->health[fileChooseCtx->fileNum] = gSaveContext.save.playerData.health;
+ fileChooseCtx->unk_24454[fileChooseCtx->fileNum] = gSaveContext.save.inventory.dungeonKeys[9];
+ fileChooseCtx->unk_24444[fileChooseCtx->fileNum] = gSaveContext.save.inventory.questItems;
+ fileChooseCtx->unk_24458[fileChooseCtx->fileNum] = gSaveContext.save.time;
+ fileChooseCtx->unk_24460[fileChooseCtx->fileNum] = gSaveContext.save.day;
+ fileChooseCtx->unk_24468[fileChooseCtx->fileNum] = gSaveContext.save.isOwlSave;
+ fileChooseCtx->rupees[fileChooseCtx->fileNum] = gSaveContext.save.playerData.rupees;
+ // = CUR_UPG_VALUE(UPG_WALLET);
+ fileChooseCtx->unk_24474[fileChooseCtx->fileNum] =
+ (gSaveContext.save.inventory.upgrades & gUpgradeMasks[4]) >> gUpgradeShifts[4];
+
+ for (i = 0, maskCount = 0; i < 24; i++) {
+ if (gSaveContext.save.inventory.items[i + 24] != ITEM_NONE) {
+ maskCount++;
+ }
+ }
+
+ fileChooseCtx->maskCount[fileChooseCtx->fileNum] = maskCount;
+ fileChooseCtx->heartPieceCount[fileChooseCtx->fileNum] =
+ (gSaveContext.save.inventory.questItems & 0xF0000000) >> 0x1C;
+ }
+
+ gSaveContext.save.time = D_801F6AF0;
+ gSaveContext.unk_3F3F = D_801F6AF2;
+}
+#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80146628.s")
+#endif
+
+void Sram_InitSave(FileChooseContext* fileChooseCtx2, SramContext* sramCtx) {
+ s32 phi_v0;
+ u16 i;
+ FileChooseContext* fileChooseCtx = fileChooseCtx2;
+ s16 maskCount;
+
+ if (gSaveContext.unk_3F3F) {
+ Sram_InitNewSave();
+ if (fileChooseCtx->unk_24480 == 0) {
+ gSaveContext.save.cutscene = 0xFFF0;
+ }
+
+ for (phi_v0 = 0; phi_v0 < ARRAY_COUNT(gSaveContext.save.playerData.playerName); phi_v0++) {
+ gSaveContext.save.playerData.playerName[phi_v0] =
+ fileChooseCtx->unk_24414[fileChooseCtx->unk_24480][phi_v0];
+ }
+
+ gSaveContext.save.playerData.newf[0] = 'Z';
+ gSaveContext.save.playerData.newf[1] = 'E';
+ gSaveContext.save.playerData.newf[2] = 'L';
+ gSaveContext.save.playerData.newf[3] = 'D';
+ gSaveContext.save.playerData.newf[4] = 'A';
+ gSaveContext.save.playerData.newf[5] = '3';
+
+ gSaveContext.save.checksum = Sram_CalcChecksum(&gSaveContext.save, sizeof(Save));
+
+ Lib_MemCpy(sramCtx->saveBuf, &gSaveContext.save, sizeof(Save));
+ Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save));
+
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.save.playerData.newf); i++) {
+ fileChooseCtx->newf[fileChooseCtx->unk_24480][i] = gSaveContext.save.playerData.newf[i];
+ }
+
+ fileChooseCtx->unk_2440C[fileChooseCtx->unk_24480] = gSaveContext.save.playerData.deaths;
+
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.save.playerData.playerName); i++) {
+ fileChooseCtx->unk_24414[fileChooseCtx->unk_24480][i] = gSaveContext.save.playerData.playerName[i];
+ }
+
+ fileChooseCtx->healthCapacity[fileChooseCtx->unk_24480] = gSaveContext.save.playerData.healthCapacity;
+ fileChooseCtx->health[fileChooseCtx->unk_24480] = gSaveContext.save.playerData.health;
+ fileChooseCtx->unk_24454[fileChooseCtx->unk_24480] = gSaveContext.save.inventory.dungeonKeys[9];
+ fileChooseCtx->unk_24444[fileChooseCtx->unk_24480] = gSaveContext.save.inventory.questItems;
+ fileChooseCtx->unk_24458[fileChooseCtx->unk_24480] = gSaveContext.save.time;
+ fileChooseCtx->unk_24460[fileChooseCtx->unk_24480] = gSaveContext.save.day;
+ fileChooseCtx->unk_24468[fileChooseCtx->unk_24480] = gSaveContext.save.isOwlSave;
+ fileChooseCtx->rupees[fileChooseCtx->unk_24480] = gSaveContext.save.playerData.rupees;
+ fileChooseCtx->unk_24474[fileChooseCtx->unk_24480] = CUR_UPG_VALUE(UPG_WALLET);
+
+ for (i = 0, maskCount = 0; i < 24; i++) {
+ if (gSaveContext.save.inventory.items[i + 24] != ITEM_NONE) {
+ maskCount++;
+ }
+ }
+
+ fileChooseCtx->maskCount[fileChooseCtx->unk_24480] = maskCount;
+ fileChooseCtx->heartPieceCount[fileChooseCtx->unk_24480] =
+ (gSaveContext.save.inventory.questItems & 0xF0000000) >> 0x1C;
+ }
+
+ gSaveContext.save.time = D_801F6AF0;
+ gSaveContext.unk_3F3F = D_801F6AF2;
+}
+
+void func_80146DF8(SramContext* sramCtx) {
+ if (gSaveContext.unk_3F3F) {
+ // TODO: macros for languages
+ gSaveContext.options.language = 1;
+ Lib_MemCpy(sramCtx->saveBuf, &gSaveContext.options, sizeof(SaveOptions));
+ }
+}
+
+void Sram_InitSram(GameState* gameState, SramContext* sramCtx) {
+ if (&gSaveContext.save) {}
+
+ func_801A3D98(gSaveContext.options.audioSetting);
+}
+
+void Sram_Alloc(GameState* gamestate, SramContext* sramCtx) {
+ if (gSaveContext.unk_3F3F) {
+ sramCtx->saveBuf = THA_AllocEndAlign16(&gamestate->heap, SAVE_BUFFER_SIZE);
+ sramCtx->status = 0;
+ }
+}
+
+/**
+ * Synchronous flash write
+ */
+void func_80146EBC(SramContext* sramCtx, s32 curPage, s32 numPages) {
+ sramCtx->curPage = curPage;
+ sramCtx->numPages = numPages;
+ func_80185F64(sramCtx->saveBuf, curPage, numPages);
+}
+
+/**
+ * Saves the game on the very first time Player enters South Clock Town from the Clock Tower
+ */
+void Sram_SaveSpecialEnterClockTown(GlobalContext* globalCtx) {
+ s32 pad[2];
+ SramContext* sramCtx = &globalCtx->sramCtx;
+
+ gSaveContext.save.isFirstCycle = true;
+ gSaveContext.save.isOwlSave = false;
+ func_80145698(sramCtx);
+ func_80185F64(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2], D_801C6818[gSaveContext.fileNum * 2]);
+}
+
+/**
+ * Saves when beating the game, after showing the "Dawn of the New Day" message
+ */
+void Sram_SaveSpecialNewDay(GlobalContext* globalCtx) {
+ s32 cutscene = gSaveContext.save.cutscene;
+ s32 day;
+ u16 time = gSaveContext.save.time;
+
+ day = gSaveContext.save.day;
+
+ // Unconfirmed: "Obtained Fierce Deity Mask?"
+ gSaveContext.save.weekEventReg[84] &= (u8)~0x20;
+
+ Sram_SaveEndOfCycle(globalCtx);
+ func_8014546C(&globalCtx->sramCtx);
+
+ gSaveContext.save.day = day;
+ gSaveContext.save.time = time;
+ gSaveContext.save.cutscene = cutscene;
+ func_80185F64(globalCtx->sramCtx.saveBuf, D_801C67C8[gSaveContext.fileNum * 2],
+ D_801C67F0[gSaveContext.fileNum * 2]);
+}
+
+void func_80147008(SramContext* sramCtx, u32 curPage, u32 numPages) {
+ sramCtx->curPage = curPage;
+ sramCtx->numPages = numPages;
+ sramCtx->status = 1;
+}
+
+void func_80147020(SramContext* sramCtx) {
+ // async flash write
+ func_80185DDC(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages);
+
+ sramCtx->unk_18 = osGetTime();
+ sramCtx->status = 2;
+}
+
+void func_80147068(SramContext* sramCtx) {
+ if (sramCtx->status == 2) {
+ if (func_80185EC4() != 0) { // if task running
+ if (func_80185F04() == 0) { // wait for task done
+ // task success
+ sramCtx->status = 4;
+ } else {
+ // task failure
+ sramCtx->status = 4;
+ }
+ }
+ } else if (((osGetTime() - sramCtx->unk_18) * 0x40) / 3000 / 10000 >= 200) {
+ sramCtx->status = 0;
+ }
+}
+
+void func_80147138(SramContext* sramCtx, s32 curPage, s32 numPages) {
+ sramCtx->curPage = curPage;
+ sramCtx->numPages = numPages;
+ sramCtx->status = 6;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80146AA0.s")
+void func_80147150(SramContext* sramCtx) {
+ func_80185DDC(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80146DF8.s")
+ sramCtx->unk_18 = osGetTime();
+ sramCtx->status = 7;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80146E40.s")
+void func_80147198(SramContext* sramCtx) {
+ if (sramCtx->status == 7) {
+ if (func_80185EC4() != 0) { // Is task running
+ if (func_80185F04() == 0) { // Wait for task done
+ func_80185DDC(sramCtx->saveBuf, sramCtx->curPage + 0x80, sramCtx->numPages);
+ sramCtx->status = 8;
+ } else {
+ func_80185DDC(sramCtx->saveBuf, sramCtx->curPage + 0x80, sramCtx->numPages);
+ sramCtx->status = 8;
+ }
+ }
+ } else if (sramCtx->status == 8) {
+ if (func_80185EC4() != 0) { // Is task running
+ if (func_80185F04() == 0) { // Wait for task done
+ sramCtx->status = 4;
+ } else {
+ sramCtx->status = 4;
+ }
+ }
+ } else if (((osGetTime() - sramCtx->unk_18) * 0x40) / 3000 / 10000 >= 200) {
+ sramCtx->status = 0;
+ bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
+ gSaveContext.save.isOwlSave = false;
+ gSaveContext.save.checksum = 0;
+ // flash read to buffer then copy to save context
+ func_80185968(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, offsetof(SaveContext, fileNum));
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/Sram_Alloc.s")
+void func_80147314(SramContext* sramCtx, s32 fileNum) {
+ s32 pad;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80146EBC.s")
+ gSaveContext.save.isOwlSave = false;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80146EE8.s")
+ gSaveContext.save.playerData.newf[0] = '\0';
+ gSaveContext.save.playerData.newf[1] = '\0';
+ gSaveContext.save.playerData.newf[2] = '\0';
+ gSaveContext.save.playerData.newf[3] = '\0';
+ gSaveContext.save.playerData.newf[4] = '\0';
+ gSaveContext.save.playerData.newf[5] = '\0';
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80146F5C.s")
+ gSaveContext.save.checksum = 0;
+ gSaveContext.save.checksum = Sram_CalcChecksum(&gSaveContext, offsetof(SaveContext, fileNum));
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80147008.s")
+ Lib_MemCpy(sramCtx->saveBuf, &gSaveContext, offsetof(SaveContext, fileNum));
+ func_80146EBC(sramCtx, D_801C6840[fileNum * 2], D_801C6850[fileNum * 2]);
+ func_80146EBC(sramCtx, D_801C6840[fileNum * 2 + 1], D_801C6850[fileNum * 2]);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80147020.s")
+ gSaveContext.save.isOwlSave = true;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80147068.s")
+ gSaveContext.save.playerData.newf[0] = 'Z';
+ gSaveContext.save.playerData.newf[1] = 'E';
+ gSaveContext.save.playerData.newf[2] = 'L';
+ gSaveContext.save.playerData.newf[3] = 'D';
+ gSaveContext.save.playerData.newf[4] = 'A';
+ gSaveContext.save.playerData.newf[5] = '3';
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80147138.s")
+void func_80147414(SramContext* sramCtx, s32 fileNum, s32 arg2) {
+ s32 pad;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80147150.s")
+ // Clear save buffer
+ bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80147198.s")
+ // Read save file
+ if (func_80185968(sramCtx->saveBuf, D_801C6840[fileNum * 2], D_801C6850[fileNum * 2]) != 0) {
+ // If failed, read backup save file
+ func_80185968(sramCtx->saveBuf, D_801C6840[fileNum * 2 + 1], D_801C6850[fileNum * 2 + 1]);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80147314.s")
+ // Copy buffer to save context
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, offsetof(SaveContext, fileNum));
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80147414.s")
+ func_80146EBC(sramCtx, D_801C6840[arg2 * 2], D_801C6850[arg2 * 2]);
+ func_80146EBC(sramCtx, D_801C6840[arg2 * 2 + 1], D_801C6850[arg2 * 2]);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/Sram_nop8014750C.s")
+void Sram_nop8014750C(UNK_TYPE4 arg0) {
+}