Fix memory leaks in debugconsole & CrowdControl (#6383)

This commit is contained in:
Philip Dubé
2026-03-21 18:32:55 +00:00
committed by GitHub
parent b8634f1d8b
commit 43f77c13fb
6 changed files with 237 additions and 205 deletions

View File

@@ -110,8 +110,8 @@ static bool ActorSpawnHandler(std::shared_ptr<Ship::Console> Console, const std:
static bool KillPlayerHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>&, static bool KillPlayerHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>&,
std::string* output) { std::string* output) {
GameInteractionEffectBase* effect = new GameInteractionEffect::SetPlayerHealth(); GameInteractionEffect::SetPlayerHealth effect;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[0] = 0; effect.parameters[0] = 0;
GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect);
if (result == GameInteractionEffectQueryResult::Possible) { if (result == GameInteractionEffectQueryResult::Possible) {
INFO_MESSAGE("[SOH] You've met with a terrible fate, haven't you?"); INFO_MESSAGE("[SOH] You've met with a terrible fate, haven't you?");
@@ -142,8 +142,8 @@ static bool SetPlayerHealthHandler(std::shared_ptr<Ship::Console> Console, const
return 1; return 1;
} }
GameInteractionEffectBase* effect = new GameInteractionEffect::SetPlayerHealth(); GameInteractionEffect::SetPlayerHealth effect;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[0] = health; effect.parameters[0] = health;
GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect);
if (result == GameInteractionEffectQueryResult::Possible) { if (result == GameInteractionEffectQueryResult::Possible) {
INFO_MESSAGE("[SOH] Player health updated to %d", health); INFO_MESSAGE("[SOH] Player health updated to %d", health);
@@ -159,7 +159,6 @@ static bool LoadSceneHandler(std::shared_ptr<Ship::Console> Console, const std::
gSaveContext.respawnFlag = 0; gSaveContext.respawnFlag = 0;
gSaveContext.seqId = 0xFF; gSaveContext.seqId = 0xFF;
gSaveContext.gameMode = GAMEMODE_NORMAL; gSaveContext.gameMode = GAMEMODE_NORMAL;
return 0; return 0;
} }
@@ -257,9 +256,9 @@ static bool AddAmmoHandler(std::shared_ptr<Ship::Console> Console, const std::ve
return 1; return 1;
} }
GameInteractionEffectBase* effect = new GameInteractionEffect::AddOrTakeAmmo(); GameInteractionEffect::AddOrTakeAmmo effect;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[0] = amount; effect.parameters[0] = amount;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[1] = it->second; effect.parameters[1] = it->second;
GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect);
if (result == GameInteractionEffectQueryResult::Possible) { if (result == GameInteractionEffectQueryResult::Possible) {
@@ -298,9 +297,9 @@ static bool TakeAmmoHandler(std::shared_ptr<Ship::Console> Console, const std::v
return 1; return 1;
} }
GameInteractionEffectBase* effect = new GameInteractionEffect::AddOrTakeAmmo(); GameInteractionEffect::AddOrTakeAmmo effect;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[0] = -amount; effect.parameters[0] = -amount;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[1] = it->second; effect.parameters[1] = it->second;
GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect);
if (result == GameInteractionEffectQueryResult::Possible) { if (result == GameInteractionEffectQueryResult::Possible) {
@@ -354,7 +353,6 @@ static bool BottleHandler(std::shared_ptr<Ship::Console> Console, const std::vec
return 1; return 1;
} }
// I dont think you can do OOB with just this
gSaveContext.inventory.items[0x11 + slot] = it->second; gSaveContext.inventory.items[0x11 + slot] = it->second;
return 0; return 0;
@@ -612,7 +610,7 @@ static bool InvisibleHandler(std::shared_ptr<Ship::Console> Console, const std::
return 1; return 1;
} }
RemovableGameInteractionEffect* effect = new GameInteractionEffect::InvisibleLink(); GameInteractionEffect::InvisibleLink effect;
GameInteractionEffectQueryResult result = GameInteractionEffectQueryResult result =
state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect);
if (result == GameInteractionEffectQueryResult::Possible) { if (result == GameInteractionEffectQueryResult::Possible) {
@@ -639,8 +637,8 @@ static bool GiantLinkHandler(std::shared_ptr<Ship::Console> Console, const std::
return 1; return 1;
} }
RemovableGameInteractionEffect* effect = new GameInteractionEffect::ModifyLinkSize(); GameInteractionEffect::ModifyLinkSize effect;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[0] = GI_LINK_SIZE_GIANT; effect.parameters[0] = GI_LINK_SIZE_GIANT;
GameInteractionEffectQueryResult result = GameInteractionEffectQueryResult result =
state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect);
if (result == GameInteractionEffectQueryResult::Possible) { if (result == GameInteractionEffectQueryResult::Possible) {
@@ -667,8 +665,8 @@ static bool MinishLinkHandler(std::shared_ptr<Ship::Console> Console, const std:
return 1; return 1;
} }
RemovableGameInteractionEffect* effect = new GameInteractionEffect::ModifyLinkSize(); GameInteractionEffect::ModifyLinkSize effect;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[0] = GI_LINK_SIZE_MINISH; effect.parameters[0] = GI_LINK_SIZE_MINISH;
GameInteractionEffectQueryResult result = GameInteractionEffectQueryResult result =
state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect);
if (result == GameInteractionEffectQueryResult::Possible) { if (result == GameInteractionEffectQueryResult::Possible) {
@@ -700,8 +698,8 @@ static bool AddHeartContainerHandler(std::shared_ptr<Ship::Console> Console, con
return 1; return 1;
} }
GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyHeartContainers(); GameInteractionEffect::ModifyHeartContainers effect;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[0] = hearts; effect.parameters[0] = hearts;
GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect);
if (result == GameInteractionEffectQueryResult::Possible) { if (result == GameInteractionEffectQueryResult::Possible) {
INFO_MESSAGE("[SOH] Added %d heart containers", hearts); INFO_MESSAGE("[SOH] Added %d heart containers", hearts);
@@ -732,8 +730,8 @@ static bool RemoveHeartContainerHandler(std::shared_ptr<Ship::Console> Console,
return 1; return 1;
} }
GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyHeartContainers(); GameInteractionEffect::ModifyHeartContainers effect;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[0] = -hearts; effect.parameters[0] = -hearts;
GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect);
if (result == GameInteractionEffectQueryResult::Possible) { if (result == GameInteractionEffectQueryResult::Possible) {
INFO_MESSAGE("[SOH] Removed %d heart containers", hearts); INFO_MESSAGE("[SOH] Removed %d heart containers", hearts);
@@ -751,10 +749,10 @@ static bool GravityHandler(std::shared_ptr<Ship::Console> Console, const std::ve
return 1; return 1;
} }
GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyGravity(); GameInteractionEffect::ModifyGravity effect;
try { try {
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[0] = effect.parameters[0] =
Ship::Math::clamp(std::stoi(args[1], nullptr, 10), GI_GRAVITY_LEVEL_LIGHT, GI_GRAVITY_LEVEL_HEAVY); Ship::Math::clamp(std::stoi(args[1], nullptr, 10), GI_GRAVITY_LEVEL_LIGHT, GI_GRAVITY_LEVEL_HEAVY);
} catch (std::invalid_argument const& ex) { } catch (std::invalid_argument const& ex) {
ERROR_MESSAGE("[SOH] Gravity value must be a number."); ERROR_MESSAGE("[SOH] Gravity value must be a number.");
@@ -786,7 +784,7 @@ static bool NoUIHandler(std::shared_ptr<Ship::Console> Console, const std::vecto
return 1; return 1;
} }
RemovableGameInteractionEffect* effect = new GameInteractionEffect::NoUI(); GameInteractionEffect::NoUI effect;
GameInteractionEffectQueryResult result = GameInteractionEffectQueryResult result =
state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect);
@@ -801,7 +799,7 @@ static bool NoUIHandler(std::shared_ptr<Ship::Console> Console, const std::vecto
static bool FreezeHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args, static bool FreezeHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args,
std::string* output) { std::string* output) {
GameInteractionEffectBase* effect = new GameInteractionEffect::FreezePlayer(); GameInteractionEffect::FreezePlayer effect;
GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect);
if (result == GameInteractionEffectQueryResult::Possible) { if (result == GameInteractionEffectQueryResult::Possible) {
@@ -819,10 +817,10 @@ static bool DefenseModifierHandler(std::shared_ptr<Ship::Console> Console, const
ERROR_MESSAGE("[SOH] Unexpected arguments passed"); ERROR_MESSAGE("[SOH] Unexpected arguments passed");
return 1; return 1;
} }
GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyDefenseModifier(); GameInteractionEffect::ModifyDefenseModifier effect;
try { try {
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[0] = std::stoi(args[1], nullptr, 10); effect.parameters[0] = std::stoi(args[1], nullptr, 10);
} catch (std::invalid_argument const& ex) { } catch (std::invalid_argument const& ex) {
ERROR_MESSAGE("[SOH] Defense modifier value must be a number."); ERROR_MESSAGE("[SOH] Defense modifier value must be a number.");
return 1; return 1;
@@ -830,8 +828,7 @@ static bool DefenseModifierHandler(std::shared_ptr<Ship::Console> Console, const
GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect);
if (result == GameInteractionEffectQueryResult::Possible) { if (result == GameInteractionEffectQueryResult::Possible) {
INFO_MESSAGE("[SOH] Defense modifier set to %d", INFO_MESSAGE("[SOH] Defense modifier set to %d", effect.parameters[0]);
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[0]);
return 0; return 0;
} else { } else {
INFO_MESSAGE("[SOH] Command failed: Could not set defense modifier."); INFO_MESSAGE("[SOH] Command failed: Could not set defense modifier.");
@@ -845,7 +842,7 @@ static bool DamageHandler(std::shared_ptr<Ship::Console> Console, const std::vec
ERROR_MESSAGE("[SOH] Unexpected arguments passed"); ERROR_MESSAGE("[SOH] Unexpected arguments passed");
return 1; return 1;
} }
GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyHealth(); GameInteractionEffect::ModifyHealth effect;
try { try {
int value = std::stoi(args[1], nullptr, 10); int value = std::stoi(args[1], nullptr, 10);
@@ -854,7 +851,7 @@ static bool DamageHandler(std::shared_ptr<Ship::Console> Console, const std::vec
return 1; return 1;
} }
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[0] = -value; effect.parameters[0] = -value;
} catch (std::invalid_argument const& ex) { } catch (std::invalid_argument const& ex) {
ERROR_MESSAGE("[SOH] Damage value must be a number."); ERROR_MESSAGE("[SOH] Damage value must be a number.");
return 1; return 1;
@@ -876,7 +873,7 @@ static bool HealHandler(std::shared_ptr<Ship::Console> Console, const std::vecto
ERROR_MESSAGE("[SOH] Unexpected arguments passed"); ERROR_MESSAGE("[SOH] Unexpected arguments passed");
return 1; return 1;
} }
GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyHealth(); GameInteractionEffect::ModifyHealth effect;
try { try {
int value = std::stoi(args[1], nullptr, 10); int value = std::stoi(args[1], nullptr, 10);
@@ -885,7 +882,7 @@ static bool HealHandler(std::shared_ptr<Ship::Console> Console, const std::vecto
return 1; return 1;
} }
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[0] = value; effect.parameters[0] = value;
} catch (std::invalid_argument const& ex) { } catch (std::invalid_argument const& ex) {
ERROR_MESSAGE("[SOH] Damage value must be a number."); ERROR_MESSAGE("[SOH] Damage value must be a number.");
return 1; return 1;
@@ -903,7 +900,7 @@ static bool HealHandler(std::shared_ptr<Ship::Console> Console, const std::vecto
static bool FillMagicHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args, static bool FillMagicHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args,
std::string* output) { std::string* output) {
GameInteractionEffectBase* effect = new GameInteractionEffect::FillMagic(); GameInteractionEffect::FillMagic effect;
GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect);
if (result == GameInteractionEffectQueryResult::Possible) { if (result == GameInteractionEffectQueryResult::Possible) {
@@ -917,7 +914,7 @@ static bool FillMagicHandler(std::shared_ptr<Ship::Console> Console, const std::
static bool EmptyMagicHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args, static bool EmptyMagicHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args,
std::string* output) { std::string* output) {
GameInteractionEffectBase* effect = new GameInteractionEffect::EmptyMagic(); GameInteractionEffect::EmptyMagic effect;
GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect);
if (result == GameInteractionEffectQueryResult::Possible) { if (result == GameInteractionEffectQueryResult::Possible) {
@@ -944,7 +941,7 @@ static bool NoZHandler(std::shared_ptr<Ship::Console> Console, const std::vector
return 1; return 1;
} }
RemovableGameInteractionEffect* effect = new GameInteractionEffect::DisableZTargeting(); GameInteractionEffect::DisableZTargeting effect;
GameInteractionEffectQueryResult result = GameInteractionEffectQueryResult result =
state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect);
@@ -972,7 +969,7 @@ static bool OneHitKOHandler(std::shared_ptr<Ship::Console> Console, const std::v
return 1; return 1;
} }
RemovableGameInteractionEffect* effect = new GameInteractionEffect::OneHitKO(); GameInteractionEffect::OneHitKO effect;
GameInteractionEffectQueryResult result = GameInteractionEffectQueryResult result =
state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect);
@@ -1000,7 +997,7 @@ static bool PacifistHandler(std::shared_ptr<Ship::Console> Console, const std::v
return 1; return 1;
} }
RemovableGameInteractionEffect* effect = new GameInteractionEffect::PacifistMode(); GameInteractionEffect::PacifistMode effect;
GameInteractionEffectQueryResult result = GameInteractionEffectQueryResult result =
state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect);
@@ -1028,8 +1025,8 @@ static bool PaperLinkHandler(std::shared_ptr<Ship::Console> Console, const std::
return 1; return 1;
} }
RemovableGameInteractionEffect* effect = new GameInteractionEffect::ModifyLinkSize(); GameInteractionEffect::ModifyLinkSize effect;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[0] = GI_LINK_SIZE_PAPER; effect.parameters[0] = GI_LINK_SIZE_PAPER;
GameInteractionEffectQueryResult result = GameInteractionEffectQueryResult result =
state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect);
@@ -1057,7 +1054,7 @@ static bool RainstormHandler(std::shared_ptr<Ship::Console> Console, const std::
return 1; return 1;
} }
RemovableGameInteractionEffect* effect = new GameInteractionEffect::WeatherRainstorm(); GameInteractionEffect::WeatherRainstorm effect;
GameInteractionEffectQueryResult result = GameInteractionEffectQueryResult result =
state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect);
@@ -1085,7 +1082,7 @@ static bool ReverseControlsHandler(std::shared_ptr<Ship::Console> Console, const
return 1; return 1;
} }
RemovableGameInteractionEffect* effect = new GameInteractionEffect::ReverseControls(); GameInteractionEffect::ReverseControls effect;
GameInteractionEffectQueryResult result = GameInteractionEffectQueryResult result =
state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect);
@@ -1105,10 +1102,10 @@ static bool UpdateRupeesHandler(std::shared_ptr<Ship::Console> Console, const st
ERROR_MESSAGE("[SOH] Unexpected arguments passed"); ERROR_MESSAGE("[SOH] Unexpected arguments passed");
return 1; return 1;
} }
GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyRupees(); GameInteractionEffect::ModifyRupees effect;
try { try {
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[0] = std::stoi(args[1], nullptr, 10); effect.parameters[0] = std::stoi(args[1], nullptr, 10);
} catch (std::invalid_argument const& ex) { } catch (std::invalid_argument const& ex) {
ERROR_MESSAGE("[SOH] Rupee value must be a number."); ERROR_MESSAGE("[SOH] Rupee value must be a number.");
return 1; return 1;
@@ -1130,10 +1127,10 @@ static bool SpeedModifierHandler(std::shared_ptr<Ship::Console> Console, const s
ERROR_MESSAGE("[SOH] Unexpected arguments passed"); ERROR_MESSAGE("[SOH] Unexpected arguments passed");
return 1; return 1;
} }
GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyMovementSpeedMultiplier(); GameInteractionEffect::ModifyMovementSpeedMultiplier effect;
try { try {
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[0] = std::stoi(args[1], nullptr, 10); effect.parameters[0] = std::stoi(args[1], nullptr, 10);
} catch (std::invalid_argument const& ex) { } catch (std::invalid_argument const& ex) {
ERROR_MESSAGE("[SOH] Speed modifier value must be a number."); ERROR_MESSAGE("[SOH] Speed modifier value must be a number.");
return 1; return 1;
@@ -1168,8 +1165,8 @@ static bool BootsHandler(std::shared_ptr<Ship::Console> Console, const std::vect
return 1; return 1;
} }
GameInteractionEffectBase* effect = new GameInteractionEffect::ForceEquipBoots(); GameInteractionEffect::ForceEquipBoots effect;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[0] = it->second; effect.parameters[0] = it->second;
GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect);
if (result == GameInteractionEffectQueryResult::Possible) { if (result == GameInteractionEffectQueryResult::Possible) {
@@ -1200,8 +1197,8 @@ static bool GiveShieldHandler(std::shared_ptr<Ship::Console> Console, const std:
return 1; return 1;
} }
GameInteractionEffectBase* effect = new GameInteractionEffect::GiveOrTakeShield(); GameInteractionEffect::GiveOrTakeShield effect;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[0] = it->second; effect.parameters[0] = it->second;
GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect);
if (result == GameInteractionEffectQueryResult::Possible) { if (result == GameInteractionEffectQueryResult::Possible) {
@@ -1226,8 +1223,8 @@ static bool TakeShieldHandler(std::shared_ptr<Ship::Console> Console, const std:
return 1; return 1;
} }
GameInteractionEffectBase* effect = new GameInteractionEffect::GiveOrTakeShield(); GameInteractionEffect::GiveOrTakeShield effect;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[0] = it->second * -1; effect.parameters[0] = it->second * -1;
GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect);
if (result == GameInteractionEffectQueryResult::Possible) { if (result == GameInteractionEffectQueryResult::Possible) {
@@ -1245,7 +1242,7 @@ static bool KnockbackHandler(std::shared_ptr<Ship::Console> Console, const std::
ERROR_MESSAGE("[SOH] Unexpected arguments passed"); ERROR_MESSAGE("[SOH] Unexpected arguments passed");
return 1; return 1;
} }
GameInteractionEffectBase* effect = new GameInteractionEffect::KnockbackPlayer(); GameInteractionEffect::KnockbackPlayer effect;
try { try {
int value = std::stoi(args[1], nullptr, 10); int value = std::stoi(args[1], nullptr, 10);
@@ -1254,7 +1251,7 @@ static bool KnockbackHandler(std::shared_ptr<Ship::Console> Console, const std::
return 1; return 1;
} }
dynamic_cast<ParameterizedGameInteractionEffect*>(effect)->parameters[0] = value; effect.parameters[0] = value;
} catch (std::invalid_argument const& ex) { } catch (std::invalid_argument const& ex) {
ERROR_MESSAGE("[SOH] Knockback value must be a number."); ERROR_MESSAGE("[SOH] Knockback value must be a number.");
return 1; return 1;
@@ -1272,7 +1269,7 @@ static bool KnockbackHandler(std::shared_ptr<Ship::Console> Console, const std::
static bool ElectrocuteHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args, static bool ElectrocuteHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args,
std::string* output) { std::string* output) {
GameInteractionEffectBase* effect = new GameInteractionEffect::ElectrocutePlayer(); GameInteractionEffect::ElectrocutePlayer effect;
GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect);
if (result == GameInteractionEffectQueryResult::Possible) { if (result == GameInteractionEffectQueryResult::Possible) {
@@ -1286,7 +1283,7 @@ static bool ElectrocuteHandler(std::shared_ptr<Ship::Console> Console, const std
static bool BurnHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args, static bool BurnHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args,
std::string* output) { std::string* output) {
GameInteractionEffectBase* effect = new GameInteractionEffect::BurnPlayer(); GameInteractionEffect::BurnPlayer effect;
GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect);
if (result == GameInteractionEffectQueryResult::Possible) { if (result == GameInteractionEffectQueryResult::Possible) {

View File

@@ -38,11 +38,9 @@ GameInteractionEffectQueryResult RemovableGameInteractionEffect::CanBeRemoved()
GameInteractionEffectQueryResult RemovableGameInteractionEffect::Remove() { GameInteractionEffectQueryResult RemovableGameInteractionEffect::Remove() {
GameInteractionEffectQueryResult result = CanBeRemoved(); GameInteractionEffectQueryResult result = CanBeRemoved();
if (result != GameInteractionEffectQueryResult::Possible) { if (result == GameInteractionEffectQueryResult::Possible) {
return result; _Remove();
} }
_Remove();
return result; return result;
} }

View File

@@ -21,16 +21,16 @@ extern PlayState* gPlayState;
// MARK: - Effects // MARK: - Effects
GameInteractionEffectQueryResult GameInteractor::CanApplyEffect(GameInteractionEffectBase* effect) { GameInteractionEffectQueryResult GameInteractor::CanApplyEffect(GameInteractionEffectBase& effect) {
return effect->CanBeApplied(); return effect.CanBeApplied();
} }
GameInteractionEffectQueryResult GameInteractor::ApplyEffect(GameInteractionEffectBase* effect) { GameInteractionEffectQueryResult GameInteractor::ApplyEffect(GameInteractionEffectBase& effect) {
return effect->Apply(); return effect.Apply();
} }
GameInteractionEffectQueryResult GameInteractor::RemoveEffect(RemovableGameInteractionEffect* effect) { GameInteractionEffectQueryResult GameInteractor::RemoveEffect(RemovableGameInteractionEffect& effect) {
return effect->Remove(); return effect.Remove();
} }
// MARK: - Helpers // MARK: - Helpers

View File

@@ -220,9 +220,9 @@ class GameInteractor {
}; };
// Effects // Effects
static GameInteractionEffectQueryResult CanApplyEffect(GameInteractionEffectBase* effect); static GameInteractionEffectQueryResult CanApplyEffect(GameInteractionEffectBase& effect);
static GameInteractionEffectQueryResult ApplyEffect(GameInteractionEffectBase* effect); static GameInteractionEffectQueryResult ApplyEffect(GameInteractionEffectBase& effect);
static GameInteractionEffectQueryResult RemoveEffect(RemovableGameInteractionEffect* effect); static GameInteractionEffectQueryResult RemoveEffect(RemovableGameInteractionEffect& effect);
// Game Hooks // Game Hooks
HOOK_ID nextHookId = 1; HOOK_ID nextHookId = 1;

View File

@@ -83,7 +83,8 @@ void CrowdControl::ProcessActiveEffects() {
if (effect->timeRemaining <= 0) { if (effect->timeRemaining <= 0) {
it = activeEffects.erase(std::remove(activeEffects.begin(), activeEffects.end(), effect), it = activeEffects.erase(std::remove(activeEffects.begin(), activeEffects.end(), effect),
activeEffects.end()); activeEffects.end());
GameInteractor::RemoveEffect(dynamic_cast<RemovableGameInteractionEffect*>(effect->giEffect)); GameInteractor::RemoveEffect(
*dynamic_cast<RemovableGameInteractionEffect*>(effect->giEffect.get()));
delete effect; delete effect;
} else { } else {
// If we have a success after previously being paused, tell CC to resume timer. // 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 = giResult =
GameInteractor::RawAction::SpawnActor(effect->spawnParams[0], effect->spawnParams[1], effect->viewerName); GameInteractor::RawAction::SpawnActor(effect->spawnParams[0], effect->spawnParams[1], effect->viewerName);
} else { } else {
giResult = GameInteractor::ApplyEffect(effect->giEffect); giResult = GameInteractor::ApplyEffect(*effect->giEffect.get());
} }
return TranslateGiEnum(giResult); 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. /// Checks if effect can be applied -- should not be used to check for spawn enemy effects.
CrowdControl::EffectResult CrowdControl::CanApplyEffect(Effect* effect) { CrowdControl::EffectResult CrowdControl::CanApplyEffect(Effect* effect) {
assert(effect->category != kEffectCatSpawnEnemy || effect->category != kEffectCatSpawnActor); assert(effect->category != kEffectCatSpawnEnemy || effect->category != kEffectCatSpawnActor);
GameInteractionEffectQueryResult giResult = GameInteractor::CanApplyEffect(effect->giEffect); GameInteractionEffectQueryResult giResult = GameInteractor::CanApplyEffect(*effect->giEffect.get());
return TranslateGiEnum(giResult); return TranslateGiEnum(giResult);
} }
@@ -279,346 +280,382 @@ CrowdControl::Effect* CrowdControl::ParseMessage(nlohmann::json dataReceived) {
case kEffectTakeHalfDamage: case kEffectTakeHalfDamage:
effect->category = kEffectCatDamageTaken; effect->category = kEffectCatDamageTaken;
effect->timeRemaining = 30000; effect->timeRemaining = 30000;
effect->giEffect = new GameInteractionEffect::ModifyDefenseModifier(); effect->giEffect = std::make_unique<GameInteractionEffect::ModifyDefenseModifier>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = 2; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] = 2;
break; break;
case kEffectTakeDoubleDamage: case kEffectTakeDoubleDamage:
effect->category = kEffectCatDamageTaken; effect->category = kEffectCatDamageTaken;
effect->timeRemaining = 30000; effect->timeRemaining = 30000;
effect->giEffect = new GameInteractionEffect::ModifyDefenseModifier(); effect->giEffect = std::make_unique<GameInteractionEffect::ModifyDefenseModifier>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = -2; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] = -2;
break; break;
case kEffectOneHitKo: case kEffectOneHitKo:
effect->category = kEffectCatDamageTaken; effect->category = kEffectCatDamageTaken;
effect->timeRemaining = 30000; effect->timeRemaining = 30000;
effect->giEffect = new GameInteractionEffect::OneHitKO(); effect->giEffect = std::make_unique<GameInteractionEffect::OneHitKO>();
break; break;
case kEffectInvincibility: case kEffectInvincibility:
effect->category = kEffectCatDamageTaken; effect->category = kEffectCatDamageTaken;
effect->timeRemaining = 15000; effect->timeRemaining = 15000;
effect->giEffect = new GameInteractionEffect::PlayerInvincibility(); effect->giEffect = std::make_unique<GameInteractionEffect::PlayerInvincibility>();
break; break;
break; break;
case kEffectIncreaseSpeed: case kEffectIncreaseSpeed:
effect->category = kEffectCatSpeed; effect->category = kEffectCatSpeed;
effect->timeRemaining = 30000; effect->timeRemaining = 30000;
effect->giEffect = new GameInteractionEffect::ModifyMovementSpeedMultiplier(); effect->giEffect = std::make_unique<GameInteractionEffect::ModifyMovementSpeedMultiplier>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = 2; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] = 2;
break; break;
case kEffectDecreaseSpeed: case kEffectDecreaseSpeed:
effect->category = kEffectCatSpeed; effect->category = kEffectCatSpeed;
effect->timeRemaining = 30000; effect->timeRemaining = 30000;
effect->giEffect = new GameInteractionEffect::ModifyMovementSpeedMultiplier(); effect->giEffect = std::make_unique<GameInteractionEffect::ModifyMovementSpeedMultiplier>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = -2; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] = -2;
break; break;
case kEffectLowGravity: case kEffectLowGravity:
effect->category = kEffectCatGravity; effect->category = kEffectCatGravity;
effect->timeRemaining = 30000; effect->timeRemaining = 30000;
effect->giEffect = new GameInteractionEffect::ModifyGravity(); effect->giEffect = std::make_unique<GameInteractionEffect::ModifyGravity>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = GI_GRAVITY_LEVEL_LIGHT; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
GI_GRAVITY_LEVEL_LIGHT;
break; break;
case kEffectHighGravity: case kEffectHighGravity:
effect->category = kEffectCatGravity; effect->category = kEffectCatGravity;
effect->timeRemaining = 30000; effect->timeRemaining = 30000;
effect->giEffect = new GameInteractionEffect::ModifyGravity(); effect->giEffect = std::make_unique<GameInteractionEffect::ModifyGravity>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = GI_GRAVITY_LEVEL_HEAVY; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
GI_GRAVITY_LEVEL_HEAVY;
break; break;
case kEffectForceIronBoots: case kEffectForceIronBoots:
effect->category = kEffectCatBoots; effect->category = kEffectCatBoots;
effect->timeRemaining = 30000; effect->timeRemaining = 30000;
effect->giEffect = new GameInteractionEffect::ForceEquipBoots(); effect->giEffect = std::make_unique<GameInteractionEffect::ForceEquipBoots>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = EQUIP_VALUE_BOOTS_IRON; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
EQUIP_VALUE_BOOTS_IRON;
break; break;
case kEffectForceHoverBoots: case kEffectForceHoverBoots:
effect->category = kEffectCatBoots; effect->category = kEffectCatBoots;
effect->timeRemaining = 30000; effect->timeRemaining = 30000;
effect->giEffect = new GameInteractionEffect::ForceEquipBoots(); effect->giEffect = std::make_unique<GameInteractionEffect::ForceEquipBoots>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
EQUIP_VALUE_BOOTS_HOVER; EQUIP_VALUE_BOOTS_HOVER;
break; break;
case kEffectSlipperyFloor: case kEffectSlipperyFloor:
effect->category = kEffectCatSlipperyFloor; effect->category = kEffectCatSlipperyFloor;
effect->timeRemaining = 30000; effect->timeRemaining = 30000;
effect->giEffect = new GameInteractionEffect::SlipperyFloor(); effect->giEffect = std::make_unique<GameInteractionEffect::SlipperyFloor>();
break; break;
case kEffectNoLedgeGrabs: case kEffectNoLedgeGrabs:
effect->category = kEffectCatNoLedgeGrabs; effect->category = kEffectCatNoLedgeGrabs;
effect->timeRemaining = 30000; effect->timeRemaining = 30000;
effect->giEffect = new GameInteractionEffect::DisableLedgeGrabs(); effect->giEffect = std::make_unique<GameInteractionEffect::DisableLedgeGrabs>();
break; break;
case kEffectRandomWind: case kEffectRandomWind:
effect->category = kEffectCatRandomWind; effect->category = kEffectCatRandomWind;
effect->timeRemaining = 30000; effect->timeRemaining = 30000;
effect->giEffect = new GameInteractionEffect::RandomWind(); effect->giEffect = std::make_unique<GameInteractionEffect::RandomWind>();
break; break;
case kEffectRandomBonks: case kEffectRandomBonks:
effect->category = kEffectCatRandomBonks; effect->category = kEffectCatRandomBonks;
effect->timeRemaining = 60000; effect->timeRemaining = 60000;
effect->giEffect = new GameInteractionEffect::RandomBonks(); effect->giEffect = std::make_unique<GameInteractionEffect::RandomBonks>();
break; break;
// Hurt or Heal Link // Hurt or Heal Link
case kEffectEmptyHeart: case kEffectEmptyHeart:
effect->giEffect = new GameInteractionEffect::ModifyHealth(); effect->giEffect = std::make_unique<GameInteractionEffect::ModifyHealth>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = receivedParameter * -1; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
receivedParameter * -1;
break; break;
case kEffectFillHeart: case kEffectFillHeart:
effect->giEffect = new GameInteractionEffect::ModifyHealth(); effect->giEffect = std::make_unique<GameInteractionEffect::ModifyHealth>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = receivedParameter; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
receivedParameter;
break; break;
case kEffectKnockbackLinkWeak: case kEffectKnockbackLinkWeak:
effect->giEffect = new GameInteractionEffect::KnockbackPlayer(); effect->giEffect = std::make_unique<GameInteractionEffect::KnockbackPlayer>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = 1; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] = 1;
break; break;
case kEffectKnockbackLinkStrong: case kEffectKnockbackLinkStrong:
effect->giEffect = new GameInteractionEffect::KnockbackPlayer(); effect->giEffect = std::make_unique<GameInteractionEffect::KnockbackPlayer>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = 3; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] = 3;
break; break;
case kEffectKnockbackLinkMega: case kEffectKnockbackLinkMega:
effect->giEffect = new GameInteractionEffect::KnockbackPlayer(); effect->giEffect = std::make_unique<GameInteractionEffect::KnockbackPlayer>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = 6; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] = 6;
break; break;
case kEffectBurnLink: case kEffectBurnLink:
effect->giEffect = new GameInteractionEffect::BurnPlayer(); effect->giEffect = std::make_unique<GameInteractionEffect::BurnPlayer>();
break; break;
case kEffectFreezeLink: case kEffectFreezeLink:
effect->giEffect = new GameInteractionEffect::FreezePlayer(); effect->giEffect = std::make_unique<GameInteractionEffect::FreezePlayer>();
break; break;
case kEffectElectrocuteLink: case kEffectElectrocuteLink:
effect->giEffect = new GameInteractionEffect::ElectrocutePlayer(); effect->giEffect = std::make_unique<GameInteractionEffect::ElectrocutePlayer>();
break; break;
case kEffectKillLink: case kEffectKillLink:
effect->giEffect = new GameInteractionEffect::SetPlayerHealth(); effect->giEffect = std::make_unique<GameInteractionEffect::SetPlayerHealth>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = 0; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] = 0;
break; break;
// Give Items and Consumables // Give Items and Consumables
case kEffectAddHeartContainer: case kEffectAddHeartContainer:
effect->giEffect = new GameInteractionEffect::ModifyHeartContainers(); effect->giEffect = std::make_unique<GameInteractionEffect::ModifyHeartContainers>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = 1; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] = 1;
break; break;
case kEffectFillMagic: case kEffectFillMagic:
effect->giEffect = new GameInteractionEffect::FillMagic(); effect->giEffect = std::make_unique<GameInteractionEffect::FillMagic>();
break; break;
case kEffectAddRupees: case kEffectAddRupees:
effect->giEffect = new GameInteractionEffect::ModifyRupees(); effect->giEffect = std::make_unique<GameInteractionEffect::ModifyRupees>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = receivedParameter; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
receivedParameter;
break; break;
case kEffectGiveDekuShield: case kEffectGiveDekuShield:
effect->giEffect = new GameInteractionEffect::GiveOrTakeShield(); effect->giEffect = std::make_unique<GameInteractionEffect::GiveOrTakeShield>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = ITEM_SHIELD_DEKU; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] = ITEM_SHIELD_DEKU;
break; break;
case kEffectGiveHylianShield: case kEffectGiveHylianShield:
effect->giEffect = new GameInteractionEffect::GiveOrTakeShield(); effect->giEffect = std::make_unique<GameInteractionEffect::GiveOrTakeShield>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = ITEM_SHIELD_HYLIAN; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
ITEM_SHIELD_HYLIAN;
break; break;
case kEffectRefillSticks: case kEffectRefillSticks:
effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); effect->giEffect = std::make_unique<GameInteractionEffect::AddOrTakeAmmo>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = receivedParameter; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[1] = ITEM_STICK; receivedParameter;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[1] = ITEM_STICK;
break; break;
case kEffectRefillNuts: case kEffectRefillNuts:
effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); effect->giEffect = std::make_unique<GameInteractionEffect::AddOrTakeAmmo>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = receivedParameter; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[1] = ITEM_NUT; receivedParameter;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[1] = ITEM_NUT;
break; break;
case kEffectRefillBombs: case kEffectRefillBombs:
effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); effect->giEffect = std::make_unique<GameInteractionEffect::AddOrTakeAmmo>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = receivedParameter; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[1] = ITEM_BOMB; receivedParameter;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[1] = ITEM_BOMB;
break; break;
case kEffectRefillSeeds: case kEffectRefillSeeds:
effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); effect->giEffect = std::make_unique<GameInteractionEffect::AddOrTakeAmmo>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = receivedParameter; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[1] = ITEM_SLINGSHOT; receivedParameter;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[1] = ITEM_SLINGSHOT;
break; break;
case kEffectRefillArrows: case kEffectRefillArrows:
effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); effect->giEffect = std::make_unique<GameInteractionEffect::AddOrTakeAmmo>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = receivedParameter; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[1] = ITEM_BOW; receivedParameter;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[1] = ITEM_BOW;
break; break;
case kEffectRefillBombchus: case kEffectRefillBombchus:
effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); effect->giEffect = std::make_unique<GameInteractionEffect::AddOrTakeAmmo>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = receivedParameter; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[1] = ITEM_BOMBCHU; receivedParameter;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[1] = ITEM_BOMBCHU;
break; break;
// Take Items and Consumables // Take Items and Consumables
case kEffectRemoveHeartContainer: case kEffectRemoveHeartContainer:
effect->giEffect = new GameInteractionEffect::ModifyHeartContainers(); effect->giEffect = std::make_unique<GameInteractionEffect::ModifyHeartContainers>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = -1; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] = -1;
break; break;
case kEffectEmptyMagic: case kEffectEmptyMagic:
effect->giEffect = new GameInteractionEffect::EmptyMagic(); effect->giEffect = std::make_unique<GameInteractionEffect::EmptyMagic>();
break; break;
case kEffectRemoveRupees: case kEffectRemoveRupees:
effect->giEffect = new GameInteractionEffect::ModifyRupees(); effect->giEffect = std::make_unique<GameInteractionEffect::ModifyRupees>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = receivedParameter * -1; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
receivedParameter * -1;
break; break;
case kEffectTakeDekuShield: case kEffectTakeDekuShield:
effect->giEffect = new GameInteractionEffect::GiveOrTakeShield(); effect->giEffect = std::make_unique<GameInteractionEffect::GiveOrTakeShield>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = -ITEM_SHIELD_DEKU; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
-ITEM_SHIELD_DEKU;
break; break;
case kEffectTakeHylianShield: case kEffectTakeHylianShield:
effect->giEffect = new GameInteractionEffect::GiveOrTakeShield(); effect->giEffect = std::make_unique<GameInteractionEffect::GiveOrTakeShield>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = -ITEM_SHIELD_HYLIAN; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
-ITEM_SHIELD_HYLIAN;
break; break;
case kEffectTakeSticks: case kEffectTakeSticks:
effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); effect->giEffect = std::make_unique<GameInteractionEffect::AddOrTakeAmmo>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = receivedParameter * -1; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[1] = ITEM_STICK; receivedParameter * -1;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[1] = ITEM_STICK;
break; break;
case kEffectTakeNuts: case kEffectTakeNuts:
effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); effect->giEffect = std::make_unique<GameInteractionEffect::AddOrTakeAmmo>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = receivedParameter * -1; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[1] = ITEM_NUT; receivedParameter * -1;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[1] = ITEM_NUT;
break; break;
case kEffectTakeBombs: case kEffectTakeBombs:
effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); effect->giEffect = std::make_unique<GameInteractionEffect::AddOrTakeAmmo>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = receivedParameter * -1; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[1] = ITEM_BOMB; receivedParameter * -1;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[1] = ITEM_BOMB;
break; break;
case kEffectTakeSeeds: case kEffectTakeSeeds:
effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); effect->giEffect = std::make_unique<GameInteractionEffect::AddOrTakeAmmo>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = receivedParameter * -1; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[1] = ITEM_SLINGSHOT; receivedParameter * -1;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[1] = ITEM_SLINGSHOT;
break; break;
case kEffectTakeArrows: case kEffectTakeArrows:
effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); effect->giEffect = std::make_unique<GameInteractionEffect::AddOrTakeAmmo>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = receivedParameter * -1; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[1] = ITEM_BOW; receivedParameter * -1;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[1] = ITEM_BOW;
break; break;
case kEffectTakeBombchus: case kEffectTakeBombchus:
effect->giEffect = new GameInteractionEffect::AddOrTakeAmmo(); effect->giEffect = std::make_unique<GameInteractionEffect::AddOrTakeAmmo>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = receivedParameter * -1; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[1] = ITEM_BOMBCHU; receivedParameter * -1;
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[1] = ITEM_BOMBCHU;
break; break;
// Link Size Modifiers // Link Size Modifiers
case kEffectGiantLink: case kEffectGiantLink:
effect->category = kEffectCatLinkSize; effect->category = kEffectCatLinkSize;
effect->timeRemaining = 30000; effect->timeRemaining = 30000;
effect->giEffect = new GameInteractionEffect::ModifyLinkSize(); effect->giEffect = std::make_unique<GameInteractionEffect::ModifyLinkSize>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = GI_LINK_SIZE_GIANT; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
GI_LINK_SIZE_GIANT;
break; break;
case kEffectMinishLink: case kEffectMinishLink:
effect->category = kEffectCatLinkSize; effect->category = kEffectCatLinkSize;
effect->timeRemaining = 30000; effect->timeRemaining = 30000;
effect->giEffect = new GameInteractionEffect::ModifyLinkSize(); effect->giEffect = std::make_unique<GameInteractionEffect::ModifyLinkSize>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = GI_LINK_SIZE_MINISH; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
GI_LINK_SIZE_MINISH;
break; break;
case kEffectPaperLink: case kEffectPaperLink:
effect->category = kEffectCatLinkSize; effect->category = kEffectCatLinkSize;
effect->timeRemaining = 30000; effect->timeRemaining = 30000;
effect->giEffect = new GameInteractionEffect::ModifyLinkSize(); effect->giEffect = std::make_unique<GameInteractionEffect::ModifyLinkSize>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = GI_LINK_SIZE_PAPER; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
GI_LINK_SIZE_PAPER;
break; break;
case kEffectSquishedLink: case kEffectSquishedLink:
effect->category = kEffectCatLinkSize; effect->category = kEffectCatLinkSize;
effect->timeRemaining = 30000; effect->timeRemaining = 30000;
effect->giEffect = new GameInteractionEffect::ModifyLinkSize(); effect->giEffect = std::make_unique<GameInteractionEffect::ModifyLinkSize>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = GI_LINK_SIZE_SQUISHED; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
GI_LINK_SIZE_SQUISHED;
break; break;
case kEffectInvisibleLink: case kEffectInvisibleLink:
effect->category = kEffectCatLinkSize; effect->category = kEffectCatLinkSize;
effect->timeRemaining = 30000; effect->timeRemaining = 30000;
effect->giEffect = new GameInteractionEffect::InvisibleLink(); effect->giEffect = std::make_unique<GameInteractionEffect::InvisibleLink>();
break; break;
// Generic Effects // Generic Effects
case kEffectRandomBombTimer: case kEffectRandomBombTimer:
effect->category = kEffectCatRandomBombFuseTimer; effect->category = kEffectCatRandomBombFuseTimer;
effect->timeRemaining = 60000; effect->timeRemaining = 60000;
effect->giEffect = new GameInteractionEffect::RandomBombFuseTimer(); effect->giEffect = std::make_unique<GameInteractionEffect::RandomBombFuseTimer>();
break; break;
case kEffectSetTimeToDawn: case kEffectSetTimeToDawn:
effect->giEffect = new GameInteractionEffect::SetTimeOfDay(); effect->giEffect = std::make_unique<GameInteractionEffect::SetTimeOfDay>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = GI_TIMEOFDAY_DAWN; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
GI_TIMEOFDAY_DAWN;
break; break;
case kEffectSetTimeToDusk: case kEffectSetTimeToDusk:
effect->giEffect = new GameInteractionEffect::SetTimeOfDay(); effect->giEffect = std::make_unique<GameInteractionEffect::SetTimeOfDay>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = GI_TIMEOFDAY_DUSK; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
GI_TIMEOFDAY_DUSK;
break; break;
// Visual Effects // Visual Effects
case kEffectNoUi: case kEffectNoUi:
effect->category = kEffectCatUi; effect->category = kEffectCatUi;
effect->timeRemaining = 60000; effect->timeRemaining = 60000;
effect->giEffect = new GameInteractionEffect::NoUI(); effect->giEffect = std::make_unique<GameInteractionEffect::NoUI>();
break; break;
case kEffectRainstorm: case kEffectRainstorm:
effect->category = kEffectCatWeather; effect->category = kEffectCatWeather;
effect->timeRemaining = 30000; effect->timeRemaining = 30000;
effect->giEffect = new GameInteractionEffect::WeatherRainstorm(); effect->giEffect = std::make_unique<GameInteractionEffect::WeatherRainstorm>();
break; break;
case kEffectDebugMode: case kEffectDebugMode:
effect->category = kEffectCatDebugMode; effect->category = kEffectCatDebugMode;
effect->timeRemaining = 30000; effect->timeRemaining = 30000;
effect->giEffect = new GameInteractionEffect::SetCollisionViewer(); effect->giEffect = std::make_unique<GameInteractionEffect::SetCollisionViewer>();
break; break;
case kEffectRandomCosmetics: case kEffectRandomCosmetics:
effect->giEffect = new GameInteractionEffect::RandomizeCosmetics(); effect->giEffect = std::make_unique<GameInteractionEffect::RandomizeCosmetics>();
break; break;
// Controls // Controls
case kEffectNoZButton: case kEffectNoZButton:
effect->category = kEffectCatNoZ; effect->category = kEffectCatNoZ;
effect->timeRemaining = 30000; effect->timeRemaining = 30000;
effect->giEffect = new GameInteractionEffect::DisableZTargeting(); effect->giEffect = std::make_unique<GameInteractionEffect::DisableZTargeting>();
break; break;
case kEffectReverseControls: case kEffectReverseControls:
effect->category = kEffectCatReverseControls; effect->category = kEffectCatReverseControls;
effect->timeRemaining = 60000; effect->timeRemaining = 60000;
effect->giEffect = new GameInteractionEffect::ReverseControls(); effect->giEffect = std::make_unique<GameInteractionEffect::ReverseControls>();
break; break;
case kEffectPacifistMode: case kEffectPacifistMode:
effect->category = kEffectCatPacifist; effect->category = kEffectCatPacifist;
effect->timeRemaining = 15000; effect->timeRemaining = 15000;
effect->giEffect = new GameInteractionEffect::PacifistMode(); effect->giEffect = std::make_unique<GameInteractionEffect::PacifistMode>();
break; break;
case kEffectPressRandomButtons: case kEffectPressRandomButtons:
effect->category = kEffectCatRandomButtons; effect->category = kEffectCatRandomButtons;
effect->timeRemaining = 30000; effect->timeRemaining = 30000;
effect->giEffect = new GameInteractionEffect::PressRandomButton(); effect->giEffect = std::make_unique<GameInteractionEffect::PressRandomButton>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = 30; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] = 30;
break; break;
case kEffectClearCbuttons: case kEffectClearCbuttons:
effect->giEffect = new GameInteractionEffect::ClearAssignedButtons(); effect->giEffect = std::make_unique<GameInteractionEffect::ClearAssignedButtons>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = GI_BUTTONS_CBUTTONS; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
GI_BUTTONS_CBUTTONS;
break; break;
case kEffectClearDpad: case kEffectClearDpad:
effect->giEffect = new GameInteractionEffect::ClearAssignedButtons(); effect->giEffect = std::make_unique<GameInteractionEffect::ClearAssignedButtons>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = GI_BUTTONS_DPAD; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] = GI_BUTTONS_DPAD;
break; break;
// Teleport Player // Teleport Player
case kEffectTpLinksHouse: case kEffectTpLinksHouse:
effect->giEffect = new GameInteractionEffect::TeleportPlayer(); effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = GI_TP_DEST_LINKSHOUSE; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
GI_TP_DEST_LINKSHOUSE;
break; break;
case kEffectTpMinuet: case kEffectTpMinuet:
effect->giEffect = new GameInteractionEffect::TeleportPlayer(); effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = GI_TP_DEST_MINUET; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
GI_TP_DEST_MINUET;
break; break;
case kEffectTpBolero: case kEffectTpBolero:
effect->giEffect = new GameInteractionEffect::TeleportPlayer(); effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = GI_TP_DEST_BOLERO; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
GI_TP_DEST_BOLERO;
break; break;
case kEffectTpSerenade: case kEffectTpSerenade:
effect->giEffect = new GameInteractionEffect::TeleportPlayer(); effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = GI_TP_DEST_SERENADE; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
GI_TP_DEST_SERENADE;
break; break;
case kEffectTpRequiem: case kEffectTpRequiem:
effect->giEffect = new GameInteractionEffect::TeleportPlayer(); effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = GI_TP_DEST_REQUIEM; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
GI_TP_DEST_REQUIEM;
break; break;
case kEffectTpNocturne: case kEffectTpNocturne:
effect->giEffect = new GameInteractionEffect::TeleportPlayer(); effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = GI_TP_DEST_NOCTURNE; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
GI_TP_DEST_NOCTURNE;
break; break;
case kEffectTpPrelude: case kEffectTpPrelude:
effect->giEffect = new GameInteractionEffect::TeleportPlayer(); effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect)->parameters[0] = GI_TP_DEST_PRELUDE; dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
GI_TP_DEST_PRELUDE;
break; break;
default: default:

View File

@@ -54,7 +54,7 @@ class CrowdControl : public Network {
uint32_t spawnParams[2]; uint32_t spawnParams[2];
uint32_t category = 0; uint32_t category = 0;
long timeRemaining; long timeRemaining;
GameInteractionEffectBase* giEffect; std::unique_ptr<GameInteractionEffectBase> giEffect;
std::string viewerName; std::string viewerName;
// Metadata used while executing (only for timed effects) // Metadata used while executing (only for timed effects)