| | | 1 | function Road::_CostHelper(self, prev_tile, new_tile, coast_cost_only = null)
|
|---|
| | | 2 | {
|
|---|
| | | 3 | local cost = 0;
|
|---|
| | | 4 |
|
|---|
| | | 5 | if (coast_cost_only != true) {
|
|---|
| | | 6 | /* Check for a turn. We do this by substracting the TileID of the current node from
|
|---|
| | | 7 | * the TileID of the previous node and comparing that to the difference between the
|
|---|
| | | 8 | * previous node and the node before that. */
|
|---|
| | | 9 | cost += self._cost_tile;
|
|---|
| | | 10 | if (path.GetParent() != null && (prev_tile - path.GetParent().GetTile()) != (new_tile - prev_tile) &&
|
|---|
| | | 11 | AIMap.DistanceManhattan(path.GetParent().GetTile(), prev_tile) == 1) {
|
|---|
| | | 12 | cost += self._cost_turn;
|
|---|
| | | 13 | }
|
|---|
| | | 14 |
|
|---|
| | | 15 | /* Check if the last tile was sloped. */
|
|---|
| | | 16 | if (path.GetParent() != null && !AIBridge.IsBridgeTile(prev_tile) && !AITunnel.IsTunnelTile(prev_tile) &&
|
|---|
| | | 17 | (AIMap.DistanceManhattan(path.GetParent().GetTile(), prev_tile) == 1) && self._IsSlopedRoad(path.GetParent().GetTile(), prev_tile, new_tile)) {
|
|---|
| | | 18 | cost += self._cost_slope;
|
|---|
| | | 19 | }
|
|---|
| | | 20 |
|
|---|
| | | 21 | if (!AIRoad.AreRoadTilesConnected(prev_tile, new_tile)) {
|
|---|
| | | 22 | cost += self._cost_no_existing_road;
|
|---|
| | | 23 | }
|
|---|
| | | 24 | }
|
|---|
| | | 25 |
|
|---|
| | | 26 | if (coast_cost_only != null) {
|
|---|
| | | 27 | /* Check if the new tile is a coast tile. */
|
|---|
| | | 28 | if (AITile.IsCoastTile(new_tile) && AITile.HasTransportType(new_tile, AITile.TRANSPORT_WATER)) {
|
|---|
| | | 29 | cost += self._cost_coast;
|
|---|
| | | 30 | }
|
|---|
| | | 31 | }
|
|---|
| | | 32 |
|
|---|
| | | 33 | return cost;
|
|---|
| | | 34 | }
|
|---|
| | | 35 |
|
|---|
| 12 |
| 12 | return path.GetCost() + self._CostHelper(self, prev_tile, new_tile);
|
|---|
| 13 | /* Check for a turn. We do this by substracting the TileID of the current node from
| | |
|---|
| 14 | * the TileID of the previous node and comparing that to the difference between the
| | |
|---|
| 15 | * previous node and the node before that. */
| | |
|---|
| 16 | local cost = self._cost_tile;
| | |
|---|
| 17 | if (path.GetParent() != null && (prev_tile - path.GetParent().GetTile()) != (new_tile - prev_tile) &&
| | |
|---|
| 18 | AIMap.DistanceManhattan(path.GetParent().GetTile(), prev_tile) == 1) {
| | |
|---|
| 19 | cost += self._cost_turn;
| | |
|---|
| 20 | }
| | |
|---|
| 21 |
| | |
|---|
| 22 | /* Check if the last tile was sloped. */
| | |
|---|
| 23 | if (path.GetParent() != null && !AIBridge.IsBridgeTile(prev_tile) && !AITunnel.IsTunnelTile(prev_tile) &&
| | |
|---|
| 24 | AIMap.DistanceManhattan(path.GetParent().GetTile(), prev_tile) == 1 && self._IsSlopedRoad(path.GetParent().GetTile(), prev_tile, new_tile)) {
| | |
|---|
| 25 | cost += self._cost_slope;
| | |
|---|
| 26 | }
| | |
|---|
| 27 |
| | |
|---|
| 28 | if (!AIRoad.AreRoadTilesConnected(prev_tile, new_tile)) {
| | |
|---|
| 29 | cost += self._cost_no_existing_road;
| | |
|---|
| 30 | }
| | |
|---|
| 31 |
| | |
|---|
| 32 | return path.GetCost() + cost;
| | |
|---|
| 33 | }
| 48 | }
|
|---|
| 34 | return path.GetCost() + (AIMap.DistanceManhattan(new_tile, prev_tile) + 1) * (self._cost_tile + self._cost_bridge_per_tile) - self._cost_tile + self._GetBridgeNumSlopes(new_tile, prev_tile) * self._cost_slope;
| 49 | return path.GetCost() + (AIMap.DistanceManhattan(new_tile, prev_tile) + 1) * (self._cost_tile + self._cost_bridge_per_tile) - self._cost_tile + self._GetBridgeNumSlopes(new_tile, prev_tile) * self._cost_slope;
|
|---|
| 35 | }
| 50 | }
|
|---|
| 36 | if (AITunnel.IsTunnelTile(new_tile)) {
| 51 | if (AITunnel.IsTunnelTile(new_tile)) {
|
|---|
| 37 | if (AITunnel.GetOtherTunnelEnd(new_tile) != prev_tile) {
| 52 | if (AITunnel.GetOtherTunnelEnd(new_tile) != prev_tile) {
|
|---|
| 38 |
| 38 | return path.GetCost() + self._CostHelper(self, prev_tile, new_tile);
|
|---|
| 39 | /* Check for a turn. We do this by substracting the TileID of the current node from
| | |
|---|
| 40 | * the TileID of the previous node and comparing that to the difference between the
| | |
|---|
| 41 | * previous node and the node before that. */
| | |
|---|
| 42 | local cost = self._cost_tile;
| | |
|---|
| 43 | if (path.GetParent() != null && (prev_tile - path.GetParent().GetTile()) != (new_tile - prev_tile) &&
| | |
|---|
| 44 | AIMap.DistanceManhattan(path.GetParent().GetTile(), prev_tile) == 1) {
| | |
|---|
| 45 | cost += self._cost_turn;
| | |
|---|
| 46 | }
| | |
|---|
| 47 |
| | |
|---|
| 48 | /* Check if the last tile was sloped. */
| | |
|---|
| 49 | if (path.GetParent() != null && !AIBridge.IsBridgeTile(prev_tile) && !AITunnel.IsTunnelTile(prev_tile) &&
| | |
|---|
| 50 | AIMap.DistanceManhattan(path.GetParent().GetTile(), prev_tile) == 1 && self._IsSlopedRoad(path.GetParent().GetTile(), prev_tile, new_tile)) {
| | |
|---|
| 51 | cost += self._cost_slope;
| | |
|---|
| 52 | }
| | |
|---|
| 53 |
| | |
|---|
| 54 | if (!AIRoad.AreRoadTilesConnected(prev_tile, new_tile)) {
| | |
|---|
| 55 | cost += self._cost_no_existing_road;
| | |
|---|
| 56 | }
| | |
|---|
| 57 |
| | |
|---|
| 58 | return path.GetCost() + cost;
| | |
|---|
| 70 | local cost = (AIMap.DistanceManhattan(new_tile, prev_tile) + 1) * (self._cost_tile + self._cost_bridge_per_tile + self._cost_no_existing_road) - self._cost_tile + self._GetBridgeNumSlopes(new_tile, prev_tile) * self._cost_slope;
| 70 | return path.GetCost() + (AIMap.DistanceManhattan(new_tile, prev_tile) + 1) * (self._cost_tile + self._cost_bridge_per_tile + self._cost_no_existing_road) - self._cost_tile + self._GetBridgeNumSlopes(new_tile, prev_tile) * self._cost_slope + self._CostHelper(self, prev_tile, new_tile, true);
|
|---|
| 71 | /* Check if the new tile is a coast tile. */
| | |
|---|
| 72 | if (AITile.IsCoastTile(new_tile) && AITile.HasTransportType(new_tile, AITile.TRANSPORT_WATER)) {
| | |
|---|
| 73 | cost += self._cost_coast;
| | |
|---|
| 74 | }
| | |
|---|
| 75 | return path.GetCost() + cost;
| | |
|---|
| 79 | /* Check for a turn. We do this by substracting the TileID of the current node from
| 79 | return path.GetCost() + self._CostHelper(self, prev_tile, new_tile, false);
|
|---|
| 80 | * the TileID of the previous node and comparing that to the difference between the
| | |
|---|
| 81 | * previous node and the node before that. */
| | |
|---|
| 82 | local cost = self._cost_tile;
| | |
|---|
| 83 | if (path.GetParent() != null && (prev_tile - path.GetParent().GetTile()) != (new_tile - prev_tile) &&
| | |
|---|
| 84 | AIMap.DistanceManhattan(path.GetParent().GetTile(), prev_tile) == 1) {
| | |
|---|
| 85 | cost += self._cost_turn;
| | |
|---|
| 86 | }
| | |
|---|
| 87 |
| | |
|---|
| 88 | /* Check if the new tile is a coast tile. */
| | |
|---|
| 89 | if (AITile.IsCoastTile(new_tile) && AITile.HasTransportType(new_tile, AITile.TRANSPORT_WATER)) {
| | |
|---|
| 90 | cost += self._cost_coast;
| | |
|---|
| 91 | }
| | |
|---|
| 92 |
| | |
|---|
| 93 | /* Check if the last tile was sloped. */
| | |
|---|
| 94 | if (path.GetParent() != null && !AIBridge.IsBridgeTile(prev_tile) && !AITunnel.IsTunnelTile(prev_tile) &&
| | |
|---|
| 95 | AIMap.DistanceManhattan(path.GetParent().GetTile(), prev_tile) == 1 && self._IsSlopedRoad(path.GetParent().GetTile(), prev_tile, new_tile)) {
| | |
|---|
| 96 | cost += self._cost_slope;
| | |
|---|
| 97 | }
| | |
|---|
| 98 |
| | |
|---|
| 99 | if (!AIRoad.AreRoadTilesConnected(prev_tile, new_tile)) {
| | |
|---|
| 100 | cost += self._cost_no_existing_road;
| | |
|---|
| 101 | }
| | |
|---|
| 102 |
| | |
|---|
| 103 | return path.GetCost() + cost;
| | |
|---|