summaryrefslogtreecommitdiff
path: root/manualPorts
diff options
context:
space:
mode:
Diffstat (limited to 'manualPorts')
-rw-r--r--manualPorts/openttd-git/.footprint1
-rw-r--r--manualPorts/openttd-git/.md5sum7
-rw-r--r--manualPorts/openttd-git/.signature13
-rw-r--r--manualPorts/openttd-git/Pkgfile6
-rw-r--r--manualPorts/openttd-git/signaltunnel.patch86
-rw-r--r--manualPorts/openttd-git/sloped-stations.patch81
-rw-r--r--manualPorts/openttd-git/underground.patch442
7 files changed, 315 insertions, 321 deletions
diff --git a/manualPorts/openttd-git/.footprint b/manualPorts/openttd-git/.footprint
index 8df2ee2..3f4d6bd 100644
--- a/manualPorts/openttd-git/.footprint
+++ b/manualPorts/openttd-git/.footprint
@@ -31,6 +31,7 @@ drwxr-xr-x root/root usr/share/games/openttd/ai/
drwxr-xr-x root/root usr/share/games/openttd/baseset/
-rw-r--r-- root/root usr/share/games/openttd/baseset/no_music.obm
-rw-r--r-- root/root usr/share/games/openttd/baseset/no_sound.obs
+-rw-r--r-- root/root usr/share/games/openttd/baseset/openttd.32.bmp
-rw-r--r-- root/root usr/share/games/openttd/baseset/openttd.grf
-rw-r--r-- root/root usr/share/games/openttd/baseset/opntitle.dat
-rw-r--r-- root/root usr/share/games/openttd/baseset/orig_dos.obg
diff --git a/manualPorts/openttd-git/.md5sum b/manualPorts/openttd-git/.md5sum
index 051ae1e..03b3123 100644
--- a/manualPorts/openttd-git/.md5sum
+++ b/manualPorts/openttd-git/.md5sum
@@ -1,8 +1,7 @@
-e97c19b8b63f40a7f2c095d5157ef332 ad89601c4.tar.gz
+04c7d46c47351187f77ed6c72ffd095f 523901887.tar.gz
4f4a6465cd5b84964b7ceecd1c06d686 opengfx-0.5.4.zip
858b79d44aea6de5e15d9d1439e86cc3 openmsx-0.3.1.zip
6e3a5cf97fe69e3a351c3e0615a14b04 opensfx-0.2.3.zip
00fd6afd1ab1bfbd8d775175a42c3899 opntitle.dat
-dc7532dc6cccbe8b25d55c176dafa7bb signaltunnel.patch
-cb572f46fc8c53fb08d7fe3de94870bc sloped-stations.patch
-099be2bc8d019cd66c2ff54948a2fad0 underground.patch
+f5fa1fd3ad99eea4e7e340b930e98026 signaltunnel.patch
+d0a6576302e054dd8134b4ceb601a8c3 sloped-stations.patch
diff --git a/manualPorts/openttd-git/.signature b/manualPorts/openttd-git/.signature
index b78c972..edacd34 100644
--- a/manualPorts/openttd-git/.signature
+++ b/manualPorts/openttd-git/.signature
@@ -1,12 +1,11 @@
untrusted comment: verify with /etc/ports/deepthought.pub
-RWQxCptPusLGGhYTeiyu0/mzg1jL9NtyCr/vjR2w/aadB3RNkJPrO0T226PrVbyvqmLIoRdLjl0Ie3WMFkbdWH7enfhS+T+mdgQ=
-SHA256 (Pkgfile) = de02ff9220d4a8b0e6decc6281c5c41d5e28fea32d56187c8c7a8d7d4a8425c3
-SHA256 (.footprint) = 2950465990b1e14b5c788bae2b920401e880c096349c23e7ed584814f43c0192
+RWQxCptPusLGGo+x2FS1Xe0OFq532z45ibSqsXpBH5gNM1VKL2MAhH5WqY3JRR/cHIzTizpRGbvK98VfOu3kMINYM6YReqxHog8=
+SHA256 (Pkgfile) = 29561ebe7f808415a65a0c973058af4ca20f40877c3a731be7e2f7efaa8b9930
+SHA256 (.footprint) = e1b2d06dbbe8992ddb7dac426b3873fc47f207f240abb356376c8a998dda7f37
SHA256 (opengfx-0.5.4.zip) = 3d136d776906dbe8b5df1434cb9a68d1249511a3c4cfaca55cc24cc0028ae078
SHA256 (opensfx-0.2.3.zip) = 3574745ac0c138bae53b56972591db8d778ad9faffd51deae37a48a563e71662
SHA256 (openmsx-0.3.1.zip) = 92e293ae89f13ad679f43185e83fb81fb8cad47fe63f4af3d3d9f955130460f5
-SHA256 (signaltunnel.patch) = 11065bb6812413b05932213f7282b64b434017e3006998410464abf1161ff84f
-SHA256 (sloped-stations.patch) = d616130467b7341531efce1883e9fb2bd0619a9cf45265c7ee2127d0cde5266b
-SHA256 (underground.patch) = 3443cb4f9970e2957e2bdf5e2b1bb606791f6827f4f6147c6b483ca317fda802
+SHA256 (signaltunnel.patch) = 5fa6024423f92431606fdd772214c686455dabb3f1d2f3ed46df6acf0ea98f65
+SHA256 (sloped-stations.patch) = 17e70cc25398eb6a4369635ae515c050d36e21131ceaae7ab2df1f75b19de35a
SHA256 (opntitle.dat) = f4931200a68a6f592716ec2dce468530670484dd357ab52c3a2272b9db3dfd95
-SHA256 (ad89601c4.tar.gz) = b5fbcce769c641da42a2061ee85361a6687ee0c0704e220d7a07c29bd037879e
+SHA256 (523901887.tar.gz) = e911d5af6cc7ef19c3bb7fa6dcd1452c225e86d733cb5ca3ae205aacb5e3980f
diff --git a/manualPorts/openttd-git/Pkgfile b/manualPorts/openttd-git/Pkgfile
index cb2222d..50095c3 100644
--- a/manualPorts/openttd-git/Pkgfile
+++ b/manualPorts/openttd-git/Pkgfile
@@ -5,7 +5,7 @@
# Depends on: libsdl libpng fontconfig lzo
name=openttd-git
-version=31319.ad89601c4
+version=31392.523901887
gfxversion=0.5.4
sfxversion=0.2.3
@@ -19,7 +19,7 @@ source=(http://bundles.openttdcoop.org/opengfx/releases/$gfxversion/opengfx-$gfx
# chunnel-underground-pre.patch
signaltunnel.patch
sloped-stations.patch
- underground.patch
+# underground.patch
opntitle.dat
https://github.com/OpenTTD/OpenTTD/archive/${version##*.}.tar.gz)
@@ -50,7 +50,7 @@ build() {
' cmake/scripts/FindVersion.cmake
patch -p1 -i "$SRC/signaltunnel.patch"
# patch -p1 -i "$SRC/sloped-stations.patch" # broken!
- patch -p1 -i "$SRC/underground.patch" # broken?
+# patch -p1 -i "$SRC/underground.patch" # broken?
# patch -p1 -i "$SRC/chunnel.pre.patch" # broken!
mkdir build
diff --git a/manualPorts/openttd-git/signaltunnel.patch b/manualPorts/openttd-git/signaltunnel.patch
index 65a4395..d3483e8 100644
--- a/manualPorts/openttd-git/signaltunnel.patch
+++ b/manualPorts/openttd-git/signaltunnel.patch
@@ -1,5 +1,5 @@
diff --git a/src/lang/english.txt b/src/lang/english.txt
-index becf8d35c..8645b5cd1 100644
+index becf8d35c2..8645b5cd15 100644
--- a/src/lang/english.txt
+++ b/src/lang/english.txt
@@ -1812,6 +1812,9 @@ STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :Set the minimum
@@ -24,7 +24,7 @@ index becf8d35c..8645b5cd1 100644
STR_LAI_BRIDGE_DESCRIPTION_RAIL_GIRDER_STEEL :Steel girder rail bridge
STR_LAI_BRIDGE_DESCRIPTION_RAIL_CANTILEVER_STEEL :Steel cantilever rail bridge
diff --git a/src/lang/russian.txt b/src/lang/russian.txt
-index 534be43c1..658e41ca2 100644
+index 534be43c18..658e41ca28 100644
--- a/src/lang/russian.txt
+++ b/src/lang/russian.txt
@@ -1963,6 +1963,8 @@ STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :Минимал
@@ -48,7 +48,7 @@ index 534be43c1..658e41ca2 100644
STR_LAI_BRIDGE_DESCRIPTION_RAIL_GIRDER_STEEL :Стальной балочный ж/д мост
STR_LAI_BRIDGE_DESCRIPTION_RAIL_CANTILEVER_STEEL :Стальной консольный ж/д мост
diff --git a/src/pathfinder/follow_track.hpp b/src/pathfinder/follow_track.hpp
-index a9a51da68..5558c0226 100644
+index a9a51da68a..5558c02265 100644
--- a/src/pathfinder/follow_track.hpp
+++ b/src/pathfinder/follow_track.hpp
@@ -350,7 +350,7 @@ protected:
@@ -70,12 +70,12 @@ index a9a51da68..5558c0226 100644
return false;
}
diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp
-index 4c34f1ca8..e71f562ac 100644
+index 88f4adb0f6..7503464dba 100644
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
-@@ -1069,9 +1069,12 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1,
- if (sigtype > SIGTYPE_LAST) return CMD_ERROR;
- if (cycle_start > cycle_stop || cycle_stop > SIGTYPE_LAST) return CMD_ERROR;
+@@ -1039,9 +1039,12 @@ CommandCost CmdBuildSingleSignal(DoCommandFlag flags, TileIndex tile, Track trac
+
+ if (ctrl_pressed) sigvar = (SignalVariant)(sigvar ^ SIG_SEMAPHORE);
- /* You can only build signals on plain rail tiles, and the selected track must exist */
- if (!ValParamTrackOrientation(track) || !IsPlainRailTile(tile) ||
@@ -89,7 +89,7 @@ index 4c34f1ca8..e71f562ac 100644
return_cmd_error(STR_ERROR_THERE_IS_NO_RAILROAD_TRACK);
}
/* Protect against invalid signal copying */
-@@ -1080,6 +1083,53 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1,
+@@ -1050,6 +1053,53 @@ CommandCost CmdBuildSingleSignal(DoCommandFlag flags, TileIndex tile, Track trac
CommandCost ret = CheckTileOwnership(tile);
if (ret.Failed()) return ret;
@@ -99,10 +99,10 @@ index 4c34f1ca8..e71f562ac 100644
+ TileIndex tile_exit = GetOtherTunnelBridgeEnd(tile);
+ cost = CommandCost();
+ if (!HasWormholeSignals(tile)) { // toggle signal zero costs.
-+ if (p2 != 12) cost = CommandCost(EXPENSES_CONSTRUCTION, _price[PR_BUILD_SIGNALS] * ((GetTunnelBridgeLength(tile, tile_exit) + 4) >> 2)); // minimal 1
++ if (signals_copy != 12) cost = CommandCost(EXPENSES_CONSTRUCTION, _price[PR_BUILD_SIGNALS] * ((GetTunnelBridgeLength(tile, tile_exit) + 4) >> 2)); // minimal 1
+ }
+ if (flags & DC_EXEC) {
-+ if (p2 == 0 && HasWormholeSignals(tile)){ // Toggle signal if already signals present.
++ if (signals_copy == 0 && HasWormholeSignals(tile)){ // Toggle signal if already signals present.
+ if (IsTunnelBridgeEntrance (tile)) {
+ ClrBitTunnelBridgeSignal(tile);
+ ClrBitTunnelBridgeExit(tile_exit);
@@ -116,14 +116,14 @@ index 4c34f1ca8..e71f562ac 100644
+ }
+ } else{
+ /* Create one direction tunnel/bridge if required. */
-+ if (p2 == 0) {
++ if (signals_copy == 0) {
+ SetBitTunnelBridgeSignal(tile);
+ SetBitTunnelBridgeExit(tile_exit);
-+ } else if (p2 == 4 || p2 == 8) {
++ } else if (signals_copy == 4 || signals_copy == 8) {
+ DiagDirection tbdir = GetTunnelBridgeDirection(tile);
+ /* If signal only on one side build accoringly one-way tunnel/bridge. */
-+ if ((p2 == 8 && (tbdir == DIAGDIR_NE || tbdir == DIAGDIR_SE)) ||
-+ (p2 == 4 && (tbdir == DIAGDIR_SW || tbdir == DIAGDIR_NW))) {
++ if ((signals_copy == 8 && (tbdir == DIAGDIR_NE || tbdir == DIAGDIR_SE)) ||
++ (signals_copy == 4 && (tbdir == DIAGDIR_SW || tbdir == DIAGDIR_NW))) {
+ SetBitTunnelBridgeSignal(tile);
+ SetBitTunnelBridgeExit(tile_exit);
+ } else {
@@ -143,7 +143,7 @@ index 4c34f1ca8..e71f562ac 100644
/* See if this is a valid track combination for signals (no overlap) */
if (TracksOverlap(GetTrackBits(tile))) return_cmd_error(STR_ERROR_NO_SUITABLE_RAILROAD_TRACK);
-@@ -1089,7 +1139,6 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1,
+@@ -1059,7 +1109,6 @@ CommandCost CmdBuildSingleSignal(DoCommandFlag flags, TileIndex tile, Track trac
/* you can not convert a signal if no signal is on track */
if (convert_signal && !HasSignalOnTrack(tile, track)) return_cmd_error(STR_ERROR_THERE_ARE_NO_SIGNALS);
@@ -151,7 +151,7 @@ index 4c34f1ca8..e71f562ac 100644
if (!HasSignalOnTrack(tile, track)) {
/* build new signals */
cost = CommandCost(EXPENSES_CONSTRUCTION, _price[PR_BUILD_SIGNALS]);
-@@ -1243,6 +1292,7 @@ static bool AdvanceSignalAutoFill(TileIndex &tile, Trackdir &trackdir, bool remo
+@@ -1213,6 +1262,7 @@ static bool AdvanceSignalAutoFill(TileIndex &tile, Trackdir &trackdir, bool remo
break;
case MP_TUNNELBRIDGE: {
@@ -159,17 +159,17 @@ index 4c34f1ca8..e71f562ac 100644
if (GetTunnelBridgeTransportType(tile) != TRANSPORT_RAIL) return false;
if (GetTunnelBridgeDirection(tile) != TrackdirToExitdir(trackdir)) return false;
break;
-@@ -1501,22 +1551,48 @@ CommandCost CmdBuildSignalTrack(TileIndex tile, DoCommandFlag flags, uint32 p1,
- CommandCost CmdRemoveSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const std::string &text)
+@@ -1443,21 +1493,48 @@ CommandCost CmdBuildSignalTrack(DoCommandFlag flags, TileIndex tile, TileIndex e
+ */
+ CommandCost CmdRemoveSingleSignal(DoCommandFlag flags, TileIndex tile, Track track)
{
- Track track = Extract<Track, 0, 3>(p1);
-+ Money cost = _price[PR_CLEAR_SIGNALS];
-
- if (!ValParamTrackOrientation(track) || !IsPlainRailTile(tile) || !HasTrack(tile, track)) {
- return_cmd_error(STR_ERROR_THERE_IS_NO_RAILROAD_TRACK);
- }
- if (!HasSignalOnTrack(tile, track)) {
- return_cmd_error(STR_ERROR_THERE_ARE_NO_SIGNALS);
++ Money cost = _price[PR_CLEAR_SIGNALS];
++
+ if (IsTileType(tile, MP_TUNNELBRIDGE)) {
+ TileIndex end = GetOtherTunnelBridgeEnd(tile);
+ if (GetTunnelBridgeTransportType(tile) != TRANSPORT_RAIL) return_cmd_error(STR_ERROR_THERE_IS_NO_RAILROAD_TRACK);
@@ -215,7 +215,7 @@ index 4c34f1ca8..e71f562ac 100644
Train *v = nullptr;
if (HasReservedTracks(tile, TrackToTrackBits(track))) {
v = GetTrainForReservation(tile, track);
-@@ -1552,7 +1628,7 @@ CommandCost CmdRemoveSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1
+@@ -1493,7 +1570,7 @@ CommandCost CmdRemoveSingleSignal(DoCommandFlag flags, TileIndex tile, Track tra
MarkTileDirtyByTile(tile);
}
@@ -225,7 +225,7 @@ index 4c34f1ca8..e71f562ac 100644
/**
diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp
-index f99ef8f3e..a913884da 100644
+index f99ef8f3e2..a913884da4 100644
--- a/src/settings_gui.cpp
+++ b/src/settings_gui.cpp
@@ -1625,6 +1625,7 @@ static SettingsContainer &GetSettingsTree()
@@ -237,7 +237,7 @@ index f99ef8f3e..a913884da 100644
construction->Add(new SettingEntry("gui.quick_goto"));
construction->Add(new SettingEntry("gui.default_rail_type"));
diff --git a/src/settings_type.h b/src/settings_type.h
-index 9da2655d6..d37f5e18d 100644
+index 9da2655d6b..d37f5e18d2 100644
--- a/src/settings_type.h
+++ b/src/settings_type.h
@@ -345,6 +345,7 @@ struct ConstructionSettings {
@@ -249,7 +249,7 @@ index 9da2655d6..d37f5e18d 100644
uint32 terraform_per_64k_frames; ///< how many tile heights may, over a long period, be terraformed per 65536 frames?
uint16 terraform_frame_burst; ///< how many tile heights may, over a short period, be terraformed?
diff --git a/src/signal.cpp b/src/signal.cpp
-index 329b1b05d..e058edf5e 100644
+index 329b1b05d9..e058edf5e2 100644
--- a/src/signal.cpp
+++ b/src/signal.cpp
@@ -195,6 +195,14 @@ static Vehicle *TrainOnTileEnum(Vehicle *v, void *)
@@ -330,7 +330,7 @@ index 329b1b05d..e058edf5e 100644
case MP_RAILWAY:
diff --git a/src/table/settings/game_settings.ini b/src/table/settings/game_settings.ini
-index 79fac7513..503863c96 100644
+index 79fac75136..503863c969 100644
--- a/src/table/settings/game_settings.ini
+++ b/src/table/settings/game_settings.ini
@@ -406,6 +406,20 @@ min = 5
@@ -355,10 +355,10 @@ index 79fac7513..503863c96 100644
[SDTC_BOOL]
diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp
-index f5eb32d7f..5b9830b02 100644
+index 2fd081898e..ff143dd879 100644
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
-@@ -1876,6 +1876,17 @@ void ReverseTrainDirection(Train *v)
+@@ -1866,6 +1866,17 @@ void ReverseTrainDirection(Train *v)
return;
}
@@ -376,7 +376,7 @@ index f5eb32d7f..5b9830b02 100644
/* VehicleExitDir does not always produce the desired dir for depots and
* tunnels/bridges that is needed for UpdateSignalsOnSegment. */
DiagDirection dir = VehicleExitDir(v->direction, v->track);
-@@ -2210,6 +2221,42 @@ static bool CheckTrainStayInDepot(Train *v)
+@@ -2195,6 +2206,42 @@ static bool CheckTrainStayInDepot(Train *v)
return false;
}
@@ -419,7 +419,7 @@ index f5eb32d7f..5b9830b02 100644
/**
* Clear the reservation of \a tile that was just left by a wagon on \a track_dir.
* @param v %Train owning the reservation.
-@@ -2225,7 +2272,8 @@ static void ClearPathReservation(const Train *v, TileIndex tile, Trackdir track_
+@@ -2210,7 +2257,8 @@ static void ClearPathReservation(const Train *v, TileIndex tile, Trackdir track_
if (GetTunnelBridgeDirection(tile) == ReverseDiagDir(dir)) {
TileIndex end = GetOtherTunnelBridgeEnd(tile);
@@ -429,7 +429,7 @@ index f5eb32d7f..5b9830b02 100644
/* Free the reservation only if no other train is on the tiles. */
SetTunnelBridgeReservation(tile, false);
SetTunnelBridgeReservation(end, false);
-@@ -2239,6 +2287,7 @@ static void ClearPathReservation(const Train *v, TileIndex tile, Trackdir track_
+@@ -2224,6 +2272,7 @@ static void ClearPathReservation(const Train *v, TileIndex tile, Trackdir track_
}
}
}
@@ -437,7 +437,7 @@ index f5eb32d7f..5b9830b02 100644
}
} else if (IsRailStationTile(tile)) {
TileIndex new_tile = TileAddByDiagDir(tile, dir);
-@@ -3105,6 +3154,99 @@ static Vehicle *CheckTrainAtSignal(Vehicle *v, void *data)
+@@ -3090,6 +3139,99 @@ static Vehicle *CheckTrainAtSignal(Vehicle *v, void *data)
return t;
}
@@ -537,7 +537,7 @@ index f5eb32d7f..5b9830b02 100644
/**
* Move a vehicle chain one movement stop forwards.
* @param v First vehicle to move.
-@@ -3290,6 +3432,23 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse)
+@@ -3275,6 +3417,23 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse)
goto invalid_rail;
}
@@ -561,7 +561,7 @@ index f5eb32d7f..5b9830b02 100644
if (!HasBit(r, VETS_ENTERED_WORMHOLE)) {
Track track = FindFirstTrack(chosen_track);
Trackdir tdir = TrackDirectionToTrackdir(track, chosen_dir);
-@@ -3342,6 +3501,64 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse)
+@@ -3327,6 +3486,64 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse)
}
}
} else {
@@ -627,7 +627,7 @@ index f5eb32d7f..5b9830b02 100644
/* Perform look-ahead on tunnel exit. */
if (v->IsFrontEngine()) {
diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp
-index 5181dfdca..e9df7e23b 100644
+index 543ac8b284..550becea91 100644
--- a/src/tunnelbridge_cmd.cpp
+++ b/src/tunnelbridge_cmd.cpp
@@ -28,6 +28,7 @@
@@ -638,7 +638,7 @@ index 5181dfdca..e9df7e23b 100644
#include "sound_func.h"
#include "tunnelbridge.h"
#include "cheat_type.h"
-@@ -1259,6 +1260,103 @@ static void DrawBridgeRoadBits(TileIndex head_tile, int x, int y, int z, int off
+@@ -1250,6 +1251,103 @@ static void DrawBridgeRoadBits(TileIndex head_tile, int x, int y, int z, int off
}
}
@@ -742,7 +742,7 @@ index 5181dfdca..e9df7e23b 100644
/**
* Draws a tunnel of bridge tile.
* For tunnels, this is rather simple, as you only need to draw the entrance.
-@@ -1390,6 +1488,9 @@ static void DrawTile_TunnelBridge(TileInfo *ti)
+@@ -1381,6 +1479,9 @@ static void DrawTile_TunnelBridge(TileInfo *ti)
AddSortableSpriteToDraw(SPR_EMPTY_BOUNDING_BOX, PAL_NONE, ti->x, ti->y, BB_data[6], BB_data[7], TILE_HEIGHT, ti->z);
AddSortableSpriteToDraw(SPR_EMPTY_BOUNDING_BOX, PAL_NONE, ti->x + BB_data[4], ti->y + BB_data[5], BB_data[6], BB_data[7], TILE_HEIGHT, ti->z);
@@ -752,7 +752,7 @@ index 5181dfdca..e9df7e23b 100644
DrawBridgeMiddle(ti);
} else { // IsBridge(ti->tile)
const PalSpriteID *psid;
-@@ -1495,6 +1596,9 @@ static void DrawTile_TunnelBridge(TileInfo *ti)
+@@ -1486,6 +1587,9 @@ static void DrawTile_TunnelBridge(TileInfo *ti)
}
}
@@ -762,7 +762,7 @@ index 5181dfdca..e9df7e23b 100644
DrawBridgeMiddle(ti);
}
}
-@@ -1636,6 +1740,9 @@ void DrawBridgeMiddle(const TileInfo *ti)
+@@ -1627,6 +1731,9 @@ void DrawBridgeMiddle(const TileInfo *ti)
if (HasRailCatenaryDrawn(GetRailType(rampsouth))) {
DrawRailCatenaryOnBridge(ti);
}
@@ -772,7 +772,7 @@ index 5181dfdca..e9df7e23b 100644
}
/* draw roof, the component of the bridge which is logically between the vehicle and the camera */
-@@ -1709,9 +1816,9 @@ static void GetTileDesc_TunnelBridge(TileIndex tile, TileDesc *td)
+@@ -1700,9 +1807,9 @@ static void GetTileDesc_TunnelBridge(TileIndex tile, TileDesc *td)
TransportType tt = GetTunnelBridgeTransportType(tile);
if (IsTunnel(tile)) {
@@ -784,7 +784,7 @@ index 5181dfdca..e9df7e23b 100644
}
td->owner[0] = GetTileOwner(tile);
-@@ -1794,6 +1901,25 @@ static void TileLoop_TunnelBridge(TileIndex tile)
+@@ -1785,6 +1892,25 @@ static void TileLoop_TunnelBridge(TileIndex tile)
}
}
@@ -810,7 +810,7 @@ index 5181dfdca..e9df7e23b 100644
static TrackStatus GetTileTrackStatus_TunnelBridge(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
{
TransportType transport_type = GetTunnelBridgeTransportType(tile);
-@@ -2047,8 +2173,8 @@ extern const TileTypeProcs _tile_type_tunnelbridge_procs = {
+@@ -2038,8 +2164,8 @@ extern const TileTypeProcs _tile_type_tunnelbridge_procs = {
nullptr, // add_accepted_cargo_proc
GetTileDesc_TunnelBridge, // get_tile_desc_proc
GetTileTrackStatus_TunnelBridge, // get_tile_track_status_proc
@@ -822,7 +822,7 @@ index 5181dfdca..e9df7e23b 100644
ChangeTileOwner_TunnelBridge, // change_tile_owner_proc
nullptr, // add_produced_cargo_proc
diff --git a/src/tunnelbridge_map.h b/src/tunnelbridge_map.h
-index 62d3c14b2..fa029dcf4 100644
+index 62d3c14b2d..fa029dcf4d 100644
--- a/src/tunnelbridge_map.h
+++ b/src/tunnelbridge_map.h
@@ -119,4 +119,98 @@ static inline TrackBits GetTunnelBridgeReservationTrackBits(TileIndex t)
diff --git a/manualPorts/openttd-git/sloped-stations.patch b/manualPorts/openttd-git/sloped-stations.patch
index b113d84..9fbd520 100644
--- a/manualPorts/openttd-git/sloped-stations.patch
+++ b/manualPorts/openttd-git/sloped-stations.patch
@@ -1,8 +1,8 @@
diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp
-index 4c34f1ca8..4100ae31d 100644
+index 88f4adb0f6..26a952f80f 100644
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
-@@ -187,14 +187,6 @@ RailType AllocateRailType(RailTypeLabel label)
+@@ -189,14 +189,6 @@ RailType AllocateRailType(RailTypeLabel label)
return INVALID_RAILTYPE;
}
@@ -18,18 +18,10 @@ index 4c34f1ca8..4100ae31d 100644
* ---------
* |\ /|
diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp
-index 70a014434..a72ff4eb7 100644
+index 0701481119..9ada2017a1 100644
--- a/src/road_cmd.cpp
+++ b/src/road_cmd.cpp
-@@ -37,6 +37,7 @@
- #include "genworld.h"
- #include "company_gui.h"
- #include "road_func.h"
-+#include "road_cmd.h"
-
- #include "table/strings.h"
- #include "table/roadtypes.h"
-@@ -251,8 +252,6 @@ static const RoadBits _invalid_tileh_slopes_road[2][15] = {
+@@ -254,8 +254,6 @@ static const RoadBits _invalid_tileh_slopes_road[2][15] = {
}
};
@@ -38,7 +30,7 @@ index 70a014434..a72ff4eb7 100644
/**
* Is it allowed to remove the given road bits from the given tile?
* @param tile the tile to remove the road from
-@@ -1296,7 +1295,7 @@ struct DrawRoadTileStruct {
+@@ -1268,7 +1266,7 @@ struct DrawRoadTileStruct {
* @param bits The RoadBits part
* @return The resulting Foundation
*/
@@ -47,7 +39,7 @@ index 70a014434..a72ff4eb7 100644
{
/* Flat land and land without a road doesn't require a foundation */
if (tileh == SLOPE_FLAT || bits == ROAD_NONE) return FOUNDATION_NONE;
-@@ -1318,13 +1317,6 @@ static Foundation GetRoadFoundation(Slope tileh, RoadBits bits)
+@@ -1290,13 +1288,6 @@ static Foundation GetRoadFoundation(Slope tileh, RoadBits bits)
return (bits == ROAD_X ? FOUNDATION_INCLINED_X : FOUNDATION_INCLINED_Y);
}
@@ -62,28 +54,31 @@ index 70a014434..a72ff4eb7 100644
* Get the sprite offset within a spritegroup.
* @param slope Slope
diff --git a/src/road_cmd.h b/src/road_cmd.h
-index 753ebd21d..87dee9722 100644
+index 82f09d2fa9..431f0c20fc 100644
--- a/src/road_cmd.h
+++ b/src/road_cmd.h
-@@ -12,8 +12,11 @@
-
+@@ -13,6 +13,7 @@
#include "direction_type.h"
#include "road_type.h"
+ #include "command_type.h"
+#include "slope_type.h"
void DrawRoadDepotSprite(int x, int y, DiagDirection dir, RoadType rt);
void UpdateNearestTownForRoadTiles(bool invalidate);
+@@ -34,4 +35,6 @@ CommandCallback CcBuildRoadTunnel;
+ void CcRoadDepot(Commands cmd, const CommandCost &result, TileIndex tile, RoadType rt, DiagDirection dir);
+ void CcRoadStop(Commands cmd, const CommandCost &result, TileIndex tile, uint8 width, uint8 length, RoadStopType, bool is_drive_through, DiagDirection dir, RoadType, StationID, bool);
+Foundation GetRoadFoundation(Slope tileh, RoadBits bits);
+
#endif /* ROAD_CMD_H */
diff --git a/src/road_type.h b/src/road_type.h
-index 969b141ba..1af4275eb 100644
+index a792db7ba5..24dde2abbf 100644
--- a/src/road_type.h
+++ b/src/road_type.h
-@@ -68,4 +68,11 @@ enum RoadBits {
- DECLARE_ENUM_AS_BIT_SET(RoadBits)
- template <> struct EnumPropsT<RoadBits> : MakeEnumPropsT<RoadBits, byte, ROAD_NONE, ROAD_END, ROAD_NONE, 4> {};
+@@ -80,4 +80,11 @@ DECLARE_ENUM_AS_BIT_SET(DisallowedRoadDirections)
+ /** Helper information for extract tool. */
+ template <> struct EnumPropsT<DisallowedRoadDirections> : MakeEnumPropsT<DisallowedRoadDirections, byte, DRD_NONE, DRD_END, DRD_END, 2> {};
+const byte _road_sloped_sprites[14] = {
+ 0, 0, 2, 0,
@@ -94,10 +89,10 @@ index 969b141ba..1af4275eb 100644
+
#endif /* ROAD_TYPE_H */
diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp
-index 9c444d1d3..a83e7fda9 100644
+index 27900a2c8e..8867c969b6 100644
--- a/src/roadveh_cmd.cpp
+++ b/src/roadveh_cmd.cpp
-@@ -1511,7 +1511,7 @@ again:
+@@ -1508,7 +1508,7 @@ again:
v->x_pos = x;
v->y_pos = y;
v->UpdatePosition();
@@ -107,18 +102,18 @@ index 9c444d1d3..a83e7fda9 100644
}
}
diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp
-index 1a188252c..9304f5efc 100644
+index 5a91fa4742..5d3501761b 100644
--- a/src/station_cmd.cpp
+++ b/src/station_cmd.cpp
-@@ -56,6 +56,7 @@
- #include "linkgraph/refresh.h"
- #include "widgets/station_widget.h"
- #include "tunnelbridge_map.h"
+@@ -60,6 +60,7 @@
+ #include "waypoint_cmd.h"
+ #include "landscape_cmd.h"
+ #include "rail_cmd.h"
+#include "road_cmd.h"
#include "table/strings.h"
-@@ -776,7 +777,7 @@ CommandCost ClearTile_Station(TileIndex tile, DoCommandFlag flags);
+@@ -780,7 +781,7 @@ CommandCost ClearTile_Station(TileIndex tile, DoCommandFlag flags);
* Checks if the given tile is buildable, flat and has a certain height.
* @param tile TileIndex to check.
* @param invalid_dirs Prohibited directions for slopes (set of #DiagDirection).
@@ -127,7 +122,7 @@ index 1a188252c..9304f5efc 100644
* @param allow_steep Whether steep slopes are allowed.
* @param check_bridge Check for the existence of a bridge.
* @return The cost in case of success, or an error code if it failed.
-@@ -815,10 +816,10 @@ CommandCost CheckBuildableTile(TileIndex tile, uint invalid_dirs, int &allowed_z
+@@ -819,10 +820,10 @@ CommandCost CheckBuildableTile(TileIndex tile, uint invalid_dirs, int &allowed_z
}
/* The level of this tile must be equal to allowed_z. */
@@ -140,7 +135,7 @@ index 1a188252c..9304f5efc 100644
return_cmd_error(STR_ERROR_FLAT_LAND_REQUIRED);
}
-@@ -866,14 +867,14 @@ static CommandCost CheckFlatLandAirport(AirportTileTableIterator tile_iter, DoCo
+@@ -870,14 +871,14 @@ static CommandCost CheckFlatLandAirport(AirportTileTableIterator tile_iter, DoCo
static CommandCost CheckFlatLandRailStation(TileArea tile_area, DoCommandFlag flags, Axis axis, StationID *station, RailType rt, std::vector<Train *> &affected_vehicles, StationClassID spec_class, byte spec_index, byte plat_len, byte numtracks)
{
CommandCost cost(EXPENSES_CONSTRUCTION);
@@ -157,7 +152,7 @@ index 1a188252c..9304f5efc 100644
if (ret.Failed()) return ret;
cost.AddCost(ret);
-@@ -952,10 +953,10 @@ static CommandCost CheckFlatLandRailStation(TileArea tile_area, DoCommandFlag fl
+@@ -956,10 +957,10 @@ static CommandCost CheckFlatLandRailStation(TileArea tile_area, DoCommandFlag fl
static CommandCost CheckFlatLandRoadStop(TileArea tile_area, DoCommandFlag flags, uint invalid_dirs, bool is_drive_through, bool is_truck_stop, Axis axis, StationID *station, RoadType rt)
{
CommandCost cost(EXPENSES_CONSTRUCTION);
@@ -170,16 +165,16 @@ index 1a188252c..9304f5efc 100644
if (ret.Failed()) return ret;
cost.AddCost(ret);
-@@ -1878,7 +1879,7 @@ CommandCost CmdBuildRoadStop(TileIndex tile, DoCommandFlag flags, uint32 p1, uin
+@@ -1847,7 +1848,7 @@ CommandCost CmdBuildRoadStop(DoCommandFlag flags, TileIndex tile, uint8 width, u
/* Total road stop cost. */
- CommandCost cost(EXPENSES_CONSTRUCTION, roadstop_area.w * roadstop_area.h * _price[type ? PR_BUILD_STATION_TRUCK : PR_BUILD_STATION_BUS]);
+ CommandCost cost(EXPENSES_CONSTRUCTION, roadstop_area.w * roadstop_area.h * _price[is_truck_stop ? PR_BUILD_STATION_TRUCK : PR_BUILD_STATION_BUS]);
StationID est = INVALID_STATION;
-- ret = CheckFlatLandRoadStop(roadstop_area, flags, is_drive_through ? 5 << axis : 1 << ddir, is_drive_through, type, axis, &est, rt);
-+ ret = CheckFlatLandRoadStop(roadstop_area, flags, is_drive_through ? 0 : 1 << ddir, is_drive_through, type, axis, &est, rt);
+- ret = CheckFlatLandRoadStop(roadstop_area, flags, is_drive_through ? 5 << axis : 1 << ddir, is_drive_through, is_truck_stop, axis, &est, rt);
++ ret = CheckFlatLandRoadStop(roadstop_area, flags, is_drive_through ? 0 : 1 << ddir, is_drive_through, is_truck_stop, axis, &est, rt);
if (ret.Failed()) return ret;
cost.AddCost(ret);
-@@ -2895,6 +2896,32 @@ static void DrawTile_Station(TileInfo *ti)
+@@ -2849,6 +2850,32 @@ static void DrawTile_Station(TileInfo *ti)
palette = PALETTE_TO_GREY;
}
@@ -212,7 +207,7 @@ index 1a188252c..9304f5efc 100644
if (layout == nullptr && (t == nullptr || t->seq == nullptr)) t = GetStationTileLayout(GetStationType(ti->tile), gfx);
/* don't show foundation for docks */
-@@ -2961,10 +2988,10 @@ static void DrawTile_Station(TileInfo *ti)
+@@ -2915,10 +2942,10 @@ static void DrawTile_Station(TileInfo *ti)
}
OffsetGroundSprite(31, 1);
@@ -225,7 +220,7 @@ index 1a188252c..9304f5efc 100644
}
}
-@@ -3019,14 +3046,64 @@ draw_default_foundation:
+@@ -2973,14 +3000,64 @@ draw_default_foundation:
DrawGroundSprite(overlay + overlay_offset, PALETTE_CRASH);
}
} else {
@@ -293,7 +288,7 @@ index 1a188252c..9304f5efc 100644
}
}
}
-@@ -3120,6 +3197,16 @@ void StationPickerDrawSprite(int x, int y, StationType st, RailType railtype, Ro
+@@ -3074,6 +3151,16 @@ void StationPickerDrawSprite(int x, int y, StationType st, RailType railtype, Ro
static int GetSlopePixelZ_Station(TileIndex tile, uint x, uint y)
{
@@ -311,7 +306,7 @@ index 1a188252c..9304f5efc 100644
}
diff --git a/src/table/sprites.h b/src/table/sprites.h
-index b7bb91020..732a2dae7 100644
+index b7bb910203..732a2dae7d 100644
--- a/src/table/sprites.h
+++ b/src/table/sprites.h
@@ -266,7 +266,26 @@ static const SpriteID SPR_TRUCK_STOP_DT_Y_W = SPR_ROADSTOP_BASE + 4;
@@ -343,7 +338,7 @@ index b7bb91020..732a2dae7 100644
/** Tramway sprites */
static const SpriteID SPR_TRAMWAY_BASE = SPR_ROADSTOP_BASE + ROADSTOP_SPRITE_COUNT;
diff --git a/src/table/station_land.h b/src/table/station_land.h
-index 53a69e1e2..2b6deecd0 100644
+index 53a69e1e21..2b6deecd0c 100644
--- a/src/table/station_land.h
+++ b/src/table/station_land.h
@@ -775,6 +775,62 @@ static const DrawTileSeqStruct _station_display_datas_waypoint_Y[] = {
@@ -432,7 +427,7 @@ index 53a69e1e2..2b6deecd0 100644
static const DrawTileSprites _station_display_datas_oilrig[] = {
diff --git a/src/track_type.h b/src/track_type.h
-index 70278c58d..0c64b9978 100644
+index 70278c58d9..0c64b99780 100644
--- a/src/track_type.h
+++ b/src/track_type.h
@@ -120,4 +120,11 @@ DECLARE_ENUM_AS_BIT_SET(TrackdirBits)
diff --git a/manualPorts/openttd-git/underground.patch b/manualPorts/openttd-git/underground.patch
index 57e331a..6d4f29f 100644
--- a/manualPorts/openttd-git/underground.patch
+++ b/manualPorts/openttd-git/underground.patch
@@ -1,6 +1,6 @@
diff --git a/layer.txt b/layer.txt
new file mode 100644
-index 000000000..a5947189b
+index 0000000000..a5947189b9
--- /dev/null
+++ b/layer.txt
@@ -0,0 +1,48 @@
@@ -53,14 +53,14 @@ index 000000000..a5947189b
+* Expansion of the underground station does not work (when adding cells, a new one is added)
+- GF. "jumps" (the non-editable part of the station changes randomly when the station is modified)
diff --git a/media/baseset/opntitle.dat b/media/baseset/opntitle.dat
-index 264aaff60..9793856b7 100644
+index 264aaff60b..9793856b76 100644
Binary files a/media/baseset/opntitle.dat and b/media/baseset/opntitle.dat differ
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
-index 631eaf6de..c253e8295 100644
+index dd3a6c2f06..882402d8ab 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
-@@ -210,6 +210,10 @@ add_files(
- landscape.h
+@@ -222,6 +222,10 @@ add_files(
+ landscape_cmd.h
landscape_type.h
language.h
+ layer.cpp
@@ -70,9 +70,9 @@ index 631eaf6de..c253e8295 100644
livery.h
main_gui.cpp
map.cpp
-@@ -451,6 +455,8 @@ add_files(
- tunnelbridge.h
+@@ -481,6 +485,8 @@ add_files(
tunnelbridge_cmd.cpp
+ tunnelbridge_cmd.h
tunnelbridge_map.h
+ underground_gui.cpp
+ underground_gui.h
@@ -80,7 +80,7 @@ index 631eaf6de..c253e8295 100644
vehicle_base.h
vehicle_cmd.cpp
diff --git a/src/base_station_base.h b/src/base_station_base.h
-index 40543f1b8..ace01445a 100644
+index 40543f1b8f..ace01445a9 100644
--- a/src/base_station_base.h
+++ b/src/base_station_base.h
@@ -26,6 +26,13 @@ struct StationSpecList {
@@ -107,7 +107,7 @@ index 40543f1b8..ace01445a 100644
CommandCost BeforeAddTile(TileIndex tile, StationRectMode mode);
CommandCost BeforeAddRect(TileIndex tile, int w, int h, StationRectMode mode);
diff --git a/src/clear_cmd.cpp b/src/clear_cmd.cpp
-index 403631312..61704487e 100644
+index 17711a6267..e532fa529e 100644
--- a/src/clear_cmd.cpp
+++ b/src/clear_cmd.cpp
@@ -12,6 +12,7 @@
@@ -118,7 +118,7 @@ index 403631312..61704487e 100644
#include "viewport_func.h"
#include "water.h"
#include "core/random_func.hpp"
-@@ -98,8 +99,28 @@ static void DrawClearLandFence(const TileInfo *ti)
+@@ -99,8 +100,28 @@ static void DrawClearLandFence(const TileInfo *ti)
EndSpriteCombine();
}
@@ -147,7 +147,7 @@ index 403631312..61704487e 100644
switch (GetClearGround(ti->tile)) {
case CLEAR_GRASS:
DrawClearLandTile(ti, GetClearDensity(ti->tile));
-@@ -124,6 +145,9 @@ static void DrawTile_Clear(TileInfo *ti)
+@@ -125,6 +146,9 @@ static void DrawTile_Clear(TileInfo *ti)
break;
}
@@ -157,7 +157,7 @@ index 403631312..61704487e 100644
DrawBridgeMiddle(ti);
}
-@@ -321,7 +345,7 @@ void GenerateClearTile()
+@@ -322,7 +346,7 @@ void GenerateClearTile()
SetGeneratingWorldProgress(GWP_ROUGH_ROCKY, gi + i);
do {
IncreaseGeneratingWorldProgress(GWP_ROUGH_ROCKY);
@@ -166,7 +166,7 @@ index 403631312..61704487e 100644
if (IsTileType(tile, MP_CLEAR) && !IsClearGround(tile, CLEAR_DESERT)) SetClearGroundDensity(tile, CLEAR_ROUGH, 3);
} while (--i);
-@@ -329,7 +353,7 @@ void GenerateClearTile()
+@@ -330,7 +354,7 @@ void GenerateClearTile()
i = gi;
do {
uint32 r = Random();
@@ -176,7 +176,7 @@ index 403631312..61704487e 100644
IncreaseGeneratingWorldProgress(GWP_ROUGH_ROCKY);
if (IsTileType(tile, MP_CLEAR) && !IsClearGround(tile, CLEAR_DESERT)) {
diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp
-index 5cdb744ab..ed1f30af7 100644
+index 7f663fe863..63307d17d9 100644
--- a/src/console_cmds.cpp
+++ b/src/console_cmds.cpp
@@ -26,6 +26,7 @@
@@ -187,7 +187,7 @@ index 5cdb744ab..ed1f30af7 100644
#include "viewport_func.h"
#include "window_func.h"
#include "date_func.h"
-@@ -1070,6 +1071,7 @@ DEF_CONSOLE_CMD(ConRestart)
+@@ -1072,6 +1073,7 @@ DEF_CONSOLE_CMD(ConRestart)
}
/* Don't copy the _newgame pointers to the real pointers, so call SwitchToMode directly */
@@ -196,10 +196,10 @@ index 5cdb744ab..ed1f30af7 100644
_settings_game.game_creation.map_y = FindFirstBit(MapSizeY());
_switch_mode = SM_RESTARTGAME;
diff --git a/src/disaster_vehicle.cpp b/src/disaster_vehicle.cpp
-index cc245b38f..66a088595 100644
+index 668a1caea5..d339e898b0 100644
--- a/src/disaster_vehicle.cpp
+++ b/src/disaster_vehicle.cpp
-@@ -325,7 +325,7 @@ static bool DisasterTick_Ufo(DisasterVehicle *v)
+@@ -326,7 +326,7 @@ static bool DisasterTick_Ufo(DisasterVehicle *v)
return true;
}
if (++v->age < 6) {
@@ -208,7 +208,7 @@ index cc245b38f..66a088595 100644
return true;
}
v->current_order.SetDestination(1);
-@@ -572,12 +572,12 @@ static bool DisasterTick_Big_Ufo(DisasterVehicle *v)
+@@ -573,12 +573,12 @@ static bool DisasterTick_Big_Ufo(DisasterVehicle *v)
}
if (++v->age < 6) {
@@ -223,7 +223,7 @@ index cc245b38f..66a088595 100644
TileIndex tile = tile_org;
do {
if (IsPlainRailTile(tile) &&
-@@ -958,7 +958,7 @@ void ReleaseDisastersTargetingVehicle(VehicleID vehicle)
+@@ -959,7 +959,7 @@ void ReleaseDisastersTargetingVehicle(VehicleID vehicle)
if (v->current_order.GetDestination() != 0 && v->dest_tile == vehicle) {
/* Revert to target-searching */
v->current_order.SetDestination(0);
@@ -233,7 +233,7 @@ index cc245b38f..66a088595 100644
v->age = 0;
}
diff --git a/src/genworld.cpp b/src/genworld.cpp
-index 587d100b5..fc0f763c3 100644
+index 587d100b5a..fc0f763c37 100644
--- a/src/genworld.cpp
+++ b/src/genworld.cpp
@@ -321,7 +321,7 @@ void GenerateWorld(GenWorldMode mode, uint size_x, uint size_y, bool reset_setti
@@ -246,7 +246,7 @@ index 587d100b5..fc0f763c3 100644
_GenerateWorld();
diff --git a/src/genworld_gui.cpp b/src/genworld_gui.cpp
-index 2489105c2..00f18699c 100644
+index 2489105c23..00f18699ce 100644
--- a/src/genworld_gui.cpp
+++ b/src/genworld_gui.cpp
@@ -16,6 +16,8 @@
@@ -409,7 +409,7 @@ index 2489105c2..00f18699c 100644
/* Date. */
NWidget(NWID_HORIZONTAL),
diff --git a/src/gfx_type.h b/src/gfx_type.h
-index a6bf3cf6d..a7c157ada 100644
+index 932a6cb87d..5692821300 100644
--- a/src/gfx_type.h
+++ b/src/gfx_type.h
@@ -156,6 +156,7 @@ struct DrawPixelInfo {
@@ -421,7 +421,7 @@ index a6bf3cf6d..a7c157ada 100644
};
diff --git a/src/heightmap.cpp b/src/heightmap.cpp
-index 0c726371c..a073c7cf4 100644
+index 0c726371ce..a073c7cf46 100644
--- a/src/heightmap.cpp
+++ b/src/heightmap.cpp
@@ -14,6 +14,7 @@
@@ -443,7 +443,7 @@ index 0c726371c..a073c7cf4 100644
for (row = 0; (uint)row < height; row++) {
for (col = 0; (uint)col < width; col++) {
diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp
-index b03a722b7..fd00ec0cd 100644
+index 41ee3ac06e..a18fc64da5 100644
--- a/src/industry_cmd.cpp
+++ b/src/industry_cmd.cpp
@@ -12,6 +12,7 @@
@@ -454,7 +454,7 @@ index b03a722b7..fd00ec0cd 100644
#include "viewport_func.h"
#include "command_func.h"
#include "town.h"
-@@ -1444,7 +1445,7 @@ static CommandCost CheckIfIndustryTilesAreFree(TileIndex tile, const IndustryTil
+@@ -1447,7 +1448,7 @@ static CommandCost CheckIfIndustryTilesAreFree(TileIndex tile, const IndustryTil
IndustryGfx gfx = GetTranslatedIndustryTileID(it.gfx);
TileIndex cur_tile = TileAddWrap(tile, it.ti.x, it.ti.y);
@@ -463,7 +463,7 @@ index b03a722b7..fd00ec0cd 100644
return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
}
-@@ -2023,7 +2024,7 @@ CommandCost CmdBuildIndustry(TileIndex tile, DoCommandFlag flags, uint32 p1, uin
+@@ -2023,7 +2024,7 @@ CommandCost CmdBuildIndustry(DoCommandFlag flags, TileIndex tile, IndustryType i
/* We should not have more than one Random() in a function call
* because parameter evaluation order is not guaranteed in the c++ standard
*/
@@ -472,7 +472,7 @@ index b03a722b7..fd00ec0cd 100644
/* Start with a random layout */
size_t layout = RandomRange((uint32)num_layouts);
/* Check now each layout, starting with the random one */
-@@ -2229,7 +2230,7 @@ static Industry *PlaceIndustry(IndustryType type, IndustryAvailabilityCallType c
+@@ -2220,7 +2221,7 @@ static Industry *PlaceIndustry(IndustryType type, IndustryAvailabilityCallType c
{
uint tries = try_hard ? 10000u : 2000u;
for (; tries > 0; tries--) {
@@ -482,10 +482,10 @@ index b03a722b7..fd00ec0cd 100644
}
return nullptr;
diff --git a/src/landscape.cpp b/src/landscape.cpp
-index f13d1835f..6ed0c6569 100644
+index b921deef22..b5082b2470 100644
--- a/src/landscape.cpp
+++ b/src/landscape.cpp
-@@ -34,6 +34,7 @@
+@@ -35,6 +35,7 @@
#include <array>
#include <list>
#include <set>
@@ -493,7 +493,7 @@ index f13d1835f..6ed0c6569 100644
#include "table/strings.h"
#include "table/sprites.h"
-@@ -813,10 +814,10 @@ void RunTileLoop()
+@@ -808,10 +809,10 @@ void RunTileLoop()
0xD8F, 0x1296, 0x2496, 0x4357, 0x8679, 0x1030E, 0x206CD, 0x403FE, 0x807B8, 0x1004B2, 0x2006A8, 0x4004B2, 0x800B87
};
static_assert(lengthof(feedbacks) == 2 * MAX_MAP_SIZE_BITS - 2 * MIN_MAP_SIZE_BITS + 1);
@@ -506,7 +506,7 @@ index f13d1835f..6ed0c6569 100644
TileIndex tile = _cur_tileloop_tile;
/* The LFSR cannot have a zeroed state. */
-@@ -840,17 +841,23 @@ void RunTileLoop()
+@@ -835,17 +836,23 @@ void RunTileLoop()
void InitializeLandscape()
{
@@ -539,7 +539,7 @@ index f13d1835f..6ed0c6569 100644
}
static const byte _genterrain_tbl_1[5] = { 10, 22, 33, 37, 4 };
-@@ -1281,7 +1288,7 @@ static void CreateRivers()
+@@ -1276,7 +1283,7 @@ static void CreateRivers()
for (; wells != 0; wells--) {
IncreaseGeneratingWorldProgress(GWP_RIVER);
for (int tries = 0; tries < 128; tries++) {
@@ -549,7 +549,7 @@ index f13d1835f..6ed0c6569 100644
if (FlowRiver(t, t)) break;
}
diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt
-index 1ad648233..dafb1b733 100644
+index 1ad648233d..dafb1b7331 100644
--- a/src/lang/afrikaans.txt
+++ b/src/lang/afrikaans.txt
@@ -2730,7 +2730,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Tremweg
@@ -562,7 +562,7 @@ index 1ad648233..dafb1b733 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Stasie klas: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Stasie tiepe: {LTBLUE}{STRING}
diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt
-index 5aacaf933..533380300 100644
+index 5aacaf9339..533380300b 100644
--- a/src/lang/arabic_egypt.txt
+++ b/src/lang/arabic_egypt.txt
@@ -2472,7 +2472,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}مالك
@@ -575,7 +575,7 @@ index 5aacaf933..533380300 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK} فئة المحطة: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}نوع المحطة: {LTBLUE}{STRING}
diff --git a/src/lang/basque.txt b/src/lang/basque.txt
-index 305520635..c83d88823 100644
+index 3055206359..c83d88823e 100644
--- a/src/lang/basque.txt
+++ b/src/lang/basque.txt
@@ -2593,7 +2593,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Tranbia
@@ -588,7 +588,7 @@ index 305520635..c83d88823 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Geltoki mota: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Geltoki mota: {LTBLUE}{STRING}
diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt
-index 1dbc92f0b..532900688 100644
+index 1dbc92f0b1..532900688f 100644
--- a/src/lang/belarusian.txt
+++ b/src/lang/belarusian.txt
@@ -3056,7 +3056,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Улад
@@ -601,10 +601,10 @@ index 1dbc92f0b..532900688 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Кляса станцыі: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Тып станцыi: {LTBLUE}{STRING}
diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt
-index 55872e2c4..e62dc9fb3 100644
+index f3b62be925..0e3ced3192 100644
--- a/src/lang/brazilian_portuguese.txt
+++ b/src/lang/brazilian_portuguese.txt
-@@ -2921,7 +2921,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Dono da
+@@ -2923,7 +2923,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Dono da
STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Dono da linha ferroviária: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Prefeitura: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Nenhum
@@ -614,7 +614,7 @@ index 55872e2c4..e62dc9fb3 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Classe de Estação: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Tipo de Estação: {LTBLUE}{STRING}
diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt
-index 72c553124..2cd79f0bc 100644
+index 72c5531243..2cd79f0bcc 100644
--- a/src/lang/bulgarian.txt
+++ b/src/lang/bulgarian.txt
@@ -2643,7 +2643,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Собс
@@ -627,7 +627,7 @@ index 72c553124..2cd79f0bc 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Клас на станцията: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Тип на станцията: {LTBLUE}{STRING}
diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt
-index 6409ddd26..dab10e967 100644
+index 6409ddd264..dab10e967f 100644
--- a/src/lang/catalan.txt
+++ b/src/lang/catalan.txt
@@ -2923,7 +2923,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Propieta
@@ -640,10 +640,10 @@ index 6409ddd26..dab10e967 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Classe d'estació: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Tipus d'estació: {LTBLUE}{STRING}
diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt
-index 59ba78ef9..a8c6b83da 100644
+index 14ed8faf61..6883a06c30 100644
--- a/src/lang/croatian.txt
+++ b/src/lang/croatian.txt
-@@ -2835,7 +2835,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Vlasnik
+@@ -2876,7 +2876,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Vlasnik
STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Vlasnik željeznice: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Područna nadležnost: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Nijedan/Nitko/Ništa
@@ -653,10 +653,10 @@ index 59ba78ef9..a8c6b83da 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Klasa postaje: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Vrsta postaje: {LTBLUE}{STRING}
diff --git a/src/lang/czech.txt b/src/lang/czech.txt
-index 8b6bdb437..35010f968 100644
+index 371594ff94..73c23a3e67 100644
--- a/src/lang/czech.txt
+++ b/src/lang/czech.txt
-@@ -3011,7 +3011,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Majitel
+@@ -3014,7 +3014,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Majitel
STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Majitel tratě: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Místní správa: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Nic
@@ -666,7 +666,7 @@ index 8b6bdb437..35010f968 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Třída stanice: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Druh stanice: {LTBLUE}{STRING}
diff --git a/src/lang/danish.txt b/src/lang/danish.txt
-index f3d32bce8..1338a15ba 100644
+index f3d32bce86..1338a15baf 100644
--- a/src/lang/danish.txt
+++ b/src/lang/danish.txt
@@ -2922,7 +2922,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Ejer af
@@ -679,7 +679,7 @@ index f3d32bce8..1338a15ba 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Stationsklasse: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Stationstype: {LTBLUE}{STRING}
diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt
-index ff15afbf6..7f320f552 100644
+index ff15afbf64..7f320f5525 100644
--- a/src/lang/dutch.txt
+++ b/src/lang/dutch.txt
@@ -2922,7 +2922,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Eigenaar
@@ -692,7 +692,7 @@ index ff15afbf6..7f320f552 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Stationsklasse: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Stationstype: {LTBLUE}{STRING}
diff --git a/src/lang/english.txt b/src/lang/english.txt
-index becf8d35c..0a3ea67f2 100644
+index becf8d35c2..0a3ea67f25 100644
--- a/src/lang/english.txt
+++ b/src/lang/english.txt
@@ -477,6 +477,19 @@ STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION :Airport constru
@@ -761,7 +761,7 @@ index becf8d35c..0a3ea67f2 100644
+
+# end underground string
diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt
-index 07a31fe0f..119f957b4 100644
+index 07a31fe0ff..119f957b4c 100644
--- a/src/lang/english_AU.txt
+++ b/src/lang/english_AU.txt
@@ -2655,7 +2655,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Tramway
@@ -774,7 +774,7 @@ index 07a31fe0f..119f957b4 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Station class: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Station type: {LTBLUE}{STRING}
diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt
-index 764f484fe..dd0345629 100644
+index 764f484fe3..dd0345629e 100644
--- a/src/lang/english_US.txt
+++ b/src/lang/english_US.txt
@@ -2922,7 +2922,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Streetca
@@ -787,7 +787,7 @@ index 764f484fe..dd0345629 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Station class: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Station type: {LTBLUE}{STRING}
diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt
-index d9f5377ea..d0f4e5291 100644
+index d9f5377eac..d0f4e52914 100644
--- a/src/lang/esperanto.txt
+++ b/src/lang/esperanto.txt
@@ -2294,7 +2294,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Posedant
@@ -800,7 +800,7 @@ index d9f5377ea..d0f4e5291 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Stacioklaso: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Staciotipo: {LTBLUE}{STRING}
diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt
-index c98a8a242..a0865eef0 100644
+index c98a8a2425..a0865eef0c 100644
--- a/src/lang/estonian.txt
+++ b/src/lang/estonian.txt
@@ -2927,7 +2927,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Trammite
@@ -813,7 +813,7 @@ index c98a8a242..a0865eef0 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Jaama järk: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Jaama liik: {LTBLUE}{STRING}
diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt
-index ff2312ab7..46895e640 100644
+index ff2312ab71..46895e6408 100644
--- a/src/lang/faroese.txt
+++ b/src/lang/faroese.txt
@@ -2427,7 +2427,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Sporvogn
@@ -826,7 +826,7 @@ index ff2312ab7..46895e640 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Støð klassi: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Støð slag: {LTBLUE}{STRING}
diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt
-index 2d08b1e3c..5632d8b5e 100644
+index 2d08b1e3c7..5632d8b5e0 100644
--- a/src/lang/finnish.txt
+++ b/src/lang/finnish.txt
@@ -2920,7 +2920,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Raitioti
@@ -839,7 +839,7 @@ index 2d08b1e3c..5632d8b5e 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Aseman luokka: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Aseman tyyppi: {LTBLUE}{STRING}
diff --git a/src/lang/french.txt b/src/lang/french.txt
-index fd4bdd431..fe21b4da0 100644
+index fd4bdd4314..fe21b4da00 100644
--- a/src/lang/french.txt
+++ b/src/lang/french.txt
@@ -2923,7 +2923,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Proprié
@@ -852,7 +852,7 @@ index fd4bdd431..fe21b4da0 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Type de station{NBSP}: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Type de station{NBSP}: {LTBLUE}{STRING}
diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt
-index 13f1d7f74..5ccf9aa7c 100644
+index 13f1d7f749..5ccf9aa7cd 100644
--- a/src/lang/gaelic.txt
+++ b/src/lang/gaelic.txt
@@ -2910,7 +2910,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Seilbhea
@@ -865,10 +865,10 @@ index 13f1d7f74..5ccf9aa7c 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Seòrsa an stèisein: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Seòrsa an stèisein: {LTBLUE}{STRING}
diff --git a/src/lang/galician.txt b/src/lang/galician.txt
-index b281dbc26..535fc65d6 100644
+index c5817d0f47..31c5bea9c5 100644
--- a/src/lang/galician.txt
+++ b/src/lang/galician.txt
-@@ -2731,7 +2731,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Propieta
+@@ -2923,7 +2923,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Propieta
STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Propietario da vía ferroviaria: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Autoridade local: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Ningunha
@@ -878,7 +878,7 @@ index b281dbc26..535fc65d6 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Clase de estación: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Tipo de estación: {LTBLUE}{STRING}
diff --git a/src/lang/german.txt b/src/lang/german.txt
-index 8b1d81dba..aa1282c29 100644
+index 8b1d81dba1..aa1282c29d 100644
--- a/src/lang/german.txt
+++ b/src/lang/german.txt
@@ -2923,7 +2923,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Straßen
@@ -891,7 +891,7 @@ index 8b1d81dba..aa1282c29 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Stationsklasse: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Stationstyp: {LTBLUE}{STRING}
diff --git a/src/lang/greek.txt b/src/lang/greek.txt
-index ca18521d5..5d69b32e1 100644
+index ca18521d53..5d69b32e1c 100644
--- a/src/lang/greek.txt
+++ b/src/lang/greek.txt
@@ -3029,7 +3029,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Ιδιο
@@ -904,7 +904,7 @@ index ca18521d5..5d69b32e1 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Κατηγορία σταθμού: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Τύπος σταθμού: {LTBLUE}{STRING}
diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt
-index cd97ba5fe..fb5dbf1dd 100644
+index cd97ba5fe1..fb5dbf1dd7 100644
--- a/src/lang/hebrew.txt
+++ b/src/lang/hebrew.txt
@@ -2703,7 +2703,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}:בעל
@@ -917,10 +917,10 @@ index cd97ba5fe..fb5dbf1dd 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}{LTBLUE}{STRING}: אופי התחנה
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK} {LTBLUE}{STRING}: סוג התחנה
diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt
-index 931b1475e..de42765a3 100644
+index d457ea8ba4..7bc8c5b922 100644
--- a/src/lang/hungarian.txt
+++ b/src/lang/hungarian.txt
-@@ -2982,7 +2982,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}A villam
+@@ -2986,7 +2986,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}A villam
STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}A vasúti pálya tulajdonosa: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Helyi önkormányzat: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Nincs
@@ -930,7 +930,7 @@ index 931b1475e..de42765a3 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Állomás osztálya: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Állomás típusa: {LTBLUE}{STRING}
diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt
-index 2d3bda353..44a916f2b 100644
+index 2d3bda353c..44a916f2b2 100644
--- a/src/lang/icelandic.txt
+++ b/src/lang/icelandic.txt
@@ -2535,7 +2535,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Eigandi
@@ -943,10 +943,10 @@ index 2d3bda353..44a916f2b 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Tegund stöðvar: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Tegund stöðvar: {LTBLUE}{STRING}
diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt
-index f2628aa05..c2947b55b 100644
+index af5fe37acd..2237d70c42 100644
--- a/src/lang/indonesian.txt
+++ b/src/lang/indonesian.txt
-@@ -2920,7 +2920,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Pemilik
+@@ -2922,7 +2922,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Pemilik
STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Pemilik Rel Kereta: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Pemkot setempat: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Kosong
@@ -956,10 +956,10 @@ index f2628aa05..c2947b55b 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Kelas Stasiun: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Tipe Stasiun: {LTBLUE}{STRING}
diff --git a/src/lang/irish.txt b/src/lang/irish.txt
-index 88d8449d9..ba04daa46 100644
+index 9341b996cd..32f79e0df1 100644
--- a/src/lang/irish.txt
+++ b/src/lang/irish.txt
-@@ -2912,7 +2912,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Úinéir
+@@ -2914,7 +2914,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Úinéir
STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Úinéir an iarnróid: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Údarás áitiúil: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Ceann ar bith
@@ -969,10 +969,10 @@ index 88d8449d9..ba04daa46 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Aicme an stáisiúin: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Cineál stáisiúin: {LTBLUE}{STRING}
diff --git a/src/lang/italian.txt b/src/lang/italian.txt
-index 340ee9d4e..19444aef5 100644
+index 274e600873..af0a222887 100644
--- a/src/lang/italian.txt
+++ b/src/lang/italian.txt
-@@ -2886,7 +2886,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Propriet
+@@ -2894,7 +2894,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Propriet
STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Proprietario ferrovia: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Autorità locale: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Nessuna
@@ -982,7 +982,7 @@ index 340ee9d4e..19444aef5 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Tipo stazione: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Tipo stazione: {LTBLUE}{STRING}
diff --git a/src/lang/korean.txt b/src/lang/korean.txt
-index 448c73802..5fd406ddb 100644
+index 448c738025..5fd406ddb7 100644
--- a/src/lang/korean.txt
+++ b/src/lang/korean.txt
@@ -2923,7 +2923,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}전찻
@@ -995,7 +995,7 @@ index 448c73802..5fd406ddb 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}역 분류: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}역 종류: {LTBLUE}{STRING}
diff --git a/src/lang/latin.txt b/src/lang/latin.txt
-index 88f0a360e..7097884f8 100644
+index 88f0a360ee..7097884f87 100644
--- a/src/lang/latin.txt
+++ b/src/lang/latin.txt
@@ -2911,7 +2911,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Possesso
@@ -1008,7 +1008,7 @@ index 88f0a360e..7097884f8 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Classis stationis: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Typus stationis: {LTBLUE}{STRING}
diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt
-index 2416d61e4..bacbfb1e5 100644
+index 2416d61e45..bacbfb1e5c 100644
--- a/src/lang/latvian.txt
+++ b/src/lang/latvian.txt
@@ -2923,7 +2923,7 @@ STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Dzelzce
@@ -1021,7 +1021,7 @@ index 2416d61e4..bacbfb1e5 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Stacijas klase: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Stacijas tips: {LTBLUE}{STRING}
diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt
-index ebd40a474..4bca69e73 100644
+index ebd40a4743..4bca69e730 100644
--- a/src/lang/lithuanian.txt
+++ b/src/lang/lithuanian.txt
@@ -3078,7 +3078,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Tramvaja
@@ -1034,7 +1034,7 @@ index ebd40a474..4bca69e73 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Stotelės rūšis: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Stotelės tipas: {LTBLUE}{STRING}
diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt
-index 38cece0de..24b831122 100644
+index 38cece0dec..24b8311229 100644
--- a/src/lang/luxembourgish.txt
+++ b/src/lang/luxembourgish.txt
@@ -2918,7 +2918,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Tramschi
@@ -1047,7 +1047,7 @@ index 38cece0de..24b831122 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Statiounsklass: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Statiounstyp: {LTBLUE}{STRING}
diff --git a/src/lang/malay.txt b/src/lang/malay.txt
-index 2f4811261..3e04e3d4a 100644
+index 2f4811261c..3e04e3d4a3 100644
--- a/src/lang/malay.txt
+++ b/src/lang/malay.txt
@@ -2433,7 +2433,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Pemilik
@@ -1060,10 +1060,10 @@ index 2f4811261..3e04e3d4a 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Kelas stesen: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Jenis stesen: {LTBLUE}{STRING}
diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt
-index 911b7ba78..02e359b91 100644
+index 8341ff0686..c96be04da8 100644
--- a/src/lang/norwegian_bokmal.txt
+++ b/src/lang/norwegian_bokmal.txt
-@@ -2922,7 +2922,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Eier av
+@@ -2926,7 +2926,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Eier av
STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Eier av jernbanespor: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Bystyret: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Ingen
@@ -1073,7 +1073,7 @@ index 911b7ba78..02e359b91 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Stasjonstype: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Stasjonstype: {LTBLUE}{STRING}
diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt
-index d45fb4d56..a4329a177 100644
+index d45fb4d563..a4329a177a 100644
--- a/src/lang/norwegian_nynorsk.txt
+++ b/src/lang/norwegian_nynorsk.txt
@@ -2603,7 +2603,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Trikkesp
@@ -1086,7 +1086,7 @@ index d45fb4d56..a4329a177 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Stasjonsklasse: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Stasjontype: {LTBLUE}{STRING}
diff --git a/src/lang/persian.txt b/src/lang/persian.txt
-index 7ebfe1503..d5b98ab5a 100644
+index 7ebfe1503d..d5b98ab5aa 100644
--- a/src/lang/persian.txt
+++ b/src/lang/persian.txt
@@ -2393,7 +2393,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}مالک
@@ -1099,10 +1099,10 @@ index 7ebfe1503..d5b98ab5a 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}کلاس ایستگاه: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}نوع ایستگاه: {LTBLUE}{STRING}
diff --git a/src/lang/polish.txt b/src/lang/polish.txt
-index c621eb314..ddc00c8c8 100644
+index 77369b0f88..b45cab6046 100644
--- a/src/lang/polish.txt
+++ b/src/lang/polish.txt
-@@ -3300,7 +3300,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Właści
+@@ -3302,7 +3302,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Właści
STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Właściciel linii kolejowej: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Lokalne władze: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Brak
@@ -1112,7 +1112,7 @@ index c621eb314..ddc00c8c8 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Rodzaj stacji: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Typ stacji: {LTBLUE}{STRING}
diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt
-index 4d8a23429..e750af281 100644
+index 4d8a234294..e750af2811 100644
--- a/src/lang/portuguese.txt
+++ b/src/lang/portuguese.txt
@@ -2923,7 +2923,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Dono da
@@ -1125,10 +1125,10 @@ index 4d8a23429..e750af281 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Tipo de estação: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Tipo de estação: {LTBLUE}{STRING}
diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt
-index 20778ce5a..f3410b16d 100644
+index c4b96a3589..b990beed99 100644
--- a/src/lang/romanian.txt
+++ b/src/lang/romanian.txt
-@@ -2913,7 +2913,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Propriet
+@@ -2922,7 +2922,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Propriet
STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Proprietar al căii ferate: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Autoritatea locală: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Niciuna
@@ -1138,7 +1138,7 @@ index 20778ce5a..f3410b16d 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Clasa staţiei: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Tip staţie: {LTBLUE}{STRING}
diff --git a/src/lang/russian.txt b/src/lang/russian.txt
-index 534be43c1..1b1e97c9c 100644
+index 534be43c18..1b1e97c9c9 100644
--- a/src/lang/russian.txt
+++ b/src/lang/russian.txt
@@ -604,6 +604,19 @@ STR_LANDSCAPING_MENU_LANDSCAPING :Ландшаф
@@ -1207,7 +1207,7 @@ index 534be43c1..1b1e97c9c 100644
+
+# end underground string
diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt
-index 10f341a6f..27a18ebaa 100644
+index 10f341a6f8..27a18ebaa0 100644
--- a/src/lang/serbian.txt
+++ b/src/lang/serbian.txt
@@ -3113,7 +3113,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Vlasnik
@@ -1220,7 +1220,7 @@ index 10f341a6f..27a18ebaa 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Klasa stanice: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Vrsta stanice: {LTBLUE}{STRING}
diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt
-index 5f92aff44..f189e145e 100644
+index 5f92aff44c..f189e145e8 100644
--- a/src/lang/simplified_chinese.txt
+++ b/src/lang/simplified_chinese.txt
@@ -2922,7 +2922,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}有轨
@@ -1233,7 +1233,7 @@ index 5f92aff44..f189e145e 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}车站分类: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}车站类型: {LTBLUE}{STRING}
diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt
-index 102592dec..ad034fcfb 100644
+index 102592deca..ad034fcfb7 100644
--- a/src/lang/slovak.txt
+++ b/src/lang/slovak.txt
@@ -2986,7 +2986,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Vlastní
@@ -1246,7 +1246,7 @@ index 102592dec..ad034fcfb 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Trieda stanice: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Typ stanice: {LTBLUE}{STRING}
diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt
-index 7215adc07..9a06c71a3 100644
+index 7215adc077..9a06c71a31 100644
--- a/src/lang/slovenian.txt
+++ b/src/lang/slovenian.txt
@@ -2848,7 +2848,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Lastnik
@@ -1259,10 +1259,10 @@ index 7215adc07..9a06c71a3 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Razred postaje: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Vrsta postaje: {LTBLUE}{STRING}
diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt
-index 4af060379..7d30f6587 100644
+index 8300736058..17cfd4a3ce 100644
--- a/src/lang/spanish.txt
+++ b/src/lang/spanish.txt
-@@ -2920,7 +2920,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Propieta
+@@ -2923,7 +2923,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Propieta
STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Propietario del ferrocarril: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Autoridad local: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Ninguna
@@ -1272,7 +1272,7 @@ index 4af060379..7d30f6587 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Clase de estación: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Tipo de estación: {LTBLUE}{STRING}
diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt
-index 4bfac233f..829699c54 100644
+index 4bfac233fd..829699c543 100644
--- a/src/lang/spanish_MX.txt
+++ b/src/lang/spanish_MX.txt
@@ -2919,7 +2919,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Propieta
@@ -1285,10 +1285,10 @@ index 4bfac233f..829699c54 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Clase de estación: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Tipo de estación: {LTBLUE}{STRING}
diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt
-index a39e3925a..d4e43ebb1 100644
+index f63ac4e02d..44f084a963 100644
--- a/src/lang/swedish.txt
+++ b/src/lang/swedish.txt
-@@ -2920,7 +2920,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Spårvä
+@@ -2921,7 +2921,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Spårvä
STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Järnvägens ägare: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Lokala myndigheter: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Ingen
@@ -1298,10 +1298,10 @@ index a39e3925a..d4e43ebb1 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Stationsklass: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Stationstyp: {LTBLUE}{STRING}
diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt
-index 8894401bc..e84e9080b 100644
+index 621ebb8517..43cf891ae3 100644
--- a/src/lang/tamil.txt
+++ b/src/lang/tamil.txt
-@@ -2566,7 +2566,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}ட்
+@@ -2591,7 +2591,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}ட்
STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}இரயில்வே உரிமையாளர்: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}நகராட்சி: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :ஒன்றுமில்லை
@@ -1311,10 +1311,10 @@ index 8894401bc..e84e9080b 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}நிலையத்தின் பிரிவு: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}நிலையத்தின் வகை: {LTBLUE}{STRING}
diff --git a/src/lang/thai.txt b/src/lang/thai.txt
-index 5a9fe48bd..770e775e1 100644
+index a90f48480e..ed69fa901a 100644
--- a/src/lang/thai.txt
+++ b/src/lang/thai.txt
-@@ -2628,7 +2628,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}ผู
+@@ -2629,7 +2629,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}ผู
STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}ผู้ครอบครองทางรถไฟ: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}ขึ้นตรงกับผู้ดูแลในท้องถิ่น: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :ไม่มี
@@ -1324,10 +1324,10 @@ index 5a9fe48bd..770e775e1 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}ประเภทของสถานี: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}รูปแบบของสถานี: {LTBLUE}{STRING}
diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt
-index 941462a07..51815a232 100644
+index f8e60b6e7a..bc1d50e6c5 100644
--- a/src/lang/traditional_chinese.txt
+++ b/src/lang/traditional_chinese.txt
-@@ -2716,7 +2716,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}電車
+@@ -2820,7 +2820,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}電車
STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}鐵路所有者:{LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}地方政府:{LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :無
@@ -1337,7 +1337,7 @@ index 941462a07..51815a232 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}車站風格:{LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}車站種類:{LTBLUE}{STRING}
diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt
-index 0d35521c3..9bb95d6e5 100644
+index 0d35521c38..9bb95d6e54 100644
--- a/src/lang/turkish.txt
+++ b/src/lang/turkish.txt
@@ -2919,7 +2919,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Tramvay
@@ -1350,7 +1350,7 @@ index 0d35521c3..9bb95d6e5 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}İstasyon sınıfı: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}İstasyon türü: {LTBLUE}{STRING}
diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt
-index 77530aa42..b78a9b590 100644
+index 77530aa423..b78a9b5909 100644
--- a/src/lang/ukrainian.txt
+++ b/src/lang/ukrainian.txt
@@ -3049,7 +3049,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Влас
@@ -1363,7 +1363,7 @@ index 77530aa42..b78a9b590 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Клас станції: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Тип станції: {LTBLUE}{STRING}
diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt
-index 478f75c69..499479052 100644
+index 7a914ff636..99fb102071 100644
--- a/src/lang/vietnamese.txt
+++ b/src/lang/vietnamese.txt
@@ -2922,7 +2922,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Chủ đ
@@ -1376,7 +1376,7 @@ index 478f75c69..499479052 100644
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Loại ga,bến: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Kiểu ga,bến: {LTBLUE}{STRING}
diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt
-index 4b970c919..b244655bd 100644
+index 4b970c9193..b244655bdd 100644
--- a/src/lang/welsh.txt
+++ b/src/lang/welsh.txt
@@ -2685,7 +2685,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Perchenn
@@ -1390,7 +1390,7 @@ index 4b970c919..b244655bd 100644
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Math gorsaf: {LTBLUE}{STRING}
diff --git a/src/layer.cpp b/src/layer.cpp
new file mode 100644
-index 000000000..aab234e53
+index 0000000000..aab234e53d
--- /dev/null
+++ b/src/layer.cpp
@@ -0,0 +1,136 @@
@@ -1532,7 +1532,7 @@ index 000000000..aab234e53
+}
diff --git a/src/layer_func.h b/src/layer_func.h
new file mode 100644
-index 000000000..05022163a
+index 0000000000..05022163a2
--- /dev/null
+++ b/src/layer_func.h
@@ -0,0 +1,102 @@
@@ -1640,7 +1640,7 @@ index 000000000..05022163a
+#endif /* LAYER_FUNC_H */
diff --git a/src/layer_gui.h b/src/layer_gui.h
new file mode 100644
-index 000000000..7b791b7e9
+index 0000000000..7b791b7e9f
--- /dev/null
+++ b/src/layer_gui.h
@@ -0,0 +1,17 @@
@@ -1663,7 +1663,7 @@ index 000000000..7b791b7e9
+#endif /* LAYER_GUI_H */
diff --git a/src/layer_type.h b/src/layer_type.h
new file mode 100644
-index 000000000..53eafdde6
+index 0000000000..53eafdde63
--- /dev/null
+++ b/src/layer_type.h
@@ -0,0 +1,22 @@
@@ -1690,20 +1690,20 @@ index 000000000..53eafdde6
+
+#endif /* LAYER_TYPE_H */
diff --git a/src/main_gui.cpp b/src/main_gui.cpp
-index 6131050cf..5a9a2c2e7 100644
+index b2c4bfee48..6a84d778bb 100644
--- a/src/main_gui.cpp
+++ b/src/main_gui.cpp
-@@ -33,6 +33,9 @@
- #include "guitimer_func.h"
+@@ -34,6 +34,9 @@
#include "error.h"
#include "news_gui.h"
+ #include "misc_cmd.h"
+#include "gfx_func.h"
+#include "layer_gui.h"
+#include "landscape.h"
#include "saveload/saveload.h"
-@@ -65,7 +68,7 @@ bool HandlePlacePushButton(Window *w, int widget, CursorID cursor, HighLightStyl
+@@ -66,7 +69,7 @@ bool HandlePlacePushButton(Window *w, int widget, CursorID cursor, HighLightStyl
if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
w->SetDirty();
@@ -1712,7 +1712,7 @@ index 6131050cf..5a9a2c2e7 100644
ResetObjectToPlace();
return false;
}
-@@ -152,6 +155,22 @@ void ZoomInOrOutToCursorWindow(bool in, Window *w)
+@@ -153,6 +156,22 @@ void ZoomInOrOutToCursorWindow(bool in, Window *w)
}
}
@@ -1735,7 +1735,7 @@ index 6131050cf..5a9a2c2e7 100644
void FixTitleGameZoom(int zoom_adjust)
{
if (_game_mode != GM_MENU) return;
-@@ -421,7 +440,11 @@ struct MainWindow : Window
+@@ -422,7 +441,11 @@ struct MainWindow : Window
void OnMouseWheel(int wheel) override
{
if (_settings_client.gui.scrollwheel_scrolling != 2) {
@@ -1749,7 +1749,7 @@ index 6131050cf..5a9a2c2e7 100644
}
diff --git a/src/map.cpp b/src/map.cpp
-index 308e28e49..b49dceb9c 100644
+index 2a08d656e6..7430c1a2e5 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -11,6 +11,7 @@
@@ -1789,7 +1789,7 @@ index 308e28e49..b49dceb9c 100644
} else {
return CircularTileSearch(tile, size / 2, 0, 0, proc, user_data);
diff --git a/src/map_func.h b/src/map_func.h
-index b02ba5777..5ee5360c5 100644
+index 34cc5ee0ee..d4993b94bb 100644
--- a/src/map_func.h
+++ b/src/map_func.h
@@ -41,7 +41,7 @@ extern Tile *_m;
@@ -1877,7 +1877,7 @@ index b02ba5777..5ee5360c5 100644
diff --git a/src/misc.cpp b/src/misc.cpp
-index c46a1c11d..afbbc7506 100644
+index c46a1c11d4..afbbc75063 100644
--- a/src/misc.cpp
+++ b/src/misc.cpp
@@ -8,6 +8,7 @@
@@ -1898,10 +1898,10 @@ index c46a1c11d..afbbc7506 100644
_pause_mode = PM_UNPAUSED;
_game_speed = 100;
diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp
-index f0492925d..9523abcd3 100644
+index bc5179f82f..32a8ad48c0 100644
--- a/src/misc_gui.cpp
+++ b/src/misc_gui.cpp
-@@ -210,10 +210,11 @@ public:
+@@ -211,10 +211,11 @@ public:
tile_ss << "0x" << std::setfill('0') << std::setw(4) << std::hex << std::uppercase << tile; // 0x%.4X
std::string tile_str = tile_ss.str(); // Can't pass it directly to SetDParamStr as the string is only a temporary and would be destructed before the GetString call.
@@ -1917,10 +1917,10 @@ index f0492925d..9523abcd3 100644
/* Local authority */
diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp
-index 7e1e36c1f..d6f46ef09 100644
+index b6ea0b4084..75f57585ae 100644
--- a/src/object_cmd.cpp
+++ b/src/object_cmd.cpp
-@@ -711,7 +711,7 @@ static bool TryBuildLightHouse()
+@@ -710,7 +710,7 @@ static bool TryBuildLightHouse()
*/
static bool TryBuildTransmitter()
{
@@ -1929,17 +1929,17 @@ index 7e1e36c1f..d6f46ef09 100644
int h;
if (IsTileType(tile, MP_CLEAR) && IsTileFlat(tile, &h) && h >= 4 && !IsBridgeAbove(tile)) {
TileIndex t = tile;
-@@ -775,7 +775,7 @@ void GenerateObjects()
+@@ -774,7 +774,7 @@ void GenerateObjects()
default:
uint8 view = RandomRange(spec->views);
-- if (CmdBuildObject(RandomTile(), DC_EXEC | DC_AUTO | DC_NO_TEST_TOWN_RATING | DC_NO_MODIFY_TOWN_RATING, i, view, {}).Succeeded()) amount--;
-+ if (CmdBuildObject(TopTile(RandomTile()), DC_EXEC | DC_AUTO | DC_NO_TEST_TOWN_RATING | DC_NO_MODIFY_TOWN_RATING, i, view, {}).Succeeded()) amount--;
+- if (CmdBuildObject(DC_EXEC | DC_AUTO | DC_NO_TEST_TOWN_RATING | DC_NO_MODIFY_TOWN_RATING, RandomTile(), i, view).Succeeded()) amount--;
++ if (CmdBuildObject(DC_EXEC | DC_AUTO | DC_NO_TEST_TOWN_RATING | DC_NO_MODIFY_TOWN_RATING, TopTile(RandomTile()), i, view).Succeeded()) amount--;
break;
}
}
diff --git a/src/rail.h b/src/rail.h
-index a0bbb0109..553acf76f 100644
+index a0bbb0109b..553acf76f1 100644
--- a/src/rail.h
+++ b/src/rail.h
@@ -158,7 +158,7 @@ public:
@@ -1952,10 +1952,10 @@ index a0bbb0109..553acf76f 100644
CursorID rail_swne; ///< Cursor for building rail in X direction
CursorID rail_ew; ///< Cursor for building rail in E-W direction
diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp
-index 4c34f1ca8..48d377282 100644
+index 88f4adb0f6..0197dd6a49 100644
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
-@@ -541,12 +541,12 @@ CommandCost CmdBuildSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1, u
+@@ -538,12 +538,12 @@ CommandCost CmdBuildSingleRail(DoCommandFlag flags, TileIndex tile, RailType rai
uint num_new_road_pieces = (road != ROAD_NONE) ? 2 - CountBits(road) : 0;
if (num_new_road_pieces > 0) {
@@ -1970,7 +1970,7 @@ index 4c34f1ca8..48d377282 100644
}
if (flags & DC_EXEC) {
-@@ -609,7 +609,7 @@ CommandCost CmdBuildSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1, u
+@@ -606,7 +606,7 @@ CommandCost CmdBuildSingleRail(DoCommandFlag flags, TileIndex tile, RailType rai
YapfNotifyTrackLayoutChange(tile, track);
}
@@ -1979,7 +1979,7 @@ index 4c34f1ca8..48d377282 100644
return cost;
}
-@@ -653,7 +653,7 @@ CommandCost CmdRemoveSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1,
+@@ -647,7 +647,7 @@ CommandCost CmdRemoveSingleRail(DoCommandFlag flags, TileIndex tile, Track track
if (ret.Failed()) return ret;
}
@@ -1988,7 +1988,7 @@ index 4c34f1ca8..48d377282 100644
if (flags & DC_EXEC) {
if (HasReservedTracks(tile, trackbit)) {
-@@ -687,7 +687,7 @@ CommandCost CmdRemoveSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1,
+@@ -681,7 +681,7 @@ CommandCost CmdRemoveSingleRail(DoCommandFlag flags, TileIndex tile, Track track
if ((present & trackbit) == 0) return_cmd_error(STR_ERROR_THERE_IS_NO_RAILROAD_TRACK);
if (present == (TRACK_BIT_X | TRACK_BIT_Y)) crossing = true;
@@ -1997,7 +1997,7 @@ index 4c34f1ca8..48d377282 100644
/* Charge extra to remove signals on the track, if they are there */
if (HasSignalOnTrack(tile, track)) {
-@@ -1004,7 +1004,7 @@ CommandCost CmdBuildTrainDepot(TileIndex tile, DoCommandFlag flags, uint32 p1, u
+@@ -983,7 +983,7 @@ CommandCost CmdBuildTrainDepot(DoCommandFlag flags, TileIndex tile, RailType rai
if (!_settings_game.construction.build_on_slopes || !CanBuildDepotByTileh(dir, tileh)) {
return_cmd_error(STR_ERROR_FLAT_LAND_REQUIRED);
}
@@ -2005,8 +2005,8 @@ index 4c34f1ca8..48d377282 100644
+ cost.AddCost(_price[PR_BUILD_FOUNDATION] * UNDERGROUND_COST_MULTIPLIER(tile));
}
- cost.AddCost(DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR));
-@@ -1029,8 +1029,8 @@ CommandCost CmdBuildTrainDepot(TileIndex tile, DoCommandFlag flags, uint32 p1, u
+ cost.AddCost(Command<CMD_LANDSCAPE_CLEAR>::Do(flags, tile));
+@@ -1008,8 +1008,8 @@ CommandCost CmdBuildTrainDepot(DoCommandFlag flags, TileIndex tile, RailType rai
YapfNotifyTrackLayoutChange(tile, DiagDirToDiagTrack(dir));
}
@@ -2017,7 +2017,7 @@ index 4c34f1ca8..48d377282 100644
return cost;
}
-@@ -1712,7 +1712,7 @@ CommandCost CmdConvertRail(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
+@@ -1641,7 +1641,7 @@ CommandCost CmdConvertRail(DoCommandFlag flags, TileIndex tile, TileIndex area_s
InvalidateWindowData(WC_BUILD_VEHICLE, tile);
}
found_convertible_track = true;
@@ -2026,7 +2026,7 @@ index 4c34f1ca8..48d377282 100644
break;
default: // RAIL_TILE_NORMAL, RAIL_TILE_SIGNALS
-@@ -1724,7 +1724,7 @@ CommandCost CmdConvertRail(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
+@@ -1653,7 +1653,7 @@ CommandCost CmdConvertRail(DoCommandFlag flags, TileIndex tile, TileIndex area_s
}
}
found_convertible_track = true;
@@ -2035,7 +2035,7 @@ index 4c34f1ca8..48d377282 100644
break;
}
break;
-@@ -1787,7 +1787,7 @@ CommandCost CmdConvertRail(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
+@@ -1716,7 +1716,7 @@ CommandCost CmdConvertRail(DoCommandFlag flags, TileIndex tile, TileIndex area_s
}
found_convertible_track = true;
@@ -2044,7 +2044,7 @@ index 4c34f1ca8..48d377282 100644
break;
}
-@@ -1798,7 +1798,7 @@ CommandCost CmdConvertRail(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
+@@ -1727,7 +1727,7 @@ CommandCost CmdConvertRail(DoCommandFlag flags, TileIndex tile, TileIndex area_s
}
found_convertible_track = true;
@@ -2054,10 +2054,10 @@ index 4c34f1ca8..48d377282 100644
}
diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp
-index 70a014434..649c4a56a 100644
+index 0701481119..01740d15bb 100644
--- a/src/road_cmd.cpp
+++ b/src/road_cmd.cpp
-@@ -402,7 +402,7 @@ static CommandCost RemoveRoad(TileIndex tile, DoCommandFlag flags, RoadBits piec
+@@ -405,7 +405,7 @@ static CommandCost RemoveRoad(TileIndex tile, DoCommandFlag flags, RoadBits piec
}
} else {
assert(IsDriveThroughStopTile(tile));
@@ -2066,7 +2066,7 @@ index 70a014434..649c4a56a 100644
if (flags & DC_EXEC) {
/* A full diagonal road tile has two road bits. */
UpdateCompanyRoadInfrastructure(existing_rt, GetRoadOwner(tile, rtt), -2);
-@@ -883,7 +883,7 @@ do_clear:;
+@@ -879,7 +879,7 @@ do_clear:;
/* Count pieces */
CountBits(pieces);
@@ -2075,7 +2075,7 @@ index 70a014434..649c4a56a 100644
if (flags & DC_EXEC) {
switch (GetTileType(tile)) {
-@@ -1198,7 +1198,7 @@ CommandCost CmdBuildRoadDepot(TileIndex tile, DoCommandFlag flags, uint32 p1, ui
+@@ -1170,7 +1170,7 @@ CommandCost CmdBuildRoadDepot(DoCommandFlag flags, TileIndex tile, RoadType rt,
MarkTileDirtyByTile(tile);
MakeDefaultName(dep);
}
@@ -2085,7 +2085,7 @@ index 70a014434..649c4a56a 100644
}
diff --git a/src/saveload/compat/map_sl_compat.h b/src/saveload/compat/map_sl_compat.h
-index 84cfb2865..87ff25630 100644
+index 84cfb28652..87ff25630f 100644
--- a/src/saveload/compat/map_sl_compat.h
+++ b/src/saveload/compat/map_sl_compat.h
@@ -16,6 +16,7 @@
@@ -2097,7 +2097,7 @@ index 84cfb2865..87ff25630 100644
#endif /* SAVELOAD_COMPAT_MAP_H */
diff --git a/src/saveload/map_sl.cpp b/src/saveload/map_sl.cpp
-index 07a36d6a3..b86328de8 100644
+index 07a36d6a38..b86328de8c 100644
--- a/src/saveload/map_sl.cpp
+++ b/src/saveload/map_sl.cpp
@@ -13,6 +13,7 @@
@@ -2136,7 +2136,7 @@ index 07a36d6a3..b86328de8 100644
void LoadCheck(size_t) const override
diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h
-index 0d4e0fb98..a8ef3fbe3 100644
+index 0d4e0fb984..a8ef3fbe39 100644
--- a/src/saveload/saveload.h
+++ b/src/saveload/saveload.h
@@ -307,6 +307,7 @@ enum SaveLoadVersion : uint16 {
@@ -2148,7 +2148,7 @@ index 0d4e0fb98..a8ef3fbe3 100644
/* Patchpacks for a while considered it a good idea to jump a few versions
diff --git a/src/script/api/script_window.hpp.in b/src/script/api/script_window.hpp.in
-index a1dbb6567..b0c3656dc 100644
+index a1dbb65670..b0c3656dc6 100644
--- a/src/script/api/script_window.hpp.in
+++ b/src/script/api/script_window.hpp.in
@@ -65,6 +65,7 @@
@@ -2160,7 +2160,7 @@ index a1dbb6567..b0c3656dc 100644
#include "../../widgets/viewport_widget.h"
#include "../../widgets/waypoint_widget.h"
diff --git a/src/settings_table.cpp b/src/settings_table.cpp
-index 4b94a8be7..bf6493391 100644
+index 4b94a8be78..bf64933914 100644
--- a/src/settings_table.cpp
+++ b/src/settings_table.cpp
@@ -17,6 +17,7 @@
@@ -2172,7 +2172,7 @@ index 4b94a8be7..bf6493391 100644
#include "train.h"
#include "news_func.h"
diff --git a/src/settings_type.h b/src/settings_type.h
-index 9da2655d6..52cd66359 100644
+index 9da2655d6b..52cd663597 100644
--- a/src/settings_type.h
+++ b/src/settings_type.h
@@ -171,6 +171,8 @@ struct GUISettings {
@@ -2193,7 +2193,7 @@ index 9da2655d6..52cd66359 100644
byte oil_refinery_limit; ///< distance oil refineries allowed from map edge
byte snow_line_height; ///< the configured snow line height (deduced from "snow_coverage")
diff --git a/src/station.cpp b/src/station.cpp
-index 877f53d4e..14ac504a8 100644
+index 877f53d4e0..14ac504a87 100644
--- a/src/station.cpp
+++ b/src/station.cpp
@@ -11,6 +11,7 @@
@@ -2289,7 +2289,7 @@ index 877f53d4e..14ac504a8 100644
bool empty = this->AfterRemoveTile(st, ta.tile);
if (ta.w != 1 || ta.h != 1) empty = empty || this->AfterRemoveTile(st, TILE_ADDXY(ta.tile, ta.w - 1, ta.h - 1));
diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp
-index 1a188252c..c5f3f94ac 100644
+index 5a91fa4742..586302f4bf 100644
--- a/src/station_cmd.cpp
+++ b/src/station_cmd.cpp
@@ -11,6 +11,7 @@
@@ -2300,7 +2300,7 @@ index 1a188252c..c5f3f94ac 100644
#include "viewport_func.h"
#include "viewport_kdtree.h"
#include "command_func.h"
-@@ -100,21 +101,24 @@ bool IsHangar(TileIndex t)
+@@ -104,21 +105,24 @@ bool IsHangar(TileIndex t)
* @return Succeeded command (if zero or one station found) or failed command (for two or more stations found).
*/
template <class T>
@@ -2334,7 +2334,7 @@ index 1a188252c..c5f3f94ac 100644
}
*st = (closest_station == INVALID_STATION) ? nullptr : T::Get(closest_station);
return CommandCost();
-@@ -811,7 +815,7 @@ CommandCost CheckBuildableTile(TileIndex tile, uint invalid_dirs, int &allowed_z
+@@ -815,7 +819,7 @@ CommandCost CheckBuildableTile(TileIndex tile, uint invalid_dirs, int &allowed_z
return_cmd_error(STR_ERROR_FLAT_LAND_REQUIRED);
}
}
@@ -2343,8 +2343,8 @@ index 1a188252c..c5f3f94ac 100644
}
/* The level of this tile must be equal to allowed_z. */
-@@ -1049,7 +1053,7 @@ static CommandCost CheckFlatLandRoadStop(TileArea tile_area, DoCommandFlag flags
- ret = DoCommand(cur_tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
+@@ -1053,7 +1057,7 @@ static CommandCost CheckFlatLandRoadStop(TileArea tile_area, DoCommandFlag flags
+ ret = Command<CMD_LANDSCAPE_CLEAR>::Do(flags, cur_tile);
if (ret.Failed()) return ret;
cost.AddCost(ret);
- cost.AddCost(RoadBuildCost(rt) * 2);
@@ -2352,7 +2352,7 @@ index 1a188252c..c5f3f94ac 100644
}
}
}
-@@ -1069,11 +1073,13 @@ CommandCost CanExpandRailStation(const BaseStation *st, TileArea &new_ta, Axis a
+@@ -1073,11 +1077,13 @@ CommandCost CanExpandRailStation(const BaseStation *st, TileArea &new_ta, Axis a
TileArea cur_ta = st->train_station;
/* determine new size of train station region.. */
@@ -2371,7 +2371,7 @@ index 1a188252c..c5f3f94ac 100644
/* make sure the final size is not too big. */
if (new_ta.w > _settings_game.station.station_spread || new_ta.h > _settings_game.station.station_spread) {
-@@ -1145,7 +1151,7 @@ void GetStationLayout(byte *layout, uint numtracks, uint plat_len, const Station
+@@ -1149,7 +1155,7 @@ void GetStationLayout(byte *layout, uint numtracks, uint plat_len, const Station
* @return command cost with the error or 'okay'
*/
template <class T, StringID error_message>
@@ -2380,7 +2380,7 @@ index 1a188252c..c5f3f94ac 100644
{
assert(*st == nullptr);
bool check_surrounding = true;
-@@ -1171,7 +1177,7 @@ CommandCost FindJoiningBaseStation(StationID existing_station, StationID station
+@@ -1175,7 +1181,7 @@ CommandCost FindJoiningBaseStation(StationID existing_station, StationID station
if (check_surrounding) {
/* Make sure there is no more than one other station around us that is owned by us. */
@@ -2389,7 +2389,7 @@ index 1a188252c..c5f3f94ac 100644
if (ret.Failed()) return ret;
}
-@@ -1190,9 +1196,9 @@ CommandCost FindJoiningBaseStation(StationID existing_station, StationID station
+@@ -1194,9 +1200,9 @@ CommandCost FindJoiningBaseStation(StationID existing_station, StationID station
* @param st 'return' pointer for the found station
* @return command cost with the error or 'okay'
*/
@@ -2401,7 +2401,7 @@ index 1a188252c..c5f3f94ac 100644
}
/**
-@@ -1301,8 +1307,8 @@ CommandCost CmdBuildRailStation(TileIndex tile_org, DoCommandFlag flags, uint32
+@@ -1291,8 +1297,8 @@ CommandCost CmdBuildRailStation(DoCommandFlag flags, TileIndex tile_org, RailTyp
CommandCost cost = CheckFlatLandRailStation(new_location, flags, axis, &est, rt, affected_vehicles, spec_class, spec_index, plat_len, numtracks);
if (cost.Failed()) return cost;
/* Add construction expenses. */
@@ -2412,7 +2412,7 @@ index 1a188252c..c5f3f94ac 100644
Station *st = nullptr;
ret = FindJoiningStation(est, station_to_join, adjacent, new_location, &st);
-@@ -1342,8 +1348,10 @@ CommandCost CmdBuildRailStation(TileIndex tile_org, DoCommandFlag flags, uint32
+@@ -1332,8 +1338,10 @@ CommandCost CmdBuildRailStation(DoCommandFlag flags, TileIndex tile_org, RailTyp
byte numtracks_orig;
Track track;
@@ -2424,7 +2424,7 @@ index 1a188252c..c5f3f94ac 100644
st->rect.BeforeAddRect(tile_org, w_org, h_org, StationRect::ADD_TRY);
-@@ -1583,7 +1591,7 @@ CommandCost RemoveFromRailBaseStation(TileArea ta, std::vector<T *> &affected_st
+@@ -1573,7 +1581,7 @@ CommandCost RemoveFromRailBaseStation(TileArea ta, std::vector<T *> &affected_st
}
/* If we reached here, the tile is valid so increase the quantity of tiles we will remove */
@@ -2433,16 +2433,16 @@ index 1a188252c..c5f3f94ac 100644
if (keep_rail || IsStationTileBlocked(tile)) {
/* Don't refund the 'steel' of the track when we keep the
-@@ -1662,7 +1670,7 @@ CommandCost RemoveFromRailBaseStation(TileArea ta, std::vector<T *> &affected_st
- CommandCost CmdRemoveFromRailStation(TileIndex start, DoCommandFlag flags, uint32 p1, uint32 p2, const std::string &text)
+@@ -1650,7 +1658,7 @@ CommandCost RemoveFromRailBaseStation(TileArea ta, std::vector<T *> &affected_st
+ CommandCost CmdRemoveFromRailStation(DoCommandFlag flags, TileIndex start, TileIndex end, bool keep_rail)
{
- TileIndex end = p1 == 0 ? start : p1;
+ if (end == 0) end = start;
- if (start >= MapSize() || end >= MapSize()) return CMD_ERROR;
+ if (start >= MapSize() || end >= MapSize() || (LayerIndex(start) != LayerIndex(end))) return CMD_ERROR;
TileArea ta(start, end);
std::vector<Station *> affected_stations;
-@@ -1725,11 +1733,16 @@ CommandCost RemoveRailStation(T *st, DoCommandFlag flags, Money removal_cost)
+@@ -1711,11 +1719,16 @@ CommandCost RemoveRailStation(T *st, DoCommandFlag flags, Money removal_cost)
/* determine width and height of platforms */
TileArea ta = st->train_station;
@@ -2461,9 +2461,9 @@ index 1a188252c..c5f3f94ac 100644
/* only remove tiles that are actually train station tiles */
if (st->TileBelongsToRailStation(tile)) {
std::vector<T*> affected_stations; // dummy
-@@ -2095,13 +2108,21 @@ CommandCost CmdRemoveRoadStop(TileIndex tile, DoCommandFlag flags, uint32 p1, ui
+@@ -2060,13 +2073,21 @@ CommandCost CmdRemoveRoadStop(DoCommandFlag flags, TileIndex tile, uint8 width,
/* Bankrupting company is not supposed to remove roads, there may be road vehicles. */
- if (!keep_drive_through_roads && (flags & DC_BANKRUPT)) return CMD_ERROR;
+ if (remove_road && (flags & DC_BANKRUPT)) return CMD_ERROR;
- TileArea roadstop_area(tile, width, height);
+ /* ( ) */
@@ -2483,9 +2483,9 @@ index 1a188252c..c5f3f94ac 100644
+ for (TileIndex top_tile : roadstop_area) {
+ TileIndex cur_tile = top_tile + layer * LayerSize();
/* Make sure the specified tile is a road stop of the correct type */
- if (!IsTileType(cur_tile, MP_STATION) || !IsRoadStop(cur_tile) || (uint32)GetRoadStopType(cur_tile) != GB(p2, 0, 1)) continue;
+ if (!IsTileType(cur_tile, MP_STATION) || !IsRoadStop(cur_tile) || GetRoadStopType(cur_tile) != stop_type) continue;
-@@ -2271,6 +2292,10 @@ CommandCost CmdBuildAirport(TileIndex tile, DoCommandFlag flags, uint32 p1, uint
+@@ -2230,6 +2251,10 @@ CommandCost CmdBuildAirport(DoCommandFlag flags, TileIndex tile, byte airport_ty
if (w > _settings_game.station.station_spread || h > _settings_game.station.station_spread) {
return_cmd_error(STR_ERROR_STATION_TOO_SPREAD_OUT);
}
@@ -2497,7 +2497,7 @@ index 1a188252c..c5f3f94ac 100644
AirportTileTableIterator iter(as->table[layout], tile);
CommandCost cost = CheckFlatLandAirport(iter, flags);
diff --git a/src/station_gui.cpp b/src/station_gui.cpp
-index ecc7ea77c..221be09c1 100644
+index 9233878212..1816d4c8e6 100644
--- a/src/station_gui.cpp
+++ b/src/station_gui.cpp
@@ -19,6 +19,7 @@
@@ -2508,7 +2508,7 @@ index ecc7ea77c..221be09c1 100644
#include "viewport_func.h"
#include "widgets/dropdown_func.h"
#include "station_base.h"
-@@ -2211,20 +2212,27 @@ static const T *FindStationsNearby(TileArea ta, bool distant_join)
+@@ -2212,20 +2213,27 @@ static const T *FindStationsNearby(TileArea ta, bool distant_join)
_deleted_stations_nearby.clear();
/* Check the inside, to return, if we sit on another station */
@@ -2541,7 +2541,7 @@ index ecc7ea77c..221be09c1 100644
AddNearbyStation<T>(st->xy, &ctx);
}
}
-@@ -2237,8 +2245,11 @@ static const T *FindStationsNearby(TileArea ta, bool distant_join)
+@@ -2238,8 +2246,11 @@ static const T *FindStationsNearby(TileArea ta, bool distant_join)
if (distant_join && std::min(ta.w, ta.h) >= _settings_game.station.station_spread) return nullptr;
uint max_dist = distant_join ? _settings_game.station.station_spread - std::min(ta.w, ta.h) : 1;
@@ -2556,7 +2556,7 @@ index ecc7ea77c..221be09c1 100644
return nullptr;
}
diff --git a/src/table/settings/game_settings.ini b/src/table/settings/game_settings.ini
-index 79fac7513..f4b7258a0 100644
+index 79fac75136..f4b7258a08 100644
--- a/src/table/settings/game_settings.ini
+++ b/src/table/settings/game_settings.ini
@@ -419,3 +419,12 @@ var = gui.sg_new_nonstop
@@ -2573,7 +2573,7 @@ index 79fac7513..f4b7258a0 100644
+min = MIN_LAYER_COUNT_BITS
+max = MAX_LAYER_COUNT_BITS
diff --git a/src/table/settings/gui_settings.ini b/src/table/settings/gui_settings.ini
-index ad18f8318..5b1a63001 100644
+index ad18f83188..5b1a63001e 100644
--- a/src/table/settings/gui_settings.ini
+++ b/src/table/settings/gui_settings.ini
@@ -848,3 +848,11 @@ min = 1
@@ -2589,7 +2589,7 @@ index ad18f8318..5b1a63001 100644
+max = UINT32_MAX
+proc = RedrawScreen
diff --git a/src/terraform_cmd.cpp b/src/terraform_cmd.cpp
-index eaed9e71c..4778fd050 100644
+index 21df5ccbe3..d1ed0d7603 100644
--- a/src/terraform_cmd.cpp
+++ b/src/terraform_cmd.cpp
@@ -8,6 +8,7 @@
@@ -2600,19 +2600,19 @@ index eaed9e71c..4778fd050 100644
#include "command_func.h"
#include "tunnel_map.h"
#include "bridge_map.h"
-@@ -252,6 +253,10 @@ CommandCost CmdTerraformLand(TileIndex tile, DoCommandFlag flags, uint32 p1, uin
+@@ -248,6 +249,10 @@ std::tuple<CommandCost, Money, TileIndex> CmdTerraformLand(DoCommandFlag flags,
if (z_N > z_min) tileh |= SLOPE_N;
if (pass == 0) {
+ /* Terrafrom enable only top layer */
+ if (IsUnderground(tile)) {
-+ return_cmd_error(STR_ERROR_UNDERGROUND_CAN_T_TERRAFORM);
++ return { CommandCost(STR_ERROR_UNDERGROUND_CAN_T_TERRAFORM), 0, tile };
+ }
/* Check if bridge would take damage */
if (IsBridgeAbove(t)) {
int bridge_height = GetBridgeHeight(GetSouthernBridgeEnd(t));
diff --git a/src/tgp.cpp b/src/tgp.cpp
-index 511b998e2..eef52853e 100644
+index 511b998e23..eef52853eb 100644
--- a/src/tgp.cpp
+++ b/src/tgp.cpp
@@ -12,6 +12,7 @@
@@ -2658,7 +2658,7 @@ index 511b998e2..eef52853e 100644
int max_height = H2I(TGPGetMaxHeight());
diff --git a/src/tile_map.h b/src/tile_map.h
-index b6c715e8a..c191ab904 100644
+index b6c715e8a8..c191ab9042 100644
--- a/src/tile_map.h
+++ b/src/tile_map.h
@@ -14,6 +14,7 @@
@@ -2693,7 +2693,7 @@ index b6c715e8a..c191ab904 100644
}
diff --git a/src/tilearea_type.h b/src/tilearea_type.h
-index e6d9bad60..a256832f5 100644
+index b6af998a76..c6af2dc386 100644
--- a/src/tilearea_type.h
+++ b/src/tilearea_type.h
@@ -44,6 +44,16 @@ struct OrthogonalTileArea {
@@ -2714,7 +2714,7 @@ index e6d9bad60..a256832f5 100644
bool Contains(TileIndex tile) const;
diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp
-index f5b3fa3b7..f4185426d 100644
+index 13c52f2b4e..a9d865d811 100644
--- a/src/toolbar_gui.cpp
+++ b/src/toolbar_gui.cpp
@@ -11,7 +11,10 @@
@@ -2736,7 +2736,7 @@ index f5b3fa3b7..f4185426d 100644
#include "strings_func.h"
#include "company_func.h"
#include "company_gui.h"
-@@ -995,6 +999,39 @@ static CallBackFunction MenuClickForest(int index)
+@@ -996,6 +1000,39 @@ static CallBackFunction MenuClickForest(int index)
return CBF_NONE;
}
@@ -2776,7 +2776,7 @@ index f5b3fa3b7..f4185426d 100644
/* --- Music button menu --- */
static CallBackFunction ToolbarMusicClick(Window *w)
-@@ -1305,9 +1342,10 @@ static MenuClickedProc * const _menu_clicked_procs[] = {
+@@ -1306,9 +1343,10 @@ static MenuClickedProc * const _menu_clicked_procs[] = {
MenuClickBuildWater, // 24
MenuClickBuildAir, // 25
MenuClickForest, // 26
@@ -2790,7 +2790,7 @@ index f5b3fa3b7..f4185426d 100644
};
/** Full blown container to make it behave exactly as we want :) */
-@@ -1472,7 +1510,7 @@ class NWidgetMainToolbarContainer : public NWidgetToolbarContainer {
+@@ -1473,7 +1511,7 @@ class NWidgetMainToolbarContainer : public NWidgetToolbarContainer {
const byte *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const override
{
static const uint SMALLEST_ARRANGEMENT = 14;
@@ -2799,7 +2799,7 @@ index f5b3fa3b7..f4185426d 100644
/* The number of buttons of each row of the toolbar should match the number of items which we want to be visible.
* The total number of buttons should be equal to arrangable_count * 2.
-@@ -1739,6 +1777,67 @@ class NWidgetMainToolbarContainer : public NWidgetToolbarContainer {
+@@ -1740,6 +1778,67 @@ class NWidgetMainToolbarContainer : public NWidgetToolbarContainer {
WID_TN_ZOOM_OUT,
WID_TN_SWITCH_BAR,
};
@@ -2867,7 +2867,7 @@ index f5b3fa3b7..f4185426d 100644
static const byte arrange_all[] = {
WID_TN_PAUSE,
WID_TN_FAST_FORWARD,
-@@ -1767,6 +1866,7 @@ class NWidgetMainToolbarContainer : public NWidgetToolbarContainer {
+@@ -1768,6 +1867,7 @@ class NWidgetMainToolbarContainer : public NWidgetToolbarContainer {
WID_TN_WATER,
WID_TN_AIR,
WID_TN_LANDSCAPE,
@@ -2875,7 +2875,7 @@ index f5b3fa3b7..f4185426d 100644
WID_TN_MUSIC_SOUND,
WID_TN_MESSAGES,
WID_TN_HELP
-@@ -1781,7 +1881,7 @@ class NWidgetMainToolbarContainer : public NWidgetToolbarContainer {
+@@ -1782,7 +1882,7 @@ class NWidgetMainToolbarContainer : public NWidgetToolbarContainer {
}
/* Introduce the split toolbar */
@@ -2884,7 +2884,7 @@ index f5b3fa3b7..f4185426d 100644
button_count = arrangable_count = full_buttons;
spacer_count = this->spacers;
-@@ -1938,6 +2038,7 @@ static ToolbarButtonProc * const _toolbar_button_procs[] = {
+@@ -1939,6 +2039,7 @@ static ToolbarButtonProc * const _toolbar_button_procs[] = {
ToolbarBuildWaterClick,
ToolbarBuildAirClick,
ToolbarForestClick,
@@ -2892,7 +2892,7 @@ index f5b3fa3b7..f4185426d 100644
ToolbarMusicClick,
ToolbarNewspaperClick,
ToolbarHelpClick,
-@@ -2186,6 +2287,7 @@ static NWidgetBase *MakeMainToolbar(int *biggest_index)
+@@ -2187,6 +2288,7 @@ static NWidgetBase *MakeMainToolbar(int *biggest_index)
SPR_IMG_BUILDWATER, // WID_TN_WATER
SPR_IMG_BUILDAIR, // WID_TN_AIR
SPR_IMG_LANDSCAPING, // WID_TN_LANDSCAPE
@@ -2901,7 +2901,7 @@ index f5b3fa3b7..f4185426d 100644
SPR_IMG_MESSAGES, // WID_TN_MESSAGES
SPR_IMG_QUERY, // WID_TN_HELP
diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp
-index 2863b4d6f..e2f8d65b4 100644
+index 405a83ccee..ade909a6ba 100644
--- a/src/town_cmd.cpp
+++ b/src/town_cmd.cpp
@@ -12,6 +12,7 @@
@@ -2912,7 +2912,7 @@ index 2863b4d6f..e2f8d65b4 100644
#include "viewport_func.h"
#include "viewport_kdtree.h"
#include "cmd_helper.h"
-@@ -2157,7 +2158,7 @@ static Town *CreateRandomTown(uint attempts, uint32 townnameparts, TownSize size
+@@ -2155,7 +2156,7 @@ static Town *CreateRandomTown(uint attempts, uint32 townnameparts, TownSize size
do {
/* Generate a tile index not too close from the edge */
@@ -2921,7 +2921,7 @@ index 2863b4d6f..e2f8d65b4 100644
/* if we tried to place the town on water, slide it over onto
* the nearest likely-looking spot */
-@@ -2330,6 +2331,9 @@ static inline bool CanBuildHouseHere(TileIndex tile, bool noslope)
+@@ -2328,6 +2329,9 @@ static inline bool CanBuildHouseHere(TileIndex tile, bool noslope)
Slope slope = GetTileSlope(tile);
if ((noslope && slope != SLOPE_FLAT) || IsSteepSlope(slope)) return false;
@@ -2931,7 +2931,7 @@ index 2863b4d6f..e2f8d65b4 100644
/* at least one RoadTypes allow building the house here? */
if (!RoadTypesAllowHouseHere(tile)) return false;
-@@ -2765,6 +2769,8 @@ CommandCost CmdRenameTown(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
+@@ -2761,6 +2765,8 @@ CommandCost CmdRenameTown(DoCommandFlag flags, TownID town_id, const std::string
InvalidateWindowData(WC_TOWN_DIRECTORY, 0, TDIWD_FORCE_RESORT);
ClearAllStationCachedNames();
ClearAllIndustryCachedNames();
@@ -2941,7 +2941,7 @@ index 2863b4d6f..e2f8d65b4 100644
}
return CommandCost();
diff --git a/src/tree_cmd.cpp b/src/tree_cmd.cpp
-index 237b34fff..b3671bbfd 100644
+index c98758062f..d0fe4b157d 100644
--- a/src/tree_cmd.cpp
+++ b/src/tree_cmd.cpp
@@ -11,6 +11,7 @@
@@ -2952,7 +2952,7 @@ index 237b34fff..b3671bbfd 100644
#include "viewport_func.h"
#include "command_func.h"
#include "town.h"
-@@ -72,7 +73,8 @@ static bool CanPlantTreesOnTile(TileIndex tile, bool allow_desert)
+@@ -74,7 +75,8 @@ static bool CanPlantTreesOnTile(TileIndex tile, bool allow_desert)
case MP_CLEAR:
return !IsBridgeAbove(tile) && !IsClearGround(tile, CLEAR_FIELDS) && GetRawClearGround(tile) != CLEAR_ROCKS &&
@@ -2962,7 +2962,7 @@ index 237b34fff..b3671bbfd 100644
default: return false;
}
-@@ -187,7 +189,7 @@ static void PlaceTree(TileIndex tile, uint32 r)
+@@ -189,7 +191,7 @@ static void PlaceTree(TileIndex tile, uint32 r)
static void PlaceTreeGroups(uint num_groups)
{
do {
@@ -2971,7 +2971,7 @@ index 237b34fff..b3671bbfd 100644
for (uint i = 0; i < DEFAULT_TREE_STEPS; i++) {
uint32 r = Random();
-@@ -252,7 +254,7 @@ void PlaceTreesRandomly()
+@@ -254,7 +256,7 @@ void PlaceTreesRandomly()
if (_game_mode == GM_EDITOR) i /= EDITOR_TREE_DIV;
do {
uint32 r = Random();
@@ -2980,7 +2980,7 @@ index 237b34fff..b3671bbfd 100644
IncreaseGeneratingWorldProgress(GWP_TREE);
-@@ -281,7 +283,7 @@ void PlaceTreesRandomly()
+@@ -283,7 +285,7 @@ void PlaceTreesRandomly()
do {
uint32 r = Random();
@@ -2989,13 +2989,13 @@ index 237b34fff..b3671bbfd 100644
IncreaseGeneratingWorldProgress(GWP_TREE);
-@@ -392,6 +394,10 @@ CommandCost CmdPlantTree(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
- const byte tree_to_plant = GB(p1, 0, 8); // We cannot use Extract as min and max are climate specific.
+@@ -392,6 +394,10 @@ CommandCost CmdPlantTree(DoCommandFlag flags, TileIndex tile, TileIndex start_ti
+ CommandCost cost(EXPENSES_OTHER);
- if (p2 >= MapSize()) return CMD_ERROR;
+ if (start_tile >= MapSize()) return CMD_ERROR;
+
+ /* tree only top layer */
-+ if (IsUnderground(p2)) return CMD_ERROR;
++ if (IsUnderground(start_tile)) return CMD_ERROR;
+
/* Check the tree type within the current climate */
if (tree_to_plant != TREE_INVALID && !IsInsideBS(tree_to_plant, _tree_base_by_landscape[_settings_game.game_creation.landscape], _tree_count_by_landscape[_settings_game.game_creation.landscape])) return CMD_ERROR;
@@ -3019,7 +3019,7 @@ index 237b34fff..b3671bbfd 100644
PlantTreesOnTile(tile, tree, 0, 0);
}
diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp
-index 5181dfdca..98aaf2771 100644
+index 543ac8b284..3e2d4206a4 100644
--- a/src/tunnelbridge_cmd.cpp
+++ b/src/tunnelbridge_cmd.cpp
@@ -13,6 +13,7 @@
@@ -3030,7 +3030,7 @@ index 5181dfdca..98aaf2771 100644
#include "viewport_func.h"
#include "cmd_helper.h"
#include "command_func.h"
-@@ -309,6 +310,10 @@ CommandCost CmdBuildBridge(TileIndex end_tile, DoCommandFlag flags, uint32 p1, u
+@@ -303,6 +304,10 @@ CommandCost CmdBuildBridge(DoCommandFlag flags, TileIndex tile_end, TileIndex ti
return_cmd_error(STR_ERROR_CAN_T_START_AND_END_ON);
}
@@ -3041,7 +3041,7 @@ index 5181dfdca..98aaf2771 100644
Axis direction;
if (TileX(tile_start) == TileX(tile_end)) {
direction = AXIS_Y;
-@@ -702,6 +707,12 @@ CommandCost CmdBuildTunnel(TileIndex start_tile, DoCommandFlag flags, uint32 p1,
+@@ -693,6 +698,12 @@ CommandCost CmdBuildTunnel(DoCommandFlag flags, TileIndex start_tile, TransportT
for (;;) {
end_tile += delta;
if (!IsValidTile(end_tile)) return_cmd_error(STR_ERROR_TUNNEL_THROUGH_MAP_BORDER);
@@ -3056,7 +3056,7 @@ index 5181dfdca..98aaf2771 100644
if (start_z == end_z) break;
diff --git a/src/underground_gui.cpp b/src/underground_gui.cpp
new file mode 100644
-index 000000000..be4ebe4e5
+index 0000000000..be4ebe4e5d
--- /dev/null
+++ b/src/underground_gui.cpp
@@ -0,0 +1,321 @@
@@ -3383,7 +3383,7 @@ index 000000000..be4ebe4e5
+}
diff --git a/src/underground_gui.h b/src/underground_gui.h
new file mode 100644
-index 000000000..81b119545
+index 0000000000..81b119545e
--- /dev/null
+++ b/src/underground_gui.h
@@ -0,0 +1,19 @@
@@ -3407,7 +3407,7 @@ index 000000000..81b119545
+
+#endif /* UNDERGROUND_GUI_H */
diff --git a/src/vehicle.cpp b/src/vehicle.cpp
-index 30e1c477c..053337a78 100644
+index 120c4a259f..0e338737c3 100644
--- a/src/vehicle.cpp
+++ b/src/vehicle.cpp
@@ -13,6 +13,7 @@
@@ -3427,7 +3427,7 @@ index 30e1c477c..053337a78 100644
l <= v->coord.right + xb &&
t <= v->coord.bottom + yb &&
diff --git a/src/viewport.cpp b/src/viewport.cpp
-index b3ccba2b5..5f88aa38c 100644
+index 69db0aeab5..d8fd85b5a8 100644
--- a/src/viewport.cpp
+++ b/src/viewport.cpp
@@ -62,6 +62,8 @@
@@ -3439,7 +3439,7 @@ index b3ccba2b5..5f88aa38c 100644
#include "viewport_func.h"
#include "station_base.h"
#include "waypoint_base.h"
-@@ -1246,24 +1248,27 @@ static void ViewportAddLandscape()
+@@ -1247,24 +1249,27 @@ static void ViewportAddLandscape()
int min_visible_height = viewport_y - (_vd.dpi.top + _vd.dpi.height);
bool tile_visible = min_visible_height <= 0;
@@ -3484,7 +3484,7 @@ index b3ccba2b5..5f88aa38c 100644
}
if (tile_visible) {
-@@ -1737,6 +1742,9 @@ void ViewportDoDraw(const Viewport *vp, int left, int top, int right, int bottom
+@@ -1738,6 +1743,9 @@ void ViewportDoDraw(const Viewport *vp, int left, int top, int right, int bottom
_vd.dpi.dst_ptr = BlitterFactory::GetCurrentBlitter()->MoveTo(old_dpi->dst_ptr, x - old_dpi->left, y - old_dpi->top);
@@ -3495,7 +3495,7 @@ index b3ccba2b5..5f88aa38c 100644
ViewportAddVehicles(&_vd.dpi);
diff --git a/src/viewport_func.h b/src/viewport_func.h
-index 58e1706eb..d8f2036aa 100644
+index 58e1706eb6..d8f2036aaa 100644
--- a/src/viewport_func.h
+++ b/src/viewport_func.h
@@ -31,6 +31,7 @@ bool MarkAllViewportsDirty(int left, int top, int right, int bottom);
@@ -3507,7 +3507,7 @@ index 58e1706eb..d8f2036aa 100644
void FixTitleGameZoom(int zoom_adjust = 0);
void HandleZoomMessage(Window *w, const Viewport *vp, byte widget_zoom_in, byte widget_zoom_out);
diff --git a/src/viewport_gui.cpp b/src/viewport_gui.cpp
-index 5047f04f3..3c02f9ab8 100644
+index 5047f04f3f..3c02f9ab8b 100644
--- a/src/viewport_gui.cpp
+++ b/src/viewport_gui.cpp
@@ -14,6 +14,7 @@
@@ -3532,7 +3532,7 @@ index 5047f04f3..3c02f9ab8 100644
}
diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp
-index ba09b415a..a87cf657d 100644
+index c02a1e9b4f..be95c096e5 100644
--- a/src/water_cmd.cpp
+++ b/src/water_cmd.cpp
@@ -10,6 +10,7 @@
@@ -3543,7 +3543,7 @@ index ba09b415a..a87cf657d 100644
#include "viewport_func.h"
#include "command_func.h"
#include "town.h"
-@@ -475,6 +476,11 @@ CommandCost CmdBuildCanal(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
+@@ -468,6 +469,11 @@ CommandCost CmdBuildCanal(DoCommandFlag flags, TileIndex tile, TileIndex start_t
return_cmd_error(STR_ERROR_FLAT_LAND_REQUIRED);
}
@@ -3555,7 +3555,7 @@ index ba09b415a..a87cf657d 100644
bool water = IsWaterTile(current_tile);
/* Outside the editor, prevent building canals over your own or OWNER_NONE owned canals */
-@@ -1110,6 +1116,9 @@ void DoFloodTile(TileIndex target)
+@@ -1103,6 +1109,9 @@ void DoFloodTile(TileIndex target)
{
assert(!IsTileType(target, MP_WATER));
@@ -3565,7 +3565,7 @@ index ba09b415a..a87cf657d 100644
bool flooded = false; // Will be set to true if something is changed.
Backup<CompanyID> cur_company(_current_company, OWNER_WATER, FILE_LINE);
-@@ -1268,7 +1277,7 @@ void ConvertGroundTilesIntoWaterTiles()
+@@ -1261,7 +1270,7 @@ void ConvertGroundTilesIntoWaterTiles()
for (TileIndex tile = 0; tile < MapSize(); ++tile) {
Slope slope = GetTileSlope(tile, &z);
@@ -3575,7 +3575,7 @@ index ba09b415a..a87cf657d 100644
* and make shore, as that looks much better
* during the generation. */
diff --git a/src/widgets/CMakeLists.txt b/src/widgets/CMakeLists.txt
-index 5586870a3..c5d57cebe 100644
+index 5586870a3a..c5d57cebee 100644
--- a/src/widgets/CMakeLists.txt
+++ b/src/widgets/CMakeLists.txt
@@ -57,6 +57,7 @@ add_files(
@@ -3587,7 +3587,7 @@ index 5586870a3..c5d57cebe 100644
viewport_widget.h
waypoint_widget.h
diff --git a/src/widgets/genworld_widget.h b/src/widgets/genworld_widget.h
-index 6644dc1aa..a059a2953 100644
+index 6644dc1aa7..a059a2953b 100644
--- a/src/widgets/genworld_widget.h
+++ b/src/widgets/genworld_widget.h
@@ -19,6 +19,7 @@ enum GenerateLandscapeWidgets {
@@ -3607,7 +3607,7 @@ index 6644dc1aa..a059a2953 100644
WID_CS_START_DATE_TEXT, ///< Clickable start date value.
WID_CS_START_DATE_UP, ///< Increase start year (start later).
diff --git a/src/widgets/toolbar_widget.h b/src/widgets/toolbar_widget.h
-index d68de4970..0b4e53227 100644
+index d68de49700..0b4e53227f 100644
--- a/src/widgets/toolbar_widget.h
+++ b/src/widgets/toolbar_widget.h
@@ -41,6 +41,7 @@ enum ToolbarNormalWidgets {
@@ -3620,7 +3620,7 @@ index d68de4970..0b4e53227 100644
WID_TN_HELP, ///< Help menu.
diff --git a/src/widgets/underground_widget.h b/src/widgets/underground_widget.h
new file mode 100644
-index 000000000..522c9db8b
+index 0000000000..522c9db8bf
--- /dev/null
+++ b/src/widgets/underground_widget.h
@@ -0,0 +1,21 @@
@@ -3646,7 +3646,7 @@ index 000000000..522c9db8b
+
+#endif /* WIDGETS_UNDERGROUND_WIDGET_H */
diff --git a/src/window_type.h b/src/window_type.h
-index 6eb9573b6..cfaa1e878 100644
+index 6eb9573b60..cfaa1e8789 100644
--- a/src/window_type.h
+++ b/src/window_type.h
@@ -440,6 +440,12 @@ enum WindowClass {