public void Reset(CombatantStats stats) { this.combatantStats = stats; this.MovesLeft = stats.MovesPerTurn; this.AttacksLeft = stats.AttacksPerTurn; this.AITurnPlan = null; }
private AITurnPlan CreateTurnPlan() { TileData sourceTileData = combatant.Tile.TileData; AITurnPlan result = new AITurnPlan(combatant); // Formulate Plan // Can we hit anyone without moving? If so, mark them for attack // Then if possible, retreat backwards List <Combatant> targets = BattleDriver.CurrentBattleDriver.Combatants; targets = targets.Where(t => t.TeamId == TeamId.PlayerTeam) // .Where(t => combatant.Stats.IsInAttackRange(sourceTileData, t.Tile.TileData)).ToList(); if (targets.Count > 0) { Combatant preferredTarget = FindBestTargetToHit(targets); return(result.AttackAndEndTurn(preferredTarget.Tile.TileData)); // TODO change to attack and back off } // Can we hit anyone this turn by moving? If so, mark them as our target and move Dictionary <Combatant, TileData> targetToTiledata = FindTargetsInMoveRangeToAttack(); if (targetToTiledata.Count > 0) { Combatant preferredCloseTarget = FindBestTargetToHit(targetToTiledata.Keys.ToList()); return(result.MoveAndAttack(preferredCloseTarget.Tile.TileData, targetToTiledata[preferredCloseTarget])); } // Who is the closest target we can't reach? Move towards them and end turn targetToTiledata = FindTargetsByClosest(); if (targetToTiledata.Count > 0) { Combatant preferredCloseTarget = FindBestTargetToHit(targetToTiledata.Keys.ToList()); // TODO check if path exists List <TileData> path = map.GetShortestPathThreadsafe(combatant.Tile.TileData, targetToTiledata[preferredCloseTarget], TeamId.PlayerTeam); TileData destination = null; // Find how far along the path we can move for (int i = combatant.Stats.Movement; i > 0; i--) { if (path[i].OccupiedTeam == TeamId.NoOccupant) { destination = path[i]; break; } } if (destination != null) { return(result.MoveAndEndTurn(destination)); } } // Nothing we can do return(result.EndTurn()); }
private AITurnPlan CreateTurnPlan() { TileData sourceTileData = combatant.Tile.TileData; AITurnPlan result = new AITurnPlan(combatant); // Formulate Plan // Can we hit anyone without moving? If so, mark them for attack // Then if possible, retreat backwards List<Combatant> targets = BattleDriver.CurrentBattleDriver.Combatants; targets = targets.Where(t => t.TeamId == TeamId.PlayerTeam) // .Where(t => combatant.Stats.IsInAttackRange(sourceTileData, t.Tile.TileData)).ToList(); if (targets.Count > 0) { Combatant preferredTarget = FindBestTargetToHit(targets); return result.AttackAndEndTurn(preferredTarget.Tile.TileData); // TODO change to attack and back off } // Can we hit anyone this turn by moving? If so, mark them as our target and move Dictionary<Combatant, TileData> targetToTiledata = FindTargetsInMoveRangeToAttack(); if (targetToTiledata.Count > 0) { Combatant preferredCloseTarget = FindBestTargetToHit(targetToTiledata.Keys.ToList()); return result.MoveAndAttack(preferredCloseTarget.Tile.TileData, targetToTiledata[preferredCloseTarget]); } // Who is the closest target we can't reach? Move towards them and end turn targetToTiledata = FindTargetsByClosest(); if (targetToTiledata.Count > 0) { Combatant preferredCloseTarget = FindBestTargetToHit(targetToTiledata.Keys.ToList()); // TODO check if path exists List<TileData> path = map.GetShortestPathThreadsafe(combatant.Tile.TileData, targetToTiledata[preferredCloseTarget], TeamId.PlayerTeam); TileData destination = null; // Find how far along the path we can move for (int i = combatant.Stats.Movement; i > 0; i--) { if (path[i].OccupiedTeam == TeamId.NoOccupant) { destination = path[i]; break; } } if (destination != null) { return result.MoveAndEndTurn(destination); } } // Nothing we can do return result.EndTurn(); }
public TurnStats() { MovesLeft = 0; AttacksLeft = 0; this.AITurnPlan = null; }