Organize ship specific save context additions (#4597)

* Basic restructure

* Undo most randomizerInf changes for now

* Small fixes

* Fix linux & mac builds?

* Fix remnants of randomizerInf changes

* Post-merge fix

* Post-merge fix
This commit is contained in:
Pepe20129
2025-01-15 13:04:47 +01:00
committed by GitHub
parent 0d80c4695f
commit 7f31fd2e4e
42 changed files with 695 additions and 640 deletions

View File

@@ -4982,15 +4982,33 @@ void Flags_UnsetEventInf(s32 flag) {
* Tests if "randomizerInf" flag is set.
*/
s32 Flags_GetRandomizerInf(RandomizerInf flag) {
return gSaveContext.randomizerInf[flag >> 4] & (1 << (flag & 0xF));
// Randomizer flags are currently accessible from any quest (boss rush as an example)
/*
if (!IS_RANDO) {
LUSLOG_ERROR("Tried to get randomizerInf flag \"%d\" outside of rando", flag);
assert(false);
return 0;
}
*/
return gSaveContext.ship.randomizerInf[flag >> 4] & (1 << (flag & 0xF));
}
/**
* Sets "randomizerInf" flag.
*/
void Flags_SetRandomizerInf(RandomizerInf flag) {
// Randomizer flags are currently accessible from any quest (boss rush as an example)
/*
if (!IS_RANDO) {
LUSLOG_ERROR("Tried to set randomizerInf flag \"%d\" outside of rando", flag);
assert(false);
return;
}
*/
s32 previouslyOff = !Flags_GetRandomizerInf(flag);
gSaveContext.randomizerInf[flag >> 4] |= (1 << (flag & 0xF));
gSaveContext.ship.randomizerInf[flag >> 4] |= (1 << (flag & 0xF));
if (previouslyOff) {
LUSLOG_INFO("RandomizerInf Flag Set - %#x", flag);
GameInteractor_ExecuteOnFlagSet(FLAG_RANDOMIZER_INF, flag);
@@ -5001,8 +5019,17 @@ void Flags_SetRandomizerInf(RandomizerInf flag) {
* Unsets "randomizerInf" flag.
*/
void Flags_UnsetRandomizerInf(RandomizerInf flag) {
// Randomizer flags are currently accessible from any quest (boss rush as an example)
/*
if (!IS_RANDO) {
LUSLOG_ERROR("Tried to unset randomizerInf flag \"%d\" outside of rando", flag);
assert(false);
return;
}
*/
s32 previouslyOn = Flags_GetRandomizerInf(flag);
gSaveContext.randomizerInf[flag >> 4] &= ~(1 << (flag & 0xF));
gSaveContext.ship.randomizerInf[flag >> 4] &= ~(1 << (flag & 0xF));
if (previouslyOn) {
LUSLOG_INFO("RandomizerInf Flag Unset - %#x", flag);
GameInteractor_ExecuteOnFlagUnset(FLAG_RANDOMIZER_INF, flag);

View File

@@ -626,8 +626,8 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB
break;
case 8:
if (CVarGetInteger(CVAR_ENHANCEMENT("BetterFarore"), 0)) {
FaroresWindData tempFW = gSaveContext.backupFW;
gSaveContext.backupFW = gSaveContext.fw;
FaroresWindData tempFW = gSaveContext.ship.backupFW;
gSaveContext.ship.backupFW = gSaveContext.fw;
gSaveContext.fw = tempFW;
} else {
gSaveContext.fw.set = 0;

View File

@@ -1046,7 +1046,7 @@ void GetItem_DrawTriforcePiece(PlayState* play, s16 drawId) {
Matrix_Scale(0.035f, 0.035f, 0.035f, MTXMODE_APPLY);
uint8_t index = gSaveContext.triforcePiecesCollected % 3;
uint8_t index = gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected % 3;
Gfx* triforcePieceDL;
switch (index) {

View File

@@ -59,9 +59,9 @@ void KaleidoScopeCall_Update(PlayState* play) {
GameInteractor_ExecuteOnKaleidoUpdate();
if (!gSaveContext.sohStats.gameComplete &&
(!IS_BOSS_RUSH || !gSaveContext.isBossRushPaused)) {
gSaveContext.sohStats.pauseTimer++;
if (!gSaveContext.ship.stats.gameComplete &&
(!IS_BOSS_RUSH || !gSaveContext.ship.quest.data.bossRush.isPaused)) {
gSaveContext.ship.stats.pauseTimer++;
}
if ((pauseCtx->state != 0) || (pauseCtx->debugState != 0)) {
@@ -73,7 +73,7 @@ void KaleidoScopeCall_Update(PlayState* play) {
pauseCtx->unk_1E4 = 0;
pauseCtx->unk_1EC = 0;
pauseCtx->state = (pauseCtx->state & 0xFFFF) + 1;
gSaveContext.sohStats.count[COUNT_PAUSES]++;
gSaveContext.ship.stats.count[COUNT_PAUSES]++;
}
} else if (pauseCtx->state == 8) {
HREG(80) = 7;

View File

@@ -1812,7 +1812,7 @@ void func_80084BF4(PlayState* play, u16 flag) {
void GameplayStats_SetTimestamp(PlayState* play, u8 item) {
// If we already have a timestamp for this item, do nothing
if (gSaveContext.sohStats.itemTimestamp[item] != 0){
if (gSaveContext.ship.stats.itemTimestamp[item] != 0){
return;
}
// Use ITEM_KEY_BOSS only for Ganon's boss key - not any other boss keys
@@ -1831,20 +1831,20 @@ void GameplayStats_SetTimestamp(PlayState* play, u8 item) {
// Count any bottled item as a bottle
if (item >= ITEM_BOTTLE && item <= ITEM_POE) {
if (gSaveContext.sohStats.itemTimestamp[ITEM_BOTTLE] == 0) {
gSaveContext.sohStats.itemTimestamp[ITEM_BOTTLE] = time;
if (gSaveContext.ship.stats.itemTimestamp[ITEM_BOTTLE] == 0) {
gSaveContext.ship.stats.itemTimestamp[ITEM_BOTTLE] = time;
}
return;
}
// Count any bombchu pack as bombchus
if (item == ITEM_BOMBCHU || (item >= ITEM_BOMBCHUS_5 && item <= ITEM_BOMBCHUS_20)) {
if (gSaveContext.sohStats.itemTimestamp[ITEM_BOMBCHU] == 0) {
gSaveContext.sohStats.itemTimestamp[ITEM_BOMBCHU] = time;
if (gSaveContext.ship.stats.itemTimestamp[ITEM_BOMBCHU] == 0) {
gSaveContext.ship.stats.itemTimestamp[ITEM_BOMBCHU] = time;
}
return;
}
gSaveContext.sohStats.itemTimestamp[item] = time;
gSaveContext.ship.stats.itemTimestamp[item] = time;
GameInteractor_ExecuteOnTimestamp(item);
}
@@ -2338,7 +2338,7 @@ u8 Item_Give(PlayState* play, u8 item) {
return Return_Item(item, MOD_NONE, ITEM_NONE);
} else if ((item == ITEM_HEART_PIECE_2) || (item == ITEM_HEART_PIECE)) {
gSaveContext.inventory.questItems += 1 << (QUEST_HEART_PIECE + 4);
gSaveContext.sohStats.heartPieces++;
gSaveContext.ship.stats.heartPieces++;
return Return_Item(item, MOD_NONE, ITEM_NONE);
} else if (item == ITEM_HEART_CONTAINER) {
if (!CVarGetInteger(CVAR_ENHANCEMENT("HurtContainer"), 0)) {
@@ -2348,7 +2348,7 @@ u8 Item_Give(PlayState* play, u8 item) {
gSaveContext.healthCapacity -= 0x10;
gSaveContext.health -= 0x10;
}
gSaveContext.sohStats.heartContainers++;
gSaveContext.ship.stats.heartContainers++;
return Return_Item(item, MOD_NONE, ITEM_NONE);
} else if (item == ITEM_HEART) {
osSyncPrintf("回復ハート回復ハート回復ハート\n"); // "Recovery Heart"
@@ -2447,7 +2447,7 @@ u8 Item_Give(PlayState* play, u8 item) {
}
if (item >= ITEM_POCKET_EGG) {
gSaveContext.adultTradeItems |= ADULT_TRADE_FLAG(item);
gSaveContext.ship.quest.data.randomizer.adultTradeItems |= ADULT_TRADE_FLAG(item);
}
temp = INV_CONTENT(item);
@@ -2763,8 +2763,8 @@ bool Inventory_HatchPocketCucco(PlayState* play) {
return 0;
}
gSaveContext.adultTradeItems &= ~ADULT_TRADE_FLAG(ITEM_POCKET_EGG);
gSaveContext.adultTradeItems |= ADULT_TRADE_FLAG(ITEM_POCKET_CUCCO);
gSaveContext.ship.quest.data.randomizer.adultTradeItems &= ~ADULT_TRADE_FLAG(ITEM_POCKET_EGG);
gSaveContext.ship.quest.data.randomizer.adultTradeItems |= ADULT_TRADE_FLAG(ITEM_POCKET_CUCCO);
Inventory_ReplaceItem(play, ITEM_POCKET_EGG, ITEM_POCKET_CUCCO);
return 1;
}
@@ -2882,7 +2882,7 @@ s32 Health_ChangeBy(PlayState* play, s16 healthChange) {
gSaveContext.healthCapacity);
if (healthChange < 0) {
gSaveContext.sohStats.count[COUNT_DAMAGE_TAKEN] += -healthChange;
gSaveContext.ship.stats.count[COUNT_DAMAGE_TAKEN] += -healthChange;
}
// If one-hit ko mode is on, any damage kills you and you cannot gain health.
@@ -2952,10 +2952,10 @@ void Rupees_ChangeBy(s16 rupeeChange) {
}
if (rupeeChange > 0) {
gSaveContext.sohStats.count[COUNT_RUPEES_COLLECTED] += rupeeChange;
gSaveContext.ship.stats.count[COUNT_RUPEES_COLLECTED] += rupeeChange;
}
if (rupeeChange < 0) {
gSaveContext.sohStats.count[COUNT_RUPEES_SPENT] += -rupeeChange;
gSaveContext.ship.stats.count[COUNT_RUPEES_SPENT] += -rupeeChange;
}
}
@@ -2963,25 +2963,25 @@ void GameplayStats_UpdateAmmoUsed(s16 item, s16 ammoUsed) {
switch (item) {
case ITEM_STICK:
gSaveContext.sohStats.count[COUNT_AMMO_USED_STICK] += ammoUsed;
gSaveContext.ship.stats.count[COUNT_AMMO_USED_STICK] += ammoUsed;
break;
case ITEM_NUT:
gSaveContext.sohStats.count[COUNT_AMMO_USED_NUT] += ammoUsed;
gSaveContext.ship.stats.count[COUNT_AMMO_USED_NUT] += ammoUsed;
break;
case ITEM_BOMB:
gSaveContext.sohStats.count[COUNT_AMMO_USED_BOMB] += ammoUsed;
gSaveContext.ship.stats.count[COUNT_AMMO_USED_BOMB] += ammoUsed;
break;
case ITEM_BOW:
gSaveContext.sohStats.count[COUNT_AMMO_USED_ARROW] += ammoUsed;
gSaveContext.ship.stats.count[COUNT_AMMO_USED_ARROW] += ammoUsed;
break;
case ITEM_SLINGSHOT:
gSaveContext.sohStats.count[COUNT_AMMO_USED_SEED] += ammoUsed;
gSaveContext.ship.stats.count[COUNT_AMMO_USED_SEED] += ammoUsed;
break;
case ITEM_BOMBCHU:
gSaveContext.sohStats.count[COUNT_AMMO_USED_BOMBCHU] += ammoUsed;
gSaveContext.ship.stats.count[COUNT_AMMO_USED_BOMBCHU] += ammoUsed;
break;
case ITEM_BEAN:
gSaveContext.sohStats.count[COUNT_AMMO_USED_BEAN] += ammoUsed;
gSaveContext.ship.stats.count[COUNT_AMMO_USED_BEAN] += ammoUsed;
break;
default:
break;
@@ -6122,7 +6122,7 @@ void Interface_Draw(PlayState* play) {
void Interface_DrawTotalGameplayTimer(PlayState* play) {
// Draw timer based on the Gameplay Stats total time.
if ((IS_BOSS_RUSH && gSaveContext.bossRushOptions[BR_OPTIONS_TIMER] == BR_CHOICE_TIMER_YES) ||
if ((IS_BOSS_RUSH && gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_TIMER] == BR_CHOICE_TIMER_YES) ||
(CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.ShowIngameTimer"), 0) && gSaveContext.fileNum >= 0 && gSaveContext.fileNum <= 2)) {
s32 X_Margins_Timer = 0;
@@ -6202,9 +6202,9 @@ void Interface_DrawTotalGameplayTimer(PlayState* play) {
(rectTop + rectHeight) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
// Draw regular text. Change color based on if the timer is paused, running or the game is completed.
if (gSaveContext.sohStats.gameComplete) {
if (gSaveContext.ship.stats.gameComplete) {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 120, 255, 0, 255);
} else if (gSaveContext.isBossRushPaused && !gSaveContext.sohStats.rtaTiming) {
} else if (IS_BOSS_RUSH && gSaveContext.ship.quest.data.bossRush.isPaused && !gSaveContext.ship.stats.rtaTiming) {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 150, 150, 150, 255);
} else {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, 255);
@@ -6429,11 +6429,11 @@ void Interface_Update(PlayState* play) {
} else {
gSaveContext.rupeeAccumulator = 0;
}
if (gSaveContext.rupeeAccumulator == 0 && gSaveContext.pendingSale != ITEM_NONE) {
u16 tempSaleItem = gSaveContext.pendingSale;
u16 tempSaleMod = gSaveContext.pendingSaleMod;
gSaveContext.pendingSale = ITEM_NONE;
gSaveContext.pendingSaleMod = MOD_NONE;
if (gSaveContext.rupeeAccumulator == 0 && gSaveContext.ship.pendingSale != ITEM_NONE) {
u16 tempSaleItem = gSaveContext.ship.pendingSale;
u16 tempSaleMod = gSaveContext.ship.pendingSaleMod;
gSaveContext.ship.pendingSale = ITEM_NONE;
gSaveContext.ship.pendingSaleMod = MOD_NONE;
if (tempSaleMod == MOD_NONE) {
GetItemID getItemID = RetrieveGetItemIDFromItemID(tempSaleItem);
RandomizerGet randomizerGet = RetrieveRandomizerGetFromItemID(tempSaleItem);

View File

@@ -646,32 +646,32 @@ void Play_Init(GameState* thisx) {
gSaveContext.respawnFlag = 0;
// #region SOH [Stats]
if (gSaveContext.sohStats.sceneNum != gPlayState->sceneNum) {
u16 idx = gSaveContext.sohStats.tsIdx;
gSaveContext.sohStats.sceneTimestamps[idx].sceneTime = gSaveContext.sohStats.sceneTimer / 2;
gSaveContext.sohStats.sceneTimestamps[idx].roomTime = gSaveContext.sohStats.roomTimer / 2;
gSaveContext.sohStats.sceneTimestamps[idx].scene = gSaveContext.sohStats.sceneNum;
gSaveContext.sohStats.sceneTimestamps[idx].room = gSaveContext.sohStats.roomNum;
gSaveContext.sohStats.sceneTimestamps[idx].isRoom =
gPlayState->sceneNum == gSaveContext.sohStats.sceneTimestamps[idx].scene &&
gPlayState->roomCtx.curRoom.num != gSaveContext.sohStats.sceneTimestamps[idx].room;
gSaveContext.sohStats.tsIdx++;
gSaveContext.sohStats.sceneTimer = 0;
gSaveContext.sohStats.roomTimer = 0;
} else if (gSaveContext.sohStats.roomNum != gPlayState->roomCtx.curRoom.num) {
u16 idx = gSaveContext.sohStats.tsIdx;
gSaveContext.sohStats.sceneTimestamps[idx].roomTime = gSaveContext.sohStats.roomTimer / 2;
gSaveContext.sohStats.sceneTimestamps[idx].scene = gSaveContext.sohStats.sceneNum;
gSaveContext.sohStats.sceneTimestamps[idx].room = gSaveContext.sohStats.roomNum;
gSaveContext.sohStats.sceneTimestamps[idx].isRoom =
gPlayState->sceneNum == gSaveContext.sohStats.sceneTimestamps[idx].scene &&
gPlayState->roomCtx.curRoom.num != gSaveContext.sohStats.sceneTimestamps[idx].room;
gSaveContext.sohStats.tsIdx++;
gSaveContext.sohStats.roomTimer = 0;
if (gSaveContext.ship.stats.sceneNum != gPlayState->sceneNum) {
u16 idx = gSaveContext.ship.stats.tsIdx;
gSaveContext.ship.stats.sceneTimestamps[idx].sceneTime = gSaveContext.ship.stats.sceneTimer / 2;
gSaveContext.ship.stats.sceneTimestamps[idx].roomTime = gSaveContext.ship.stats.roomTimer / 2;
gSaveContext.ship.stats.sceneTimestamps[idx].scene = gSaveContext.ship.stats.sceneNum;
gSaveContext.ship.stats.sceneTimestamps[idx].room = gSaveContext.ship.stats.roomNum;
gSaveContext.ship.stats.sceneTimestamps[idx].isRoom =
gPlayState->sceneNum == gSaveContext.ship.stats.sceneTimestamps[idx].scene &&
gPlayState->roomCtx.curRoom.num != gSaveContext.ship.stats.sceneTimestamps[idx].room;
gSaveContext.ship.stats.tsIdx++;
gSaveContext.ship.stats.sceneTimer = 0;
gSaveContext.ship.stats.roomTimer = 0;
} else if (gSaveContext.ship.stats.roomNum != gPlayState->roomCtx.curRoom.num) {
u16 idx = gSaveContext.ship.stats.tsIdx;
gSaveContext.ship.stats.sceneTimestamps[idx].roomTime = gSaveContext.ship.stats.roomTimer / 2;
gSaveContext.ship.stats.sceneTimestamps[idx].scene = gSaveContext.ship.stats.sceneNum;
gSaveContext.ship.stats.sceneTimestamps[idx].room = gSaveContext.ship.stats.roomNum;
gSaveContext.ship.stats.sceneTimestamps[idx].isRoom =
gPlayState->sceneNum == gSaveContext.ship.stats.sceneTimestamps[idx].scene &&
gPlayState->roomCtx.curRoom.num != gSaveContext.ship.stats.sceneTimestamps[idx].room;
gSaveContext.ship.stats.tsIdx++;
gSaveContext.ship.stats.roomTimer = 0;
}
gSaveContext.sohStats.sceneNum = gPlayState->sceneNum;
gSaveContext.sohStats.roomNum = gPlayState->roomCtx.curRoom.num;
gSaveContext.ship.stats.sceneNum = gPlayState->sceneNum;
gSaveContext.ship.stats.roomNum = gPlayState->roomCtx.curRoom.num;
// #endregion
#if 0
@@ -741,28 +741,28 @@ void Play_Update(PlayState* play) {
}
// #region SOH [Stats] Gameplay stats: Count button presses
if (!gSaveContext.sohStats.gameComplete) {
if (CHECK_BTN_ALL(input[0].press.button, BTN_A)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_A]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_B)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_B]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_CUP)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_CUP]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_CRIGHT)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_CRIGHT]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_CLEFT)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_CLEFT]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_CDOWN)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_CDOWN]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_DUP)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_DUP]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_DRIGHT)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_DRIGHT]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_DDOWN)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_DDOWN]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_DLEFT)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_DLEFT]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_L)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_L]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_R)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_R]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_Z)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_Z]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_START)) {gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_START]++;}
if (!gSaveContext.ship.stats.gameComplete) {
if (CHECK_BTN_ALL(input[0].press.button, BTN_A)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_A]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_B)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_B]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_CUP)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_CUP]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_CRIGHT)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_CRIGHT]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_CLEFT)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_CLEFT]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_CDOWN)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_CDOWN]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_DUP)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_DUP]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_DRIGHT)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_DRIGHT]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_DDOWN)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_DDOWN]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_DLEFT)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_DLEFT]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_L)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_L]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_R)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_R]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_Z)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_Z]++;}
if (CHECK_BTN_ALL(input[0].press.button, BTN_START)) {gSaveContext.ship.stats.count[COUNT_BUTTON_PRESSES_START]++;}
// Start RTA timing on first non-c-up input after intro cutscene
if (
!gSaveContext.sohStats.fileCreatedAt && !Player_InCsMode(play) &&
!gSaveContext.ship.stats.fileCreatedAt && !Player_InCsMode(play) &&
((input[0].press.button && input[0].press.button != 0x8) || input[0].rel.stick_x != 0 || input[0].rel.stick_y != 0)
) {
gSaveContext.sohStats.fileCreatedAt = GetUnixTimestamp();
gSaveContext.ship.stats.fileCreatedAt = GetUnixTimestamp();
}
}
// #endregion
@@ -1146,14 +1146,14 @@ void Play_Update(PlayState* play) {
func_800AA178(true);
// Gameplay stat tracking
if (!gSaveContext.sohStats.gameComplete &&
(!IS_BOSS_RUSH || !gSaveContext.isBossRushPaused)) {
gSaveContext.sohStats.playTimer++;
gSaveContext.sohStats.sceneTimer++;
gSaveContext.sohStats.roomTimer++;
if (!gSaveContext.ship.stats.gameComplete &&
(!IS_BOSS_RUSH || !gSaveContext.ship.quest.data.bossRush.isPaused)) {
gSaveContext.ship.stats.playTimer++;
gSaveContext.ship.stats.sceneTimer++;
gSaveContext.ship.stats.roomTimer++;
if (CVarGetInteger(CVAR_ENHANCEMENT("MMBunnyHood"), BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA && Player_GetMask(play) == PLAYER_MASK_BUNNY) {
gSaveContext.sohStats.count[COUNT_TIME_BUNNY_HOOD]++;
gSaveContext.ship.stats.count[COUNT_TIME_BUNNY_HOOD]++;
}
}
@@ -2220,7 +2220,7 @@ void Play_PerformSave(PlayState* play) {
uint8_t triforceHuntCompleted =
IS_RANDO &&
gSaveContext.triforcePiecesCollected == (Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED) + 1) &&
gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected == (Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED) + 1) &&
Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT);
if (CVarGetInteger(CVAR_ENHANCEMENT("Autosave"), AUTOSAVE_OFF) != AUTOSAVE_OFF || triforceHuntCompleted) {
Overlay_DisplayText(3.0f, "Game Saved");

View File

@@ -653,14 +653,14 @@ void func_80097534(PlayState* play, RoomContext* roomCtx) {
Map_SavePlayerInitialInfo(play);
}
Audio_SetEnvReverb(play->roomCtx.curRoom.echo);
u8 idx = gSaveContext.sohStats.tsIdx;
gSaveContext.sohStats.sceneTimestamps[idx].scene = gSaveContext.sohStats.sceneNum;
gSaveContext.sohStats.sceneTimestamps[idx].room = gSaveContext.sohStats.roomNum;
gSaveContext.sohStats.sceneTimestamps[idx].roomTime = gSaveContext.sohStats.roomTimer / 2;
gSaveContext.sohStats.sceneTimestamps[idx].isRoom =
gPlayState->sceneNum == gSaveContext.sohStats.sceneTimestamps[idx].scene &&
gPlayState->roomCtx.curRoom.num != gSaveContext.sohStats.sceneTimestamps[idx].room;
gSaveContext.sohStats.tsIdx++;
gSaveContext.sohStats.roomNum = roomCtx->curRoom.num;
gSaveContext.sohStats.roomTimer = 0;
u8 idx = gSaveContext.ship.stats.tsIdx;
gSaveContext.ship.stats.sceneTimestamps[idx].scene = gSaveContext.ship.stats.sceneNum;
gSaveContext.ship.stats.sceneTimestamps[idx].room = gSaveContext.ship.stats.roomNum;
gSaveContext.ship.stats.sceneTimestamps[idx].roomTime = gSaveContext.ship.stats.roomTimer / 2;
gSaveContext.ship.stats.sceneTimestamps[idx].isRoom =
gPlayState->sceneNum == gSaveContext.ship.stats.sceneTimestamps[idx].scene &&
gPlayState->roomCtx.curRoom.num != gSaveContext.ship.stats.sceneTimestamps[idx].room;
gSaveContext.ship.stats.tsIdx++;
gSaveContext.ship.stats.roomNum = roomCtx->curRoom.num;
gSaveContext.ship.stats.roomTimer = 0;
}

View File

@@ -142,7 +142,7 @@ void Sram_OpenSave() {
}
if (!CVarGetInteger(CVAR_ENHANCEMENT("PersistentMasks"), 0)) {
gSaveContext.maskMemory = PLAYER_MASK_NONE;
gSaveContext.ship.maskMemory = PLAYER_MASK_NONE;
}
osSyncPrintf("scene_no = %d\n", gSaveContext.entranceIndex);
@@ -252,11 +252,11 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) {
u8 currentQuest = fileChooseCtx->questType[fileChooseCtx->buttonIndex];
if (currentQuest == QUEST_RANDOMIZER && (Randomizer_IsSeedGenerated() || Randomizer_IsSpoilerLoaded())) {
gSaveContext.questId = QUEST_RANDOMIZER;
gSaveContext.ship.quest.id = QUEST_RANDOMIZER;
Randomizer_InitSaveFile();
} else {
gSaveContext.questId = currentQuest;
gSaveContext.ship.quest.id = currentQuest;
}
Save_SaveFile();

View File

@@ -487,7 +487,7 @@ void EnBox_Open(EnBox* this, PlayState* play) {
if (Animation_OnFrame(&this->skelanime, 30.0f)) {
sfxId = NA_SE_EV_TBOX_UNLOCK;
gSaveContext.sohStats.count[COUNT_CHESTS_OPENED]++;
gSaveContext.ship.stats.count[COUNT_CHESTS_OPENED]++;
} else if (Animation_OnFrame(&this->skelanime, 90.0f)) {
sfxId = NA_SE_EV_TBOX_OPEN;
}

View File

@@ -391,8 +391,8 @@ void func_809EFDD0(EnDns* this, PlayState* play) {
pendingGetItemId = this->dnsItemEntry->getItemId;
}
GetItemEntry itemEntry = ItemTable_Retrieve(pendingGetItemId);
gSaveContext.pendingSale = itemEntry.itemId;
gSaveContext.pendingSaleMod = itemEntry.modIndex;
gSaveContext.ship.pendingSale = itemEntry.itemId;
gSaveContext.ship.pendingSaleMod = itemEntry.modIndex;
Actor_OfferGetItem(&this->actor, play, pendingGetItemId, 130.0f, 100.0f);
}

View File

@@ -206,8 +206,8 @@ void EnDs_OfferBluePotion(EnDs* this, PlayState* play) {
if (GameInteractor_Should(VB_GIVE_ITEM_FROM_GRANNYS_SHOP, true, this)) {
GetItemEntry itemEntry = ItemTable_Retrieve(GI_POTION_BLUE);
Actor_OfferGetItem(&this->actor, play, GI_POTION_BLUE, 10000.0f, 50.0f);
gSaveContext.pendingSale = itemEntry.itemId;
gSaveContext.pendingSaleMod = itemEntry.modIndex;
gSaveContext.ship.pendingSale = itemEntry.itemId;
gSaveContext.ship.pendingSaleMod = itemEntry.modIndex;
this->actionFunc = EnDs_GiveBluePotion;
}

View File

@@ -880,16 +880,16 @@ s32 EnGirlA_CanBuy_Randomizer(PlayState* play, EnGirlA* this) {
void EnGirlA_ItemGive_Arrows(PlayState* play, EnGirlA* this) {
GetItemEntry entry = ItemTable_Retrieve(this->getItemId);
gSaveContext.pendingSale = entry.itemId;
gSaveContext.pendingSaleMod = entry.modIndex;
gSaveContext.ship.pendingSale = entry.itemId;
gSaveContext.ship.pendingSaleMod = entry.modIndex;
Inventory_ChangeAmmo(ITEM_BOW, this->itemCount);
Rupees_ChangeBy(-this->basePrice);
}
void EnGirlA_ItemGive_Bombs(PlayState* play, EnGirlA* this) {
GetItemEntry entry = ItemTable_Retrieve(this->getItemId);
gSaveContext.pendingSale = entry.itemId;
gSaveContext.pendingSaleMod = entry.modIndex;
gSaveContext.ship.pendingSale = entry.itemId;
gSaveContext.ship.pendingSaleMod = entry.modIndex;
switch (this->itemCount) {
case 5:
Item_Give(play, ITEM_BOMBS_5);
@@ -909,8 +909,8 @@ void EnGirlA_ItemGive_Bombs(PlayState* play, EnGirlA* this) {
void EnGirlA_ItemGive_DekuNuts(PlayState* play, EnGirlA* this) {
GetItemEntry entry = ItemTable_Retrieve(this->getItemId);
gSaveContext.pendingSale = entry.itemId;
gSaveContext.pendingSaleMod = entry.modIndex;
gSaveContext.ship.pendingSale = entry.itemId;
gSaveContext.ship.pendingSaleMod = entry.modIndex;
switch (this->itemCount) {
case 5:
Item_Give(play, ITEM_NUTS_5);
@@ -924,16 +924,16 @@ void EnGirlA_ItemGive_DekuNuts(PlayState* play, EnGirlA* this) {
void EnGirlA_ItemGive_DekuSticks(PlayState* play, EnGirlA* this) {
GetItemEntry entry = ItemTable_Retrieve(this->getItemId);
gSaveContext.pendingSale = entry.itemId;
gSaveContext.pendingSaleMod = entry.modIndex;
gSaveContext.ship.pendingSale = entry.itemId;
gSaveContext.ship.pendingSaleMod = entry.modIndex;
Item_Give(play, ITEM_STICK);
Rupees_ChangeBy(-this->basePrice);
}
void EnGirlA_ItemGive_Longsword(PlayState* play, EnGirlA* this) {
GetItemEntry entry = ItemTable_Retrieve(this->getItemId);
gSaveContext.pendingSale = entry.itemId;
gSaveContext.pendingSaleMod = entry.modIndex;
gSaveContext.ship.pendingSale = entry.itemId;
gSaveContext.ship.pendingSaleMod = entry.modIndex;
func_800849EC(play);
gSaveContext.swordHealth = 8;
Rupees_ChangeBy(-this->basePrice);
@@ -941,86 +941,86 @@ void EnGirlA_ItemGive_Longsword(PlayState* play, EnGirlA* this) {
void EnGirlA_ItemGive_HylianShield(PlayState* play, EnGirlA* this) {
GetItemEntry entry = ItemTable_Retrieve(this->getItemId);
gSaveContext.pendingSale = entry.itemId;
gSaveContext.pendingSaleMod = entry.modIndex;
gSaveContext.ship.pendingSale = entry.itemId;
gSaveContext.ship.pendingSaleMod = entry.modIndex;
Item_Give(play, ITEM_SHIELD_HYLIAN);
Rupees_ChangeBy(-this->basePrice);
}
void EnGirlA_ItemGive_DekuShield(PlayState* play, EnGirlA* this) {
GetItemEntry entry = ItemTable_Retrieve(this->getItemId);
gSaveContext.pendingSale = entry.itemId;
gSaveContext.pendingSaleMod = entry.modIndex;
gSaveContext.ship.pendingSale = entry.itemId;
gSaveContext.ship.pendingSaleMod = entry.modIndex;
Item_Give(play, ITEM_SHIELD_DEKU);
Rupees_ChangeBy(-this->basePrice);
}
void EnGirlA_ItemGive_GoronTunic(PlayState* play, EnGirlA* this) {
GetItemEntry entry = ItemTable_Retrieve(this->getItemId);
gSaveContext.pendingSale = entry.itemId;
gSaveContext.pendingSaleMod = entry.modIndex;
gSaveContext.ship.pendingSale = entry.itemId;
gSaveContext.ship.pendingSaleMod = entry.modIndex;
Item_Give(play, ITEM_TUNIC_GORON);
Rupees_ChangeBy(-this->basePrice);
}
void EnGirlA_ItemGive_ZoraTunic(PlayState* play, EnGirlA* this) {
GetItemEntry entry = ItemTable_Retrieve(this->getItemId);
gSaveContext.pendingSale = entry.itemId;
gSaveContext.pendingSaleMod = entry.modIndex;
gSaveContext.ship.pendingSale = entry.itemId;
gSaveContext.ship.pendingSaleMod = entry.modIndex;
Item_Give(play, ITEM_TUNIC_ZORA);
Rupees_ChangeBy(-this->basePrice);
}
void EnGirlA_ItemGive_Health(PlayState* play, EnGirlA* this) {
GetItemEntry entry = ItemTable_Retrieve(this->getItemId);
gSaveContext.pendingSale = entry.itemId;
gSaveContext.pendingSaleMod = entry.modIndex;
gSaveContext.ship.pendingSale = entry.itemId;
gSaveContext.ship.pendingSaleMod = entry.modIndex;
Health_ChangeBy(play, this->itemCount);
Rupees_ChangeBy(-this->basePrice);
}
void EnGirlA_ItemGive_MilkBottle(PlayState* play, EnGirlA* this) {
GetItemEntry entry = ItemTable_Retrieve(this->getItemId);
gSaveContext.pendingSale = entry.itemId;
gSaveContext.pendingSaleMod = entry.modIndex;
gSaveContext.ship.pendingSale = entry.itemId;
gSaveContext.ship.pendingSaleMod = entry.modIndex;
Item_Give(play, ITEM_MILK_BOTTLE);
Rupees_ChangeBy(-this->basePrice);
}
void EnGirlA_ItemGive_WeirdEgg(PlayState* play, EnGirlA* this) {
GetItemEntry entry = ItemTable_Retrieve(this->getItemId);
gSaveContext.pendingSale = entry.itemId;
gSaveContext.pendingSaleMod = entry.modIndex;
gSaveContext.ship.pendingSale = entry.itemId;
gSaveContext.ship.pendingSaleMod = entry.modIndex;
Item_Give(play, ITEM_WEIRD_EGG);
Rupees_ChangeBy(-this->basePrice);
}
void EnGirlA_ItemGive_Unk19(PlayState* play, EnGirlA* this) {
GetItemEntry entry = ItemTable_Retrieve(this->getItemId);
gSaveContext.pendingSale = entry.itemId;
gSaveContext.pendingSaleMod = entry.modIndex;
gSaveContext.ship.pendingSale = entry.itemId;
gSaveContext.ship.pendingSaleMod = entry.modIndex;
Rupees_ChangeBy(-this->basePrice);
}
void EnGirlA_ItemGive_Unk20(PlayState* play, EnGirlA* this) {
GetItemEntry entry = ItemTable_Retrieve(this->getItemId);
gSaveContext.pendingSale = entry.itemId;
gSaveContext.pendingSaleMod = entry.modIndex;
gSaveContext.ship.pendingSale = entry.itemId;
gSaveContext.ship.pendingSaleMod = entry.modIndex;
Rupees_ChangeBy(-this->basePrice);
}
void EnGirlA_ItemGive_DekuSeeds(PlayState* play, EnGirlA* this) {
GetItemEntry entry = ItemTable_Retrieve(this->getItemId);
gSaveContext.pendingSale = entry.itemId;
gSaveContext.pendingSaleMod = entry.modIndex;
gSaveContext.ship.pendingSale = entry.itemId;
gSaveContext.ship.pendingSaleMod = entry.modIndex;
Item_Give(play, ITEM_SEEDS_30);
Rupees_ChangeBy(-this->basePrice);
}
void EnGirlA_ItemGive_BottledItem(PlayState* play, EnGirlA* this) {
GetItemEntry entry = ItemTable_Retrieve(this->getItemId);
gSaveContext.pendingSale = entry.itemId;
gSaveContext.pendingSaleMod = entry.modIndex;
gSaveContext.ship.pendingSale = entry.itemId;
gSaveContext.ship.pendingSaleMod = entry.modIndex;
switch (this->actor.params) {
case SI_FISH:
Item_Give(play, ITEM_FISH);
@@ -1066,8 +1066,8 @@ void EnGirlA_ItemGive_Randomizer(PlayState* play, EnGirlA* this) {
void EnGirlA_BuyEvent_ShieldDiscount(PlayState* play, EnGirlA* this) {
GetItemEntry entry = ItemTable_Retrieve(this->getItemId);
gSaveContext.pendingSale = entry.itemId;
gSaveContext.pendingSaleMod = entry.modIndex;
gSaveContext.ship.pendingSale = entry.itemId;
gSaveContext.ship.pendingSaleMod = entry.modIndex;
if (this->actor.params == SI_HYLIAN_SHIELD) {
if (Flags_GetInfTable(INFTABLE_SHOWED_ZELDAS_LETTER_TO_GATE_GUARD)) {
Rupees_ChangeBy(-(this->basePrice - sShieldDiscounts[(s32)Rand_ZeroFloat(7.9f)]));
@@ -1079,22 +1079,22 @@ void EnGirlA_BuyEvent_ShieldDiscount(PlayState* play, EnGirlA* this) {
void EnGirlA_BuyEvent_GoronTunic(PlayState* play, EnGirlA* this) {
GetItemEntry entry = ItemTable_Retrieve(this->getItemId);
gSaveContext.pendingSale = entry.itemId;
gSaveContext.pendingSaleMod = entry.modIndex;
gSaveContext.ship.pendingSale = entry.itemId;
gSaveContext.ship.pendingSaleMod = entry.modIndex;
Rupees_ChangeBy(-this->basePrice);
}
void EnGirlA_BuyEvent_ZoraTunic(PlayState* play, EnGirlA* this) {
GetItemEntry entry = ItemTable_Retrieve(this->getItemId);
gSaveContext.pendingSale = entry.itemId;
gSaveContext.pendingSaleMod = entry.modIndex;
gSaveContext.ship.pendingSale = entry.itemId;
gSaveContext.ship.pendingSaleMod = entry.modIndex;
Rupees_ChangeBy(-this->basePrice);
}
void EnGirlA_BuyEvent_ObtainBombchuPack(PlayState* play, EnGirlA* this) {
GetItemEntry entry = ItemTable_Retrieve(this->getItemId);
gSaveContext.pendingSale = entry.itemId;
gSaveContext.pendingSaleMod = entry.modIndex;
gSaveContext.ship.pendingSale = entry.itemId;
gSaveContext.ship.pendingSaleMod = entry.modIndex;
Rupees_ChangeBy(-this->basePrice);
// Normally, buying a bombchu pack sets a flag indicating the pack is now sold out

View File

@@ -135,8 +135,8 @@ void func_80A89160(EnJs* this, PlayState* play) {
En_Js_SetupAction(this, func_80A8910C);
} else {
GetItemEntry itemEntry = ItemTable_Retrieve(GI_BOMBCHUS_10);
gSaveContext.pendingSale = itemEntry.itemId;
gSaveContext.pendingSaleMod = itemEntry.modIndex;
gSaveContext.ship.pendingSale = itemEntry.itemId;
gSaveContext.ship.pendingSaleMod = itemEntry.modIndex;
Actor_OfferGetItem(&this->actor, play, GI_BOMBCHUS_10, 10000.0f, 50.0f);
}
}

View File

@@ -310,7 +310,7 @@ void EnKusa_Main(EnKusa* this, PlayState* play) {
EnKusa_SpawnFragments(this, play);
EnKusa_DropCollectible(this, play);
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 20, NA_SE_EV_PLANT_BROKEN);
gSaveContext.sohStats.count[COUNT_BUSHES_CUT]++;
gSaveContext.ship.stats.count[COUNT_BUSHES_CUT]++;
if ((this->actor.params >> 4) & 1) {
EnKusa_SpawnBugs(this, play);
@@ -379,7 +379,7 @@ void EnKusa_Fall(EnKusa* this, PlayState* play) {
if (this->actor.bgCheckFlags & 0xB) {
if (!(this->actor.bgCheckFlags & 0x20)) {
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 20, NA_SE_EV_PLANT_BROKEN);
gSaveContext.sohStats.count[COUNT_BUSHES_CUT]++;
gSaveContext.ship.stats.count[COUNT_BUSHES_CUT]++;
}
EnKusa_SpawnFragments(this, play);
EnKusa_DropCollectible(this, play);

View File

@@ -917,8 +917,8 @@ void func_80B15FE8(EnTa* this, PlayState* play) {
EnTa_SetupAction(this, EnTa_GiveItemInLonLonHouse, EnTa_AnimRunToEnd);
Rupees_ChangeBy(-30);
GetItemEntry itemEntry = ItemTable_Retrieve(GI_MILK);
gSaveContext.pendingSale = itemEntry.itemId;
gSaveContext.pendingSaleMod = itemEntry.modIndex;
gSaveContext.ship.pendingSale = itemEntry.itemId;
gSaveContext.ship.pendingSaleMod = itemEntry.modIndex;
Actor_OfferGetItem(&this->actor, play, GI_MILK, 10000.0f, 50.0f);
break;
}

View File

@@ -189,7 +189,7 @@ void ObjTsubo_AirBreak(ObjTsubo* this, PlayState* play) {
sObjectIds[(this->actor.params >> 8) & 1], D_80BA1B8C[(this->actor.params >> 8) & 1]);
}
func_80033480(play, &this->actor.world.pos, 30.0f, 4, 20, 50, 1);
gSaveContext.sohStats.count[COUNT_POTS_BROKEN]++;
gSaveContext.ship.stats.count[COUNT_POTS_BROKEN]++;
}
void ObjTsubo_WaterBreak(ObjTsubo* this, PlayState* play) {
@@ -218,7 +218,7 @@ void ObjTsubo_WaterBreak(ObjTsubo* this, PlayState* play) {
(Rand_ZeroOne() * 95.0f) + 15.0f, 0, 32, 70, KAKERA_COLOR_NONE,
sObjectIds[(this->actor.params >> 8) & 1], D_80BA1B8C[(this->actor.params >> 8) & 1]);
}
gSaveContext.sohStats.count[COUNT_POTS_BROKEN]++;
gSaveContext.ship.stats.count[COUNT_POTS_BROKEN]++;
}
void ObjTsubo_SetupWaitForObject(ObjTsubo* this) {

View File

@@ -1789,9 +1789,9 @@ void Player_PlaySteppingSfx(Player* this, f32 pitchAdjustment) {
func_800F4010(&this->actor.projectedPos, sfxId, pitchAdjustment);
// Gameplay stats: Count footsteps
// Only count while game isn't complete and don't count Link's idle animations or crawling in crawlspaces
if (!gSaveContext.sohStats.gameComplete && !(this->stateFlags2 & PLAYER_STATE2_IDLE_FIDGET) &&
if (!gSaveContext.ship.stats.gameComplete && !(this->stateFlags2 & PLAYER_STATE2_IDLE_FIDGET) &&
!(this->stateFlags2 & PLAYER_STATE2_CRAWLING)) {
gSaveContext.sohStats.count[COUNT_STEPS]++;
gSaveContext.ship.stats.count[COUNT_STEPS]++;
}
}
@@ -2379,7 +2379,7 @@ void func_80833A20(Player* this, s32 newMeleeWeaponState) {
}
if (this->heldItemAction >= PLAYER_IA_SWORD_MASTER && this->heldItemAction <= PLAYER_IA_SWORD_BIGGORON) {
gSaveContext.sohStats.count[COUNT_SWORD_SWINGS]++;
gSaveContext.ship.stats.count[COUNT_SWORD_SWINGS]++;
}
}
@@ -3484,7 +3484,7 @@ void Player_UseItem(PlayState* play, Player* this, s32 item) {
this->currentMask = itemAction - PLAYER_IA_MASK_KEATON + 1;
}
gSaveContext.maskMemory = this->currentMask;
gSaveContext.ship.maskMemory = this->currentMask;
func_808328EC(this, NA_SE_PL_CHANGE_ARMS);
} else if (((itemAction >= PLAYER_IA_OCARINA_FAIRY) && (itemAction <= PLAYER_IA_OCARINA_OF_TIME)) ||
@@ -5538,7 +5538,7 @@ void func_8083A0F4(PlayState* play, Player* this) {
Player_SetupAction(play, this, Player_Action_8084F608, 0);
this->stateFlags1 |= PLAYER_STATE1_IN_CUTSCENE;
if (!CVarGetInteger(CVAR_ENHANCEMENT("PersistentMasks"), 0) || !CVarGetInteger(CVAR_ENHANCEMENT("AdultMasks"), 0)) {
gSaveContext.maskMemory = PLAYER_MASK_NONE;
gSaveContext.ship.maskMemory = PLAYER_MASK_NONE;
}
} else {
LinkAnimationHeader* anim;
@@ -6267,7 +6267,7 @@ void Player_SetupRoll(Player* this, PlayState* play) {
LinkAnimation_PlayOnceSetSpeed(play, &this->skelAnime,
GET_PLAYER_ANIM(PLAYER_ANIMGROUP_landing_roll, this->modelAnimType),
1.25f * sWaterSpeedFactor);
gSaveContext.sohStats.count[COUNT_ROLLS]++;
gSaveContext.ship.stats.count[COUNT_ROLLS]++;
}
s32 Player_TryRoll(Player* this, PlayState* play) {
@@ -6326,10 +6326,10 @@ s32 Player_ActionHandler_10(Player* this, PlayState* play) {
func_8083BCD0(this, play, controlStickDirection);
if (controlStickDirection == 1 || controlStickDirection == 3) {
gSaveContext.sohStats.count[COUNT_SIDEHOPS]++;
gSaveContext.ship.stats.count[COUNT_SIDEHOPS]++;
}
if (controlStickDirection == 2) {
gSaveContext.sohStats.count[COUNT_BACKFLIPS]++;
gSaveContext.ship.stats.count[COUNT_BACKFLIPS]++;
}
return 1;
@@ -7254,8 +7254,8 @@ void func_8083E4C4(PlayState* play, Player* this, GetItemEntry* giEntry) {
s32 Player_ActionHandler_2(Player* this, PlayState* play) {
Actor* interactedActor;
if(gSaveContext.pendingIceTrapCount) {
gSaveContext.pendingIceTrapCount--;
if(gSaveContext.ship.pendingIceTrapCount) {
gSaveContext.ship.pendingIceTrapCount--;
GameInteractor_ExecuteOnItemReceiveHooks(ItemTable_RetrieveEntry(MOD_RANDOMIZER, RG_ICE_TRAP));
if (CVarGetInteger(CVAR_ENHANCEMENT("ExtraTraps.Enabled"), 0)) {
return 1;
@@ -7266,7 +7266,7 @@ s32 Player_ActionHandler_2(Player* this, PlayState* play) {
this->getItemId = GI_NONE;
this->getItemEntry = (GetItemEntry) GET_ITEM_NONE;
// Gameplay stats: Increment Ice Trap count
gSaveContext.sohStats.count[COUNT_ICE_TRAPS]++;
gSaveContext.ship.stats.count[COUNT_ICE_TRAPS]++;
return 1;
}
@@ -7295,7 +7295,7 @@ s32 Player_ActionHandler_2(Player* this, PlayState* play) {
Player_SetPendingFlag(this, play);
Message_StartTextbox(play, 0xF8, NULL);
Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET);
gSaveContext.pendingIceTrapCount++;
gSaveContext.ship.pendingIceTrapCount++;
return 1;
}
@@ -9513,7 +9513,7 @@ void func_80843AE8(PlayState* play, Player* this) {
} else if (play->gameOverCtx.state == GAMEOVER_DEATH_WAIT_GROUND) {
play->gameOverCtx.state = GAMEOVER_DEATH_DELAY_MENU;
if (!CVarGetInteger(CVAR_ENHANCEMENT("PersistentMasks"), 0)) {
gSaveContext.maskMemory = PLAYER_MASK_NONE;
gSaveContext.ship.maskMemory = PLAYER_MASK_NONE;
}
}
}
@@ -9818,7 +9818,7 @@ void Player_Action_Roll(Player* this, PlayState* play) {
Player_PlayVoiceSfx(this, NA_SE_VO_LI_CLIMB_END);
this->av2.bonked = 1;
gSaveContext.sohStats.count[COUNT_BONKS]++;
gSaveContext.ship.stats.count[COUNT_BONKS]++;
GameInteractor_ExecuteOnPlayerBonk();
return;
@@ -10806,9 +10806,9 @@ void Player_Init(Actor* thisx, PlayState* play2) {
//keep masks thru loading zones
if (CVarGetInteger(CVAR_ENHANCEMENT("PersistentMasks"), 0)) {
if (INV_CONTENT(ITEM_TRADE_CHILD) == ITEM_SOLD_OUT) {
gSaveContext.maskMemory = PLAYER_MASK_NONE;
gSaveContext.ship.maskMemory = PLAYER_MASK_NONE;
}
this->currentMask = gSaveContext.maskMemory;
this->currentMask = gSaveContext.ship.maskMemory;
}
Player_InitCommon(this, play, gPlayerSkelHeaders[((void)0, gSaveContext.linkAge)]);
// `giObjectSegment` is used for both "get item" objects and title cards. The maximum size for
@@ -14282,7 +14282,7 @@ s32 func_8084DFF4(PlayState* play, Player* this) {
// #region SOH [Randomizer] TODO Better Ice trap handling?
if (this->getItemEntry.itemId == RG_ICE_TRAP && this->getItemEntry.modIndex == MOD_RANDOMIZER) {
this->unk_862 = 0;
gSaveContext.pendingIceTrapCount++;
gSaveContext.ship.pendingIceTrapCount++;
Player_SetPendingFlag(this, play);
}
// #endregion
@@ -14460,7 +14460,7 @@ void Player_Action_8084E6D4(Player* this, PlayState* play) {
this->actor.world.pos.y + 100.0f, this->actor.world.pos.z, 0, 0, 0, 0, true);
func_8083C0E8(this, play);
} else if (IS_RANDO) {
gSaveContext.pendingIceTrapCount++;
gSaveContext.ship.pendingIceTrapCount++;
Player_SetPendingFlag(this, play);
func_8083C0E8(this, play);
} else {

View File

@@ -989,7 +989,7 @@ void DrawSeedHashSprites(FileChooseContext* this) {
this->configMode == CM_NAME_ENTRY_TO_RANDOMIZER_SETTINGS_MENU || this->configMode == CM_START_NAME_ENTRY ||
this->configMode == CM_START_RANDOMIZER_SETTINGS_MENU) ||
this->configMode == CM_RANDOMIZER_SETTINGS_MENU) &&
gSaveContext.questId == QUEST_RANDOMIZER)) {
gSaveContext.ship.quest.id == QUEST_RANDOMIZER)) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF);
u16 xStart = 64;
@@ -1298,7 +1298,7 @@ void FileChoose_UpdateQuestMenu(GameState* thisx) {
}
if (CHECK_BTN_ALL(input->press.button, BTN_A)) {
gSaveContext.questId = this->questType[this->buttonIndex];
gSaveContext.ship.quest.id = this->questType[this->buttonIndex];
if (this->questType[this->buttonIndex] == QUEST_BOSSRUSH) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_L, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
@@ -1393,17 +1393,17 @@ void FileChoose_UpdateBossRushMenu(GameState* thisx) {
if (ABS(this->stickRelX) > 30 || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DLEFT | BTN_DRIGHT))) {
if (this->stickRelX > 30 || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DRIGHT))) {
// If exceeding the amount of choices for the selected option, cycle back to the first.
if ((gSaveContext.bossRushOptions[this->bossRushIndex] + 1) == BossRush_GetSettingOptionsAmount(this->bossRushIndex)) {
gSaveContext.bossRushOptions[this->bossRushIndex] = 0;
if ((gSaveContext.ship.quest.data.bossRush.options[this->bossRushIndex] + 1) == BossRush_GetSettingOptionsAmount(this->bossRushIndex)) {
gSaveContext.ship.quest.data.bossRush.options[this->bossRushIndex] = 0;
} else {
gSaveContext.bossRushOptions[this->bossRushIndex]++;
gSaveContext.ship.quest.data.bossRush.options[this->bossRushIndex]++;
}
} else if (this->stickRelX < -30 || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DLEFT))) {
// If cycling back when already at the first choice for the selected option, cycle back to the last choice.
if ((gSaveContext.bossRushOptions[this->bossRushIndex] - 1) < 0) {
gSaveContext.bossRushOptions[this->bossRushIndex] = BossRush_GetSettingOptionsAmount(this->bossRushIndex) - 1;
if ((gSaveContext.ship.quest.data.bossRush.options[this->bossRushIndex] - 1) < 0) {
gSaveContext.ship.quest.data.bossRush.options[this->bossRushIndex] = BossRush_GetSettingOptionsAmount(this->bossRushIndex) - 1;
} else {
gSaveContext.bossRushOptions[this->bossRushIndex]--;
gSaveContext.ship.quest.data.bossRush.options[this->bossRushIndex]--;
}
}
@@ -1411,10 +1411,10 @@ void FileChoose_UpdateBossRushMenu(GameState* thisx) {
}
if (sLastBossRushOptionIndex != this->bossRushIndex ||
sLastBossRushOptionValue != gSaveContext.bossRushOptions[this->bossRushIndex]) {
GameInteractor_ExecuteOnUpdateFileBossRushOptionSelection(this->bossRushIndex, gSaveContext.bossRushOptions[this->bossRushIndex]);
sLastBossRushOptionValue != gSaveContext.ship.quest.data.bossRush.options[this->bossRushIndex]) {
GameInteractor_ExecuteOnUpdateFileBossRushOptionSelection(this->bossRushIndex, gSaveContext.ship.quest.data.bossRush.options[this->bossRushIndex]);
sLastBossRushOptionIndex = this->bossRushIndex;
sLastBossRushOptionValue = gSaveContext.bossRushOptions[this->bossRushIndex];
sLastBossRushOptionValue = gSaveContext.ship.quest.data.bossRush.options[this->bossRushIndex];
}
if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
@@ -2408,7 +2408,7 @@ void FileChoose_DrawWindowContents(GameState* thisx) {
65, (87 + textYOffset), 255, 255, 80, textAlpha, 0.8f, true);
// Selected choice for option.
uint16_t finalKerning = Interface_DrawTextLine(this->state.gfxCtx, BossRush_GetSettingChoiceName(i, gSaveContext.bossRushOptions[i], gSaveContext.language),
uint16_t finalKerning = Interface_DrawTextLine(this->state.gfxCtx, BossRush_GetSettingChoiceName(i, gSaveContext.ship.quest.data.bossRush.options[i], gSaveContext.language),
165, (87 + textYOffset), 255, 255, 255, textAlpha, 0.8f, true);
// Draw arrows around selected option.