示例#1
0
 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();
    }
示例#4
0
 public TurnStats()
 {
     MovesLeft       = 0;
     AttacksLeft     = 0;
     this.AITurnPlan = null;
 }