Overhaul DelayedEffect to support application to multiple targets

Fix DelayedEffect being unusable by monsters due to monsters calling Single Target Apply in their Attack, which DelayedEffect doesn't override, by making Apply (single target) call Apply (multiple targets) which THEN calls the protected Apply function.
Nerf Amanitin to require two injections to be lethal. First injection only stops oxygen from regenerating and slightly saps HP.
Add Cause of Death to Health HUD
This commit is contained in:
Alex Noir
2017-12-21 21:40:54 +03:00
parent b9e0c97c9d
commit 9251dbf83a
5 changed files with 37 additions and 36 deletions
@@ -3,23 +3,19 @@ using System.Xml.Linq;
namespace Barotrauma
{
class DelayedListElement
{
public DelayedEffect Parent;
public Entity Entity;
public List<ISerializableEntity> Targets;
public float StartTimer;
}
class DelayedEffect : StatusEffect
{
public static List<DelayedEffect> List = new List<DelayedEffect>();
public static List<DelayedListElement> List = new List<DelayedListElement>();
private float delay;
private float startTimer;
private Entity entity;
private List<ISerializableEntity> targets;
public float StartTimer
{
get { return startTimer; }
}
public DelayedEffect(XElement element)
: base(element)
{
@@ -29,24 +25,28 @@ namespace Barotrauma
public override void Apply(ActionType type, float deltaTime, Entity entity, List<ISerializableEntity> targets)
{
if (this.type != type) return;
startTimer = delay;
this.entity = entity;
DelayedListElement element = new DelayedListElement();
element.Parent = this;
element.StartTimer = delay;
element.Entity = entity;
element.Targets = targets;
this.targets = targets;
List.Add(this);
List.Add(element);
}
public void Update(float deltaTime)
public static void Update(float deltaTime)
{
startTimer -= deltaTime;
for (int i = DelayedEffect.List.Count - 1; i >= 0; i--)
{
DelayedListElement element = DelayedEffect.List[i];
if (startTimer > 0.0f) return;
element.StartTimer -= deltaTime;
base.Apply(1.0f, entity, targets);
List.Remove(this);
if (element.StartTimer > 0.0f) continue;
element.Parent.Apply(1.0f, element.Entity, element.Targets);
List.Remove(element);
}
}
}
}
}