summaryrefslogtreecommitdiff
path: root/soh/src/code
diff options
context:
space:
mode:
authorJosh Bodner <30329717+jbodner09@users.noreply.github.com>2022-08-04 21:15:49 -0700
committerGitHub <noreply@github.com>2022-08-05 00:15:49 -0400
commitc23457d666e3ced250e535e4c9a014d7cf63bbd0 (patch)
treece59e0b6c12ae737b8ca0eb92a7912323e88516b /soh/src/code
parent2f5f089e7f1b88ac52d5a2c8715fbe64df07eb03 (diff)
Automatically save after every scene transition (#984)
* Automatically save after every scene transition * Refactor and don't save in grottos * Don't save in cutscenes * Save after getting items as well * Fix paren
Diffstat (limited to 'soh/src/code')
-rw-r--r--soh/src/code/z_parameter.c46
-rw-r--r--soh/src/code/z_play.c21
2 files changed, 67 insertions, 0 deletions
diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c
index 364e63956..24211c590 100644
--- a/soh/src/code/z_parameter.c
+++ b/soh/src/code/z_parameter.c
@@ -2188,6 +2188,52 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
osSyncPrintf("Item_Register(%d)=%d %d\n", slot, item, temp);
INV_CONTENT(item) = item;
+ // Autosave after getting items by default (cvars are not shown in the UI)
+ if (CVar_GetS32("gAutosave", 0)) {
+ if (CVar_GetS32("gAutosaveAllItems", 1)) {
+ Gameplay_PerformSave(globalCtx);
+ }
+ else if (CVar_GetS32("gAutosaveMajorItems", 1)) {
+ switch (item) {
+ case ITEM_STICK:
+ case ITEM_NUT:
+ case ITEM_BOMB:
+ case ITEM_BOW:
+ case ITEM_SEEDS:
+ case ITEM_FISHING_POLE:
+ case ITEM_MAGIC_SMALL:
+ case ITEM_MAGIC_LARGE:
+ case ITEM_INVALID_4:
+ case ITEM_INVALID_5:
+ case ITEM_INVALID_6:
+ case ITEM_INVALID_7:
+ case ITEM_HEART:
+ case ITEM_RUPEE_GREEN:
+ case ITEM_RUPEE_BLUE:
+ case ITEM_RUPEE_RED:
+ case ITEM_RUPEE_PURPLE:
+ case ITEM_RUPEE_GOLD:
+ case ITEM_INVALID_8:
+ case ITEM_STICKS_5:
+ case ITEM_STICKS_10:
+ case ITEM_NUTS_5:
+ case ITEM_NUTS_10:
+ case ITEM_BOMBS_5:
+ case ITEM_BOMBS_10:
+ case ITEM_BOMBS_20:
+ case ITEM_BOMBS_30:
+ case ITEM_ARROWS_SMALL:
+ case ITEM_ARROWS_MEDIUM:
+ case ITEM_ARROWS_LARGE:
+ case ITEM_SEEDS_30:
+ break;
+ default:
+ Gameplay_PerformSave(globalCtx);
+ break;
+ }
+ }
+ }
+
return temp;
}
diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c
index 8974495fb..5c3b97da6 100644
--- a/soh/src/code/z_play.c
+++ b/soh/src/code/z_play.c
@@ -698,6 +698,11 @@ void Gameplay_Update(GlobalContext* globalCtx) {
gTrnsnUnkState = 0;
R_UPDATE_RATE = 3;
}
+
+ // Don't autosave in grottos or cutscenes
+ if (CVar_GetS32("gAutosave", 0) && (globalCtx->sceneNum != SCENE_YOUSEI_IZUMI_TATE) && (globalCtx->sceneNum != SCENE_KAKUSIANA) && (gSaveContext.cutsceneIndex == 0)) {
+ Gameplay_PerformSave(globalCtx);
+ }
}
globalCtx->sceneLoadFlag = 0;
} else {
@@ -1972,3 +1977,19 @@ s32 func_800C0DB4(GlobalContext* globalCtx, Vec3f* pos) {
return false;
}
}
+
+void Gameplay_PerformSave(GlobalContext* globalCtx) {
+ Gameplay_SaveSceneFlags(globalCtx);
+ gSaveContext.savedSceneNum = globalCtx->sceneNum;
+ if (gSaveContext.temporaryWeapon) {
+ gSaveContext.equips.buttonItems[0] = ITEM_NONE;
+ GET_PLAYER(globalCtx)->currentSwordItem = ITEM_NONE;
+ Inventory_ChangeEquipment(EQUIP_SWORD, PLAYER_SWORD_NONE);
+ Save_SaveFile();
+ gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KOKIRI;
+ GET_PLAYER(globalCtx)->currentSwordItem = ITEM_SWORD_KOKIRI;
+ Inventory_ChangeEquipment(EQUIP_SWORD, PLAYER_SWORD_KOKIRI);
+ } else {
+ Save_SaveFile();
+ }
+}