Loading

Depot finding function

  1. function ClosestDepotToRoad(begin)
  2. {
  3.     neighbors = AITileList();
  4.     neighbors.Add(begin, 0);
  5.  
  6.     costs = {
  7.         [begin] = 0
  8.     };
  9.  
  10.     cameFrom = {
  11.         [begin] = null;
  12.     };
  13.  
  14.     function CostFor(current, tile)
  15.     {
  16.         return GetSlope(tile) != AITile.Slope.SLOPE_FLAT ? 2 : 1;
  17.     }
  18.  
  19.     function CostForBridge(tile)
  20.     {
  21.         return    AIBridge.GetMinLength(AIBridge.GetBridgeID(tile))
  22.                 / AIBridge.GetMaxSpeed(AIBridge.GetBridgeID(tile));
  23.     }
  24.  
  25.     function CostForTunnel(tile)
  26.     {
  27.         return    AITile.GetManhattanDistance(tile, AITunnel.GetOtherTunneEnd(tile))
  28.                 / AIEngine.GetMaxSpeed(
  29.                     AIEngineList(AIVehicle.VehicleType.VT_ROAD)
  30.                             .Valuate(AIEngine.GetPrice)
  31.                             .End()
  32.                 );
  33.     }
  34.  
  35.     function CalcCameFrom(tile, current)
  36.     {
  37.         if ( !cameFrom.HasItem(tile) || neighbors.GetValue(tile) < CostFor(current, tile) )
  38.             cameFrom[tile] <- current;
  39.     }
  40.  
  41.     function AddNeighbor(tile, current)
  42.     {
  43.         if ( AIRail.IsRailTile(tile) && AIRail.AreTilesConnected(tile, current) )
  44.         {
  45.             CalcCameFrom(tile, current);
  46.  
  47.             neighbors.SetValue(tile, CostFor(current, tile));
  48.         }
  49.     }
  50.  
  51.     function AddBridge(tile)
  52.     {
  53.         if ( AIBridge.IsBridgeTile(tile) )
  54.         {
  55.             CalcCameFrom(AIBridge.GetOtherBridgeEnd(tile), tile);
  56.  
  57.             neighbors.SetValue(tile, CostForBridge(tile));
  58.         }
  59.  
  60.         else if ( AITunnel.IsTunnelTile(tile) )
  61.         {
  62.             CalcCameFrom(AITunnel.GetOtherTunneEnd(tile), tile);
  63.  
  64.             neighbors.SetValue(tile, CostForTunnel(tile));
  65.         }
  66.     }
  67.  
  68.     while ( neighbors.Count() > 0 )
  69.     {
  70.         t = neighbors.Begin();
  71.         neighbors.RemoveTop(1);
  72.  
  73.         // orthogonals
  74.         AddNeighbor(tile - AIMap.GetTileIndex(1,0));
  75.         AddNeighbor(tile - AIMap.GetTileIndex(0,1));
  76.         AddNeighbor(tile - AIMap.GetTileIndex(-1,0));
  77.         AddNeighbor(tile - AIMap.GetTileIndex(0,-1));
  78.  
  79.         // diagonals
  80.         AddNeighbor(tile - AIMap.GetTileIndex(-1,1));
  81.         AddNeighbor(tile - AIMap.GetTileIndex(1,1));
  82.         AddNeighbor(tile - AIMap.GetTileIndex(1,-1));
  83.         AddNeighbor(tile - AIMap.GetTileIndex(-1,-1));
  84.     }
  85.  
  86.     return function(depot)
  87.     {
  88.         if ( cameFrom.HasItem(depot) )
  89.             return costs[depot];
  90.  
  91.         return 0x7FFF;
  92.     };
  93. }

Comments