From 4d65a5ff736f65135f64cc1861934742cc5800ad Mon Sep 17 00:00:00 2001 From: earthcrafterman Date: Wed, 13 Jul 2022 00:24:05 -0400 Subject: [PATCH] Split damage multiplication into its own PR (#656) * Split damage multiplication into its own PR * Found a more elegant implementation of the powers char*[] --- libultraship/libultraship/ImGuiImpl.cpp | 48 ++++++++++++++++--- .../actors/ovl_player_actor/z_player.c | 6 +-- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index 08c72897f..69d05a74d 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -72,6 +72,18 @@ namespace SohImGui { "None" }; + const char* powers[9] = { + "Vanilla (1x)", + "Double (2x)", + "Quadruple (4x)", + "Octuple (8x)", + "Hexadecuple (16x)", + "Duotrigintuple (32x)", + "Quattuorsexagintuple (64x)", + "Octoviginticentuple (128x)", + "Hexaquinquagintiducentuple (256x)" + }; + std::map> hiddenwindowCategories; std::map> windowCategories; std::map customWindows; @@ -886,12 +898,36 @@ namespace SohImGui { 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 damage taken after falling into a void"); + ImGui::Text("Damage Multiplier"); + EnhancementCombobox("gDamageMul", powers, 9, 0); + Tooltip("Modifies all sources of damage not affected by other sliders\n\ +2x: Can survive all common attacks from the start of the game\n\ +4x: Dies in 1 hit to any substantial attack from the start of the game\n\ +8x: Can only survive trivial damage from the start of the game\n\ +16x: Can survive all common attacks with max health without double defense\n\ +32x: Can survive all common attacks with max health and double defense\n\ +64x: Can survive trivial damage with max health without double defense\n\ +128x: Can survive trivial damage with max health and double defense\n\ +256x: Cannot survive damage"); + ImGui::Text("Fall Damage Multiplier"); + EnhancementCombobox("gFallDamageMul", powers, 8, 0); + Tooltip("Modifies all fall damage\n\ +2x: Can survive all fall damage from the start of the game\n\ +4x: Can only survive short fall damage from the start of the game\n\ +8x: Cannot survive any fall damage from the start of the game\n\ +16x: Can survive all fall damage with max health without double defense\n\ +32x: Can survive all fall damage with max health and double defense\n\ +64x: Can survive short fall damage with double defense\n\ +128x: Cannot survive fall damage"); + ImGui::Text("Void Damage Multiplier"); + EnhancementCombobox("gVoidDamageMul", powers, 7, 0); + Tooltip("Modifies damage taken after falling into a void\n\ +2x: Can survive void damage from the start of the game\n\ +4x: Cannot survive void damage from the start of the game\n\ +8x: Can survive void damage twice with max health without double defense\n\ +16x: Can survive void damage with max health without double defense\n\ +32x: Can survive void damage with max health and double defense\n\ +64x: Cannot survive void damage"); EnhancementCheckbox("No Random Drops", "gNoRandomDrops"); Tooltip("Disables random drops, except from the Goron Pot, Dampe, and bosses"); diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 70cf3ebb7..1973a09a4 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -3603,7 +3603,7 @@ s32 func_80837B18_modified(GlobalContext* globalCtx, Player* this, s32 damage, u s32 modifiedDamage = damage; if (modified) { - modifiedDamage *= CVar_GetS32("gDamageMul", 1); + modifiedDamage *= (1 << CVar_GetS32("gDamageMul", 0)); } return Health_ChangeBy(globalCtx, modifiedDamage); @@ -3836,7 +3836,7 @@ s32 func_808382DC(Player* this, GlobalContext* globalCtx) { if (this->unk_A86 != 0) { if (!Player_InBlockingCsMode(globalCtx, this)) { - Player_InflictDamageModified(globalCtx, -16 * CVar_GetS32("gVoidDamageMul", 1), false); + Player_InflictDamageModified(globalCtx, -16 * (1 << CVar_GetS32("gVoidDamageMul", 0)), false); this->unk_A86 = 0; } } @@ -8407,7 +8407,7 @@ s32 func_80843E64(GlobalContext* globalCtx, Player* this) { impactInfo = &D_80854600[impactIndex]; - if (Player_InflictDamageModified(globalCtx, impactInfo->damage * CVar_GetS32("gFallDamageMul", 1), false)) { + if (Player_InflictDamageModified(globalCtx, impactInfo->damage * (1 << CVar_GetS32("gFallDamageMul", 0)), false)) { return -1; }