diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index 60a29f2f99a..9e81b931173 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -883,43 +883,65 @@ namespace SohImGui { { if (ImGui::BeginMenu("Gameplay")) { - EnhancementSliderInt("Text Speed: %dx", "##TEXTSPEED", "gTextSpeed", 1, 5, ""); - EnhancementSliderInt("King Zora Speed: %dx", "##WEEPSPEED", "gMweepSpeed", 1, 5, ""); - EnhancementSliderInt("Biggoron Forge Time: %d days", "##FORGETIME", "gForgeTime", 0, 3, ""); - Tooltip("Allows you to change the number of days it takes for Biggoron to forge the Biggoron Sword"); - EnhancementSliderInt("Vine/Ladder Climb speed +%d", "##CLIMBSPEED", "gClimbSpeed", 0, 12, ""); - EnhancementSliderInt("Damage Multiplier %dx", "##DAMAGEMUL", "gDamageMul", 1, 4, ""); - Tooltip("Modifies all sources of damage not affected by other sliders"); - EnhancementSliderInt("Fall Damage Multiplier %dx", "##FALLDAMAGEMUL", "gFallDamageMul", 1, 4, ""); - Tooltip("Modifies all fall damage"); - EnhancementSliderInt("Void Damage Multiplier %dx", "##VOIDDAMAGEMUL", "gVoidDamageMul", 1, 4, ""); - Tooltip("Modifies all void out damage"); - - EnhancementCheckbox("Skip Text", "gSkipText"); - Tooltip("Holding down B skips text"); - EnhancementCheckbox("Mute Low HP Alarm", "gLowHpAlarm"); - Tooltip("Disable the low HP beeping sound"); - EnhancementCheckbox("Minimal UI", "gMinimalUI"); - Tooltip("Hides most of the UI when not needed"); + if (ImGui::BeginMenu("Time Savers")) + { + EnhancementSliderInt("Text Speed: %dx", "##TEXTSPEED", "gTextSpeed", 1, 5, ""); + EnhancementSliderInt("King Zora Speed: %dx", "##MWEEPSPEED", "gMweepSpeed", 1, 5, ""); + EnhancementSliderInt("Biggoron Forge Time: %d days", "##FORGETIME", "gForgeTime", 0, 3, ""); + Tooltip("Allows you to change the number of days it takes for Biggoron to forge the Biggoron Sword"); + EnhancementSliderInt("Vine/Ladder Climb speed +%d", "##CLIMBSPEED", "gClimbSpeed", 0, 12, ""); + + EnhancementCheckbox("Faster Block Push", "gFasterBlockPush"); + EnhancementCheckbox("No Forced Navi", "gNoForcedNavi"); + Tooltip("Prevent forced Navi conversations"); + EnhancementCheckbox("No Skulltula Freeze", "gSkulltulaFreeze"); + Tooltip("Stops the game from freezing the player when picking up Gold Skulltulas"); + EnhancementCheckbox("MM Bunny Hood", "gMMBunnyHood"); + Tooltip("Wearing the Bunny Hood grants a speed increase like in Majora's Mask"); + EnhancementCheckbox("Fast Chests", "gFastChests"); + Tooltip("Kick open every chest"); + EnhancementCheckbox("Fast Drops", "gFastDrops"); + Tooltip("Skip first-time pickup messages for consumable items"); + EnhancementCheckbox("Better Owl", "gBetterOwl"); + Tooltip("The default response to Kaepora Gaebora is always that you understood what he said"); + + ImGui::EndMenu(); + } + + if (ImGui::BeginMenu("Difficulty Options")) + { + EnhancementSliderInt("Damage Multiplier %dx", "##DAMAGEMUL", "gDamageMul", 1, 4, ""); + Tooltip("Modifies all sources of damage not affected by other sliders"); + EnhancementSliderInt("Fall Damage Multiplier %dx", "##FALLDAMAGEMUL", "gFallDamageMul", 1, 4, ""); + Tooltip("Modifies all fall damage"); + EnhancementSliderInt("Void Damage Multiplier %dx", "##VOIDDAMAGEMUL", "gVoidDamageMul", 1, 4, ""); + Tooltip("Modifies all void out damage"); + + EnhancementCheckbox("No Random Drops", "gNoRandomDrops"); + Tooltip("Disables random drops, except from the Goron Pot, Dampe, and bosses"); + EnhancementCheckbox("No Heart Drops", "gNoHeartDrops"); + Tooltip("Disables heart drops, but not heart placements, like from a Deku Scrub running off. This simulates Hero Mode from other games in the series."); + + ImGui::EndMenu(); + } + + if (ImGui::BeginMenu("Reduced Clutter")) + { + EnhancementCheckbox("Mute Low HP Alarm", "gLowHpAlarm"); + Tooltip("Disable the low HP beeping sound"); + EnhancementCheckbox("Minimal UI", "gMinimalUI"); + Tooltip("Hides most of the UI when not needed"); + EnhancementCheckbox("Disable Navi Call Audio", "gDisableNaviCallAudio"); + Tooltip("Disables the voice audio when Navi calls you"); + + ImGui::EndMenu(); + } + + EnhancementCheckbox("Visual Stone of Agony", "gVisualAgony"); Tooltip("Displays an icon and plays a sound when Stone of Agony should be activated, for those without rumble"); - EnhancementCheckbox("Faster Block Push", "gFasterBlockPush"); EnhancementCheckbox("Assignable Tunics and Boots", "gAssignableTunicsAndBoots"); Tooltip("Allows equipping the tunic and boots to c-buttons"); - EnhancementCheckbox("MM Bunny Hood", "gMMBunnyHood"); - Tooltip("Wearing the Bunny Hood grants a speed increase like in Majora's Mask"); - EnhancementCheckbox("No Forced Navi", "gNoForcedNavi"); - Tooltip("Prevent forced Navi conversations"); - EnhancementCheckbox("No Skulltula Freeze", "gSkulltulaFreeze"); - Tooltip("Stops the game from freezing the player when picking up Gold Skulltulas"); - EnhancementCheckbox("Disable Navi Call Audio", "gDisableNaviCallAudio"); - Tooltip("Disables the voice audio when Navi calls you"); - EnhancementCheckbox("Fast Chests", "gFastChests"); - Tooltip("Kick open every chest"); - EnhancementCheckbox("Fast Drops", "gFastDrops"); - Tooltip("Skip first-time pickup messages for consumable items"); - EnhancementCheckbox("Better Owl", "gBetterOwl"); - Tooltip("The default response to Kaepora Gaebora is always that you understood what he said"); EnhancementCheckbox("Link's Cow in Both Time Periods", "gCowOfTime"); Tooltip("Allows the Lon Lon Ranch obstacle course reward to be shared across time periods"); EnhancementCheckbox("Enable visible guard vision", "gGuardVision"); @@ -1069,6 +1091,8 @@ namespace SohImGui { EnhancementCheckbox("Kokiri Draw Distance", "gDisableKokiriDrawDistance"); Tooltip("Kokiris are mystical being that appear from a certain distance\nEnable this will remove their draw distance"); } + EnhancementCheckbox("Skip Text", "gSkipText"); + Tooltip("Holding down B skips text.\nKnown to cause a cutscene softlock in Water Temple.\nSoftlock can be fixed by pressing D-Right in Debug mode."); ImGui::EndMenu(); } diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index a7de67900db..7aa2a282b80 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -1377,6 +1377,8 @@ EnItem00* Item_DropCollectible(GlobalContext* globalCtx, Vec3f* spawnPos, s16 pa params &= 0x3FFF; + if ((params & 0x00FF) == ITEM00_HEART && CVar_GetS32("gNoHeartDrops", 0)) { return NULL; } + if (((params & 0x00FF) == ITEM00_FLEXIBLE) && !param4000) { // TODO: Prevent the cast to EnItem00 here since this is a different actor (En_Elf) spawnedActor = (EnItem00*)Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELF, spawnPos->x, @@ -1420,6 +1422,8 @@ EnItem00* Item_DropCollectible2(GlobalContext* globalCtx, Vec3f* spawnPos, s16 p params &= 0x3FFF; + if ((params & 0x00FF) == ITEM00_HEART && CVar_GetS32("gNoHeartDrops", 0)) { return NULL; } + if (((params & 0x00FF) == ITEM00_FLEXIBLE) && !param4000) { // TODO: Prevent the cast to EnItem00 here since this is a different actor (En_Elf) spawnedActor = (EnItem00*)Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELF, spawnPos->x, @@ -1455,6 +1459,8 @@ void Item_DropCollectibleRandom(GlobalContext* globalCtx, Actor* fromActor, Vec3 param8000 = params & 0x8000; params &= 0x7FFF; + if (CVar_GetS32("gNoRandomDrops", 0)) { return; } + if (fromActor != NULL) { if (fromActor->dropFlag) { if (fromActor->dropFlag & 0x01) { @@ -1496,11 +1502,11 @@ void Item_DropCollectibleRandom(GlobalContext* globalCtx, Actor* fromActor, Vec3 EffectSsDeadSound_SpawnStationary(globalCtx, spawnPos, NA_SE_EV_BUTTERFRY_TO_FAIRY, true, DEADSOUND_REPEAT_MODE_OFF, 40); return; - } else if (gSaveContext.health <= 0x30) { // 3 hearts or less + } else if (gSaveContext.health <= 0x30 && !CVar_GetS32("gNoHeartDrops", 0)) { // 3 hearts or less params = 0xB * 0x10; dropTableIndex = 0x0; dropId = ITEM00_HEART; - } else if (gSaveContext.health <= 0x50) { // 5 hearts or less + } else if (gSaveContext.health <= 0x50 && !CVar_GetS32("gNoHeartDrops", 0)) { // 5 hearts or less params = 0xA * 0x10; dropTableIndex = 0x0; dropId = ITEM00_HEART; @@ -1533,7 +1539,7 @@ void Item_DropCollectibleRandom(GlobalContext* globalCtx, Actor* fromActor, Vec3 } } - if (dropId != 0xFF) { + if (dropId != 0xFF && (!CVar_GetS32("gNoHeartDrops", 0) || dropId != ITEM00_HEART)) { dropQuantity = sDropQuantities[params + dropTableIndex]; while (dropQuantity > 0) { if (!param8000) { diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c index a3492f967a9..952fda10642 100644 --- a/soh/src/code/z_message_PAL.c +++ b/soh/src/code/z_message_PAL.c @@ -1134,7 +1134,7 @@ void Message_DrawText(GlobalContext* globalCtx, Gfx** gfxP) { } } if (msgCtx->textDelayTimer == 0) { - msgCtx->textDrawPos = i + CVar_GetS32("gTextSpeed", 1); + msgCtx->textDrawPos = i + CVar_GetS32("gTextSpeed", 2); msgCtx->textDelayTimer = msgCtx->textDelay; } else { msgCtx->textDelayTimer--; diff --git a/soh/src/overlays/actors/ovl_Bg_Haka_Tubo/z_bg_haka_tubo.c b/soh/src/overlays/actors/ovl_Bg_Haka_Tubo/z_bg_haka_tubo.c index fb119d12ea5..c6ce8c7c503 100644 --- a/soh/src/overlays/actors/ovl_Bg_Haka_Tubo/z_bg_haka_tubo.c +++ b/soh/src/overlays/actors/ovl_Bg_Haka_Tubo/z_bg_haka_tubo.c @@ -181,7 +181,9 @@ void BgHakaTubo_DropCollectible(BgHakaTubo* this, GlobalContext* globalCtx) { func_80078884(NA_SE_SY_ERROR); } else { // Random rewards - if (rnd < 0.4f) { + if (CVar_GetS32("gNoRandomDrops", 0)) { + collectibleParams = -1; + } else if(rnd < 0.4f) { collectibleParams = ITEM00_BOMBS_A; } else if (rnd < 0.6f) { collectibleParams = ITEM00_MAGIC_LARGE; @@ -194,7 +196,12 @@ void BgHakaTubo_DropCollectible(BgHakaTubo* this, GlobalContext* globalCtx) { } } else if (Flags_GetCollectible(globalCtx, this->dyna.actor.params) != 0) { // If small key already collected, drop recovery heart instead - collectibleParams = ITEM00_HEART; + if (CVar_GetS32("gNoHeartDrops", 0)) { + collectibleParams = -1; + } + else { + collectibleParams = ITEM00_HEART; + } func_80078884(NA_SE_SY_TRE_BOX_APPEAR); } else { // Drops a small key and sets a collect flag diff --git a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c index 620463b0443..7414a1cf250 100644 --- a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c +++ b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c @@ -137,7 +137,12 @@ void EnKusa_DropCollectible(EnKusa* this, GlobalContext* globalCtx) { Item_DropCollectibleRandom(globalCtx, NULL, &this->actor.world.pos, dropParams << 4); break; case ENKUSA_TYPE_1: - if (Rand_ZeroOne() < 0.5f) { + if (CVar_GetS32("gNoRandomDrops", 0)) { + } + else if (CVar_GetS32("gNoHeartDrops", 0)) { + Item_DropCollectible(globalCtx, &this->actor.world.pos, ITEM00_SEEDS); + } + else if (Rand_ZeroOne() < 0.5f) { Item_DropCollectible(globalCtx, &this->actor.world.pos, ITEM00_SEEDS); } else { Item_DropCollectible(globalCtx, &this->actor.world.pos, ITEM00_HEART); diff --git a/soh/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c b/soh/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c index 039fa6ef566..b0fbacaaa24 100644 --- a/soh/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c +++ b/soh/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c @@ -141,7 +141,7 @@ void ObjComb_ChooseItemDrop(ObjComb* this, GlobalContext* globalCtx) { } else if (Rand_ZeroOne() < 0.5f) { params = -1; } - if (params >= 0) { + if (params >= 0 && !CVar_GetS32("gNoRandomDrops", 0)) { Item_DropCollectible(globalCtx, &this->actor.world.pos, params); } }