Loading

Paste #pyr4ojjgt

  1. function WrightAI::checkAdjacentStation(airportTile, airport_type) {
  2.     if (!AIController.GetSetting("station_spread")) {
  3.         return AIStation.STATION_NEW;
  4.     }
  5.  
  6.     local tileList = AITileList();
  7.     local spreadrectangle = expandAdjacentStationRect(airportTile, airport_type);
  8.     tileList.AddRectangle(spreadrectangle[0], spreadrectangle[1]);
  9.  
  10.     tileList.Valuate(Utils.isTileMyStationWithoutAirport);
  11.     tileList.KeepValue(1);
  12.     tileList.Valuate(AIStation.GetStationID);
  13.  
  14.     local stationList = AIList();
  15.     for(local tile = tileList.Begin(); tileList.HasNext(); tileList.Next()) {
  16.         stationList.AddItem(tileList.GetValue(tile), AITile.GetDistanceManhattanToTile(tile, airportTile));
  17.     }
  18.    
  19.     local spread_rad = AIGameSettings.GetValue("station_spread");
  20.     local airport_x = AIAirport.GetAirportWidth(airport_type);
  21.     local airport_y = AIAirport.GetAirportHeight(airport_type);
  22.    
  23.     local list = AIList();
  24.     list.AddList(stationList);
  25.     for (local stationId = stationList.Begin(); stationList.HasNext(); stationId = stationList.Next()) {
  26.         local stationTiles = AITileList_StationType(stationId, AIStation.STATION_ANY);
  27.         local station_top_x = AIMap.GetTileX(AIBaseStation.GetLocation(stationId));
  28.         local station_top_y = AIMap.GetTileY(AIBaseStation.GetLocation(stationId));
  29.         local station_bot_x = AIMap.GetTileX(AIBaseStation.GetLocation(stationId));
  30.         local station_bot_y = AIMap.GetTileY(AIBaseStation.GetLocation(stationId));
  31.         for (local tile = stationTiles.Begin(); stationTiles.HasNext(); tile = stationTiles.Next()) {
  32.             local tile_x = AIMap.GetTileX(tile);
  33.             local tile_y = AIMap.GetTileY(tile);
  34.             if (tile_x < station_top_x) {
  35.                 station_top_x = tile_x;
  36.             }
  37.             if (tile_x > station_bot_x) {
  38.                 station_bot_x = tile_x;
  39.             }
  40.             if (tile_y < station_top_y) {
  41.                 station_top_y = tile_y;
  42.             }
  43.             if (tile_y > station_bot_y) {
  44.                 station_bot_y = tile_y;
  45.             }
  46.         }
  47.         local st_size_x = station_bot_x - station_top_x + 1;
  48.         local st_size_y = station_bot_y - station_top_y + 1;
  49. //      AILog.Info(AIStation.GetName(stationId) + " station size = " + st_size_x + "*" + st_size_y);
  50.         if (st_size_x + airport_x > spread_rad || st_size_y + airport_y > spread_rad) {
  51.             list.RemoveItem(stationId);
  52.         }
  53.     }
  54.     list.Sort(AIList.SORT_BY_VALUE, true);
  55.  
  56.     local adjacentStation = AIStation.STATION_NEW;
  57.     if(list.Count()) {
  58.         adjacentStation = list.Begin();
  59. //      AILog.Info("adjacentStation = " + AIStation.GetName(adjacentStation) + " ; airportTile = " + AIMap.GetTileX(airportTile) + "," + AIMap.GetTileY(airportTile));
  60.     }
  61.  
  62.     return adjacentStation;
  63. }
  64.  
  65. function WrightAI::expandAdjacentStationRect(airportTile, airport_type) {
  66.     local spread_rad = AIGameSettings.GetValue("station_spread");
  67.     local airport_x = AIAirport.GetAirportWidth(airport_type);
  68.     local airport_y = AIAirport.GetAirportHeight(airport_type);
  69.    
  70.     local remaining_x = spread_rad - airport_x;
  71.     local remaining_y = spread_rad - airport_y;
  72.    
  73.     local tile_top_x = AIMap.GetTileX(airportTile);
  74.     local tile_top_y = AIMap.GetTileY(airportTile);
  75.     local tile_bot_x = AIMap.GetTileX(airportTile) + airport_x - 1;
  76.     local tile_bot_y = AIMap.GetTileY(airportTile) + airport_y - 1;
  77.    
  78.     for (local x = remaining_x; x > 0; x--) {
  79.         if (AIMap.IsValidTile(AIMap.GetTileIndex(tile_top_x - 1, tile_top_y))) {
  80.             tile_top_x = tile_top_x - 1;
  81.         }
  82.         if (AIMap.IsValidTile(AIMap.GetTileIndex(tile_bot_x + 1, tile_bot_y))) {
  83.             tile_bot_x = tile_bot_x + 1;
  84.         }
  85.     }
  86.    
  87.     for (local y = remaining_y; y > 0; y--) {
  88.         if (AIMap.IsValidTile(AIMap.GetTileIndex(tile_top_x, tile_top_y - 1))) {
  89.             tile_top_y = tile_top_y - 1;
  90.         }
  91.         if (AIMap.IsValidTile(AIMap.GetTileIndex(tile_bot_x, tile_bot_y + 1))) {
  92.             tile_bot_y = tile_bot_y + 1;
  93.         }
  94.     }
  95.    
  96. //  AILog.Info("spreadrectangle top = " + tile_top_x + "," + tile_top_y + " ; spreadrectangle bottom = " + tile_bot_x + "," + tile_bot_y);
  97.     return [AIMap.GetTileIndex(tile_top_x, tile_top_y), AIMap.GetTileIndex(tile_bot_x, tile_bot_y)];
  98. }
  99.  
  100. function WrightAI::TownAirportRadRect(airport_type, town_id) {
  101.     local town_rectangle = BuildManager.estimateTownRectangle(town_id);
  102.    
  103.     local town_top_x = AIMap.GetTileX(town_rectangle[0]);
  104.     local town_top_y = AIMap.GetTileY(town_rectangle[0]);  
  105.     local town_bot_x = AIMap.GetTileX(town_rectangle[1]);
  106.     local town_bot_y = AIMap.GetTileY(town_rectangle[1]);
  107. //  AILog.Info("top tile was " + town_top_x + "," + town_top_y + " bottom tile was " + town_bot_x + "," + town_bot_y);
  108.    
  109.     local airport_x = AIAirport.GetAirportWidth(airport_type);
  110.     local airport_y = AIAirport.GetAirportHeight(airport_type);
  111.     local airport_rad = AIAirport.GetAirportCoverageRadius(airport_type);
  112.    
  113.     for (local x = airport_x; x > 1; x--) {
  114.         if (AIMap.IsValidTile(AIMap.GetTileIndex(town_top_x - 1, town_top_y))) {
  115.             town_top_x = town_top_x - 1;
  116.         }
  117.     }
  118.    
  119.     for (local y = airport_y; y > 1; y--) {
  120.         if (AIMap.IsValidTile(AIMap.GetTileIndex(town_top_x, town_top_y - 1))) {
  121.             town_top_y = town_top_y - 1;
  122.         }
  123.     }
  124.    
  125.     for (local r = airport_rad; r > 0; r--) {
  126.         if (AIMap.IsValidTile(AIMap.GetTileIndex(town_top_x - 1, town_top_y))) {
  127.             town_top_x = town_top_x - 1;
  128.         }
  129.         if (AIMap.IsValidTile(AIMap.GetTileIndex(town_top_x, town_top_y - 1))) {
  130.             town_top_y = town_top_y - 1;
  131.         }
  132.         if (AIMap.IsValidTile(AIMap.GetTileIndex(town_bot_x + 1, town_bot_y))) {
  133.             town_bot_x = town_bot_x + 1;
  134.         }
  135.         if (AIMap.IsValidTile(AIMap.GetTileIndex(town_bot_x, town_bot_y + 1))) {
  136.             town_bot_y = town_bot_y + 1;
  137.         }
  138.     }
  139. //  AILog.Info("top tile now " + town_top_x + "," + town_top_y + " bottom tile now " + town_bot_x + "," + town_bot_y);
  140.     return [AIMap.GetTileIndex(town_top_x, town_top_y), AIMap.GetTileIndex(town_bot_x, town_bot_y)];
  141. }
  142.  
  143. ////////////////////////////////////
  144.  
  145.     function estimateTownRectangle(town) {
  146.         local townId = town;
  147.         local townLocation = AITown.GetLocation(town);
  148.         local rectangleIncreaseKoeficient = 1;
  149.  
  150.         local topCornerTile = AITown.GetLocation(town);
  151.         local bottomCornerTile = AITown.GetLocation(town);
  152.  
  153.         local isMaxExpanded = false;
  154.         while(!isMaxExpanded) {
  155.             local maxExpandedCounter = 0;
  156.             for(local i = 0; i < 4; ++i) {
  157.                 switch(i) {
  158.                     case 0:
  159.                         local offsetTile = Utils.getOffsetTile(topCornerTile, (-1) * rectangleIncreaseKoeficient, 0);
  160.  
  161.                         if(offsetTile == AIMap.TILE_INVALID) {
  162.                             ++maxExpandedCounter;
  163.                             continue;
  164.                         }
  165.  
  166.                         if(AITown.IsWithinTownInfluence(town, offsetTile)) {
  167.                             topCornerTile = offsetTile;
  168.                         }
  169. //                        else if(expandRectangle(town, topCornerTile, bottomCornerTile, "NE")) {
  170. //                            topCornerTile = Utils.getOffsetTile(topCornerTile, (-1) * rectangleIncreaseKoeficient, 0);
  171. //                        }
  172.                         else {
  173.                             ++maxExpandedCounter;
  174.                             continue;
  175.                         }
  176.                         break;
  177.  
  178.                     case 1:
  179.                         local offsetTile = Utils.getOffsetTile(bottomCornerTile, 0, rectangleIncreaseKoeficient);
  180.  
  181.                         if(offsetTile == AIMap.TILE_INVALID) {
  182.                             ++maxExpandedCounter;
  183.                             continue;
  184.                         }
  185.  
  186.                         if(AITown.IsWithinTownInfluence(town, offsetTile)) {
  187.                             bottomCornerTile = offsetTile;
  188.                         }
  189. //                        else if(expandRectangle(town, topCornerTile, bottomCornerTile, "SE")) {
  190. //                            bottomCornerTile = Utils.getOffsetTile(bottomCornerTile, 0, rectangleIncreaseKoeficient);
  191. //                        }
  192.                         else {
  193.                             ++maxExpandedCounter;
  194.                             continue;
  195.                         }
  196.                         break;
  197.  
  198.                     case 2:
  199.                         local offsetTile = Utils.getOffsetTile(bottomCornerTile, rectangleIncreaseKoeficient, 0);
  200.  
  201.                         if(offsetTile == AIMap.TILE_INVALID) {
  202.                             ++maxExpandedCounter;
  203.                             continue;
  204.                         }
  205.  
  206.                         if(AITown.IsWithinTownInfluence(town, offsetTile)) {
  207.                             bottomCornerTile = offsetTile;
  208.                         }
  209. //                        else if(expandRectangle(town, topCornerTile, bottomCornerTile, "SW")) {
  210. //                            bottomCornerTile = Utils.getOffsetTile(bottomCornerTile, rectangleIncreaseKoeficient, 0);
  211. //                        }
  212.                         else {
  213.                             ++maxExpandedCounter;
  214.                             continue;
  215.                         }
  216.                         break;
  217.  
  218.                     case 3:
  219.                         local offsetTile = Utils.getOffsetTile(topCornerTile, 0, (-1) * rectangleIncreaseKoeficient);
  220.  
  221.                         if(offsetTile == AIMap.TILE_INVALID) {
  222.                             ++maxExpandedCounter;
  223.                         }
  224.  
  225.                         if(AITown.IsWithinTownInfluence(town, offsetTile)) {
  226.                             topCornerTile = offsetTile;
  227.                         }
  228. //                        else if(expandRectangle(town, topCornerTile, bottomCornerTile, "NW")) {
  229. //                            topCornerTile = Utils.getOffsetTile(topCornerTile, 0, (-1) * rectangleIncreaseKoeficient);
  230. //                        }
  231.                         else {
  232.                             ++maxExpandedCounter;
  233.                         }
  234.                         break;
  235.  
  236.                     default:
  237.                         break;
  238.                 }
  239.             }
  240.  
  241.             if(maxExpandedCounter == 4) {
  242.                 isMaxExpanded = true;
  243.             }
  244.         }
  245.  
  246.         return [topCornerTile, bottomCornerTile];
  247.     }

Comments