private void FindWaysToAllTowns(IPlayer player) { if (PathNode.GetIsValid() && PathNode.GetPlayerReference() == player) return; PathNode.SetIsValid(false); for (int loop1 = 1; loop1 <= GetMaxTownID(); loop1++) { TownModel town = (TownModel)GetITownByID(loop1); town.ClearNodePath(); } for (int loop1 = 1; loop1 <= GetMaxRoadID(); loop1++) { RoadModel road = (RoadModel) GetIRoadByID(loop1); road.ClearNodePath(); } Queue<TownModel> openList = new Queue<TownModel>(); List<ITown> buildedTowns = player.GetTown(); foreach (ITown itown in buildedTowns) { TownModel town = (TownModel)itown; town.SetPathNode(0, null, null); openList.Enqueue(town); } List<IRoad> buildedRoads = player.GetRoad(); foreach (IRoad road in buildedRoads) { TownModel town; RoadModel roadM = (RoadModel) road; roadM.SetPathNode(0, null, null); foreach(ITown itown in road.GetITown()) { town = (TownModel)itown; if (town.GetPathNode().GetDistance() == PathNode.INFINITY && (!town.GetIsBuild() || town.GetIOwner() == player)) { town.SetPathNode(0, null, null); openList.Enqueue(town); } } } while (openList.Count > 0) { TownModel ancestor = openList.Dequeue(); int dst = ancestor.GetPathNode().GetDistance(); for(byte loop1 = 0; loop1 < 3; loop1++) { IRoad road = ancestor.GetIRoad(loop1); if (road != null && !road.GetIsBuild()) { RoadModel roadM = (RoadModel)road; roadM.SetPathNode(dst + 1, ancestor, ancestor.GetPathNode().GetAncestorRoad()); foreach (ITown itown in road.GetITown()) { if (itown != null && itown.GetTownID() != ancestor.GetTownID() && itown.GetIOwner() == null) { TownModel town = (TownModel)itown; if (!openList.Contains(town) && town.GetPathNode().GetDistance() == PathNode.INFINITY) { town.SetPathNode(dst + 1, ancestor, road); openList.Enqueue(town); } } } } } } PathNode.SetIsValid(true); PathNode.SetPlayerReference(player); }