public CombatSimulationActor(CombatSimulation sim, char faction, int numInFaction, int remainingHealth, int attackPower, int initialX, int initialY) { this.Id = faction.ToString() + numInFaction; this.Sim = sim; this.Faction = faction; this.RemainingHealth = remainingHealth; this.AttackPower = attackPower; this.X = initialX; this.Y = initialY; }
public static bool RequestPathFromTile(CombatSimulation sim, CombatSimulationTile startTile, CombatSimulationTile targetTile, List <CombatSimulationTile> bestPath) { // Clear our initial state _costs.Clear(); _frontier.Clear(); _pathInProgress.Clear(); _scratch.Clear(); bestPath.Clear(); _frontier.Add(startTile); _costs[startTile] = 0; _pathInProgress[startTile] = null; do { _frontier.Sort(delegate(CombatSimulationTile tA, CombatSimulationTile tB) { return((_costs[tA] + Distance(tA, targetTile)).CompareTo(_costs[tB] + Distance(tB, targetTile))); //if (distCompare != 0) //{ // return distCompare; //} return(tA.TileIndex.CompareTo(tB.TileIndex)); }); CombatSimulationTile currentTile = _frontier[0]; if (currentTile == targetTile) { break; } _frontier.RemoveAt(0); sim.GetUnoccupiedTilesNearTile(currentTile, _scratch); foreach (var neighbor in _scratch) { int navCost = 0; _costs.TryGetValue(currentTile, out navCost); navCost++; int knownCost = 0; if (!_costs.TryGetValue(neighbor, out knownCost)) { knownCost = Int32.MaxValue; } if (navCost < knownCost) { _costs[neighbor] = navCost; _pathInProgress[neighbor] = currentTile; _frontier.Add(neighbor); } } } while (_frontier.Count > 0); if (_pathInProgress.ContainsKey(targetTile)) { var next = targetTile; while (next != startTile) { bestPath.Add(next); next = _pathInProgress[next]; } bestPath.Reverse(); return(true); } return(false); }