diff --git a/soh/soh/GameMenuBar.cpp b/soh/soh/GameMenuBar.cpp index 15aece0f2..f7cc97993 100644 --- a/soh/soh/GameMenuBar.cpp +++ b/soh/soh/GameMenuBar.cpp @@ -24,6 +24,7 @@ #include "UIWidgets.hpp" #include "include/z64audio.h" +#include "soh/SaveManager.h" #define EXPERIMENTAL() \ ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(255, 50, 50, 255)); \ @@ -157,6 +158,8 @@ namespace GameMenuBar { CVar_SetS32("gBombchuDrops", 0); // Always Win Goron Pot CVar_SetS32("gGoronPot", 0); + // Always Win Dampe Digging First Try + CVar_SetS32("gDampeWin", 0); // Change Red Potion Effect CVar_SetS32("gRedPotionEffect", 0); @@ -379,6 +382,8 @@ namespace GameMenuBar { CVar_SetS32("gFastBoomerang", 1); // Mask Select in Inventory CVar_SetS32("gMaskSelect", 1); + // Always Win Dampe Digging + CVar_SetS32("gDampeWin", 1); // Disable Navi Call Audio CVar_SetS32("gDisableNaviCallAudio", 1); @@ -775,6 +780,9 @@ namespace GameMenuBar { UIWidgets::Tooltip("Disables heart drops, but not heart placements, like from a Deku Scrub running off\nThis simulates Hero Mode from other games in the series"); UIWidgets::PaddedEnhancementCheckbox("Always Win Goron Pot", "gGoronPot", true, false); UIWidgets::Tooltip("Always get the heart piece/purple rupee from the spinning Goron pot"); + UIWidgets::PaddedEnhancementCheckbox("Always Win Dampe Digging Game", "gDampeWin", true, false, SaveManager::Instance->IsRandoFile(), + "This setting is always enabled in randomizer files", UIWidgets::CheckboxGraphics::Checkmark); + UIWidgets::Tooltip("Always win the heart piece/purple rupee on the first dig in Dampe's grave digging game, just like in rando\nIn a rando file, this is unconditionally enabled"); UIWidgets::Spacer(0); if (ImGui::BeginMenu("Potion Values")) diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index 52cba1f5e..d1078a4da 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -1214,6 +1214,10 @@ void SaveManager::DeleteZeldaFile(int fileNum) { fileMetaInfo[fileNum].randoSave = false; } +bool SaveManager::IsRandoFile() { + return gSaveContext.n64ddFlag != 0 ? true : false; +} + // Functionality required to convert old saves into versioned saves // DO NOT EDIT ANY OF THE FOLLOWING STRUCTS diff --git a/soh/soh/SaveManager.h b/soh/soh/SaveManager.h index 1acbcbfc9..4bef01e69 100644 --- a/soh/soh/SaveManager.h +++ b/soh/soh/SaveManager.h @@ -57,6 +57,7 @@ public: void CopyZeldaFile(int from, int to); void DeleteZeldaFile(int fileNum); + bool IsRandoFile(); // Use a name of "" to save to an array. You must be in a SaveArray callback. template diff --git a/soh/src/overlays/actors/ovl_En_Tk/z_en_tk.c b/soh/src/overlays/actors/ovl_En_Tk/z_en_tk.c index 11530b07e..920a8feea 100644 --- a/soh/src/overlays/actors/ovl_En_Tk/z_en_tk.c +++ b/soh/src/overlays/actors/ovl_En_Tk/z_en_tk.c @@ -408,7 +408,7 @@ s32 EnTk_ChooseReward(EnTk* this) { f32 luck; s32 reward; - if (gSaveContext.n64ddFlag && !Flags_GetCollectible(gGlobalCtx, 0x1F) && this->heartPieceSpawned == 0) { + if ((gSaveContext.n64ddFlag || CVar_GetS32("gDampeWin", 0)) && !Flags_GetCollectible(gGlobalCtx, 0x1F) && this->heartPieceSpawned == 0) { return 3; } @@ -604,7 +604,7 @@ void EnTk_Dig(EnTk* this, GlobalContext* globalCtx) { this->rewardTimer = 0; - if (this->validDigHere == 1 || gSaveContext.n64ddFlag) { + if (this->validDigHere == 1 || gSaveContext.n64ddFlag || CVar_GetS32("gDampeWin", 0)) { rewardOrigin.x = 0.0f; rewardOrigin.y = 0.0f; rewardOrigin.z = -40.0f; @@ -620,21 +620,21 @@ void EnTk_Dig(EnTk* this, GlobalContext* globalCtx) { // merging in dampe tour fix seems messy, so i'm just wrapping this whole thing // in an n64dd check for now - if(gSaveContext.n64ddFlag) { + if (gSaveContext.n64ddFlag || CVar_GetS32("gDampeWin", 0)) { if (this->currentReward == 3) { /* * Upgrade the purple rupee reward to the heart piece if this * is the first grand prize dig. */ - if (!(gSaveContext.itemGetInf[1] & 0x1000) && !gSaveContext.n64ddFlag) { + if (!(gSaveContext.itemGetInf[1] & 0x1000) && !(gSaveContext.n64ddFlag || CVar_GetS32("gDampeWin", 0))) { gSaveContext.itemGetInf[1] |= 0x1000; this->currentReward = 4; - } else if (gSaveContext.n64ddFlag && !Flags_GetCollectible(gGlobalCtx, 0x1F) && this->heartPieceSpawned == 0) { + } else if ((gSaveContext.n64ddFlag || CVar_GetS32("gDampeWin", 0)) && !Flags_GetCollectible(gGlobalCtx, 0x1F) && this->heartPieceSpawned == 0) { this->currentReward = 4; } } - if (gSaveContext.n64ddFlag && this->currentReward == 4) { + if ((gSaveContext.n64ddFlag || CVar_GetS32("gDampeWin", 0)) && this->currentReward == 4) { Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ITEM00, rewardPos.x, rewardPos.y, rewardPos.z, 0, 0, 0, 0x1F06); this->heartPieceSpawned = 1; @@ -670,7 +670,7 @@ void EnTk_Dig(EnTk* this, GlobalContext* globalCtx) { if (this->skelAnime.curFrame >= 32.0f && this->rewardTimer == 10) { /* Play a reward sound shortly after digging */ - if (!gSaveContext.n64ddFlag && this->validDigHere == 0) { + if (!(gSaveContext.n64ddFlag || CVar_GetS32("gDampeWin", 0)) && this->validDigHere == 0) { /* Bad dig spot */ Audio_PlayActorSound2(&this->actor, NA_SE_SY_ERROR); } else if (this->currentReward == 4) {