Beispiel #1
0
        public BattleDecision CalculateAction(Combatant character)
        {
            var decision = new BattleDecision();

            decision.Destination = new Point((int)character.Avatar.Location.X, (int)character.Avatar.Location.Y);

            if (_threat.Count == 0)
            {
                return(decision);
            }

            // find the enemy with the highest threat
            var enemy = (from ckv in _threat orderby ckv.Value descending select ckv.Key).First();

            // find the point that brings you closest to them
            var grid = character.GetMovementGrid(BattleBoard.GetAccessibleGrid(character.Faction));

            var distance = 65535;

            for (var x = 0; x < grid.Size.Width; x++)
            {
                for (var y = 0; y < grid.Size.Height; y++)
                {
                    if (grid.Weight[x, y] != 1)
                    {
                        continue;
                    }

                    var d = BattleBoard.Sandbag.Pathfind(
                        new Point(x, y),
                        new Point((int)enemy.Avatar.Location.X, (int)enemy.Avatar.Location.Y)
                        ).Count();

                    if (d >= distance || d > 2 || BattleBoard.GetCharacterAt(new Point(x, y)) != null)
                    {
                        continue;
                    }

                    decision.Destination = new Point(x, y);
                    distance             = d;
                }
            }

            var ability = Ability.Factory(_game, "attack");

            ability.Character = character;

            // attack
            decision.Command = new Command
            {
                Ability   = ability,
                Character = character,
                Target    = new Point((int)enemy.Avatar.Location.X, (int)enemy.Avatar.Location.Y)
            };

            return(decision);
        }
Beispiel #2
0
        public BattleDecision CalculateAction(Combatant character)
        {
            var decision = new BattleDecision();
            decision.Destination = new Point((int)character.Avatar.Location.X, (int)character.Avatar.Location.Y);

            if (_threat.Count == 0) return decision;

            // find the enemy with the highest threat
            var enemy = (from ckv in _threat orderby ckv.Value descending select ckv.Key).First();

            // find the point that brings you closest to them
            var grid = character.GetMovementGrid(BattleBoard.GetAccessibleGrid(character.Faction));

            var distance = 65535;
            for (var x = 0; x < grid.Size.Width; x++)
            {
                for (var y = 0; y < grid.Size.Height; y++)
                {
                    if (grid.Weight[x, y] != 1) continue;

                    var d = BattleBoard.Sandbag.Pathfind(
                        new Point(x, y),
                        new Point((int)enemy.Avatar.Location.X, (int)enemy.Avatar.Location.Y)
                    ).Count();

                    if (d >= distance || d > 2 || BattleBoard.GetCharacterAt(new Point(x, y)) != null) continue;

                    decision.Destination = new Point(x, y);
                    distance = d;
                }
            }

            var ability = Ability.Factory(_game, "attack");
            ability.Character = character;

            // attack
            decision.Command = new Command
                {
                    Ability = ability,
                    Character = character,
                    Target = new Point((int)enemy.Avatar.Location.X, (int)enemy.Avatar.Location.Y)
                };

            return decision;
        }