Exemple #1
0
        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;
        }
Exemple #2
0
        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;
        }
Exemple #3
0
        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);
            }
        }