mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-07-31 03:50:37 -07:00
Add toggles for disabling heart drops and random drops (#507)
* Adds toggles for disabling random drops and fixed heart drops * Changed the "No Fixed Heart Drops" toggle to the more useful "No Random Heart Drops" toggle * Adds an explanation that the no heart drops option is similar to Hero Mode * Moved difficulty options into their own sub-menu Moved time saver options into their own sub-menu Moved clutter reducing options into their own sub-menu * fixed the tag name of mweep speed * Moved Skip Text to Experimental
This commit is contained in:
parent
d63c0077ee
commit
818d5f90a8
6 changed files with 82 additions and 40 deletions
|
@ -883,43 +883,65 @@ namespace SohImGui {
|
||||||
{
|
{
|
||||||
if (ImGui::BeginMenu("Gameplay"))
|
if (ImGui::BeginMenu("Gameplay"))
|
||||||
{
|
{
|
||||||
EnhancementSliderInt("Text Speed: %dx", "##TEXTSPEED", "gTextSpeed", 1, 5, "");
|
if (ImGui::BeginMenu("Time Savers"))
|
||||||
EnhancementSliderInt("King Zora Speed: %dx", "##WEEPSPEED", "gMweepSpeed", 1, 5, "");
|
{
|
||||||
EnhancementSliderInt("Biggoron Forge Time: %d days", "##FORGETIME", "gForgeTime", 0, 3, "");
|
EnhancementSliderInt("Text Speed: %dx", "##TEXTSPEED", "gTextSpeed", 1, 5, "");
|
||||||
Tooltip("Allows you to change the number of days it takes for Biggoron to forge the Biggoron Sword");
|
EnhancementSliderInt("King Zora Speed: %dx", "##MWEEPSPEED", "gMweepSpeed", 1, 5, "");
|
||||||
EnhancementSliderInt("Vine/Ladder Climb speed +%d", "##CLIMBSPEED", "gClimbSpeed", 0, 12, "");
|
EnhancementSliderInt("Biggoron Forge Time: %d days", "##FORGETIME", "gForgeTime", 0, 3, "");
|
||||||
EnhancementSliderInt("Damage Multiplier %dx", "##DAMAGEMUL", "gDamageMul", 1, 4, "");
|
Tooltip("Allows you to change the number of days it takes for Biggoron to forge the Biggoron Sword");
|
||||||
Tooltip("Modifies all sources of damage not affected by other sliders");
|
EnhancementSliderInt("Vine/Ladder Climb speed +%d", "##CLIMBSPEED", "gClimbSpeed", 0, 12, "");
|
||||||
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");
|
EnhancementCheckbox("Faster Block Push", "gFasterBlockPush");
|
||||||
Tooltip("Holding down B skips text");
|
EnhancementCheckbox("No Forced Navi", "gNoForcedNavi");
|
||||||
EnhancementCheckbox("Mute Low HP Alarm", "gLowHpAlarm");
|
Tooltip("Prevent forced Navi conversations");
|
||||||
Tooltip("Disable the low HP beeping sound");
|
EnhancementCheckbox("No Skulltula Freeze", "gSkulltulaFreeze");
|
||||||
EnhancementCheckbox("Minimal UI", "gMinimalUI");
|
Tooltip("Stops the game from freezing the player when picking up Gold Skulltulas");
|
||||||
Tooltip("Hides most of the UI when not needed");
|
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");
|
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");
|
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");
|
EnhancementCheckbox("Assignable Tunics and Boots", "gAssignableTunicsAndBoots");
|
||||||
Tooltip("Allows equipping the tunic and boots to c-buttons");
|
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");
|
EnhancementCheckbox("Link's Cow in Both Time Periods", "gCowOfTime");
|
||||||
Tooltip("Allows the Lon Lon Ranch obstacle course reward to be shared across time periods");
|
Tooltip("Allows the Lon Lon Ranch obstacle course reward to be shared across time periods");
|
||||||
EnhancementCheckbox("Enable visible guard vision", "gGuardVision");
|
EnhancementCheckbox("Enable visible guard vision", "gGuardVision");
|
||||||
|
@ -1069,6 +1091,8 @@ namespace SohImGui {
|
||||||
EnhancementCheckbox("Kokiri Draw Distance", "gDisableKokiriDrawDistance");
|
EnhancementCheckbox("Kokiri Draw Distance", "gDisableKokiriDrawDistance");
|
||||||
Tooltip("Kokiris are mystical being that appear from a certain distance\nEnable this will remove their draw distance");
|
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();
|
ImGui::EndMenu();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1377,6 +1377,8 @@ EnItem00* Item_DropCollectible(GlobalContext* globalCtx, Vec3f* spawnPos, s16 pa
|
||||||
|
|
||||||
params &= 0x3FFF;
|
params &= 0x3FFF;
|
||||||
|
|
||||||
|
if ((params & 0x00FF) == ITEM00_HEART && CVar_GetS32("gNoHeartDrops", 0)) { return NULL; }
|
||||||
|
|
||||||
if (((params & 0x00FF) == ITEM00_FLEXIBLE) && !param4000) {
|
if (((params & 0x00FF) == ITEM00_FLEXIBLE) && !param4000) {
|
||||||
// TODO: Prevent the cast to EnItem00 here since this is a different actor (En_Elf)
|
// 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,
|
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;
|
params &= 0x3FFF;
|
||||||
|
|
||||||
|
if ((params & 0x00FF) == ITEM00_HEART && CVar_GetS32("gNoHeartDrops", 0)) { return NULL; }
|
||||||
|
|
||||||
if (((params & 0x00FF) == ITEM00_FLEXIBLE) && !param4000) {
|
if (((params & 0x00FF) == ITEM00_FLEXIBLE) && !param4000) {
|
||||||
// TODO: Prevent the cast to EnItem00 here since this is a different actor (En_Elf)
|
// 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,
|
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;
|
param8000 = params & 0x8000;
|
||||||
params &= 0x7FFF;
|
params &= 0x7FFF;
|
||||||
|
|
||||||
|
if (CVar_GetS32("gNoRandomDrops", 0)) { return; }
|
||||||
|
|
||||||
if (fromActor != NULL) {
|
if (fromActor != NULL) {
|
||||||
if (fromActor->dropFlag) {
|
if (fromActor->dropFlag) {
|
||||||
if (fromActor->dropFlag & 0x01) {
|
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,
|
EffectSsDeadSound_SpawnStationary(globalCtx, spawnPos, NA_SE_EV_BUTTERFRY_TO_FAIRY, true,
|
||||||
DEADSOUND_REPEAT_MODE_OFF, 40);
|
DEADSOUND_REPEAT_MODE_OFF, 40);
|
||||||
return;
|
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;
|
params = 0xB * 0x10;
|
||||||
dropTableIndex = 0x0;
|
dropTableIndex = 0x0;
|
||||||
dropId = ITEM00_HEART;
|
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;
|
params = 0xA * 0x10;
|
||||||
dropTableIndex = 0x0;
|
dropTableIndex = 0x0;
|
||||||
dropId = ITEM00_HEART;
|
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];
|
dropQuantity = sDropQuantities[params + dropTableIndex];
|
||||||
while (dropQuantity > 0) {
|
while (dropQuantity > 0) {
|
||||||
if (!param8000) {
|
if (!param8000) {
|
||||||
|
|
|
@ -1134,7 +1134,7 @@ void Message_DrawText(GlobalContext* globalCtx, Gfx** gfxP) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (msgCtx->textDelayTimer == 0) {
|
if (msgCtx->textDelayTimer == 0) {
|
||||||
msgCtx->textDrawPos = i + CVar_GetS32("gTextSpeed", 1);
|
msgCtx->textDrawPos = i + CVar_GetS32("gTextSpeed", 2);
|
||||||
msgCtx->textDelayTimer = msgCtx->textDelay;
|
msgCtx->textDelayTimer = msgCtx->textDelay;
|
||||||
} else {
|
} else {
|
||||||
msgCtx->textDelayTimer--;
|
msgCtx->textDelayTimer--;
|
||||||
|
|
|
@ -181,7 +181,9 @@ void BgHakaTubo_DropCollectible(BgHakaTubo* this, GlobalContext* globalCtx) {
|
||||||
func_80078884(NA_SE_SY_ERROR);
|
func_80078884(NA_SE_SY_ERROR);
|
||||||
} else {
|
} else {
|
||||||
// Random rewards
|
// Random rewards
|
||||||
if (rnd < 0.4f) {
|
if (CVar_GetS32("gNoRandomDrops", 0)) {
|
||||||
|
collectibleParams = -1;
|
||||||
|
} else if(rnd < 0.4f) {
|
||||||
collectibleParams = ITEM00_BOMBS_A;
|
collectibleParams = ITEM00_BOMBS_A;
|
||||||
} else if (rnd < 0.6f) {
|
} else if (rnd < 0.6f) {
|
||||||
collectibleParams = ITEM00_MAGIC_LARGE;
|
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) {
|
} else if (Flags_GetCollectible(globalCtx, this->dyna.actor.params) != 0) {
|
||||||
// If small key already collected, drop recovery heart instead
|
// 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);
|
func_80078884(NA_SE_SY_TRE_BOX_APPEAR);
|
||||||
} else {
|
} else {
|
||||||
// Drops a small key and sets a collect flag
|
// Drops a small key and sets a collect flag
|
||||||
|
|
|
@ -137,7 +137,12 @@ void EnKusa_DropCollectible(EnKusa* this, GlobalContext* globalCtx) {
|
||||||
Item_DropCollectibleRandom(globalCtx, NULL, &this->actor.world.pos, dropParams << 4);
|
Item_DropCollectibleRandom(globalCtx, NULL, &this->actor.world.pos, dropParams << 4);
|
||||||
break;
|
break;
|
||||||
case ENKUSA_TYPE_1:
|
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);
|
Item_DropCollectible(globalCtx, &this->actor.world.pos, ITEM00_SEEDS);
|
||||||
} else {
|
} else {
|
||||||
Item_DropCollectible(globalCtx, &this->actor.world.pos, ITEM00_HEART);
|
Item_DropCollectible(globalCtx, &this->actor.world.pos, ITEM00_HEART);
|
||||||
|
|
|
@ -141,7 +141,7 @@ void ObjComb_ChooseItemDrop(ObjComb* this, GlobalContext* globalCtx) {
|
||||||
} else if (Rand_ZeroOne() < 0.5f) {
|
} else if (Rand_ZeroOne() < 0.5f) {
|
||||||
params = -1;
|
params = -1;
|
||||||
}
|
}
|
||||||
if (params >= 0) {
|
if (params >= 0 && !CVar_GetS32("gNoRandomDrops", 0)) {
|
||||||
Item_DropCollectible(globalCtx, &this->actor.world.pos, params);
|
Item_DropCollectible(globalCtx, &this->actor.world.pos, params);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue