Loading

Paste #pjjkhttos

  1.     function findRoadTileDepot(tile) {
  2.         if(!AIRoad.IsRoadTile(tile)) {
  3.             return null;
  4.         }
  5.  
  6.         local depotTile = null;
  7.        
  8.         local adjacentTiles = Utils.getAdjacentTiles(tile);
  9.         adjacentTiles.Valuate(AIRoad.IsRoadTile);
  10.         adjacentTiles.RemoveValue(1);
  11.  
  12.         local roadTiles = Utils.getAdjacentTiles(tile);
  13.         roadTiles.Valuate(AIRoad.IsRoadTile);
  14.         roadTiles.KeepValue(1);
  15.        
  16.         local roadTile = null;
  17.         for (roadTile = roadTiles.Begin(); roadTiles.HasNext(); roadTile = roatTiles.Next()) {
  18.             if (AIRoad.AreRoadTilesConnected(roadTile, tile)) {
  19.                 break;
  20.             }
  21.         }
  22.         assert(roadTile != null);
  23.        
  24.         for (local adjacentTile = adjacentTiles.Begin(); adjacentTiles.HasNext(); adjacentTile = adjacentTiles.Next()) {
  25.             AILog.Info("roadTile = " + roadTile + "; adjacentTile = " + adjacentTile + "; tile = " + tile);
  26.             if (AIRoad.AreRoadTilesConnected(tile, adjacentTile) || AITile.IsBuildable(adjacentTile) && (AITile.GetSlope(adjacentTile) == AITile.SLOPE_FLAT || !AITile.IsCoastTile(adjacentTile)) &&
  27.                 AIRoad.CanBuildConnectedRoadPartsHere(tile, roadTile, adjacentTile)) {
  28.                 depotTile = adjacentTile;
  29.                 break;
  30.             }
  31.         }
  32.  
  33.         return depotTile;
  34.     }
  35.  
  36.     function buildDepotOnTile(t) {
  37.         local square = AITileList();
  38.         local squareSize = 1;
  39.         square.AddRectangle(Utils.getValidOffsetTile(t, (-1) * squareSize, (-1) * squareSize),
  40.             Utils.getValidOffsetTile(t, squareSize, squareSize));
  41.  
  42.         local depotTile = findRoadTileDepot(t);
  43.         local depotFrontTile = t;
  44.  
  45.         if(depotTile != null) {
  46.             local counter = 0;
  47.             do {
  48.                 if (!TestBuildRoadDepot().TryBuild(depotTile, depotFrontTile)) {
  49.                     ++counter;
  50.                 }
  51.                 else {
  52.                     break;
  53.                 }
  54.                 AIController.Sleep(1);
  55.             } while(counter < 1);
  56.            
  57.             if (counter == 1) {
  58.                 return null;
  59.             }
  60.             else {
  61.                 local counter = 0;
  62.                 do {
  63.                     if(!TestBuildRoad().TryBuild(depotTile, depotFrontTile) && AIError.GetLastErrorString() != "ERR_ALREADY_BUILT") {
  64.                         ++counter;
  65.                     }
  66.                     else {
  67.                         break;
  68.                     }
  69.                     AIController.Sleep(1);
  70.                 } while(counter < 500);
  71.                    
  72.                 if (counter == 500) {
  73.                     local counter = 0;
  74.                     do {
  75.                         if (!TestRemoveRoadDepot().TryRemove(depotTile)) {
  76.                             ++counter;
  77.                         }
  78.                         else {
  79.                             break;
  80.                         }
  81.                         AIController.Sleep(1);
  82.                     } while(counter < 500);
  83.                    
  84.                     if (counter == 500) {
  85.                         LuDiAIAfterFix().scheduledRemovals.AddItem(depotTile, 0);
  86.                         return null;
  87.                     }
  88.                     else {
  89.                         return null;
  90.                     }
  91.                 }
  92.                 else {
  93.                     return depotTile;
  94.                 }
  95.             }
  96.         }
  97.     }
  98.  
  99.     function buildDepotOnRoad(roadArray) {
  100.         if(roadArray == null) {
  101.             return null;
  102.         }
  103.  
  104.         local depotTile = null;
  105.  
  106.         //first attempt, build next to the road route
  107.         local arrayMiddleTile = roadArray[roadArray.len() / 2].m_tile;
  108.         local roadTiles = AITileList();
  109.         for (local index = 1; index < roadArray.len() - 1; ++index) {
  110.             roadTiles.AddItem(roadArray[index].m_tile, AIMap.DistanceManhattan(roadArray[index].m_tile, arrayMiddleTile));
  111.         }
  112.         roadTiles.Sort(AIList.SORT_BY_VALUE, AIList.SORT_ASCENDING);
  113.         for (local tile = roadTiles.Begin(); roadTiles.HasNext(); tile = roadTiles.Next()) {
  114.             depotTile = buildDepotOnTile(tile);
  115.             AISign.BuildSign(tile, "x");
  116.             if (depotTile != null) {
  117.                 return depotTile;
  118.             }
  119.         }
  120.  
  121.         local squareSize = AIGameSettings.GetValue("station_spread");
  122.        
  123.         //second attempt, build closer to the destination
  124.         local tileList = AITileList();
  125.  
  126.         tileList.AddRectangle(Utils.getValidOffsetTile(m_stationTo, -1 * squareSize, -1 * squareSize),
  127.             Utils.getValidOffsetTile(m_stationTo, squareSize, squareSize));
  128.            
  129.         tileList.Valuate(AIRoad.IsRoadTile);
  130.         tileList.KeepValue(1);
  131.         tileList.Valuate(AIMap.DistanceManhattan, m_stationTo);
  132.         tileList.Sort(AIList.SORT_BY_VALUE, AIList.SORT_ASCENDING);
  133.  
  134.         for (local tile = tileList.Begin(); tileList.HasNext(); tile = tileList.Next()) {
  135.             depotTile = buildDepotOnTile(tile);
  136.             if (depotTile != null) {
  137.                 return depotTile;
  138.             }
  139.         }
  140.        
  141.         //third attempt, build closer to the source
  142.         tileList.Clear();
  143.  
  144.         tileList.AddRectangle(Utils.getValidOffsetTile(m_stationFrom, -1 * squareSize, -1 * squareSize),
  145.             Utils.getValidOffsetTile(m_stationFrom, squareSize, squareSize));
  146.            
  147.         tileList.Valuate(AIRoad.IsRoadTile);
  148.         tileList.KeepValue(1);
  149.         tileList.Valuate(AIMap.DistanceManhattan, m_stationFrom);
  150.         tileList.Sort(AIList.SORT_BY_VALUE, AIList.SORT_ASCENDING);
  151.  
  152.         for (local tile = tileList.Begin(); tileList.HasNext(); tile = tileList.Next()) {
  153.             depotTile = buildDepotOnTile(tile);
  154.             if (depotTile != null) {
  155.                 return depotTile;
  156.             }
  157.         }
  158.  
  159.         AILog.Warning("Couldn't built road depot!");
  160.         return depotTile;
  161.     }

Comments