Loading

Paste #pptgbn3aq

  1.     //find road way between fromTile and toTile
  2.     function buildRoad(fromTile, toTile) {
  3.         //can store road tiles into array
  4.         local builtTiles = [];
  5.  
  6.         if (fromTile != toTile) {
  7.             //* Print the names of the towns we'll try to connect. */
  8.             AILog.Info("Connecting " + AITown.GetName(AITile.GetClosestTown(fromTile)) + " and " + AITown.GetName(AITile.GetClosestTown(toTile)));
  9.  
  10.             // Tell OpenTTD we want to build normal road (no tram tracks). */
  11.             AIRoad.SetCurrentRoadType(AIRoad.ROADTYPE_ROAD);
  12.  
  13.             // Create an instance of the pathfinder. */
  14.             local pathfinder = RoadPathFinder();
  15. /*defaults*/
  16. /*10000000*/pathfinder.cost.max_cost;
  17. /*100*/     pathfinder.cost.tile;
  18. /*40*/      pathfinder.cost.no_existing_road;
  19. /*100*/     pathfinder.cost.turn;
  20. /*100*/     pathfinder.cost.slope;
  21. /*150*/     pathfinder.cost.bridge_per_tile;
  22. /*120*/     pathfinder.cost.tunnel_per_tile;
  23. /*20*/      pathfinder.cost.coast;
  24. /*10*/      pathfinder.cost.max_bridge_length = AIGameSettings.GetValue("max_bridge_length") + 2;
  25. /*20*/      pathfinder.cost.max_tunnel_length = AIGameSettings.GetValue("max_tunnel_length") + 2;
  26.  
  27.             // Give the source and goal tiles to the pathfinder. */
  28.             pathfinder.InitializePath([fromTile], [toTile]);
  29.             local path = false;
  30.             local counter = 0;
  31.             while (path == false && counter < 250) {
  32.                 ++counter;
  33.                 path = pathfinder.FindPath(100);
  34.                 AIController.Sleep(1);
  35.             }
  36.  
  37.             if (path == false || path == null) {
  38.                 // No path was found. */
  39.                 AILog.Error("pathfinder: FindPath return null");
  40.                 return null;
  41.             }
  42.  
  43.             AILog.Info("Path found! Building road...");
  44. //          local costs = AIAccounting();
  45.             // If a path was found, build a road over it. */
  46.             while (path != null) {
  47.                 local par = path.GetParent();
  48.                 if (par != null) {
  49.                     local last_node = path.GetTile();
  50.  
  51.                     if (AIMap.DistanceManhattan(path.GetTile(), par.GetTile()) == 1) {
  52.                         local counter = 0;
  53.                         do {
  54. //                          if(!AIRoad.BuildRoad(path.GetTile(), par.GetTile())) {
  55.                             if(!TestBuildRoad().TryBuild(path.GetTile(), par.GetTile())) {
  56.                                 if(AIError.GetLastErrorString() == "ERR_ALREADY_BUILT") {
  57.                                     AILog.Warning("We found a road already built at tiles " + path.GetTile() + " - " + par.GetTile());
  58.                                     break;
  59.                                 }
  60.                                 else {
  61.                                     ++counter;
  62.                                 }
  63.                             }
  64.                             else {
  65.                                 AILog.Warning("We built a road at tiles " + path.GetTile() + " - " + par.GetTile());
  66.                                 break;
  67.                             }
  68.  
  69.                             AIController.Sleep(1);
  70.                         } while(counter < 500);
  71.  
  72.                         if(counter == 500) {
  73.                             AILog.Warning("Couldn't build road! " + AIError.GetLastErrorString());
  74.                             return null;
  75.                         }
  76.  
  77.                         //add road piece into the road array
  78.                         builtTiles.append(RoadTile(path.GetTile(), RoadTileTypes.ROAD));
  79.                     }
  80.                     else {
  81.                         // Build a bridge or tunnel. */
  82.                         if (!AIBridge.IsBridgeTile(path.GetTile()) && !AITunnel.IsTunnelTile(path.GetTile())) {
  83.                             // If it was a road tile, demolish it first. Do this to work around expended roadbits. */
  84.                             if (AIRoad.IsRoadTile(path.GetTile())) {
  85. //                              AITile.DemolishTile(path.GetTile());
  86.                                 TestDemolishTile().TryDemolish(path.GetTile());
  87.                                 AILog.Warning("We demolished a road at tile " + path.GetTile());
  88.                             }
  89.                             if (AITunnel.GetOtherTunnelEnd(path.GetTile()) == par.GetTile()) {
  90.                                 local counter = 0;
  91.                                 do {
  92. //                                  if (!AITunnel.BuildTunnel(AIVehicle.VT_ROAD, path.GetTile())) {
  93.                                     if (!TestBuildTunnel().TryBuild(AIVehicle.VT_ROAD, path.GetTile())) {
  94.                                         if(AIError.GetLastErrorString() == "ERR_ALREADY_BUILT") {
  95.                                             AILog.Warning("We found a tunnel already built at tiles " + path.GetTile() + " - " + par.GetTile());
  96.                                             break;
  97.                                         }
  98.                                         else {
  99.                                             ++counter;
  100.                                         }
  101.                                     }
  102.                                     else {
  103.                                         AILog.Warning("We built a tunnel at tiles " + path.GetTile() + " - " + par.GetTile());
  104.                                         break;
  105.                                     }
  106.  
  107.                                     AIController.Sleep(1);
  108.                                 } while(counter < 500);
  109.  
  110.                                 if(counter == 500) {
  111.                                     AILog.Warning("Couldn't build tunnel! " + AIError.GetLastErrorString());
  112.                                     return null;
  113.                                 }
  114.  
  115.                                 builtTiles.append(RoadTile(path.GetTile(), RoadTileTypes.TUNNEL));
  116.  
  117.                             }
  118.                             else {
  119.                                 local bridge_list = AIBridgeList_Length(AIMap.DistanceManhattan(path.GetTile(), par.GetTile()) + 1);
  120.                                 bridge_list.Valuate(AIBridge.GetMaxSpeed);
  121.                                 bridge_list.Sort(AIAbstractList.SORT_BY_VALUE, false);
  122.                                 local counter = 0;
  123.                                 do {
  124. //                                  if (!AIBridge.BuildBridge(AIVehicle.VT_ROAD, bridge_list.Begin(), path.GetTile(), par.GetTile())) {
  125.                                     if (!TestBuildBridge().TryBuild(AIVehicle.VT_ROAD, bridge_list.Begin(), path.GetTile(), par.GetTile())) {
  126.                                         if(AIError.GetLastErrorString() == "ERR_ALREADY_BUILT") {
  127.                                             AILog.Warning("We found a bridge already built at tiles " + path.GetTile() + " - " + par.GetTile());
  128.                                             break;
  129.                                         }
  130.                                         else {
  131.                                             ++counter;
  132.                                         }
  133.                                     }
  134.                                     else {
  135.                                         AILog.Warning("We built a bridge at tiles " + path.GetTile() + " - " + par.GetTile());
  136.                                         break;
  137.                                     }
  138.  
  139.                                     AIController.Sleep(1);
  140.                                 } while(counter < 500);
  141.  
  142.                                 if(counter == 500) {
  143.                                     AILog.Warning("Couldn't build bridge! " + AIError.GetLastErrorString());
  144.                                     return null;
  145.                                 }
  146.  
  147.                                 builtTiles.append(RoadTile(path.GetTile(), RoadTileTypes.BRIDGE, bridge_list.Begin()));
  148.                                 builtTiles.append(RoadTile(par.GetTile(), RoadTileTypes.ROAD));
  149.                             }
  150.                         }
  151.                     }
  152.                 }
  153.                 path = par;
  154.             }
  155. //          AILog.Info("Cost for the road: " + costs.GetCosts());
  156.         }
  157.  
  158.         AILog.Info("Road built!");
  159.         return builtTiles;
  160.     }

Comments