Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion Assembly-CSharp/ActorStatus.cs
Original file line number Diff line number Diff line change
Expand Up @@ -609,7 +609,13 @@ private void HandleStatusImmunityChangeForEffects(StatusType status, bool gained
&& effect.CanBeDispelledByStatusImmunity()
&& !effectsToRemove.Contains(effect))
{
effectsToRemove.Add(effect);
// custom - attempt to dispel slow/root, remove the whole effect if failed
if (!effect.DispelMovementDebuff())
{
effectsToRemove.Add(effect);
}
// rogues
// effectsToRemove.Add(effect);
}
}

Expand Down
9 changes: 9 additions & 0 deletions Assembly-CSharp/Effect.cs
Original file line number Diff line number Diff line change
Expand Up @@ -720,12 +720,21 @@ public virtual bool HasDispellableMovementDebuff()
{
return false;
}

// custom
public virtual bool DispelMovementDebuff()
{
return false;
}

// TODO EFFECTS Not dispelling can break things
// (e.g. movement range won't update if your Unstoppable wears off but you still have Slow underneath it)
public virtual bool CanBeDispelledByStatusImmunity()
{
return true;
}

// TODO EFFECTS Should be used to merge buffs and debuffs applied on the same phase?
public virtual bool WillApplyStatus(StatusType status)
{
return false;
Expand Down
64 changes: 61 additions & 3 deletions Assembly-CSharp/StandardActorEffect.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ public class StandardActorEffect : Effect
private bool m_shouldPlaySequences = true;
private List<StatusType> m_statusAdded = new List<StatusType>();
private List<StatusType> m_statusesToAddOnTurnStart = new List<StatusType>();
private List<AbilityStatMod> m_statModsApplied = new List<AbilityStatMod>();
private int m_absorbToAddOnTurnStart;
private bool m_canBeDispelledByStatus;

Expand Down Expand Up @@ -225,6 +226,7 @@ private void AddMods()
{
if (abilityStatMod.stat != StatType.INVALID)
{
m_statModsApplied.Add(abilityStatMod); // custom
actorStats.AddStatMod(abilityStatMod.stat, abilityStatMod.modType, abilityStatMod.modValue);
}
// rogues
Expand Down Expand Up @@ -302,7 +304,11 @@ private void RemoveMods()
ActorStats actorStats = Target.GetActorStats();
// rogues
//EquipmentStats equipmentStats = Target.GetEquipmentStats();
foreach (AbilityStatMod abilityStatMod in m_data.m_statMods)

// custom
foreach (AbilityStatMod abilityStatMod in m_statModsApplied)
// rogues
// foreach (AbilityStatMod abilityStatMod in m_data.m_statMods)
{
if (abilityStatMod.stat != StatType.INVALID)
{
Expand Down Expand Up @@ -692,7 +698,9 @@ public override bool ShouldEndEarly()

public override bool HasDispellableMovementDebuff()
{
foreach (AbilityStatMod abilityStatMod in m_data.m_statMods)
foreach (AbilityStatMod abilityStatMod in m_statModsApplied)
// rogues
// foreach (AbilityStatMod abilityStatMod in m_data.m_statMods)
{
if (abilityStatMod.stat != StatType.Movement_Horizontal)
{
Expand All @@ -709,7 +717,10 @@ public override bool HasDispellableMovementDebuff()
}
}

foreach (StatusType statusChange in m_data.m_statusChanges)
// custom
foreach (StatusType statusChange in m_statusAdded)
// rogues
// foreach (StatusType statusChange in m_data.m_statusChanges)
{
if (ActorStatus.IsDispellableMovementDebuff(statusChange))
{
Expand All @@ -720,6 +731,53 @@ public override bool HasDispellableMovementDebuff()
return false;
}

// custom -- see also HasDispellableMovementDebuff
public override bool DispelMovementDebuff()
{
List<AbilityStatMod> statModsToRemove = new List<AbilityStatMod>();
foreach (AbilityStatMod abilityStatMod in m_statModsApplied)
{
if (abilityStatMod.stat != StatType.Movement_Horizontal)
{
continue;
}

bool isDebuff = abilityStatMod.modType == ModType.Multiplier
? abilityStatMod.modValue < 1f
: abilityStatMod.modValue < 0f;

if (isDebuff)
{
statModsToRemove.Add(abilityStatMod);
}
}

ActorStats actorStats = Target.GetActorStats();
foreach (AbilityStatMod abilityStatMod in statModsToRemove)
{
m_statModsApplied.Remove(abilityStatMod);
actorStats.RemoveStatMod(abilityStatMod.stat, abilityStatMod.modType, abilityStatMod.modValue);
}

List<StatusType> statusesToRemove = new List<StatusType>();
foreach (StatusType statusChange in m_statusAdded)
{
if (ActorStatus.IsDispellableMovementDebuff(statusChange))
{
statusesToRemove.Add(statusChange);
}
}

ActorStatus actorStatus = Target.GetComponent<ActorStatus>();
foreach (StatusType statusType in statusesToRemove)
{
m_statusAdded.Remove(statusType);
actorStatus.RemoveStatus(statusType);
}

return true;
}

public void OverrideCanBeDispelledByStatusImmunity(bool canBeDispelled)
{
if (m_canBeDispelledByStatus != canBeDispelled)
Expand Down