diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index 55cb106ac..7fecad83a 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -110,8 +110,8 @@ static bool ActorSpawnHandler(std::shared_ptr Console, const std: static bool KillPlayerHandler(std::shared_ptr Console, const std::vector&, std::string* output) { - GameInteractionEffectBase* effect = new GameInteractionEffect::SetPlayerHealth(); - dynamic_cast(effect)->parameters[0] = 0; + GameInteractionEffect::SetPlayerHealth effect; + effect.parameters[0] = 0; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { INFO_MESSAGE("[SOH] You've met with a terrible fate, haven't you?"); @@ -142,8 +142,8 @@ static bool SetPlayerHealthHandler(std::shared_ptr Console, const return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::SetPlayerHealth(); - dynamic_cast(effect)->parameters[0] = health; + GameInteractionEffect::SetPlayerHealth effect; + effect.parameters[0] = health; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { INFO_MESSAGE("[SOH] Player health updated to %d", health); @@ -159,7 +159,6 @@ static bool LoadSceneHandler(std::shared_ptr Console, const std:: gSaveContext.respawnFlag = 0; gSaveContext.seqId = 0xFF; gSaveContext.gameMode = GAMEMODE_NORMAL; - return 0; } @@ -257,9 +256,9 @@ static bool AddAmmoHandler(std::shared_ptr Console, const std::ve return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::AddOrTakeAmmo(); - dynamic_cast(effect)->parameters[0] = amount; - dynamic_cast(effect)->parameters[1] = it->second; + GameInteractionEffect::AddOrTakeAmmo effect; + effect.parameters[0] = amount; + effect.parameters[1] = it->second; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { @@ -298,9 +297,9 @@ static bool TakeAmmoHandler(std::shared_ptr Console, const std::v return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::AddOrTakeAmmo(); - dynamic_cast(effect)->parameters[0] = -amount; - dynamic_cast(effect)->parameters[1] = it->second; + GameInteractionEffect::AddOrTakeAmmo effect; + effect.parameters[0] = -amount; + effect.parameters[1] = it->second; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { @@ -354,7 +353,6 @@ static bool BottleHandler(std::shared_ptr Console, const std::vec return 1; } - // I dont think you can do OOB with just this gSaveContext.inventory.items[0x11 + slot] = it->second; return 0; @@ -612,7 +610,7 @@ static bool InvisibleHandler(std::shared_ptr Console, const std:: return 1; } - RemovableGameInteractionEffect* effect = new GameInteractionEffect::InvisibleLink(); + GameInteractionEffect::InvisibleLink effect; GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { @@ -639,8 +637,8 @@ static bool GiantLinkHandler(std::shared_ptr Console, const std:: return 1; } - RemovableGameInteractionEffect* effect = new GameInteractionEffect::ModifyLinkSize(); - dynamic_cast(effect)->parameters[0] = GI_LINK_SIZE_GIANT; + GameInteractionEffect::ModifyLinkSize effect; + effect.parameters[0] = GI_LINK_SIZE_GIANT; GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { @@ -667,8 +665,8 @@ static bool MinishLinkHandler(std::shared_ptr Console, const std: return 1; } - RemovableGameInteractionEffect* effect = new GameInteractionEffect::ModifyLinkSize(); - dynamic_cast(effect)->parameters[0] = GI_LINK_SIZE_MINISH; + GameInteractionEffect::ModifyLinkSize effect; + effect.parameters[0] = GI_LINK_SIZE_MINISH; GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { @@ -700,8 +698,8 @@ static bool AddHeartContainerHandler(std::shared_ptr Console, con return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyHeartContainers(); - dynamic_cast(effect)->parameters[0] = hearts; + GameInteractionEffect::ModifyHeartContainers effect; + effect.parameters[0] = hearts; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { INFO_MESSAGE("[SOH] Added %d heart containers", hearts); @@ -732,8 +730,8 @@ static bool RemoveHeartContainerHandler(std::shared_ptr Console, return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyHeartContainers(); - dynamic_cast(effect)->parameters[0] = -hearts; + GameInteractionEffect::ModifyHeartContainers effect; + effect.parameters[0] = -hearts; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { INFO_MESSAGE("[SOH] Removed %d heart containers", hearts); @@ -751,10 +749,10 @@ static bool GravityHandler(std::shared_ptr Console, const std::ve return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyGravity(); + GameInteractionEffect::ModifyGravity effect; try { - dynamic_cast(effect)->parameters[0] = + effect.parameters[0] = Ship::Math::clamp(std::stoi(args[1], nullptr, 10), GI_GRAVITY_LEVEL_LIGHT, GI_GRAVITY_LEVEL_HEAVY); } catch (std::invalid_argument const& ex) { ERROR_MESSAGE("[SOH] Gravity value must be a number."); @@ -786,7 +784,7 @@ static bool NoUIHandler(std::shared_ptr Console, const std::vecto return 1; } - RemovableGameInteractionEffect* effect = new GameInteractionEffect::NoUI(); + GameInteractionEffect::NoUI effect; GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); @@ -801,7 +799,7 @@ static bool NoUIHandler(std::shared_ptr Console, const std::vecto static bool FreezeHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { - GameInteractionEffectBase* effect = new GameInteractionEffect::FreezePlayer(); + GameInteractionEffect::FreezePlayer effect; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { @@ -819,10 +817,10 @@ static bool DefenseModifierHandler(std::shared_ptr Console, const ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyDefenseModifier(); + GameInteractionEffect::ModifyDefenseModifier effect; try { - dynamic_cast(effect)->parameters[0] = std::stoi(args[1], nullptr, 10); + effect.parameters[0] = std::stoi(args[1], nullptr, 10); } catch (std::invalid_argument const& ex) { ERROR_MESSAGE("[SOH] Defense modifier value must be a number."); return 1; @@ -830,8 +828,7 @@ static bool DefenseModifierHandler(std::shared_ptr Console, const GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { - INFO_MESSAGE("[SOH] Defense modifier set to %d", - dynamic_cast(effect)->parameters[0]); + INFO_MESSAGE("[SOH] Defense modifier set to %d", effect.parameters[0]); return 0; } else { INFO_MESSAGE("[SOH] Command failed: Could not set defense modifier."); @@ -845,7 +842,7 @@ static bool DamageHandler(std::shared_ptr Console, const std::vec ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyHealth(); + GameInteractionEffect::ModifyHealth effect; try { int value = std::stoi(args[1], nullptr, 10); @@ -854,7 +851,7 @@ static bool DamageHandler(std::shared_ptr Console, const std::vec return 1; } - dynamic_cast(effect)->parameters[0] = -value; + effect.parameters[0] = -value; } catch (std::invalid_argument const& ex) { ERROR_MESSAGE("[SOH] Damage value must be a number."); return 1; @@ -876,7 +873,7 @@ static bool HealHandler(std::shared_ptr Console, const std::vecto ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyHealth(); + GameInteractionEffect::ModifyHealth effect; try { int value = std::stoi(args[1], nullptr, 10); @@ -885,7 +882,7 @@ static bool HealHandler(std::shared_ptr Console, const std::vecto return 1; } - dynamic_cast(effect)->parameters[0] = value; + effect.parameters[0] = value; } catch (std::invalid_argument const& ex) { ERROR_MESSAGE("[SOH] Damage value must be a number."); return 1; @@ -903,7 +900,7 @@ static bool HealHandler(std::shared_ptr Console, const std::vecto static bool FillMagicHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { - GameInteractionEffectBase* effect = new GameInteractionEffect::FillMagic(); + GameInteractionEffect::FillMagic effect; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { @@ -917,7 +914,7 @@ static bool FillMagicHandler(std::shared_ptr Console, const std:: static bool EmptyMagicHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { - GameInteractionEffectBase* effect = new GameInteractionEffect::EmptyMagic(); + GameInteractionEffect::EmptyMagic effect; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { @@ -944,7 +941,7 @@ static bool NoZHandler(std::shared_ptr Console, const std::vector return 1; } - RemovableGameInteractionEffect* effect = new GameInteractionEffect::DisableZTargeting(); + GameInteractionEffect::DisableZTargeting effect; GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); @@ -972,7 +969,7 @@ static bool OneHitKOHandler(std::shared_ptr Console, const std::v return 1; } - RemovableGameInteractionEffect* effect = new GameInteractionEffect::OneHitKO(); + GameInteractionEffect::OneHitKO effect; GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); @@ -1000,7 +997,7 @@ static bool PacifistHandler(std::shared_ptr Console, const std::v return 1; } - RemovableGameInteractionEffect* effect = new GameInteractionEffect::PacifistMode(); + GameInteractionEffect::PacifistMode effect; GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); @@ -1028,8 +1025,8 @@ static bool PaperLinkHandler(std::shared_ptr Console, const std:: return 1; } - RemovableGameInteractionEffect* effect = new GameInteractionEffect::ModifyLinkSize(); - dynamic_cast(effect)->parameters[0] = GI_LINK_SIZE_PAPER; + GameInteractionEffect::ModifyLinkSize effect; + effect.parameters[0] = GI_LINK_SIZE_PAPER; GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); @@ -1057,7 +1054,7 @@ static bool RainstormHandler(std::shared_ptr Console, const std:: return 1; } - RemovableGameInteractionEffect* effect = new GameInteractionEffect::WeatherRainstorm(); + GameInteractionEffect::WeatherRainstorm effect; GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); @@ -1085,7 +1082,7 @@ static bool ReverseControlsHandler(std::shared_ptr Console, const return 1; } - RemovableGameInteractionEffect* effect = new GameInteractionEffect::ReverseControls(); + GameInteractionEffect::ReverseControls effect; GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); @@ -1105,10 +1102,10 @@ static bool UpdateRupeesHandler(std::shared_ptr Console, const st ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyRupees(); + GameInteractionEffect::ModifyRupees effect; try { - dynamic_cast(effect)->parameters[0] = std::stoi(args[1], nullptr, 10); + effect.parameters[0] = std::stoi(args[1], nullptr, 10); } catch (std::invalid_argument const& ex) { ERROR_MESSAGE("[SOH] Rupee value must be a number."); return 1; @@ -1130,10 +1127,10 @@ static bool SpeedModifierHandler(std::shared_ptr Console, const s ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyMovementSpeedMultiplier(); + GameInteractionEffect::ModifyMovementSpeedMultiplier effect; try { - dynamic_cast(effect)->parameters[0] = std::stoi(args[1], nullptr, 10); + effect.parameters[0] = std::stoi(args[1], nullptr, 10); } catch (std::invalid_argument const& ex) { ERROR_MESSAGE("[SOH] Speed modifier value must be a number."); return 1; @@ -1168,8 +1165,8 @@ static bool BootsHandler(std::shared_ptr Console, const std::vect return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::ForceEquipBoots(); - dynamic_cast(effect)->parameters[0] = it->second; + GameInteractionEffect::ForceEquipBoots effect; + effect.parameters[0] = it->second; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { @@ -1200,8 +1197,8 @@ static bool GiveShieldHandler(std::shared_ptr Console, const std: return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::GiveOrTakeShield(); - dynamic_cast(effect)->parameters[0] = it->second; + GameInteractionEffect::GiveOrTakeShield effect; + effect.parameters[0] = it->second; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { @@ -1226,8 +1223,8 @@ static bool TakeShieldHandler(std::shared_ptr Console, const std: return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::GiveOrTakeShield(); - dynamic_cast(effect)->parameters[0] = it->second * -1; + GameInteractionEffect::GiveOrTakeShield effect; + effect.parameters[0] = it->second * -1; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { @@ -1245,7 +1242,7 @@ static bool KnockbackHandler(std::shared_ptr Console, const std:: ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; } - GameInteractionEffectBase* effect = new GameInteractionEffect::KnockbackPlayer(); + GameInteractionEffect::KnockbackPlayer effect; try { int value = std::stoi(args[1], nullptr, 10); @@ -1254,7 +1251,7 @@ static bool KnockbackHandler(std::shared_ptr Console, const std:: return 1; } - dynamic_cast(effect)->parameters[0] = value; + effect.parameters[0] = value; } catch (std::invalid_argument const& ex) { ERROR_MESSAGE("[SOH] Knockback value must be a number."); return 1; @@ -1272,7 +1269,7 @@ static bool KnockbackHandler(std::shared_ptr Console, const std:: static bool ElectrocuteHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { - GameInteractionEffectBase* effect = new GameInteractionEffect::ElectrocutePlayer(); + GameInteractionEffect::ElectrocutePlayer effect; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { @@ -1286,7 +1283,7 @@ static bool ElectrocuteHandler(std::shared_ptr Console, const std static bool BurnHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { - GameInteractionEffectBase* effect = new GameInteractionEffect::BurnPlayer(); + GameInteractionEffect::BurnPlayer effect; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { diff --git a/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp b/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp index 93bbf9f8e..5f7547cc4 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp @@ -38,11 +38,9 @@ GameInteractionEffectQueryResult RemovableGameInteractionEffect::CanBeRemoved() GameInteractionEffectQueryResult RemovableGameInteractionEffect::Remove() { GameInteractionEffectQueryResult result = CanBeRemoved(); - if (result != GameInteractionEffectQueryResult::Possible) { - return result; + if (result == GameInteractionEffectQueryResult::Possible) { + _Remove(); } - - _Remove(); return result; } diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor.cpp index f3ee57530..315500424 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.cpp @@ -21,16 +21,16 @@ extern PlayState* gPlayState; // MARK: - Effects -GameInteractionEffectQueryResult GameInteractor::CanApplyEffect(GameInteractionEffectBase* effect) { - return effect->CanBeApplied(); +GameInteractionEffectQueryResult GameInteractor::CanApplyEffect(GameInteractionEffectBase& effect) { + return effect.CanBeApplied(); } -GameInteractionEffectQueryResult GameInteractor::ApplyEffect(GameInteractionEffectBase* effect) { - return effect->Apply(); +GameInteractionEffectQueryResult GameInteractor::ApplyEffect(GameInteractionEffectBase& effect) { + return effect.Apply(); } -GameInteractionEffectQueryResult GameInteractor::RemoveEffect(RemovableGameInteractionEffect* effect) { - return effect->Remove(); +GameInteractionEffectQueryResult GameInteractor::RemoveEffect(RemovableGameInteractionEffect& effect) { + return effect.Remove(); } // MARK: - Helpers diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index deccbdd56..bcd84d552 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -220,9 +220,9 @@ class GameInteractor { }; // Effects - static GameInteractionEffectQueryResult CanApplyEffect(GameInteractionEffectBase* effect); - static GameInteractionEffectQueryResult ApplyEffect(GameInteractionEffectBase* effect); - static GameInteractionEffectQueryResult RemoveEffect(RemovableGameInteractionEffect* effect); + static GameInteractionEffectQueryResult CanApplyEffect(GameInteractionEffectBase& effect); + static GameInteractionEffectQueryResult ApplyEffect(GameInteractionEffectBase& effect); + static GameInteractionEffectQueryResult RemoveEffect(RemovableGameInteractionEffect& effect); // Game Hooks HOOK_ID nextHookId = 1; diff --git a/soh/soh/Network/CrowdControl/CrowdControl.cpp b/soh/soh/Network/CrowdControl/CrowdControl.cpp index f91d8d52f..a308685a1 100644 --- a/soh/soh/Network/CrowdControl/CrowdControl.cpp +++ b/soh/soh/Network/CrowdControl/CrowdControl.cpp @@ -83,7 +83,8 @@ void CrowdControl::ProcessActiveEffects() { if (effect->timeRemaining <= 0) { it = activeEffects.erase(std::remove(activeEffects.begin(), activeEffects.end(), effect), activeEffects.end()); - GameInteractor::RemoveEffect(dynamic_cast(effect->giEffect)); + GameInteractor::RemoveEffect( + *dynamic_cast(effect->giEffect.get())); delete effect; } else { // If we have a success after previously being paused, tell CC to resume timer. @@ -140,7 +141,7 @@ CrowdControl::EffectResult CrowdControl::ExecuteEffect(Effect* effect) { giResult = GameInteractor::RawAction::SpawnActor(effect->spawnParams[0], effect->spawnParams[1], effect->viewerName); } else { - giResult = GameInteractor::ApplyEffect(effect->giEffect); + giResult = GameInteractor::ApplyEffect(*effect->giEffect.get()); } return TranslateGiEnum(giResult); @@ -149,7 +150,7 @@ CrowdControl::EffectResult CrowdControl::ExecuteEffect(Effect* effect) { /// Checks if effect can be applied -- should not be used to check for spawn enemy effects. CrowdControl::EffectResult CrowdControl::CanApplyEffect(Effect* effect) { assert(effect->category != kEffectCatSpawnEnemy || effect->category != kEffectCatSpawnActor); - GameInteractionEffectQueryResult giResult = GameInteractor::CanApplyEffect(effect->giEffect); + GameInteractionEffectQueryResult giResult = GameInteractor::CanApplyEffect(*effect->giEffect.get()); return TranslateGiEnum(giResult); } @@ -279,346 +280,382 @@ CrowdControl::Effect* CrowdControl::ParseMessage(nlohmann::json dataReceived) { case kEffectTakeHalfDamage: effect->category = kEffectCatDamageTaken; effect->timeRemaining = 30000; - effect->giEffect = new GameInteractionEffect::ModifyDefenseModifier(); - dynamic_cast(effect->giEffect)->parameters[0] = 2; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = 2; break; case kEffectTakeDoubleDamage: effect->category = kEffectCatDamageTaken; effect->timeRemaining = 30000; - effect->giEffect = new GameInteractionEffect::ModifyDefenseModifier(); - dynamic_cast(effect->giEffect)->parameters[0] = -2; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = -2; break; case kEffectOneHitKo: effect->category = kEffectCatDamageTaken; effect->timeRemaining = 30000; - effect->giEffect = new GameInteractionEffect::OneHitKO(); + effect->giEffect = std::make_unique(); break; case kEffectInvincibility: effect->category = kEffectCatDamageTaken; effect->timeRemaining = 15000; - effect->giEffect = new GameInteractionEffect::PlayerInvincibility(); + effect->giEffect = std::make_unique(); break; break; case kEffectIncreaseSpeed: effect->category = kEffectCatSpeed; effect->timeRemaining = 30000; - effect->giEffect = new GameInteractionEffect::ModifyMovementSpeedMultiplier(); - dynamic_cast(effect->giEffect)->parameters[0] = 2; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = 2; break; case kEffectDecreaseSpeed: effect->category = kEffectCatSpeed; effect->timeRemaining = 30000; - effect->giEffect = new GameInteractionEffect::ModifyMovementSpeedMultiplier(); - dynamic_cast(effect->giEffect)->parameters[0] = -2; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = -2; break; case kEffectLowGravity: effect->category = kEffectCatGravity; effect->timeRemaining = 30000; - effect->giEffect = new GameInteractionEffect::ModifyGravity(); - dynamic_cast(effect->giEffect)->parameters[0] = GI_GRAVITY_LEVEL_LIGHT; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + GI_GRAVITY_LEVEL_LIGHT; break; case kEffectHighGravity: effect->category = kEffectCatGravity; effect->timeRemaining = 30000; - effect->giEffect = new GameInteractionEffect::ModifyGravity(); - dynamic_cast(effect->giEffect)->parameters[0] = GI_GRAVITY_LEVEL_HEAVY; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + GI_GRAVITY_LEVEL_HEAVY; break; case kEffectForceIronBoots: effect->category = kEffectCatBoots; effect->timeRemaining = 30000; - effect->giEffect = new GameInteractionEffect::ForceEquipBoots(); - dynamic_cast(effect->giEffect)->parameters[0] = EQUIP_VALUE_BOOTS_IRON; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + EQUIP_VALUE_BOOTS_IRON; break; case kEffectForceHoverBoots: effect->category = kEffectCatBoots; effect->timeRemaining = 30000; - effect->giEffect = new GameInteractionEffect::ForceEquipBoots(); - dynamic_cast(effect->giEffect)->parameters[0] = + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = EQUIP_VALUE_BOOTS_HOVER; break; case kEffectSlipperyFloor: effect->category = kEffectCatSlipperyFloor; effect->timeRemaining = 30000; - effect->giEffect = new GameInteractionEffect::SlipperyFloor(); + effect->giEffect = std::make_unique(); break; case kEffectNoLedgeGrabs: effect->category = kEffectCatNoLedgeGrabs; effect->timeRemaining = 30000; - effect->giEffect = new GameInteractionEffect::DisableLedgeGrabs(); + effect->giEffect = std::make_unique(); break; case kEffectRandomWind: effect->category = kEffectCatRandomWind; effect->timeRemaining = 30000; - effect->giEffect = new GameInteractionEffect::RandomWind(); + effect->giEffect = std::make_unique(); break; case kEffectRandomBonks: effect->category = kEffectCatRandomBonks; effect->timeRemaining = 60000; - effect->giEffect = new GameInteractionEffect::RandomBonks(); + effect->giEffect = std::make_unique(); break; // Hurt or Heal Link case kEffectEmptyHeart: - effect->giEffect = new GameInteractionEffect::ModifyHealth(); - dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter * -1; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + receivedParameter * -1; break; case kEffectFillHeart: - effect->giEffect = new GameInteractionEffect::ModifyHealth(); - dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + receivedParameter; break; case kEffectKnockbackLinkWeak: - effect->giEffect = new GameInteractionEffect::KnockbackPlayer(); - dynamic_cast(effect->giEffect)->parameters[0] = 1; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = 1; break; case kEffectKnockbackLinkStrong: - effect->giEffect = new GameInteractionEffect::KnockbackPlayer(); - dynamic_cast(effect->giEffect)->parameters[0] = 3; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = 3; break; case kEffectKnockbackLinkMega: - effect->giEffect = new GameInteractionEffect::KnockbackPlayer(); - dynamic_cast(effect->giEffect)->parameters[0] = 6; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = 6; break; case kEffectBurnLink: - effect->giEffect = new GameInteractionEffect::BurnPlayer(); + effect->giEffect = std::make_unique(); break; case kEffectFreezeLink: - effect->giEffect = new GameInteractionEffect::FreezePlayer(); + effect->giEffect = std::make_unique(); break; case kEffectElectrocuteLink: - effect->giEffect = new GameInteractionEffect::ElectrocutePlayer(); + effect->giEffect = std::make_unique(); break; case kEffectKillLink: - effect->giEffect = new GameInteractionEffect::SetPlayerHealth(); - dynamic_cast(effect->giEffect)->parameters[0] = 0; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = 0; break; // Give Items and Consumables case kEffectAddHeartContainer: - effect->giEffect = new GameInteractionEffect::ModifyHeartContainers(); - dynamic_cast(effect->giEffect)->parameters[0] = 1; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = 1; break; case kEffectFillMagic: - effect->giEffect = new GameInteractionEffect::FillMagic(); + effect->giEffect = std::make_unique(); break; case kEffectAddRupees: - effect->giEffect = new GameInteractionEffect::ModifyRupees(); - dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + receivedParameter; break; case kEffectGiveDekuShield: - effect->giEffect = new GameInteractionEffect::GiveOrTakeShield(); - dynamic_cast(effect->giEffect)->parameters[0] = ITEM_SHIELD_DEKU; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = ITEM_SHIELD_DEKU; break; case kEffectGiveHylianShield: - effect->giEffect = new GameInteractionEffect::GiveOrTakeShield(); - dynamic_cast(effect->giEffect)->parameters[0] = ITEM_SHIELD_HYLIAN; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + ITEM_SHIELD_HYLIAN; break; case kEffectRefillSticks: - effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter; - dynamic_cast(effect->giEffect)->parameters[1] = ITEM_STICK; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + receivedParameter; + dynamic_cast(effect->giEffect.get())->parameters[1] = ITEM_STICK; break; case kEffectRefillNuts: - effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter; - dynamic_cast(effect->giEffect)->parameters[1] = ITEM_NUT; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + receivedParameter; + dynamic_cast(effect->giEffect.get())->parameters[1] = ITEM_NUT; break; case kEffectRefillBombs: - effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter; - dynamic_cast(effect->giEffect)->parameters[1] = ITEM_BOMB; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + receivedParameter; + dynamic_cast(effect->giEffect.get())->parameters[1] = ITEM_BOMB; break; case kEffectRefillSeeds: - effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter; - dynamic_cast(effect->giEffect)->parameters[1] = ITEM_SLINGSHOT; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + receivedParameter; + dynamic_cast(effect->giEffect.get())->parameters[1] = ITEM_SLINGSHOT; break; case kEffectRefillArrows: - effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter; - dynamic_cast(effect->giEffect)->parameters[1] = ITEM_BOW; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + receivedParameter; + dynamic_cast(effect->giEffect.get())->parameters[1] = ITEM_BOW; break; case kEffectRefillBombchus: - effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter; - dynamic_cast(effect->giEffect)->parameters[1] = ITEM_BOMBCHU; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + receivedParameter; + dynamic_cast(effect->giEffect.get())->parameters[1] = ITEM_BOMBCHU; break; // Take Items and Consumables case kEffectRemoveHeartContainer: - effect->giEffect = new GameInteractionEffect::ModifyHeartContainers(); - dynamic_cast(effect->giEffect)->parameters[0] = -1; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = -1; break; case kEffectEmptyMagic: - effect->giEffect = new GameInteractionEffect::EmptyMagic(); + effect->giEffect = std::make_unique(); break; case kEffectRemoveRupees: - effect->giEffect = new GameInteractionEffect::ModifyRupees(); - dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter * -1; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + receivedParameter * -1; break; case kEffectTakeDekuShield: - effect->giEffect = new GameInteractionEffect::GiveOrTakeShield(); - dynamic_cast(effect->giEffect)->parameters[0] = -ITEM_SHIELD_DEKU; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + -ITEM_SHIELD_DEKU; break; case kEffectTakeHylianShield: - effect->giEffect = new GameInteractionEffect::GiveOrTakeShield(); - dynamic_cast(effect->giEffect)->parameters[0] = -ITEM_SHIELD_HYLIAN; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + -ITEM_SHIELD_HYLIAN; break; case kEffectTakeSticks: - effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter * -1; - dynamic_cast(effect->giEffect)->parameters[1] = ITEM_STICK; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + receivedParameter * -1; + dynamic_cast(effect->giEffect.get())->parameters[1] = ITEM_STICK; break; case kEffectTakeNuts: - effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter * -1; - dynamic_cast(effect->giEffect)->parameters[1] = ITEM_NUT; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + receivedParameter * -1; + dynamic_cast(effect->giEffect.get())->parameters[1] = ITEM_NUT; break; case kEffectTakeBombs: - effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter * -1; - dynamic_cast(effect->giEffect)->parameters[1] = ITEM_BOMB; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + receivedParameter * -1; + dynamic_cast(effect->giEffect.get())->parameters[1] = ITEM_BOMB; break; case kEffectTakeSeeds: - effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter * -1; - dynamic_cast(effect->giEffect)->parameters[1] = ITEM_SLINGSHOT; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + receivedParameter * -1; + dynamic_cast(effect->giEffect.get())->parameters[1] = ITEM_SLINGSHOT; break; case kEffectTakeArrows: - effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter * -1; - dynamic_cast(effect->giEffect)->parameters[1] = ITEM_BOW; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + receivedParameter * -1; + dynamic_cast(effect->giEffect.get())->parameters[1] = ITEM_BOW; break; case kEffectTakeBombchus: - effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); - dynamic_cast(effect->giEffect)->parameters[0] = receivedParameter * -1; - dynamic_cast(effect->giEffect)->parameters[1] = ITEM_BOMBCHU; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + receivedParameter * -1; + dynamic_cast(effect->giEffect.get())->parameters[1] = ITEM_BOMBCHU; break; // Link Size Modifiers case kEffectGiantLink: effect->category = kEffectCatLinkSize; effect->timeRemaining = 30000; - effect->giEffect = new GameInteractionEffect::ModifyLinkSize(); - dynamic_cast(effect->giEffect)->parameters[0] = GI_LINK_SIZE_GIANT; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + GI_LINK_SIZE_GIANT; break; case kEffectMinishLink: effect->category = kEffectCatLinkSize; effect->timeRemaining = 30000; - effect->giEffect = new GameInteractionEffect::ModifyLinkSize(); - dynamic_cast(effect->giEffect)->parameters[0] = GI_LINK_SIZE_MINISH; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + GI_LINK_SIZE_MINISH; break; case kEffectPaperLink: effect->category = kEffectCatLinkSize; effect->timeRemaining = 30000; - effect->giEffect = new GameInteractionEffect::ModifyLinkSize(); - dynamic_cast(effect->giEffect)->parameters[0] = GI_LINK_SIZE_PAPER; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + GI_LINK_SIZE_PAPER; break; case kEffectSquishedLink: effect->category = kEffectCatLinkSize; effect->timeRemaining = 30000; - effect->giEffect = new GameInteractionEffect::ModifyLinkSize(); - dynamic_cast(effect->giEffect)->parameters[0] = GI_LINK_SIZE_SQUISHED; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + GI_LINK_SIZE_SQUISHED; break; case kEffectInvisibleLink: effect->category = kEffectCatLinkSize; effect->timeRemaining = 30000; - effect->giEffect = new GameInteractionEffect::InvisibleLink(); + effect->giEffect = std::make_unique(); break; // Generic Effects case kEffectRandomBombTimer: effect->category = kEffectCatRandomBombFuseTimer; effect->timeRemaining = 60000; - effect->giEffect = new GameInteractionEffect::RandomBombFuseTimer(); + effect->giEffect = std::make_unique(); break; case kEffectSetTimeToDawn: - effect->giEffect = new GameInteractionEffect::SetTimeOfDay(); - dynamic_cast(effect->giEffect)->parameters[0] = GI_TIMEOFDAY_DAWN; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + GI_TIMEOFDAY_DAWN; break; case kEffectSetTimeToDusk: - effect->giEffect = new GameInteractionEffect::SetTimeOfDay(); - dynamic_cast(effect->giEffect)->parameters[0] = GI_TIMEOFDAY_DUSK; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + GI_TIMEOFDAY_DUSK; break; // Visual Effects case kEffectNoUi: effect->category = kEffectCatUi; effect->timeRemaining = 60000; - effect->giEffect = new GameInteractionEffect::NoUI(); + effect->giEffect = std::make_unique(); break; case kEffectRainstorm: effect->category = kEffectCatWeather; effect->timeRemaining = 30000; - effect->giEffect = new GameInteractionEffect::WeatherRainstorm(); + effect->giEffect = std::make_unique(); break; case kEffectDebugMode: effect->category = kEffectCatDebugMode; effect->timeRemaining = 30000; - effect->giEffect = new GameInteractionEffect::SetCollisionViewer(); + effect->giEffect = std::make_unique(); break; case kEffectRandomCosmetics: - effect->giEffect = new GameInteractionEffect::RandomizeCosmetics(); + effect->giEffect = std::make_unique(); break; // Controls case kEffectNoZButton: effect->category = kEffectCatNoZ; effect->timeRemaining = 30000; - effect->giEffect = new GameInteractionEffect::DisableZTargeting(); + effect->giEffect = std::make_unique(); break; case kEffectReverseControls: effect->category = kEffectCatReverseControls; effect->timeRemaining = 60000; - effect->giEffect = new GameInteractionEffect::ReverseControls(); + effect->giEffect = std::make_unique(); break; case kEffectPacifistMode: effect->category = kEffectCatPacifist; effect->timeRemaining = 15000; - effect->giEffect = new GameInteractionEffect::PacifistMode(); + effect->giEffect = std::make_unique(); break; case kEffectPressRandomButtons: effect->category = kEffectCatRandomButtons; effect->timeRemaining = 30000; - effect->giEffect = new GameInteractionEffect::PressRandomButton(); - dynamic_cast(effect->giEffect)->parameters[0] = 30; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = 30; break; case kEffectClearCbuttons: - effect->giEffect = new GameInteractionEffect::ClearAssignedButtons(); - dynamic_cast(effect->giEffect)->parameters[0] = GI_BUTTONS_CBUTTONS; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + GI_BUTTONS_CBUTTONS; break; case kEffectClearDpad: - effect->giEffect = new GameInteractionEffect::ClearAssignedButtons(); - dynamic_cast(effect->giEffect)->parameters[0] = GI_BUTTONS_DPAD; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = GI_BUTTONS_DPAD; break; // Teleport Player case kEffectTpLinksHouse: - effect->giEffect = new GameInteractionEffect::TeleportPlayer(); - dynamic_cast(effect->giEffect)->parameters[0] = GI_TP_DEST_LINKSHOUSE; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + GI_TP_DEST_LINKSHOUSE; break; case kEffectTpMinuet: - effect->giEffect = new GameInteractionEffect::TeleportPlayer(); - dynamic_cast(effect->giEffect)->parameters[0] = GI_TP_DEST_MINUET; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + GI_TP_DEST_MINUET; break; case kEffectTpBolero: - effect->giEffect = new GameInteractionEffect::TeleportPlayer(); - dynamic_cast(effect->giEffect)->parameters[0] = GI_TP_DEST_BOLERO; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + GI_TP_DEST_BOLERO; break; case kEffectTpSerenade: - effect->giEffect = new GameInteractionEffect::TeleportPlayer(); - dynamic_cast(effect->giEffect)->parameters[0] = GI_TP_DEST_SERENADE; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + GI_TP_DEST_SERENADE; break; case kEffectTpRequiem: - effect->giEffect = new GameInteractionEffect::TeleportPlayer(); - dynamic_cast(effect->giEffect)->parameters[0] = GI_TP_DEST_REQUIEM; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + GI_TP_DEST_REQUIEM; break; case kEffectTpNocturne: - effect->giEffect = new GameInteractionEffect::TeleportPlayer(); - dynamic_cast(effect->giEffect)->parameters[0] = GI_TP_DEST_NOCTURNE; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + GI_TP_DEST_NOCTURNE; break; case kEffectTpPrelude: - effect->giEffect = new GameInteractionEffect::TeleportPlayer(); - dynamic_cast(effect->giEffect)->parameters[0] = GI_TP_DEST_PRELUDE; + effect->giEffect = std::make_unique(); + dynamic_cast(effect->giEffect.get())->parameters[0] = + GI_TP_DEST_PRELUDE; break; default: diff --git a/soh/soh/Network/CrowdControl/CrowdControl.h b/soh/soh/Network/CrowdControl/CrowdControl.h index 5526a254c..5cc0883d4 100644 --- a/soh/soh/Network/CrowdControl/CrowdControl.h +++ b/soh/soh/Network/CrowdControl/CrowdControl.h @@ -54,7 +54,7 @@ class CrowdControl : public Network { uint32_t spawnParams[2]; uint32_t category = 0; long timeRemaining; - GameInteractionEffectBase* giEffect; + std::unique_ptr giEffect; std::string viewerName; // Metadata used while executing (only for timed effects)