private bool ValidLocationAreaTarget(Actor actor, Actor target, Ability ability, Vector2 location) { if (target.Faction == actor.Faction && ability.TargettingType == TargettingTypes.Hostile) return false; if (target.Faction != actor.Faction && ability.TargettingType == TargettingTypes.Friendly) return false; if (target.Faction == actor.Faction && ability.TargettingType == TargettingTypes.Location) return false; if (target.DistanceFrom(location) <= ability.Area + target.Radius) return true; return false; }
private bool ValidPointBlankAreaTarget(Actor actor, Actor target, Ability ability) { if (target.Faction == actor.Faction && ability.TargettingType == TargettingTypes.Hostile) return false; if (target.Faction != actor.Faction && ability.TargettingType == TargettingTypes.Friendly) return false; if (target.DistanceFrom(actor) <= ability.Area + target.Radius) return true; return false; }
private void RunActor(float deltaTime, Turn turn, Actor actor) { // Aggro radius threat list calculations foreach (var other in Actors.Where(ba => ba.IsAlive)) { var aggroRadius = 10f; // TODO: Remove hard coded aggro radius if (actor.DistanceFrom(other) < aggroRadius) actor.ThreatList.Add(other); } // Drop dead actors from threat lists actor.ThreatList.RemoveAll(t => !t.Actor.IsAlive); // Drop dead targets from order lists actor.Orders.RemoveAll(o => o.HasExpired()); while (actor.Targets.Any() && !actor.Targets.Peek().IsAlive) actor.Targets.Dequeue(); // TODO: Remove hard coded mana regen actor.CurrentMana += 1f * deltaTime; // TODO: Remove hard coded energy regen actor.CurrentEnergy += 10f * deltaTime; CoolAbilities(deltaTime, actor); RunActorAuras(deltaTime, turn, actor); if (actor.IsAlive) { if (!actor.PlayerControlled) actor.Orders.Clear(); if (!actor.Orders.Any() && actor.CurrentOrder == null) actor.FillOrderQueue(); actor.SelectTarget(Actors.Where(x => x != actor)); actor.PickDestination(); if (actor.CastingProgress != null) { RunAbilityCast(deltaTime, turn, actor); } else if (actor.Destination != null) { actor.Move(deltaTime, Actors.Where(x => x.IsAlive && x != actor)); } else { if (actor.Orders.Any()) { var order = actor.Orders.First(); if (UseOrder(turn, actor, order)) { actor.Orders.Remove(order); } } } } else { actor.BaseAnimationState = BaseAnimationState.Dead; } if (actor.IsAlive && actor.CurrentHealth <= 0f) { KillActor(turn, actor); } }