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); }
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; }