public static AvoidanceVector Combine(AvoidanceVector a, AvoidanceVector b) { if (a.Magnitude <= 0) { return(b); } if (b.Magnitude <= 0) { return(a); } float heading = (a.Heading + b.Heading) / 2f; float magnitude = Math.Max(a.Magnitude, b.Magnitude); return(new AvoidanceVector(heading, magnitude, a.FinishOnDistance && b.FinishOnDistance)); }
public RunStatus Update() { var characters = GameObjectManager.GetObjectsOfType <BattleCharacter>() .ToList(); spellCasts.RemoveAll(sc => !characters.Contains(sc.Caster) || sc.Caster.IsDead || SpellExpired(sc) || !sc.Caster.IsValid); var newCasts = GetNewCasts(characters); spellCasts.AddRange(newCasts); UnknownCast = GetNewUnknownCast(newCasts); var newAvoidableCasts = GetNewAvoidable(newCasts); castsBeingAvoided.AddRange(newAvoidableCasts.Select(t => t.Item1)); var updatedVector = CurrentVector.GetUpdatedVector(); var newVectors = newAvoidableCasts.Select(t => t.Item2).ToList(); CurrentVector = newVectors.Count > 0 ? newVectors.Aggregate(updatedVector, VectorTools.Combine) : updatedVector; return(RunStatus.Success); }