diff --git a/.changelog b/.changelog
index 4cab85803c..1b121c6267 100644
--- a/.changelog
+++ b/.changelog
@@ -1,4 +1,30 @@
-14.0-beta1 (2023-02-03)
+14.0-beta3 (2024-02-06)
+------------------------------------------------------------------------
+Add: [Script] ScriptTileList_StationCoverage to get station coverage area (#12015)
+Change: Update OpenTTD TTF fonts to v0.5 (#11994)
+Fix #12012: Crash when opening orders of another company (#12013)
+Fix #12001: Use correct valid cargo check for old-style NewGRF town house 3rd cargo set up (#12006)
+Fix #11997: Adjust economy date by 1920 when loading TTD/TTO savegames (#12007)
+Fix: Focus hotkey in road/tram stop building window (#12008)
+Fix: Signals were incorrectly shifted by 1 pixel when selected (#12005)
+Fix: Missing default vehicles and industry acceptance/production (#12000)
+Fix: [Script] Avoid overflow in scripts when infinite money is enabled (#12016)
+Fix: [Script] Don't kill GS misusing GSText (#12009)
+
+
+14.0-beta2 (2024-02-04)
+------------------------------------------------------------------------
+Change: [NewGRF] Improved support for redefining default cargo types (#11719)
+Fix #11982: Crash when trying to place signals on things other than plain rails (#11977)
+Fix #11975: Inconsistent behaviour when changing first AI company settings (#11976)
+Fix #11972: Year cut off in graph windows (#11974)
+Fix #11968: Crash when opening orders window of new vehicles (#11973)
+Fix #11966: Monospace text in windows may not have been fully scrollable (#11981)
+Fix #11802: Made determining water region edge traversability more robust (#11986)
+Fix: Second colour vehicle-type default liveries were not being updated (#11971)
+
+
+14.0-beta1 (2024-02-03)
------------------------------------------------------------------------
Feature: Order option to unbunch vehicles at depot (#11945)
Feature: Infinite money mode (#11902)
diff --git a/.ottdrev b/.ottdrev
index 67319e8dd3..781a8b8e29 100644
--- a/.ottdrev
+++ b/.ottdrev
@@ -1 +1 @@
-14.0-beta1 20240203 0 22eed9616efebf65a19bdb25e2c4bd968f719665 1 0 2024
+14.0-beta3 20240206 0 b085f610e2a92eb78aee547f1345007e5c4d8baf 1 0 2024
diff --git a/.release_date b/.release_date
index c348b99090..8ee91f2106 100644
--- a/.release_date
+++ b/.release_date
@@ -1 +1 @@
-2024-02-03 19:50 UTC
+2024-02-06 20:50 UTC
diff --git a/.version b/.version
index cac474ff78..f14954a797 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-14.0-beta1
+14.0-beta3
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f0f0b33e65..fe1652d6fa 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -288,6 +288,10 @@ target_link_libraries(openttd
)
target_link_libraries(openttd_test PRIVATE openttd_lib)
+if(ANDROID)
+ target_link_libraries(openttd_test PRIVATE log)
+endif()
+
include(Catch)
catch_discover_tests(openttd_test)
diff --git a/changelog.txt b/changelog.txt
index 93f314b3df..9310b5b981 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,4 +1,30 @@
-14.0-beta1 (2023-02-03)
+14.0-beta3 (2024-02-06)
+------------------------------------------------------------------------
+Add: [Script] ScriptTileList_StationCoverage to get station coverage area (#12015)
+Change: Update OpenTTD TTF fonts to v0.5 (#11994)
+Fix #12012: Crash when opening orders of another company (#12013)
+Fix #12001: Use correct valid cargo check for old-style NewGRF town house 3rd cargo set up (#12006)
+Fix #11997: Adjust economy date by 1920 when loading TTD/TTO savegames (#12007)
+Fix: Focus hotkey in road/tram stop building window (#12008)
+Fix: Signals were incorrectly shifted by 1 pixel when selected (#12005)
+Fix: Missing default vehicles and industry acceptance/production (#12000)
+Fix: [Script] Avoid overflow in scripts when infinite money is enabled (#12016)
+Fix: [Script] Don't kill GS misusing GSText (#12009)
+
+
+14.0-beta2 (2024-02-04)
+------------------------------------------------------------------------
+Change: [NewGRF] Improved support for redefining default cargo types (#11719)
+Fix #11982: Crash when trying to place signals on things other than plain rails (#11977)
+Fix #11975: Inconsistent behaviour when changing first AI company settings (#11976)
+Fix #11972: Year cut off in graph windows (#11974)
+Fix #11968: Crash when opening orders window of new vehicles (#11973)
+Fix #11966: Monospace text in windows may not have been fully scrollable (#11981)
+Fix #11802: Made determining water region edge traversability more robust (#11986)
+Fix: Second colour vehicle-type default liveries were not being updated (#11971)
+
+
+14.0-beta1 (2024-02-03)
------------------------------------------------------------------------
Feature: Order option to unbunch vehicles at depot (#11945)
Feature: Infinite money mode (#11902)
diff --git a/media/baseset/OpenTTD-Mono.ttf b/media/baseset/OpenTTD-Mono.ttf
index ba17482213..6022735dbe 100644
Binary files a/media/baseset/OpenTTD-Mono.ttf and b/media/baseset/OpenTTD-Mono.ttf differ
diff --git a/media/baseset/OpenTTD-Sans.ttf b/media/baseset/OpenTTD-Sans.ttf
index fb322a3b1d..a9ed5d8c83 100644
Binary files a/media/baseset/OpenTTD-Sans.ttf and b/media/baseset/OpenTTD-Sans.ttf differ
diff --git a/media/baseset/OpenTTD-Serif.ttf b/media/baseset/OpenTTD-Serif.ttf
index fd5ca433ba..d188e2c80c 100644
Binary files a/media/baseset/OpenTTD-Serif.ttf and b/media/baseset/OpenTTD-Serif.ttf differ
diff --git a/media/baseset/OpenTTD-Small.ttf b/media/baseset/OpenTTD-Small.ttf
index df0711e1ae..a1c08fd49e 100644
Binary files a/media/baseset/OpenTTD-Small.ttf and b/media/baseset/OpenTTD-Small.ttf differ
diff --git a/media/baseset/OpenTTD-font.md b/media/baseset/OpenTTD-font.md
index 44fcb262f9..25115cca90 100644
--- a/media/baseset/OpenTTD-font.md
+++ b/media/baseset/OpenTTD-font.md
@@ -3,4 +3,4 @@
The OpenTTD TrueType font was created by Zephyris and is maintained on [Github](https://github.com/zephyris/openttd-ttf).
It is licensed under GPL-2.0.
-The currently included files correspond to release v0.4.
+The currently included files correspond to release v0.5.
diff --git a/os/os2/build_lang.cmd b/os/os2/build_lang.cmd
deleted file mode 100644
index 57d3e9943c..0000000000
--- a/os/os2/build_lang.cmd
+++ /dev/null
@@ -1,8 +0,0 @@
-rem
-rem Building language files...
-rem
-cd ..
-strgen\strgen
-for %%f in (lang\*.txt) do strgen\strgen %%f
-cd strgen
-
diff --git a/os/os2/dedicated.cmd b/os/os2/dedicated.cmd
deleted file mode 100644
index f4eb524995..0000000000
--- a/os/os2/dedicated.cmd
+++ /dev/null
@@ -1 +0,0 @@
-start /n /win openttd.exe -D %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/os/os2/installer/download_nosound.cmd b/os/os2/installer/download_nosound.cmd
deleted file mode 100644
index 39e9843a92..0000000000
--- a/os/os2/installer/download_nosound.cmd
+++ /dev/null
@@ -1,21 +0,0 @@
-@echo off
-if "%1" == "" goto err
-if "%2" == "" goto err
-
-echo Downloading NoSound...
-
-%1\wget http://binaries.openttd.org/installer/nosound-NOSOUND_VERSION.7z -O %2/baseset/nosound.7z
-
-echo Extracting NoSound...
-
-%1\7za x -y -O%2/baseset %2/baseset/nosound.7z
-del %1\baseset\nosound.7z /n
-
-echo NoSound has been installed.
-goto end
-
-:err
-echo This batch file is only intended for use by the OpenTTD installer.
-echo Please visit www.openttd.org for details on downloading NoSound.
-
-:end
\ No newline at end of file
diff --git a/os/os2/installer/download_opengfx.cmd b/os/os2/installer/download_opengfx.cmd
deleted file mode 100644
index c2686b456f..0000000000
--- a/os/os2/installer/download_opengfx.cmd
+++ /dev/null
@@ -1,21 +0,0 @@
-@echo off
-if "%1" == "" goto err
-if "%2" == "" goto err
-
-echo Downloading OpenGFX...
-
-%1\wget http://binaries.openttd.org/installer/opengfx-OPENGFX_VERSION.7z -O %2/baseset/opengfx.7z
-
-echo Extracting OpenGFX...
-
-%1\7za x -y -O%2/baseset %2/baseset/opengfx.7z
-del %1\baseset\opengfx.7z /n
-
-echo OpenGFX has been installed.
-goto end
-
-:err
-echo This batch file is only intended for use by the OpenTTD installer.
-echo Please visit www.openttd.org for details on downloading OpenGFX.
-
-:end
diff --git a/os/os2/installer/download_opensfx.cmd b/os/os2/installer/download_opensfx.cmd
deleted file mode 100644
index 0a46dea42a..0000000000
--- a/os/os2/installer/download_opensfx.cmd
+++ /dev/null
@@ -1,21 +0,0 @@
-@echo off
-if "%1" == "" goto err
-if "%2" == "" goto err
-
-echo Downloading OpenSFX...
-
-%1\wget http://binaries.openttd.org/installer/opensfx-OPENSFX_VERSION.7z -O %2/baseset/opensfx.7z
-
-echo Extracting OpenSFX...
-
-%1\7za x -y -O%2/baseset %2/baseset/opensfx.7z
-del %1\baseset\opensfx.7z /n
-
-echo OpenSFX has been installed.
-goto end
-
-:err
-echo This batch file is only intended for use by the OpenTTD installer.
-echo Please visit www.openttd.org for details on downloading OpenSFX.
-
-:end
diff --git a/os/os2/installer/make_installer.cmd b/os/os2/installer/make_installer.cmd
deleted file mode 100644
index 885b2dc623..0000000000
--- a/os/os2/installer/make_installer.cmd
+++ /dev/null
@@ -1,85 +0,0 @@
-@echo off
-
-set OPENTTD_VERSION=1.11.0
-set OPENSFX_VERSION=0.8.0
-set NOSOUND_VERSION=0.8.0
-set OPENGFX_VERSION=1.2.0
-
-echo To make the installer, you must have the WarpIN compiler (wic) installed and in
-echo your path, as well as wget and unzip. This file will download the various DLLs
-echo to be distributed with the installer. If you do not want to continue, please
-echo press CTRL-C now.
-echo.
-pause
-
-cd ..\..\..\bundle
-
-if not exist SDL12.dll goto getsdl
-if not exist FSLib.dll goto getsdl
-goto libc
-
-:getsdl
-
-wget http://www.os2site.com/sw/dev/sdl/sdl-1.2.10-bin-20080804.zip -O dl.zip
-unzip -j dl.zip SDL/FSLib.dll SDL/SDL12.dll
-del dl.zip
-
-:libc
-
-if exist libc063.dll goto gcc
-
-wget ftp://ftp.netlabs.org/pub/gcc/libc-0.6.3-csd3.zip -O dl.zip
-unzip -j dl.zip libc063.dll
-del dl.zip
-
-:gcc
-
-if exist gcc442.dll goto tools
-
-wget http://www.owenrudge.net/various/gcc442.zip -O dl.zip
-unzip -j dl.zip gcc442.dll
-del dl.zip
-
-:tools
-
-cd ..\os\os2\installer
-if exist tools goto opengfx
-
-mkdir tools
-cd tools
-
-wget http://download.smedley.info/wget-1.11.4-os2-20090315.zip -O dl.zip
-unzip -j dl.zip wget/bin/wget.exe
-del dl.zip
-
-wget ftp://ftp.os4.su/moveton/p7zip-9.04-bin-os2.zip -O dl.zip
-unzip -j dl.zip bin/7za.exe dll/ilibca.dll
-del dl.zip
-
-cd ..
-
-:opengfx
-
-if exist opengfx goto opensfx
-
-mkdir opengfx
-sed s/OPENGFX_VERSION/%OPENGFX_VERSION%/ < download_opengfx.cmd > opengfx\download_opengfx.cmd
-copy remove_opengfx.cmd opengfx
-
-:opensfx
-if exist opensfx goto nosound
-
-mkdir opensfx
-sed s/OPENSFX_VERSION/%OPENSFX_VERSION%/ < download_opensfx.cmd > opensfx\download_opensfx.cmd
-copy remove_opensfx.cmd opensfx
-
-:nosound
-
-mkdir nosound
-sed s/NOSOUND_VERSION/%NOSOUND_VERSION%/ < download_nosound.cmd > nosound\download_nosound.cmd
-copy remove_nosound.cmd nosound
-
-:end
-
-if exist openttd-%OPENTTD_VERSION%-os2.exe del openttd-%OPENTTD_VERSION%-os2.exe
-wic -a openttd-%OPENTTD_VERSION%-os2.exe 1 -c../../../bundle -r * 2 -ctools -r * 3 -copengfx -r * 4 -copensfx -r * 5 -cnosound -r * -U -s openttd.wis
diff --git a/os/os2/installer/openttd.wis b/os/os2/installer/openttd.wis
deleted file mode 100644
index 4b761ed83c..0000000000
--- a/os/os2/installer/openttd.wis
+++ /dev/null
@@ -1,106 +0,0 @@
-
-
-OpenTTD
-
-
-
-OpenTTD is an open source transport simulation game
-
-Tools required for downloading the OpenGFX/SFX packs
-
-Downloads the OpenGFX graphics pack for OpenTTD
-
-Downloads the OpenSFX sound effects pack for OpenTTD
-
-Downloads the NoSound pack for OpenTTD, to disable sound effects
-
-
-
-
-
-
-~Next
-README.md
-Welcome to the OpenTTD installer. This program will install OpenTTD 1.0 on your system. Before we begin the installation process, please take a moment to read the following document.
-
-Select "Next" to continue, or "Cancel" to abort installation.
-
-
-
-
-~Next
-COPYING.md
-OpenTTD is licenced under the GNU General Public License. The text of the licence is below.
-
-Select "Next" if you agree to this licence.
-Select "Cancel" to abort installation.
-
-
-
-
-~Next
-On this page, you may choose which components to install. If you don't own Transport Tycoon Deluxe, you will need to download OpenGFX (3MiB) and OpenSFX (10MiB).
-
-
-
-
-
-I~nstall
-
-Press "Install" to begin installing OpenTTD.
-
-
-
diff --git a/os/os2/installer/remove_nosound.cmd b/os/os2/installer/remove_nosound.cmd
deleted file mode 100644
index 21c11e80d9..0000000000
--- a/os/os2/installer/remove_nosound.cmd
+++ /dev/null
@@ -1,15 +0,0 @@
-@echo off
-if "%1" == "" goto err
-
-echo Removing NoSound...
-
-del %1\baseset\nosound\*.* /n
-rmdir %1\baseset\nosound
-
-echo NoSound has been removed.
-goto end
-
-:err
-echo This batch file is only intended for use by the OpenTTD installer.
-
-:end
diff --git a/os/os2/installer/remove_opengfx.cmd b/os/os2/installer/remove_opengfx.cmd
deleted file mode 100644
index 71465d1677..0000000000
--- a/os/os2/installer/remove_opengfx.cmd
+++ /dev/null
@@ -1,15 +0,0 @@
-@echo off
-if "%1" == "" goto err
-
-echo Removing OpenGFX...
-
-del %1\baseset\opengfx\*.* /n
-rmdir %1\baseset\opengfx
-
-echo OpenGFX has been removed.
-goto end
-
-:err
-echo This batch file is only intended for use by the OpenTTD installer.
-
-:end
diff --git a/os/os2/installer/remove_opensfx.cmd b/os/os2/installer/remove_opensfx.cmd
deleted file mode 100644
index 361a870e33..0000000000
--- a/os/os2/installer/remove_opensfx.cmd
+++ /dev/null
@@ -1,15 +0,0 @@
-@echo off
-if "%1" == "" goto err
-
-echo Removing OpenSFX...
-
-del %1\baseset\opensfx\*.* /n
-rmdir %1\baseset\opensfx
-
-echo OpenSFX has been removed.
-goto end
-
-:err
-echo This batch file is only intended for use by the OpenTTD installer.
-
-:end
diff --git a/os/os2/openttd.wpj b/os/os2/openttd.wpj
deleted file mode 100644
index 61b2caa553..0000000000
--- a/os/os2/openttd.wpj
+++ /dev/null
@@ -1,64 +0,0 @@
-40
-projectIdent
-0
-VpeMain
-1
-WRect
-0
-0
-10304
-10020
-2
-MProject
-3
-MCommand
-15
-svn_version.cmd
-4
-MCommand
-0
-2
-5
-WFileName
-17
-..\..\openttd.tgt
-6
-WFileName
-23
-..\..\strgen\strgen.tgt
-7
-WVList
-2
-8
-VComponent
-9
-WRect
-0
-0
-5696
-4240
-0
-0
-10
-WFileName
-17
-..\..\openttd.tgt
-0
-0
-11
-VComponent
-12
-WRect
-688
-680
-5696
-4240
-0
-0
-13
-WFileName
-23
-..\..\strgen\strgen.tgt
-0
-1
-8
diff --git a/os/os2/svn_version.cmd b/os/os2/svn_version.cmd
deleted file mode 100644
index cc8836fc0b..0000000000
--- a/os/os2/svn_version.cmd
+++ /dev/null
@@ -1,30 +0,0 @@
-@echo off
-echo Running SVN version detection script...
-rem
-rem Requires subversion (`svnversion') to be installed
-rem
-cd ..\..
-if not "%RELEASE%"=="" goto forcerelease
-if not exist .svn goto nosvn
-svnversion -n . > os\os2\svnver.tmp
-if not "%ERRORLEVEL%"=="0" goto nosvn
-
-copy os\os2\svnver1.c+os\os2\svnver.tmp+os\os2\svnver2.c rev.c /a /y > nul 2> nul
-goto end
-
-:forcerelease
-echo Forcing release string "%RELEASE%"...
-echo const char _openttd_revision[] = "%RELEASE%"; > rev.c
-echo const int _revision_number = 0; >> rev.c
-goto end
-
-:nosvn
-echo Error executing `svnversion' or no SVN data detected
-echo const char _openttd_revision[] = "norev000"; > rev.c
-echo const int _revision_number = 0; >> rev.c
-goto end
-
-:end
-cd os\os2
-del svnver.tmp > nul 2> nul
-rem end
diff --git a/os/os2/svnver1.c b/os/os2/svnver1.c
deleted file mode 100644
index 56d3572c50..0000000000
--- a/os/os2/svnver1.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* rev.c part #1 for OS/2 - ensure no newline at end of file! */
-
-const char _openttd_revision[] = "r
\ No newline at end of file
diff --git a/os/os2/svnver2.c b/os/os2/svnver2.c
deleted file mode 100644
index 02d87603c5..0000000000
--- a/os/os2/svnver2.c
+++ /dev/null
@@ -1,4 +0,0 @@
-";
-const int _revision_number = 0;
-
-/* rev.c part 2 for OS/2 - ensure no newline at start of file! */
\ No newline at end of file
diff --git a/regression/regression/main.nut b/regression/regression/main.nut
index b2daa5b687..7e98dd6ab4 100644
--- a/regression/regression/main.nut
+++ b/regression/regression/main.nut
@@ -1358,6 +1358,21 @@ function Regression::Station()
}
}
+function Regression::StationList()
+{
+ print("");
+ print("--StationList--");
+ local road_stations = AIStationList(AIStation.STATION_TRUCK_STOP);
+ for (local st = road_stations.Begin(); !road_stations.IsEnd(); st = road_stations.Next()) {
+ print(" GetName(): " + AIStation.GetName(st));
+ print(" TileList_StationCoverage:");
+ local coverage = AITileList_StationCoverage(st);
+ for (local i = coverage.Begin(); !coverage.IsEnd(); i = coverage.Next()) {
+ print(" " + i);
+ }
+ }
+}
+
function Regression::Tile()
{
print("");
@@ -1989,6 +2004,7 @@ function Regression::Start()
this.Road();
this.Sign();
this.Station();
+ this.StationList();
this.Tile();
this.TileList();
this.Town();
diff --git a/regression/regression/result.txt b/regression/regression/result.txt
index 57c8a400a9..2119ada528 100644
--- a/regression/regression/result.txt
+++ b/regression/regression/result.txt
@@ -7761,6 +7761,153 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetCargoPlannedFromVia(1000, 1000, 0, 1000): -1
GetCargoPlannedFromVia(1000, 1000, 1000, 1000): -1
+--StationList--
+ GetName(): Little Frutford Valley
+ TileList_StationCoverage:
+ 34192
+ 34191
+ 34190
+ 34189
+ 34188
+ 34187
+ 34186
+ 33936
+ 33935
+ 33934
+ 33933
+ 33932
+ 33931
+ 33930
+ 33680
+ 33679
+ 33678
+ 33677
+ 33676
+ 33675
+ 33674
+ 33424
+ 33423
+ 33422
+ 33421
+ 33420
+ 33419
+ 33418
+ 33168
+ 33167
+ 33166
+ 33165
+ 33164
+ 33163
+ 33162
+ 32912
+ 32911
+ 32910
+ 32909
+ 32908
+ 32907
+ 32906
+ 32656
+ 32655
+ 32654
+ 32653
+ 32652
+ 32651
+ 32650
+ GetName(): Little Frutford Woods
+ TileList_StationCoverage:
+ 34439
+ 34438
+ 34437
+ 34436
+ 34435
+ 34434
+ 34433
+ 34432
+ 34187
+ 34186
+ 34185
+ 34184
+ 34183
+ 34182
+ 34181
+ 34180
+ 34179
+ 34178
+ 34177
+ 34176
+ 33931
+ 33930
+ 33929
+ 33928
+ 33927
+ 33926
+ 33925
+ 33924
+ 33923
+ 33922
+ 33921
+ 33920
+ 33675
+ 33674
+ 33673
+ 33672
+ 33671
+ 33670
+ 33669
+ 33668
+ 33667
+ 33666
+ 33665
+ 33664
+ 33419
+ 33418
+ 33417
+ 33416
+ 33415
+ 33414
+ 33413
+ 33412
+ 33411
+ 33410
+ 33409
+ 33408
+ 33163
+ 33162
+ 33161
+ 33160
+ 33159
+ 33158
+ 33157
+ 33156
+ 33155
+ 33154
+ 33153
+ 33152
+ 32907
+ 32906
+ 32905
+ 32904
+ 32903
+ 32902
+ 32901
+ 32900
+ 32899
+ 32898
+ 32897
+ 32896
+ 32651
+ 32650
+ 32649
+ 32648
+ 32647
+ 32646
+ 32645
+ 32644
+ 32643
+ 32642
+ 32641
+ 32640
+
--Tile--
HasTreeOnTile(): false
IsFarmTile(): true
@@ -9589,9 +9736,9 @@ ERROR: IsEnd() is invalid as Begin() is never called
--Valuate() with excessive CPU usage--
Your script made an error: excessive CPU usage in valuator function
-*FUNCTION [unknown()] regression/main.nut line [2034]
+*FUNCTION [unknown()] regression/main.nut line [2050]
*FUNCTION [Valuate()] NATIVE line [-1]
-*FUNCTION [Start()] regression/main.nut line [2035]
+*FUNCTION [Start()] regression/main.nut line [2051]
[id] 0
[this] TABLE
@@ -9600,7 +9747,7 @@ Your script made an error: excessive CPU usage in valuator function
[this] INSTANCE
Your script made an error: excessive CPU usage in valuator function
-*FUNCTION [Start()] regression/main.nut line [2035]
+*FUNCTION [Start()] regression/main.nut line [2051]
[Infinite] CLOSURE
[list] INSTANCE
diff --git a/src/3rdparty/os2/CMakeLists.txt b/src/3rdparty/os2/CMakeLists.txt
deleted file mode 100644
index 8edc63479e..0000000000
--- a/src/3rdparty/os2/CMakeLists.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-add_files(
- getaddrinfo.c
- getaddrinfo.h
- getnameinfo.c
- getnameinfo.h
- CONDITION OPTION_OS2
-)
diff --git a/src/3rdparty/os2/getaddrinfo.c b/src/3rdparty/os2/getaddrinfo.c
deleted file mode 100644
index 3cdda21f1b..0000000000
--- a/src/3rdparty/os2/getaddrinfo.c
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * This file is part of libESMTP, a library for submission of RFC 2822
- * formatted electronic mail messages using the SMTP protocol described
- * in RFC 2821.
- *
- * Copyright (C) 2001,2002 Brian Stafford
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-/* An emulation of the RFC 2553 / Posix getaddrinfo resolver interface.
- */
-
-#if !HAVE_GETADDRINFO
-
-/* Need to turn off Posix features in glibc to build this */
-#undef _POSIX_C_SOURCE
-#undef _XOPEN_SOURCE
-
-#include "getaddrinfo.h"
-//#include "compat/inet_pton.h"
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-static struct addrinfo *
-dup_addrinfo (struct addrinfo *info, void *addr, size_t addrlen) {
- struct addrinfo *ret;
-
- ret = malloc (sizeof (struct addrinfo));
- if (ret == NULL)
- return NULL;
- memcpy (ret, info, sizeof (struct addrinfo));
- ret->ai_addr = malloc (addrlen);
- if (ret->ai_addr == NULL) {
- free (ret);
- return NULL;
- }
- memcpy (ret->ai_addr, addr, addrlen);
- ret->ai_addrlen = addrlen;
- return ret;
-}
-
-int
-getaddrinfo (const char *nodename, const char *servname,
- const struct addrinfo *hints, struct addrinfo **res)
-{
- struct hostent *hp;
- struct servent *servent;
- const char *socktype;
- int port;
- struct addrinfo hint, result;
- struct addrinfo *ai, *sai, *eai;
- char **addrs;
-
- if (servname == NULL && nodename == NULL)
- return EAI_NONAME;
-
- memset (&result, 0, sizeof result);
-
- /* default for hints */
- if (hints == NULL) {
- memset (&hint, 0, sizeof hint);
- hint.ai_family = PF_UNSPEC;
- hints = &hint;
- }
-
- if (servname == NULL)
- port = 0;
- else {
- /* check for tcp or udp sockets only */
- if (hints->ai_socktype == SOCK_STREAM)
- socktype = "tcp";
- else if (hints->ai_socktype == SOCK_DGRAM)
- socktype = "udp";
- else
- return EAI_SERVICE;
- result.ai_socktype = hints->ai_socktype;
-
- /* Note: maintain port in host byte order to make debugging easier */
- if (isdigit (*servname))
- port = strtol (servname, NULL, 10);
- else if ((servent = getservbyname (servname, socktype)) != NULL)
- port = ntohs (servent->s_port);
- else
- return EAI_NONAME;
- }
-
- /* if nodename == NULL refer to the local host for a client or any
- for a server */
- if (nodename == NULL) {
- struct sockaddr_in sin;
-
- /* check protocol family is PF_UNSPEC or PF_INET - could try harder
- for IPv6 but that's more code than I'm prepared to write */
- if (hints->ai_family == PF_UNSPEC || hints->ai_family == PF_INET)
- result.ai_family = AF_INET;
- else
- return EAI_FAMILY;
-
- sin.sin_family = result.ai_family;
- sin.sin_port = htons (port);
- if (hints->ai_flags & AI_PASSIVE)
- sin.sin_addr.s_addr = htonl (INADDR_ANY);
- else
- sin.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
- /* Duplicate result and addr and return */
- *res = dup_addrinfo (&result, &sin, sizeof sin);
- return (*res == NULL) ? EAI_MEMORY : 0;
- }
-
- /* If AI_NUMERIC is specified, use inet_pton to translate numbers and
- dots notation. */
- if (hints->ai_flags & AI_NUMERICHOST) {
- struct sockaddr_in sin;
-
- /* check protocol family is PF_UNSPEC or PF_INET */
- if (hints->ai_family == PF_UNSPEC || hints->ai_family == PF_INET)
- result.ai_family = AF_INET;
- else
- return EAI_FAMILY;
-
- sin.sin_family = result.ai_family;
- sin.sin_port = htons (port);
- if (inet_pton(result.ai_family, nodename, &sin.sin_addr)==0)
- return EAI_NONAME;
- sin.sin_addr.s_addr = inet_addr (nodename);
- /* Duplicate result and addr and return */
- *res = dup_addrinfo (&result, &sin, sizeof sin);
- return (*res == NULL) ? EAI_MEMORY : 0;
- }
-
-#if HAVE_H_ERRNO
- h_errno = 0;
-#endif
- errno = 0;
- hp = gethostbyname(nodename);
- if (hp == NULL) {
-#ifdef EAI_SYSTEM
- if (errno != 0) {
- return EAI_SYSTEM;
- }
-#endif
- switch (h_errno) {
- case HOST_NOT_FOUND:
- return EAI_NODATA;
- case NO_DATA:
- return EAI_NODATA;
-#if defined(NO_ADDRESS) && NO_ADDRESS != NO_DATA
- case NO_ADDRESS:
- return EAI_NODATA;
-#endif
- case NO_RECOVERY:
- return EAI_FAIL;
- case TRY_AGAIN:
- return EAI_AGAIN;
- default:
- return EAI_FAIL;
- }
- return EAI_FAIL;
- }
-
- /* Check that the address family is acceptable.
- */
- switch (hp->h_addrtype) {
- case AF_INET:
- if (!(hints->ai_family == PF_UNSPEC || hints->ai_family == PF_INET))
- return EAI_FAMILY;
- break;
-#ifndef __OS2__
- case AF_INET6:
- if (!(hints->ai_family == PF_UNSPEC || hints->ai_family == PF_INET6))
- return EAI_FAMILY;
- break;
-#endif
- default:
- return EAI_FAMILY;
- }
-
- /* For each element pointed to by hp, create an element in the
- result linked list. */
- sai = eai = NULL;
- for (addrs = hp->h_addr_list; *addrs != NULL; addrs++) {
- struct sockaddr sa;
- size_t addrlen;
-
- if (hp->h_length < 1)
- continue;
- sa.sa_family = hp->h_addrtype;
- switch (hp->h_addrtype) {
- case AF_INET:
- ((struct sockaddr_in *) &sa)->sin_port = htons (port);
- memcpy (&((struct sockaddr_in *) &sa)->sin_addr,
- *addrs, hp->h_length);
- addrlen = sizeof (struct sockaddr_in);
- break;
-#ifndef __OS2__
- case AF_INET6:
-#if SIN6_LEN
- ((struct sockaddr_in6 *) &sa)->sin6_len = hp->h_length;
-#endif
- ((struct sockaddr_in6 *) &sa)->sin6_port = htons (port);
- memcpy (&((struct sockaddr_in6 *) &sa)->sin6_addr,
- *addrs, hp->h_length);
- addrlen = sizeof (struct sockaddr_in6);
- break;
-#endif
- default:
- continue;
- }
-
- result.ai_family = hp->h_addrtype;
- ai = dup_addrinfo (&result, &sa, addrlen);
- if (ai == NULL) {
- freeaddrinfo (sai);
- return EAI_MEMORY;
- }
- if (sai == NULL)
- sai = ai;
- else
- eai->ai_next = ai;
- eai = ai;
- }
-
- if (sai == NULL) {
- return EAI_NODATA;
- }
-
- if (hints->ai_flags & AI_CANONNAME) {
- sai->ai_canonname = malloc (strlen (hp->h_name) + 1);
- if (sai->ai_canonname == NULL) {
- freeaddrinfo (sai);
- return EAI_MEMORY;
- }
- strcpy (sai->ai_canonname, hp->h_name);
- }
-
- *res = sai;
- return 0;
-}
-
-void
-freeaddrinfo (struct addrinfo *ai)
-{
- struct addrinfo *next;
-
- while (ai != NULL) {
- next = ai->ai_next;
- if (ai->ai_canonname != NULL)
- free (ai->ai_canonname);
- if (ai->ai_addr != NULL)
- free (ai->ai_addr);
- free (ai);
- ai = next;
- }
-}
-
-const char *
-gai_strerror (int ecode)
-{
- static const char *eai_descr[] = {
- "no error",
- "address family for nodename not supported", /* EAI_ADDRFAMILY */
- "temporary failure in name resolution", /* EAI_AGAIN */
- "invalid value for ai_flags", /* EAI_BADFLAGS */
- "non-recoverable failure in name resolution", /* EAI_FAIL */
- "ai_family not supported", /* EAI_FAMILY */
- "memory allocation failure", /* EAI_MEMORY */
- "no address associated with nodename", /* EAI_NODATA */
- "nodename nor servname provided, or not known", /* EAI_NONAME */
- "servname not supported for ai_socktype", /* EAI_SERVICE */
- "ai_socktype not supported", /* EAI_SOCKTYPE */
- "system error returned in errno", /* EAI_SYSTEM */
- "argument buffer overflow", /* EAI_OVERFLOW */
- };
-
- if (ecode < 0 || ecode > (int) (sizeof eai_descr/ sizeof eai_descr[0]))
- return "unknown error";
- return eai_descr[ecode];
-}
-
-#endif /* HAVE_GETADDRINFO */
diff --git a/src/3rdparty/os2/getaddrinfo.h b/src/3rdparty/os2/getaddrinfo.h
deleted file mode 100644
index 0a588a40a2..0000000000
--- a/src/3rdparty/os2/getaddrinfo.h
+++ /dev/null
@@ -1,101 +0,0 @@
-#ifndef _getaddrinfo_h
-#define _getaddrinfo_h
-
-/*
- * Shamelessly duplicated from the fetchmail public sources
- * for use by the Squid Project under GNU Public License.
- *
- * Update/Maintenance History:
- *
- * 15-Aug-2007 : Copied from fetchmail 6.3.8
- * - added protection around libray headers
- *
- * 16-Aug-2007 : Altered configure checks
- * Un-hacked slightly to use system gethostbyname()
- *
- * Original License and code follows.
- */
-
-/*
- * This file is part of libESMTP, a library for submission of RFC 2822
- * formatted electronic mail messages using the SMTP protocol described
- * in RFC 2821.
- *
- * Copyright (C) 2001,2002 Brian Stafford
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-/* Structure and prototypes taken from RFC 2553 */
-
-/* SG 23/09/2007:
-On Windows the following definitions are already available, may be that
-this could be needed on some other platform */
-typedef int socklen_t;
-
-struct addrinfo {
- int ai_flags; /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */
- int ai_family; /* PF_xxx */
- int ai_socktype; /* SOCK_xxx */
- int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
- socklen_t ai_addrlen; /* length of ai_addr */
- char *ai_canonname; /* canonical name for nodename */
- struct sockaddr *ai_addr; /* binary address */
- struct addrinfo *ai_next; /* next structure in linked list */
-};
-
-/* Supposed to be defined in */
-#define AI_ADDRCONFIG 0
-#define AI_PASSIVE 1 /* Socket address is intended for `bind'. */
-#define AI_CANONNAME 2 /* Request for canonical name. */
-#define AI_NUMERICHOST 4 /* Don't use name resolution. */
-
-/* Supposed to be defined in */
-#define EAI_ADDRFAMILY 1 /* address family for nodename not supported */
-#define EAI_AGAIN 2 /* temporary failure in name resolution */
-#define EAI_BADFLAGS 3 /* invalid value for ai_flags */
-#define EAI_FAIL 4 /* non-recoverable failure in name resolution */
-#define EAI_FAMILY 5 /* ai_family not supported */
-#define EAI_MEMORY 6 /* memory allocation failure */
-#define EAI_NODATA 7 /* no address associated with nodename */
-#define EAI_NONAME 8 /* nodename nor servname provided, or not known */
-#define EAI_SERVICE 9 /* servname not supported for ai_socktype */
-#define EAI_SOCKTYPE 10 /* ai_socktype not supported */
-
-#ifndef EAI_SYSTEM
-/* Not defined on mingw32. */
-#define EAI_SYSTEM 11 /* System error returned in `errno'. */
-#endif
-#ifndef EAI_OVERFLOW
-/* Not defined on mingw32. */
-#define EAI_OVERFLOW 12 /* Argument buffer overflow. */
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-/* RFC 2553 / Posix resolver */
-int getaddrinfo (const char *nodename, const char *servname,
- const struct addrinfo *hints, struct addrinfo **res);
-/* Free addrinfo structure and associated storage */
-void freeaddrinfo (struct addrinfo *ai);
-
-/* Convert error return from getaddrinfo() to string */
-const char *gai_strerror (int code);
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _getaddrinfo_h */
diff --git a/src/3rdparty/os2/getnameinfo.c b/src/3rdparty/os2/getnameinfo.c
deleted file mode 100644
index 14fd89ef15..0000000000
--- a/src/3rdparty/os2/getnameinfo.c
+++ /dev/null
@@ -1,367 +0,0 @@
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Issues to be discussed:
- * - RFC2553 says that we should raise error on short buffer. X/Open says
- * we need to truncate the result. We obey RFC2553 (and X/Open should be
- * modified). ipngwg rough consensus seems to follow RFC2553. RFC3493 says
- * nothing about it, but defines a new error code EAI_OVERFLOW which seems
- * to be intended the code for this case.
- * - What is "local" in NI_NOFQDN? (see comments in the code)
- * - NI_NAMEREQD and NI_NUMERICHOST conflict with each other.
- * - (KAME extension) always attach textual scopeid (fe80::1%lo0), if
- * sin6_scope_id is filled - standardization status?
- * - what should we do if we should do getservbyport("sctp")?
- */
-
-/*
- * Considerations about thread-safeness
- * The code in this file is thread-safe, and so the thread-safeness of
- * getnameinfo() depends on the property of backend functions.
- * - getservbyport() is not thread safe for most systems we are targeting.
- * - getipnodebyaddr() is thread safe. However, many resolver libraries
- * used in the function are not thread safe.
- * - gethostbyaddr() is usually not thread safe.
- */
-
-#if !HAVE_GETNAMEINFO
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include "getaddrinfo.h"
-#include "getnameinfo.h"
-
-static const struct afd {
- int a_af;
- int a_addrlen;
- int a_socklen;
- int a_off;
- int a_portoff;
-} afdl [] = {
-#if INET6
- {PF_INET6, sizeof(struct in6_addr), sizeof(struct sockaddr_in6),
- offsetof(struct sockaddr_in6, sin6_addr),
- offsetof(struct sockaddr_in6, sin6_port)},
-#endif
- {PF_INET, sizeof(struct in_addr), sizeof(struct sockaddr_in),
- offsetof(struct sockaddr_in, sin_addr),
- offsetof(struct sockaddr_in, sin_port)},
- {0, 0, 0, 0, 0},
-};
-
-#if INET6
-static int ip6_parsenumeric __P((const struct sockaddr *, const char *, char *,
- size_t, int));
-static int ip6_sa2str __P((const struct sockaddr_in6 *, char *, size_t, int));
-#endif
-
-int
-getnameinfo(sa, salen, host, hostlen, serv, servlen, flags)
-const struct sockaddr *sa;
-socklen_t salen;
-char *host;
-size_t hostlen;
-char *serv;
-size_t servlen;
-int flags;
-{
- const struct afd *afd;
- struct servent *sp;
- struct hostent *hp;
- unsigned short port;
- int family, i;
- const char *addr;
- uint32_t v4a;
- char numserv[512];
-
- if (sa == NULL)
- return EAI_FAIL;
-
-#if HAVE_SA_LEN /*XXX*/
- if (sa->sa_len != salen)
- return EAI_FAIL;
-#endif
-
- family = sa->sa_family;
- for (i = 0; afdl[i].a_af; i++)
- if (afdl[i].a_af == family) {
- afd = &afdl[i];
- goto found;
- }
- return EAI_FAMILY;
-
-found:
- if (salen != afd->a_socklen)
- return EAI_FAIL;
-
- /* network byte order */
- memcpy(&port, (const char *)sa + afd->a_portoff, sizeof(port));
- addr = (const char *)sa + afd->a_off;
-
- if (serv == NULL || servlen == 0) {
- /*
- * do nothing in this case.
- * in case you are wondering if "&&" is more correct than
- * "||" here: RFC3493 says that serv == NULL OR servlen == 0
- * means that the caller does not want the result.
- */
- } else {
- if (flags & NI_NUMERICSERV)
- sp = NULL;
- else {
- sp = getservbyport(port,
- (flags & NI_DGRAM) ? "udp" : "tcp");
- }
- if (sp) {
- if (strlen(sp->s_name) + 1 > servlen)
- return EAI_OVERFLOW;
- strncpy(serv, sp->s_name, servlen);
- } else {
- snprintf(numserv, sizeof(numserv), "%u", ntohs(port));
- if (strlen(numserv) + 1 > servlen)
- return EAI_OVERFLOW;
- strncpy(serv, numserv, servlen);
- }
- }
-
- switch (sa->sa_family) {
- case AF_INET:
- v4a = (uint32_t)
- ntohl(((const struct sockaddr_in *)sa)->sin_addr.s_addr);
- if (IN_MULTICAST(v4a) || IN_EXPERIMENTAL(v4a))
- flags |= NI_NUMERICHOST;
- v4a >>= IN_CLASSA_NSHIFT;
- if (v4a == 0)
- flags |= NI_NUMERICHOST;
- break;
-#if INET6
- case AF_INET6: {
- const struct sockaddr_in6 *sin6;
- sin6 = (const struct sockaddr_in6 *)sa;
- switch (sin6->sin6_addr.s6_addr[0]) {
- case 0x00:
- if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr))
- ;
- else if (IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr))
- ;
- else
- flags |= NI_NUMERICHOST;
- break;
- default:
- if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr))
- flags |= NI_NUMERICHOST;
- else if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr))
- flags |= NI_NUMERICHOST;
- break;
- }
- }
- break;
-#endif
- }
- if (host == NULL || hostlen == 0) {
- /*
- * do nothing in this case.
- * in case you are wondering if "&&" is more correct than
- * "||" here: RFC3493 says that host == NULL or hostlen == 0
- * means that the caller does not want the result.
- */
- } else if (flags & NI_NUMERICHOST) {
- /* NUMERICHOST and NAMEREQD conflicts with each other */
- if (flags & NI_NAMEREQD)
- return EAI_NONAME;
-
- goto numeric;
- } else {
-#if USE_GETIPNODEBY
- int h_error = 0;
- hp = getipnodebyaddr(addr, afd->a_addrlen, afd->a_af, &h_error);
-#else
- hp = gethostbyaddr(addr, afd->a_addrlen, afd->a_af);
-#if 0 // getnameinfo.c:161:9: error: variable 'h_error' set but not used
-#if HAVE_H_ERRNO
- h_error = h_errno;
-#else
- h_error = EINVAL;
-#endif
-#endif /* 0 */
-#endif
-
- if (hp) {
-#if 0
- if (flags & NI_NOFQDN) {
- /*
- * According to RFC3493 section 6.2, NI_NOFQDN
- * means "node name portion of the FQDN shall
- * be returned for local hosts." The following
- * code tries to implement it by returning the
- * first label (the part before the first
- * period) of the FQDN. However, it is not
- * clear if this always makes sense, since the
- * given address may be outside of "local
- * hosts." Due to the unclear description, we
- * disable the code in this implementation.
- */
- char *p;
- p = strchr(hp->h_name, '.');
- if (p)
- *p = '\0';
- }
-#endif
- if (strlen(hp->h_name) + 1 > hostlen) {
-#if USE_GETIPNODEBY
- freehostent(hp);
-#endif
- return EAI_OVERFLOW;
- }
- strncpy(host, hp->h_name, hostlen);
-#if USE_GETIPNODEBY
- freehostent(hp);
-#endif
- } else {
- if (flags & NI_NAMEREQD)
- return EAI_NONAME;
-
-numeric:
- switch (afd->a_af) {
-#if INET6
- case AF_INET6: {
- int error;
-
- if ((error = ip6_parsenumeric(sa, addr, host,
- hostlen,
- flags)) != 0)
- return(error);
- break;
- }
-#endif
- default:
- if (inet_ntop(afd->a_af, addr, host,
- hostlen) == NULL)
- return EAI_SYSTEM;
- break;
- }
- }
- }
- return(0);
-}
-
-#if INET6
-static int
-ip6_parsenumeric(sa, addr, host, hostlen, flags)
-const struct sockaddr *sa;
-const char *addr;
-char *host;
-size_t hostlen;
-int flags;
-{
- int numaddrlen;
- char numaddr[512];
-
- if (inet_ntop(AF_INET6, addr, numaddr, sizeof(numaddr)) == NULL)
- return EAI_SYSTEM;
-
- numaddrlen = strlen(numaddr);
- if (numaddrlen + 1 > hostlen) /* don't forget terminator */
- return EAI_OVERFLOW;
- strncpy(host, numaddr, hostlen);
-
- if (((const struct sockaddr_in6 *)sa)->sin6_scope_id) {
- char zonebuf[SQUIDHOSTNAMELEN];
- int zonelen;
-
- zonelen = ip6_sa2str(
- (const struct sockaddr_in6 *)(const void *)sa,
- zonebuf, sizeof(zonebuf), flags);
- if (zonelen < 0)
- return EAI_OVERFLOW;
- if (zonelen + 1 + numaddrlen + 1 > hostlen)
- return EAI_OVERFLOW;
-
- /* construct */
- memcpy(host + numaddrlen + 1, zonebuf,
- (size_t)zonelen);
- host[numaddrlen] = SCOPE_DELIMITER;
- host[numaddrlen + 1 + zonelen] = '\0';
- }
-
- return 0;
-}
-
-/* ARGSUSED */
-static int
-ip6_sa2str(sa6, buf, bufsiz, flags)
-const struct sockaddr_in6 *sa6;
-char *buf;
-size_t bufsiz;
-int flags;
-{
- unsigned int ifindex;
- const struct in6_addr *a6;
- int n;
-
- ifindex = (unsigned int)sa6->sin6_scope_id;
- a6 = &sa6->sin6_addr;
-
-#if NI_NUMERICSCOPE
- if ((flags & NI_NUMERICSCOPE) != 0) {
- n = snprintf(buf, bufsiz, "%u", sa6->sin6_scope_id);
- if (n < 0 || n >= bufsiz)
- return -1;
- else
- return n;
- }
-#endif
-
- /* if_indextoname() does not take buffer size. not a good api... */
- if ((IN6_IS_ADDR_LINKLOCAL(a6) || IN6_IS_ADDR_MC_LINKLOCAL(a6) ||
- IN6_IS_ADDR_MC_NODELOCAL(a6)) && bufsiz >= IF_NAMESIZE) {
- char *p = if_indextoname(ifindex, buf);
- if (p)
- return (strlen(p));
- }
-
- /* last resort */
- n = snprintf(buf, bufsiz, "%u", sa6->sin6_scope_id);
- if (n < 0 || n >= bufsiz)
- return -1;
- else
- return n;
-}
-#endif /* INET6 */
-#endif
diff --git a/src/3rdparty/os2/getnameinfo.h b/src/3rdparty/os2/getnameinfo.h
deleted file mode 100644
index c1861aa033..0000000000
--- a/src/3rdparty/os2/getnameinfo.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef _getnameinfo_h
-#define _getnameinfo_h
-/*
- * Reconstructed from KAME getnameinfo.c (in lib/)
- */
-
- /* getnameinfo flags */
-#define NI_NOFQDN 0x0001
-#define NI_NUMERICHOST 0x0002 /* return numeric form of address */
-#define NI_NAMEREQD 0x0004 /* request DNS name */
-#define NI_NUMERICSERV 0x0008
-#define NI_DGRAM 0x0010
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-/* RFC 2553 / Posix resolver */
-int getnameinfo(const struct sockaddr *sa,
- socklen_t salen,
- char *host,
- size_t hostlen,
- char *serv,
- size_t servlen,
- int flags );
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _getnameinfo_h */
diff --git a/src/ai/ai_gui.cpp b/src/ai/ai_gui.cpp
index e3512d315d..0cd83ea8b3 100644
--- a/src/ai/ai_gui.cpp
+++ b/src/ai/ai_gui.cpp
@@ -164,6 +164,17 @@ struct AIConfigWindow : public Window {
switch (widget) {
case WID_AIC_LIST: {
Rect tr = r.Shrink(WidgetDimensions::scaled.matrix);
+ int max_slot = GetGameSettings().difficulty.max_no_competitors;
+ if (_game_mode == GM_NORMAL) {
+ for (const Company *c : Company::Iterate()) {
+ if (c->is_ai) max_slot--;
+ }
+ for (CompanyID cid = COMPANY_FIRST; cid < (CompanyID)max_slot && cid < MAX_COMPANIES; cid++) {
+ if (Company::IsValidID(cid)) max_slot++;
+ }
+ } else {
+ max_slot++; // Slot 0 is human
+ }
for (int i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < MAX_COMPANIES; i++) {
StringID text;
@@ -180,13 +191,6 @@ struct AIConfigWindow : public Window {
if (this->selected_slot == i) {
tc = TC_WHITE;
} else if (IsEditable((CompanyID)i)) {
- int max_slot = GetGameSettings().difficulty.max_no_competitors;
- for (const Company *c : Company::Iterate()) {
- if (c->is_ai) max_slot--;
- }
- for (CompanyID cid = COMPANY_FIRST; cid < (CompanyID)max_slot && cid < MAX_COMPANIES; cid++) {
- if (Company::IsValidHumanID(cid)) max_slot++;
- }
if (i < max_slot) tc = TC_ORANGE;
} else if (Company::IsValidAiID(i)) {
tc = TC_GREEN;
diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp
index e6c979f872..7ad284b5b7 100644
--- a/src/aircraft_cmd.cpp
+++ b/src/aircraft_cmd.cpp
@@ -306,11 +306,16 @@ CommandCost CmdBuildAircraft(DoCommandFlag flags, TileIndex tile, const Engine *
v->cargo_cap = avi->passenger_capacity;
v->refit_cap = 0;
- u->cargo_cap = avi->mail_capacity;
u->refit_cap = 0;
v->cargo_type = e->GetDefaultCargoType();
- u->cargo_type = CT_MAIL;
+ assert(IsValidCargoID(v->cargo_type));
+
+ CargoID mail = GetCargoIDByLabel(CT_MAIL);
+ if (IsValidCargoID(mail)) {
+ u->cargo_type = mail;
+ u->cargo_cap = avi->mail_capacity;
+ }
v->name.clear();
v->last_station_visited = INVALID_STATION;
diff --git a/src/articulated_vehicles.cpp b/src/articulated_vehicles.cpp
index 1f3a8a54b2..110acb3371 100644
--- a/src/articulated_vehicles.cpp
+++ b/src/articulated_vehicles.cpp
@@ -398,6 +398,7 @@ void AddArticulatedParts(Vehicle *first)
rv->spritenum = e_artic->u.road.image_index;
if (e_artic->CanCarryCargo()) {
rv->cargo_type = e_artic->GetDefaultCargoType();
+ assert(IsValidCargoID(rv->cargo_type));
rv->cargo_cap = e_artic->u.road.capacity; // Callback 36 is called when the consist is finished
} else {
rv->cargo_type = front->cargo_type; // Needed for livery selection
diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp
index 02e86115e2..467b9c0bed 100644
--- a/src/build_vehicle_gui.cpp
+++ b/src/build_vehicle_gui.cpp
@@ -820,7 +820,7 @@ static int DrawAircraftPurchaseInfo(int left, int right, int y, EngineID engine_
if (te.mail_capacity > 0) {
SetDParam(0, te.cargo);
SetDParam(1, te.capacity);
- SetDParam(2, CT_MAIL);
+ SetDParam(2, GetCargoIDByLabel(CT_MAIL));
SetDParam(3, te.mail_capacity);
DrawString(left, right, y, STR_PURCHASE_INFO_AIRCRAFT_CAPACITY);
} else {
@@ -902,7 +902,11 @@ void TestedEngineDetails::FillDefaultCapacities(const Engine *e)
} else {
this->capacity = e->GetDisplayDefaultCapacity(&this->mail_capacity);
this->all_capacities[this->cargo] = this->capacity;
- this->all_capacities[CT_MAIL] = this->mail_capacity;
+ if (IsValidCargoID(GetCargoIDByLabel(CT_MAIL))) {
+ this->all_capacities[GetCargoIDByLabel(CT_MAIL)] = this->mail_capacity;
+ } else {
+ this->mail_capacity = 0;
+ }
}
if (this->all_capacities.GetCount() == 0) this->cargo = INVALID_CARGO;
}
diff --git a/src/cargo_type.h b/src/cargo_type.h
index 871f958790..e3eca4772f 100644
--- a/src/cargo_type.h
+++ b/src/cargo_type.h
@@ -11,58 +11,64 @@
#define CARGO_TYPE_H
#include "core/enum_type.hpp"
+#include "core/strong_typedef_type.hpp"
+
+/** Globally unique label of a cargo type. */
+using CargoLabel = StrongType::Typedef;
/**
* Cargo slots to indicate a cargo type within a game.
- * Numbers are re-used between different climates.
- * @see CargoTypes
*/
-typedef byte CargoID;
+using CargoID = byte;
-/** Available types of cargo */
-enum CargoType {
- /* Temperate */
- CT_PASSENGERS = 0,
- CT_COAL = 1,
- CT_MAIL = 2,
- CT_OIL = 3,
- CT_LIVESTOCK = 4,
- CT_GOODS = 5,
- CT_GRAIN = 6,
- CT_WOOD = 7,
- CT_IRON_ORE = 8,
- CT_STEEL = 9,
- CT_VALUABLES = 10,
+/**
+ * Available types of cargo
+ * Labels may be re-used between different climates.
+ */
- /* Arctic */
- CT_WHEAT = 6,
- CT_HILLY_UNUSED = 8,
- CT_PAPER = 9,
- CT_GOLD = 10,
- CT_FOOD = 11,
+/* Temperate */
+static constexpr CargoLabel CT_PASSENGERS = CargoLabel{'PASS'};
+static constexpr CargoLabel CT_COAL = CargoLabel{'COAL'};
+static constexpr CargoLabel CT_MAIL = CargoLabel{'MAIL'};
+static constexpr CargoLabel CT_OIL = CargoLabel{'OIL_'};
+static constexpr CargoLabel CT_LIVESTOCK = CargoLabel{'LVST'};
+static constexpr CargoLabel CT_GOODS = CargoLabel{'GOOD'};
+static constexpr CargoLabel CT_GRAIN = CargoLabel{'GRAI'};
+static constexpr CargoLabel CT_WOOD = CargoLabel{'WOOD'};
+static constexpr CargoLabel CT_IRON_ORE = CargoLabel{'IORE'};
+static constexpr CargoLabel CT_STEEL = CargoLabel{'STEL'};
+static constexpr CargoLabel CT_VALUABLES = CargoLabel{'VALU'};
- /* Tropic */
- CT_RUBBER = 1,
- CT_FRUIT = 4,
- CT_MAIZE = 6,
- CT_COPPER_ORE = 8,
- CT_WATER = 9,
- CT_DIAMONDS = 10,
+/* Arctic */
+static constexpr CargoLabel CT_WHEAT = CargoLabel{'WHEA'};
+static constexpr CargoLabel CT_PAPER = CargoLabel{'PAPR'};
+static constexpr CargoLabel CT_GOLD = CargoLabel{'GOLD'};
+static constexpr CargoLabel CT_FOOD = CargoLabel{'FOOD'};
- /* Toyland */
- CT_SUGAR = 1,
- CT_TOYS = 3,
- CT_BATTERIES = 4,
- CT_CANDY = 5,
- CT_TOFFEE = 6,
- CT_COLA = 7,
- CT_COTTON_CANDY = 8,
- CT_BUBBLES = 9,
- CT_PLASTIC = 10,
- CT_FIZZY_DRINKS = 11,
+/* Tropic */
+static constexpr CargoLabel CT_RUBBER = CargoLabel{'RUBR'};
+static constexpr CargoLabel CT_FRUIT = CargoLabel{'FRUI'};
+static constexpr CargoLabel CT_MAIZE = CargoLabel{'MAIZ'};
+static constexpr CargoLabel CT_COPPER_ORE = CargoLabel{'CORE'};
+static constexpr CargoLabel CT_WATER = CargoLabel{'WATR'};
+static constexpr CargoLabel CT_DIAMONDS = CargoLabel{'DIAM'};
- CT_INVALID = 0xFF, ///< Invalid cargo type.
-};
+/* Toyland */
+static constexpr CargoLabel CT_SUGAR = CargoLabel{'SUGR'};
+static constexpr CargoLabel CT_TOYS = CargoLabel{'TOYS'};
+static constexpr CargoLabel CT_BATTERIES = CargoLabel{'BATT'};
+static constexpr CargoLabel CT_CANDY = CargoLabel{'SWET'};
+static constexpr CargoLabel CT_TOFFEE = CargoLabel{'TOFF'};
+static constexpr CargoLabel CT_COLA = CargoLabel{'COLA'};
+static constexpr CargoLabel CT_COTTON_CANDY = CargoLabel{'CTCD'};
+static constexpr CargoLabel CT_BUBBLES = CargoLabel{'BUBL'};
+static constexpr CargoLabel CT_PLASTIC = CargoLabel{'PLST'};
+static constexpr CargoLabel CT_FIZZY_DRINKS = CargoLabel{'FZDR'};
+
+/** Dummy label for engines that carry no cargo; they actually carry 0 passengers. */
+static constexpr CargoLabel CT_NONE = CT_PASSENGERS;
+
+static constexpr CargoLabel CT_INVALID = CargoLabel{UINT32_MAX}; ///< Invalid cargo type.
static const CargoID NUM_ORIGINAL_CARGO = 12; ///< Original number of cargo types.
static const CargoID NUM_CARGO = 64; ///< Maximum number of cargo types in a game.
@@ -73,6 +79,13 @@ static const CargoID CARGO_NO_REFIT = 0xFE; ///< Do not refit cargo of a vehicle
static const CargoID INVALID_CARGO = UINT8_MAX;
+/** Mixed cargo types for definitions with cargo that can vary depending on climate. */
+enum MixedCargoType {
+ MCT_LIVESTOCK_FRUIT, ///< Cargo can be livestock or fruit.
+ MCT_GRAIN_WHEAT_MAIZE, ///< Cargo can be grain, wheat or maize.
+ MCT_VALUABLES_GOLD_DIAMONDS, ///< Cargo can be valuables, gold or diamonds.
+};
+
/**
* Special cargo filter criteria.
* These are used by user interface code only and must not be assigned to any entity. Not all values are valid for every UI filter.
@@ -85,7 +98,7 @@ namespace CargoFilterCriteria {
};
/** Test whether cargo type is not CT_INVALID */
-inline bool IsValidCargoType(CargoType t) { return t != CT_INVALID; }
+inline bool IsValidCargoType(CargoLabel t) { return t != CT_INVALID; }
/** Test whether cargo type is not INVALID_CARGO */
inline bool IsValidCargoID(CargoID t) { return t != INVALID_CARGO; }
diff --git a/src/cargotype.cpp b/src/cargotype.cpp
index 7181782ec4..bca7e368b5 100644
--- a/src/cargotype.cpp
+++ b/src/cargotype.cpp
@@ -35,6 +35,12 @@ CargoTypes _cargo_mask;
*/
CargoTypes _standard_cargo_mask;
+/**
+ * List of default cargo labels, used when setting up cargo types for default vehicles.
+ * This is done by label so that a cargo label can be redefined in a different slot.
+ */
+static std::vector _default_cargo_labels;
+
/**
* Set up the default cargo types for the given landscape type.
* @param l Landscape
@@ -44,18 +50,20 @@ void SetupCargoForClimate(LandscapeID l)
assert(l < lengthof(_default_climate_cargo));
_cargo_mask = 0;
+ _default_cargo_labels.clear();
/* Copy from default cargo by label or index. */
auto insert = std::begin(CargoSpec::array);
- for (const CargoLabel &cl : _default_climate_cargo[l]) {
+ for (const auto &cl : _default_climate_cargo[l]) {
/* Check if value is an index into the cargo table */
- if (cl < lengthof(_default_cargo)) {
+ if (std::holds_alternative(cl)) {
/* Copy the default cargo by index. */
- *insert = _default_cargo[cl];
+ *insert = _default_cargo[std::get(cl)];
} else {
/* Search for label in default cargo types and copy if found. */
- auto found = std::find_if(std::begin(_default_cargo), std::end(_default_cargo), [&cl](const CargoSpec &cs) { return cs.label == cl; });
+ CargoLabel label = std::get(cl);
+ auto found = std::find_if(std::begin(_default_cargo), std::end(_default_cargo), [&label](const CargoSpec &cs) { return cs.label == label; });
if (found != std::end(_default_cargo)) {
*insert = *found;
} else {
@@ -64,12 +72,49 @@ void SetupCargoForClimate(LandscapeID l)
}
}
- if (insert->IsValid()) SetBit(_cargo_mask, insert->Index());
+ if (insert->IsValid()) {
+ SetBit(_cargo_mask, insert->Index());
+ _default_cargo_labels.push_back(insert->label);
+ }
++insert;
}
/* Reset and disable remaining cargo types. */
std::fill(insert, std::end(CargoSpec::array), CargoSpec{});
+
+ BuildCargoLabelMap();
+}
+
+/**
+ * Build cargo label map.
+ * This is called multiple times during NewGRF initialization as cargos are defined, so that TranslateRefitMask() and
+ * GetCargoTranslation(), also used during initialization, get the correct information.
+ */
+void BuildCargoLabelMap()
+{
+ CargoSpec::label_map.clear();
+ for (const CargoSpec &cs : CargoSpec::array) {
+ /* During initialization, CargoSpec can be marked valid before the label has been set. */
+ if (!cs.IsValid() || cs.label == CargoLabel{0}) continue;
+ /* Label already exists, don't addd again. */
+ if (CargoSpec::label_map.count(cs.label) != 0) continue;
+
+ CargoSpec::label_map.insert(std::make_pair(cs.label, cs.Index()));
+ }
+}
+
+/**
+ * Test if a cargo is a default cargo type.
+ * @param cid Cargo ID.
+ * @returns true iff the cargo type is a default cargo type.
+ */
+bool IsDefaultCargo(CargoID cid)
+{
+ auto cs = CargoSpec::Get(cid);
+ if (!cs->IsValid()) return false;
+
+ CargoLabel label = cs->label;
+ return std::any_of(std::begin(_default_cargo_labels), std::end(_default_cargo_labels), [&label](const CargoLabel &cl) { return cl == label; });
}
/**
@@ -85,44 +130,6 @@ Dimension GetLargestCargoIconSize()
return size;
}
-/**
- * Get the cargo ID of a default cargo, if present.
- * @param l Landscape
- * @param ct Default cargo type.
- * @return ID number if the cargo exists, else #INVALID_CARGO
- */
-CargoID GetDefaultCargoID(LandscapeID l, CargoType ct)
-{
- assert(l < lengthof(_default_climate_cargo));
-
- if (!IsValidCargoType(ct)) return INVALID_CARGO;
-
- assert(ct < lengthof(_default_climate_cargo[0]));
- CargoLabel cl = _default_climate_cargo[l][ct];
- /* Bzzt: check if cl is just an index into the cargo table */
- if (cl < lengthof(_default_cargo)) {
- cl = _default_cargo[cl].label;
- }
-
- return GetCargoIDByLabel(cl);
-}
-
-/**
- * Get the cargo ID by cargo label.
- * @param cl Cargo type to get.
- * @return ID number if the cargo exists, else #INVALID_CARGO
- */
-CargoID GetCargoIDByLabel(CargoLabel cl)
-{
- for (const CargoSpec *cs : CargoSpec::Iterate()) {
- if (cs->label == cl) return cs->Index();
- }
-
- /* No matching label was found, so it is invalid */
- return INVALID_CARGO;
-}
-
-
/**
* Find the CargoID of a 'bitnum' value.
* @param bitnum 'bitnum' to find.
diff --git a/src/cargotype.h b/src/cargotype.h
index 4c83c3ceba..81758c8b42 100644
--- a/src/cargotype.h
+++ b/src/cargotype.h
@@ -17,9 +17,6 @@
#include "landscape_type.h"
#include "core/bitmath_func.hpp"
-/** Globally unique label of a cargo type. */
-typedef uint32_t CargoLabel;
-
/** Town growth effect when delivering cargo. */
enum TownAcceptanceEffect : byte {
TAE_BEGIN = 0,
@@ -194,8 +191,11 @@ struct CargoSpec {
private:
static CargoSpec array[NUM_CARGO]; ///< Array holding all CargoSpecs
+ static inline std::map label_map{}; ///< Translation map from CargoLabel to Cargo ID.
friend void SetupCargoForClimate(LandscapeID l);
+ friend void BuildCargoLabelMap();
+ friend inline CargoID GetCargoIDByLabel(CargoLabel ct);
friend void FinaliseCargoArray();
};
@@ -203,9 +203,17 @@ extern CargoTypes _cargo_mask;
extern CargoTypes _standard_cargo_mask;
void SetupCargoForClimate(LandscapeID l);
-CargoID GetCargoIDByLabel(CargoLabel cl);
+bool IsDefaultCargo(CargoID cid);
+void BuildCargoLabelMap();
CargoID GetCargoIDByBitnum(uint8_t bitnum);
-CargoID GetDefaultCargoID(LandscapeID l, CargoType ct);
+
+inline CargoID GetCargoIDByLabel(CargoLabel label)
+{
+ auto found = CargoSpec::label_map.find(label);
+ if (found != std::end(CargoSpec::label_map)) return found->second;
+ return INVALID_CARGO;
+}
+
Dimension GetLargestCargoIconSize();
void InitializeSortedCargoSpecs();
diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp
index 8677367ff7..32743dd666 100644
--- a/src/company_cmd.cpp
+++ b/src/company_cmd.cpp
@@ -1046,7 +1046,7 @@ CommandCost CmdSetCompanyColour(DoCommandFlag flags, LiveryScheme scheme, bool p
c->livery[scheme].colour2 = colour;
if (scheme == LS_DEFAULT) {
- UpdateCompanyGroupLiveries(c);
+ UpdateCompanyLiveries(c);
}
}
diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp
index 5d8515c6ce..797b8e8ebe 100644
--- a/src/console_cmds.cpp
+++ b/src/console_cmds.cpp
@@ -2541,7 +2541,7 @@ static void ConDumpCargoTypes()
IConsolePrint(CC_DEFAULT, " {:02d} Bit: {:2d}, Label: {:c}{:c}{:c}{:c}, Callback mask: 0x{:02X}, Cargo class: {}{}{}{}{}{}{}{}{}{}{}, GRF: {:08X}, {}",
spec->Index(),
spec->bitnum,
- spec->label >> 24, spec->label >> 16, spec->label >> 8, spec->label,
+ spec->label.base() >> 24, spec->label.base() >> 16, spec->label.base() >> 8, spec->label.base(),
spec->callback_mask,
(spec->classes & CC_PASSENGERS) != 0 ? 'p' : '-',
(spec->classes & CC_MAIL) != 0 ? 'm' : '-',
diff --git a/src/date.cpp b/src/date.cpp
deleted file mode 100644
index 66ccc1444c..0000000000
--- a/src/date.cpp
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * This file is part of OpenTTD.
- * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
- * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see .
- */
-
-/** @file date.cpp Handling of dates in our native format and transforming them to something human readable. */
-
-#include "stdafx.h"
-#include "network/network.h"
-#include "network/network_func.h"
-#include "currency.h"
-#include "window_func.h"
-#include "settings_type.h"
-#include "date_func.h"
-#include "vehicle_base.h"
-#include "rail_gui.h"
-#include "linkgraph/linkgraph.h"
-#include "saveload/saveload.h"
-#include "newgrf_profiling.h"
-#include "widgets/statusbar_widget.h"
-
-#include "safeguards.h"
-
-Year _cur_year; ///< Current year, starting at 0
-Month _cur_month; ///< Current month (0..11)
-Date _date; ///< Current date in days (day counter)
-DateFract _date_fract; ///< Fractional part of the day.
-uint64 _tick_counter; ///< Ever incrementing tick counter for setting off various events
-
-/**
- * Set the date.
- * @param date New date
- * @param fract The number of ticks that have passed on this date.
- */
-void SetDate(Date date, DateFract fract)
-{
- assert(fract < DAY_TICKS);
-
- YearMonthDay ymd;
-
- _date = date;
- _date_fract = fract;
- ConvertDateToYMD(date, &ymd);
- _cur_year = ymd.year;
- _cur_month = ymd.month;
-}
-
-#define M(a, b) ((a << 5) | b)
-static const uint16 _month_date_from_year_day[] = {
- M( 0, 1), M( 0, 2), M( 0, 3), M( 0, 4), M( 0, 5), M( 0, 6), M( 0, 7), M( 0, 8), M( 0, 9), M( 0, 10), M( 0, 11), M( 0, 12), M( 0, 13), M( 0, 14), M( 0, 15), M( 0, 16), M( 0, 17), M( 0, 18), M( 0, 19), M( 0, 20), M( 0, 21), M( 0, 22), M( 0, 23), M( 0, 24), M( 0, 25), M( 0, 26), M( 0, 27), M( 0, 28), M( 0, 29), M( 0, 30), M( 0, 31),
- M( 1, 1), M( 1, 2), M( 1, 3), M( 1, 4), M( 1, 5), M( 1, 6), M( 1, 7), M( 1, 8), M( 1, 9), M( 1, 10), M( 1, 11), M( 1, 12), M( 1, 13), M( 1, 14), M( 1, 15), M( 1, 16), M( 1, 17), M( 1, 18), M( 1, 19), M( 1, 20), M( 1, 21), M( 1, 22), M( 1, 23), M( 1, 24), M( 1, 25), M( 1, 26), M( 1, 27), M( 1, 28), M( 1, 29),
- M( 2, 1), M( 2, 2), M( 2, 3), M( 2, 4), M( 2, 5), M( 2, 6), M( 2, 7), M( 2, 8), M( 2, 9), M( 2, 10), M( 2, 11), M( 2, 12), M( 2, 13), M( 2, 14), M( 2, 15), M( 2, 16), M( 2, 17), M( 2, 18), M( 2, 19), M( 2, 20), M( 2, 21), M( 2, 22), M( 2, 23), M( 2, 24), M( 2, 25), M( 2, 26), M( 2, 27), M( 2, 28), M( 2, 29), M( 2, 30), M( 2, 31),
- M( 3, 1), M( 3, 2), M( 3, 3), M( 3, 4), M( 3, 5), M( 3, 6), M( 3, 7), M( 3, 8), M( 3, 9), M( 3, 10), M( 3, 11), M( 3, 12), M( 3, 13), M( 3, 14), M( 3, 15), M( 3, 16), M( 3, 17), M( 3, 18), M( 3, 19), M( 3, 20), M( 3, 21), M( 3, 22), M( 3, 23), M( 3, 24), M( 3, 25), M( 3, 26), M( 3, 27), M( 3, 28), M( 3, 29), M( 3, 30),
- M( 4, 1), M( 4, 2), M( 4, 3), M( 4, 4), M( 4, 5), M( 4, 6), M( 4, 7), M( 4, 8), M( 4, 9), M( 4, 10), M( 4, 11), M( 4, 12), M( 4, 13), M( 4, 14), M( 4, 15), M( 4, 16), M( 4, 17), M( 4, 18), M( 4, 19), M( 4, 20), M( 4, 21), M( 4, 22), M( 4, 23), M( 4, 24), M( 4, 25), M( 4, 26), M( 4, 27), M( 4, 28), M( 4, 29), M( 4, 30), M( 4, 31),
- M( 5, 1), M( 5, 2), M( 5, 3), M( 5, 4), M( 5, 5), M( 5, 6), M( 5, 7), M( 5, 8), M( 5, 9), M( 5, 10), M( 5, 11), M( 5, 12), M( 5, 13), M( 5, 14), M( 5, 15), M( 5, 16), M( 5, 17), M( 5, 18), M( 5, 19), M( 5, 20), M( 5, 21), M( 5, 22), M( 5, 23), M( 5, 24), M( 5, 25), M( 5, 26), M( 5, 27), M( 5, 28), M( 5, 29), M( 5, 30),
- M( 6, 1), M( 6, 2), M( 6, 3), M( 6, 4), M( 6, 5), M( 6, 6), M( 6, 7), M( 6, 8), M( 6, 9), M( 6, 10), M( 6, 11), M( 6, 12), M( 6, 13), M( 6, 14), M( 6, 15), M( 6, 16), M( 6, 17), M( 6, 18), M( 6, 19), M( 6, 20), M( 6, 21), M( 6, 22), M( 6, 23), M( 6, 24), M( 6, 25), M( 6, 26), M( 6, 27), M( 6, 28), M( 6, 29), M( 6, 30), M( 6, 31),
- M( 7, 1), M( 7, 2), M( 7, 3), M( 7, 4), M( 7, 5), M( 7, 6), M( 7, 7), M( 7, 8), M( 7, 9), M( 7, 10), M( 7, 11), M( 7, 12), M( 7, 13), M( 7, 14), M( 7, 15), M( 7, 16), M( 7, 17), M( 7, 18), M( 7, 19), M( 7, 20), M( 7, 21), M( 7, 22), M( 7, 23), M( 7, 24), M( 7, 25), M( 7, 26), M( 7, 27), M( 7, 28), M( 7, 29), M( 7, 30), M( 7, 31),
- M( 8, 1), M( 8, 2), M( 8, 3), M( 8, 4), M( 8, 5), M( 8, 6), M( 8, 7), M( 8, 8), M( 8, 9), M( 8, 10), M( 8, 11), M( 8, 12), M( 8, 13), M( 8, 14), M( 8, 15), M( 8, 16), M( 8, 17), M( 8, 18), M( 8, 19), M( 8, 20), M( 8, 21), M( 8, 22), M( 8, 23), M( 8, 24), M( 8, 25), M( 8, 26), M( 8, 27), M( 8, 28), M( 8, 29), M( 8, 30),
- M( 9, 1), M( 9, 2), M( 9, 3), M( 9, 4), M( 9, 5), M( 9, 6), M( 9, 7), M( 9, 8), M( 9, 9), M( 9, 10), M( 9, 11), M( 9, 12), M( 9, 13), M( 9, 14), M( 9, 15), M( 9, 16), M( 9, 17), M( 9, 18), M( 9, 19), M( 9, 20), M( 9, 21), M( 9, 22), M( 9, 23), M( 9, 24), M( 9, 25), M( 9, 26), M( 9, 27), M( 9, 28), M( 9, 29), M( 9, 30), M( 9, 31),
- M(10, 1), M(10, 2), M(10, 3), M(10, 4), M(10, 5), M(10, 6), M(10, 7), M(10, 8), M(10, 9), M(10, 10), M(10, 11), M(10, 12), M(10, 13), M(10, 14), M(10, 15), M(10, 16), M(10, 17), M(10, 18), M(10, 19), M(10, 20), M(10, 21), M(10, 22), M(10, 23), M(10, 24), M(10, 25), M(10, 26), M(10, 27), M(10, 28), M(10, 29), M(10, 30),
- M(11, 1), M(11, 2), M(11, 3), M(11, 4), M(11, 5), M(11, 6), M(11, 7), M(11, 8), M(11, 9), M(11, 10), M(11, 11), M(11, 12), M(11, 13), M(11, 14), M(11, 15), M(11, 16), M(11, 17), M(11, 18), M(11, 19), M(11, 20), M(11, 21), M(11, 22), M(11, 23), M(11, 24), M(11, 25), M(11, 26), M(11, 27), M(11, 28), M(11, 29), M(11, 30), M(11, 31),
-};
-#undef M
-
-enum DaysTillMonth {
- ACCUM_JAN = 0,
- ACCUM_FEB = ACCUM_JAN + 31,
- ACCUM_MAR = ACCUM_FEB + 29,
- ACCUM_APR = ACCUM_MAR + 31,
- ACCUM_MAY = ACCUM_APR + 30,
- ACCUM_JUN = ACCUM_MAY + 31,
- ACCUM_JUL = ACCUM_JUN + 30,
- ACCUM_AUG = ACCUM_JUL + 31,
- ACCUM_SEP = ACCUM_AUG + 31,
- ACCUM_OCT = ACCUM_SEP + 30,
- ACCUM_NOV = ACCUM_OCT + 31,
- ACCUM_DEC = ACCUM_NOV + 30,
-};
-
-/** Number of days to pass from the first day in the year before reaching the first of a month. */
-static const uint16 _accum_days_for_month[] = {
- ACCUM_JAN, ACCUM_FEB, ACCUM_MAR, ACCUM_APR,
- ACCUM_MAY, ACCUM_JUN, ACCUM_JUL, ACCUM_AUG,
- ACCUM_SEP, ACCUM_OCT, ACCUM_NOV, ACCUM_DEC,
-};
-
-/**
- * Converts a Date to a Year, Month & Day.
- * @param date the date to convert from
- * @param ymd the year, month and day to write to
- */
-void ConvertDateToYMD(Date date, YearMonthDay *ymd)
-{
- /* Year determination in multiple steps to account for leap
- * years. First do the large steps, then the smaller ones.
- */
-
- /* There are 97 leap years in 400 years */
- Year yr = 400 * (date / (DAYS_IN_YEAR * 400 + 97));
- int rem = date % (DAYS_IN_YEAR * 400 + 97);
- uint16 x;
-
- if (rem >= DAYS_IN_YEAR * 100 + 25) {
- /* There are 25 leap years in the first 100 years after
- * every 400th year, as every 400th year is a leap year */
- yr += 100;
- rem -= DAYS_IN_YEAR * 100 + 25;
-
- /* There are 24 leap years in the next couple of 100 years */
- yr += 100 * (rem / (DAYS_IN_YEAR * 100 + 24));
- rem = (rem % (DAYS_IN_YEAR * 100 + 24));
- }
-
- if (!IsLeapYear(yr) && rem >= DAYS_IN_YEAR * 4) {
- /* The first 4 year of the century are not always a leap year */
- yr += 4;
- rem -= DAYS_IN_YEAR * 4;
- }
-
- /* There is 1 leap year every 4 years */
- yr += 4 * (rem / (DAYS_IN_YEAR * 4 + 1));
- rem = rem % (DAYS_IN_YEAR * 4 + 1);
-
- /* The last (max 3) years to account for; the first one
- * can be, but is not necessarily a leap year */
- while (rem >= (IsLeapYear(yr) ? DAYS_IN_LEAP_YEAR : DAYS_IN_YEAR)) {
- rem -= IsLeapYear(yr) ? DAYS_IN_LEAP_YEAR : DAYS_IN_YEAR;
- yr++;
- }
-
- /* Skip the 29th of February in non-leap years */
- if (!IsLeapYear(yr) && rem >= ACCUM_MAR - 1) rem++;
-
- ymd->year = yr;
-
- x = _month_date_from_year_day[rem];
- ymd->month = x >> 5;
- ymd->day = x & 0x1F;
-}
-
-/**
- * Converts a tuple of Year, Month and Day to a Date.
- * @param year is a number between 0..MAX_YEAR
- * @param month is a number between 0..11
- * @param day is a number between 1..31
- */
-Date ConvertYMDToDate(Year year, Month month, Day day)
-{
- /* Day-offset in a leap year */
- int days = _accum_days_for_month[month] + day - 1;
-
- /* Account for the missing of the 29th of February in non-leap years */
- if (!IsLeapYear(year) && days >= ACCUM_MAR) days--;
-
- return DAYS_TILL(year) + days;
-}
-
-/** Functions used by the IncreaseDate function */
-
-extern void EnginesDailyLoop();
-extern void DisasterDailyLoop();
-extern void IndustryDailyLoop();
-
-extern void CompaniesMonthlyLoop();
-extern void EnginesMonthlyLoop();
-extern void TownsMonthlyLoop();
-extern void IndustryMonthlyLoop();
-extern void StationMonthlyLoop();
-extern void SubsidyMonthlyLoop();
-
-extern void CompaniesYearlyLoop();
-extern void VehiclesYearlyLoop();
-extern void TownsYearlyLoop();
-
-extern void ShowEndGameChart();
-
-
-/** Available settings for autosave intervals. */
-static const Month _autosave_months[] = {
- 0, ///< never
- 1, ///< every month
- 3, ///< every 3 months
- 6, ///< every 6 months
- 12, ///< every 12 months
-};
-
-/**
- * Runs various procedures that have to be done yearly
- */
-static void OnNewYear()
-{
- CompaniesYearlyLoop();
- VehiclesYearlyLoop();
- TownsYearlyLoop();
- InvalidateWindowClassesData(WC_BUILD_STATION);
- if (_network_server) NetworkServerYearlyLoop();
-
- if (_cur_year == _settings_client.gui.semaphore_build_before) ResetSignalVariant();
-
- /* check if we reached end of the game (end of ending year); 0 = never */
- if (_cur_year == _settings_game.game_creation.ending_year + 1 && _settings_game.game_creation.ending_year != 0) {
- ShowEndGameChart();
- }
-
- /* check if we reached the maximum year, decrement dates by a year */
- if (_cur_year == MAX_YEAR + 1) {
- int days_this_year;
-
- _cur_year--;
- days_this_year = IsLeapYear(_cur_year) ? DAYS_IN_LEAP_YEAR : DAYS_IN_YEAR;
- _date -= days_this_year;
- for (Vehicle *v : Vehicle::Iterate()) v->ShiftDates(-days_this_year);
- for (LinkGraph *lg : LinkGraph::Iterate()) lg->ShiftDates(-days_this_year);
-
- /* Because the _date wraps here, and text-messages expire by game-days, we have to clean out
- * all of them if the date is set back, else those messages will hang for ever */
- NetworkInitChatMessage();
- }
-
- if (_settings_client.gui.auto_euro) CheckSwitchToEuro();
-}
-
-/**
- * Runs various procedures that have to be done monthly
- */
-static void OnNewMonth()
-{
- if (_settings_client.gui.autosave != 0 && (_cur_month % _autosave_months[_settings_client.gui.autosave]) == 0) {
- _do_autosave = true;
- SetWindowDirty(WC_STATUS_BAR, 0);
- }
-
- SetWindowClassesDirty(WC_CHEATS);
- CompaniesMonthlyLoop();
- EnginesMonthlyLoop();
- TownsMonthlyLoop();
- IndustryMonthlyLoop();
- SubsidyMonthlyLoop();
- StationMonthlyLoop();
- if (_network_server) NetworkServerMonthlyLoop();
-}
-
-/**
- * Runs various procedures that have to be done daily
- */
-static void OnNewDay()
-{
- if (!_newgrf_profilers.empty() && _newgrf_profile_end_date <= _date) {
- NewGRFProfiler::FinishAll();
- }
-
- if (_network_server) NetworkServerDailyLoop();
-
- DisasterDailyLoop();
- IndustryDailyLoop();
-
- SetWindowWidgetDirty(WC_STATUS_BAR, 0, WID_S_LEFT);
- EnginesDailyLoop();
-
- /* Refresh after possible snowline change */
- SetWindowClassesDirty(WC_TOWN_VIEW);
-}
-
-/**
- * Increases the tick counter, increases date and possibly calls
- * procedures that have to be called daily, monthly or yearly.
- */
-void IncreaseDate()
-{
- /* increase day, and check if a new day is there? */
- _tick_counter++;
-
- if (_game_mode == GM_MENU) return;
-
- _date_fract++;
- if (_date_fract < DAY_TICKS) return;
- _date_fract = 0;
-
- /* increase day counter */
- _date++;
-
- YearMonthDay ymd;
- ConvertDateToYMD(_date, &ymd);
-
- /* check if we entered a new month? */
- bool new_month = ymd.month != _cur_month;
-
- /* check if we entered a new year? */
- bool new_year = ymd.year != _cur_year;
-
- /* update internal variables before calling the daily/monthly/yearly loops */
- _cur_month = ymd.month;
- _cur_year = ymd.year;
-
- /* yes, call various daily loops */
- OnNewDay();
-
- /* yes, call various monthly loops */
- if (new_month) OnNewMonth();
-
- /* yes, call various yearly loops */
- if (new_year) OnNewYear();
-}
diff --git a/src/date_func.h b/src/date_func.h
deleted file mode 100644
index e8ac6a7c77..0000000000
--- a/src/date_func.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * This file is part of OpenTTD.
- * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
- * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see .
- */
-
-/** @file date_func.h Functions related to dates. */
-
-#ifndef DATE_FUNC_H
-#define DATE_FUNC_H
-
-#include "date_type.h"
-
-extern Year _cur_year;
-extern Month _cur_month;
-extern Date _date;
-extern DateFract _date_fract;
-extern uint64 _tick_counter;
-
-void SetDate(Date date, DateFract fract);
-void ConvertDateToYMD(Date date, YearMonthDay *ymd);
-Date ConvertYMDToDate(Year year, Month month, Day day);
-
-/**
- * Checks whether the given year is a leap year or not.
- * @param yr The year to check.
- * @return True if \c yr is a leap year, otherwise false.
- */
-static inline bool IsLeapYear(Year yr)
-{
- return yr % 4 == 0 && (yr % 100 != 0 || yr % 400 == 0);
-}
-
-#endif /* DATE_FUNC_H */
diff --git a/src/engine.cpp b/src/engine.cpp
index c46f7bb843..979c6a7e31 100644
--- a/src/engine.cpp
+++ b/src/engine.cpp
@@ -244,8 +244,10 @@ uint Engine::DetermineCapacity(const Vehicle *v, uint16_t *mail_capacity) const
if (!IsCargoInClass(cargo_type, CC_PASSENGERS)) {
extra_mail_cap = GetEngineProperty(this->index, PROP_AIRCRAFT_MAIL_CAPACITY, this->u.air.mail_capacity, v);
}
- if (!new_multipliers && cargo_type == CT_MAIL) return capacity + extra_mail_cap;
- default_cargo = CT_PASSENGERS; // Always use 'passengers' wrt. cargo multipliers
+ if (IsValidCargoID(GetCargoIDByLabel(CT_MAIL))) {
+ if (!new_multipliers && cargo_type == GetCargoIDByLabel(CT_MAIL)) return capacity + extra_mail_cap;
+ }
+ default_cargo = GetCargoIDByLabel(CT_PASSENGERS); // Always use 'passengers' wrt. cargo multipliers
break;
default: NOT_REACHED();
@@ -262,8 +264,8 @@ uint Engine::DetermineCapacity(const Vehicle *v, uint16_t *mail_capacity) const
uint16_t default_multiplier = new_multipliers ? 0x100 : CargoSpec::Get(default_cargo)->multiplier;
uint16_t cargo_multiplier = CargoSpec::Get(cargo_type)->multiplier;
capacity *= cargo_multiplier;
- if (extra_mail_cap > 0) {
- uint mail_multiplier = CargoSpec::Get(CT_MAIL)->multiplier;
+ if (extra_mail_cap > 0 && IsValidCargoID(GetCargoIDByLabel(CT_MAIL))) {
+ uint mail_multiplier = CargoSpec::Get(GetCargoIDByLabel(CT_MAIL))->multiplier;
capacity += (default_multiplier * extra_mail_cap * cargo_multiplier + mail_multiplier / 2) / mail_multiplier;
}
capacity = (capacity + default_multiplier / 2) / default_multiplier;
diff --git a/src/engine_gui.cpp b/src/engine_gui.cpp
index bbf5ba5626..4742e6e234 100644
--- a/src/engine_gui.cpp
+++ b/src/engine_gui.cpp
@@ -211,7 +211,7 @@ static StringID GetAircraftEngineInfoString(const Engine *e)
SetDParam(9, mail_capacity > 0 ? STR_ENGINE_PREVIEW_CAPACITY_2 : STR_ENGINE_PREVIEW_CAPACITY);
SetDParam(10, cargo);
SetDParam(11, capacity);
- SetDParam(12, CT_MAIL);
+ SetDParam(12, GetCargoIDByLabel(CT_MAIL));
SetDParam(13, mail_capacity);
return STR_ENGINE_PREVIEW_TEXT4;
diff --git a/src/engine_type.h b/src/engine_type.h
index 7716fd92e7..be4416ef7b 100644
--- a/src/engine_type.h
+++ b/src/engine_type.h
@@ -149,6 +149,7 @@ struct EngineInfo {
byte load_amount;
byte climates; ///< Climates supported by the engine.
CargoID cargo_type;
+ std::variant cargo_label;
CargoTypes refit_mask;
byte refit_cost;
byte misc_flags; ///< Miscellaneous flags. @see EngineMiscFlags
diff --git a/src/graph_gui.cpp b/src/graph_gui.cpp
index e724dd6b9c..da5ba21c53 100644
--- a/src/graph_gui.cpp
+++ b/src/graph_gui.cpp
@@ -548,7 +548,7 @@ public:
SetDParam(1, INT64_MAX);
uint y_label_width = GetStringBoundingBox(STR_GRAPH_Y_LABEL).width;
- size->width = std::max(size->width, ScaleGUITrad(5) + y_label_width + this->num_on_x_axis * (x_label_width + ScaleGUITrad(5)) + ScaleGUITrad(9));
+ size->width = std::max(size->width, ScaleGUITrad(5) + y_label_width + this->num_vert_lines * (x_label_width + ScaleGUITrad(5)) + ScaleGUITrad(9));
size->height = std::max(size->height, ScaleGUITrad(5) + (1 + MIN_GRAPH_NUM_LINES_Y * 2 + (this->draw_dates ? 3 : 1)) * GetCharacterHeight(FS_SMALL) + ScaleGUITrad(4));
size->height = std::max(size->height, size->width / 3);
}
@@ -1122,7 +1122,7 @@ struct PaymentRatesGraphWindow : BaseGraphWindow {
int i = 0;
for (const CargoSpec *cs : _sorted_standard_cargo_specs) {
this->colours[i] = cs->legend_colour;
- for (uint j = 0; j != 20; j++) {
+ for (uint j = 0; j != this->num_on_x_axis; j++) {
this->cost[i][j] = GetTransportedGoodsIncome(10, 20, j * 4 + 4, cs->Index());
}
i++;
diff --git a/src/house.h b/src/house.h
index 4831e289ac..c3308ea59b 100644
--- a/src/house.h
+++ b/src/house.h
@@ -106,6 +106,7 @@ struct HouseSpec {
byte mail_generation; ///< mail generation multiplier (tile based, as the acceptances below)
byte cargo_acceptance[HOUSE_NUM_ACCEPTS]; ///< acceptance level for the cargo slots
CargoID accepts_cargo[HOUSE_NUM_ACCEPTS]; ///< input cargo slots
+ CargoLabel accepts_cargo_label[HOUSE_NUM_ACCEPTS]; ///< input landscape cargo slots
BuildingFlags building_flags; ///< some flags that describe the house (size, stadium etc...)
HouseZones building_availability; ///< where can it be built (climates, zones)
bool enabled; ///< the house is available to build (true by default, but can be disabled by newgrf)
diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp
index 7a4fc70d42..a8752d5208 100644
--- a/src/industry_cmd.cpp
+++ b/src/industry_cmd.cpp
@@ -982,7 +982,7 @@ bool IsTileForestIndustry(TileIndex tile)
if ((GetIndustrySpec(ind->type)->life_type & INDUSTRYLIFE_ORGANIC) == 0) return false;
/* Check for wood production */
- return std::any_of(std::begin(ind->produced), std::end(ind->produced), [](const auto &p) { return IsValidCargoID(p.cargo) && CargoSpec::Get(p.cargo)->label == 'WOOD'; });
+ return std::any_of(std::begin(ind->produced), std::end(ind->produced), [](const auto &p) { return IsValidCargoID(p.cargo) && CargoSpec::Get(p.cargo)->label == CT_WOOD; });
}
static const byte _plantfarmfield_type[] = {1, 1, 1, 1, 1, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6};
@@ -1869,7 +1869,7 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type,
uint maxcargoes = (indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED) ? static_cast(i->accepted.size()) : 3;
for (uint j = 0; j < maxcargoes; j++) {
uint16_t res = GetIndustryCallback(CBID_INDUSTRY_INPUT_CARGO_TYPES, j, 0, i, type, INVALID_TILE);
- if (res == CALLBACK_FAILED || GB(res, 0, 8) == CT_INVALID) break;
+ if (res == CALLBACK_FAILED || GB(res, 0, 8) == UINT8_MAX) break;
if (indspec->grf_prop.grffile->grf_version >= 8 && res >= 0x100) {
ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_INPUT_CARGO_TYPES, res);
break;
@@ -1901,7 +1901,7 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type,
uint maxcargoes = (indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED) ? static_cast(i->produced.size()) : 2;
for (uint j = 0; j < maxcargoes; j++) {
uint16_t res = GetIndustryCallback(CBID_INDUSTRY_OUTPUT_CARGO_TYPES, j, 0, i, type, INVALID_TILE);
- if (res == CALLBACK_FAILED || GB(res, 0, 8) == CT_INVALID) break;
+ if (res == CALLBACK_FAILED || GB(res, 0, 8) == UINT8_MAX) break;
if (indspec->grf_prop.grffile->grf_version >= 8 && res >= 0x100) {
ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_OUTPUT_CARGO_TYPES, res);
break;
@@ -2877,7 +2877,7 @@ static void ChangeIndustryProduction(Industry *i, bool monthly)
/* Prevent production to overflow or Oil Rig passengers to be over-"produced" */
new_prod = Clamp(new_prod, 1, 255);
- if (p.cargo == CT_PASSENGERS && !(indspec->behaviour & INDUSTRYBEH_NO_PAX_PROD_CLAMP)) {
+ if (IsValidCargoID(p.cargo) && p.cargo == GetCargoIDByLabel(CT_PASSENGERS) && !(indspec->behaviour & INDUSTRYBEH_NO_PAX_PROD_CLAMP)) {
new_prod = Clamp(new_prod, 0, 16);
}
diff --git a/src/industrytype.h b/src/industrytype.h
index 07a3d36bb7..e1fbd881e8 100644
--- a/src/industrytype.h
+++ b/src/industrytype.h
@@ -110,6 +110,7 @@ struct IndustrySpec {
IndustryType conflicting[3]; ///< Industries this industry cannot be close to
byte check_proc; ///< Index to a procedure to check for conflicting circumstances
CargoID produced_cargo[INDUSTRY_NUM_OUTPUTS];
+ std::variant produced_cargo_label[INDUSTRY_NUM_OUTPUTS];
byte production_rate[INDUSTRY_NUM_OUTPUTS];
/**
* minimum amount of cargo transported to the stations.
@@ -117,6 +118,7 @@ struct IndustrySpec {
*/
byte minimal_cargo;
CargoID accepts_cargo[INDUSTRY_NUM_INPUTS]; ///< 16 accepted cargoes.
+ std::variant accepts_cargo_label[INDUSTRY_NUM_INPUTS];
uint16_t input_cargo_multiplier[INDUSTRY_NUM_INPUTS][INDUSTRY_NUM_OUTPUTS]; ///< Input cargo multipliers (multiply amount of incoming cargo for the produced cargoes)
IndustryLifeType life_type; ///< This is also known as Industry production flag, in newgrf specs
byte climate_availability; ///< Bitmask, giving landscape enums as bit position
@@ -153,6 +155,7 @@ struct IndustrySpec {
*/
struct IndustryTileSpec {
std::array accepts_cargo; ///< Cargo accepted by this tile
+ std::array, INDUSTRY_NUM_INPUTS> accepts_cargo_label;
std::array acceptance; ///< Level of acceptance per cargo type (signed, may be negative!)
Slope slopes_refused; ///< slope pattern on which this tile cannot be built
byte anim_production; ///< Animation frame to start when goods are produced
diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt
index 0716ef3be9..1c20902723 100644
--- a/src/lang/afrikaans.txt
+++ b/src/lang/afrikaans.txt
@@ -3965,6 +3965,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :gaan altyd
STR_ORDER_DROP_SERVICE_DEPOT :Diens indien nodig
STR_ORDER_DROP_HALT_DEPOT :Stop
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Voertuig data om sprong op te baseer
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt
index 730d9b6ab5..fd8c3287de 100644
--- a/src/lang/arabic_egypt.txt
+++ b/src/lang/arabic_egypt.txt
@@ -3716,6 +3716,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :الذهاب د
STR_ORDER_DROP_SERVICE_DEPOT :الصيانة عند الحاجة
STR_ORDER_DROP_HALT_DEPOT :توقف
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}بيانات العربة لتعريف التجاوز الى
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/basque.txt b/src/lang/basque.txt
index 3ac1428f79..e7b7590b6a 100644
--- a/src/lang/basque.txt
+++ b/src/lang/basque.txt
@@ -3734,6 +3734,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Joan beti
STR_ORDER_DROP_SERVICE_DEPOT :Beharrezkoa bada mantenimendua egin
STR_ORDER_DROP_HALT_DEPOT :Gelditu
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Ibilgailuaren xehetasunak jauzia oinarritzeko
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt
index 1a35371bd7..e6ab224cd3 100644
--- a/src/lang/belarusian.txt
+++ b/src/lang/belarusian.txt
@@ -4325,6 +4325,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ісьці за
STR_ORDER_DROP_SERVICE_DEPOT :Абслужыць, калі неабходна
STR_ORDER_DROP_HALT_DEPOT :Стоп
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Парамэтр транспарту для параўнаньня
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt
index 4af3923ef7..bc4e90b0ec 100644
--- a/src/lang/brazilian_portuguese.txt
+++ b/src/lang/brazilian_portuguese.txt
@@ -26,77 +26,77 @@ STR_JUST_NOTHING :Nada
# Cargo related strings
# Plural cargo name
STR_CARGO_PLURAL_NOTHING :
-STR_CARGO_PLURAL_PASSENGERS :{G=m}Passageiros
-STR_CARGO_PLURAL_COAL :{G=m}Carvão
-STR_CARGO_PLURAL_MAIL :{G=f}Correspondências
-STR_CARGO_PLURAL_OIL :{G=m}Petróleo
-STR_CARGO_PLURAL_LIVESTOCK :{G=m}Gado
-STR_CARGO_PLURAL_GOODS :{G=m}Bens
-STR_CARGO_PLURAL_GRAIN :{G=m}Cereais
-STR_CARGO_PLURAL_WOOD :{G=f}Madeira
-STR_CARGO_PLURAL_IRON_ORE :{G=m}Minério de Ferro
-STR_CARGO_PLURAL_STEEL :{G=m}Aço
-STR_CARGO_PLURAL_VALUABLES :{G=f}Objetos de Valor
-STR_CARGO_PLURAL_COPPER_ORE :{G=m}Minério de Cobre
-STR_CARGO_PLURAL_MAIZE :{G=m}Milho
-STR_CARGO_PLURAL_FRUIT :{G=f}Fruta
-STR_CARGO_PLURAL_DIAMONDS :{G=m}Diamantes
-STR_CARGO_PLURAL_FOOD :{G=m}Alimento
-STR_CARGO_PLURAL_PAPER :{G=m}Papel
-STR_CARGO_PLURAL_GOLD :{G=m}Ouro
-STR_CARGO_PLURAL_WATER :{G=f}Água
-STR_CARGO_PLURAL_WHEAT :{G=m}Trigo
-STR_CARGO_PLURAL_RUBBER :{G=f}Borracha
-STR_CARGO_PLURAL_SUGAR :{G=m}Açúcar
-STR_CARGO_PLURAL_TOYS :{G=m}Brinquedos
-STR_CARGO_PLURAL_SWEETS :{G=m}Doces
-STR_CARGO_PLURAL_COLA :{G=f}Cola
-STR_CARGO_PLURAL_CANDYFLOSS :{G=m}Algodão Doce
-STR_CARGO_PLURAL_BUBBLES :{G=f}Bolhas
-STR_CARGO_PLURAL_TOFFEE :{G=m}Caramelo
-STR_CARGO_PLURAL_BATTERIES :{G=f}Pilhas
-STR_CARGO_PLURAL_PLASTIC :{G=m}Plástico
-STR_CARGO_PLURAL_FIZZY_DRINKS :{G=m}Refrigerantes
+STR_CARGO_PLURAL_PASSENGERS :Passageiros
+STR_CARGO_PLURAL_COAL :Carvão
+STR_CARGO_PLURAL_MAIL :Correspondência
+STR_CARGO_PLURAL_OIL :Petróleo
+STR_CARGO_PLURAL_LIVESTOCK :Gado
+STR_CARGO_PLURAL_GOODS :Bens
+STR_CARGO_PLURAL_GRAIN :Grãos
+STR_CARGO_PLURAL_WOOD :Madeira
+STR_CARGO_PLURAL_IRON_ORE :Minério de Ferro
+STR_CARGO_PLURAL_STEEL :Aço
+STR_CARGO_PLURAL_VALUABLES :Objetos de Valor
+STR_CARGO_PLURAL_COPPER_ORE :Minério de Cobre
+STR_CARGO_PLURAL_MAIZE :Milho
+STR_CARGO_PLURAL_FRUIT :Fruta
+STR_CARGO_PLURAL_DIAMONDS :Diamantes
+STR_CARGO_PLURAL_FOOD :Alimentos
+STR_CARGO_PLURAL_PAPER :Papel
+STR_CARGO_PLURAL_GOLD :Ouro
+STR_CARGO_PLURAL_WATER :Água
+STR_CARGO_PLURAL_WHEAT :Trigo
+STR_CARGO_PLURAL_RUBBER :Borracha
+STR_CARGO_PLURAL_SUGAR :Açúcar
+STR_CARGO_PLURAL_TOYS :Brinquedos
+STR_CARGO_PLURAL_SWEETS :Doces
+STR_CARGO_PLURAL_COLA :Bebida de cola
+STR_CARGO_PLURAL_CANDYFLOSS :Algodão Doce
+STR_CARGO_PLURAL_BUBBLES :Bolhas
+STR_CARGO_PLURAL_TOFFEE :Caramelo
+STR_CARGO_PLURAL_BATTERIES :Pilhas
+STR_CARGO_PLURAL_PLASTIC :Plástico
+STR_CARGO_PLURAL_FIZZY_DRINKS :Refrigerantes
# Singular cargo name
STR_CARGO_SINGULAR_NOTHING :
-STR_CARGO_SINGULAR_PASSENGER :{G=m}Passageiro
-STR_CARGO_SINGULAR_COAL :{G=m}Carvão
-STR_CARGO_SINGULAR_MAIL :{G=f}Correspondência
-STR_CARGO_SINGULAR_OIL :{G=m}Petróleo
-STR_CARGO_SINGULAR_LIVESTOCK :{G=m}Gado
-STR_CARGO_SINGULAR_GOODS :{G=m}Bens
-STR_CARGO_SINGULAR_GRAIN :{G=m}Cereais
-STR_CARGO_SINGULAR_WOOD :{G=f}Madeira
-STR_CARGO_SINGULAR_IRON_ORE :{G=m}Minério de Ferro
-STR_CARGO_SINGULAR_STEEL :{G=m}Aço
-STR_CARGO_SINGULAR_VALUABLES :{G=m}Objetos de Valor
-STR_CARGO_SINGULAR_COPPER_ORE :{G=m}Minério de Cobre
-STR_CARGO_SINGULAR_MAIZE :{G=m}Milho
-STR_CARGO_SINGULAR_FRUIT :{G=f}Fruta
-STR_CARGO_SINGULAR_DIAMOND :{G=m}Diamante
-STR_CARGO_SINGULAR_FOOD :{G=f}Alimento
-STR_CARGO_SINGULAR_PAPER :{G=m}Papel
-STR_CARGO_SINGULAR_GOLD :{G=m}Ouro
-STR_CARGO_SINGULAR_WATER :{G=f}Água
-STR_CARGO_SINGULAR_WHEAT :{G=m}Trigo
-STR_CARGO_SINGULAR_RUBBER :{G=f}Borracha
-STR_CARGO_SINGULAR_SUGAR :{G=m}Açúcar
-STR_CARGO_SINGULAR_TOY :{G=m}Brinquedo
-STR_CARGO_SINGULAR_SWEETS :{G=m}Doce
-STR_CARGO_SINGULAR_COLA :{G=m}Cola
-STR_CARGO_SINGULAR_CANDYFLOSS :{G=m}Algodão doce
-STR_CARGO_SINGULAR_BUBBLE :{G=f}Bolha
-STR_CARGO_SINGULAR_TOFFEE :{G=m}Caramelo
-STR_CARGO_SINGULAR_BATTERY :{G=f}Pilha
-STR_CARGO_SINGULAR_PLASTIC :{G=m}Plástico
-STR_CARGO_SINGULAR_FIZZY_DRINK :{G=m}Refrigerante
+STR_CARGO_SINGULAR_PASSENGER :Passageiro
+STR_CARGO_SINGULAR_COAL :Carvão
+STR_CARGO_SINGULAR_MAIL :Correspondência
+STR_CARGO_SINGULAR_OIL :Petróleo
+STR_CARGO_SINGULAR_LIVESTOCK :Gado
+STR_CARGO_SINGULAR_GOODS :Bens
+STR_CARGO_SINGULAR_GRAIN :Grãos
+STR_CARGO_SINGULAR_WOOD :Madeira
+STR_CARGO_SINGULAR_IRON_ORE :Minério de Ferro
+STR_CARGO_SINGULAR_STEEL :Aço
+STR_CARGO_SINGULAR_VALUABLES :Objeto de Valor
+STR_CARGO_SINGULAR_COPPER_ORE :Minério de Cobre
+STR_CARGO_SINGULAR_MAIZE :Milho
+STR_CARGO_SINGULAR_FRUIT :Fruta
+STR_CARGO_SINGULAR_DIAMOND :Diamante
+STR_CARGO_SINGULAR_FOOD :Alimento
+STR_CARGO_SINGULAR_PAPER :Papel
+STR_CARGO_SINGULAR_GOLD :Ouro
+STR_CARGO_SINGULAR_WATER :Água
+STR_CARGO_SINGULAR_WHEAT :Trigo
+STR_CARGO_SINGULAR_RUBBER :Borracha
+STR_CARGO_SINGULAR_SUGAR :Açúcar
+STR_CARGO_SINGULAR_TOY :Brinquedo
+STR_CARGO_SINGULAR_SWEETS :Doce
+STR_CARGO_SINGULAR_COLA :Bebida de cola
+STR_CARGO_SINGULAR_CANDYFLOSS :Algodão Doce
+STR_CARGO_SINGULAR_BUBBLE :Bolha
+STR_CARGO_SINGULAR_TOFFEE :Caramelo
+STR_CARGO_SINGULAR_BATTERY :Bateria
+STR_CARGO_SINGULAR_PLASTIC :Plástico
+STR_CARGO_SINGULAR_FIZZY_DRINK :Refrigerante
# Quantity of cargo
STR_QUANTITY_NOTHING :
STR_QUANTITY_PASSENGERS :{COMMA}{NBSP}passageiro{P "" s}
STR_QUANTITY_COAL :{WEIGHT_LONG} de carvão
-STR_QUANTITY_MAIL :{COMMA}{NBSP}bolsa{P "" s} de correspondência
+STR_QUANTITY_MAIL :{COMMA}{NBSP}malote{P "" s} de correspondência
STR_QUANTITY_OIL :{VOLUME_LONG} de petróleo
STR_QUANTITY_LIVESTOCK :{COMMA}{NBSP}cabeça{P "" s} de gado
STR_QUANTITY_GOODS :{COMMA}{NBSP}caixa{P "" s} de bens
@@ -104,21 +104,21 @@ STR_QUANTITY_GRAIN :{WEIGHT_LONG} d
STR_QUANTITY_WOOD :{WEIGHT_LONG} de madeira
STR_QUANTITY_IRON_ORE :{WEIGHT_LONG} de minério de ferro
STR_QUANTITY_STEEL :{WEIGHT_LONG} de aço
-STR_QUANTITY_VALUABLES :{COMMA}{NBSP}bolsa{P "" s} de objetos de valor
+STR_QUANTITY_VALUABLES :{COMMA}{NBSP}pacote{P "" s} de objetos de valor
STR_QUANTITY_COPPER_ORE :{WEIGHT_LONG} de minério de cobre
STR_QUANTITY_MAIZE :{WEIGHT_LONG} de milho
STR_QUANTITY_FRUIT :{WEIGHT_LONG} de fruta
-STR_QUANTITY_DIAMONDS :{COMMA}{NBSP}bolsa{P "" s} de diamantes
+STR_QUANTITY_DIAMONDS :{COMMA}{NBSP}saco{P "" s} de diamantes
STR_QUANTITY_FOOD :{WEIGHT_LONG} de alimentos
STR_QUANTITY_PAPER :{WEIGHT_LONG} de papel
-STR_QUANTITY_GOLD :{COMMA}{NBSP}bolsa{P "" s} de ouro
+STR_QUANTITY_GOLD :{COMMA}{NBSP}saco{P "" s} de ouro
STR_QUANTITY_WATER :{VOLUME_LONG} de água
STR_QUANTITY_WHEAT :{WEIGHT_LONG} de trigo
STR_QUANTITY_RUBBER :{VOLUME_LONG} de borracha
STR_QUANTITY_SUGAR :{WEIGHT_LONG} de açúcar
STR_QUANTITY_TOYS :{COMMA}{NBSP}brinquedo{P "" s}
-STR_QUANTITY_SWEETS :{COMMA}{NBSP}pacote{P "" s} de doces
-STR_QUANTITY_COLA :{VOLUME_LONG} de cola
+STR_QUANTITY_SWEETS :{COMMA}{NBSP}saco{P "" s} de doces
+STR_QUANTITY_COLA :{VOLUME_LONG} de bebida de cola
STR_QUANTITY_CANDYFLOSS :{WEIGHT_LONG} de algodão doce
STR_QUANTITY_BUBBLES :{COMMA} bolha{P "" s}
STR_QUANTITY_TOFFEE :{WEIGHT_LONG} de caramelo
@@ -165,7 +165,7 @@ STR_ABBREV_ALL :TUDO
# 'Mode' of transport for cargoes
STR_PASSENGERS :{COMMA}{NBSP}passageiro{P "" s}
-STR_BAGS :{COMMA}{NBSP}bolsa{P "" s}
+STR_BAGS :{COMMA}{NBSP}saco{P "" s}
STR_TONS :{COMMA}{NBSP}tonelada{P "" s}
STR_LITERS :{COMMA}{NBSP}litro{P "" s}
STR_ITEMS :{COMMA}{NBSP}ite{P m ns}
@@ -279,7 +279,7 @@ STR_TOOLTIP_SORT_CRITERIA :{BLACK}Selecion
STR_TOOLTIP_FILTER_CRITERIA :{BLACK}Selecione critério para filtração
STR_BUTTON_SORT_BY :{BLACK}Classificar por
STR_BUTTON_CATCHMENT :{BLACK}Cobertura
-STR_TOOLTIP_CATCHMENT :{BLACK}Alternar a visão da área de cobertura
+STR_TOOLTIP_CATCHMENT :{BLACK}Ativar a exibição da área de cobertura
STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Fechar janela
STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Título da janela - arraste isto para mover a janela
@@ -288,7 +288,7 @@ STR_TOOLTIP_DEBUG :{BLACK}Mostrar
STR_TOOLTIP_DEFSIZE :{BLACK}Redimensiona a janela ao tamanho padrão. Ctrl+Clique para salvar o tamanho atual como padrão
STR_TOOLTIP_STICKY :{BLACK}Marcar esta janela como infechável pela tecla 'Fechar Todas as Janelas'. Ctrl+Clique torna essa opção padrão
STR_TOOLTIP_RESIZE :{BLACK}Clique e arraste para redimensionar esta janela
-STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Alternar entre janela de tamanho grande/pequena
+STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Ativar janela de tamanho grande/pequena
STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST :{BLACK}Barra de rolagem - rola a lista acima/abaixo
STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Barra de rolagem - rola a lista para esquerda/direita
STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Demolir edifícios etc. em um quadrado do terreno. Ctrl+Clique+Arrastar seleciona a área diagonalmente. Pressionar Shift mostra o custo estimado
@@ -385,21 +385,21 @@ STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Pausar j
STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}Acelerar o jogo
STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Opções e definições
STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}Salvar, carregar ou abandonar o jogo, sair do jogo
-STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Exibir mapa, visualizador extra, fluxo de cargas ou lista de sinais
+STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Abrir mapa, nova visualização, fluxo de cargas ou lista de sinais
STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}Mostrar lista de localidades
-STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Exibir lista de subsídios
-STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Exibir lista de estações da companhia
-STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Mostrar informações financeiras da empresa
-STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Exibir informações gerais da empresa
+STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Abrir lista de subsídios
+STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Abrir lista de estações da empresa
+STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Abrir informações financeiras da empresa
+STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Abrir informações gerais da empresa
STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Mostrar livro de histórias
STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Mostrar lista de objetivos
-STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Exibir gráficos da empresa e taxas de pagamento de carga
-STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Exibir tabela de classificação das empresas
+STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Abrir gráficos da empresa e taxas de pagamento de carga
+STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Abrir tabela da liga da empresa
STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Abrir o catálogo de indústria, a cadeia industrial ou financiar a construção de uma nova indústria
-STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Mostrar a lista de trens da companhia. Ctrl+Clique para mostrar ou ocultar os grupos, oposto da configuração escolhida
-STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Exibir lista de veículos rodoviários da empresa. Ctrl+Clique alterna abrir a lista de grupos/veículos
-STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Mostrar lista de navios da empresa. Ctrl+Clique alterna entre abrir a lista de grupos/veículos
-STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Mostrar lista de aeronaves da empresa. Ctrl+Clique alterna entre abrir a lista de grupos/veículos
+STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Abrir a lista de trens da empresa. Ctrl+Clique para mostrar ou ocultar os grupos, oposto da configuração escolhida
+STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Abrir lista de veículos rodoviários da empresa. Ctrl+Clique para mostrar ou ocultar os grupos de veículos, oposto da configuração escolhida
+STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Abrir lista de embarcações da empresa. Ctrl+Clique para mostrar ou ocultar os grupos de veículos, oposto da configuração escolhida
+STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Abrir lista de aeronaves da empresa. Ctrl+Clique para mostrar ou ocultar os grupos de veículos, oposto da configuração escolhida
STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Ampliar a visão
STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Reduzir a visão
STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construir linha ferroviária
@@ -483,11 +483,11 @@ STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH :Gráfico de luc
STR_GRAPH_MENU_INCOME_GRAPH :Gráfico de renda
STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH :Gráfico de carga entregue
STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH :Gráfico de histórico de desempenho
-STR_GRAPH_MENU_COMPANY_VALUE_GRAPH :Gráfico de avaliação da empresa
+STR_GRAPH_MENU_COMPANY_VALUE_GRAPH :Gráfico de valor da empresa
STR_GRAPH_MENU_CARGO_PAYMENT_RATES :Taxa de pagamento de carga
# Company league menu
-STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE :Tabela da liga de empresa
+STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE :Tabela de categoria das empresas
STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING :Avaliação detalhada de performance
STR_GRAPH_MENU_HIGHSCORE :Tabela de Pontuações
@@ -528,15 +528,15 @@ STR_NEWS_MENU_DELETE_ALL_MESSAGES :Apagar todas as
# About menu
STR_ABOUT_MENU_LAND_BLOCK_INFO :Informações do terreno
STR_ABOUT_MENU_HELP :Ajuda & manuais
-STR_ABOUT_MENU_TOGGLE_CONSOLE :Alternar console
+STR_ABOUT_MENU_TOGGLE_CONSOLE :Mostrar console
STR_ABOUT_MENU_AI_DEBUG :Depurar IA/Script do jogo
STR_ABOUT_MENU_SCREENSHOT :Captura de tela
-STR_ABOUT_MENU_SHOW_FRAMERATE :Exibir taxa de quadros
+STR_ABOUT_MENU_SHOW_FRAMERATE :Mostrar taxa de quadros
STR_ABOUT_MENU_ABOUT_OPENTTD :Sobre 'OpenTTD'
STR_ABOUT_MENU_SPRITE_ALIGNER :Alinhador de "sprites"
-STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Alternar caixas delimitadoras
-STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Alterna a colorização dos blocos sujos
-STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES :Alterna o contorno do elemento
+STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Mostrar caixas delimitadoras
+STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Ativar a colorização dos blocos sujos
+STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES :Mostrar os contornos do elemento
###length 31
STR_DAY_NUMBER_1ST :1º
@@ -601,7 +601,7 @@ STR_MONTH_DEC :Dezembro
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}Chave
-STR_GRAPH_KEY_TOOLTIP :{BLACK}Exibir chave aos gráficos
+STR_GRAPH_KEY_TOOLTIP :{BLACK}Mostrar chave dos gráficos
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM}
STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING}
@@ -610,30 +610,30 @@ STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COM
STR_GRAPH_OPERATING_PROFIT_CAPTION :{WHITE}Gráfico de Lucro Operacional
STR_GRAPH_INCOME_CAPTION :{WHITE}Gráfico de Renda
STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Unidades de carga entregues
-STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Avaliações de desempenho da empresa (avaliação máxima=1000)
+STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Classificações do desempenho da empresa (máximo=1000)
STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Gráfico de Valor da Empresa
STR_GRAPH_LAST_72_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}Últimos 72 minutos
STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Taxa de Pagamento de Carga
-STR_GRAPH_CARGO_PAYMENT_RATES_DAYS :{TINY_FONT}{BLACK}Dias em deslocamento
-STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS :{TINY_FONT}{BLACK}Segundos em deslocamento
+STR_GRAPH_CARGO_PAYMENT_RATES_DAYS :{TINY_FONT}{BLACK}Dias em trânsito
+STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS :{TINY_FONT}{BLACK}Segundos em trânsito
STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Pagamento por entregar 10 unidades (ou 10 000 litros) de carga numa distância de 20 quadrados
STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Habilitar tudo
STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Desabilitar tudo
STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Exibir todas as cargas no gráfico de taxas de pagamento de cargas
STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Não exibir cargas no gráfico de taxas de pagamento de cargas
-STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Alternar gráfico para o tipo de carga em ligado/desligado
+STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Mostrar/ocultar gráfico para o tipo de carga
STR_GRAPH_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLACK}{STRING}
-STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Exibir avaliações de performance detalhadas
+STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Mostrar avaliações detalhadas de desempneho
# Graph key window
STR_GRAPH_KEY_CAPTION :{WHITE}Chave para gráficos da empresa
-STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Clique aqui para alternar a entrada da empresa no gráfico
+STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Clique aqui para mostrar/ocultar empresa no gráfico
# Company league window
-STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Tabela da Liga das Empresas
+STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Tabela de Categoria das Empresas
STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPANY} {BLACK}{COMPANY_NUM} '{STRING}'
STR_COMPANY_LEAGUE_COMPANY_RANK :{YELLOW}#{NUM}
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER :Engenheiro
@@ -710,8 +710,8 @@ STR_MUSIC_TOOLTIP_SELECT_NEW_STYLE_MUSIC :{BLACK}Selecion
STR_MUSIC_TOOLTIP_SELECT_EZY_STREET_STYLE :{BLACK}Selecionar programa 'Ezy Street'
STR_MUSIC_TOOLTIP_SELECT_CUSTOM_1_USER_DEFINED :{BLACK}Selecionar programa 'Personalizado 1' (definido pelo usuário)
STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Selecionar programa 'Personalizado 2' (definido pelo usuário)
-STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Alternar programa misturado em ligado/desligado
-STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Exibir janela de seleção de faixas de música
+STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Ligar/Desligar reprodução aleatória
+STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Mostrar janela de seleção de faixas de música
# Playlist window
STR_PLAYLIST_MUSIC_SELECTION_SETNAME :{WHITE}Programação Musical - '{STRING}'
@@ -752,16 +752,16 @@ STR_SMALLMAP_TYPE_ROUTES :Rotas
STR_SMALLMAP_TYPE_VEGETATION :Vegetação
STR_SMALLMAP_TYPE_OWNERS :Proprietários
-STR_SMALLMAP_TOOLTIP_SHOW_LAND_CONTOURS_ON_MAP :{BLACK}Exibir contornos do terreno no mapa
-STR_SMALLMAP_TOOLTIP_SHOW_VEHICLES_ON_MAP :{BLACK}Exibir veículos no mapa
-STR_SMALLMAP_TOOLTIP_SHOW_INDUSTRIES_ON_MAP :{BLACK}Exibir indústrias no mapa
-STR_SMALLMAP_TOOLTIP_SHOW_LINK_STATS_ON_MAP :{BLACK}Exibir fluxo de carga no mapa
-STR_SMALLMAP_TOOLTIP_SHOW_TRANSPORT_ROUTES_ON :{BLACK}Exibir rotas de transporte no mapa
-STR_SMALLMAP_TOOLTIP_SHOW_VEGETATION_ON_MAP :{BLACK}Exibir vegetação no mapa
-STR_SMALLMAP_TOOLTIP_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Exibir proprietários de terrenos no mapa
-STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Clique em um tipo de indústria para alternar sua exibição. Ctrl+Clique desabilita todos os tipos exceto a selecionada. Ctrl+Clique nela novamente para habilitar todos os tipos de indústrias
-STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Clique em uma compania para alternar a exibição de suas propriedades. Ctrl+Clique desabilita todas as companias exceto a selecionada. Ctrl+Clique nela novamente para habilitar todas as companias
-STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Clique numa carga para alternar a exibição de sua propriedade. Ctrl+Clique desativa todas as cargas exceto a selecionada. Ctrl+Clique novamente para exibir todas
+STR_SMALLMAP_TOOLTIP_SHOW_LAND_CONTOURS_ON_MAP :{BLACK}Mostrar contornos do terreno no mapa
+STR_SMALLMAP_TOOLTIP_SHOW_VEHICLES_ON_MAP :{BLACK}Mostrar veículos no mapa
+STR_SMALLMAP_TOOLTIP_SHOW_INDUSTRIES_ON_MAP :{BLACK}Mostrar indústrias no mapa
+STR_SMALLMAP_TOOLTIP_SHOW_LINK_STATS_ON_MAP :{BLACK}Mostrar fluxo de carga no mapa
+STR_SMALLMAP_TOOLTIP_SHOW_TRANSPORT_ROUTES_ON :{BLACK}Mostrar rotas de transporte no mapa
+STR_SMALLMAP_TOOLTIP_SHOW_VEGETATION_ON_MAP :{BLACK}Mostrar vegetação no mapa
+STR_SMALLMAP_TOOLTIP_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Mostrar proprietários do terreno no mapa
+STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Clique em um tipo de indústria para exibir/ocultar a indústria. Ctrl+Clique desabilita todos os tipos exceto a selecionada. Ctrl+Clique nela novamente para habilitar todos os tipos de indústrias
+STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Clique em uma empresa para exibir/ocultar as suas propriedades. Ctrl+Clique desabilita todas as companias exceto a selecionada. Ctrl+Clique nela novamente para habilitar todas as empresas
+STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Clique em uma carga para exibir/ocultar as suas propriedades. Ctrl+Clique desativa todas as cargas, exceto a selecionada. Ctrl+Clique novamente para ativar todas as cargas
STR_SMALLMAP_LEGENDA_ROADS :{TINY_FONT}{BLACK}Rodovias
STR_SMALLMAP_LEGENDA_RAILROADS :{TINY_FONT}{BLACK}Ferrovias
@@ -804,14 +804,14 @@ STR_SMALLMAP_ENABLE_ALL :{BLACK}Habilita
STR_SMALLMAP_SHOW_HEIGHT :{BLACK}Mostrar altitude
STR_SMALLMAP_TOOLTIP_DISABLE_ALL_INDUSTRIES :{BLACK}Não exibir indústrias no mapa
STR_SMALLMAP_TOOLTIP_ENABLE_ALL_INDUSTRIES :{BLACK}Exibir todas as indústrias no mapa
-STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Alternar a exibição de mapa topográfico
-STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}Não exibir propriedade da empresa no mapa
+STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Ativar a exibição de mapa topográfico
+STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}Não exibir propriedades da empresa no mapa
STR_SMALLMAP_TOOLTIP_ENABLE_ALL_COMPANIES :{BLACK}Exibir todas as propriedades da empresa no mapa
-STR_SMALLMAP_TOOLTIP_DISABLE_ALL_CARGOS :{BLACK}Exibe nenhuma carga no mapa
-STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Exibe todas as cargas no mapa
+STR_SMALLMAP_TOOLTIP_DISABLE_ALL_CARGOS :{BLACK}Não mostrar cargas no mapa
+STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Exibir todas as cargas no mapa
# Status bar messages
-STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Exibir a última mensagem ou notícia
+STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Mostrar a última mensagem ou notícia
STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - -
STR_STATUSBAR_PAUSED :{YELLOW}* * PAUSADO * *
STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * PAUSADO (aguardando atualização do gráfico de links) * *
@@ -908,7 +908,7 @@ STR_NEWS_VEHICLE_UNPROFITABLE_YEAR :{WHITE}{VEHICLE
STR_NEWS_VEHICLE_UNPROFITABLE_PERIOD :{WHITE}{VEHICLE}'s rendeu no último período {CURRENCY_LONG}
STR_NEWS_AIRCRAFT_DEST_TOO_FAR :{WHITE}{VEHICLE} não pode chegar ao próximo destino porque está fora de alcance
-STR_NEWS_ORDER_REFIT_FAILED :{WHITE}{VEHICLE} parou porque uma readaptação ordenada falhou
+STR_NEWS_ORDER_REFIT_FAILED :{WHITE}{VEHICLE} parou porque uma ordem de adaptação falhou
STR_NEWS_VEHICLE_AUTORENEW_FAILED :{WHITE}Autorenovação falhou para {VEHICLE}{}{STRING}
STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLACK}Nov{G o a} {STRING} já está disponível!
@@ -1015,7 +1015,7 @@ STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit Malaio
STR_GAME_OPTIONS_CURRENCY_LVL :Lats da Letônia
STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Salvar automaticamente
-STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Selecionar o intervalo entre jogos salvos automaticos
+STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Selecionar o intervalo entre jogos salvos automaticamente
# Autosave dropdown
###length 5
@@ -1127,11 +1127,11 @@ STR_CURRENCY_SET_CUSTOM_CURRENCY_PREFIX_TOOLTIP :{BLACK}Definir
STR_CURRENCY_SUFFIX :{LTBLUE}Sufixo: {ORANGE}{STRING}
STR_CURRENCY_SET_CUSTOM_CURRENCY_SUFFIX_TOOLTIP :{BLACK}Definir a sequência de sufixo por a sua moeda
-STR_CURRENCY_SWITCH_TO_EURO :{LTBLUE}Alternar para Euro: {ORANGE}{NUM}
-STR_CURRENCY_SWITCH_TO_EURO_NEVER :{LTBLUE}Alternar para Euro: {ORANGE}nunca
-STR_CURRENCY_SET_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Definir o ano para alternar para Euro
-STR_CURRENCY_DECREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Alternar para Euro anteriormente
-STR_CURRENCY_INCREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Alternar para euro posteriormente
+STR_CURRENCY_SWITCH_TO_EURO :{LTBLUE}Mudar para Euro: {ORANGE}{NUM}
+STR_CURRENCY_SWITCH_TO_EURO_NEVER :{LTBLUE}Mudar para Euro: {ORANGE}nunca
+STR_CURRENCY_SET_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Definir o ano para mudar para Euro
+STR_CURRENCY_DECREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Mudar para Euro mais cedo
+STR_CURRENCY_INCREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Mudar para Euro mais tarde
STR_CURRENCY_PREVIEW :{LTBLUE}Previsão: {ORANGE}{CURRENCY_LONG}
STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Libras (£) na sua moeda
@@ -1222,14 +1222,14 @@ STR_CONFIG_SETTING_TYPE :{LTBLUE}Tipo de
STR_CONFIG_SETTING_TYPE_CLIENT :Config. do cliente (não é guardado em savegames; afeta todos os jogos)
STR_CONFIG_SETTING_TYPE_GAME_MENU :Config. do jogo (guardado no savegame; afeta apenas jogos novos)
STR_CONFIG_SETTING_TYPE_GAME_INGAME :Config. do jogo (guardado no savegame; afeta apenas jogo atual)
-STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Config. da companhia (guardado no savegame; afeta apenas novos jogos)
-STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Config. da companhia (guardado no savegame; afeta apenas a comp. atual)
+STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Configurações da empresa (guardado no savegame; afeta apenas novos jogos)
+STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Configurações da empresa (guardado no savegame; afeta apenas a empresa atual)
STR_CONFIG_SETTING_RESET_ALL_CONFIRMATION_DIALOG_CAPTION :{WHITE}Cuidado!
STR_CONFIG_SETTING_RESET_ALL_CONFIRMATION_DIALOG_TEXT :{WHITE}Essa ação irá restaurar todas as configurações para os valores padrão.{}Tem certeza que deseja continuar?
STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK}Categoria:
STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}Tipo:
-STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}Restringe a lista abaixo a mostrar apenas filtros pré-definidos
+STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}Restringe a lista abaixo usando filtros pré-definidos
STR_CONFIG_SETTING_RESTRICT_BASIC :Básico (apenas configs. importantes)
STR_CONFIG_SETTING_RESTRICT_ADVANCED :Avançado (maior parte das configs.)
STR_CONFIG_SETTING_RESTRICT_ALL :Expert (mostra todas as configs. inclusive as estranhas)
@@ -1241,10 +1241,10 @@ STR_CONFIG_SETTING_TYPE_DROPDOWN_ALL :Todos os tipos
STR_CONFIG_SETTING_TYPE_DROPDOWN_CLIENT :Configs. do cliente (não é guardado no savegame; afeta todos os jogos)
STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_MENU :Configs. do jogo (guardado no savegame; afeta apenas novos jogos)
STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME :Configs. do jogo (guardado no savegame; afeta apenas o jogo atual)
-STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Configs. da companhia (guardado no savegame; afeta apenas novos jogos)
-STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Configs. de companhia (guardado no savegame; afeta apenas a companhia atual)
+STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Configurações da empresa (guardado no savegame; afeta apenas novos jogos)
+STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Configurações da empresa (guardado no savegame; afeta apenas a empresa atual)
-STR_CONFIG_SETTINGS_NONE :{G=m}{WHITE}- Nenhum -
+STR_CONFIG_SETTINGS_NONE :{WHITE}- Nenhum -
###length 3
STR_CONFIG_SETTING_CATEGORY_HIDES :{BLACK}Mostrar todos resultados por configuração{}{SILVER}Categoria {BLACK}até {WHITE}{STRING}
STR_CONFIG_SETTING_TYPE_HIDES :{BLACK}Mostrar todos resultados por configuração{}{SILVER}Tipo {BLACK}até {WHITE}Todas configurações de tipos
@@ -1288,7 +1288,7 @@ STR_CONFIG_SETTING_RUNNING_COSTS :Custos de Opera
STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT :Define o nível e custos de manutenção de veículos e infraestrutura
STR_CONFIG_SETTING_CONSTRUCTION_SPEED :Velocidade de construção: {STRING}
-STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :Limita ações de construção para IA's
+STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :Limitar a quantidade de ações de construção para IAs
STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :Quebra de veículos: {STRING}
STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :Controla o quanto veículos mal conservados podem quebrar
@@ -1306,7 +1306,7 @@ STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR
STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Sem subsídios
STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Custos de construção: {STRING}
-STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Define o nível de construção e custos de compra
+STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Definir o nível de construção e os custos de aquisição
STR_CONFIG_SETTING_RECESSIONS :Recessões: {STRING}
STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Se ativado, recessões podem ocorrer periodicamente. Durante uma recessão toda a produção é significativamente menor (ela retorna ao nível anterior quando a recessão termina)
@@ -1315,7 +1315,7 @@ STR_CONFIG_SETTING_TRAIN_REVERSING :Desabilitar rev
STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Se ativado, trens não irão mudar de direção em estações não terminais, mesmo se houver um caminho mais curto ao próximo destino ao trocar de direção
STR_CONFIG_SETTING_DISASTERS :Desastres: {STRING}
-STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Alterna desastres que podem ocasionalmente bloquear ou destruir veículos ou infraestrutura
+STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Ativar desastres que podem, ocasionalmente, bloquear ou destruir veículos ou infraestrutura
STR_CONFIG_SETTING_CITY_APPROVAL :Atitude da autoridade local: {STRING}
STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Escolhe como a poluição sonoroa e ambiental afeta a classificação na cidade e as ações futuras nessa cidade
@@ -1328,7 +1328,7 @@ STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_AUTO :(automático)
STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}Impossível definir o limite de altura do mapa para este valor. Há ao menos uma montanha mais alta que isso
STR_CONFIG_SETTING_AUTOSLOPE :Permitir paisagismo sob edifícios, trilhos, etc.: {STRING}
-STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Permite paisagismo sob edifícios e vias sem precisar removê-las
+STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Permitir paisagismo sob edifícios e vias sem precisar removê-las
STR_CONFIG_SETTING_CATCHMENT :Dimensionamento mais realista das áreas de abrangência: {STRING}
STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Exibe áreas de abrangência de para diferentes tipos de estações e aeroportos
@@ -1398,8 +1398,8 @@ STR_CONFIG_SETTING_SIGNALSIDE_DRIVING_SIDE :Do lado que se
STR_CONFIG_SETTING_SIGNALSIDE_RIGHT :Direita
###length 2
-STR_CONFIG_SETTING_SHOWFINANCES :Exibir janela das finanças no fim do ano: {STRING}
-STR_CONFIG_SETTING_SHOWFINANCES_PERIOD :Exibir janela das finanças no fim do período: {STRING}
+STR_CONFIG_SETTING_SHOWFINANCES :Mostrar janela das finanças no fim do ano: {STRING}
+STR_CONFIG_SETTING_SHOWFINANCES_PERIOD :Mostrar janela das finanças no fim do período: {STRING}
###length 2
STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :Se ativado, a janela de finanças é aberta ao final de cada ano para permitir uma inspeção fácil das economias da companhia
@@ -1509,9 +1509,9 @@ STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM}
STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (tempo do calendário congelado)
STR_CONFIG_SETTING_TOWN_CARGO_SCALE :Escalar a produção de carga da localidade: {STRING}
-STR_CONFIG_SETTING_TOWN_CARGO_SCALE_HELPTEXT :Escalar a produção de carga das localidades nesta percentagem.
+STR_CONFIG_SETTING_TOWN_CARGO_SCALE_HELPTEXT :Escalar a produção de carga das localidades nessa porcentagem.
STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE :Escalar a produção de carga da indústria: {STRING}
-STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_HELPTEXT :Escalar a produção de carga das indústrias nesta percentagem.
+STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_HELPTEXT :Escalar a produção de carga das indústrias nessa porcentagem.
STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}%
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Auto-renovação de veículos quando ficam velhos: {STRING}
@@ -1529,13 +1529,13 @@ STR_CONFIG_SETTING_AUTORENEW_MONEY_HELPTEXT :Quantia mínima
STR_CONFIG_SETTING_ERRMSG_DURATION :Duração da mensagem de erro: {STRING}
STR_CONFIG_SETTING_ERRMSG_DURATION_HELPTEXT :Define quanto tempo as janelas de erro (vermelhas) ficam abertas antes de fecharem automaticamente. Erros críticos devem ser fechados manualmente.
-STR_CONFIG_SETTING_HOVER_DELAY :Exibir dicas: {STRING}
+STR_CONFIG_SETTING_HOVER_DELAY :Mostrar dicas: {STRING}
STR_CONFIG_SETTING_HOVER_DELAY_HELPTEXT :Intervalo antes das dicas de ferramentas aparecerem ao deixar o mouse sobre algum botão na interface. Em contrapartida, as dicas são mostradas ao se clicar com o botão direito se esse valor for definido para 0.
STR_CONFIG_SETTING_HOVER_DELAY_VALUE :Aguardar {COMMA} milisegundo{P "" s}
###setting-zero-is-special
STR_CONFIG_SETTING_HOVER_DELAY_DISABLED :Botão direito
-STR_CONFIG_SETTING_POPULATION_IN_LABEL :Exibir população da cidade na janela da cidade: {STRING}
+STR_CONFIG_SETTING_POPULATION_IN_LABEL :Mostrar população da localidade na identificação da localidade: {STRING}
STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Exibe a população das cidades nos nomes, no mapa
STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Espessura das linhas nos gráficos: {STRING}
@@ -1550,7 +1550,7 @@ STR_CONFIG_SETTING_LANDSCAPE :Terreno: {STRIN
STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :O terreno define a jogabilidade básica com diferentes cargas e requerimentos para o crescimento das cidades. NewGRF's e Scripts de Jogo permitem um controle mais fino
STR_CONFIG_SETTING_LAND_GENERATOR :Gerador de Terreno: {STRING}
-STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT :O gerador original depende do set gráficos base, e cria terrenos de formatos fixos. TerraGenesis é um gerador baseado em ruído Perlin com configurações mais delicadas
+STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT :O gerador original depende do conjunto gráfico base e produz formas de terreno pré-definidas. TerraGenesis é um gerador baseado no algoritmo de ruído de Perlin com definições mais refinadas
###length 2
STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Original
STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis
@@ -1589,7 +1589,7 @@ STR_CONFIG_SETTING_VARIETY_HELPTEXT :(Apenas TerraGe
STR_CONFIG_SETTING_RIVER_AMOUNT :Quantidade de rios: {STRING}
STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Escolha quantos rios a serem gerados
-STR_CONFIG_SETTING_TREE_PLACER :Algorítimo de colocação de árvores: {STRING}
+STR_CONFIG_SETTING_TREE_PLACER :Algoritmo para colocação de árvores: {STRING}
STR_CONFIG_SETTING_TREE_PLACER_HELPTEXT :Escolha a distribuição das árvores no mapa: 'Original' planta árvores uniformemente pelo mapa, 'Melhorado' planta-as em grupos
###length 3
STR_CONFIG_SETTING_TREE_PLACER_NONE :Nenhum
@@ -1652,7 +1652,7 @@ STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Controla como a
STR_CONFIG_SETTING_MEASURE_TOOLTIP :Exibe distâncias quando usar ferramentas de construção: {STRING}
STR_CONFIG_SETTING_MEASURE_TOOLTIP_HELPTEXT :Exibe distâncias e diferenças de altitude quando clicando e arrastando enquanto constrói
-STR_CONFIG_SETTING_LIVERIES :Exibir cores avançadas: {STRING}
+STR_CONFIG_SETTING_LIVERIES :Mostrar pinturas específicas do tipo de veículo: {STRING}
STR_CONFIG_SETTING_LIVERIES_HELPTEXT :Contra o uso de cores de veículos dependentes do tipo (ao invés de cores específicas à companhia)
###length 3
STR_CONFIG_SETTING_LIVERIES_NONE :Nenhum
@@ -1660,7 +1660,7 @@ STR_CONFIG_SETTING_LIVERIES_OWN :Minha empresa
STR_CONFIG_SETTING_LIVERIES_ALL :Todas as empresas
STR_CONFIG_SETTING_PREFER_TEAMCHAT :Falar em time com : {STRING}
-STR_CONFIG_SETTING_PREFER_TEAMCHAT_HELPTEXT :Alterna a ativação da conversa entre público e só-companhia entre e
+STR_CONFIG_SETTING_PREFER_TEAMCHAT_HELPTEXT :Trocar o mapeamento entre o chat interno da empresa e o chat público para e respectivamente
STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER :Velocidade do scrollwheel do mapa: {STRING}
STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER_HELPTEXT :Controla a sensitividade do rolamento com a roda do mouser
@@ -1725,27 +1725,27 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ativa o uso da
STR_CONFIG_SETTING_LOADING_INDICATORS :Usar indicadores de carga: {STRING}
STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Seleciona se os indicadores de carga são exibidos sobre os veículos (des)carregando
-STR_CONFIG_SETTING_TIMETABLE_MODE :Unidades de tempo para as ordens: {STRING}
-STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Selecionar as unidades de tempo usadas nas ordens dos veículos
+STR_CONFIG_SETTING_TIMETABLE_MODE :Unidades de tempo para horários: {STRING}
+STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Selecionar as unidades de tempo usadas nos horários dos veículos
###length 3
STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Dias
STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Segundos
STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :Tiques
-STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Mostrar chegada e saída nos planos de horário: {STRING}
-STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Exibe tempos de chegada e partida anticipados nos planos de horário
+STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Mostrar chegada e partida nos horários: {STRING}
+STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Exibir tempos de chegada e partida anticipados nos horários
STR_CONFIG_SETTING_QUICKGOTO :Criar rapidamente ordens para um veículo: {STRING}
STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT :Pre-seleciona a opção 'ir para' ao abrir a janelas de ordens
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE :Tipo padrão de ferrovia (ao criar ou carregar um jogo): {STRING}
-STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Tipo de trilho a ser selecionado ao carregar/iniciar o jogo. 'primeiro disponível' seleciona o mais antigo. 'último disponível' seleciona o mais novo. 'mais usado' seleciona o que é atualmente mais usado
+STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Tipo de trilho a ser selecionado ao carregar/iniciar um jogo. 'primeiro disponível' seleciona o tipo mais antigo. 'último disponível' seleciona o tipo mais novo de trilho e 'mais usado' seleciona o tipo que é mais usado atualmente
###length 3
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :Primeiro disponível
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_LAST :Último disponível
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_MOST_USED :Mais utilizado
-STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION :Exibir vias reservadas para trilhos: {STRING}
+STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION :Mostrar trajetos reservados para trilhos: {STRING}
STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT :Escurece as vias reservadas para ajudar a lidar com problemas de trens não funcionando em blocos baseados em destinos
STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Manter a barra de construção aberta: {STRING}
@@ -1764,7 +1764,7 @@ STR_CONFIG_SETTING_SOUND_TICKER :Notícias: {STR
STR_CONFIG_SETTING_SOUND_TICKER_HELPTEXT :Toca um som para mensagens resumidas
STR_CONFIG_SETTING_SOUND_NEWS :Jornal: {STRING}
-STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT :Toca efeito sonoro ao exibir jornais
+STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT :Reproduzir efeito sonoro ao exibir jornais
###length 2
STR_CONFIG_SETTING_SOUND_NEW_YEAR :Fim de ano: {STRING}
@@ -1847,7 +1847,7 @@ STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Ativar limite d
STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Ativado, usa limites de velocidade para vagões para decidir a velocidade máxima de um trem
STR_CONFIG_SETTING_DISABLE_ELRAILS :Desativar ferrovias elétricas: {STRING}
-STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT :Ativado, remove a necessidade de trilhos elétricos para locomotivas elétricas, permitindo-nas usar trilhos normais
+STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT :Ativar essa configuração desativa o requisito de eletrificação dos trilhos para que locomotivas elétricas possam utilizá-los
STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN :Chegada do primeiro veículo à estação do jogador: {STRING}
STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN_HELPTEXT :Exibe um jornal quando o primeiro veículo chega numa estação do jogador
@@ -1862,7 +1862,7 @@ STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER :Acidentes de ve
STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER_HELPTEXT :Mostrar um jornal sobre os acidentes de veículos dos competidores
STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Informações da empresa: {STRING}
-STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Exibe um jornal quando uma companhia é aberta, ou quando estão próximas da bancarrota
+STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Exibir um jornal quando uma nova empresa é criada, ou quando empresas estão à beira da falência
STR_CONFIG_SETTING_NEWS_INDUSTRY_OPEN :Abertura de indústrias: {STRING}
STR_CONFIG_SETTING_NEWS_INDUSTRY_OPEN_HELPTEXT :Exibe um jornal quando indústrias abrem
@@ -1874,13 +1874,13 @@ STR_CONFIG_SETTING_NEWS_ECONOMY_CHANGES :Mudanças econ
STR_CONFIG_SETTING_NEWS_ECONOMY_CHANGES_HELPTEXT :Exibe um jornal referente a mudanças globais na economia
STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY :Mudanças na produção das indústrias servidas pela empresa: {STRING}
-STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY_HELPTEXT :Exibe um jornal quando a produção de indústrias muda, que são atendidas pela companhia
+STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY_HELPTEXT :Exibir um jornal quando o nível de produção das indústrias que são atendidas pela empresa mudarem
STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER :Mudanças na produção de indústrias servida pelo(s) concorrente(es): {STRING}
STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER_HELPTEXT :Exibe um jornal quando a produção de indústrias muda, que são atendidas pelos competidores
STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED :Outras mudanças de produção das indústrias: {STRING}
-STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED_HELPTEXT :{G=f}Exibe um jornal quando a produção de indústrias muda, que não não atendidas pela companhia ou competidores
+STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED_HELPTEXT :Exibir um jornal quando o nível de produção das indústrias que não não atendidas pela empresa ou por competidores mudar
STR_CONFIG_SETTING_NEWS_ADVICE :Conselhos / informações sobre os veículos da empresa: {STRING}
STR_CONFIG_SETTING_NEWS_ADVICE_HELPTEXT :Exibe mensagens sobre veículos precisando de atenção
@@ -1933,12 +1933,13 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Seleciona o ano
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Tipo de sinal a ser exibido: {STRING}
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Selecione quais os tipos de sinais mostrar ao usar Ctrl+Clique num sinal existente com a ferramenta de sinais
###length 2
+STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Apenas grupo atual
STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Todos visíveis
STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Mostrar tipos de sinais: {STRING}
STR_CONFIG_SETTING_SIGNAL_GUI_MODE_HELPTEXT :Escolha quais tipos de sinais são mostrados na barra de ferramentas de sinais
###length 2
-STR_CONFIG_SETTING_SIGNAL_GUI_MODE_PATH :Sinal de trajeto apenas
+STR_CONFIG_SETTING_SIGNAL_GUI_MODE_PATH :Apenas sinais de trajeto
STR_CONFIG_SETTING_SIGNAL_GUI_MODE_ALL_CYCLE_PATH :Todos os sinais
STR_CONFIG_SETTING_TOWN_LAYOUT :Disposição de ruas para novas cidades: {STRING}
@@ -2037,7 +2038,7 @@ STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :Tempo gasto par
STR_CONFIG_SETTING_DISTRIBUTION_PAX :Modo de distribuição para passageiros: {STRING}
STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"Simétrico" significa que aproximadamente o mesmo número de passageiros irá de uma estação A para uma estação B como de B para A. "Assimétrico" significa que um número arbitrário de passageiros pode ir em qualquer direção. "Manual" significa que não haverá distribuição automática para os passageiros.
-STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Modo de distribuição para correios: {STRING}
+STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Modo de distribuição para correspondências: {STRING}
STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :"Simétrico" significa que aproximadamente a mesma quantidade de correspondência será enviada de uma estação A para uma estação B como de B para A. "Assimétrica" significa que quantidades arbitrárias de correspondência podem ser enviadas em qualquer direção. "Manual" significa que nenhuma distribuição automática ocorrerá por correio.
STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Modo de distribuição para classe BLINDADOS de carga: {STRING}
STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :A classe de carga BLINDADA contém objetos de valor em clima temperado, diamantes em clima subtropical ou ouro em clima subártico. NewGRFs podem mudar isso. "Simétrica" significa que aproximadamente a mesma quantidade dessa carga será enviada de uma estação A para uma estação B como de B para A. "Assimétrica" significa que quantidades arbitrárias dessa carga podem ser enviadas em qualquer direção. "Manual" significa que não haverá distribuição automática para aquela carga. Recomenda-se definir isso como assimétrico ou manual ao jogar subártico ou subtropical, pois os bancos só recebem carga nesses climas. Para temperado, você também pode escolher simétrico, pois os bancos enviarão objetos de valor de volta ao banco de origem.
@@ -2052,12 +2053,12 @@ STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Precisão da di
STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Quanto mais alto você define esse valor, mais tempo de CPU será dado ao cálculo do gráfico. Se levar muito tempo, você poderá notar um pouco de lag. Se você definir um valor muito baixo, a distribuição será imprecisa, e você notará cargas deixando de serem enviadas aonde deveriam ir.
STR_CONFIG_SETTING_DEMAND_DISTANCE :Efeito da distância na demanda: {STRING}
-STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Se você definir esse valor para maior que 0, a distância entre a estação de origem A para alguma carga e um possível destino B terá um efeito na quantidade de carga levada de A até B. Quanto mais distante B for da A, menos carga será enviada. Quanto mais alto você definir esse valor, menos carga será levada para estações distantes, e mais carga será levada para estações próximas.
+STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Se você definir esse valor para maior que 0, a distância entre a estação de origem A para alguma carga e um possível destino B terá um efeito na quantidade de carga transportada de A até B. Quanto mais distante B estiver de A, menos carga será enviada. Quanto maior valor definido, menos carga será transportada para estações distantes e mais carga será levada para estações próximas.
STR_CONFIG_SETTING_DEMAND_SIZE :Quantidade de carga retornada no modo simétrico: {STRING}
STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Definir isso para menos de 100% faz com que a distribuição simétrica comporte-se mais como a assimétrica. Menos carga será devolvida forçosamente se uma certa quantidade for mandada a uma estação. Se você definir a 0%, a distribuição se comportará exatamente como a assimétrica.
STR_CONFIG_SETTING_SHORT_PATH_SATURATION :Saturação de caminhos curtos antes de usar caminhos de alta capacidade: {STRING}
-STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :Frequentemente há múltiplos caminhos entre duas estações. Cargodist irá saturar o caminho mais curto primeiro, depois usar o segundo caminho mais curto até saturá-lo, e assim por diante. Saturação é determinada pela estimação da capacidade de do uso planejado. Ao saturar todos os caminhos, se ainda houver demanda, irá sobrecarregar todos os caminhos, com preferência aos de maior capacidade. No entanto, na maior parte do tempo o algorítimo não irá estimar a capacidade corretamente. Essa configuração permite você definir até que porcentagem um caminho mais curto deverá ser saturado na primeira passada antes do algorítimo proceder ao próxido. Defina-o para menos de 100% para evitar estações sobrecarregadas no caso de capacidade superestimada.
+STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :Frequentemente há múltiplos trajetos entre duas estações. Cargodist irá saturar o trajeto mais curto primeiro, depois usar o segundo trajeto mais curto até saturá-lo, e assim por diante. A saturação é determinada por uma estimativa da capacidade e do uso planejado. Ao saturar todos os trajetos, se ainda houver demanda não atendida, irá sobrecarregar todos os trajetos, com preferência pelos de maior capacidade. Entretanto, na maioria das vezes o algoritmo não irá estimar corretamente a capacidade. Essa configuração permite definir até que porcentagem um trajeto mais curto deverá ser saturado na primeira passada antes do algoritmo selecionar o próximo trajeto mais longo. Defina-o para menos de 100% para evitar estações sobrecarregadas no caso de capacidade superestimada.
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :Unidades de velocidade (terrestre): {STRING}
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_NAUTICAL :Unidades de velocidade (náutica): {STRING}
@@ -2112,7 +2113,7 @@ STR_CONFIG_SETTING_INTERFACE_GENERAL :Geral
STR_CONFIG_SETTING_INTERFACE_VIEWPORTS :Janelas de visualização
STR_CONFIG_SETTING_INTERFACE_CONSTRUCTION :Construção
STR_CONFIG_SETTING_ADVISORS :Notícias / Conselheiros
-STR_CONFIG_SETTING_COMPANY :Companhia
+STR_CONFIG_SETTING_COMPANY :Empresa
STR_CONFIG_SETTING_ACCOUNTING :Contabilidade
STR_CONFIG_SETTING_VEHICLES :Veículos
STR_CONFIG_SETTING_VEHICLES_PHYSICS :Física
@@ -2132,12 +2133,12 @@ STR_CONFIG_SETTING_AI :Oponentes
STR_CONFIG_SETTING_AI_NPC :Computadores
STR_CONFIG_SETTING_NETWORK :Rede
-STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS :Pathfinder para trens: {STRING}
-STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS_HELPTEXT :Algorítimo de formulação de vias para trens, que define quais vias tomar
-STR_CONFIG_SETTING_PATHFINDER_FOR_ROAD_VEHICLES :Pathfinder para automóveis: {STRING}
-STR_CONFIG_SETTING_PATHFINDER_FOR_ROAD_VEHICLES_HELPTEXT :Algorítimo de formulação de vias para automóveis, que define quais vias tomar
-STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS :Pathfinder para embarcações: {STRING}
-STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS_HELPTEXT :Algorítimo de formulação de vias para embarcações, que define quais vias tomar
+STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS :Gerador de rotas para trens: {STRING}
+STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS_HELPTEXT :Gerador de rotas para usar nos trens
+STR_CONFIG_SETTING_PATHFINDER_FOR_ROAD_VEHICLES :Gerador de rotas para veículos rodoviários: {STRING}
+STR_CONFIG_SETTING_PATHFINDER_FOR_ROAD_VEHICLES_HELPTEXT :Gerador de rotas para usar nos veículos rodoviários
+STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS :Gerador de rotas para embarcações: {STRING}
+STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS_HELPTEXT :Gerador de rotas para usar nas embarcações
STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Reversão automática em sinais: {STRING}
STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Permite trens reverterem sentido num sinal, se estiverem aguardando por muito tempo
###length 2
@@ -2203,7 +2204,7 @@ STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Selecion
STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Selecionar cenário do estilo 'subtropical'
STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Selecionar cenário do estilo 'toyland'
-STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Exibir opções de jogo
+STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Abrir opções de jogo
STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Mostrar tabela de classificações
STR_INTRO_TOOLTIP_HELP :{BLACK}Obter acesso à documentação e recursos online
STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Mostrar configurações
@@ -2243,7 +2244,7 @@ STR_HELP_WINDOW_COMMUNITY :{BLACK}Comunida
# Cheat window
STR_CHEATS :{WHITE}Opções da sandbox
STR_CHEAT_MONEY :{LTBLUE}Aumentar dinheiro em {CURRENCY_LONG}
-STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Jogando pela Co.: {ORANGE}{COMMA}
+STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Jogando como empresa: {ORANGE}{COMMA}
STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Escavadeira mágica (destrói indústrias, objetos estáticos): {ORANGE}{STRING}
STR_CHEAT_CROSSINGTUNNELS :{LTBLUE}Os túneis poderão cruzar-se: {ORANGE}{STRING}
STR_CHEAT_NO_JETCRASH :{LTBLUE}Aeronaves a jato não irão se acidentar (frequentemente) em aeroportos pequenos: {ORANGE} {STRING}
@@ -2257,15 +2258,15 @@ STR_CHEAT_STATION_RATING :{LTBLUE}Fixar a
# Livery window
STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Esquema de cores
-STR_LIVERY_GENERAL_TOOLTIP :{BLACK}Exibir esquemas de cor gerais
+STR_LIVERY_GENERAL_TOOLTIP :{BLACK}Mostrar esquemas de cores gerais
STR_LIVERY_TRAIN_TOOLTIP :{BLACK}Exibe esquemas de cor de trens
-STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Exibir os esquemas de cor de automóveis
-STR_LIVERY_SHIP_TOOLTIP :{BLACK}Exibir esquemas de cor de embarcação
-STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Exibir esquemas de cor de aviões
-STR_LIVERY_TRAIN_GROUP_TOOLTIP :{BLACK}Exibir cores de grupos de trens
-STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP :{BLACK}Exibir cores dos grupos de veículos
-STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Exibir cores de grupos de embarcações
-STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP :{BLACK}Exibir cores dos grupos de aeronaves
+STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Mostrar esquemas de cores de veículos rodoviários
+STR_LIVERY_SHIP_TOOLTIP :{BLACK}Mostrar esquemas de cores de embarcações
+STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Mostrar esquemas de cores de aeronaves
+STR_LIVERY_TRAIN_GROUP_TOOLTIP :{BLACK}Mostrar cores dos grupos de trens
+STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP :{BLACK}Mostrar cores dos grupos de veículos rodoviários
+STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Mostrar cores dos grupos de embarcações
+STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP :{BLACK}Mostrar cores dos grupos de aeronaves
STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Escolha a cor principal para o esquema selecionado. Ctrl+Clique define essa cor para todos os esquemas
STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Escolha a cor secundária para o esquema selecionado. Ctrl+Clique aplica essa cor para todos os esquemas
STR_LIVERY_PANEL_TOOLTIP :{BLACK}Selecionar um esquema de cores para mudar, ou múltiplos esquemas com CTRL+clique. Marque a opção para utilizar o esquema
@@ -2375,7 +2376,7 @@ STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION :{BLACK}Clientes
STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION_TOOLTIP :{BLACK}Clientes ligados / max. clientes{}Empresas ligados / max, empresas
STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT :{BLACK}{COMMA}x{COMMA}
STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Tamanho do mapa
-STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Tamanho do mapa do jogo{}Clique para exibir por área
+STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Tamanho do mapa do jogo{}Clique para ordenar por área
STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Data
STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Data atual
STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}h {NUM}min
@@ -2542,7 +2543,7 @@ STR_COMPANY_PASSWORD_MAKE_DEFAULT_TOOLTIP :{BLACK}Usar est
# Network company info join/password
STR_COMPANY_VIEW_JOIN :{BLACK}Entrar
-STR_COMPANY_VIEW_JOIN_TOOLTIP :{BLACK}Entrar e jogar como essa companhia
+STR_COMPANY_VIEW_JOIN_TOOLTIP :{BLACK}Entrar e jogar como essa empresa
STR_COMPANY_VIEW_PASSWORD :{BLACK}Senha
STR_COMPANY_VIEW_PASSWORD_TOOLTIP :{BLACK}Protege a sua empresa com uma senha para prevenir a entrada de usuários não autorizados
STR_COMPANY_VIEW_SET_PASSWORD :{BLACK}Definir senha para empresa
@@ -2601,7 +2602,7 @@ STR_NETWORK_ERROR_CLIENT_NOT_EXPECTED :um pacote invá
STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :versão incorreta
STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :nome já está em uso
STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :senha incorreta
-STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :wrong company-id in DoCommand (ERRO)
+STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :empresa errada em DoCommand
STR_NETWORK_ERROR_CLIENT_KICKED :expulso pelo servidor
STR_NETWORK_ERROR_CLIENT_CHEATER :estava tentando trapacear
STR_NETWORK_ERROR_CLIENT_SERVER_FULL :servidor cheio
@@ -2626,7 +2627,7 @@ STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED :Jogo despausado
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :número de jogadores
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :clientes conectando-se
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :manual
-STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :{G=m}script do jogo
+STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :script do jogo
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :aguardando atualização do gráfico de links
STR_NETWORK_MESSAGE_CLIENT_LEAVING :saindo
@@ -2679,7 +2680,7 @@ STR_CONTENT_DETAIL_SUBTITLE_AUTOSELECTED :{SILVER}Esta de
STR_CONTENT_DETAIL_SUBTITLE_ALREADY_HERE :{SILVER}Você já baixou isso
STR_CONTENT_DETAIL_SUBTITLE_DOES_NOT_EXIST :{SILVER}Esse conteúdo é desconhecido e não pode ser baixado pelo OpenTTD
-STR_CONTENT_DETAIL_UPDATE :{G=f}{SILVER}Isso substitui uma {STRING} existente
+STR_CONTENT_DETAIL_UPDATE :{SILVER}Isto é uma substituição para um existente {STRING}
STR_CONTENT_DETAIL_NAME :{SILVER}Nome: {WHITE}{STRING}
STR_CONTENT_DETAIL_VERSION :{SILVER}Versão: {WHITE}{STRING}
STR_CONTENT_DETAIL_DESCRIPTION :{SILVER}Descrição: {WHITE}{STRING}
@@ -2728,15 +2729,15 @@ STR_MISSING_GRAPHICS_ERROR_QUIT :{BLACK}Sair do
# Transparency settings window
STR_TRANSPARENCY_CAPTION :{WHITE}Opções de Transparência
-STR_TRANSPARENT_SIGNS_TOOLTIP :{BLACK}Alternar transparência para sinais de estação. Ctrl+Clique para travar
-STR_TRANSPARENT_TREES_TOOLTIP :{BLACK}Alternar transparência para árvores. Ctrl+Clique para travar
-STR_TRANSPARENT_HOUSES_TOOLTIP :{BLACK}Alternar transparência para casas. Ctrl+Clique para travar
-STR_TRANSPARENT_INDUSTRIES_TOOLTIP :{BLACK}Alternar transparência para indústrias. Ctrl+Clique para travar
-STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Alternar transparência para construções como estações, depósitos, pontos de controle. Ctrl+Clique para travar
-STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Alternar transparência para pontes. Ctrl+Clique para travar
-STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Alternar transparência para estruturas como faróis e antenas. Ctrl+Clique para travar
-STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Alternar transparência para catenária. Ctrl+Clique para travar
-STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}Alternar transparência do texto de carregamento e custo/receita. Ctrl+Clique para travar.
+STR_TRANSPARENT_SIGNS_TOOLTIP :{BLACK}Ativar transparência dos sinais. Ctrl+Clique para travar
+STR_TRANSPARENT_TREES_TOOLTIP :{BLACK}Ativar transparência das árvores. Ctrl+Clique para travar
+STR_TRANSPARENT_HOUSES_TOOLTIP :{BLACK}Ativar transparência das casas. Ctrl+Clique para travar
+STR_TRANSPARENT_INDUSTRIES_TOOLTIP :{BLACK}Ativar transparência das indústrias. Ctrl+Clique para travar
+STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Ativar transparência das construções como estações, depósitos e pontos de controle. Ctrl+Clique para travar
+STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Ativar transparência das pontes. Ctrl+Clique para travar
+STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Ativar transparência para estruturas como faróis e antenas. Ctrl+Clique para travar
+STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Ativar transparência para catenária. Ctrl+Clique para travar
+STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}Ativar transparência do texto de carregamento e custo/receita. Ctrl+Clique para travar
STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Definir objetivos como invisíveis ao invés de transparentes.
# Linkgraph legend window
@@ -2792,7 +2793,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Construi
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Construir sinal na ferrovia. Ctrl+Clique para construir o sinal com estilo diferente{}Clique+Arraste para preencher a seção selecionada da ferrovia com os sinais no espaçamento escolhido. Ctrl+Clique+Arraste para colocar sinais até a próxima junção, estação ou sinal. Pressionar Shift mostra o custo estimado
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Construir ponte ferroviária. Presionar Shift mostra o custo estimado
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Construir túnel ferroviário. Pressionar Shift mostra o custo estimado
-STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Alternar entre construir/remover linha férrea, sinais, pontos de controle e estações. Pressionar Ctrl+Clique remove os trilhos de pontos de controle e das estações
+STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Ativar construir/remover linha férrea, sinais, pontos de controle e estações. Ctrl+Clique remove os trilhos de pontos de controle e das estações
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Converter/Atualizar tipo de trilho. Pressione Shift para somente mostrar o custo estimado
STR_RAIL_NAME_RAILROAD :Ferrovia
@@ -2802,7 +2803,7 @@ STR_RAIL_NAME_MAGLEV :Maglev
# Rail depot construction window
STR_BUILD_DEPOT_TRAIN_ORIENTATION_CAPTION :{WHITE}Orientação do Depósito Ferroviário
-STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP :{BLACK}Selecionar a orientação do depósito ferroviário
+STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação do depósito ferroviário
# Rail waypoint construction window
STR_WAYPOINT_CAPTION :{WHITE}Ponto de controle
@@ -2811,7 +2812,7 @@ STR_WAYPOINT_GRAPHICS_TOOLTIP :{BLACK}Selecion
# Rail station construction window
STR_STATION_BUILD_RAIL_CAPTION :{WHITE}Seleção de Estação
STR_STATION_BUILD_ORIENTATION :{BLACK}Orientação
-STR_STATION_BUILD_RAILROAD_ORIENTATION_TOOLTIP :{BLACK}Selecionar a orientação da estação ferroviária
+STR_STATION_BUILD_RAILROAD_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação ferroviária
STR_STATION_BUILD_NUMBER_OF_TRACKS :{BLACK}Número de linhas
STR_STATION_BUILD_NUMBER_OF_TRACKS_TOOLTIP :{BLACK}Selecionar o número de linhas da estação ferroviária
STR_STATION_BUILD_PLATFORM_LENGTH :{BLACK}Tamanho da plataforma
@@ -2830,20 +2831,20 @@ STR_STATION_CLASS_WAYP_WAYPOINT :Ponto de contro
# Signal window
STR_BUILD_SIGNAL_CAPTION :{WHITE}Seleção de Sinais
-STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}Alternar se mostra os tipos de sinais avançados
-STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Sinais padrão (semáforos){}Sinais são necessários para impedir trens de colidirem nas malhas ferroviárias com mais de um trem
-STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Sinal de Entrada (semáforo){}Verde enquanto haja um ou mais sinais de saída verdes na atual seção dos trilhos. Do contrário, mostra vermelho
-STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Sinal de saída (semáforo){}Funciona como um sinal normal, porém é necessário para o funcionamento correto do sistema de pré-sinais combo ou de entrada
-STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TOOLTIP :{BLACK}Sinal combo (semáforo){}O sinal combo funciona tanto como um sinal de entrada quanto de saída. Permite construir várias ramificações
-STR_BUILD_SIGNAL_SEMAPHORE_PBS_TOOLTIP :{BLACK}Sinal de trajeto(Semáforo){}Um sinal de trajeto permite mais de um trem em um bloco de ferrovia, Se o trem no bloco puder reservar um local seguro para parar, o sinal de trajeto já permite a passada do próximo
-STR_BUILD_SIGNAL_SEMAPHORE_PBS_OWAY_TOOLTIP :{BLACK}Sinal de trajeto de mão única(Semáforo){}Um sinal de trajeto permite mais de um trem em um bloco de ferrovia, Se o trem no bloco puder reservar um local seguro para parar, o sinal de trajeto já permite a passada do próximo, porém não permite a passagem na via contrária
-STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP :{BLACK}Sinal Padrão (elétrico){}Sinais são necessários para impedir que trens batam em redes de ferrovias com mais de uma máquina
-STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP :{BLACK}Sinal de Entrada (elétrico){}Verde enquanto haja um ou mais sinais de saída verdes na atual seção dos trilhos. Do contrário, mostra vermelho
-STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Sinal de saída(elétrico){}Funciona como um sinal normal, porém é necessário para o funcionamento correto do sistema de pré-sinais combo ou de entrada
-STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Sinal Combo (elétrico){}O sinal combo funciona tanto como um sinal de entrada quanto de saída. Permite construir várias ramificações de pré-sinais
-STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Sinal de trajeto (Elétrico){}Um sinal de trajeto permite mais de um trem entrar em um bloco de sinal ao mesmo tempo, se o trem puder reservar um trajeto para um ponto seguro de parada. Sinais de trajeto padrões podem ser passados pelo lado de trás
-STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Sinal avançado de mão única(Elétrico){}Um sinal de trajeto permite mais de um trem em um bloco de ferrovia, Se o trem no bloco puder reservar um local seguro para parar, o sinal de trajeto já permite a passada do próximo, porém não permite a passagem na via contrária
-STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Converter sinal{}Clique em um sinal existente para convertê-lo para o tipo e variante de sinal selecionado. Ctrl+Clique anterna a variante existente. Shift+Clique mostra o custo estimado da conversão
+STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}Ativar a exibição dos tipos de sinais avançados
+STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Sinal de bloco (semáforo){}Este é o tipo mais básico de sinal, permitindo que apenas um trem fique em um bloco de linha ao mesmo tempo
+STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Sinal de Entrada (semáforo){}Fica verde enquanto houver um ou mais sinais de saída verdes no trecho da linha. Caso contrário, ficará vermelho
+STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Sinal de saída (semáforo){}Funciona da mesma forma que o sinal de bloco, mas é necessário para ativar a cor correta nos pré-sinais de entrada e combinado.
+STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TOOLTIP :{BLACK}Sinal combinado (semáforo){}O sinal combinado funciona simultaneamente como um sinal de entrada e de saída. Isto permite a construção de ramificações complexas de pré-sinais.
+STR_BUILD_SIGNAL_SEMAPHORE_PBS_TOOLTIP :{BLACK}Sinal de trajeto(semáforo){}Um sinal de trajeto permite mais de um trem entrar em um bloco de sinal ao mesmo tempo, se o trem puder reservar um trajeto para um ponto seguro de parada. Sinais de trajeto padrões podem ser passados no sentido contrário
+STR_BUILD_SIGNAL_SEMAPHORE_PBS_OWAY_TOOLTIP :{BLACK}Sinal de sentido único(semáforo){}Um sinal de trajeto permite mais de um trem em um bloco de sinal ao mesmo tempo, se o trem puder reservar um trajeto para um ponto seguro de parada. Os sinais de sentido único não podem ser passados no sentido contrário
+STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP :{BLACK}Sinal de bloco (elétrico){}Este é o tipo mais básico de sinal, permitindo que apenas um trem fique em um bloco de linha em um dado momento
+STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP :{BLACK}Sinal de entrada (elétrico){}Fica verde enquanto houver um ou mais sinais de saída verdes no trecho da linha. Caso contrário, ficará vermelho.
+STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Sinal de saída (elétrico){}Funciona da mesma forma que o sinal de bloco, mas é necessário para ativar a cor correta nos pré-sinais de entrada e combinado.
+STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Sinal combinado (elétrico){}O sinal combinado funciona simultaneamente como um sinal de entrada e de saída. Isto permite construir ramificações complexas de pré-sinais.
+STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Sinal de trajeto (elétrico){}Um sinal de trajeto permite mais de um trem entrar em um bloco de sinal ao mesmo tempo, se o trem puder reservar um trajeto para um ponto seguro de parada. Sinais de trajeto padrões podem ser passados no sentido contrário
+STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Sinal de sentido único (elétrico){}Um sinal de trajeto permite mais de um trem entrar em um bloco de sinal ao mesmo tempo, se o trem puder reservar um trajeto para um ponto seguro de parada. Os sinais de sentido único não podem ser passados no sentido contrário
+STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Converter sinal{}Clique em um sinal existente para convertê-lo para o tipo e variante de sinal selecionado. Ctrl+Clique muda a variante existente. Shift+Clique mostra o custo estimado da conversão
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}Densidade dos sinais ao clicar e arrastar
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}Diminuir a densidade dos sinais
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Aumentar a densidade dos sinais
@@ -2884,8 +2885,8 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Construi
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Construir ponte para bondes. Pressionar Shift mostra o custo estimado
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Construir túnel rodoviário. Pressionar Shift mostra o custo estimado
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Construir túnel para bondes. Pressionar Shift mostra o custo estimado
-STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Alternar entre construir/remover estradas
-STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Alternar entre construir/remover linhas de bonde
+STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Ativar construir/remover estradas
+STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Ativar construir/remover linhas de bonde
STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Converter/Atualizar o tipo de estrada. Pressione Shift para mostrar somente o custo estimado
STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Converter/Atualizar o tipo de bonde. Pressionar Shift mostra o custo estimado
@@ -2893,20 +2894,20 @@ STR_ROAD_NAME_ROAD :Estrada
STR_ROAD_NAME_TRAM :Bonde
# Road depot construction window
-STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION :{WHITE}Orientação da Garagem
-STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP :{BLACK}Selecionar a orientação da garagem
-STR_BUILD_DEPOT_TRAM_ORIENTATION_CAPTION :{WHITE}Orientação do Depósito
-STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP :{BLACK}Selecionar a orientação do depósito de bonde
+STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION :{WHITE}Orientação do Depósito Rodoviário
+STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP :{BLACK}Selecionar orientação do depósito rodoviário
+STR_BUILD_DEPOT_TRAM_ORIENTATION_CAPTION :{WHITE}Orientação do Depósito de Bondes
+STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP :{BLACK}Selecionar orientação do depósito de bondes
# Road vehicle station construction window
-STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Orientação do estação de ônibus
+STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Orientação da Estação de Ônibus
STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação do estação de ônibus
-STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Orientação da área de carga
-STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Selecionar a orientação da estação de caminhões
-STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Bonde Passageiros
-STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de bonde
-STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Bonde de Carga
-STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de bonde
+STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Orientação da estação de carga
+STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de caminhões
+STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Bonde de Passageiros
+STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de bondes de passageiros
+STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Bondes de Carga
+STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de bondes de carga
# Waterways toolbar (last two for SE only)
STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Construção de Hidrovias
@@ -2994,7 +2995,7 @@ STR_TERRAFORM_TOOLTIP_DECREASE_SIZE_OF_LAND_AREA :{BLACK}Diminui
STR_TERRAFORM_TOOLTIP_GENERATE_RANDOM_LAND :{BLACK}Gera terreno aleatório
STR_TERRAFORM_SE_NEW_WORLD :{BLACK}Criar novo cenário
STR_TERRAFORM_RESET_LANDSCAPE :{BLACK}Limpar terreno
-STR_TERRAFORM_RESET_LANDSCAPE_TOOLTIP :{BLACK}Remove todas as propriedades da empresa do mapa
+STR_TERRAFORM_RESET_LANDSCAPE_TOOLTIP :{BLACK}Remover todas as propriedades das empresas do mapa
STR_QUERY_RESET_LANDSCAPE_CAPTION :{WHITE}Limpar Terreno
STR_RESET_LANDSCAPE_CONFIRMATION_TEXT :{WHITE}Tem certeza que quer remover todas as propriedades da empresa?
@@ -3053,14 +3054,14 @@ STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Você t
STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Cadeia da Indústria - {STRING}
STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Cadeia de Carga - {STRING}
STR_INDUSTRY_CARGOES_PRODUCERS :{WHITE}Indústrias produtoras
-STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Indústrias aceptoras
+STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Indústrias que aceitam
STR_INDUSTRY_CARGOES_HOUSES :{WHITE}Casas
STR_INDUSTRY_CARGOES_INDUSTRY_TOOLTIP :{BLACK}Clique na indústria para ver seus fornecedores e clientes
STR_INDUSTRY_CARGOES_CARGO_TOOLTIP :{BLACK}{STRING}{}Clique na carga para ver seus fornecedores e clientes
STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Cadeia da Indústria
STR_INDUSTRY_DISPLAY_CHAIN_TOOLTIP :{BLACK}Exibe indústrias que suprem e aceitam carga
-STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP :{BLACK}Exiba também no minimapa
-STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP :{BLACK}Selecione as indústrias exibidas no minimapa também
+STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP :{BLACK}Ligar ao minimapa
+STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP :{BLACK}Também selecionar as indústrias exibidas no minimapa
STR_INDUSTRY_CARGOES_SELECT_CARGO :{BLACK}Selecionar carga
STR_INDUSTRY_CARGOES_SELECT_CARGO_TOOLTIP :{BLACK}Selecionar a carga que você deseja exibir
STR_INDUSTRY_CARGOES_SELECT_INDUSTRY :{BLACK}Selecionar a indústria
@@ -3105,28 +3106,28 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Campos
STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Neve
STR_LAI_CLEAR_DESCRIPTION_DESERT :Deserto
-STR_LAI_RAIL_DESCRIPTION_TRACK :Trilho de ferrovia
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Trilho de ferrovia com sinais normais
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Trilho de ferrovia com pré-sinais
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Trilho de ferrovia com sinais de saída
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Trilho de ferrovia com sinais-combo
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Trilho de ferrovia com sinais de trajeto
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Trilhos de Ferrovia com sinais de trajeto de mão única
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Trilho de ferrovia com sinais normais e pré-sinais
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Trilho de ferrovia com sinais normais e pré-sinais
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Trilho de ferrovia com sinais normais e sinais-combo
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Trilho de ferrovia com sinais normais e de trajeto
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Trilho de ferrovia com sinais normais e de trajeto de mão única
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Trilho de ferrovia com pré-sinais e de saída
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Trilho de ferrovia com pré-sinais e sinais-combo
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Trilho de ferrovia com pré-sinais e sinais de trajeto
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Trilho de ferrovia com pré-sinais de trajeto e de mão única
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Trilho de ferrovia com sinais de saída e sinais-combo
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Trilho de ferrovia com sinais de saída e de trajeto
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Trilho de ferrovia com sinais de saída de trajeto e de mão única
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Trilho de ferrovia com sinais-combo e de trajeto
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Trilho de ferrovia com sinais-combo de trajeto e de mão única
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Trilho de ferrovia com sinais de trajeto normais e de mão única
+STR_LAI_RAIL_DESCRIPTION_TRACK :Ferrovia
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Ferrovia com sinais de bloqueio
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Ferrovia com pré-sinais
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Ferrovia com sinais de saída
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Ferrovia com sinais combinados
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Ferrovia com sinais de trajeto
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Ferrovia com sinais de sentido único
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Ferrovia com sinais de bloqueio e pré-sinais
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Ferrovia com sinais de bloqueio e de saida
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Ferrovia com sinais de bloqueio e combinados
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Ferrovia com sinais de bloqueio e de trajeto
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Ferrovia com sinais de bloqueio e de sentido único
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Ferrovia com pré-sinais e sinais de saida
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Ferrovia com pré-sinais e sinais combinados
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Ferrovia com pré-sinais e sinais de trajeto
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Ferrovia com pré-sinais e sinais de sentido único
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Ferrovia com sinais de saida e combinados
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Ferrovia com sinais de saída e de trajeto
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Ferrovia com sinais de saida e de sentido único
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Ferrovia com sinais combinados e de trajeto
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Ferrovia com sinais combinados e de sentido único
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Ferrovia com sinais de trajeto e de sentido único
STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Depósito de ferrovia
STR_LAI_ROAD_DESCRIPTION_ROAD :Rodovia
@@ -3267,8 +3268,8 @@ STR_SAVELOAD_DELETE_TOOLTIP :{BLACK}Remover
STR_SAVELOAD_SAVE_BUTTON :{BLACK}Salvar
STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}Salvar o jogo atual, usando o nome escolhido
STR_SAVELOAD_LOAD_BUTTON :{BLACK}Carregar
-STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}Carrega o jogo selecionado
-STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP :{BLACK}Carrega o mapa topográfico selecionado
+STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}Carregar o jogo selecionado
+STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP :{BLACK}Carregar o mapa topográfico selecionado
STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Detalhes do Jogo
STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Nenhuma informação disponível
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING}
@@ -3279,7 +3280,7 @@ STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Tem cer
STR_SAVELOAD_DIRECTORY :{STRING} (Diretório)
STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Diretório raiz)
-STR_SAVELOAD_OSKTITLE :{BLACK}Coloque o nome para o jogo salvo
+STR_SAVELOAD_OSKTITLE :{BLACK}Digitar um nome para o jogo gravado
# World generation
STR_MAPGEN_WORLD_GENERATION_CAPTION :{WHITE}Geração de mundo
@@ -3289,7 +3290,7 @@ STR_MAPGEN_BY :{BLACK}*
STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}No. de cidades:
STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Selecionar a densidade de cidades ou fornecer um número
STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Nome das cidades:
-STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Selecionar o estilo dos nomes das cidades
+STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Selecionar o estilo dos nomes das localidades
STR_MAPGEN_DATE :{BLACK}Data:
STR_MAPGEN_DATE_TOOLTIP :{BLACK}Selecionar a data inicial
STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}No. de indústrias:
@@ -3426,9 +3427,9 @@ STR_NEWGRF_SETTINGS_UPGRADE_TOOLTIP :{BLACK}Atualiza
STR_NEWGRF_SETTINGS_FILE_TOOLTIP :{BLACK}Uma lista dos NewGRF instalados.
STR_NEWGRF_SETTINGS_SET_PARAMETERS :{BLACK}Definir parâmetros
-STR_NEWGRF_SETTINGS_SHOW_PARAMETERS :{BLACK}Exibir parâmetros
-STR_NEWGRF_SETTINGS_TOGGLE_PALETTE :{BLACK}Alterna paleta
-STR_NEWGRF_SETTINGS_TOGGLE_PALETTE_TOOLTIP :{BLACK}Alterna a paleta do NewGRF selecionado.{}Faça isso quando os gráficos deste ficarem rosa durante o jogo
+STR_NEWGRF_SETTINGS_SHOW_PARAMETERS :{BLACK}Mostrar parâmetros
+STR_NEWGRF_SETTINGS_TOGGLE_PALETTE :{BLACK}Mostrar paleta
+STR_NEWGRF_SETTINGS_TOGGLE_PALETTE_TOOLTIP :{BLACK}Ativar a paleta do NewGRF selecionado.{}Faça isso quando os gráficos deste ficarem rosa durante o jogo
STR_NEWGRF_SETTINGS_APPLY_CHANGES :{BLACK}Aplicar alterações
STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_BUTTON :{BLACK}Procurar o conteúdo on-line
@@ -3567,7 +3568,7 @@ STR_NEWGRF_BROKEN_CAPACITY :{WHITE}A capaci
STR_BROKEN_VEHICLE_LENGTH :{WHITE}Trem '{VEHICLE}' de '{COMPANY}' tem um tamanho inválido. Provavelmente causado por um NewGRF. O jogo pode travar ou sair de sincronia
STR_NEWGRF_BUGGY :{WHITE}O NewGRF '{0:STRING}' retorna informação incorreta
-STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Informação de carga/readaptação para '{1:ENGINE}' difere da lista de aquisição após a construção. Isso pode causar a autorenovação/-substituição à falhar a readaptação corretamente.
+STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}A informação de carga/adaptação para '{1:ENGINE}' difere da lista de aquisição depois da construção. Isto poderá causar problemas ao adaptar quando for renovado/substituído automaticamente
STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' causou um loop infinito no callback da produção
STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Retorno {1:HEX} retornou um resultado desconhecido/inválido {2:HEX}
STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' retornou tipo de carga inválido no retorno de chamada de produção em {2:HEX}
@@ -3590,8 +3591,8 @@ STR_NEWGRF_SCAN_ARCHIVES :Procurando arqu
# Sign list window
STR_SIGN_LIST_CAPTION :{WHITE}Lista de Placas - {COMMA} Placa{P "" s}
-STR_SIGN_LIST_MATCH_CASE :{BLACK}Diferenciar caixa alta
-STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Ativa/Desativa a diferenciação de caixa alta na comparação dos nomes pelo filtro
+STR_SIGN_LIST_MATCH_CASE :{BLACK}Diferenciar maiúsculas/minúsculas
+STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Ativar correspondência de maiúsculas/minúsculas na comparação dos nomes com a sequência fornecida
# Sign window
STR_EDIT_SIGN_CAPTION :{WHITE}Editar texto da placa
@@ -3613,9 +3614,9 @@ STR_TOWN_POPULATION :{BLACK}Populaç
STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN}
STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Cidade)
STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}População: {ORANGE}{COMMA}{BLACK} Casas: {ORANGE}{COMMA}
-STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} últ. mês: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA}
+STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} último mês: {ORANGE}{COMMA}{BLACK} máx: {ORANGE}{COMMA}
STR_TOWN_VIEW_CARGO_LAST_MINUTE_MAX :{BLACK}{CARGO_LIST} último minuto: {ORANGE}{COMMA}{BLACK} máx: {ORANGE}{COMMA}
-STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Carga necessária para prover o crescimento:
+STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Carga necessária para o crescimento da localidade:
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} necessário(a)
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} necessário no inverno
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{ORANGE}{STRING}{GREEN} entregues
@@ -3625,7 +3626,7 @@ STR_TOWN_VIEW_TOWN_GROWS_EVERY :{BLACK}Localida
STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}Localidade cresce a cada {ORANGE}{UNITS_DAYS_OR_SECONDS} (financiada)
STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}A cidade {RED}não{BLACK} está crescendo
STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Limite de ruído na cidade: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA}
-STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na localidade. Ctrl+Clique abre uma nova visualização na posição da localidade
+STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na posição da localidade. Ctrl+Clique abre uma nova visualização na posição da localidade
STR_TOWN_VIEW_LOCAL_AUTHORITY_BUTTON :{BLACK}Autoridade Local
STR_TOWN_VIEW_LOCAL_AUTHORITY_TOOLTIP :{BLACK}Mostrar informações sobre a autoridade local
STR_TOWN_VIEW_RENAME_TOOLTIP :{BLACK}Renomear cidade
@@ -3641,7 +3642,7 @@ STR_TOWN_VIEW_RENAME_TOWN_BUTTON :Renomear Cidade
STR_LOCAL_AUTHORITY_CAPTION :{WHITE}{TOWN} autoridade local
STR_LOCAL_AUTHORITY_ZONE :{BLACK}Zona
STR_LOCAL_AUTHORITY_ZONE_TOOLTIP :{BLACK}Mostrar a zona dentro dos limites da autoridade local
-STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}Avaliações das empresas
+STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}Classificações das empresas de transporte:
STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING}
STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}Ações disponíveis:
STR_LOCAL_AUTHORITY_ACTIONS_TOOLTIP :{BLACK}Lista de ações disponíveis desta cidade - clique no item para mais detalhes
@@ -3673,16 +3674,16 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{Y
# Goal window
STR_GOALS_CAPTION :{WHITE}{COMPANY} Objetivos
STR_GOALS_SPECTATOR_CAPTION :{WHITE}Objetivos globais
-STR_GOALS_SPECTATOR :Objetivos Globais
+STR_GOALS_SPECTATOR :Metas Globais
STR_GOALS_GLOBAL_BUTTON :{BLACK}Globais
-STR_GOALS_GLOBAL_BUTTON_HELPTEXT :{BLACK}Mostra objetivos globais
+STR_GOALS_GLOBAL_BUTTON_HELPTEXT :{BLACK}Mostrar as metas globais
STR_GOALS_COMPANY_BUTTON :{BLACK}Empresa
-STR_GOALS_COMPANY_BUTTON_HELPTEXT :{BLACK}Mostra objetivos da empresa
+STR_GOALS_COMPANY_BUTTON_HELPTEXT :{BLACK}Mostrar as metas da empresa
STR_GOALS_TEXT :{ORANGE}{STRING}
-STR_GOALS_NONE :{G=m}{ORANGE}- Nenhum -
+STR_GOALS_NONE :{ORANGE}- Nenhum -
STR_GOALS_PROGRESS :{ORANGE}{STRING}
STR_GOALS_PROGRESS_COMPLETE :{GREEN}{STRING}
-STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Clique no objetivo para centrar a vista principal na indústria/localidade/quadrado. Ctrl+Clique abre uma nova vista na localização da indústria/localidade/quadrado
+STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Clique no objetivo para centrar a vista principal na indústria/localidade/quadrado. Ctrl+Clique abre uma nova visualização na localização da indústria/localidade/quadrado
# Goal question window
STR_GOAL_QUESTION_CAPTION_QUESTION :{BLACK}Pergunta
@@ -3743,7 +3744,7 @@ STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE :{BLACK}Manter C
STR_STATION_LIST_CAPTION :{WHITE}{COMPANY} - {COMMA} Estações
STR_STATION_LIST_STATION :{YELLOW}{STATION} {STATION_FEATURES}
STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOINT}
-STR_STATION_LIST_NONE :{G=m}{YELLOW}- Nenhum -
+STR_STATION_LIST_NONE :{YELLOW}- Nenhum -
STR_STATION_LIST_SELECT_ALL_FACILITIES :{BLACK}Selecionar todas as instalações
STR_STATION_LIST_SELECT_ALL_TYPES :{BLACK}Selecionar todos os tipos de carga (inclusive as que não tem espera)
STR_STATION_LIST_NO_WAITING_CARGO :{BLACK}Não há carga de nenhum tipo aguardando
@@ -3754,16 +3755,16 @@ STR_STATION_VIEW_WAITING_CARGO :{WHITE}{CARGO_L
STR_STATION_VIEW_RESERVED :{YELLOW}({CARGO_SHORT} reservado para carregamento)
STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Aceita
-STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Exibir lista de carga aceita
+STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Mostrar lista de carga aceita
STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Aceita: {WHITE}{CARGO_LIST}
-STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Essa estação tem direitos de transporte exclusivos nessa cidade.
+STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Essa estação tem direitos exclusivos de transporte nessa cidade.
STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} adquiriu direitos exclusivos de transporte nessa cidade.
-STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Avaliações
-STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Exibir avaliações da estação
-STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MONTH :{BLACK}Suprimento por mês e classificação local:
-STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MINUTE :{BLACK}Suprimento por minuto e classificação local:
+STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Classificações
+STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Mostrar classificações da estação
+STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MONTH :{BLACK}Fornecimento por mês e avaliação local:
+STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MINUTE :{BLACK}Fornecimento por minuto e avaliação local:
STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}: {YELLOW}{COMMA} / {STRING} ({COMMA}%)
STR_STATION_VIEW_GROUP :{BLACK}Agrupar por
@@ -3799,13 +3800,13 @@ STR_CARGO_RATING_VERY_GOOD :Muito Bom
STR_CARGO_RATING_EXCELLENT :Excelente
STR_CARGO_RATING_OUTSTANDING :Proeminente
-STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na localização da estação. Ctrl+Clique abre uma nova visualização na localização da estação
+STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na posição da estação. Ctrl+Clique abre uma nova visualização na posição da estação
STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Alterar o nome da estação
-STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Exibir todos os trens que possuem esta estação nas ordens de serviço
-STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Exibir todos os automóveis que possuem esta estação nas ordens de serviço
-STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Exibir todas as aeronaves que possuem esta estação nas ordens de serviço
-STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Exibir todas as embarcações que possuem esta estação nas ordens de serviço
+STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Mostrar todos os trens que têm esta estação na sua programação
+STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Mostrar todos os veículos rodoviários que têm esta estação na sua programação
+STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Mostrar todas as aeronaves que têm esta estação na sua programação
+STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Exibir todas as embarcações que têm esta estação na sua programação
STR_STATION_VIEW_RENAME_STATION_CAPTION :Renomear estação/área de carga
@@ -3814,9 +3815,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Impedir
# Waypoint/buoy view window
STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT}
-STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na localização do ponto de controle. Ctrl+Clique abre uma nova visualização na localização do ponto de controle
+STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na posição do ponto de controle. Ctrl+Clique abre uma nova visualização na posição do ponto de controle
STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Renomear ponto de controle
-STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na localização da bóia. Ctrl+Clique abre uma nova visualização na localização da bóia
+STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na posição da bóia. Ctrl+Clique abre uma nova visualização na posição da bóia
STR_BUOY_VIEW_CHANGE_BUOY_NAME :{BLACK}Renomear bóia
STR_EDIT_WAYPOINT_NAME :{WHITE}Editar nome do ponto de controle
@@ -3873,10 +3874,10 @@ STR_COMPANY_VIEW_PRESIDENT_MANAGER_TITLE :{WHITE}{PRESIDE
STR_COMPANY_VIEW_INAUGURATED_TITLE :{GOLD}Inaugurado: {WHITE}{NUM}
STR_COMPANY_VIEW_COLOUR_SCHEME_TITLE :{GOLD}Cores:
STR_COMPANY_VIEW_VEHICLES_TITLE :{GOLD}Veículos:
-STR_COMPANY_VIEW_TRAINS :{WHITE}{COMMA} tre{P m ns}
+STR_COMPANY_VIEW_TRAINS :{WHITE}{COMMA} trem{P "" s}
STR_COMPANY_VIEW_ROAD_VEHICLES :{WHITE}{COMMA} automóve{P l is}
STR_COMPANY_VIEW_AIRCRAFT :{WHITE}{COMMA} aeronave{P "" s}
-STR_COMPANY_VIEW_SHIPS :{WHITE}{COMMA} embarcaç{P ão ões}
+STR_COMPANY_VIEW_SHIPS :{WHITE}{COMMA} navio{P "" s}
STR_COMPANY_VIEW_VEHICLES_NONE :{WHITE}Nenhum
STR_COMPANY_VIEW_COMPANY_VALUE :{GOLD}Valor da empresa: {WHITE}{CURRENCY_LONG}
STR_COMPANY_VIEW_INFRASTRUCTURE :{GOLD}Infraestrutura:
@@ -3890,20 +3891,20 @@ STR_COMPANY_VIEW_INFRASTRUCTURE_NONE :{WHITE}Nenhum
STR_COMPANY_VIEW_BUILD_HQ_BUTTON :{BLACK}Construir sede
STR_COMPANY_VIEW_BUILD_HQ_TOOLTIP :{BLACK}Construir sede da companhia
STR_COMPANY_VIEW_VIEW_HQ_BUTTON :{BLACK}Ver sede
-STR_COMPANY_VIEW_VIEW_HQ_TOOLTIP :{BLACK}Ver sede da companhia
+STR_COMPANY_VIEW_VIEW_HQ_TOOLTIP :{BLACK}Ver sede da empresa
STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Mover sede
STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Reconstruir sede da empresa em outro local por 1% do valor da empresa. Shift+Clique mostra o preço estimado sem reconstruir a sede
STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}Detalhes
-STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Ver informações detalhadas de infraestrutura
+STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Ver informações detalhadas da infraestrutura
STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :{BLACK}Dar dinheiro
-STR_COMPANY_VIEW_GIVE_MONEY_TOOLTIP :{BLACK}Dá dinheiro a essa empresa
+STR_COMPANY_VIEW_GIVE_MONEY_TOOLTIP :{BLACK}Dar dinheiro a essa empresa
STR_COMPANY_VIEW_HOSTILE_TAKEOVER_BUTTON :{BLACK}Aquisição hostil
STR_COMPANY_VIEW_HOSTILE_TAKEOVER_TOOLTIP :{BLACK}Fazer a aquisição hostil desta empresa
STR_COMPANY_VIEW_NEW_FACE_BUTTON :{BLACK}Novo Rosto
STR_COMPANY_VIEW_NEW_FACE_TOOLTIP :{BLACK}Selecionar novo rosto para o presidente
STR_COMPANY_VIEW_COLOUR_SCHEME_BUTTON :{BLACK}Cores
-STR_COMPANY_VIEW_COLOUR_SCHEME_TOOLTIP :{BLACK}Alterar cores dos veículos
+STR_COMPANY_VIEW_COLOUR_SCHEME_TOOLTIP :{BLACK}Alterar cores dos veículos da empresa
STR_COMPANY_VIEW_COMPANY_NAME_BUTTON :{BLACK}Empresa
STR_COMPANY_VIEW_COMPANY_NAME_TOOLTIP :{BLACK}Alterar nome da empresa
STR_COMPANY_VIEW_PRESIDENT_NAME_BUTTON :{BLACK}Presidente
@@ -4049,18 +4050,18 @@ STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nova Locomotiva
STR_BUY_VEHICLE_TRAIN_MONORAIL_CAPTION :Nova Locomotiva Monotrilho
STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :Nova Locomotiva Maglev
-STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Novos Automóveis
-STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :Novo Veículo Elétrico
+STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Novos Veículos Rodoviários
+STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :Novos Veículos tipo Bonde
# Vehicle availability
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Trens
-STR_BUY_VEHICLE_ROAD_VEHICLE_ALL_CAPTION :Novo Veículo Terrestre
+STR_BUY_VEHICLE_ROAD_VEHICLE_ALL_CAPTION :Novos Veículos Rodoviários
STR_BUY_VEHICLE_SHIP_CAPTION :Novas Embarcações
STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Nova Aeronave
STR_PURCHASE_INFO_COST_WEIGHT :{BLACK}Preço: {GOLD}{CURRENCY_LONG}{BLACK} Peso: {GOLD}{WEIGHT_SHORT}
-STR_PURCHASE_INFO_COST_REFIT_WEIGHT :{BLACK}Custo: {GOLD}{CURRENCY_LONG}{BLACK} (Custo de Troca: {GOLD}{CURRENCY_LONG}{BLACK}) Peso: {GOLD}{WEIGHT_SHORT}
+STR_PURCHASE_INFO_COST_REFIT_WEIGHT :{BLACK}Custo: {GOLD}{CURRENCY_LONG}{BLACK} (Custo de Adaptação: {GOLD}{CURRENCY_LONG}{BLACK}) Peso: {GOLD}{WEIGHT_SHORT}
STR_PURCHASE_INFO_SPEED_POWER :{BLACK}Velocidade: {GOLD}{VELOCITY}{BLACK} Potência: {GOLD}{POWER}
STR_PURCHASE_INFO_SPEED :{BLACK}Velocidade: {GOLD}{VELOCITY}
STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}Velocidade em oceanos: {GOLD}{VELOCITY}
@@ -4072,10 +4073,10 @@ STR_PURCHASE_INFO_REFITTABLE :(adaptável)
STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Desenvolvida: {GOLD}{NUM}{BLACK} Vida: {GOLD}{COMMA} ano{P "" s}
STR_PURCHASE_INFO_RELIABILITY :{BLACK}Confiabilidade Máx.: {GOLD}{COMMA}%
STR_PURCHASE_INFO_COST :{BLACK}Preço: {GOLD}{CURRENCY_LONG}
-STR_PURCHASE_INFO_COST_REFIT :{BLACK}Custo: {GOLD}{CURRENCY_LONG}{BLACK} (Custo para Reequipar: {GOLD}{CURRENCY_LONG}{BLACK})
+STR_PURCHASE_INFO_COST_REFIT :{BLACK}Custo: {GOLD}{CURRENCY_LONG}{BLACK} (Custo de Adaptação: {GOLD}{CURRENCY_LONG}{BLACK})
STR_PURCHASE_INFO_WEIGHT_CWEIGHT :{BLACK}Peso: {GOLD}{WEIGHT_SHORT} ({WEIGHT_SHORT})
STR_PURCHASE_INFO_COST_SPEED :{BLACK}Preço: {GOLD}{CURRENCY_LONG}{BLACK} Velocidade: {GOLD}{VELOCITY}
-STR_PURCHASE_INFO_COST_REFIT_SPEED :{BLACK}Custo: {GOLD}{CURRENCY_LONG}{BLACK} (Custo de Troca: {GOLD}{CURRENCY_LONG}{BLACK}) Velocidade: {GOLD}{VELOCITY}
+STR_PURCHASE_INFO_COST_REFIT_SPEED :{BLACK}Custo: {GOLD}{CURRENCY_LONG}{BLACK} (Custo de Adaptação: {GOLD}{CURRENCY_LONG}{BLACK}) Velocidade: {GOLD}{VELOCITY}
STR_PURCHASE_INFO_AIRCRAFT_CAPACITY :{BLACK}Capacidade: {GOLD}{CARGO_LONG}, {CARGO_LONG}
STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK}Vagões energizados: {GOLD}+{POWER}{BLACK} Peso: {GOLD}+{WEIGHT_SHORT}
STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Adaptável para: {GOLD}{STRING}
@@ -4105,10 +4106,10 @@ STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Comprar
STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Comprar Aeronave
###length VEHICLE_TYPES
-STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e reequipar veículo
-STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e Reequipar Veículo
-STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e Repor Navio
-STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e reequipar aeronaves
+STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e adaptar veículo
+STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e Adaptar Veículo
+STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e Adaptar Embarcação
+STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e Adaptar Aeronaves
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar o veículo ferroviário selecionado. Pressionar Shift mostra o custo estimado
@@ -4117,10 +4118,10 @@ STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar
STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar aeronave selecionada. Pressionar Shift mostra o custo estimado
###length VEHICLE_TYPES
-STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Compra e modifica o trem selecionado. Pressionar Shift mostra o custo estimado
-STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e converter o veículo rodoviário selecionado. Pressionar Shift mostra o custo estimado
-STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e converter a embarcação selecionada. Pressionar Shift mostra o custo estimado
-STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e converter a aeronave selecionada. Pressionar Shift mostra o custo estimado
+STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e adaptar o veículo ferroviário selecionado. Pressionar Shift mostra o custo estimado
+STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e adaptar o veículo rodoviário selecionado. Pressionar Shift mostra o custo estimado
+STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e adaptar a embarcação selecionada. Pressionar Shift mostra o custo estimado
+STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e adaptar a aeronave selecionada. Pressionar Shift mostra o custo estimado
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Renomear
@@ -4130,7 +4131,7 @@ STR_BUY_VEHICLE_AIRCRAFT_RENAME_BUTTON :{BLACK}Renomear
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_RENAME_TOOLTIP :{BLACK}Renomear tipo de veículo ferroviário
-STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_TOOLTIP :{BLACK}Renomear tipo do automóvel
+STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_TOOLTIP :{BLACK}Renomear tipo de veículo rodoviário
STR_BUY_VEHICLE_SHIP_RENAME_TOOLTIP :{BLACK}Renomear tipo de embarcação
STR_BUY_VEHICLE_AIRCRAFT_RENAME_TOOLTIP :{BLACK}Renomear tipo de aeronave
@@ -4144,13 +4145,13 @@ STR_BUY_VEHICLE_AIRCRAFT_HIDE_TOGGLE_BUTTON :{BLACK}Ocultar
STR_BUY_VEHICLE_TRAIN_SHOW_TOGGLE_BUTTON :{BLACK}Exibir
STR_BUY_VEHICLE_ROAD_VEHICLE_SHOW_TOGGLE_BUTTON :{BLACK}Exibir
STR_BUY_VEHICLE_SHIP_SHOW_TOGGLE_BUTTON :{BLACK}Exibir
-STR_BUY_VEHICLE_AIRCRAFT_SHOW_TOGGLE_BUTTON :{BLACK}Exibir
+STR_BUY_VEHICLE_AIRCRAFT_SHOW_TOGGLE_BUTTON :{BLACK}Mostrar
###length VEHICLE_TYPES
-STR_BUY_VEHICLE_TRAIN_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Alterna a exibição do tipo de trem
-STR_BUY_VEHICLE_ROAD_VEHICLE_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Alterna a exibição do tipo de automóvel
-STR_BUY_VEHICLE_SHIP_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Alterna a exibição do tipo de navio
-STR_BUY_VEHICLE_AIRCRAFT_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Alterna a exibição do tipo de aeronave
+STR_BUY_VEHICLE_TRAIN_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Ativa ocultar/exibir o tipo de veículo ferroviário
+STR_BUY_VEHICLE_ROAD_VEHICLE_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Ativa ocultar/exibir o tipo de veículo rodoviário
+STR_BUY_VEHICLE_SHIP_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Ativa ocultar/exibir o tipo de embarcação
+STR_BUY_VEHICLE_AIRCRAFT_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Ativa ocultar/exibir o tipo de aeronave
###length VEHICLE_TYPES
STR_QUERY_RENAME_TRAIN_TYPE_CAPTION :{WHITE}Renomear tipo de veículo ferroviário
@@ -4281,10 +4282,10 @@ STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES :{YELLOW}Veícul
STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES_TOOLTIP :{BLACK}Coluna com os veículos disponíveis para substituição
###length VEHICLE_TYPES
-STR_REPLACE_VEHICLE_TRAIN :{G=m}Trem
-STR_REPLACE_VEHICLE_ROAD_VEHICLE :{G=m}Automóvel
-STR_REPLACE_VEHICLE_SHIP :{G=m}Embarcação
-STR_REPLACE_VEHICLE_AIRCRAFT :{G=f}Aeronave
+STR_REPLACE_VEHICLE_TRAIN :Trem
+STR_REPLACE_VEHICLE_ROAD_VEHICLE :Veículo rodoviário
+STR_REPLACE_VEHICLE_SHIP :Embarcação
+STR_REPLACE_VEHICLE_AIRCRAFT :Aeronave
STR_REPLACE_HELP_LEFT_ARRAY :{BLACK}Selecionar o tipo de motor para substituir
STR_REPLACE_HELP_RIGHT_ARRAY :{BLACK}Selecionar o novo tipo de motor para substituir o que selecionou à esquerda
@@ -4299,7 +4300,7 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} quando
STR_REPLACE_VEHICLES_STOP :{BLACK}Parar Substituição
STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Pressione para parar a subsituição do tipo de motor que selecionou à esquerda
-STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Alterna entre janelas de substituir locomotivas e substituir vagões
+STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Alternar entre a janela de substituição de locomotivas e a de substituição de vagões
STR_REPLACE_ENGINES :Motores
STR_REPLACE_WAGONS :Vagões
STR_REPLACE_ALL_RAILTYPE :Todos os veículos ferroviários
@@ -4351,15 +4352,15 @@ STR_VEHICLE_VIEW_ORDER_LOCATION_TOOLTIP :{BLACK}Centrar
###length VEHICLE_TYPES
STR_VEHICLE_VIEW_TRAIN_REFIT_TOOLTIP :{BLACK}Adaptar trem para um tipo de carga diferente
-STR_VEHICLE_VIEW_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Adaptar automóvel para carregar tipo de carga diferente
+STR_VEHICLE_VIEW_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Adaptar veículo rodoviário para transportar um tipo de carga diferente
STR_VEHICLE_VIEW_SHIP_REFIT_TOOLTIP :{BLACK}Adaptar a embarcação para transportar uma carga diferente
STR_VEHICLE_VIEW_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Adaptar aeronave para transportar uma carga diferente
###length VEHICLE_TYPES
-STR_VEHICLE_VIEW_TRAIN_ORDERS_TOOLTIP :{BLACK}Exibe ordens do trem. Ctrl+Clique para exibir o plano de horário
-STR_VEHICLE_VIEW_ROAD_VEHICLE_ORDERS_TOOLTIP :{BLACK}Exibe ordens do veículo. Ctrl+Clique para exibir o plano de horário
-STR_VEHICLE_VIEW_SHIP_ORDERS_TOOLTIP :{BLACK}Exibe ordens da embarcação. Ctrl+Clique para exibir o plano de horário
-STR_VEHICLE_VIEW_AIRCRAFT_ORDERS_TOOLTIP :{BLACK}Exibe ordens da aeronave. Ctrl+Clique para exibir o plano de horário
+STR_VEHICLE_VIEW_TRAIN_ORDERS_TOOLTIP :{BLACK}Mostrar ordens do trem. Ctrl+Clique para mostrar a tabela de horários do trem
+STR_VEHICLE_VIEW_ROAD_VEHICLE_ORDERS_TOOLTIP :{BLACK}Mostrar ordens do veículo. Ctrl+Clique para mostrar a tabela de horários do veículo
+STR_VEHICLE_VIEW_SHIP_ORDERS_TOOLTIP :{BLACK}Mostrar ordens da embarcação. Ctrl+Clique para mostrar a tabela de horários da embarcação
+STR_VEHICLE_VIEW_AIRCRAFT_ORDERS_TOOLTIP :{BLACK}Mostrar ordens da aeronave. Ctrl+Clique para mostrar o plano de horários da aeronave
###length VEHICLE_TYPES
STR_VEHICLE_VIEW_TRAIN_SHOW_DETAILS_TOOLTIP :{BLACK}Exibe detalhes do trem
@@ -4376,6 +4377,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Ação a
# Messages in the start stop button in the vehicle view
STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Carregando / descarregando
STR_VEHICLE_STATUS_LEAVING :{LTBLUE}Saindo
+STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}Esperando para desagrupar
STR_VEHICLE_STATUS_CRASHED :{RED}Acidentado!
STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}Quebrado
STR_VEHICLE_STATUS_STOPPED :{RED}Parado
@@ -4389,6 +4391,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}Sem ord
STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Indo para {WAYPOINT}, {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}Indo para {DEPOT}. {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Manutenção em {DEPOT}. {VELOCITY}
+STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}Desagrupar e efetuar manutenção em {DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}Não é possível alcançar {STATION}, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}Não é possível alcançar {WAYPOINT}, {VELOCITY}
@@ -4475,30 +4478,30 @@ STR_VEHICLE_DETAILS_CARGO_FROM :{LTBLUE}{CARGO_
STR_VEHICLE_DETAILS_CARGO_FROM_MULT :{LTBLUE}{CARGO_LONG} de {STATION} (x{NUM})
STR_VEHICLE_DETAIL_TAB_CARGO :{BLACK}Carga
-STR_VEHICLE_DETAILS_TRAIN_CARGO_TOOLTIP :{BLACK}Exibir detalhes da carga transportada
+STR_VEHICLE_DETAILS_TRAIN_CARGO_TOOLTIP :{BLACK}Mostrar detalhes da carga transportada
STR_VEHICLE_DETAIL_TAB_INFORMATION :{BLACK}Informação
-STR_VEHICLE_DETAILS_TRAIN_INFORMATION_TOOLTIP :{BLACK}Exibir detalhes dos veículos
+STR_VEHICLE_DETAILS_TRAIN_INFORMATION_TOOLTIP :{BLACK}Mostrar detalhes dos veículos ferroviários
STR_VEHICLE_DETAIL_TAB_CAPACITIES :{BLACK}Capacidades
-STR_VEHICLE_DETAILS_TRAIN_CAPACITIES_TOOLTIP :{BLACK}Exibir capacidades de cada veículo
+STR_VEHICLE_DETAILS_TRAIN_CAPACITIES_TOOLTIP :{BLACK}Mostar capacidade de cada veículo
STR_VEHICLE_DETAIL_TAB_TOTAL_CARGO :{BLACK}Carga Total
-STR_VEHICLE_DETAILS_TRAIN_TOTAL_CARGO_TOOLTIP :{BLACK}Exibir capacidade total do trem, dividir por tipo de carga
+STR_VEHICLE_DETAILS_TRAIN_TOTAL_CARGO_TOOLTIP :{BLACK}Mostrar capacidade total do trem, separada por tipo de carga
STR_VEHICLE_DETAILS_TRAIN_ARTICULATED_RV_CAPACITY :{BLACK}Capacidade: {LTBLUE}
# Vehicle refit
STR_REFIT_CAPTION :{WHITE}{VEHICLE} (Adaptar)
-STR_REFIT_TITLE :{GOLD}Selecionar tipo de carga:
+STR_REFIT_TITLE :{GOLD}Selecionar tipo de carga para transportar:
STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Nova capacidade: {GOLD}{CARGO_LONG}{}{BLACK}Custo da adaptação: {RED}{CURRENCY_LONG}
STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}Nova capacidade: {GOLD}{CARGO_LONG}{}{BLACK}Lucro vindo da adaptação: {GREEN}{CURRENCY_LONG}
STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Nova capacidade: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Custo da adaptação: {RED}{CURRENCY_LONG}
STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Nova capacidade: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Lucro da adaptação: {GREEN}{CURRENCY_LONG}
-STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Selecione os veículos para modificar. Clique+Arrastar para selecionar vários veículos. Clique em espaço vazio para selecionar todo o veículo. Ctrl+Clique para selecionar um veículo e a sequência restante
+STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Selecione os veículos para adaptar. Clique+Arraste para selecionar vários veículos. Clique em um espaço vazio para selecionar todo o veículo. Ctrl+Clique para selecionar um veículo e a sequência restante
###length VEHICLE_TYPES
-STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para o trem
-STR_REFIT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para o automóvel
-STR_REFIT_SHIP_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para a embarcação
-STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para a aeronave
+STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para o trem transportar
+STR_REFIT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para o veículo rodoviário transportar
+STR_REFIT_SHIP_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para a embarcação transportar
+STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para a aeronave transportar
###length VEHICLE_TYPES
STR_REFIT_TRAIN_REFIT_BUTTON :{BLACK}Adaptar trem
@@ -4507,18 +4510,19 @@ STR_REFIT_SHIP_REFIT_BUTTON :{BLACK}Adaptar
STR_REFIT_AIRCRAFT_REFIT_BUTTON :{BLACK}Adaptar aeronave
###length VEHICLE_TYPES
-STR_REFIT_TRAIN_REFIT_TOOLTIP :{BLACK}Adapta trem para transportar a carga selecionada
+STR_REFIT_TRAIN_REFIT_TOOLTIP :{BLACK}Adaptar trem para transportar a carga selecionada
STR_REFIT_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Adaptar automóvel para carregar o tipo de carga selecionado
STR_REFIT_SHIP_REFIT_TOOLTIP :{BLACK}Adaptar embarcação para transportar a carga selecionada
STR_REFIT_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Adaptar aeronave para transportar a carga selecionada
# Order view
STR_ORDERS_CAPTION :{WHITE}{VEHICLE} (Ordens)
-STR_ORDERS_TIMETABLE_VIEW :{BLACK}Plano de horário
-STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Exibe o plano de horário
+STR_ORDERS_TIMETABLE_VIEW :{BLACK}Horário
+STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Mudar para a visão de horários
STR_ORDERS_LIST_TOOLTIP :{BLACK}Lista de ordens - clique em uma ordem para selecionar. Ctrl+Clique mostra o destino da ordem
STR_ORDER_INDEX :{COMMA}:{NBSP}
+STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING}
STR_ORDERS_END_OF_ORDERS :- - Fim de Ordens - -
STR_ORDERS_END_OF_SHARED_ORDERS :- - Fim de Ordens Compartilhadas - -
@@ -4531,10 +4535,10 @@ STR_ORDER_GO_VIA :Vá via
STR_ORDER_GO_NON_STOP_VIA :Ir sem parar via
STR_ORDER_TOOLTIP_NON_STOP :{BLACK}Altera a instrução de paradas da ordem selecionada
-STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}Carregar qualquer carga
+STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}Carregar completamente com qualquer carga
STR_ORDER_DROP_LOAD_IF_POSSIBLE :Carregar se disponível
-STR_ORDER_DROP_FULL_LOAD_ALL :Carregar tudo
-STR_ORDER_DROP_FULL_LOAD_ANY :Carregar completamente qualquer carga
+STR_ORDER_DROP_FULL_LOAD_ALL :Carregar completamente com todas as cargas
+STR_ORDER_DROP_FULL_LOAD_ANY :Carregar completamente com qualquer carga
STR_ORDER_DROP_NO_LOADING :Não carregar
STR_ORDER_TOOLTIP_FULL_LOAD :{BLACK}Altera a instrução de carregamento da ordem selecionada
@@ -4547,14 +4551,23 @@ STR_ORDER_TOOLTIP_UNLOAD :{BLACK}Altera a
STR_ORDER_REFIT :{BLACK}Adaptar
STR_ORDER_REFIT_TOOLTIP :{BLACK}Selecionar a adaptação na ordem atual. CTRL + Clique para remover a instrução
-STR_ORDER_REFIT_AUTO :{BLACK}Reformar na estação
-STR_ORDER_REFIT_AUTO_TOOLTIP :{BLACK}Selecione o tipo de carga para o qual reformar nessa ordem. Ctrl+clique para remover a ordem de reforma. Reforma apenas será feita se o veículo permitir
+STR_ORDER_REFIT_AUTO :{BLACK}Adaptar na estação
+STR_ORDER_REFIT_AUTO_TOOLTIP :{BLACK}Selecione o tipo de mercadoria para o qual adaptar nesta ordem. Ctrl+Clique para remover ordem de adaptação. Adaptação em estações será realizada somente se o veículo aceitar
STR_ORDER_DROP_REFIT_AUTO :Carga fixa
-STR_ORDER_DROP_REFIT_AUTO_ANY :Cargas disponíveis
+STR_ORDER_DROP_REFIT_AUTO_ANY :Carga disponível
STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ir sempre
STR_ORDER_DROP_SERVICE_DEPOT :Manutenção, se necessária
STR_ORDER_DROP_HALT_DEPOT :Parar
+STR_ORDER_DROP_UNBUNCH :Desagrupar
+
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Selecionar qual ação executar nesse depósito
+STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Selecionar qual ação executar nesse depósito
+STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Selecionar qual ação executar nesse depósito
+STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Selecionar qual ação executar nesse hangar
+###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dados do veículo no qual se basear para pular ordem
@@ -4599,7 +4612,7 @@ STR_ORDER_CONDITIONAL :Pulo de ordem c
STR_ORDER_SHARE :Compartilhar ordens
STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Insirir uma nova ordem antes da ordem selecionada ou adicionar ao final da lista. Ctrl+Clique em uma estação para "carregar totalmente qualquer carga", em um ponto de controle para "sem parar" ou em um depósito para "manutenção". Clique em outro veículo para copiar suas ordens ou Ctrl+Clique compartilha as ordens. Uma ordem de depósito desativa a manutenção automática do veículo
-STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Exibir todos os veículos com a mesma rota
+STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Mostrar todos os veículos que compartilham essa programação
# String parts to build the order string
STR_ORDER_GO_TO_WAYPOINT :Ir via {WAYPOINT}
@@ -4623,6 +4636,7 @@ STR_ORDER_REFIT_ORDER :(Adaptar para {
STR_ORDER_REFIT_STOP_ORDER :(Adaptar a {STRING} e parar)
STR_ORDER_STOP_ORDER :(Parar)
+STR_ORDER_WAIT_TO_UNBUNCH :(esperar para desagrupar)
STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING}
STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Não pode usar a estação){POP_COLOUR} {STRING} {STATION} {STRING}
@@ -4630,7 +4644,7 @@ STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{R
STR_ORDER_IMPLICIT :(Implícito)
STR_ORDER_FULL_LOAD :(Carregar completamente)
-STR_ORDER_FULL_LOAD_ANY :(Carregar completamente qualquer carga)
+STR_ORDER_FULL_LOAD_ANY :(Carregar completamente com qualquer carga)
STR_ORDER_NO_LOAD :(Não carregar)
STR_ORDER_UNLOAD :(Descarregar e tomar carga)
STR_ORDER_UNLOAD_FULL_LOAD :(Descarregar e esperar carregamento completo)
@@ -4638,27 +4652,27 @@ STR_ORDER_UNLOAD_FULL_LOAD_ANY :(Descarregar e
STR_ORDER_UNLOAD_NO_LOAD :(Descarregar e sair vazio)
STR_ORDER_TRANSFER :(Transferir e tomar carga)
STR_ORDER_TRANSFER_FULL_LOAD :(Transferir e esperar por carregamento completo)
-STR_ORDER_TRANSFER_FULL_LOAD_ANY :(Transferir e esperar por qualquer carregamento completo)
+STR_ORDER_TRANSFER_FULL_LOAD_ANY :(Transferir e aguardar por qualquer carregamento completo)
STR_ORDER_TRANSFER_NO_LOAD :(Transferir e sair vazio)
STR_ORDER_NO_UNLOAD :(Não descarregar e tomar carga)
STR_ORDER_NO_UNLOAD_FULL_LOAD :(Não descarregar e esperar carregamento completo)
STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY :(Não descarregar e esperar por qualquer carregamento completo)
STR_ORDER_NO_UNLOAD_NO_LOAD :(Não descarregar e não carregar)
-STR_ORDER_AUTO_REFIT :(Reformar para {STRING})
-STR_ORDER_FULL_LOAD_REFIT :(Carga completa com reforma para {STRING})
-STR_ORDER_FULL_LOAD_ANY_REFIT :(Qualquer carga completa com reforma para {STRING})
-STR_ORDER_UNLOAD_REFIT :(Descarregar e carregar com reforma para {STRING})
-STR_ORDER_UNLOAD_FULL_LOAD_REFIT :(Descarregar e aguardar carga completa com reforma para {STRING})
-STR_ORDER_UNLOAD_FULL_LOAD_ANY_REFIT :(Descarregar e aguardar qualquer carga completa com reforma para {STRING})
-STR_ORDER_TRANSFER_REFIT :(Transferir e carregar com reforma para {STRING})
-STR_ORDER_TRANSFER_FULL_LOAD_REFIT :(Transferir e aguardar carga completa com reforma para {STRING})
-STR_ORDER_TRANSFER_FULL_LOAD_ANY_REFIT :(Transferir e aguardar por qualquer carga completa com reforma para {STRING})
-STR_ORDER_NO_UNLOAD_REFIT :(Não descarregar e carregar com reforma para {STRING})
-STR_ORDER_NO_UNLOAD_FULL_LOAD_REFIT :(Não descarregar e aguardar carga completa com reforma para {STRING})
-STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY_REFIT :(Não descarregar e aguardar por qualquer carga completa com reforma para {STRING})
+STR_ORDER_AUTO_REFIT :(Adaptar para {STRING})
+STR_ORDER_FULL_LOAD_REFIT :(Carregar completamente com adaptação para {STRING})
+STR_ORDER_FULL_LOAD_ANY_REFIT :(Carregar completamente com qualquer carga com adaptação para {STRING})
+STR_ORDER_UNLOAD_REFIT :(Descarregar e carregar com adaptação para {STRING})
+STR_ORDER_UNLOAD_FULL_LOAD_REFIT :(Descarregar e aguardar por carregamento completo com adaptação para {STRING})
+STR_ORDER_UNLOAD_FULL_LOAD_ANY_REFIT :(Descarregar e aguardar por qualquer carregamento completo com adaptação para {STRING})
+STR_ORDER_TRANSFER_REFIT :(Transferir e carregar com adaptação para {STRING})
+STR_ORDER_TRANSFER_FULL_LOAD_REFIT :(Transferir e aguardar por carregamento completo com adaptação para {STRING})
+STR_ORDER_TRANSFER_FULL_LOAD_ANY_REFIT :(Transferir e aguardar por qualquer carregamento completo com adaptação para {STRING})
+STR_ORDER_NO_UNLOAD_REFIT :(Não descarregar e carregar com adaptação para {STRING})
+STR_ORDER_NO_UNLOAD_FULL_LOAD_REFIT :(Não descarregar e aguardar por caregamento completo com adaptação para {STRING})
+STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY_REFIT :(Não descarregar e aguardar por qualquer carregamento completo com adaptação para {STRING})
-STR_ORDER_AUTO_REFIT_ANY :cargas disponíveis
+STR_ORDER_AUTO_REFIT_ANY :carga disponível
###length 3
STR_ORDER_STOP_LOCATION_NEAR_END :[quase no fim]
@@ -4676,9 +4690,9 @@ STR_INVALID_ORDER :{RED} (Ordem In
# Time table window
STR_TIMETABLE_TITLE :{WHITE}{VEHICLE} (Horário)
STR_TIMETABLE_ORDER_VIEW :{BLACK}Ordens
-STR_TIMETABLE_ORDER_VIEW_TOOLTIP :{BLACK}Alternar para visão de ordens
+STR_TIMETABLE_ORDER_VIEW_TOOLTIP :{BLACK}Mudar para visualização de ordens
-STR_TIMETABLE_TOOLTIP :{BLACK}Horário - clique sobre uma ordem para destaca-la
+STR_TIMETABLE_TOOLTIP :{BLACK}Horário - clique em uma ordem para selecioná-la
STR_TIMETABLE_NO_TRAVEL :Não viajar
STR_TIMETABLE_NOT_TIMETABLEABLE :Viagem (automático; com horário marcado pela próxima ordem manual)
@@ -4701,34 +4715,34 @@ STR_TIMETABLE_STATUS_LATE :{BLACK}Este ve
STR_TIMETABLE_STATUS_EARLY :{BLACK}Este veículo está atualmente circulando {STRING} adiantado
STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Este horário ainda não começou
STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Essa ordem irá iniciar às {STRING}
-STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Essa ordem irá iniciar em {COMMA} segundos
+STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Este horário irá iniciar em {COMMA} segundos
-STR_TIMETABLE_START :{BLACK}Iniciar Ordem
-STR_TIMETABLE_START_TOOLTIP :{BLACK}Selecionar quando essa ordem inicia. Ctrl+Clique distribui igualmente a partida de todos os veículos que compartilham essa ordem com base em sua ordem relativa, se a ordem for totalmente programada
+STR_TIMETABLE_START :{BLACK}Iniciar Horário
+STR_TIMETABLE_START_TOOLTIP :{BLACK}Selecione quando esse horário começa. Ctrl+Clique distribui igualmente a partida de todos os veículos que compartilham essa ordem com base em sua ordem relativa, se a ordem for totalmente programada
-STR_TIMETABLE_START_SECONDS_QUERY :Segundos até a ordem iniciar
+STR_TIMETABLE_START_SECONDS_QUERY :Segundos até o horário iniciar
-STR_TIMETABLE_CHANGE_TIME :{BLACK}Mudar horário
+STR_TIMETABLE_CHANGE_TIME :{BLACK}Mudar Tempo
STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Mudar a duração do tempo que a ordem em destaque deve durar. Ctrl+Clique define o tempo para todas as ordens
-STR_TIMETABLE_CLEAR_TIME :{BLACK}Limpar Horário
-STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Limpar a duração do tempo da ordem selecionada. Ctrl+Clique limpa o tempo para todas as ordens
+STR_TIMETABLE_CLEAR_TIME :{BLACK}Apagar Tempo
+STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Limpar a duração do tempo da ordem selecionada. Ctrl+Clique limpa o tempo de todas as ordens
-STR_TIMETABLE_CHANGE_SPEED :{BLACK}Alterar Limite de Vel.
-STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Altera a velocidade máxima de viagem para a ordem selecionada. Ctrl+Clique define a velocidade para todas as ordens
+STR_TIMETABLE_CHANGE_SPEED :{BLACK}Alterar limite de velocidade
+STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Alterar a velocidade máxima de viagem da ordem selecionada. Ctrl+Clique define a velocidade para todas as ordens
-STR_TIMETABLE_CLEAR_SPEED :{BLACK}Limpa Limite de Vel.
-STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Limpar a velocidade máxima de viagem da ordem em destaque. Ctrl+Clique limpa as velocidades para todas as ordens
+STR_TIMETABLE_CLEAR_SPEED :{BLACK}Remover limite de velocidade
+STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Limpar a velocidade máxima de viagem da ordem selecionada. Ctrl+Clique limpa as velocidades para todas as ordens
-STR_TIMETABLE_RESET_LATENESS :{BLACK}Restabelecer Contador de Atraso
-STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Limpar o contador de atrasos, para que o veículo fique no horário. Ctrl+Clique para reiniciar todo o grupo para que o veículo mais recente esteja no horário e todos os outros estejam antecipados
+STR_TIMETABLE_RESET_LATENESS :{BLACK}Reiniciar o Contador de Atraso
+STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Reiniciar o contador de atrasos, assim o veículo ficará no horário. Ctrl+Clique para reiniciar todo o grupo, de modo que o último veículo ficará pontual e todos os outros estarão antecipados
-STR_TIMETABLE_AUTOFILL :{BLACK}Autopreencher
+STR_TIMETABLE_AUTOFILL :{BLACK}Auto preencher
STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Preencher o horário automaticamente com os valores da próxima viagem. Ctrl+Clique para tentar manter os tempos de espera
STR_TIMETABLE_EXPECTED :{BLACK}Esperado
STR_TIMETABLE_SCHEDULED :{BLACK}Agendado
-STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Trocar entre esperado e agendado
+STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Alternar entre esperado e agendado
STR_TIMETABLE_ARRIVAL_DATE :A: {COLOUR}{DATE_TINY}
STR_TIMETABLE_DEPARTURE_DATE :D: {COLOUR}{DATE_TINY}
@@ -4755,14 +4769,14 @@ STR_AI_DEBUG_RELOAD :{BLACK}Recarreg
STR_AI_DEBUG_RELOAD_TOOLTIP :{BLACK}Desativar a IA, recarregar o script e reiniciar a IA
STR_AI_DEBUG_BREAK_STR_ON_OFF_TOOLTIP :{BLACK}Ativar/desativar a pausa quando uma mensagem de registo da IA corresponder à sequência de pausa
STR_AI_DEBUG_BREAK_ON_LABEL :{BLACK}Falha em:
-STR_AI_DEBUG_BREAK_STR_OSKTITLE :{BLACK}Falha em
-STR_AI_DEBUG_BREAK_STR_TOOLTIP :{BLACK}Quando uma mensagem do registo da IA corresponder a esta sequência, o jogo é pausado
-STR_AI_DEBUG_MATCH_CASE :{BLACK}Caso de igualdade
-STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}Alternar o caso de igualdade quando comparar as mensagens de resgisto da IA com a sequência de pausa
+STR_AI_DEBUG_BREAK_STR_OSKTITLE :{BLACK}Parar em
+STR_AI_DEBUG_BREAK_STR_TOOLTIP :{BLACK}Quando uma mensagem de registo da IA for igual a esta sequência, o jogo é pausado
+STR_AI_DEBUG_MATCH_CASE :{BLACK}Diferenciar maiúsculas/minúsculas
+STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}Ativar correspondência de maiúsculas/minúsculas na comparação das mensagens de resgistro da IA com a sequência de parada
STR_AI_DEBUG_CONTINUE :{BLACK}Continuar
-STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}Despausar e continuar o AI
+STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}Sair da pausa e continuar a IA
STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}Ver saída de depuração desta IA
-STR_AI_GAME_SCRIPT :{BLACK}Game Script
+STR_AI_GAME_SCRIPT :{BLACK}Script de jogo
STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}Verifique o registo do Script de jogo
STR_ERROR_AI_NO_AI_FOUND :Nenhuma IA adequada encontrada para carregar.{} Esta IA é falsa e não irá fazer nada.{} Você pode pode baixar várias IA através do sistema de 'Conteúdo Online'
@@ -4776,19 +4790,19 @@ STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}O script
STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}As IAs que serão carregadas no próximo jogo
STR_AI_CONFIG_HUMAN_PLAYER :Jogador humano
STR_AI_CONFIG_RANDOM_AI :IA aleatória
-STR_AI_CONFIG_NONE :{G=m}(nenhum)
+STR_AI_CONFIG_NONE :(nenhum)
STR_AI_CONFIG_NAME_VERSION :{STRING} {YELLOW}v{NUM}
STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Número máximo de concorrentes: {ORANGE}{COMMA}
STR_AI_CONFIG_COMPETITORS_INTERVAL :{LTBLUE}Intervalo entre o começo dos competidores: {ORANGE}{COMMA} minuto{P "" s}
STR_AI_CONFIG_MOVE_UP :{BLACK}Subir
-STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Mover a IA selecionada para cima na lista
+STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Move a IA seleccionada para cima
STR_AI_CONFIG_MOVE_DOWN :{BLACK}Descer
-STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Mover a IA selecionada para baixo na lista
+STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Move a IA seleccionada para baixo
STR_AI_CONFIG_GAMESCRIPT :{SILVER}Script do jogo
STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Parâmetros
-STR_AI_CONFIG_AI :{G=f}{SILVER}IAs
+STR_AI_CONFIG_AI :{SILVER}IAs
STR_AI_CONFIG_CHANGE_AI :{BLACK}Selecionar IA
STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Selecionar Script do Jogo
@@ -4798,8 +4812,8 @@ STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configur
# Available AIs window
STR_AI_LIST_CAPTION :{WHITE}Disponíveis {STRING}
-STR_AI_LIST_CAPTION_AI :{G=f}IAs
-STR_AI_LIST_CAPTION_GAMESCRIPT :Script do jogo
+STR_AI_LIST_CAPTION_AI :IAs
+STR_AI_LIST_CAPTION_GAMESCRIPT :Scripts de jogo
STR_AI_LIST_TOOLTIP :{BLACK}Clique para selecionar um script
STR_AI_LIST_AUTHOR :{LTBLUE}Autor: {ORANGE}{STRING}
@@ -5094,13 +5108,18 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Incapaz
STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Tipo de depósito errado
# Depot unbunching related errors
+STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}... pode haver somente uma ordem de desagrupar
+STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}... não é possível usar ordens de carga completa quando o veículo tem uma ordem de desagrupar
+STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}... não é possível desagrupar um veículo com ordem de carga completa
+STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}... não é possível usar ordens condicionais quando um veículo tem uma ordem de desagrupar
+STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}... não é possível desagrupar um veículo com uma ordem condicional
# Autoreplace related errors
STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} fica grande demais para ser substituído
STR_ERROR_AUTOREPLACE_NOTHING_TO_DO :{WHITE}Regras de autosubstituição/renovação não estão ativadas
STR_ERROR_AUTOREPLACE_MONEY_LIMIT :(limite de dinheiro)
STR_ERROR_AUTOREPLACE_INCOMPATIBLE_CARGO :{WHITE}Novo veículo não pode transportar {STRING}
-STR_ERROR_AUTOREPLACE_INCOMPATIBLE_REFIT :{WHITE}Novo veículo não pode ser reequipado na ordem {NUM}
+STR_ERROR_AUTOREPLACE_INCOMPATIBLE_REFIT :{WHITE}Veículo novo não pode ser adaptado na ordem {NUM}
# Rail construction errors
STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION :{WHITE}Impossível combinação de linhas
@@ -5305,10 +5324,10 @@ STR_ERROR_NO_BUOY :{WHITE}Não há
# Timetable related errors
STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Impossível programar veículo...
-STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Veículos só podem aguardar em estações
-STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Esse veículo não pára nesta estação
+STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Veículos podem esperar apenas em estações.
+STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Este veículo não para nesta estação
STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}... horário incompleto
-STR_ERROR_TIMETABLE_NOT_STARTED :{WHITE}... o plano de horário ainda não começou
+STR_ERROR_TIMETABLE_NOT_STARTED :{WHITE}... o horário ainda não começou
# Sign related errors
STR_ERROR_TOO_MANY_SIGNS :{WHITE}... existem placas demais
@@ -5355,7 +5374,7 @@ STR_TOWN_BUILDING_NAME_OLD_HOUSES_1 :Casas velhas
STR_TOWN_BUILDING_NAME_COTTAGES_1 :Casas de campo
STR_TOWN_BUILDING_NAME_HOUSES_1 :Casas
STR_TOWN_BUILDING_NAME_FLATS_1 :Apartamentos
-STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_2 :Prédio de escritórios alto
+STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_2 :Edifício alto de escritórios
STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_2 :Lojas e escritórios
STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_3 :Lojas e escritórios
STR_TOWN_BUILDING_NAME_THEATER_1 :Teatro
@@ -5371,43 +5390,43 @@ STR_TOWN_BUILDING_NAME_PIGGY_BANK_1 :Mealheiro
##id 0x4800
# industry names
-STR_INDUSTRY_NAME_COAL_MINE :{G=f}Mina de Carvão
-STR_INDUSTRY_NAME_POWER_STATION :{G=f}Usina de Energia
-STR_INDUSTRY_NAME_SAWMILL :{G=f}Serraria
-STR_INDUSTRY_NAME_FOREST :{G=f}Floresta
-STR_INDUSTRY_NAME_OIL_REFINERY :{G=f}Refinaria de Petróleo
-STR_INDUSTRY_NAME_OIL_RIG :{G=f}Plataforma Petrolífera
-STR_INDUSTRY_NAME_FACTORY :{G=f}Fábrica
-STR_INDUSTRY_NAME_PRINTING_WORKS :{G=f}Gráfica
-STR_INDUSTRY_NAME_STEEL_MILL :{G=f}Siderurgica
-STR_INDUSTRY_NAME_FARM :{G=f}Fazenda
-STR_INDUSTRY_NAME_COPPER_ORE_MINE :{G=f}Mina de Cobre
-STR_INDUSTRY_NAME_OIL_WELLS :{G=m}Poços de Petróleo
-STR_INDUSTRY_NAME_BANK :{G=f}Banco
-STR_INDUSTRY_NAME_FOOD_PROCESSING_PLANT :{G=f}Indústria Alimentícia
-STR_INDUSTRY_NAME_PAPER_MILL :{G=f}Fábrica de Papel
-STR_INDUSTRY_NAME_GOLD_MINE :{G=f}Mina de Ouro
-STR_INDUSTRY_NAME_BANK_TROPIC_ARCTIC :{G=m}Banco
-STR_INDUSTRY_NAME_DIAMOND_MINE :{G=f}Mina de Diamante
-STR_INDUSTRY_NAME_IRON_ORE_MINE :{G=f}Mina de Ferro
-STR_INDUSTRY_NAME_FRUIT_PLANTATION :{G=m}Pomar
-STR_INDUSTRY_NAME_RUBBER_PLANTATION :{G=f}Plantação de Seringueiras
-STR_INDUSTRY_NAME_WATER_SUPPLY :{G=m}Poço Artesiano
-STR_INDUSTRY_NAME_WATER_TOWER :{G=m}Reservatório de Água
-STR_INDUSTRY_NAME_FACTORY_2 :{G=f}Fábrica
-STR_INDUSTRY_NAME_FARM_2 :{G=f}Fazenda
-STR_INDUSTRY_NAME_LUMBER_MILL :{G=f}Serraria
-STR_INDUSTRY_NAME_COTTON_CANDY_FOREST :{G=f}Floresta de Algodão Doce
-STR_INDUSTRY_NAME_CANDY_FACTORY :{G=f}Fábrica de Doces
-STR_INDUSTRY_NAME_BATTERY_FARM :{G=m}Campo de Pilhas
-STR_INDUSTRY_NAME_COLA_WELLS :{G=m}Poços de Xarope
-STR_INDUSTRY_NAME_TOY_SHOP :{G=f}Loja de Brinquedos
-STR_INDUSTRY_NAME_TOY_FACTORY :{G=f}Fábrica de Brinquedos
-STR_INDUSTRY_NAME_PLASTIC_FOUNTAINS :{G=f}Fontes de Plástico
-STR_INDUSTRY_NAME_FIZZY_DRINK_FACTORY :{G=f}Fábrica de Refrigerante
-STR_INDUSTRY_NAME_BUBBLE_GENERATOR :{G=m}Gerador de Bolhas
-STR_INDUSTRY_NAME_TOFFEE_QUARRY :{G=f}Extração de Caramelo
-STR_INDUSTRY_NAME_SUGAR_MINE :{G=f}Mina de Açúcar
+STR_INDUSTRY_NAME_COAL_MINE :Mina de Carvão
+STR_INDUSTRY_NAME_POWER_STATION :Usina de Energia
+STR_INDUSTRY_NAME_SAWMILL :Serraria
+STR_INDUSTRY_NAME_FOREST :Floresta
+STR_INDUSTRY_NAME_OIL_REFINERY :Refinaria de Petróleo
+STR_INDUSTRY_NAME_OIL_RIG :Plataforma Petrolífera
+STR_INDUSTRY_NAME_FACTORY :Fábrica
+STR_INDUSTRY_NAME_PRINTING_WORKS :Gráfica
+STR_INDUSTRY_NAME_STEEL_MILL :Siderúrgica
+STR_INDUSTRY_NAME_FARM :Fazenda
+STR_INDUSTRY_NAME_COPPER_ORE_MINE :Mina de Minério Cobre
+STR_INDUSTRY_NAME_OIL_WELLS :Poços de Petróleo
+STR_INDUSTRY_NAME_BANK :Banco
+STR_INDUSTRY_NAME_FOOD_PROCESSING_PLANT :Indústria Alimentícia
+STR_INDUSTRY_NAME_PAPER_MILL :Fábrica de Papel
+STR_INDUSTRY_NAME_GOLD_MINE :Mina de Ouro
+STR_INDUSTRY_NAME_BANK_TROPIC_ARCTIC :Banco
+STR_INDUSTRY_NAME_DIAMOND_MINE :Mina de Diamantes
+STR_INDUSTRY_NAME_IRON_ORE_MINE :Mina de Minério de Ferro
+STR_INDUSTRY_NAME_FRUIT_PLANTATION :Plantação de Frutas
+STR_INDUSTRY_NAME_RUBBER_PLANTATION :Plantação de Seringueiras
+STR_INDUSTRY_NAME_WATER_SUPPLY :Fornecimento de àgua
+STR_INDUSTRY_NAME_WATER_TOWER :Reservatório de Água
+STR_INDUSTRY_NAME_FACTORY_2 :Fábrica
+STR_INDUSTRY_NAME_FARM_2 :Fazenda
+STR_INDUSTRY_NAME_LUMBER_MILL :Serraria
+STR_INDUSTRY_NAME_COTTON_CANDY_FOREST :Floresta de Algodão Doce
+STR_INDUSTRY_NAME_CANDY_FACTORY :Fábrica de Doces
+STR_INDUSTRY_NAME_BATTERY_FARM :Produção de Pilhas
+STR_INDUSTRY_NAME_COLA_WELLS :Poços de xarope de cola
+STR_INDUSTRY_NAME_TOY_SHOP :Loja de Brinquedos
+STR_INDUSTRY_NAME_TOY_FACTORY :Fábrica de Brinquedos
+STR_INDUSTRY_NAME_PLASTIC_FOUNTAINS :Fontes de Plástico
+STR_INDUSTRY_NAME_FIZZY_DRINK_FACTORY :Fábrica de Refrigerantes
+STR_INDUSTRY_NAME_BUBBLE_GENERATOR :Gerador de Bolhas
+STR_INDUSTRY_NAME_TOFFEE_QUARRY :Extração de Caramelo
+STR_INDUSTRY_NAME_SUGAR_MINE :Mina de Açúcar
############ WARNING, using range 0x6000 for strings that are stored in the savegame
############ These strings may never get a new id, or savegames will break!
@@ -5483,7 +5502,7 @@ STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_40_ELECTRIC :SH '40' (Elétr
STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_T_I_M_ELECTRIC :'T.I.M.' (Elétrico)
STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_ASIASTAR_ELECTRIC :'AsiaStar' (Elétrico)
STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PASSENGER_CAR :Vagão de Passageiros
-STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_MAIL_VAN :Vagão de Correspondências
+STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_MAIL_VAN :Vagão de Correio
STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COAL_CAR :Vagão de Carvão
STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_OIL_TANKER :Tanque de Petróleo
STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_LIVESTOCK_VAN :Vagão de Gado
@@ -5513,7 +5532,7 @@ STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_X2001_ELECTRIC :'X2001' (Elétr
STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_MILLENNIUM_Z1_ELECTRIC :'Millennium Z1' (Elétrico)
STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_WIZZOWOW_Z99 :Wizzowow Z99
STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_PASSENGER_CAR :Vagão de Passageiros
-STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_MAIL_VAN :Vagão de Cartas
+STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_MAIL_VAN :Vagão de Correio
STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COAL_CAR :Vagão de Carvão
STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_OIL_TANKER :Tanque de Petróleo
STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_LIVESTOCK_VAN :Vagão de Gado
@@ -5545,7 +5564,7 @@ STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV3_PEGASUS_ELECTRIC :Lev3 'Pegasus'
STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV4_CHIMAERA_ELECTRIC :Lev4 'Chimaera' (Elétrico)
STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_WIZZOWOW_ROCKETEER :Wizzowow Rocketeer
STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_PASSENGER_CAR :Vagão de Passageiros
-STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_MAIL_VAN :Vagão de Cartas
+STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_MAIL_VAN :Vagão de Correio
STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COAL_CAR :Vagão de Carvão
STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_OIL_TANKER :Tanque de Petróleo
STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_LIVESTOCK_VAN :Vagão de Gado
@@ -5583,12 +5602,12 @@ STR_VEHICLE_NAME_ROAD_VEHICLE_PLODDYPHUT_MKIII_BUS :Ônibus Ploddyp
STR_VEHICLE_NAME_ROAD_VEHICLE_BALOGH_COAL_TRUCK :Caminhão de Carvão Balogh
STR_VEHICLE_NAME_ROAD_VEHICLE_UHL_COAL_TRUCK :Caminhão de Carvão Uhl
STR_VEHICLE_NAME_ROAD_VEHICLE_DW_COAL_TRUCK :Caminhão de Carvão DW
-STR_VEHICLE_NAME_ROAD_VEHICLE_MPS_MAIL_TRUCK :Caminhão de Cartas MPS
-STR_VEHICLE_NAME_ROAD_VEHICLE_REYNARD_MAIL_TRUCK :Caminhão de Cartas Reynard
-STR_VEHICLE_NAME_ROAD_VEHICLE_PERRY_MAIL_TRUCK :Caminhão de Cartas Perry
-STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_MAIL_TRUCK :Caminhão de Cartas MightyMover
-STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_MAIL_TRUCK :Caminhão de Cartas Powernaught
-STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_MAIL_TRUCK :Caminhão de Cartas Wizzowow
+STR_VEHICLE_NAME_ROAD_VEHICLE_MPS_MAIL_TRUCK :Caminhão de Correio MPS
+STR_VEHICLE_NAME_ROAD_VEHICLE_REYNARD_MAIL_TRUCK :Caminhão de Correio Reynard
+STR_VEHICLE_NAME_ROAD_VEHICLE_PERRY_MAIL_TRUCK :Caminhão de Correio Perry
+STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_MAIL_TRUCK :Caminhão de Correio MightyMover
+STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_MAIL_TRUCK :Caminhão de Correio Powernaught
+STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_MAIL_TRUCK :Caminhão de Correio Wizzowow
STR_VEHICLE_NAME_ROAD_VEHICLE_WITCOMBE_OIL_TANKER :Tanque de Petróleo Witcombe
STR_VEHICLE_NAME_ROAD_VEHICLE_FOSTER_OIL_TANKER :Tanque de Petróleo Foster
STR_VEHICLE_NAME_ROAD_VEHICLE_PERRY_OIL_TANKER :Tanque de Petróleo Perry
@@ -5725,7 +5744,7 @@ STR_FORMAT_DATE_SHORT :{STRING} {NUM}
STR_FORMAT_DATE_LONG :{STRING} {STRING} {NUM}
STR_FORMAT_DATE_ISO :{2:NUM}-{1:ZEROFILL_NUM}-{0:ZEROFILL_NUM}
-STR_FORMAT_COMPANY_NUM :(Companhia {COMMA})
+STR_FORMAT_COMPANY_NUM :(Empresa {COMMA})
STR_FORMAT_GROUP_NAME :Agrupar {COMMA}
STR_FORMAT_GROUP_VEHICLE_NAME :{GROUP} #{COMMA}
STR_FORMAT_INDUSTRY_NAME :{1:STRING} de {0:TOWN}
diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt
index 793ae051d5..7bdde6832e 100644
--- a/src/lang/bulgarian.txt
+++ b/src/lang/bulgarian.txt
@@ -3806,6 +3806,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Винаги н
STR_ORDER_DROP_SERVICE_DEPOT :Сервиз, когато е необходимо
STR_ORDER_DROP_HALT_DEPOT :Стоп
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Данни за превозното средство, на които се базира
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt
index 9f4cf7ae20..65ead37825 100644
--- a/src/lang/catalan.txt
+++ b/src/lang/catalan.txt
@@ -363,6 +363,7 @@ STR_SORT_BY_POPULATION :Població
STR_SORT_BY_RATING :Qualificació
STR_SORT_BY_NUM_VEHICLES :Nombre de vehicles
STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Benefici total de l'any passat
+STR_SORT_BY_TOTAL_PROFIT_LAST_PERIOD :Benefici total durant l'últim període
STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Benefici total d'aquest any
STR_SORT_BY_TOTAL_PROFIT_THIS_PERIOD :Benefici total d'aquest període
STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Benefici mitjà de l'any passat
@@ -634,6 +635,7 @@ STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Clica aq
# Company league window
STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Taula de la lliga de companyies
STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPANY} {BLACK}{COMPANY_NUM} «{STRING}»
+STR_COMPANY_LEAGUE_COMPANY_RANK :{YELLOW}#{NUM}
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER :Enginyer
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER :Director de trànsit
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR :Coordinador de transport
@@ -666,6 +668,8 @@ STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Total:
###next-name-looks-similar
STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Nombre d'estacions visitades recentment per algun vehicle. Estacions, parades d'autobús, aeroports, etc. es compten per separat, fins i tot si pertanyen a la mateixa estació.
+STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_YEARS :{BLACK}El benefici del vehicle que pitjors ingressos ha tingut (només es tenen en compte els vehicles amb més de dos anys de servei).
+STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_PERIODS :{BLACK}El benefici del vehicle que pitjors ingressos ha tingut (només es tenen en compte els vehicles amb més de dos períodes de servei).
STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Quantitat de diners guanyats durant el trimestre amb el mínim benefici dels darrers 12 trimestres
STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Quantitat de diners guanyats durant el trimestre amb el màxim benefici dels darrers 12 trimestres
STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Unitats de càrrega entregades en els darrers quatre trimestres
@@ -923,7 +927,10 @@ STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLAC
STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Subvenció concedida a {STRING}{}{}El transport de {STRING} de {STRING} fins a {STRING} ingressarà el triple de la tarifa habitual durant {UNITS_YEARS_OR_MINUTES}
STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Subvenció concedida a {STRING}{}{}El transport de {STRING} de {STRING} fins a {STRING} ingressarà el quàdruple de la tarifa habitual durant {UNITS_YEARS_OR_MINUTES}
+STR_NEWS_ROAD_REBUILDING_MONTHS :{BIG_FONT}{BLACK}Trànsit caòtic a {TOWN}!{}{}El programa de millora de carrers pagat per {STRING} provoca 6 mesos de misèria als motoristes!
+STR_NEWS_ROAD_REBUILDING_MINUTES :{BIG_FONT}{BLACK}Trànsit caòtic a {TOWN}!{}{}El programa de millora de carrers pagat per {STRING} provoca 6 minuts de misèria als motoristes!
STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Monopoli de transports
+STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MONTHS :{BIG_FONT}{BLACK}Les autoritats locals de {TOWN} signen un contracte amb {STRING} per a obtenir 12 mesos de drets de transport exclusius!
# Extra view window
STR_EXTRA_VIEWPORT_TITLE :{WHITE}Vista {COMMA}
@@ -1263,6 +1270,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Dreta
STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}segon{P 0 "" s}
STR_CONFIG_SETTING_INFINITE_MONEY :Diners infinits: {STRING}
+STR_CONFIG_SETTING_INFINITE_MONEY_HELPTEXT :Permet gastar diners sense límit i desactiva les bancarrotes de les companyies.
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Préstec inicial màxim: {STRING}
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Quantitat màxima del préstec que pot demanar una companyia (sense tenir en compte la inflació)
@@ -1288,6 +1296,7 @@ STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :Fixa quant es p
STR_CONFIG_SETTING_SUBSIDY_DURATION :Durada dels subsidis: {STRING}
###length 2
STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Establiu el nombre d'anys que duren els subsidis.
+STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT_PERIODS :Estableix el nombre de períodes que duren les subvencions.
STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR_PERIODS}
###setting-zero-is-special
@@ -1412,7 +1421,8 @@ STR_CONFIG_SETTING_AUTOSCROLL_EVERY_VIEWPORT :Qualsevol vista
STR_CONFIG_SETTING_BRIBE :Permet subornar les autoritats locals: {STRING}
###length 2
-STR_CONFIG_SETTING_BRIBE_HELPTEXT :Permet a les companyies intentar subornar l'autoritat local. Si el suborn és detectat per un inspector, la companyia no podrà actuar a la població durant sis mesos.
+STR_CONFIG_SETTING_BRIBE_HELPTEXT :Permet que les companyies subornin l'autoritat local. Si algun inspector ho detecta, la companyia no podrà actuar a la població durant sis mesos.
+STR_CONFIG_SETTING_BRIBE_HELPTEXT_MINUTES :Permet que les companyies subornin l'autoritat local. Si algun inspector ho detecta, la companyia no podrà actuar a la població durant sis minuts.
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Permet comprar els drets del transport en exclusiva: {STRING}
###length 2
@@ -1474,7 +1484,8 @@ STR_CONFIG_SETTING_ORDER_REVIEW_ON :De tots els veh
STR_CONFIG_SETTING_WARN_INCOME_LESS :Avisa si el benefici del vehicle és negatiu: {STRING}
###length 2
-STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Quan està activat, un missatge de notícia és enviat quan un vehicle no ha tingut beneficis durant l'any
+STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Quan està activat, s'envia un missatge de notícia quan un vehicle no ha tingut beneficis durant l'any
+STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT_PERIOD :Quan està activat, s'envia un missatge de notícia quan un vehicle no ha obtingut benefici durant un període.
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Els vehicles mai caduquen: {STRING}
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Quan està activat, tots els models de vehicles continuen disponibles per sempre després de la seva introducció
@@ -1491,6 +1502,7 @@ STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (temps de cal
STR_CONFIG_SETTING_TOWN_CARGO_SCALE :Escala la producció de càrrega de les poblacions: {STRING}
STR_CONFIG_SETTING_TOWN_CARGO_SCALE_HELPTEXT :Escala la producció de càrrega de les poblacions segons aquest percentatge.
+STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE :Escala la producció de càrrega de les indústries: {STRING}
STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_HELPTEXT :Escala la producció de càrrega de les indústries segons aquest percentatge.
STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}{NBSP}%
@@ -1752,6 +1764,7 @@ STR_CONFIG_SETTING_SOUND_NEW_PERIOD :Fi del període
###length 2
STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :Reprodueix un efecte de so al final de l'any quan apareix el resum financer de l'any de la companyia en comparació amb l'anterior
+STR_CONFIG_SETTING_SOUND_NEW_PERIOD_HELPTEXT :Reprodueix un so al final d'un període que indica el rendiment de la companyia durant el període respecte al període anterior.
STR_CONFIG_SETTING_SOUND_CONFIRM :Construcció: {STRING}
STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT :Reprodueix un efecte de so quan es realitzin amb èxit construccions o altres accions
@@ -1912,6 +1925,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Estableix l'any
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Canvia a través dels tipus de senyal: {STRING}
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Seleccioneu com es commutaran els tipus de senyals quan es faci Ctrl+clic sobre un senyal ja construït amb l'eina de construir senyals.
###length 2
+STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Només el grup actual
STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Tots visibles
STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Mostra els tipus de senyals: {STRING}
@@ -2220,7 +2234,7 @@ STR_HELP_WINDOW_BUGTRACKER :{BLACK}Informeu
STR_HELP_WINDOW_COMMUNITY :Comunitat
# Cheat window
-STR_CHEATS :{WHITE}Trampes
+STR_CHEATS :{WHITE}Opcions de mode lliure
STR_CHEAT_MONEY :{LTBLUE}Augmenta els diners de la companyia actual en {CURRENCY_LONG}.
STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Juga amb la companyia: {ORANGE}{COMMA}
STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Eruga màgica (treu indústries i altres objectes inamovibles): {ORANGE}{STRING}
@@ -2359,6 +2373,7 @@ STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Data
STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Data actual
STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}{NBSP}h{NBSP}{NUM}{NBSP}m
STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION :{BLACK}Temps de joc
+STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP :{BLACK}Temps de joc{}sense contar pauses
STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Idioma, versió de servidor, etc.
STR_NETWORK_SERVER_LIST_CLICK_GAME_TO_SELECT :{BLACK}Clica en una partida de la llista per triar-la
@@ -3638,6 +3653,7 @@ STR_LOCAL_AUTHORITY_ACTION_BRIBE :Suborna les aut
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Inicia una petita campanya de publicitat, per atraure més passatgers i càrregues als teus serveis de transport.{}Proporciona una millora temporal dels ratis de les estacions dins d'un radi petit al voltant del centre de la població.{}{POP_COLOUR}Cost: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Inicia una mitjana campanya de publicitat, per atraure més passatgers i càrregues als teus serveis de transport.{}Proporciona una millora temporal dels ratis de les estacions dins un radi mitjà al voltant del centre de la població.{}{PUSH_COLOUR}Cost: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Inicia una gran campanya de publicitat, per atraure més passatgers i càrregues als teus serveis de transport.{}Proporciona una millora temporal dels ratis de les estacions dins d'un radi gran al voltant del centre de la població.{}{POP_COLOUR}Cost: {CURRENCY_LONG}
+STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MONTHS :{PUSH_COLOUR}{YELLOW}Finança la reconstrucció de la xarxa de carreteres urbanes.{}Provoca molèsties considerables al trànsit de vehicles per carretera durant 6 mesos.{}{POP_COLOUR}Cost: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Construeix una estàtua en honor a la teva companyia.{}Proporciona una millora permanent dels ratis d'estació de la població.{}{POP_COLOUR}Cost: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Finança la construcció de nous edificis comercials a la població.{}Proporciona una millora temporal del creixement d'aquesta població.{}{POP_COLOUR}Cost: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Suborna les autoritats locals per a incrementar el vostre rati i cancel·lar els drets exclusius de transport del competidor, amb el risc de sancions greus si us pesquen.{}{POP_COLOUR}Cost:{NBSP}{CURRENCY_LONG}
@@ -3694,6 +3710,7 @@ STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Clica al
STR_SUBSIDIES_OFFERED_EXPIRY_DATE :fins el {DATE_SHORT}
STR_SUBSIDIES_OFFERED_EXPIRY_TIME :abans de {UNITS_MONTHS_OR_MINUTES}
STR_SUBSIDIES_SUBSIDISED_EXPIRY_DATE :fins el {DATE_SHORT}
+STR_SUBSIDIES_SUBSIDISED_EXPIRY_TIME :Queden {UNITS_MONTHS_OR_MINUTES}
# Story book window
STR_STORY_BOOK_CAPTION :{WHITE}Llibre de Partida de {COMPANY}
@@ -3734,6 +3751,7 @@ STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPAN
STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Ratis
STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Mostra els ratis de l'estació
STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MONTH :{BLACK}Subministrament mensual i rati local:
+STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MINUTE :{BLACK}Subministrament per minut i rati local:
STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}: {YELLOW}{COMMA} / {STRING} ({COMMA}%)
STR_STATION_VIEW_GROUP :{BLACK}Agrupa per
@@ -3918,6 +3936,7 @@ STR_INDUSTRY_DIRECTORY_FILTER_NONE :Cap
# Industry view
STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY}
STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Producció del darrer mes:
+STR_INDUSTRY_VIEW_PRODUCTION_LAST_MINUTE_TITLE :{BLACK}Producció durant l'últim minut:
STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} ({COMMA}% transportat)
STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Centra la vista principal al lloc de la indústria. Ctrl+Clic obre una nova vista al lloc de la indústria
STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Nivell de producció: {YELLOW}{COMMA}%
@@ -4345,6 +4364,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Acció a
# Messages in the start stop button in the vehicle view
STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Carregant / Descarregant
STR_VEHICLE_STATUS_LEAVING :{LTBLUE}Sortint
+STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}S'espera per a separar
STR_VEHICLE_STATUS_CRASHED :{RED}Vehicle sinistrat!
STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}Avariat
STR_VEHICLE_STATUS_STOPPED :{RED}Parat
@@ -4358,6 +4378,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}Sense o
STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Cap a {WAYPOINT}, a {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}Cap a {DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Revisió a {DEPOT}, {VELOCITY}
+STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}Separa i revisa a {DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}No pot arribar a {STATION}, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}No pot arribar a {WAYPOINT}, {VELOCITY}
@@ -4396,6 +4417,7 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Pes: {LT
STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Benefici d'aquest any: {LTBLUE}{CURRENCY_LONG} (darrer any: {CURRENCY_LONG})
STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Benefici aquest any: {LTBLUE}{CURRENCY_LONG} (l'any passat: {CURRENCY_LONG}) {BLACK}Rendiment mínim: {LTBLUE}{POWER_TO_WEIGHT}
STR_VEHICLE_INFO_PROFIT_THIS_PERIOD_LAST_PERIOD :{BLACK}Benefici durant aquest període: {LTBLUE}{CURRENCY_LONG} (durant l'últim període: {CURRENCY_LONG})
+STR_VEHICLE_INFO_PROFIT_THIS_PERIOD_LAST_PERIOD_MIN_PERFORMANCE :{BLACK}Benefici durant aquest període: {LTBLUE}{CURRENCY_LONG} (durant l'últim període: {CURRENCY_LONG}) {BLACK}Rendiment mínim: {LTBLUE}{POWER_TO_WEIGHT}
STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Fiabilitat: {LTBLUE}{COMMA}% {BLACK}Avaries des de la darrera revisió: {LTBLUE}{COMMA}
STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Fabricat: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY_LONG}
@@ -4411,6 +4433,11 @@ STR_VEHICLE_DETAILS_SERVICING_INTERVAL_MINUTES :{BLACK}Interval
STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Interval de les revisions: {LTBLUE}{COMMA}{NBSP}%{BLACK} {STRING}
STR_VEHICLE_DETAILS_LAST_SERVICE_DATE :Última revisió: {LTBLUE}{DATE_LONG}
STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :Última revisió: fa {LTBLUE}{NUM} minut{P "" s}
+STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Augmenta l'interval de servei 10 dies. Amb Ctrl+Clic, s'augmenta l'interval només 5 dies.
+STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Augmenta l'interval de servei un 10{NBSP}%. Amb Ctrl+Clic, s'augmenta només un 5{NBSP}%.
+STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Redueix l'interval de servei 10 dies. Amb Ctrl+Clic, es redueix l'interval només 5 dies.
+STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Redueix l'interval de servei 5 minuts. Amb Ctrl+Clic, es redueix l'interval només 1 minut.
+STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Redueix l'interval de servei un 10{NBSP}%. Amb Ctrl+Clic, es redueix l'interval només un 5{NBSP}%.
STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Canvia el tipus d'interval de les revisions
STR_VEHICLE_DETAILS_DEFAULT :{G=Masculin}Predeterminat
@@ -4481,6 +4508,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Commuta
STR_ORDERS_LIST_TOOLTIP :{BLACK}Llista d'ordres - clica en una ordre per marcar-la. Ctrl+Clic desplaça cap a la destinació de l'ordre
STR_ORDER_INDEX :{COMMA}:{NBSP}
+STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING}
STR_ORDERS_END_OF_ORDERS :- - Fi d'Ordres - -
STR_ORDERS_END_OF_SHARED_ORDERS :- - Fi d'Ordres Compartides - -
@@ -4517,6 +4545,14 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :Càrrega dispon
STR_ORDER_DROP_GO_ALWAYS_DEPOT :Vés-hi sempre
STR_ORDER_DROP_SERVICE_DEPOT :Revisa si és necessari
STR_ORDER_DROP_HALT_DEPOT :Para
+STR_ORDER_DROP_UNBUNCH :Separa
+
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Trieu l'acció que cal fer en aquest dipòsit.
+STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Trieu l'acció que cal fer en aquesta cotxera.
+STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Trieu l'acció que cal fer en aquest hangar.
+###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dades del vehicle on basar el salt a
@@ -4585,6 +4621,7 @@ STR_ORDER_REFIT_ORDER :(Remodela a {ST
STR_ORDER_REFIT_STOP_ORDER :(Remodela a {STRING} i para)
STR_ORDER_STOP_ORDER :(Para)
+STR_ORDER_WAIT_TO_UNBUNCH :(espera per a separar)
STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING}
STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(No pot usar l'estació){POP_COLOUR} {STRING} {STATION} {STRING}
@@ -4788,6 +4825,8 @@ STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Script de la pa
STR_AI_SETTINGS_CLOSE :{BLACK}Tanca
STR_AI_SETTINGS_RESET :{BLACK}Restableix
STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING}
+STR_AI_SETTINGS_SETTING_DEVIATION :{STRING}: {ORANGE}[{STRING}, {STRING}]
+STR_AI_SETTINGS_JUST_DEVIATION :[{STRING}, {STRING}]
# Textfile window
@@ -5054,6 +5093,11 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Impossib
STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Tipus de cotxera incorrecta
# Depot unbunching related errors
+STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}... només pot tenir una ordre de separar.
+STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}... no es poden fer servir ordres de càrrega completa quan el vehicle té una ordre de separació.
+STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}... no es pot separar un vehicle amb una ordre de càrrega completa.
+STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}... no pot fer servir ordres condicionals quan un vehicle té una ordre de separació.
+STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}... no es pot separar un vehicle que té ordres condicionals.
# Autoreplace related errors
STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} és massa llarg després de la substitució
diff --git a/src/lang/chuvash.txt b/src/lang/chuvash.txt
index 4f0b1f2667..62d30a61ce 100644
--- a/src/lang/chuvash.txt
+++ b/src/lang/chuvash.txt
@@ -1528,6 +1528,10 @@ STR_ORDER_INDEX :{COMMA}:{NBSP}
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
# Conditional order variables, must follow order of OrderConditionVariable enum
###length 8
diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt
index 25147fe7b8..c688ecd013 100644
--- a/src/lang/croatian.txt
+++ b/src/lang/croatian.txt
@@ -4151,6 +4151,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Idi neprekidno
STR_ORDER_DROP_SERVICE_DEPOT :Servisiraj prema potrebi
STR_ORDER_DROP_HALT_DEPOT :Stani
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Podaci vozila prema kojima se zasniva skok
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/czech.txt b/src/lang/czech.txt
index 53f3594d21..60551f1577 100644
--- a/src/lang/czech.txt
+++ b/src/lang/czech.txt
@@ -267,6 +267,11 @@ STR_COLOUR_RANDOM :Náhodná
###length 17
STR_COLOUR_SECONDARY_DARK_BLUE :Tmavomodrá
+STR_COLOUR_SECONDARY_SECONDARY_PINK :Růžová
+STR_COLOUR_SECONDARY_LIGHT_BLUE :Světle modrá
+STR_COLOUR_SECONDARY_GREEN :Zelená
+STR_COLOUR_SECONDARY_PURPLE :Purpurová
+STR_COLOUR_SECONDARY_ORANGE :Oranžová
STR_COLOUR_SECONDARY_BROWN :Hnědá
STR_COLOUR_SECONDARY_GREY :Šedá
STR_COLOUR_SECONDARY_WHITE :Bílá
@@ -276,6 +281,7 @@ STR_COLOUR_SECONDARY_WHITE :Bílá
STR_UNITS_VELOCITY_IMPERIAL :{DECIMAL}{NBSP}m{P íle íle il}/h
STR_UNITS_VELOCITY_METRIC :{DECIMAL}{NBSP}km/h
STR_UNITS_VELOCITY_SI :{DECIMAL}{NBSP}m/s
+STR_UNITS_VELOCITY_KNOTS :{DECIMAL}{NBSP}uz{P el ly lů}
STR_UNITS_POWER_IMPERIAL :{DECIMAL}{NBSP}hp
STR_UNITS_POWER_METRIC :{DECIMAL}{NBSP}hp
@@ -317,7 +323,9 @@ STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}
# Time units used in string control characters
+STR_UNITS_MINUTES :{NUM}{NBSP}minut{P a y ""}
+STR_UNITS_YEARS :{NUM}{NBSP}{P rok roky let}
# Common window strings
STR_LIST_FILTER_TITLE :{BLACK}Filtrovat řetězec:
@@ -412,7 +420,9 @@ STR_SORT_BY_POPULATION :Podle populace
STR_SORT_BY_RATING :Hodnocení
STR_SORT_BY_NUM_VEHICLES :Počet vozidel
STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Letošní celkový zisk
+STR_SORT_BY_TOTAL_PROFIT_LAST_PERIOD :Celkový zisk v minulém období
STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Celkový letošní zisk
+STR_SORT_BY_TOTAL_PROFIT_THIS_PERIOD :Celkový zisk v tomto období
STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Loňský průměrný zisk
STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Průměrný letošní zisk
@@ -772,6 +782,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Skladba
STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Hudební stopu odstraníš ze současného programu (pouze u vlastního) kliknutím na ni
# Highscore window
+STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Nejlepší společnosti
STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}.
STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Obchodník
STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Manažer
@@ -864,6 +875,7 @@ STR_STATUSBAR_AUTOSAVE :{RED}Automatick
STR_STATUSBAR_SAVING_GAME :{RED}* * HRA SE UKLÁDÁ * *
STR_STATUSBAR_SPECTATOR :{WHITE}(spectator)
+STR_STATUSBAR_INFINITE_MONEY :{WHITE}(neomezené peníze)
# News message history
STR_MESSAGE_HISTORY :{WHITE}Historie zpráv
@@ -986,6 +998,8 @@ STR_GAME_OPTIONS_VOLUME :Hlasitost
STR_GAME_OPTIONS_MUSIC_VOLUME :Hudba
STR_GAME_OPTIONS_VOLUME_0 :0%
+STR_GAME_OPTIONS_VOLUME_25 :25 %
+STR_GAME_OPTIONS_VOLUME_50 :50 %
STR_GAME_OPTIONS_VOLUME_75 :75%
STR_GAME_OPTIONS_VOLUME_100 :100%
@@ -1082,6 +1096,8 @@ STR_GAME_OPTIONS_GUI_SCALE_3X :3x
STR_GAME_OPTIONS_GUI_SCALE_4X :4x
STR_GAME_OPTIONS_GUI_SCALE_5X :5x
+STR_GAME_OPTIONS_PARTICIPATE_SURVEY :{BLACK}Účastnit se automatického průzkumu
+STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK :{BLACK}O anketě a ochraně soukromí
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW :{BLACK}Náhled výsledků průzkumu
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW_TOOLTIP :{BLACK}Zobrazovat výsledek průzkumu z aktuálně běžící hry
@@ -1105,6 +1121,7 @@ STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Vyberte
STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Další informace o základním hudebním setu
+STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE :{BLACK}Stav zásuvného modulu:
@@ -1216,6 +1233,7 @@ STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Rozbalit
STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Sbalit vše
STR_CONFIG_SETTING_RESET_ALL :{BLACK}Vymazat všechny hodnoty
STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(žádné vysvětlení není k dispozici)
+STR_CONFIG_SETTING_VALUE :{PUSH_COLOUR}{ORANGE}{STRING}{POP_COLOUR}
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Výchozí hodnota: {ORANGE}{STRING}
STR_CONFIG_SETTING_TYPE :{LTBLUE}Typ nastavení: {ORANGE}{STRING}
STR_CONFIG_SETTING_TYPE_CLIENT :Nastavení klienta (není uchováno v uložených hrách; ovlivní všechny hry)
@@ -1397,6 +1415,7 @@ STR_CONFIG_SETTING_SHOWFINANCES :Ukazovat finan
###length 2
STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :Na konci každého roku zobrazit okno s finančním přehledem pro snadnou kontrolu hospodaření společnosti.
+STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT_PERIOD :Pokud je zapnuto, na konci každého období se zobrazí okno s finančním přehledem pro snadnou kontrolu hospodaření společnosti.
STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Vydávat nové příkazy jako 'bez zastavení': {STRING}
STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normálně vozidlo zastavuje v každé stanici, kterou projíždí. Zapnutím této možnosti budou všechny nově vydané příkazy "Jet do" vydávány jako "bez zastavení" a vozidlo tak každou stanicí po cestě do cíle pouze projede bez odbavení. U jednotlivých příkazů nicméně lze ručně nastavit odlišné chování.
@@ -1447,6 +1466,7 @@ STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Žádná*
STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :Redukovaný
STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :Obvyklý
+STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR_HELPTEXT :Povolit výstavbu železničních přejezdů na silnicích nebo železničních tratích vlastněných jinými společnostmi
STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Stavba průjezdných zastávek na obecních silnicích: {STRING}
STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Povoluje stavbu průjezdných stanic na městem vlastněných silnicích
@@ -1483,6 +1503,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Pokud je zapnut
###length 2
+STR_CONFIG_SETTING_MINUTES_PER_YEAR :Minut v roce: {STRING}
###setting-zero-is-special
@@ -1696,6 +1717,7 @@ STR_CONFIG_SETTING_LOADING_INDICATORS :Používat ukaz
STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Vyber jestli budou zobrazovány ukazatele naložení nad nakládajícími a vykládajícími vozidly.
###length 3
+STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Sekundy
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Ukazovat v jízdním řádu příjezdy a odjezdy: {STRING}
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Zobrazit předpokládané časy příjezdu a odjezdu v jízdních řádech.
@@ -1803,6 +1825,8 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Vypnuto
STR_CONFIG_SETTING_NOSERVICE :Vypnout servisy, když jsou vypnuty poruchy: {STRING}
STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Pokud je zapnuto a zároveň jsou vypnuty poruchy, vozidla nebudou vůbec jezdit do servisu, protože se nemohou nikdy porouchat
+STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY :Pomalejší nakládání u vlaků delších než stanice: {STRING}
+STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY_HELPTEXT :Pokud je zapnuto, u vlaků delší než stanice je nakládání pomalejší než u vlaků, které se do stanice vejdou. Nastavení neovlivňuje hledání cesty.
STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Zapnout omezení rychlosti vagonů: {STRING}
STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Pokud zapnuto, použije rychlostní omezení vagónů při stanovení maximální rychlosti vlaku
@@ -2023,6 +2047,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Kdykoliv se ryc
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Imperiální (mph)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metrické (km/h)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s)
+STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_KNOTS :uzly
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Jednotky výkonu vozidla: {STRING}
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Kdykoliv se výkon vozidla zobrazí v uživatelském rozhraní, bude ve zvolených jednotkách
@@ -2072,6 +2097,7 @@ STR_CONFIG_SETTING_ACCOUNTING :Účetnictví
STR_CONFIG_SETTING_VEHICLES :Dopravní prostředky
STR_CONFIG_SETTING_VEHICLES_PHYSICS :Fyzika
STR_CONFIG_SETTING_VEHICLES_ROUTING :Směrování
+STR_CONFIG_SETTING_VEHICLES_ORDERS :Příkazy
STR_CONFIG_SETTING_LIMITATIONS :Omezení
STR_CONFIG_SETTING_ACCIDENTS :Katastrofy / Nehody
STR_CONFIG_SETTING_GENWORLD :Generování krajiny
@@ -2080,6 +2106,7 @@ STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :Městská sprá
STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :Města
STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :Průmysl
STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :Distribuce nákladu
+STR_CONFIG_SETTING_ENVIRONMENT_TREES :Stromy
STR_CONFIG_SETTING_AI :Konkurenti
STR_CONFIG_SETTING_AI_NPC :Umělá inteligence
STR_CONFIG_SETTING_NETWORK :Síť
@@ -2203,6 +2230,7 @@ STR_LIVERY_TRAIN_TOOLTIP :{BLACK}Zobrazit
STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Zobrazit barevná schémata pro silniční vozidla
STR_LIVERY_SHIP_TOOLTIP :{BLACK}Zobrazit barevná schémata pro lodě
STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Zobrazit barevná schémata pro letadla
+STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Zobrazit barvy skupin lodí
STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Vybrat primární barvu označeného schématu. Ctrl+kliknutí nastaví tuto barvu každému schématu
STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Vybrat sekundární barvu označeného schématu. Ctrl+Kliknutí nastaví tuto barvu každému schématu
STR_LIVERY_PANEL_TOOLTIP :{BLACK}Vyber, které barevné schéma chceš změnit (více označíš s Ctrl). Schéma změníš kliknutím na tlačítko
@@ -3820,6 +3848,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Průplav
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stanice:
STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS :{WHITE}Staniční oblasti
STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS :{WHITE}Letiště
+STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/období
# Industry directory
STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Průmysl
@@ -4145,6 +4174,9 @@ STR_ENGINE_PREVIEW_TRAM_VEHICLE :tramvaj
STR_ENGINE_PREVIEW_AIRCRAFT :{G=n}letadlo
STR_ENGINE_PREVIEW_SHIP :{G=f}loď
+STR_ENGINE_PREVIEW_SPEED_POWER :Rychlost: {VELOCITY} Výkon: {POWER}
+STR_ENGINE_PREVIEW_TYPE_RANGE :Typ letadla: {STRING} Dosah: {COMMA} políč{P ko ka ek}
+STR_ENGINE_PREVIEW_RUNCOST_YEAR :Provozní náklady: {CURRENCY_LONG}/rok
# Autoreplace window
STR_REPLACE_VEHICLES_WHITE :{WHITE}Vyměňování {STRING} - {STRING}
@@ -4309,6 +4341,7 @@ STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Kapacita
STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Podíl za převoz: {LTBLUE}{CURRENCY_LONG}
+STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Prodloužit interval údržby o 5 minut. Ctrl+kliknutí prodlouží interval údržby o 1 minutu.
STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Změnit typ servisního intervalu
STR_VEHICLE_DETAILS_DEFAULT :Defaultní
@@ -4414,6 +4447,11 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Jeď vždy
STR_ORDER_DROP_SERVICE_DEPOT :Údržba v případě potřeby
STR_ORDER_DROP_HALT_DEPOT :Zastavit
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Vyber příkaz k provedení v této garáži
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Vlastnost vozidla, podle které přeskakovat
# Conditional order variables, must follow order of OrderConditionVariable enum
@@ -4558,6 +4596,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Vozidlo
STR_TIMETABLE_STATUS_LATE :{BLACK}Vozidlo má {STRING} zpoždění
STR_TIMETABLE_STATUS_EARLY :{BLACK}Vozidlo jede {STRING} napřed
STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Tento jízdní řád ještě nezačal
+STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Tento jízdní řád začne {STRING}
+STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Tento jízdní řád začne za {COMMA} sekund{P u y ""}
@@ -5712,6 +5752,7 @@ STR_UNKNOWN_STATION :neznámá stani
STR_DEFAULT_SIGN_NAME :Nápis
STR_COMPANY_SOMEONE :někdo
+STR_SAVEGAME_DURATION_REALTIME :{NUM}h {NUM}m
STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING}
STR_SAVEGAME_NAME_SPECTATOR :Pozorovatel, {1:STRING}
diff --git a/src/lang/danish.txt b/src/lang/danish.txt
index 9093ef77da..e633aca2f6 100644
--- a/src/lang/danish.txt
+++ b/src/lang/danish.txt
@@ -329,6 +329,7 @@ STR_SORT_BY_TRANSPORTED :Transporteret
STR_SORT_BY_NUMBER :Nummer
STR_SORT_BY_PROFIT_LAST_YEAR :Afkast sidste år
STR_SORT_BY_PROFIT_THIS_YEAR :Afkast i år
+STR_SORT_BY_PROFIT_THIS_PERIOD :Profit denne periode
STR_SORT_BY_AGE :Alder
STR_SORT_BY_RELIABILITY :Pålidelighed
STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :Total kapacitet for hver lasttype
@@ -651,7 +652,9 @@ STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Lån:
STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}I alt:
###next-name-looks-similar
+STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_YEARS :{BLACK}Antal køretøjer, der gav overskud sidste år. Dette omfatter vejkøretøjer, tog, skibe og fly
STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Antal nyligt servicerede stationer. Togstationer, busstoppesteder, lufthavne og så videre tælles separat, selv om de tilhører den samme station
+STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_YEARS :{BLACK}Fortjenesten af køretøjet med den laveste indkomst (kun køretøjer ældre end to år tages i betragtning)
STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Indkomst i kvartallet med det laveste afkast i de sidste 12 kvartaler
STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Indkomst i kvartallet med det højeste afkast i de sidste 12 kvartaler
STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Antal enheder fragtet i de sidste 4 kvartaler
@@ -799,6 +802,7 @@ STR_STATUSBAR_AUTOSAVE :{RED}AUTOGEM
STR_STATUSBAR_SAVING_GAME :{RED}* * GEMMER SPIL * *
STR_STATUSBAR_SPECTATOR :{WHITE}(tilskuer)
+STR_STATUSBAR_INFINITE_MONEY :{WHITE}(uendelige penge)
# News message history
STR_MESSAGE_HISTORY :{WHITE}Beskedhistorik
@@ -2314,6 +2318,7 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Kortstø
STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Kortstørrelse for spillet{}Klik for at sortere efter område
STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Dato
STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Aktuel dato
+STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}h {NUM}m
STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Sprog, server version, osv.
STR_NETWORK_SERVER_LIST_CLICK_GAME_TO_SELECT :{BLACK}Klik på et spil fra listen for at vælge det
@@ -2685,6 +2690,7 @@ STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLA
# Linkgraph tooltip
STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} transporteres tilbage ({COMMA}% of capacity)
+STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Gennemsnitlig rejsetid: {UNITS_DAYS_OR_SECONDS}
# Base for station construction window(s)
STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Vis dækningsområde
@@ -4163,6 +4169,8 @@ STR_ENGINE_PREVIEW_TRAM_VEHICLE :sporvogn
STR_ENGINE_PREVIEW_AIRCRAFT :fly
STR_ENGINE_PREVIEW_SHIP :skib
+STR_ENGINE_PREVIEW_TEXT3 :{BLACK}{STRING}{}{5:STRING}{}{STRING}
+STR_ENGINE_PREVIEW_COST_WEIGHT :Pris: {CURRENCY_LONG} Vægt: {WEIGHT_SHORT}
# Autoreplace window
STR_REPLACE_VEHICLES_WHITE :{WHITE}Udskift {STRING} - {STRING}
@@ -4332,6 +4340,7 @@ STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :Last service: {
STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Ændre serviceintervallets type
STR_VEHICLE_DETAILS_DEFAULT :Standard
+STR_VEHICLE_DETAILS_MINUTES :Minutter
STR_VEHICLE_DETAILS_PERCENT :Procent
###length VEHICLE_TYPES
@@ -4434,6 +4443,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Altid benyt
STR_ORDER_DROP_SERVICE_DEPOT :Service hvis nødvendigt
STR_ORDER_DROP_HALT_DEPOT :Stop
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Data som ordrespring baseres på
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt
index e24f3ecf92..1bbf2c6a23 100644
--- a/src/lang/dutch.txt
+++ b/src/lang/dutch.txt
@@ -4554,6 +4554,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Altijd gaan
STR_ORDER_DROP_SERVICE_DEPOT :Onderhouden wanneer nodig
STR_ORDER_DROP_HALT_DEPOT :Stoppen
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Voertuiggegevens voor basisspringen wanneer
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/english.txt b/src/lang/english.txt
index a8a1bc3f68..6e685acf82 100644
--- a/src/lang/english.txt
+++ b/src/lang/english.txt
@@ -4559,7 +4559,14 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Always go
STR_ORDER_DROP_SERVICE_DEPOT :Service if needed
STR_ORDER_DROP_HALT_DEPOT :Stop
STR_ORDER_DROP_UNBUNCH :Unbunch
-STR_ORDER_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot
+
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot
+STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot
+STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot
+STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Select the action to take at this hangar
+###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Vehicle data to base jumping on
@@ -5105,7 +5112,6 @@ STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}... cann
STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}... cannot unbunch a vehicle with a full load order
STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}... cannot use conditional orders when vehicle has an unbunching order
STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}... cannot unbunch a vehicle with a conditional order
-STR_ERROR_UNBUNCHING_NO_SERVICE_IF_NEEDED :{WHITE}... vehicle must always visit the depot to unbunch there
# Autoreplace related errors
STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} is too long after replacement
diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt
index 79f6a858ee..fbf1abdbe5 100644
--- a/src/lang/english_AU.txt
+++ b/src/lang/english_AU.txt
@@ -1932,6 +1932,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Set the year wh
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Cycle through signal types: {STRING}
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Select which signal types to cycle through when Ctrl+Clicking on a built signal with the signal tool
###length 2
+STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Current group only
STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :All visible
STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Show signal types: {STRING}
@@ -4375,6 +4376,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Current
# Messages in the start stop button in the vehicle view
STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Loading / Unloading
STR_VEHICLE_STATUS_LEAVING :{LTBLUE}Leaving
+STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}Waiting to unbunch
STR_VEHICLE_STATUS_CRASHED :{RED}Crashed!
STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}Broken down
STR_VEHICLE_STATUS_STOPPED :{RED}Stopped
@@ -4388,6 +4390,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}No orde
STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Heading for {WAYPOINT}, {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}Heading for {DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Service at {DEPOT}, {VELOCITY}
+STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}Unbunch and service at {DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}Cannot reach {STATION}, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}Cannot reach {WAYPOINT}, {VELOCITY}
@@ -4518,6 +4521,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Switch t
STR_ORDERS_LIST_TOOLTIP :{BLACK}Order list - click on an order to highlight it. Ctrl+Click to scroll to the order's destination
STR_ORDER_INDEX :{COMMA}:{NBSP}
+STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING}
STR_ORDERS_END_OF_ORDERS :- - End of Orders - -
STR_ORDERS_END_OF_SHARED_ORDERS :- - End of Shared Orders - -
@@ -4554,6 +4558,15 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :Available cargo
STR_ORDER_DROP_GO_ALWAYS_DEPOT :Always go
STR_ORDER_DROP_SERVICE_DEPOT :Service if needed
STR_ORDER_DROP_HALT_DEPOT :Stop
+STR_ORDER_DROP_UNBUNCH :Unbunch
+
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot
+STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot
+STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot
+STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Select the action to take at this hangar
+###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Vehicle data to base jumping on
@@ -4622,6 +4635,7 @@ STR_ORDER_REFIT_ORDER :(Refit to {STRI
STR_ORDER_REFIT_STOP_ORDER :(Refit to {STRING} and stop)
STR_ORDER_STOP_ORDER :(Stop)
+STR_ORDER_WAIT_TO_UNBUNCH :(wait to unbunch)
STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING}
STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Can't use station){POP_COLOUR} {STRING} {STATION} {STRING}
@@ -5093,6 +5107,11 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Unable t
STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Wrong depot type
# Depot unbunching related errors
+STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}... can only have one unbunching order
+STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}... cannot use full load orders when vehicle has an unbunching order
+STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}... cannot unbunch a vehicle with a full load order
+STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}... cannot use conditional orders when vehicle has an unbunching order
+STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}... cannot unbunch a vehicle with a conditional order
# Autoreplace related errors
STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} is too long after replacement
diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt
index f9f01d5e6e..6a7ac5d005 100644
--- a/src/lang/english_US.txt
+++ b/src/lang/english_US.txt
@@ -1932,6 +1932,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Set the year wh
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Cycle through signal types: {STRING}
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Select which signal types to cycle through when Ctrl+Clicking on a built signal with the signal tool
###length 2
+STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Current group only
STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :All visible
STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Show signal types: {STRING}
@@ -4375,6 +4376,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Current
# Messages in the start stop button in the vehicle view
STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Loading / Unloading
STR_VEHICLE_STATUS_LEAVING :{LTBLUE}Leaving
+STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}Waiting to unbunch
STR_VEHICLE_STATUS_CRASHED :{RED}Crashed!
STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}Broken down
STR_VEHICLE_STATUS_STOPPED :{RED}Stopped
@@ -4388,6 +4390,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}No orde
STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Heading for {WAYPOINT}, {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}Heading for {DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Maintenance at {DEPOT}, {VELOCITY}
+STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}Unbunch and service at {DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}Cannot reach {STATION}, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}Cannot reach {WAYPOINT}, {VELOCITY}
@@ -4518,6 +4521,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Switch t
STR_ORDERS_LIST_TOOLTIP :{BLACK}Order list - click on an order to highlight it. Ctrl+Click to scroll to the order's destination
STR_ORDER_INDEX :{COMMA}:{NBSP}
+STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING}
STR_ORDERS_END_OF_ORDERS :- - End of Orders - -
STR_ORDERS_END_OF_SHARED_ORDERS :- - End of Shared Orders - -
@@ -4554,6 +4558,15 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :Available cargo
STR_ORDER_DROP_GO_ALWAYS_DEPOT :Always go
STR_ORDER_DROP_SERVICE_DEPOT :Repair if needed
STR_ORDER_DROP_HALT_DEPOT :Stop
+STR_ORDER_DROP_UNBUNCH :Unbunch
+
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot
+STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot
+STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot
+STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Select the action to take at this hangar
+###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Vehicle data to base jumping on
@@ -4622,6 +4635,7 @@ STR_ORDER_REFIT_ORDER :(Refit to {STRI
STR_ORDER_REFIT_STOP_ORDER :(Refit to {STRING} and stop)
STR_ORDER_STOP_ORDER :(Stop)
+STR_ORDER_WAIT_TO_UNBUNCH :(wait to unbunch)
STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING}
STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Can't use station){POP_COLOUR} {STRING} {STATION} {STRING}
@@ -5093,6 +5107,11 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Unable t
STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Wrong depot type
# Depot unbunching related errors
+STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}... can only have one unbunching order
+STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}... cannot use full load orders when vehicle has an unbunching order
+STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}... cannot unbunch a vehicle with a full load order
+STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}... cannot use conditional orders when vehicle has an unbunching order
+STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}... cannot unbunch a vehicle with a conditional order
# Autoreplace related errors
STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} is too long after replacement
diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt
index 28b4e51391..c36d00e84f 100644
--- a/src/lang/esperanto.txt
+++ b/src/lang/esperanto.txt
@@ -320,8 +320,13 @@ STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}
STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m
# Time units used in string control characters
+STR_UNITS_DAYS :{COMMA}{NBSP}tago{P "" j}
+STR_UNITS_SECONDS :{COMMA}{NBSP}sekundo{P "" j}
+STR_UNITS_MONTHS :{NUM}{NBSP}monato{P "" j}
+STR_UNITS_MINUTES :{NUM}{NBSP}minuto{P "" j}
+STR_UNITS_YEARS :{NUM}{NBSP}jaro{P "" j}
# Common window strings
STR_LIST_FILTER_TITLE :{BLACK}Filtroteksto:
@@ -430,7 +435,7 @@ STR_GOTO_ORDER_VIEW :{BLACK}Itinero
###length 31
STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Paŭzigu la ludon
STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}Rapide pluirigu la ludon
-STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Opcioj kaj agordoj
+STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Agordoj
STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}Konservu ludon, foriru ludo, forlasi
STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Montru mapon, ekstran vidujon, fluon de ŝarĝoj aŭ liston de ŝildoj
STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}Montru urbaron
@@ -489,7 +494,7 @@ STR_SCENEDIT_FILE_MENU_QUIT :Forlasi
# Settings menu
###length 16
-STR_SETTINGS_MENU_GAME_OPTIONS :Ludaj opcioj
+STR_SETTINGS_MENU_GAME_OPTIONS :Ludaj agordoj
STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Agordoj
STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Ludoskriptaj agordoj
STR_SETTINGS_MENU_NEWGRF_SETTINGS :Agordoj de NewGRF
@@ -506,7 +511,7 @@ STR_SETTINGS_MENU_TRANSPARENT_SIGNS :Travideblaj sig
# File menu
STR_FILE_MENU_SAVE_GAME :Konservu ludon
-STR_FILE_MENU_LOAD_GAME :Ŝarĝu ludon
+STR_FILE_MENU_LOAD_GAME :Enlegi ludon
STR_FILE_MENU_QUIT_GAME :Foriru de la ludo
STR_FILE_MENU_EXIT :Fermu
@@ -947,7 +952,12 @@ STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}Nova {ST
STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Subvencia oferto ne plu validas:{}{}Transportado de {STRING} de {STRING} al {STRING} ne estos subvenciata.
STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Subvencio retiriĝis:{}{}Servo de {STRING} de {STRING} al {STRING} ne plu estas subvenciata.
+STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Subvencia proponiĝas:{}{}Unua {STRING} de {STRING} al {STRING} ricevos {UNITS_YEARS_OR_MINUTES} subvencion de la lokaj estroj!
###length 4
+STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}Subvencion gajnis {STRING}!{}{}{STRING} de {STRING} al {STRING} pagiĝos kun aldono je 50% dum la sekvontaj {UNITS_YEARS_OR_MINUTES}!
+STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}Subvencion gajnis {STRING}!{}{}{STRING} de {STRING} al {STRING} pagiĝos duoble dum la sekvontaj {UNITS_YEARS_OR_MINUTES}!
+STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Subvencion gajnis {STRING}!{}{}{STRING} de {STRING} al {STRING} pagiĝos trioble dum la sekvontaj {UNITS_YEARS_OR_MINUTES}!
+STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Suvencion gajnis {STRING}!{}{}{STRING} de {STRING} al {STRING} pagiĝos kvaroble dum la sekvontaj {UNITS_YEARS_OR_MINUTES}!
STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Transporta monopolo!
@@ -959,7 +969,7 @@ STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Gluu de
STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Gluu la lokon de ĉi tiu vidujo al la ĉefvido
# Game options window
-STR_GAME_OPTIONS_CAPTION :{WHITE}Ludaj Opcioj
+STR_GAME_OPTIONS_CAPTION :{WHITE}Ludaj agordoj
STR_GAME_OPTIONS_TAB_GENERAL :Ĝenerale
STR_GAME_OPTIONS_TAB_GENERAL_TT :{BLACK}Elektu ĝeneralajn agordojn
@@ -1287,6 +1297,7 @@ STR_CONFIG_SETTING_SUBSIDY_DURATION :Daŭro de subve
###length 2
STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Indiku por kiom da jaroj validas subvencio
+STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR_PERIODS}n
###setting-zero-is-special
STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Neniuj subvencioj
@@ -1464,6 +1475,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Veturiloj nenia
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Se tiu ĉi agordo estas aktiva, ĉiuj modeloj de veturiloj restos aĉeteblaj por ĉiam post ekhaveblo
###length 2
+STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :Kalendaro
###setting-zero-is-special
@@ -2078,14 +2090,14 @@ STR_VIDEO_DRIVER_ERROR_NO_HARDWARE_ACCELERATION :{WHITE}... ne t
# Intro window
STR_INTRO_CAPTION :{WHITE}OpenTTD {REV}
-STR_INTRO_NEW_GAME :{BLACK}Nova Ludo
+STR_INTRO_NEW_GAME :{BLACK}Novan ludon
STR_INTRO_LOAD_GAME :{BLACK}Ŝarĝu ludon
-STR_INTRO_PLAY_SCENARIO :{BLACK}Ludu Scenaron
-STR_INTRO_PLAY_HEIGHTMAP :{BLACK}Ludu Altecmapon
+STR_INTRO_PLAY_SCENARIO :{BLACK}Ludi scenaron
+STR_INTRO_PLAY_HEIGHTMAP :{BLACK}Ludi altecmapon
STR_INTRO_SCENARIO_EDITOR :{BLACK}Scenarkreilo
STR_INTRO_MULTIPLAYER :{BLACK}Pluraj Ludantoj
-STR_INTRO_GAME_OPTIONS :{BLACK}Ludaj Opcioj
+STR_INTRO_GAME_OPTIONS :{BLACK}Ludaj agordoj
STR_INTRO_HIGHSCORE :{BLACK}Altpoentara tabelo
STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Agordoj
STR_INTRO_NEWGRF_SETTINGS :{BLACK}Agordoj de NewGRF
@@ -2106,7 +2118,7 @@ STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Elektu '
STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Elektu 'sub-tropikan' landstilon
STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Elektu 'ludlandan' landstilon
-STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Montru ludajn opciojn
+STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Montri ludajn agordojn
STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Montru altpoentara tabelo
STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Montru agordojn
STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Montri NewGRF-agordojn
@@ -2394,7 +2406,7 @@ STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Jes, ĉi
STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Jes, ne demandu denove
STR_NETWORK_ASK_SURVEY_CAPTION :Partopreni aŭtomatan sondadon?
-STR_NETWORK_ASK_SURVEY_TEXT :Ĉu vi volas partopreni la aŭtomatan sondadon?{}OpenTTD sendos sondaĵon post foriro el ludo.{}Vi povas ŝanĝi tion ĉi iam ajn sub "Ludaj Opcioj".
+STR_NETWORK_ASK_SURVEY_TEXT :Ĉu vi volas partopreni la aŭtomatan sondadon?{}OpenTTD sendos sondaĵon post foriro el ludo.{}Vi povas ŝanĝi tion ĉi iam ajn sub "Ludaj agordoj".
STR_NETWORK_ASK_SURVEY_PREVIEW :Antaŭmontru sondaĵrezulton
STR_NETWORK_ASK_SURVEY_LINK :Pri sondado kaj privateco
STR_NETWORK_ASK_SURVEY_NO :Ne
@@ -2614,6 +2626,7 @@ STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLA
# Linkgraph tooltip
STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} transportenda reen ({COMMA}% de la kapacito)
+STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Meznombra veturtempo: {UNITS_DAYS_OR_SECONDS}
# Base for station construction window(s)
STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Ŝarĝregiona marko
@@ -3428,6 +3441,8 @@ STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{ORANGE}{STRING}{GREEN} liverita
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{RED} (ankoraŭ bezonata)
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{GREEN} (liverita)
+STR_TOWN_VIEW_TOWN_GROWS_EVERY :{BLACK}La urbo kreskas ĉiun {ORANGE}{UNITS_DAYS_OR_SECONDS}
+STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}La urbo kreskas ĉiun {ORANGE}{UNITS_DAYS_OR_SECONDS} (pagata)
STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}La urbo {RED}ne{BLACK} kreskas
STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Urba brulimo: {ORANGE}{COMMA}{BLACK} maks: {ORANGE}{COMMA}
STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Centri ĉefvidon ĉe la urbo. Stir+Klak por malfermi novan vidujon ĉe la urba loko.
@@ -3504,8 +3519,10 @@ STR_GOAL_QUESTION_BUTTON_CLOSE :Fermu
# Subsidies window
STR_SUBSIDIES_CAPTION :{WHITE}Subvencioj
STR_SUBSIDIES_OFFERED_TITLE :{BLACK}Subvencioj haveblas por jenaj servoj:
+STR_SUBSIDIES_OFFERED_FROM_TO :{ORANGE}{STRING} de {STRING} al {STRING}{YELLOW} ({STRING})
STR_SUBSIDIES_NONE :{ORANGE}- Neniu -
STR_SUBSIDIES_SUBSIDISED_TITLE :{BLACK}Servoj subvenciataj:
+STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING} de {STRING} al {STRING}{YELLOW} ({COMPANY}{YELLOW}, {STRING})
STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klaku servon por centri vidpunkto ĉe la industrio/urbo. Ctrl+Klak por malfermi novan vidujon ĉe la loko
# Story book window
@@ -4184,6 +4201,8 @@ STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Enhaveco
STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Transigaj Kreditoj: {LTBLUE}{CURRENCY_LONG}
+STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS :{BLACK}Prizorga intertempo: {LTBLUE}{COMMA}{NBSP}tagoj{BLACK} {STRING}
+STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Prizorga intertempo: {LTBLUE}{COMMA}%{BLACK} {STRING}
STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Ŝanĝi la tipo de servon intervalon
STR_VEHICLE_DETAILS_DEFAULT :Defaŭlto
@@ -4252,6 +4271,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Montri h
STR_ORDERS_LIST_TOOLTIP :{BLACK}Ordonlisto - klaku ordonon por elekti. Ctrl+Klak rulumas al la celstacio
STR_ORDER_INDEX :{COMMA}:{NBSP}
+STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING}
STR_ORDERS_END_OF_ORDERS :- - Fino de Ordonoj - -
STR_ORDERS_END_OF_SHARED_ORDERS :- - Fino de Kunhavitaj Ordonoj - -
@@ -4289,6 +4309,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ĉiam iru.
STR_ORDER_DROP_SERVICE_DEPOT :Prizorgu se necesas.
STR_ORDER_DROP_HALT_DEPOT :Haltu.
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
# Conditional order variables, must follow order of OrderConditionVariable enum
###length 8
@@ -4545,6 +4569,7 @@ STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Ludoskripto
STR_AI_SETTINGS_CLOSE :{BLACK}Fermi
STR_AI_SETTINGS_RESET :{BLACK}Reŝargo
STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING}
+STR_AI_SETTINGS_SETTING_DEVIATION :{STRING}: {ORANGE}[{STRING}, {STRING}]
# Textfile window
diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt
index 553e3a9332..ebef38c2f7 100644
--- a/src/lang/estonian.txt
+++ b/src/lang/estonian.txt
@@ -4341,6 +4341,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Alati
STR_ORDER_DROP_SERVICE_DEPOT :Vajadusel
STR_ORDER_DROP_HALT_DEPOT :Peatu
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Sõiduki andmed, millel korralduse vahelejätmine põhineb
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt
index 86c4646d74..ddfdc70b50 100644
--- a/src/lang/faroese.txt
+++ b/src/lang/faroese.txt
@@ -3427,6 +3427,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Far altíð
STR_ORDER_DROP_SERVICE_DEPOT :Eftirlit um neyðugt
STR_ORDER_DROP_HALT_DEPOT :Steðga
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
# Conditional order variables, must follow order of OrderConditionVariable enum
###length 8
diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt
index ea13022bd2..c3df8a9dc0 100644
--- a/src/lang/finnish.txt
+++ b/src/lang/finnish.txt
@@ -366,6 +366,7 @@ STR_SORT_BY_TOTAL_PROFIT_LAST_PERIOD :Kokonaistuotto
STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Kokonaistuotto tänä vuonna
STR_SORT_BY_TOTAL_PROFIT_THIS_PERIOD :Kokonaistuotto tällä jaksolla
STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Keskimääräinen tuotto viime vuonna
+STR_SORT_BY_AVERAGE_PROFIT_LAST_PERIOD :Keskimääräinen tuotto viime jaksolla
STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Keskimääräinen tuotto tänä vuonna
STR_SORT_BY_AVERAGE_PROFIT_THIS_PERIOD :Keskimääräinen tuotto tällä jaksolla
@@ -383,32 +384,32 @@ STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Tauko
STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}Nopeuta peliä
STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Valinnat ja asetukset
STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}Tallenna, lataa tai hylkää peli, lopeta ohjelma
-STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Näytä kartta, lisänäkymä, rahtivirrat tai kylttilista
-STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}Näytä kuntahakemisto
-STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Näytä tukitarjoukset
-STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Näytä luettelo yhtiön asemista
+STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Avaa kartta, lisänäkymä, rahtivirrat tai kylttilista
+STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}Näytä kuntahakemisto tai perusta kunta
+STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Avaa lista tuista
+STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Avaa luettelo yhtiön asemista
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Näytä yhtiön taloustiedot
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Näytä yhtiön yleiset tiedot
-STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Näytä yhtiöhistoria
-STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Näytä tavoitteet
+STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Avaa tarinakirja
+STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Avaa tavoiteluettelo
STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Näytä yhtiökuvaajat ja rahtitaksat
-STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Näytä yhtiökilpataulukko
-STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Tutki teollisuuslaitoksia tai rahoita uuden teollisuuden rakentamista
-STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Näytä luettelo yhtiön junista. Ctrl+napsautus näyttää luettelon ilman ryhmäluetteloa.
-STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Näytä luettelo yhtiön ajoneuvoista. Ctrl+napsautus näyttää luettelon ilman ryhmäluetteloa.
-STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Näytä luettelo yhtiön laivoista. Ctrl+napsautus näyttää luettelon ilman ryhmäluetteloa.
-STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Näytä luettelo yhtiön ilma-aluksista. Ctrl+napsautus näyttää luettelon ilman ryhmäluetteloa.
-STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Lähennä näkymää
-STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Loitonna näkymää
+STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Avaa yhtiökilpataulukko
+STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Avaa teollisuushakemisto, teollisuusketjut, tai rahoita uuden teollisuuden rakentaminen
+STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Avaa luettelo yhtiön junista. Ctrl+napsautus näyttää tai piilottaa kulkuneuvoryhmät päinvastoin kuin valitussa asetuksessa.
+STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Avaa luettelo yhtiön ajoneuvoista. Ctrl+napsautus näyttää tai piilottaa ajoneuvoryhmät päinvastoin kuin valitussa asetuksessa
+STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Avaa luettelo yhtiön laivoista. Ctrl+napsautus näyttää tai piilottaa kulkuneuvoryhmät, päinvastoin kuin valitussa asetuksessa
+STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Näytä luettelo yhtiön ilma-aluksista. Ctrl+napsautus näyttääksesi näyttää tai piilottaa ajoneuvoryhmiä, päinvastoin kuin valitussa asetuksessa
+STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Lähennä
+STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Loitonna
STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Rakenna rautateitä
-STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Rakenna teitä
-STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Rakenna raitioteitä
-STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Rakenna satamia
+STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Tieinfrastruktuurin rakentaminen
+STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Raitiotieinfrastruktuurin rakentaminen
+STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Vesiväyläinfrastruktuurin rakentaminen
STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Rakenna lentokenttiä
-STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Avaa maastonmuokkaustyökalupalkki maan kohottamiseen/madaltamiseen, puiden istuttamiseen, jne.
-STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Näytä ääni- ja musiikkiasetukset
-STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Näytä viimeisin viesti/uutisraportti, näytä viestihistoria tai poista kaikki viestit
-STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Maa-aluetiedot, kuvakaappaus, tietoja OpenTTD:stä, kehittäjätyökalut
+STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Avaa maastonmuokkausvalikko, puuvalikko, tai aseta kyltti
+STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Avaa ääni- ja musiikkiasetukset
+STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Avaa viimeisin viesti tai uutisraportti, avaa viestihistoria, tai poista kaikki viestit
+STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Avaa maa-aluetiedot, kuvakaappausvalikko, OpenTTD:n tekijäluettelo tai kehittäjätyökalut
STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR :{BLACK}Vaihda työkalupalkkeja
# Extra tooltips for the scenario editor toolbar
@@ -418,15 +419,15 @@ STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR :{YELLOW}Skenaar
STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD :{BLACK}Siirrä aloituspäivää vuodella taaksepäin
STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD :{BLACK}Siirrä aloituspäivää vuodella eteenpäin
STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE :{BLACK}Aseta aloitusvuosi napsauttamalla
-STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Näytä kartta, kuntahakemisto
-STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Maaston luonti
-STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Kuntien luonti
-STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Teollisuuden luonti
-STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Tienrakennus
-STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Raitiotien rakentaminen
-STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Istuta puita. Ctrl valitsee alueen vinottain. Shift vaihtaa istutustilan ja kustannusarvion välillä
+STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Avaa kartta, lisänäkymä, kylttiluettelo tai kunta- tai teollisuushakemisto
+STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Avaa maastonmuokkausvalikko tai luo uusi maailma
+STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Kuntien rakentaminen tai luominen
+STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Rakenna tai luo teollisuutta
+STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Tieinfrastruktuurin rakentaminen
+STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Raitiotieinfrastruktuurin rakentaminen
+STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Istuta puita. Ctrl+napsautus+veto valitaksesi alueen vinottain. Painettaessa Shift näyttää vain kustannusarvion
STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Sijoita kyltti
-STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Sijoita objekti. Ctrl valitsee alueen vinottain. Shift vaihtaa rakennustilan ja kustannusarvion välillä
+STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Sijoita objekti. Ctrl+napsautus+vedä valitsee alueen vinottain. Painettaessa Shit näyttää vain kustannusarvion
# Scenario editor file menu
###length 7
@@ -633,6 +634,7 @@ STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Napsauta
# Company league window
STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Yhtiökilpataulukko
STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPANY} {BLACK}{COMPANY_NUM} ”{STRING}”
+STR_COMPANY_LEAGUE_COMPANY_RANK :{YELLOW}{NUM}.
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER :Veturinkuljettaja
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER :Liikennepäällikkö
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR :Kuljetusjohtaja
@@ -664,6 +666,7 @@ STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Laina:
STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Yhteensä:
###next-name-looks-similar
+STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_YEARS :{BLACK}Viime vuonna voittoa tuottaneiden kulkuneuvojen lukumäärä. Tähän sisältyvät ajoneuvot, junat, laivat ja lentokoneet
STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_PERIODS :{BLACK}Viime jaksolla voittoa tuottaneiden kulkuneuvojen lukumäärä. Tähän sisältyvät ajoneuvot, junat, laivat ja lentokoneet
STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Asemien osien määrä. Kaikki osat asemista (esim. rautatieasema, bussipysäkki, lentokenttä) lasketaan, vaikka ne olisivat yhdistettynä yhdeksi asemaksi
STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_YEARS :{BLACK}Vähiten tuottaneen kulkuneuvon tuotto (huomioon otetaan vain yli kahden vuoden ikäiset kulkuneuvot)
@@ -901,6 +904,7 @@ STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD_AND :{WHITE}{VEHICLE
STR_NEWS_TRAIN_IS_STUCK :{WHITE}{VEHICLE} ei löydä reittiä päämäärään
STR_NEWS_VEHICLE_IS_LOST :{WHITE}{VEHICLE} on eksynyt
STR_NEWS_VEHICLE_UNPROFITABLE_YEAR :{WHITE}Kulkuneuvon {VEHICLE} tuotto viime vuonna oli {CURRENCY_LONG}
+STR_NEWS_VEHICLE_UNPROFITABLE_PERIOD :{WHITE}Kulkuneuvon {VEHICLE} tuotto viime jaksolla oli {CURRENCY_LONG}
STR_NEWS_AIRCRAFT_DEST_TOO_FAR :{WHITE}{VEHICLE} ei pääse seuraavaan määränpäähän koska se on toimintasäteen ulkopuolella
STR_NEWS_ORDER_REFIT_FAILED :{WHITE}Korvauksen epäonnistuminen pysäytti kulkuneuvon {VEHICLE}
@@ -917,11 +921,17 @@ STR_NEWS_STATION_NOW_ACCEPTS_CARGO_LIST :{WHITE}{STATION
STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Tukitarjous päättynyt:{}{}{STRING} välillä {STRING} – {STRING} ei enää tulla tukemaan
STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Tuki vedetty pois:{}{}{STRING} välillä {STRING}-{STRING} ei enää tueta
+STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Tuki tarjolla:{}{}Paikallisviranomaiset tukevat ensimmäistä {STRING} välillä {STRING} – {STRING} {UNITS_YEARS_OR_MINUTES}!
###length 4
+STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}{STRING} sai tuen!{}{}{STRING} välillä {STRING} – {STRING} tuottaa puolitoistakertaisesti seuraavat {UNITS_YEARS_OR_MINUTES}!
+STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}{STRING} sai tuen!{}{}{STRING} välillä {STRING} – {STRING} tuottaa kaksinkertaisesti seuraavat {UNITS_YEARS_OR_MINUTES}!
+STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}{STRING} sai tuen!{}{}{STRING} välillä {STRING} – {STRING} tuottaa kolminkertaisesti seuraavat {UNITS_YEARS_OR_MINUTES}!
+STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}{STRING} sai tuen!{}{}{STRING} välillä {STRING} – {STRING} tuottaa nelinkertaisesti seuraavat {UNITS_YEARS_OR_MINUTES}!
STR_NEWS_ROAD_REBUILDING_MONTHS :{BIG_FONT}{BLACK}Liikennekaaos paikkakunnalla {TOWN}!{}{}Yhtiön {STRING} rahoittama tienrakennusohjelma tuo autoilijoille 6 kuukautta kärsimystä!
STR_NEWS_ROAD_REBUILDING_MINUTES :{BIG_FONT}{BLACK}Liikennekaaos paikkakunnalla {TOWN}!{}{}Yhtiön {STRING} rahoittama tienrakennusohjelma tuo autoilijoille 6 minuuttia kärsimystä!
STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Kuljetusmonopoli!
+STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MONTHS :{BIG_FONT}{BLACK}Kunnan {TOWN} viranomaiset ovat sopineet yhtiön {STRING} kanssa 12 kuukauden kuljetusyksinoikeudesta!
STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MINUTES :{BIG_FONT}{BLACK}Kunnan {TOWN} viranomaiset ovat sopineet yhtiön {STRING} kanssa 12 minuutin kuljetusyksinoikeudesta!
# Extra view window
@@ -1261,6 +1271,8 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :oikealla
STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}sekunti{P 0 "" a}
+STR_CONFIG_SETTING_INFINITE_MONEY :Loputon raha: {STRING}
+STR_CONFIG_SETTING_INFINITE_MONEY_HELPTEXT :Salli rajaton rahankäyttö ja estä yritysten konkurssit
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Suurin mahdollinen laina alussa: {STRING}
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Suurin mahdollinen yhtiön ottama laina (ottamatta huomioon inflaatiota)
@@ -1288,6 +1300,7 @@ STR_CONFIG_SETTING_SUBSIDY_DURATION :Tuen kesto: {ST
STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Aseta myönnettävän tuen kesto vuosina
STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT_PERIODS :Aseta myönnettävän tuen kesto jaksoina
+STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR_PERIODS}
###setting-zero-is-special
STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Ei tukia
@@ -1349,7 +1362,7 @@ STR_CONFIG_SETTING_FORBID_90_DEG :90 asteen kää
STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :90 asteen käännöksiä esiintyy kun vaakasuuntaista rataa seuraa pystysuuntainen rata viereisellä ruudulla, tämä vaatii junan kääntymään 90 astetta ruutujen reunalla normaalin 45 asteen sijasta.
STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS :Salli ei-vierekkäisten asemien yhdistäminen: {STRING}
-STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Mahdollistaa aseman osien rakentamisen vaikka ne eivät olisi kosketuksissa olemassaoleviin aseman osiin. Vaatii Ctrl-näppäimen painamisen rakennettaessa
+STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Mahdollistaa aseman osien rakentamisen vaikka ne eivät olisi kosketuksissa olemassaoleviin aseman osiin painamalla Ctrl-näppäintä rakennettaessa
STR_CONFIG_SETTING_INFLATION :Inflaatio: {STRING}
STR_CONFIG_SETTING_INFLATION_HELPTEXT :Ota talouden inflaatio käyttöön. Mikäli käytössä, hinnat nousevat hieman nopeammin kuin kuljetusmaksut
@@ -1389,6 +1402,7 @@ STR_CONFIG_SETTING_SHOWFINANCES_PERIOD :Näytä talousi
###length 2
STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :Mikäli käytössä, talousikkuna näytetään jokaisen vuoden lopussa yhtiön taloudellisen tilanteen seurannan helpottamiseksi
+STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT_PERIOD :Mikäli käytössä, talousikkuna näytetään jokaisen jakson lopussa yhtiön taloudellisen tilanteen seurannan helpottamiseksi
STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Uudet käskyt ovat oletusarvoisesti ilman välipysähdyksiä: {STRING}
STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normaalisti kulkuneuvo pysähtyy jokaisella läpikulkemallaan asemalla. Mikäli tämä asetus on käytössä kulkuneuvot eivät pysähdy ajaessaan asemien läpi. Huomioi, että tämä asetus määrittää oletusarvoisen toiminnon uusille kulkuneuvoille. Asetusta voidaan muuttaa erikseen kunkin kulkuneuvon kohdalla
@@ -1415,7 +1429,8 @@ STR_CONFIG_SETTING_BRIBE_HELPTEXT_MINUTES :Salli yhtiöide
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Salli kuljetusyksinoikeuksien ostaminen: {STRING}
###length 2
-STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Jos yhtiö ostaa kuljetusyksinoikeudet kuntaan, vastustajien matkustaja- ja rahtiasemat eivät vastaanota rahtia seuraavan vuoden ajan
+STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Jos yhtiö ostaa kuljetusyksinoikeudet kuntaan, vastustajien matkustaja- ja rahtiasemat eivät ota vastaan rahtia kahteentoista kuukauteen
+STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT_MINUTES :Jos yhtiö ostaa kuljetusyksinoikeudet kuntaan, vastustajien matkustaja- ja rahtiasemat eivät ota vastaan rahtia kahteentoista minuuttiin
STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Salli rakennusten rahoittaminen: {STRING}
STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :Sallii yhtiöiden rahoittaa uusien talojen rakentamista kunnissa
@@ -1424,7 +1439,7 @@ STR_CONFIG_SETTING_ALLOW_FUND_ROAD :Salli paikallis
STR_CONFIG_SETTING_ALLOW_FUND_ROAD_HELPTEXT :Salli yritysten antaa kunnille rahaa tiestön peruskorjaukseen tiestöön perustuvien palvelujen sabotoimiseksi kunnassa
STR_CONFIG_SETTING_ALLOW_GIVE_MONEY :Salli rahan lähettäminen muille yhtiöille: {STRING}
-STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :Sallii rahan siirtämisen yhtiöiden välillä moninpelitilassa
+STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :Salli rahan siirtäminen yhtiöiden välillä moninpelitilassa
STR_CONFIG_SETTING_FREIGHT_TRAINS :Rahdin painokerroin raskaiden junien simulointia varten: {STRING}
STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :Määritä rahdin kuljettamisen vaikutus junissa. Korkeammat arvot tekevät rahdin kuljettamisesta raskaampaa junille, erityisesti mäissä
@@ -1488,9 +1503,15 @@ STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Seinäkello
STR_CONFIG_SETTING_MINUTES_PER_YEAR :Minuuttia vuodessa: {STRING}
STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT :Valitse minuuttien määrä kalenterivuodessa. Oletusarvo on 12 minuuttia. Aseta arvoksi 0, jos et halua kalenteriajan muuttuvan. Tämä asetus ei vaikuta pelin taloussimulaatioon, ja se on valittavissa vain seinäkelloaikaa käytettäessä.
+STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM}
###setting-zero-is-special
STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (kalenteriaika jäädytetty)
+STR_CONFIG_SETTING_TOWN_CARGO_SCALE :Skaalaa taajamarahdin tuotantoa: {STRING}
+STR_CONFIG_SETTING_TOWN_CARGO_SCALE_HELPTEXT :Skaalaa kuntien tuottaman rahdin määrää tällä prosenttiluvulla.
+STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE :Skaalaa teollisuusrahdin tuotantoa: {STRING}
+STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_HELPTEXT :Skaalaa tuotantolaitosten tuottaman rahdin määrää tällä prosenttiluvulla.
+STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}{NBSP}%
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Uudista kulkuneuvo automaattisesti, kun se vanhenee: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Mikäli käytössä, lähellä käyttöikänsä loppua oleva kulkuneuvo korvataan automaattisesti
@@ -1811,7 +1832,7 @@ STR_CONFIG_SETTING_SERVINT_AIRCRAFT :Lentokoneiden o
STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :Määritä oletushuoltoväli uusille lentokoneille, mikäli kulkuneuvolle ei ole määritelty erillistä huoltoväliä
STR_CONFIG_SETTING_SERVINT_SHIPS :Laivojen oletushuoltoväli: {STRING}
STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :Määritä oletushuoltoväli uusille laivoille, mikäli kulkuneuvolle ei ole määritelty erillistä huoltoväliä
-STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}päivä{P 0 "" ä}/%
+STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}Päivä{P 0 "" s}/Minuutti{P 0 "" s}/%
###setting-zero-is-special
STR_CONFIG_SETTING_SERVINT_DISABLED :Pois käytöstä
@@ -1903,7 +1924,7 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Opastimien väl
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Määrittää etäisyyden opastimien välillä seuraavaan esteeseen saakka (opastin, risteys) opastimia vedettäessä
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} ruutu{P 0 "" a}
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Pidä opastimien etäisyys vakiona vedettäessä: {STRING}
-STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Valitse käyttäytyminen vedettäessä opastimia Ctrl-näppäin pohjassa. Mikäli pois käytöstä, opastimia rakennetaan siltojen ja tunnelien ympärille pitkien opastimista vapaiden alueiden välttämiseksi. Mikäli käytössä, opastimia rakennetaan n ruudun välein, tehden vierekkäisten ratojen opastimien kohdistamisesta helpompaa
+STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Valitse opastimien sijoittelun käyttäytyminen opastimia vedettäessä. Mikäli poissa käytöstä, opastimia sijoitetaan tunneleiden ja siltojen ympärille pitkien opastimettomien osuuksien välttämiseksi. Mikäli käytössä, opastimet sijoitetaan n ruudun välein, mikä helpottaa opastimien kohdistamista rinnakkaisilla raiteilla
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Rakenna ensisijaisesti siipiopastimia ennen vuotta: {STRING}
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Valitse vuosi jonka jälkeen käytetään valo-opastimia. Ennen tätä vuotta käytetään siipiopastimia (joilla on sama toiminnallisuus mutta eri ulkonäkö)
@@ -1911,6 +1932,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Valitse vuosi j
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Vaihda opastintyyppien välillä: {STRING}
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Valitse, mitkä opastintyypit ovat käytössä painettaessa Ctrl-näppäintä opastimia rakennettaessa
###length 2
+STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Vain nykyinen ryhmä
STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Näytä kaikki
STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Näytä opastintyypit: {STRING}
@@ -2181,14 +2203,14 @@ STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Valitse
STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Valitse subtrooppinen maastotyyppi
STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Valitse lelumaan maastotyyppi
-STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Näytä pelin valinnat
-STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Näytä pistetaulukko
+STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Avaa pelin valinnat
+STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Avaa pistetaulukko
STR_INTRO_TOOLTIP_HELP :{BLACK}Tutustu dokumentaatioon ja online-resursseihin
STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Näytä asetukset
STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Näytä NewGRF-asetukset
STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Tarkista uutta ja päivitettyä sisältöä ladattavaksi
-STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Näytä tekoälyasetukset
-STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Näytä peliskriptiasetukset
+STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Avaa tekoälyasetukset
+STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Avaa peliskriptiasetukset
STR_INTRO_TOOLTIP_QUIT :{BLACK}Lopeta OpenTTD
STR_INTRO_BASESET :{BLACK}Valitusta perusgrafiikkapaketista puuttuu {NUM} sprite{P "" ä}. Tarkista, onko sille päivityksiä.
@@ -2245,7 +2267,7 @@ STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP :{BLACK}Näytä
STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Näytä laivaryhmien värit
STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP :{BLACK}Näytä ilma-alusryhmien värit
STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Valitse valitun kaavan ensisijainen väri. Ctrl+napsautus asettaa tämän värin kaikille kaavoille.
-STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Valitse valitun kaavan toissijainen väri. Ctrl+napsautus asettaa tämän värin kaikille kaavoille.
+STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Valitse valitun kaavan toissijainen väri. Ctrl+napsautus asettaaksesi tämän värin kaikille kaavoille.
STR_LIVERY_PANEL_TOOLTIP :{BLACK}Valitse muutettava väriteema, tai valitse useita Ctrl pohjassa. Paina valintalaatikkoa valitaksesi teeman
STR_LIVERY_TRAIN_GROUP_EMPTY :Junaryhmiä ei ole muodostettu
STR_LIVERY_ROAD_VEHICLE_GROUP_EMPTY :Ajoneuvoryhmiä ei ole muodostettu
@@ -2356,6 +2378,8 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Kartan k
STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Kartan koko{}Valitse lajitellaksesi koon mukaan
STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Päiväys
STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Nykyinen päivämäärä
+STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}h {NUM}min
+STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION :{BLACK}Peliaika
STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP :{BLACK}Peliaika, kun peli{}ei ollut pysäytettynä
STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Kieli, palvelimen versio, jne.
@@ -2731,6 +2755,7 @@ STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLA
STR_LINKGRAPH_STATS_TOOLTIP_MONTH :{BLACK}{CARGO_LONG} kuukaudessa kuljetettavana asemalta {STATION} asemalle {STATION} ({COMMA}{NBSP}% kapasiteetista){STRING}
STR_LINKGRAPH_STATS_TOOLTIP_MINUTE :{BLACK}{CARGO_LONG} minuutissa kuljetettavana asemalta {STATION} asemalle {STATION} ({COMMA}{NBSP}% kapasiteetista){STRING}
STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} kuljetettavana takaisin ({COMMA}{NBSP}% kapasiteetista)
+STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Keskimääräinen matka-aika: {UNITS_DAYS_OR_SECONDS}
# Base for station construction window(s)
STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Vaikutusalueen korostus
@@ -2759,16 +2784,16 @@ STR_RAIL_TOOLBAR_ELRAIL_CONSTRUCTION_CAPTION :Sähköradan ra
STR_RAIL_TOOLBAR_MONORAIL_CONSTRUCTION_CAPTION :Yksiraiteisen rakentaminen
STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Maglevin rakentaminen
-STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Rakenna rautateitä. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Rakenna rautatietä automaattisesti valittuun suuntaan. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Rakenna veturitalli (junien ostamista ja huoltoa varten). Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Rakenna reittipiste rautatielle. Ctrl mahdollistaa reittipisteiden yhdistämisen. Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Rakenna rautatieasema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Rakenna opastin rautatielle. Ctrl+napsautus rakentaa vaihtoehtoista opastintyyliä{}Ctrl+veto täyttää valitun rataosuuden opastimilla määrätyin välein. Ctrl+napsautus+veto täyttää seuraavaan risteykseen, asemaan tai opastimeen asti. Paina lisäksi Shiftiä nähdäksesi vain kustannusarvion
-STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Rakenna rautatiesilta. Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Rakenna rautatietunneli. Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Rautatien, opastimien, reittipisteiden ja asemien rakentaminen/poisto päälle/pois. Pidä pohjassa Ctrl-näppäintä poistaaksesi myös aseman tai reittipisteen alla olevat raiteet
-STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Muunna/päivitä raidetyyppi. Shift vaihtaa muuntotilan ja kustannusarvion välillä
+STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Rakenna rautatietä. Ctrl+napsautus poistaa rautatietä. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
+STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Rakenna rautatietä automaattisesti valittuun suuntaan. Ctrl+napsautus poistaaksesi rautatietä. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion
+STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Rakenna junavarikko (junien ostamista ja huoltoa varten). Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
+STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Rakenna reittipiste rautatielle. Ctrl+napsautus valitsee toisen reittipisteen, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
+STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Rakenna rautatieasema. Ctrl+napsautus valitsee toisen aseman, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
+STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Rakenna opastin rautatielle. Ctrl+napsautus rakentaa vaihtoehtoista opastintyyliä{}Ctrl+veto täyttää valitun rataosuuden opastimilla määrätyin välein. Ctrl+napsautus+veto täyttää seuraavaan risteykseen, asemaan tai opastimeen asti. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
+STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Rakenna rautatiesilta. Painettaessa Shift näyttää vain kustannusarvion
+STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Rakenna rautatietunneli. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
+STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Rautatien, opastimien, reittipisteiden ja asemien rakentaminen/poisto päälle/pois. Ctrl+napsautus poistaa myös reittipisteiden ja asemien raiteet
+STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Muunna/päivitä raidetyyppi. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
STR_RAIL_NAME_RAILROAD :Rautatie
STR_RAIL_NAME_ELRAIL :Sähköistetty rautatie
@@ -2844,25 +2869,25 @@ STR_BRIDGE_TUBULAR_SILICON :Putkirakenne, p
# Road construction toolbar
STR_ROAD_TOOLBAR_ROAD_CONSTRUCTION_CAPTION :{WHITE}Tien rakentaminen
STR_ROAD_TOOLBAR_TRAM_CONSTRUCTION_CAPTION :{WHITE}Raitiotien rakentaminen
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Rakenna tieosuus. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Rakenna raitiotietä. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Rakenna tieosuus. Ctrl+napsautus poistaa tieosuuden. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Rakenna raitiotietä. Ctrl+napsautus poistaa raitiotieosuuden. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion.
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Rakenna tieosuus automaattisesti valittuun suuntaan. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Rakenna raitiotieosuus automaattisesti valittuun suuntaan. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Rakenna autovarikko (ajoneuvojen ostamista ja huoltoa varten). Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Rakenna raitiotievarikko (vaunujen ostamiseen ja korjaamiseen). Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Rakenna linja-autoasema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Rakenna raitiotien matkustaja-asema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Rakenna lastauslaituri. Ctrl mahdollistaa laitureiden yhdistämisen yhdeksi asemaksi. Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Rakenna raitiotien rahtiasema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Rakenna raitiotieosuus automaattisesti valittuun suuntaan. Ctrl+napsautus poistaa raitiotieosuuden. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Rakenna ajoneuvovarikko (ajoneuvojen ostamista ja huoltoa varten). Painettaessa Shift näyttää vain kustannusarvion
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Rakenna raitiotievarikko (vaunujen ostamiseen ja korjaamiseen). Painettaessa Shift näyttää vain kustannusarvion
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Rakenna linja-autoasema. Ctrl+napsautus liittää asemat. Painettaessa Shift näyttää vain kustannusarvion
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Rakenna raitiotien matkustaja-asema. Ctrl+napsautus valitsee toisen aseman, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Rakenna lastauslaituri. Ctrl+napsautus valitsee toisen aseman, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Rakenna raitiotien rahtiasema. Ctrl+napsautus valitaksesi toisen aseman, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Ota yksisuuntaiset tiet käyttöön/pois käytöstä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Rakenna maantiesilta. Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Rakenna raitiotiesilta. Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Rakenna maantietunneli. Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Rakenna raitiotietunneli. Shift vaihtaa rakennustilan ja kustannusarvion välillä
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Rakenna maantiesilta. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Rakenna raitiotiesilta. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Rakenna maantietunneli. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Rakenna raitiotietunneli. Painettaessa Shift näyttää vain kustannusarvion
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Tien rakentaminen/siirtäminen päälle/pois
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Vaihda raitiotien rakentamisen ja purkamisen välillä
-STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Muunna tai päivitä tien tyyppi. Shift vaihtaa muuntotilan ja kustannusarvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Muunna tai päivitä raitiotien tyyppi. Shift vaihtaa muuntotilan ja kustannusarvion välillä
+STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Muunna tai päivitä tien tyyppi. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
+STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Muunna tai päivitä raitiotien tyyppi. Painettaessa Shift näyttää vain kustannusarvion
STR_ROAD_NAME_ROAD :Tie
STR_ROAD_NAME_TRAM :Raitiotie
@@ -2886,12 +2911,12 @@ STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Valitse
# Waterways toolbar (last two for SE only)
STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Vesireittien rakentaminen
STR_WATERWAYS_TOOLBAR_CAPTION_SE :{WHITE}Vesireitit
-STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Rakenna kanavia. Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Rakenna sulku. Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Rakenna telakka (laivojen ostamista ja huoltamista varten). Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Rakenna satama. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Sijoita poiju, jota voi käyttää reittipisteenä. Shift vaihtaa rakennustilan ja kustannusarvion välillä
-STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Rakenna akvedukti. Shift vaihtaa rakennustilan ja kustannusarvion välillä
+STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Rakenna kanavia. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
+STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Rakenna sulkuja. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
+STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Rakenna telakka (laivojen ostamista ja huoltamista varten). Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
+STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Rakenna satamalaituri. Ctrl+napsautus valitsee toisen aseman, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
+STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Sijoita poiju, jota voi käyttää reittipisteenä. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
+STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Rakenna akvedukti. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Rakenna kanava. Merenpinnan tasolla Ctrl+napsautus täyttää alueen merivedellä kanavan rakentamisen sijaan.
STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Sijoita jokia. Ctrl valitsee alueen vinottain.
@@ -2904,7 +2929,7 @@ STR_STATION_BUILD_DOCK_CAPTION :{WHITE}Satama
# Airport toolbar
STR_TOOLBAR_AIRCRAFT_CAPTION :{WHITE}Lentokentät
-STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP :{BLACK}Rakenna lentokenttä. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä
+STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP :{BLACK}Rakenna lentokenttä. Ctrl+napsautus valitsee toisen aseman, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
# Airport construction window
STR_STATION_BUILD_AIRPORT_CAPTION :{WHITE}Lentokentän valinta
@@ -2931,14 +2956,14 @@ STR_STATION_BUILD_NOISE :{BLACK}Aiheutet
# Landscaping toolbar
STR_LANDSCAPING_TOOLBAR :{WHITE}Maastonmuokkaus
-STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Laske ruudun kulmaa. Vetäminen laskee ensimmäistä valittua kulmaa ja tasoittaa valitun alueen kulman korkeudelle. Ctrl valitsee alueen vinottain. Shift vaihtaa muokkaustilan ja kustannusarvion välillä
-STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Nosta ruudun kulmaa. Vetäminen nostaa ensimmäistä valittua kulmaa ja tasoittaa valitun alueen kulman korkeudelle. Ctrl valitsee alueen vinottain. Shift vaihtaa muokkaustilan ja kustannusarvion välillä
-STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Tasoita maata ensimmäisen valitun kulman korkeudelle. Ctrl valitsee alueen vinottain. Shift vaihtaa muokkaustilan ja kustannusarvion välillä
-STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Osta maata tulevaa käyttöä varten. Ctrl valitsee alueen vinottain. Shift vaihtaa ostotilan ja kustannusarvion välillä
+STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Laske maaruudun kulmaa. Napsautus+veto laskee ensimmäisenä valittua kulmaa ja tasaa valitun alueen tämän kulman uudelle korkeudelle. Ctrl+napsautus+veto valitsee alueen vinottain. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion
+STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Nosta maaruudun kulmaa. Napsautus+veto nostaa ensimmäisenä valittua kulmaa ja tasaa valitun alueen tämän kulman uudelle korkeudelle. Ctrl+napsautus+veto valitsee alueen vinottain. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion
+STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Tasoita maata ensimmäisen valitun kulman korkeudelle. Ctrl+napsautus+veto valitsee alueen vinottain. Painettaessa Shift näyttää vain kustannusarvion
+STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Osta maata tulevaa käyttöä varten. Ctrl+napsautus+veto valitsee alueen vinottain. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
# Object construction window
STR_OBJECT_BUILD_CAPTION :{WHITE}Objektin valinta
-STR_OBJECT_BUILD_TOOLTIP :{BLACK}Valitse rakennettava objekti. Ctrl valitsee alueen vinottain. Shift vaihtaa rakennustilan ja kustannusarvion välillä
+STR_OBJECT_BUILD_TOOLTIP :{BLACK}Valitse rakennettava objekti. Ctrl+napsautus+veto valitaksesi alueen vinottain. Painettaessa Shift näyttää vain kustannusarvion
STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Valitse rakennettavan objektin luokka
STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Objektin esikatselu
STR_OBJECT_BUILD_SIZE :{BLACK}Koko: {GOLD}{NUM}×{NUM} ruutua
@@ -2950,7 +2975,7 @@ STR_OBJECT_CLASS_TRNS :Lähettimet
STR_PLANT_TREE_CAPTION :{WHITE}Puita
STR_PLANT_TREE_TOOLTIP :{BLACK}Valitse istutettava puutyyppi. Jos ruudussa on jo puu, tämä lisää uusia puita riippumatta valitun puun tyypistä
STR_TREES_RANDOM_TYPE :{BLACK}Sattumanvaraisia puita
-STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Istuta sattumanvaraisia puulajeja. Ctrl valitsee alueen vinottain. Shift vaihtaa istutustilan ja kustannusarvion välillä
+STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Istuta sattumanvaraisia puulajeja. Ctrl+napsautus+veto valitsee alueen vinottain. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Satunnaisia puita.
STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Istuta puita satunnaisesti maastoon
STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Tavallinen
@@ -3292,9 +3317,9 @@ STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Luo maai
STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF-asetukset
STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Näytä NewGRF-asetukset
STR_MAPGEN_AI_SETTINGS :{BLACK}Tekoälyasetukset
-STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Näytä tekoälyasetukset
+STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Avaa tekoälyasetukset
STR_MAPGEN_GS_SETTINGS :{BLACK}Peliskriptiasetukset
-STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Näytä peliskriptiasetukset
+STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Avaa peliskriptiasetukset
###length 21
STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Englantilainen
@@ -3570,7 +3595,7 @@ STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Kytke ki
# Sign window
STR_EDIT_SIGN_CAPTION :{WHITE}Muokkaa kyltin tekstiä
-STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä kyltin sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan kyltin sijaintiin.
+STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä kyltin sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan kyltin sijaintiin
STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Siirry seuraavaan kylttiin
STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Siirry edelliseen kylttiin
@@ -3596,6 +3621,8 @@ STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{ORANGE}{STRING}{GREEN} kuljetettu
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{RED} (tarvitaan lisää)
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{GREEN} (kuljetettu)
+STR_TOWN_VIEW_TOWN_GROWS_EVERY :{BLACK}Kunta kasvaa {ORANGE}{UNITS_DAYS_OR_SECONDS} välein
+STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}Kunta kasvaa {ORANGE}{UNITS_DAYS_OR_SECONDS} välein (rahoitettu)
STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}Kunta {RED}ei{BLACK} kasva
STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Meluraja kunnassa: {ORANGE}{COMMA}{BLACK} maks.: {ORANGE}{COMMA}
STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Keskitä päänäkymä kunnan sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan kunnan sijaintiin.
@@ -3639,7 +3666,8 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MONTHS :{PUSH_COLOUR}{Y
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MINUTES :{PUSH_COLOUR}{YELLOW}Rahoita taajamien tieverkon peruskorjausta.{}Aiheuttaa huomattavia häiriöitä tieliikenteelle jopa 6 minuutin ajan.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Rakenna patsas yhtiösi kunniaksi.{}Parantaa asemien arvioita pysyvästi tässä kunnassa.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Rahoita uusien rakennusten rakentamista kunnassa.{}Tämä kiihdyttää tämän kunnan kasvua tilapäisesti.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG}
-STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MONTHS :{PUSH_COLOUR}{YELLOW}Osta kuljetusyksinoikeus kuntaan 12 kuukaudeksi.{}Kunnan viranomaiset eivät salli matkustajien ja rahdin käyttävän kilpailijoittesi asemia. Kilpailijan onnistunut lahjonta purkaa tämän sopimuksen.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG}
+STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MONTHS :{PUSH_COLOUR}{YELLOW}Osta kuljetusyksinoikeus kuntaan 12 kuukaudeksi.{}Kunnan viranomaiset eivät salli matkustajien ja rahdin käyttävän kilpailijoittesi asemia. Sopimus purkautuu, jos kilpailija onnistuu lahjomaan viranomaiset.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG}
+STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MINUTES :{PUSH_COLOUR}{YELLOW}Osta kuljetusyksinoikeus kuntaan 12 minuutiksi.{}Kunnan viranomaiset eivät salli matkustajien ja rahdin käyttävän kilpailijoittesi asemia. Sopimus purkautuu, jos kilpailija onnistuu lahjomaan viranomaiset.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Lahjo viranomaisia parantaaksesi arviotasi ja keskeyttääksesi kilpailijan kuljetusyksinoikeuden; rangaistus voi kuitenkin olla ankara, jos jäät kiinni.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG}
# Goal window
@@ -3686,11 +3714,15 @@ STR_GOAL_QUESTION_BUTTON_CLOSE :Sulje
# Subsidies window
STR_SUBSIDIES_CAPTION :{WHITE}Tuet
STR_SUBSIDIES_OFFERED_TITLE :{BLACK}Tarjotut tuet:
+STR_SUBSIDIES_OFFERED_FROM_TO :{ORANGE}{STRING} välille {STRING} – {STRING}{YELLOW} ({STRING})
STR_SUBSIDIES_NONE :{ORANGE}- Ei mitään -
STR_SUBSIDIES_SUBSIDISED_TITLE :{BLACK}Käytetyt tuet:
-STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Napsauta kuljetusyhteyttä keskittääksesi päänäkymän laitokseen/kuntaan. Ctrl+napsautus avaa uuden näkymäikkunan laitoksen/kunnan sijaintiin.
+STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING} kohteesta {STRING} kohteeseen {STRING}{YELLOW} ({COMPANY}{YELLOW}, {STRING})
+STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Napsauta kuljetusyhteyttä keskittääksesi päänäkymän tuotantolaitokseen tai kuntaan. Ctrl+napsautus avaa uuden näkymäikkunan laitoksen tai kunnan sijaintiin.
STR_SUBSIDIES_OFFERED_EXPIRY_DATE :viimeistään {DATE_SHORT}
+STR_SUBSIDIES_OFFERED_EXPIRY_TIME :jäljellä {UNITS_MONTHS_OR_MINUTES}
STR_SUBSIDIES_SUBSIDISED_EXPIRY_DATE :{DATE_SHORT} asti
+STR_SUBSIDIES_SUBSIDISED_EXPIRY_TIME :{UNITS_MONTHS_OR_MINUTES} jäljellä
# Story book window
STR_STORY_BOOK_CAPTION :{WHITE}{COMPANY}: historia
@@ -3831,7 +3863,7 @@ STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENC
STR_FINANCES_BORROW_BUTTON :{BLACK}Nosta lainaa {CURRENCY_LONG}
STR_FINANCES_BORROW_TOOLTIP :{BLACK}Ota lisää lainaa. Ctrl+napsautus nostaa lainaa niin paljon kuin mahdollista.
STR_FINANCES_REPAY_BUTTON :{BLACK}Lyhennä lainaa {CURRENCY_LONG}
-STR_FINANCES_REPAY_TOOLTIP :{BLACK}Lyhennä lainaa. Ctrl+napsautus lyhentää lainaa niin paljon kuin mahdollista.
+STR_FINANCES_REPAY_TOOLTIP :{BLACK}Lyhennä lainaa. Ctrl+napsautus lyhentääksesi lainaa niin paljon kuin mahdollista.
STR_FINANCES_INFRASTRUCTURE_BUTTON :{BLACK}Infrastruktuuri
# Company view
@@ -3860,7 +3892,7 @@ STR_COMPANY_VIEW_BUILD_HQ_TOOLTIP :{BLACK}Rakenna
STR_COMPANY_VIEW_VIEW_HQ_BUTTON :{BLACK}Näytä päämaja
STR_COMPANY_VIEW_VIEW_HQ_TOOLTIP :{BLACK}Näytä yhtiön päämaja
STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Siirrä päämaja
-STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Rakenna yhtiön pääkonttori muualle, kustannus 1{NBSP}% yhtiön arvosta. Vaihto+napsautus näyttää kustannusarvion sijoittamatta pääkonttoria uudelleen.
+STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Rakenna yhtiön pääkonttori muualle, kustannus 1{NBSP}% yhtiön arvosta. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}Yksityiskohdat
STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Näytä tarkka infrastruktuurin määrä
STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :{BLACK}Anna rahaa
@@ -3918,7 +3950,7 @@ STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTR
STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Tuotanto viime kuussa:
STR_INDUSTRY_VIEW_PRODUCTION_LAST_MINUTE_TITLE :{BLACK}Tuotanto viime minuutissa:
STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} ({COMMA}{NBSP}% kuljetettu)
-STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä tuotantolaitoksen sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan laitoksen sijaintiin.
+STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä tuotantolaitoksen sijaintiin. Ctrl+napsautus avataksesi uuden näkymäikkunan laitoksen sijaintiin.
STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Tuotantotaso: {YELLOW}{COMMA}{NBSP}%
STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}Teollisuuslaitos ilmoittaa välittömästä lakkautuksesta!
@@ -3958,6 +3990,7 @@ STR_VEHICLE_LIST_REPLACE_VEHICLES :Korvaa kulkuneu
STR_VEHICLE_LIST_SEND_FOR_SERVICING :Lähetä huoltoon
STR_VEHICLE_LIST_CREATE_GROUP :Luo ryhmä
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Tuotto tänä vuonna: {CURRENCY_LONG} (viime vuonna: {CURRENCY_LONG})
+STR_VEHICLE_LIST_PROFIT_THIS_PERIOD_LAST_PERIOD :{TINY_FONT}{BLACK}Tuotto tällä jaksolla: {CURRENCY_LONG} (viime jaksolla: {CURRENCY_LONG})
STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}]
STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING}
@@ -4062,8 +4095,8 @@ STR_CARGO_TYPE_FILTER_NONE :Ei mikään
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Raideliikennevälineiden valintaluettelo. Napsauta kulkuneuvoa saadaksesi lisää tietoa. Ctrl+napsautus näyttää tai piilottaa kulkuneuvon tyypin.
STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Ajoneuvojen valintaluettelo. Napsauta ajoneuvoa saadaksesi lisää tietoja. Ctrl+napsautus näyttää tai piilottaa ajoneuvon tyypin.
-STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Laivojen valintaluettelo. Napsauta laivaa saadaksesi lisää tietoja. Ctrl+napsautus näyttää tai piilottaa laivan tyypin.
-STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Ilma-alusten valintaluettelo. Napsauta ilma-alusta saadaksesi lisää tietoja. Ctrl+napsautus näyttää tai piilottaa ilma-aluksen tyypin.
+STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Laivojen valintaluettelo. Napsauta laivaa saadaksesi lisää tietoja. Ctrl+napsautus näyttää/piilottaa tämän laivatyypin
+STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Ilma-alusten valintaluettelo. Napsauta ilma-alusta saadaksesi lisää tietoja. Ctrl+napsautus näyttää tai piilottaa tämän ilma-alustyypin
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_BUTTON :{BLACK}Osta yksikkö
@@ -4079,15 +4112,15 @@ STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Osta ja
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu raideliikenneväline. Vaihto+napsautus näyttää kustannusarvion ostamatta.
-STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu ajoneuvo. Vaihto+napsautus näyttää kustannusarvion ostamatta.
-STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu laiva. Vaihto+napsautus näyttää kustannusarvion ostamatta.
-STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu ilma-alus. Vaihto+napsautus näyttää kustannusarvion ostamatta.
+STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu ajoneuvo. Painettaessa Shift näyyää vain kustannusarvion.
+STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu laiva. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion
+STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu ilma-alus. Painettaessa Shift näyttää vain kustannusarvion
###length VEHICLE_TYPES
-STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu raideliikenneväline. Vaihto+napsautus näyttää kustannusarvion ostamatta.
-STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu ajoneuvo. Vaihto+napsautus näyttää kustannusarvion ostamatta.
-STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu laiva. Vaihto+napsautus näyttää kustannusarvion ostamatta.
-STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu ilma-alus. Vaihto+napsautus näyttää kustannusarvion ostamatta.
+STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu raideliikenneväline. Painettaessa Shift näyttää vain kustannusarvion
+STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu ajoneuvo. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
+STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu laiva. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion
+STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu ilma-alus. Shift+napsautus näyttää vain kustannusarvion
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Nimeä
@@ -4179,15 +4212,15 @@ STR_DEPOT_CLONE_SHIP :{BLACK}Kloonaa
STR_DEPOT_CLONE_AIRCRAFT :{BLACK}Kloonaa ilma-alus
###length VEHICLE_TYPES
-STR_DEPOT_CLONE_TRAIN_DEPOT_INFO :{BLACK}Tämä ostaa kopion junasta kaikkine vaunuineen. Napsauta tätä painiketta ja sen jälkeen junaa varikon sisä- tai ulkopuolella. Ctrl+napsautus jakaa komennot. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota.
-STR_DEPOT_CLONE_ROAD_VEHICLE_DEPOT_INFO :{BLACK}Tämä ostaa kopion ajoneuvosta. Napsauta tätä painiketta ja sen jälkeen ajoneuvoa varikon sisä- tai ulkopuolella. Ctrl+napsautus jakaa komennot. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota.
-STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Tämä ostaa kopion laivasta. Napsauta tätä painiketta ja sen jälkeen laivaa telakan sisä- tai ulkopuolella. Ctrl+napsautus jakaa komennot. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota.
-STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Tämä ostaa kopion lentokoneesta. Napsauta tätä painiketta ja sen jälkeen lentokonetta lentokonehallin sisä- tai ulkopuolella. Ctrl+napsautus jakaa komennot. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota.
+STR_DEPOT_CLONE_TRAIN_DEPOT_INFO :{BLACK}Osta kopio junasta kaikkine vaunuineen. Napsauta tätä painiketta ja sen jälkeen junaa varikon sisä- tai ulkopuolella. Ctrl+napsautus jakaa käskyt. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
+STR_DEPOT_CLONE_ROAD_VEHICLE_DEPOT_INFO :{BLACK}Tämä ostaa kopion ajoneuvosta. Napsauta tätä painiketta ja sen jälkeen ajoneuvoa varikon sisä- tai ulkopuolella. Ctrl+napsautus jakaa käskyt. Painettaessa Shift näyttää vain kustannusarvion
+STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Osta laivan kopio. Napsauta tätä painiketta ja sitten laivaa telakan sisä- tai ulkopuolella. Ctrl+napsautus jakaa komennot. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
+STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Osta ilma-aluksen kopio. Napsauta tätä painiketta ja sitten ilma-alusta lentokonehallin sisä- tai ulkopuolella. Ctrl+napsautus jakaa komennot. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
###length VEHICLE_TYPES
STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä veturitallin sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan veturitallin sijaintiin.
STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä ajoneuvovarikon sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan varikon sijaintiin.
-STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä telakan sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan telakan sijaintiin.
+STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä telakan sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan telakan sijaintiin
STR_DEPOT_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä lentokonehallin sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan lentokonehallin sijaintiin.
###length VEHICLE_TYPES
@@ -4229,6 +4262,8 @@ STR_ENGINE_PREVIEW_SHIP :laiva
STR_ENGINE_PREVIEW_TEXT3 :{BLACK}{STRING}{}{5:STRING}{}{STRING}
STR_ENGINE_PREVIEW_TEXT4 :{BLACK}{STRING}{}{STRING}{}{STRING}{}{STRING}
STR_ENGINE_PREVIEW_COST_WEIGHT :Hinta: {CURRENCY_LONG} Paino: {WEIGHT_SHORT}
+STR_ENGINE_PREVIEW_COST_MAX_SPEED :Hinta: {CURRENCY_LONG} Huippunopeus: {VELOCITY}
+STR_ENGINE_PREVIEW_SPEED_POWER :Nopeus: {VELOCITY} Teho: {POWER}
STR_ENGINE_PREVIEW_SPEED_POWER_MAX_TE :Nopeus: {VELOCITY} Teho: {POWER} Maksimivetovoima: {FORCE}
STR_ENGINE_PREVIEW_TYPE :Ilma-aluksen tyyppi: {STRING}
STR_ENGINE_PREVIEW_TYPE_RANGE :Ilma-alustyyppi: {STRING} Toimintasäde: {COMMA} ruutua
@@ -4304,10 +4339,10 @@ STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Lähetä
STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}Lähetä ilma-alus lentokonehalliin. Ctrl+napsautus suorittaa vain huollon.
###length VEHICLE_TYPES
-STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}Tämä ostaa kopion junasta kaikkine vaunuineen. Ctrl+napsautus jakaa käskyt. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota.
+STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}Osta kopio junasta kaikkine vaunuineen. Ctrl+napsautus jakaa käskyt. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
STR_VEHICLE_VIEW_CLONE_ROAD_VEHICLE_INFO :{BLACK}Tämä ostaa kopion ajoneuvosta. Ctrl+napsautus jakaa käskyt. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota.
-STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}Tämä ostaa kopion laivasta. Ctrl+napsautus jakaa käskyt. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota.
-STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Tämä ostaa kopion lentokoneesta. Ctrl+napsautus jakaa käskyt. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota.
+STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}Osta laivan kopio. Ctrl+napsautus jakaa käskyt. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
+STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Osta ilma-aluksen kopio. Ctrl+napsautus jakaa käskyt. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}Anna junalle lupa ohittaa punainen opastin
STR_VEHICLE_VIEW_TRAIN_REVERSE_TOOLTIP :{BLACK}Käännä junan suunta
@@ -4341,6 +4376,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Nykyisen
# Messages in the start stop button in the vehicle view
STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Lastataan/puretaan
STR_VEHICLE_STATUS_LEAVING :{LTBLUE}Poistuu
+STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}Odottamassa suman purkautumista
STR_VEHICLE_STATUS_CRASHED :{RED}Kolaroitu!
STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}Hajonnut
STR_VEHICLE_STATUS_STOPPED :{RED}Pysäytetty
@@ -4354,6 +4390,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}Ei pys
STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Kohde: {WAYPOINT}, {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}Suuntana {DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Huolto kohteessa {DEPOT}, {VELOCITY}
+STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}Sumanpurku ja huolto kohteessa{DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}{STATION} ei saavutettavissa, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}{WAYPOINT} ei saavutettavissa, {VELOCITY}
@@ -4380,7 +4417,7 @@ STR_VEHICLE_DETAILS_AIRCRAFT_RENAME :{BLACK}Nimeä i
STR_VEHICLE_INFO_AGE :{COMMA} vuo{P si tta} ({COMMA})
STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} vuo{P si tta} ({COMMA})
-STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Ikä: {LTBLUE}{STRING}{BLACK} Käyttökustannukset: {LTBLUE}{CURRENCY_LONG}/v
+STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Ikä: {LTBLUE}{STRING}{BLACK} Käyttökustannukset: {LTBLUE}{CURRENCY_LONG}/vuosi
STR_VEHICLE_INFO_AGE_RUNNING_COST_PERIOD :{BLACK}Ikä: {LTBLUE}{STRING}{BLACK} Käyttökustannukset: {LTBLUE}{CURRENCY_LONG}/jakso
STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Huippunopeus: {LTBLUE}{VELOCITY}
@@ -4403,9 +4440,12 @@ STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Kapasite
STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Siirron arvo: {LTBLUE}{CURRENCY_LONG}
+STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS :{BLACK}Huoltoväli: {LTBLUE}{COMMA}{NBSP}vrk{BLACK} {STRING}
STR_VEHICLE_DETAILS_SERVICING_INTERVAL_MINUTES :{BLACK}Huoltoväli: {LTBLUE}{COMMA}{NBSP}minuuttia{BLACK} {STRING}
+STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Huoltoväli: {LTBLUE}{COMMA}{NBSP}%{BLACK} {STRING}
STR_VEHICLE_DETAILS_LAST_SERVICE_DATE :Viimeksi huollettu: {LTBLUE}{DATE_LONG}
STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :Viimeksi huollettu: {LTBLUE}{NUM} minuuttia sitten
+STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Pidennä huoltoväliä 10 vuorokaudella. Ctrl+napsautus pidentää väliä 5 vuorokaudella
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Pidennä huoltoväliä 5 minuutilla. Ctrl+napsautus pidentää väliä 1 minuutilla
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Pidennä huoltoväliä 10 prosentilla. Ctrl+napsautus pidentää väliä 5 prosentilla
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Lyhennä huoltoväliä 10 vuorokaudella. Ctrl+napsautus lyhentää väliä 5 vuorokaudella
@@ -4454,7 +4494,7 @@ STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Uusi kap
STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}Uusi kapasiteetti: {GOLD}{CARGO_LONG}{}{BLACK}Tulot sovittamisesta: {GREEN}{CURRENCY_LONG}
STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Uusi kapasiteetti: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Sovituksen kustannus: {RED}{CURRENCY_LONG}
STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Uusi kapasiteetti: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Tulot sovittamisesta: {GREEN}{CURRENCY_LONG}
-STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Valitse sovitettavat kulkuneuvot. Hiirellä vetämällä voit valita useamman kulkuneuvon. Tyhjän alueen napsautus valitsee koko kulkuneuvon. Ctrl+napsautus valitsee kulkuneuvon ja sitä seuraavan ketjun.
+STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Valitse sovitettavat kulkuneuvot. Napsautus+vedä valitaksesi useamman kulkuneuvon. Tyhjän alueen napsautus valitsee koko kulkuneuvon. Ctrl+napsautus valitsee kulkuneuvon ja sitä seuraavan ketjun.
###length VEHICLE_TYPES
STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Valitse junan rahtityyppi
@@ -4481,6 +4521,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Näytä
STR_ORDERS_LIST_TOOLTIP :{BLACK}Käskyt – napsauta käskyä korostaaksesi sen. Ctrl+napsautus siirtää näkymän käskyn kohteeseen.
STR_ORDER_INDEX :{COMMA}:{NBSP}
+STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING}
STR_ORDERS_END_OF_ORDERS :- - Käskyjen loppu - -
STR_ORDERS_END_OF_SHARED_ORDERS :- - Jaettujen käskyjen loppu - -
@@ -4517,6 +4558,15 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :Saatavilla olev
STR_ORDER_DROP_GO_ALWAYS_DEPOT :Mene aina
STR_ORDER_DROP_SERVICE_DEPOT :Huolto, jos tarpeen
STR_ORDER_DROP_HALT_DEPOT :Pysähdy
+STR_ORDER_DROP_UNBUNCH :Pura sumaa
+
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Valitse tällä varikolla tehtävä toimenpide
+STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Valitse tällä varikolla tehtävä toimenpide
+STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Valitse tällä telakalla tehtävä toimenpide
+STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Valitse tässä lentokonehallissa tehtävä toimenpide
+###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Kulkuneuvon tiedot, joiden perusteella hypätään
@@ -4546,7 +4596,7 @@ STR_ORDER_CONDITIONAL_VALUE_TOOLTIP :{BLACK}Arvo, jo
STR_ORDER_CONDITIONAL_VALUE_CAPT :{WHITE}Syötä arvo, johon verrataan
STR_ORDERS_SKIP_BUTTON :{BLACK}Ohita
-STR_ORDERS_SKIP_TOOLTIP :{BLACK}Ohita nykyinen käsky ja aloita seuraava. Ctrl+napsautus hyppää valittuun käskyyn.
+STR_ORDERS_SKIP_TOOLTIP :{BLACK}Ohita nykyinen käsky ja aloita seuraava. Ctrl+napsautus hyppää valittuun käskyyn
STR_ORDERS_DELETE_BUTTON :{BLACK}Poista
STR_ORDERS_DELETE_TOOLTIP :{BLACK}Poista korostettu käsky
@@ -4559,7 +4609,7 @@ STR_ORDER_GO_TO_NEAREST_DEPOT :Mene lähimmäl
STR_ORDER_GO_TO_NEAREST_HANGAR :Mene lähimpään lentokonehalliin
STR_ORDER_CONDITIONAL :Ehdollinen hyppykäsky
STR_ORDER_SHARE :Jaa käskyt
-STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Lisää uuden käskyn ennen valittua, tai lisää listan viimeiseksi. Ctrl:n painalluksella asemakäskyistä tulee ”lastaa täyteen mikä tahansa rahti”, reittipistekäskyistä ”pysähtymättä” ja varikkokäskyistä ”huolto”. ”Jaa käskyt” tai Ctrl jakaa käskyt valitun kulkuneuvon kanssa. Kulkuneuvon napsauttaminen kopioi käskyt kyseisestä kulkuneuvosta. Varikkokäsky estää kulkuneuvon automaattiset huollot
+STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Lisää uuden käskyn ennen valittua, tai lisää listan viimeiseksi. Ctrl+painalluksella asemakäskyistä tulee ”lastaa täyteen mikä tahansa rahti”, reittipistekäskyistä ”pysähtymättä” ja veturitallikäskyistä ”huolto”. Napsauta toista ajoneuvoa kopioidaksesi sen käskyt tai Ctrl+napsauta luodaksesi jaetun käskyn. Tallikäsky poistaa automaattiset huollot
STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Näytä kaikki kulkuneuvot, jotka jakavat nämä käskyt
@@ -4585,13 +4635,14 @@ STR_ORDER_REFIT_ORDER :(Sovita {STRING
STR_ORDER_REFIT_STOP_ORDER :(Sovita rahtityypille {STRING} ja pysähdy)
STR_ORDER_STOP_ORDER :(Pysähdy)
+STR_ORDER_WAIT_TO_UNBUNCH :(odota suman purkamiseksi)
STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING}
STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Asema ei käytettävissä){POP_COLOUR} {STRING} {STATION} {STRING}
STR_ORDER_IMPLICIT :(Ehdoton)
-STR_ORDER_FULL_LOAD :(Täysi lastaus)
+STR_ORDER_FULL_LOAD :(Lastaa täyteen)
STR_ORDER_FULL_LOAD_ANY :(Lastaa täyteen mitä tahansa rahtia)
STR_ORDER_NO_LOAD :(Ei lastausta)
STR_ORDER_UNLOAD :(Pura lasti ja lastaa uusi rahti)
@@ -4680,7 +4731,7 @@ STR_TIMETABLE_CHANGE_SPEED :{BLACK}Muuta no
STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Muuta suurinta sallittua nopeutta valitulle käskylle. Ctrl+napsautus asettaa nopeusrajoituksen kaikille käskyille
STR_TIMETABLE_CLEAR_SPEED :{BLACK}Tyhjennä nopeusrajoitus
-STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Poista suurin sallittu nopeus valitulta käskyltä. Ctrl+napsautus poistaa kaikkien käskyjen nopeusrajoitukset
+STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Poista suurin sallittu nopeus valitulta käskyltä. Ctrl+napsautus poistaaksesi kaikkien käskyjen nopeusrajoitukset
STR_TIMETABLE_RESET_LATENESS :{BLACK}Nollaa myöhästymislaskuri
STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Nollaa myöhästymislaskuri, jotta kulkuneuvo olisi taas aikataulussa. Ctrl+napsautus nollaa koko ryhmän, minkä jälkeen eniten myöhässä ollut kulkuneuvo on aikataulussa ja muut ovat etuajassa
@@ -4788,6 +4839,8 @@ STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Peliskripti
STR_AI_SETTINGS_CLOSE :{BLACK}Sulje
STR_AI_SETTINGS_RESET :{BLACK}Palauta
STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING}
+STR_AI_SETTINGS_SETTING_DEVIATION :{STRING}: {ORANGE}[{STRING}, {STRING}]
+STR_AI_SETTINGS_JUST_DEVIATION :[{STRING}, {STRING}]
# Textfile window
@@ -5054,6 +5107,11 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Paikalli
STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Väärä varikkotyyppi
# Depot unbunching related errors
+STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}… vain yksi sumanpurkukäsky mahdollinen
+STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}… kulkuneuvon sumanpurkukäsky estää täyteenlastaamiskäskyjen käytön
+STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}… sumaa ei voida purkaa kulkuneuvolla, jolla on täyteenlastaamiskäsky
+STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}… kulkuneuvon sumanpurkukäsky estää ehdollisten käskyjen käytön
+STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}… sumaa ei voida purkaa kulkuneuvolla, jolla on ehdollinen käsky
# Autoreplace related errors
STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} on liian pitkä korvaamisen jälkeen
@@ -5748,6 +5806,9 @@ STR_TOWN_NAME :{TOWN}
STR_VEHICLE_NAME :{VEHICLE}
STR_WAYPOINT_NAME :{WAYPOINT}
+STR_CURRENCY_SHORT_KILO :{NBSP}000
+STR_CURRENCY_SHORT_MEGA :{NBSP}milj.
+STR_CURRENCY_SHORT_GIGA :{NBSP}mrd.
STR_CURRENCY_SHORT_TERA :{NBSP} t
STR_JUST_CARGO :{CARGO_LONG}
diff --git a/src/lang/french.txt b/src/lang/french.txt
index 92bd790fda..684e53745f 100644
--- a/src/lang/french.txt
+++ b/src/lang/french.txt
@@ -635,6 +635,7 @@ STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Cliquer
# Company league window
STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Classement des compagnies
STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPANY} {BLACK}{COMPANY_NUM} '{STRING}'
+STR_COMPANY_LEAGUE_COMPANY_RANK :{YELLOW}#{NUM}
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER :Ingénieur
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER :Gestionnaire de trafic
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR :Coordinateur de trafic
@@ -818,6 +819,7 @@ STR_STATUSBAR_AUTOSAVE :{RED}ENREGISTRE
STR_STATUSBAR_SAVING_GAME :{RED}* * SAUVEGARDE EN COURS * *
STR_STATUSBAR_SPECTATOR :{WHITE}(spectateur)
+STR_STATUSBAR_INFINITE_MONEY :{WHITE}(argent infini)
# News message history
STR_MESSAGE_HISTORY :{WHITE}Historique des messages
@@ -1270,6 +1272,8 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :À droite
STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}seconde{P 0 "" s}
+STR_CONFIG_SETTING_INFINITE_MONEY :Argent infini{NBSP}: {STRING}
+STR_CONFIG_SETTING_INFINITE_MONEY_HELPTEXT :Autoriser les dépenses illimitées et désactiver la banqueroute des compagnies
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Emprunt initial maximum{NBSP}: {STRING}
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Montant maximum qu'une compagnie peut emprunter (sans tenir compte de l'inflation)
@@ -1504,6 +1508,11 @@ STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM}
###setting-zero-is-special
STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (calendrier gelé)
+STR_CONFIG_SETTING_TOWN_CARGO_SCALE :Échelle de production de marchandise des villes{NBSP}: {STRING}
+STR_CONFIG_SETTING_TOWN_CARGO_SCALE_HELPTEXT :Modifier la production de marchandise des villes de ce pourcentage.
+STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE :Échelle de production de marchandise des industries{NBSP}: {STRING}
+STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_HELPTEXT :Modifier la production de marchandise des industries de ce pourcentage.
+STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}%
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Renouveler automatiquement les véhicules vieillissants{NBSP}: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Quand il est actif, un véhicule approchant de la fin de sa durée de vie est automatiquement remplacé quand les conditions du renouvellement sont remplies
@@ -1916,7 +1925,7 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Espacement des
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Définit la distance à laquelle les signaux seront construits sur une voies jusqu'au prochain obstacle (signal, jonction), si les signaux sont glissés-déposés
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} case{P 0 "" s}
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Espacement fixe entre les signaux en mode glisser-déposer{NBSP}: {STRING}
-STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Choisir le comportement du placement des signaux en mode glisser-déposer avec Ctrl. Si désactivé, les signaux sont placés autour des tunnels ou des ponts pour éviter de longues portions sans signaux. Si activé, les signaux sont placés toutes les N case, permettant d'aligner facilement les signaux sur des voies parallèles
+STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Choisir le comportement du placement des signaux en mode glisser-déposer. Si désactivé, les signaux sont placés autour des tunnels ou des ponts pour éviter de longues portions sans signaux. Si activé, les signaux sont placés toutes les N cases, permettant d'aligner facilement les signaux sur des voies parallèles
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Construire automatiquement des sémaphores avant{NBSP}: {STRING}
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Définit l'année à partir de laquelle des signaux électriques seront utilisés pour les voies. Avant cette année, des signaux non électriques seront utilisés (ils ont le même fonctionnement mais une apparence différente)
@@ -1924,6 +1933,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Définit l'ann
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Sélectionner les signaux parmi{NBSP}: {STRING}
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Choisir quels types de signaux sont proposés lors de leur construction avec Ctrl
###length 2
+STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Uniquement le groupe courant
STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :tous les signaux visibles
STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Afficher les signaux parmi{NBSP}: {STRING}
@@ -2780,7 +2790,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Construi
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Construire un dépôt ferroviaire (pour acheter et entretenir des trains).{}Shift pour afficher seulement le coût estimé.
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Construire un point de contrôle sur les rails.{}Ctrl pour joindre des points de contrôle entre eux.{}Shift pour afficher seulement le coût estimé.
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Construire une gare.{}Ctrl pour joindre des stations entre elles.{}Shift pour afficher seulement le coût estimé.
-STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Construire des signaux. Ctrl pour inverser le type des signaux (sémaphore/lumineux).{}Faire glisser pour construire le long d'une section de voie linéaire.{}Ctrl-glisser pour construire des signaux jusqu'à la prochaine jonction ou le prochain signal{}Ctrl-clic pour inverser le mode d'ouverture de la fenêtre de sélection des signaux.{}Shift pour afficher seulement le coût estimé.
+STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Construire des signaux. Ctrl pour inverser le type des signaux (sémaphore/lumineux).{}Faire glisser pour construire des signaux jusqu'à la prochaine jonction ou le prochain signal{}Shift pour afficher seulement le coût estimé.
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Construire un pont ferroviaire.{}Shift pour afficher seulement le coût estimé.
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Construire un tunnel ferroviaire.{}Shift pour afficher seulement le coût estimé.
STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Alterner entre construire et retirer des voies, des signaux, des points de contrôle et des gares.{}Ctrl pour retirer également la voie lors du retrait des points de contrôle et des gares.
@@ -4367,6 +4377,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Action c
# Messages in the start stop button in the vehicle view
STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Chargement/Déchargement
STR_VEHICLE_STATUS_LEAVING :{LTBLUE}Départ
+STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}En attente de répartition
STR_VEHICLE_STATUS_CRASHED :{RED}Accidenté{NBSP}!
STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}En panne
STR_VEHICLE_STATUS_STOPPED :{RED}Arrêté
@@ -4380,6 +4391,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}Aucun o
STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}En route pour {WAYPOINT}, {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}En route pour le {DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Entretien au {DEPOT}, {VELOCITY}
+STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}Répartition et entretien au {DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}Ne peut pas atteindre {STATION}, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}Ne peut pas atteindre {WAYPOINT}, {VELOCITY}
@@ -4510,6 +4522,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Basculer
STR_ORDERS_LIST_TOOLTIP :{BLACK}Liste d'ordres - Cliquer sur un ordre pour le sélectionner. Ctrl-clic pour déplacer la vue sur la destination de l'ordre.
STR_ORDER_INDEX :{COMMA}:{NBSP}
+STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING}
STR_ORDERS_END_OF_ORDERS :−− Fin des ordres −−
STR_ORDERS_END_OF_SHARED_ORDERS :−− Fin des ordres partagés −−
@@ -4546,6 +4559,15 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :Cargaison dispo
STR_ORDER_DROP_GO_ALWAYS_DEPOT :Toujours aller
STR_ORDER_DROP_SERVICE_DEPOT :Entretien si nécessaire
STR_ORDER_DROP_HALT_DEPOT :Arrêt
+STR_ORDER_DROP_UNBUNCH :Répartir
+
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Séléctionner l'action à effectuer sur ce dépôt
+STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Séléctionner l'action à effectuer sur ce dépôt
+STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Séléctionner l'action à effectuer sur ce dépôt
+STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Séléctionner l'action à effectuer sur ce hangar
+###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Données du véhicule servant de base au saut
@@ -4614,6 +4636,7 @@ STR_ORDER_REFIT_ORDER :(Réaménager p
STR_ORDER_REFIT_STOP_ORDER :(Réaménager pour {STRING} et arrêt)
STR_ORDER_STOP_ORDER :(Arrêt)
+STR_ORDER_WAIT_TO_UNBUNCH :(attendre la répartition)
STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING}
STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Station inutilisable){POP_COLOUR} {STRING} {STATION} {STRING}
@@ -4817,6 +4840,8 @@ STR_AI_SETTINGS_CAPTION_GAMESCRIPT :du script de je
STR_AI_SETTINGS_CLOSE :{BLACK}Fermer
STR_AI_SETTINGS_RESET :{BLACK}Réinitialiser
STR_AI_SETTINGS_SETTING :{STRING}{NBSP}: {ORANGE}{STRING}
+STR_AI_SETTINGS_SETTING_DEVIATION :{STRING}{NBSP}: {ORANGE}[{STRING}, {STRING}]
+STR_AI_SETTINGS_JUST_DEVIATION :[{STRING}, {STRING}]
# Textfile window
@@ -5083,6 +5108,11 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Impossib
STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Dépôt incompatible
# Depot unbunching related errors
+STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}... ne peut avoir qu'un seul ordre de répartition
+STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}... impossible d'utiliser un ordre de chargement complet quand un véhicule a un ordre de répartition
+STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}... impossible de répartir un véhicule avec un ordre de chargement complet
+STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}... impossible d'utiliser des ordres conditionnels quand le véhicule a un ordre de répartition
+STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}... impossible de répartir un véhicule avec un ordre conditionnel
# Autoreplace related errors
STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} est trop long après remplacement
@@ -5743,6 +5773,7 @@ STR_UNKNOWN_STATION :station inconnu
STR_DEFAULT_SIGN_NAME :Panneau
STR_COMPANY_SOMEONE :quelqu'un
+STR_SAVEGAME_DURATION_REALTIME :{NUM}h {NUM}m
STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING}
STR_SAVEGAME_NAME_SPECTATOR :Spectateur, {1:STRING}
@@ -5776,6 +5807,10 @@ STR_TOWN_NAME :{TOWN}
STR_VEHICLE_NAME :{VEHICLE}
STR_WAYPOINT_NAME :{WAYPOINT}
+STR_CURRENCY_SHORT_KILO :{NBSP}k
+STR_CURRENCY_SHORT_MEGA :{NBSP}Mio
+STR_CURRENCY_SHORT_GIGA :{NBSP}Mrd
+STR_CURRENCY_SHORT_TERA :{NBSP}kMrd
STR_JUST_CARGO :{CARGO_LONG}
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}
diff --git a/src/lang/frisian.txt b/src/lang/frisian.txt
index 51e1c92dd3..54579817c3 100644
--- a/src/lang/frisian.txt
+++ b/src/lang/frisian.txt
@@ -3618,6 +3618,10 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :Beskikbere frac
STR_ORDER_DROP_GO_ALWAYS_DEPOT :Gean altyd
STR_ORDER_DROP_HALT_DEPOT :Stop
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
# Conditional order variables, must follow order of OrderConditionVariable enum
###length 8
diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt
index 5a09cdbea7..459854221d 100644
--- a/src/lang/gaelic.txt
+++ b/src/lang/gaelic.txt
@@ -4116,6 +4116,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Rach ann an-cò
STR_ORDER_DROP_SERVICE_DEPOT :Obair-ghlèidhidh ma tha i a dhìth
STR_ORDER_DROP_HALT_DEPOT :Stad
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dàta a' charbaid air a bheil an leum stèidhichte
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/galician.txt b/src/lang/galician.txt
index 8f743e57a3..795962bda1 100644
--- a/src/lang/galician.txt
+++ b/src/lang/galician.txt
@@ -1243,6 +1243,7 @@ STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :Fixa canto se p
STR_CONFIG_SETTING_SUBSIDY_DURATION :Duración da subvención: {STRING}
###length 2
STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Establece o número de anos durante os cales se concede a subvención.
+STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT_PERIODS :Establece o número de períodos durante os que se concede a subvención
###setting-zero-is-special
STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Sen subvencións
@@ -2301,6 +2302,7 @@ STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Direcci
STR_NETWORK_SERVER_LIST_INVITE_CODE :{SILVER}Código de convite: {WHITE}{STRING}
STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Data de comezo: {WHITE}{DATE_SHORT}
STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Data actual: {WHITE}{DATE_SHORT}
+STR_NETWORK_SERVER_LIST_PLAY_TIME :{SILVER}Tempo de xogo: {WHITE}{NUM}h {NUM}m
STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Script do xogo: {WHITE}{STRING} (v{NUM})
STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}Protexido con contrasinal!
STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}SERVIDOR DESCONECTADO
@@ -4125,6 +4127,7 @@ STR_ENGINE_PREVIEW_TRAM_VEHICLE :Vehículo de tr
STR_ENGINE_PREVIEW_AIRCRAFT :avión
STR_ENGINE_PREVIEW_SHIP :barco
+STR_ENGINE_PREVIEW_CAPACITY_2 :Capacidade: {CARGO_LONG}, {CARGO_LONG}
# Autoreplace window
STR_REPLACE_VEHICLES_WHITE :{WHITE}Substituír {STRING} - {STRING}
@@ -4394,6 +4397,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ir sempre
STR_ORDER_DROP_SERVICE_DEPOT :Facer servizo se é necesario
STR_ORDER_DROP_HALT_DEPOT :Parar
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Datos do vehículo para saltarse
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/german.txt b/src/lang/german.txt
index 28afbc977a..d772c9419d 100644
--- a/src/lang/german.txt
+++ b/src/lang/german.txt
@@ -215,6 +215,8 @@ STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :Wie primär
STR_UNITS_VELOCITY_IMPERIAL :{DECIMAL}{NBSP}mph
STR_UNITS_VELOCITY_METRIC :{DECIMAL}{NBSP}km/h
STR_UNITS_VELOCITY_SI :{DECIMAL}{NBSP}m/s
+STR_UNITS_VELOCITY_GAMEUNITS_DAY :{DECIMAL}{NBSP}Felder/Tag
+STR_UNITS_VELOCITY_GAMEUNITS_SEC :{DECIMAL}{NBSP}Felder/Sek
STR_UNITS_VELOCITY_KNOTS :{DECIMAL}{NBSP}Knoten
STR_UNITS_POWER_IMPERIAL :{DECIMAL}{NBSP}PS
@@ -256,7 +258,9 @@ STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}
STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m
# Time units used in string control characters
+STR_UNITS_TICKS :{COMMA}{NBSP}Tick{P "" s}
+STR_UNITS_MINUTES :{NUM}{NBSP}minute{P "" n}
# Common window strings
@@ -325,6 +329,7 @@ STR_SORT_BY_TRANSPORTED :Transportiert
STR_SORT_BY_NUMBER :Nummer
STR_SORT_BY_PROFIT_LAST_YEAR :Gewinn im letzten Jahr
STR_SORT_BY_PROFIT_THIS_YEAR :Gewinn in diesem Jahr
+STR_SORT_BY_PROFIT_THIS_PERIOD :Gewinn in diesem Zeitraum
STR_SORT_BY_AGE :Alter
STR_SORT_BY_RELIABILITY :Zuverlässigkeit
STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :Gesamtkapazität pro Fracht
@@ -353,8 +358,10 @@ STR_SORT_BY_RATING :Bewertung
STR_SORT_BY_NUM_VEHICLES :Anzahl der Fahrzeuge
STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Gewinn im letzten Jahr
STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Gewinn in diesem Jahr
+STR_SORT_BY_TOTAL_PROFIT_THIS_PERIOD :Gesamter Gewinn in diesem Zeitraum
STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Durchschnittlicher Gewinn im letzten Jahr
STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Durchschnittlicher Gewinn in diesem Jahr
+STR_SORT_BY_AVERAGE_PROFIT_THIS_PERIOD :Durchschnittlicher Gewinn in diesem Zeitraum
# Group by options for vehicle list
STR_GROUP_BY_NONE :Keine
@@ -597,8 +604,10 @@ STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Beförde
STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Bewertung der Firmenleistung (Höchstwert: 1000)
STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Firmenwertdiagramm
+STR_GRAPH_LAST_72_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}Letzten 72 Minuten
STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Frachtbeförderungspreise
+STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS :{TINY_FONT}{BLACK}Sekunden unterwegs
STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Zahlung für 10 gelieferte Einheiten (oder 10.000 Liter) Fracht über eine Strecke von 20 Feldern
STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Alle auswählen
STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Alle abwählen
@@ -616,6 +625,7 @@ STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Graph de
# Company league window
STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Firmentabelle
STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPANY} {BLACK}{COMPANY_NUM} „{STRING}“
+STR_COMPANY_LEAGUE_COMPANY_RANK :{YELLOW}#{NUM}
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER :Ingenieur
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER :Verkehrsmanager
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR :Fuhrparkleiter
@@ -647,6 +657,7 @@ STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Kredit:
STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Gesamt:
###next-name-looks-similar
+STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_PERIODS :{BLACK}Anzahl der Fahrzeuge, die im letzten Zeitraum einen Gewinn erzielt haben. Diese beinhaltet Straßenfahrzeuge, Züge, Schiffe und Flugzeuge
STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Anzahl vor kurzem genutzter Stationen (wenn Stationen verschiedener Typen verbunden sind, werden sie trotzdem einzeln gezählt)
STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Geringste Quartalseinnahmen in den letzten 3 Jahren
STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Höchste Quartalseinnahmen in den letzten 3 Jahren
@@ -914,6 +925,7 @@ STR_GAME_OPTIONS_TAB_GRAPHICS :Grafik
STR_GAME_OPTIONS_TAB_GRAPHICS_TT :{BLACK}Grafikeinstellungen wählen
STR_GAME_OPTIONS_TAB_SOUND :Sound
STR_GAME_OPTIONS_TAB_SOUND_TT :{BLACK}Sound- und Musikeinstellungen auswählen
+STR_GAME_OPTIONS_TAB_SOCIAL :Soziales
STR_GAME_OPTIONS_VOLUME :Lautstärke
STR_GAME_OPTIONS_SFX_VOLUME :Sound-Effekte
@@ -1014,6 +1026,8 @@ STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Dieses K
STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Schrägen skalieren
STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Dieses Kästchen ankreuzen, um Schrägen nach der Oberflächengröße zu skalieren
+STR_GAME_OPTIONS_GUI_FONT_SPRITE :{BLACK}Nutze die traditionelle Sprite-Schriftart
+STR_GAME_OPTIONS_GUI_FONT_SPRITE_TOOLTIP :{BLACK}Dieses Kästchen ankreuzen, um die traditionelle Sprite-Schriftart mit fester Größe zu verwenden.
STR_GAME_OPTIONS_GUI_SCALE_1X :1×
STR_GAME_OPTIONS_GUI_SCALE_2X :2×
@@ -1049,7 +1063,11 @@ STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Ein Basi
STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Zusätzliche Informationen über das Basismusikset
+STR_GAME_OPTIONS_SOCIAL_PLUGIN_TITLE :{BLACK}{STRING} ({STRING})
+STR_GAME_OPTIONS_SOCIAL_PLUGIN_PLATFORM :{BLACK}Bahnsteig:
+STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_RUNNING :{GREEN}Am laufen
+STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_UNLOADED :{RED}Entladen
STR_BASESET_STATUS :{STRING} {RED}({NUM} fehlende/beschädigte Datei{P "" en})
@@ -1241,7 +1259,8 @@ STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :Einstellen, wie
STR_CONFIG_SETTING_SUBSIDY_DURATION :Subventionsdauer: {STRING}
###length 2
-STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Die Anzahl der Jahre, für die eine Subvention vergeben wird
+STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Wähle die Anzahl der Jahre, für die eine Subvention vergeben wird
+STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT_PERIODS :Wähle die Anzahl der Zeiträume, für die eine Subvention vergeben wird
###setting-zero-is-special
STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Keine Subventionen
@@ -1340,6 +1359,7 @@ STR_CONFIG_SETTING_SIGNALSIDE_RIGHT :Auf der rechten
###length 2
STR_CONFIG_SETTING_SHOWFINANCES :Zeige Firmenfinanzen am Ende des Jahres: {STRING}
+STR_CONFIG_SETTING_SHOWFINANCES_PERIOD :Zeige Firmenfinanzen am Ende des Zeitraums: {STRING}
###length 2
STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :Blende am Ende jedes Jahres automatisch die Einkommensübersicht des Unternehmes ein, um eine schnelle Übersicht über den finanziellen Status zu bekommen
@@ -1368,7 +1388,8 @@ STR_CONFIG_SETTING_BRIBE_HELPTEXT :Firmen das Best
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Den Erwerb exklusiver Transportrechte erlauben: {STRING}
###length 2
-STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Wenn eine Firma exklusive Transportrechte in einer Stadt kauft, wird ein Jahr lang keine Fracht an Stationen von Mitbewerbern im Stadtgebiet geliefert
+STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Wenn eine Firma exklusive Transportrechte für eine Stadt kauft, erhalten Stationen von Mitbewerbern 12 Monate lang keine Passagiere und Fracht
+STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT_MINUTES :Wenn eine Firma exklusive Transportrechte für eine Stadt kauft, erhalten Stationen von Mitbewerbern 12 Minuten lang keine Passagiere und Fracht
STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Finanzieren von Gebäuden erlauben: {STRING}
STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :Erlaubt Firmen, der Stadtverwaltung Geld für das Errichten neuer Häuser zur Verfügung zu stellen
@@ -1431,11 +1452,14 @@ STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Zeige Nachricht
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Fahrzeuge veralten nie: {STRING}
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Erlauben, dass Fahrzeuge nach ihrem Einführungsdatum ewig verfügbar bleiben
+STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :Wähle die Zeiteinheit des Spiels. Diese kann später nicht geändert werden.{}{}Kalender-basiert ist die klassische OpenTTD Erfahrung, in dem ein Jahr aus 12 Monaten besteht und jeder Monat 28-31 Tage hat.{}{}In Wanduhr-basierter Zeit sind Fahrzeuggeschwindigkeit, Güterproduktion und Finanzen basierend auf 1-minütigen Inkrementen, welche etwa so lang wie ein 30-tägiger Monat im Kalender-basierten Modus sind. Diese sind in 12-minütige Zeiträume gruppiert, equivalent zu einem Kalender-Jahr.{}{}In beiden Modi ist immer ein klassischer Kalender, welcher für das Einführungdatum von Fahrzeugen, Häusern und anderer Infrastruktur genutzt wird.
###length 2
+STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM}
###setting-zero-is-special
+STR_CONFIG_SETTING_TOWN_CARGO_SCALE :Skaliere Güterproduktion in Städten: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Fahrzeuge automatisch erneuern, wenn sie alt werden: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Erneuere Fahrzeuge automatisch gemäß der Regeln für Erneuerung, wenn sie ihr Maximalalter erreicht haben.
@@ -1527,6 +1551,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Linksverkehr
STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Rechtsverkehr
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Drehung der Reliefkarte: {STRING}
+STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :Wählen, in welche Richtung das Höhenkarten-Bild rotiert wird um in die Spielwelt zu passen
###length 2
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Nach links
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Nach rechts
@@ -1647,7 +1672,9 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Nutze erweitert
STR_CONFIG_SETTING_LOADING_INDICATORS :Ladestandanzeiger verwenden: {STRING}
STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Auswählen, ob beim Be- oder Entladen der Ladestand in Prozent über dem Fahrzeug angezeigt werden soll
+STR_CONFIG_SETTING_TIMETABLE_MODE :Zeiteinheiten für Fahrpläne: {STRING}
###length 3
+STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :Ticks
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Zeige Ankunft und Abfahrt im Fahrplan: {STRING}
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Zeige geschätzte Ankunfts- und Abfahrtzeiten in Fahrplänen
@@ -1685,6 +1712,7 @@ STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT :Soundeffekte be
###length 2
STR_CONFIG_SETTING_SOUND_NEW_YEAR :Bericht am Jahresende: {STRING}
+STR_CONFIG_SETTING_SOUND_NEW_PERIOD :Ende des Zeitraums: {STRING}
###length 2
STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :Soundeffekte beim Jahresrückblick auf die Bilanzen der vergangenen Jahre abspielen
@@ -1755,6 +1783,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Deaktiviert
STR_CONFIG_SETTING_NOSERVICE :Wartung deaktivieren, wenn Pannen abgeschaltet: {STRING}
STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Schicke Fahrzeuge nicht zur Wartung, wenn Pannen ausgeschaltet sind
+STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY :Verringerung der Ladegeschwindigkeit für Züge die länger als die Station sind: {STRING}
STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Berücksichtige Waggonhöchstgeschwindigkeit: {STRING}
STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Begrenze die Höchstgeschwindigkeit eines Zuges durch die jeweiligen Höchstgeschwindigkeiten der mitgeführten Waggons
@@ -1846,6 +1875,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Lege das Jahr f
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Durchlaufen der Signalarten: {STRING}
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Lege fest, durch welche Signaltypen mittels Strg-Klick auf vorhandene Signale rotiert wird
###length 2
+STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Nur aktuelle Gruppe
STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Alle Sichtbaren
STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Signaltypen zeigen: {STRING}
@@ -2032,10 +2062,12 @@ STR_CONFIG_SETTING_LIMITATIONS :Beschränkungen
STR_CONFIG_SETTING_ACCIDENTS :Unfälle und Katastrophen
STR_CONFIG_SETTING_GENWORLD :Spielfeld-Erzeugung
STR_CONFIG_SETTING_ENVIRONMENT :Umgebung
+STR_CONFIG_SETTING_ENVIRONMENT_TIME :Uhrzeit
STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :Öffentliche Verwaltungen
STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :Städte
STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :Industrien
STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :Warenverteilung
+STR_CONFIG_SETTING_ENVIRONMENT_TREES :Bäume
STR_CONFIG_SETTING_AI :Mitbewerber
STR_CONFIG_SETTING_AI_NPC :Computerspieler
STR_CONFIG_SETTING_NETWORK :Netzwerk
@@ -2170,9 +2202,13 @@ STR_LIVERY_TRAIN_TOOLTIP :{BLACK}Zugfarbs
STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Fahrzeugfarbschema anzeigen
STR_LIVERY_SHIP_TOOLTIP :{BLACK}Schiffsfarbschema anzeigen
STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Flugzeugfarbschema anzeigen
+STR_LIVERY_TRAIN_GROUP_TOOLTIP :{BLACK}Zeige Farben von Zuggruppen an
+STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Zeige Farben von Schiffsgruppen an
STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Die Hauptfarbe für das gewählte Schema auswählen. Strg+Klick wählt diese Farbe für jedes Schema
STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Die Nebenfarbe für das ausgewählte Schema auswählen. Strg+Klick wählt diese Farbe für jedes Schema
STR_LIVERY_PANEL_TOOLTIP :{BLACK}Farbschema oder mehrere Farbschemata mittels Strg+Klick auswählen, um diese zu ändern. In das Kästchen klicken, um ein Schema zu aktivieren
+STR_LIVERY_ROAD_VEHICLE_GROUP_EMPTY :Es sind keine Straßenfahrzeuge eingerichtet
+STR_LIVERY_AIRCRAFT_GROUP_EMPTY :Es wurden keine Flugzeuggruppen erstellt
###length 23
STR_LIVERY_DEFAULT :Standardlackierung
@@ -2278,6 +2314,9 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Spielfel
STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Spielfeldgröße{}Klick sortiert nach Fläche
STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Datum
STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Momentanes Spieljahr
+STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}h {NUM}m
+STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION :{BLACK}Spielzeit
+STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP :{BLACK}Zeit gespielt während{}Spiel nicht pausiert war
STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Sprache, Server-Version, etc.
STR_NETWORK_SERVER_LIST_CLICK_GAME_TO_SELECT :{BLACK}Ein Spiel der Liste durch Anklicken wählen
@@ -2648,7 +2687,8 @@ STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLA
STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}überlastet
# Linkgraph tooltip
-STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} ZUM Rücktransport vorgesehen ({COMMA}% der Kapazitäten)
+STR_LINKGRAPH_STATS_TOOLTIP_MINUTE :{BLACK}{CARGO_LONG} zum Rücktransport vorgesehen pro Minute von {STATION} zu {STATION} ({COMMA}% der Kapazität){STRING}
+STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} zum Rücktransport vorgesehen ({COMMA}% der Kapazität)
# Base for station construction window(s)
STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Einzugsgebiet anzeigen
@@ -2658,6 +2698,7 @@ STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}Einzugsg
STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}Einzugsgebiet anzeigen
STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}Nimmt an: {GOLD}{CARGO_LIST}
STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}Liefert: {GOLD}{CARGO_LIST}
+STR_STATION_BUILD_INFRASTRUCTURE_COST_YEAR :{BLACK}Unterhaltskosten: {GOLD}{CURRENCY_SHORT}/Jahr
# Join station window
STR_JOIN_STATION_CAPTION :{WHITE}Verbinde mit Station
@@ -3182,6 +3223,7 @@ STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Städten
STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Wähle die Sprache für die Städtenamen aus
STR_MAPGEN_DATE :{BLACK}Datum:
STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Industriedichte:
+STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}Wähle die Dichte der Industrien, oder einen benutzerdefinierten Wert
STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Höchster Gipfel:
STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Die maximale Höhe des höchsten Gipfels auf der Karte um eins erhöhen
STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Die maximale Höhe des höchsten Gipfels auf der Karte um eins verringern
@@ -3195,10 +3237,12 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Wüstenb
STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}%
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Landschaftstyp:
STR_MAPGEN_SEA_LEVEL :{BLACK}Gewässermenge:
+STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Wähle die Meereshöhe
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Flüsse:
STR_MAPGEN_SMOOTHNESS :{BLACK}Gleichmäßigkeit:
STR_MAPGEN_VARIETY :{BLACK}Größe der Geländeformen:
STR_MAPGEN_GENERATE :{WHITE}Erzeugen
+STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Erstelle die Welt und spiele OpenTTD!
STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF-Einstellungen
STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}NewGRF-Einstellungen anzeigen
STR_MAPGEN_AI_SETTINGS :{BLACK}KI Einstellungen
@@ -3231,6 +3275,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Katalanisch
# Strings for map borders at game generation
STR_MAPGEN_BORDER_TYPE :{BLACK}Spielfeldränder:
+STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}Wähle die Grenzen der Spielwelt
STR_MAPGEN_NORTHWEST :{BLACK}Nordwesten
STR_MAPGEN_NORTHEAST :{BLACK}Nordosten
STR_MAPGEN_SOUTHEAST :{BLACK}Südosten
@@ -3540,8 +3585,10 @@ STR_LOCAL_AUTHORITY_ACTION_BRIBE :Die Stadtverwal
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Im Ort eine kleine Werbekampagne starten, um mehr Passagier- und Frachtaufträge für die eigene Firma zu gewinnen.{}Bewirkt eine temporäre Steigerung der Stationsbewertung in einem kleinen Radius um das Ortszentrum.{}{POP_COLOUR}Kosten: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Im Ort eine mittlere Werbekampagne starten, um mehr Passagier- und Frachtaufträge für die eigene Firma zu gewinnen.{}Bewirkt eine temporäre Steigerung der Stationsbewertung in einem mittleren Radius um das Ortszentrum.{}{POP_COLOUR}Kosten: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Im Ort eine große Werbekampagne starten, um mehr Passagier- und Frachtaufträge für die eigene Firma zu gewinnen.{}Bewirkt eine temporäre Steigerung der Stationsbewertung in einem großen Radius um das Ortszentrum.{}{POP_COLOUR}Kosten: {CURRENCY_LONG}
+STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MONTHS :{PUSH_COLOUR}{YELLOW}Straßenreparaturen des Ortes finanzieren.{}Verursacht erhebliche Störungen für Straßenverkehr für bis zu 6 Monate.{}{POP_COLOUR}Kosten: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Eine Statue zu Ehren der eigenen Firma errichten.{}Bewirkt eine permanente Steigerung der Stationsbewertung in diesem Ort.{}{POP_COLOUR}Kosten: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Bau von neuen Gebäuden im Ort finanzieren.{}Bewirkt eine temporäre Steigerung des Ortswachstums in diesem Ort.{}{POP_COLOUR}Kosten: {CURRENCY_LONG}
+STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MINUTES :{PUSH_COLOUR}{YELLOW}Kaufe exklusive Transportrechte in dieser Stadt für 12 Minuten.{}Die Stadtverwaltung wird es Passagieren und Fracht nicht erlauben Stationen von Mitbewerbern zu nutzen. Eine erfolgreiche Bestechung eines Mitbewerbers kündigt den Vertrag.{}{POP_COLOUR}Kosten: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Die Stadtverwaltung bestechen, um die eigene Bewertung zu verbessern und die exklusiven Transportrechte eines Wettbewerbers zu widerrufen. Dabei riskiert man allerdings eine harte Strafe, falls man ertappt wird.{}{POP_COLOUR}Kosten: {CURRENCY_LONG}
# Goal window
@@ -3591,6 +3638,8 @@ STR_SUBSIDIES_OFFERED_TITLE :{BLACK}Subventi
STR_SUBSIDIES_NONE :{ORANGE}- Keine -
STR_SUBSIDIES_SUBSIDISED_TITLE :{BLACK}Bereits vergebene Subventionen:
STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klick auf subventionierte Dienstleistung zentriert Hauptansicht auf die Industrie/Stadt. Strg+Klick öffnet neue Zusatzansicht zentriert auf die Industrie/Stadt
+STR_SUBSIDIES_OFFERED_EXPIRY_TIME :innerhalb {UNITS_MONTHS_OR_MINUTES}
+STR_SUBSIDIES_SUBSIDISED_EXPIRY_TIME :{UNITS_MONTHS_OR_MINUTES} übrig
# Story book window
STR_STORY_BOOK_CAPTION :{WHITE}Chronik für {COMPANY}
@@ -3690,6 +3739,8 @@ STR_EDIT_WAYPOINT_NAME :{WHITE}Namen de
# Finances window
STR_FINANCES_CAPTION :{WHITE}{COMPANY} – Finanzen {BLACK}{COMPANY_NUM}
STR_FINANCES_YEAR :{WHITE}{NUM}
+STR_FINANCES_YEAR_CAPTION :{WHITE}Jahr
+STR_FINANCES_PERIOD_CAPTION :{WHITE}Zeitraum
###length 3
STR_FINANCES_REVENUE_TITLE :{WHITE}Einnahmen
@@ -3791,6 +3842,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanäle
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stationen:
STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS :{WHITE}Stationsfelder
STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS :{WHITE}Flughäfen
+STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/Zeitraum
# Industry directory
STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Industrien
@@ -3851,6 +3903,7 @@ STR_VEHICLE_LIST_REPLACE_VEHICLES :Fahrzeuge erset
STR_VEHICLE_LIST_SEND_FOR_SERVICING :Zur Wartung schicken
STR_VEHICLE_LIST_CREATE_GROUP :Gruppe erstellen
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Gewinn im laufenden Jahr: {CURRENCY_LONG} (vergangenes Jahr: {CURRENCY_LONG})
+STR_VEHICLE_LIST_PROFIT_THIS_PERIOD_LAST_PERIOD :{TINY_FONT}{BLACK}Profit in diesem Zeitraum: {CURRENCY_LONG} (letzter Zeitraum: {CURRENCY_LONG})
STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}]
STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING}
@@ -3896,6 +3949,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Liste leeren
STR_GROUP_RENAME_CAPTION :{BLACK}Gruppe umbenennen
STR_GROUP_PROFIT_THIS_YEAR :Gewinn dieses Jahr:
+STR_GROUP_PROFIT_THIS_PERIOD :Gewinn in diesem Zeitraum:
STR_GROUP_PROFIT_LAST_YEAR :Gewinn letztes Jahr:
STR_GROUP_OCCUPANCY :Aktuelle Nutzung:
STR_GROUP_OCCUPANCY_VALUE :{NUM}%
@@ -3923,6 +3977,7 @@ STR_PURCHASE_INFO_SPEED_POWER :{BLACK}Geschw.:
STR_PURCHASE_INFO_SPEED :{BLACK}Geschwindigkeit: {GOLD}{VELOCITY}
STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}Geschwindigkeit auf dem Meer: {GOLD}{VELOCITY}
STR_PURCHASE_INFO_SPEED_CANAL :{BLACK}Geschwindigkeit auf Kanälen und Flüssen: {GOLD}{VELOCITY}
+STR_PURCHASE_INFO_RUNNINGCOST_PERIOD :{BLACK}Betriebskosten: {GOLD}{CURRENCY_LONG}/Zeitraum
STR_PURCHASE_INFO_CAPACITY :{BLACK}Kapazität: {GOLD}{CARGO_LONG} {STRING}
STR_PURCHASE_INFO_REFITTABLE :(umrüstbar)
STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Entworfen: {GOLD}{NUM}{BLACK} Betriebsdauer: {GOLD}{COMMA} Jahr{P "" e}
@@ -3931,7 +3986,7 @@ STR_PURCHASE_INFO_COST :{BLACK}Kosten:
STR_PURCHASE_INFO_COST_REFIT :{BLACK}Kosten: {GOLD}{CURRENCY_LONG}{BLACK} (Kosten der Umrüstung: {GOLD}{CURRENCY_LONG}{BLACK})
STR_PURCHASE_INFO_WEIGHT_CWEIGHT :{BLACK}Gewicht: {GOLD}{WEIGHT_SHORT} ({WEIGHT_SHORT})
STR_PURCHASE_INFO_COST_SPEED :{BLACK}Kosten: {GOLD}{CURRENCY_LONG}{BLACK} Geschw.: {GOLD}{VELOCITY}
-STR_PURCHASE_INFO_COST_REFIT_SPEED :{BLACK}Kosten: {GOLD}{CURRENCY_LONG}{BLACK} (Kosten der Umrüstung: {GOLD}{CURRENCY_LONG}{BLACK}) Geschwindigkeit: {GOLD}{VELOCITY}
+STR_PURCHASE_INFO_COST_REFIT_SPEED :{BLACK}Kosten: {GOLD}{CURRENCY_LONG}{BLACK} (Kosten der Umrüstung: {GOLD}{CURRENCY_LONG}{BLACK}) Geschw.: {GOLD}{VELOCITY}
STR_PURCHASE_INFO_AIRCRAFT_CAPACITY :{BLACK}Kapazität: {GOLD}{CARGO_LONG}, {CARGO_LONG}
STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK}Angetriebene Waggons: {GOLD}+{POWER}{BLACK} Gewicht: {GOLD}+{WEIGHT_SHORT}
STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Umrüstbar auf: {GOLD}{STRING}
@@ -4115,6 +4170,13 @@ STR_ENGINE_PREVIEW_TRAM_VEHICLE :Straßenbahn
STR_ENGINE_PREVIEW_AIRCRAFT :{G=n}Flugzeug
STR_ENGINE_PREVIEW_SHIP :{G=n}Schiff
+STR_ENGINE_PREVIEW_TEXT4 :{BLACK}{STRING}{}{STRING}{}{STRING}{}{STRING}
+STR_ENGINE_PREVIEW_COST_MAX_SPEED :Kosten: {CURRENCY_LONG} Max. Geschw.: {VELOCITY}
+STR_ENGINE_PREVIEW_SPEED_POWER :Geschw.: {VELOCITY} Leistung: {POWER}
+STR_ENGINE_PREVIEW_SPEED_POWER_MAX_TE :Geschw.: {VELOCITY} Leistung: {POWER} Max. Zugkraft: {FORCE}
+STR_ENGINE_PREVIEW_TYPE :Flugzeugtyp: {STRING}
+STR_ENGINE_PREVIEW_TYPE_RANGE :Flugzeugtyp: {STRING} Reichweite: {COMMA} Felder
+STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Betriebskosten: {CURRENCY_LONG}/Zeitraum
# Autoreplace window
STR_REPLACE_VEHICLES_WHITE :{WHITE}{STRING} ersetzen – {STRING}
@@ -4259,7 +4321,8 @@ STR_VEHICLE_DETAILS_AIRCRAFT_RENAME :{BLACK}Name des
STR_VEHICLE_INFO_AGE :{COMMA} Jahr{P "" e} ({COMMA})
STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} Jahr{P "" e} ({COMMA})
-STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Alter: {LTBLUE}{STRING}{BLACK} Betriebskosten: {LTBLUE}{CURRENCY_LONG}/Jahr
+STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Alter: {LTBLUE}{STRING}{BLACK} Betriebskosten: {LTBLUE}{CURRENCY_LONG}/Jahr
+STR_VEHICLE_INFO_AGE_RUNNING_COST_PERIOD :{BLACK}Alter: {LTBLUE}{STRING}{BLACK} Betriebskosten: {LTBLUE}{CURRENCY_LONG}/Zeitraum
STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Max. Geschw.: {LTBLUE}{VELOCITY}
STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Max. Geschw.: {LTBLUE}{VELOCITY} {BLACK}Flugzeugtyp: {LTBLUE}{STRING}
@@ -4279,6 +4342,8 @@ STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Kapazit
STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Transfer-Einnahmen: {LTBLUE}{CURRENCY_LONG}
+STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :Zuletzt gewartet: vor {LTBLUE}{NUM} Minuten
+STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Verringere Serviceintervall um 5 Minuten. Strg+Klick um den Serviceintervall um 1 Minute zu verringern
STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Art des Wartungsintervalls ändern
STR_VEHICLE_DETAILS_DEFAULT :Standard
@@ -4384,6 +4449,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Fahre immer
STR_ORDER_DROP_SERVICE_DEPOT :Wartung, wenn nötig
STR_ORDER_DROP_HALT_DEPOT :Stopp
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Fahrzeuginformation, welche für den Sprung ausgewertet wird
# Conditional order variables, must follow order of OrderConditionVariable enum
@@ -4528,8 +4597,10 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Das Fahr
STR_TIMETABLE_STATUS_LATE :{BLACK}Dieses Fahrzeug hat {STRING} Verspätung
STR_TIMETABLE_STATUS_EARLY :{BLACK}Dieses Fahrzeug ist {STRING} zu früh
STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Dieser Fahrplan ist noch nicht gültig
+STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Dieser Fahrplan startet in {COMMA} Sekunden
+STR_TIMETABLE_START_SECONDS_QUERY :Sekunden bis der Fahrplan beginnt
STR_TIMETABLE_CHANGE_TIME :{BLACK}Zeit ändern
STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Zeitrahmen für den markierten Auftrag ändern. Strg+Klick legt die Zeit für alle Aufträge fest
@@ -4553,6 +4624,7 @@ STR_TIMETABLE_EXPECTED :{BLACK}Voraussi
STR_TIMETABLE_SCHEDULED :{BLACK}Fahrplanmäßig
STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Umschalten zwischen Anzeige der erwarteten Ankunftszeit und des Fahrplans
+STR_TIMETABLE_ARRIVAL_DATE :A: {COLOUR}{DATE_TINY}
# Date window (for timetable)
@@ -4645,6 +4717,8 @@ STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Spielskript
STR_AI_SETTINGS_CLOSE :{BLACK}Schließen
STR_AI_SETTINGS_RESET :{BLACK}Zurücksetzen
STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING}
+STR_AI_SETTINGS_SETTING_DEVIATION :{STRING}: {ORANGE}[{STRING}, {STRING}]
+STR_AI_SETTINGS_JUST_DEVIATION :[{STRING}, {STRING}]
# Textfile window
@@ -5571,6 +5645,7 @@ STR_UNKNOWN_STATION :unbekannte Stat
STR_DEFAULT_SIGN_NAME :Schild
STR_COMPANY_SOMEONE :Jemand
+STR_SAVEGAME_DURATION_REALTIME :{NUM}h {NUM}m
STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING}
STR_SAVEGAME_NAME_SPECTATOR :Zuschauer, {1:STRING}
@@ -5604,6 +5679,8 @@ STR_TOWN_NAME :{TOWN}
STR_VEHICLE_NAME :{VEHICLE}
STR_WAYPOINT_NAME :{WAYPOINT}
+STR_CURRENCY_SHORT_KILO :{NBSP}t
+STR_CURRENCY_SHORT_GIGA :{NBSP}Mrd
STR_JUST_CARGO :{CARGO_LONG}
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}
diff --git a/src/lang/greek.txt b/src/lang/greek.txt
index 4b290ae79e..422c5d4a75 100644
--- a/src/lang/greek.txt
+++ b/src/lang/greek.txt
@@ -4374,6 +4374,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Πάντα πή
STR_ORDER_DROP_SERVICE_DEPOT :Επισκευή εάν χρειάζεται
STR_ORDER_DROP_HALT_DEPOT :Στάση
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Δεδομένα οχήματος για να βασιστεί το άλμα
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt
index 27eca245fa..9a4c2346ff 100644
--- a/src/lang/hebrew.txt
+++ b/src/lang/hebrew.txt
@@ -4011,6 +4011,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :עבור תמי
STR_ORDER_DROP_SERVICE_DEPOT :טפל במידת הצורך
STR_ORDER_DROP_HALT_DEPOT :עצור
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}נתוני כלי הרכב עליהם יתבסס הדילוג
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/hindi.txt b/src/lang/hindi.txt
index 377ea9564c..938b8f164a 100644
--- a/src/lang/hindi.txt
+++ b/src/lang/hindi.txt
@@ -1282,6 +1282,10 @@ STR_ORDER_INDEX :{COMMA}:{NBSP}
STR_ORDER_REFIT_TOOLTIP :{BLACK}इस मार्ग पर ढोये जा रहे नौभार को बदलने के लिये नये प्रकार का नौभार चुनें। Ctrl+क्लिक करने पर परिवर्तन का आदेश निरस्त हो जायेगा।
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
# Conditional order variables, must follow order of OrderConditionVariable enum
###length 8
diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt
index 69cb6f3c09..9f021c6538 100644
--- a/src/lang/hungarian.txt
+++ b/src/lang/hungarian.txt
@@ -4446,6 +4446,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Mindig menj jav
STR_ORDER_DROP_SERVICE_DEPOT :Ha javításra szorul
STR_ORDER_DROP_HALT_DEPOT :Maradj ott
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}A jármű adata ami alapján ugrani szeretnénk a parancssorban
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt
index 1ddd95441c..1bd5db35d9 100644
--- a/src/lang/icelandic.txt
+++ b/src/lang/icelandic.txt
@@ -3623,6 +3623,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Fara alltaf
STR_ORDER_DROP_SERVICE_DEPOT :Þjónusta ef þarf
STR_ORDER_DROP_HALT_DEPOT :Stoppa
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Gögn farartækis sem skilyrði byggja á
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/ido.txt b/src/lang/ido.txt
index 44a73b3a3f..cf4b8b03d4 100644
--- a/src/lang/ido.txt
+++ b/src/lang/ido.txt
@@ -1406,6 +1406,10 @@ STR_ORDER_INDEX :{COMMA}:{NBSP}
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
# Conditional order variables, must follow order of OrderConditionVariable enum
###length 8
diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt
index 494547390f..1bff0bf27e 100644
--- a/src/lang/indonesian.txt
+++ b/src/lang/indonesian.txt
@@ -4383,6 +4383,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Selalu masuk
STR_ORDER_DROP_SERVICE_DEPOT :Perbaikan jika diperlukan
STR_ORDER_DROP_HALT_DEPOT :Berhenti
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Kondisi yang diperiksa
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/irish.txt b/src/lang/irish.txt
index 888d803780..d9e7ee3636 100644
--- a/src/lang/irish.txt
+++ b/src/lang/irish.txt
@@ -4200,6 +4200,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Téigh i gcóna
STR_ORDER_DROP_SERVICE_DEPOT :Seirbhísigh más gá
STR_ORDER_DROP_HALT_DEPOT :Stop
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Sonraí feithicle a bhunófar an léim air
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/italian.txt b/src/lang/italian.txt
index aa056b67ea..3c298fe89d 100644
--- a/src/lang/italian.txt
+++ b/src/lang/italian.txt
@@ -4444,6 +4444,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Sempre
STR_ORDER_DROP_SERVICE_DEPOT :Solo se necessario
STR_ORDER_DROP_HALT_DEPOT :Ferma in deposito
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dato del veicolo sul quale basare il salto
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt
index c0cb01d65e..31452a5c9a 100644
--- a/src/lang/japanese.txt
+++ b/src/lang/japanese.txt
@@ -4311,6 +4311,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :常に行く
STR_ORDER_DROP_SERVICE_DEPOT :必要であれば点検
STR_ORDER_DROP_HALT_DEPOT :運用停止
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}輸送機器データに基づく条件分岐
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/korean.txt b/src/lang/korean.txt
index c3464d3d02..58abe9c7cd 100644
--- a/src/lang/korean.txt
+++ b/src/lang/korean.txt
@@ -1496,17 +1496,17 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :옛날 차량
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :이 설정을 켜면, 오래된 차량 모델을 포함하여 모든 차량 모델을 도입 이후에 계속 사용할 수 있게 됩니다.
STR_CONFIG_SETTING_TIMEKEEPING_UNITS :시간 단위: {STRING}
-STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :게임에서 사용할 시간 표시 단위를 선택합니다. 나중에 변경할 수 없습니다.{}{}달력 기반은 1년 12개월, 매월 28~31일로 구성된 고전적인 OpenTTD 환경입니다.{}{}벽시계 기반은 차량 이동, 화물 생산 및 재정이 1분 단위로 대신 계산됩니다. 1분은 달력 기반 모드에서 한 달, 즉 30일 정도 걸리는 시간으로, 12분 간격으로 묶어서 1년을 구성합니다.{}{}두 단위 모두, 시간 표시 단위와 상관없이 차량, 주택 및 기타 인프라 도입 날짜에 사용되는 기존 달력 시스템을 별도로 사용합니다.
+STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :게임에서 사용할 시간 표시 단위를 선택합니다. 나중에 변경할 수 없습니다.{}{}달력 기반은 1년 12개월, 매월 28~31일로 구성된 고전적인 OpenTTD 환경입니다.{}{}벽시계 기반은 차량 이동, 화물 생산 및 재정이 1분 단위로 대신 계산됩니다. 1분은 달력 기반 모드에서 한 달, 즉 30일 정도 걸리는 시간으로, 12분 간격으로 묶어서 1년을 구성합니다.{}{}두 단위 모두, 시간 표시 단위와 상관없이 차량, 건물 및 기타 기반 시설 도입 날짜 등에는 기존의 달력 시스템을 별도로 사용합니다.
###length 2
STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :달력
STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :벽시계
-STR_CONFIG_SETTING_MINUTES_PER_YEAR :1년의 길이: {STRING}분
+STR_CONFIG_SETTING_MINUTES_PER_YEAR :1년의 길이: {STRING}{ORANGE}분
STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT :달력의 1년을 몇 분으로 할 지 선택합니다. 기본값은 12분입니다. 달력 시간이 변하는 것을 막으려면 0으로 설정하세요. 이 설정은 게임의 경제 시뮬레이션에는 영향을 미치지 않고, 벽시계 시간 설정을 사용할 때만 이용 가능합니다.
STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM}
###setting-zero-is-special
-STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (달력 시간 정지됨)
+STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :(달력 시간 정지됨) 0
STR_CONFIG_SETTING_TOWN_CARGO_SCALE :도시 화물 생성 조정: {STRING}
STR_CONFIG_SETTING_TOWN_CARGO_SCALE_HELPTEXT :도시의 화물 생산량을 이 백분율 값만큼 조정합니다.
@@ -1933,6 +1933,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :전자식 신
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :신호기를 CTRL 클릭할 때 바뀌는 신호기의 종류: {STRING}
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :신호기 건설에서 CTRL+클릭할 때 바뀌는 신호기의 종류를 선택합니다
###length 2
+STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :경로 신호기만 보여주기
STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :모두 보여주기
STR_CONFIG_SETTING_SIGNAL_GUI_MODE :보여줄 신호기 종류: {STRING}
@@ -4376,6 +4377,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}현재
# Messages in the start stop button in the vehicle view
STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}싣는 중 / 내리는 중
STR_VEHICLE_STATUS_LEAVING :{LTBLUE}출발 중
+STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}배차 간격 유지 대기 중
STR_VEHICLE_STATUS_CRASHED :{RED}충돌!
STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}고장
STR_VEHICLE_STATUS_STOPPED :{RED}정지함
@@ -4389,6 +4391,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}경로
STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}다음 목적지: {WAYPOINT} ({VELOCITY})
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}다음 목적지: {DEPOT} ({VELOCITY})
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}점검: {DEPOT} ({VELOCITY})
+STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}점검 및 배차 간격 대기: {DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}{STATION}에 갈 수 없음, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}{WAYPOINT}에 갈 수 없음, {VELOCITY}
@@ -4519,6 +4522,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}시간
STR_ORDERS_LIST_TOOLTIP :{BLACK}이 열차의 경로 - 선택하려면 클릭하세요. CTRL+클릭하시면 그 역이 있는 장소로 이동합니다
STR_ORDER_INDEX :{COMMA}:{NBSP}
+STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING}
STR_ORDERS_END_OF_ORDERS :- - 경로의 끝 - -
STR_ORDERS_END_OF_SHARED_ORDERS :- - 공유된 경로의 끝 - -
@@ -4555,6 +4559,15 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :이용 가능
STR_ORDER_DROP_GO_ALWAYS_DEPOT :항상 감
STR_ORDER_DROP_SERVICE_DEPOT :필요하면 점검
STR_ORDER_DROP_HALT_DEPOT :멈춤
+STR_ORDER_DROP_UNBUNCH :배차 간격 유지
+
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}차량기지에서 수행할 작업을 선택합니다
+STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}차고지에서 수행할 작업을 선택합니다.
+STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}정박소에서 수행할 작업을 선택합니다
+STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}격납고에서 수행할 작업을 선택합니다.
+###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}경로를 건너뛰기 위한 비교 조건을 선택합니다
@@ -4623,6 +4636,7 @@ STR_ORDER_REFIT_ORDER :({STRING}{G 0 "
STR_ORDER_REFIT_STOP_ORDER :({STRING}에서 수리 후 멈춤)
STR_ORDER_STOP_ORDER :(멈춤)
+STR_ORDER_WAIT_TO_UNBUNCH :(배차 간격 유지 대기)
STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING}
STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(이 역을 이용할 수 없음){POP_COLOUR} {STRING} {STATION} {STRING}
@@ -5094,6 +5108,11 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}근처
STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :잘못된 차량기지 종류입니다
# Depot unbunching related errors
+STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}... 배차 간격 유지 경로는 하나만 사용 가능합니다
+STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}... 차량에 배차 간격 유지 경로가 있으면 가득 싣기 경로를 사용할 수 없습니다
+STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}... 가득 싣기 경로가 있는 차량에는 배차 간격 유지를 사용할 수 없습니다
+STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}... 차량에 배차 간격 유지 경로가 있으면 조건부 경로를 사용할 수 없습니다
+STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}... 조건부 경로가 있는 차량에는 배차 간격 유지를 사용할 수 없습니다
# Autoreplace related errors
STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} : 교체된지 너무 오래되었습니다
diff --git a/src/lang/latin.txt b/src/lang/latin.txt
index 7fadd4109e..b233940696 100644
--- a/src/lang/latin.txt
+++ b/src/lang/latin.txt
@@ -4106,6 +4106,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ire semper
STR_ORDER_DROP_SERVICE_DEPOT :Ministrari si necesse est
STR_ORDER_DROP_HALT_DEPOT :Consiste
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Indicia vehiculi ad quae spectat ordines conditionales
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt
index 511a3e711b..6f106fbebf 100644
--- a/src/lang/latvian.txt
+++ b/src/lang/latvian.txt
@@ -216,6 +216,7 @@ STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :Tāds, ka prim
STR_UNITS_VELOCITY_IMPERIAL :{DECIMAL}{NBSP}jūdzes stundā
STR_UNITS_VELOCITY_METRIC :{DECIMAL}{NBSP}km/h
STR_UNITS_VELOCITY_SI :{DECIMAL}{NBSP}m/s
+STR_UNITS_VELOCITY_GAMEUNITS_DAY :{DECIMAL}{NBSP}lauciņi/dienā
STR_UNITS_VELOCITY_GAMEUNITS_SEC :{DECIMAL}{NBSP}lauciņi/s
STR_UNITS_VELOCITY_KNOTS :{DECIMAL}{NBSP}mezgli
@@ -291,7 +292,7 @@ STR_TOOLTIP_RESIZE :{BLACK}Klikšķ
STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Pārslēgties starp lielu/mazu loga izmēru
STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST :{BLACK}Ritjosla - ritina sarakstu augšup/lejup
STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Ritjosla - ritina sarakstu pa kreisi/pa labi
-STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Nojaukt celtnes u.c. objektus no zemes platības. Ctrl iezīmē diagonālu laukumu. Shift pārslēdz nojaukšanu/izmaksu tāmes attēlošanu
+STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Nojaukt celtnes u.c. objektus no zemes platības. Velkot Ctrl+klikšķis iezīmē diagonālu laukumu. Shift parāda izmaksas, neveicot nojaukšanu
# Show engines button
###length VEHICLE_TYPES
@@ -333,6 +334,7 @@ STR_SORT_BY_TYPE :veida
STR_SORT_BY_TRANSPORTED :pārvadājuma
STR_SORT_BY_NUMBER :numura
STR_SORT_BY_PROFIT_LAST_YEAR :peļņas pērn
+STR_SORT_BY_PROFIT_LAST_PERIOD :Peļņa pēdējā periodā
STR_SORT_BY_PROFIT_THIS_YEAR :peļņas šogad
STR_SORT_BY_PROFIT_THIS_PERIOD :Peļņa šajā periodā
STR_SORT_BY_AGE :vecuma
@@ -366,6 +368,7 @@ STR_SORT_BY_TOTAL_PROFIT_LAST_PERIOD :Kopējā peļņ
STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Kopējā peļņa šogad
STR_SORT_BY_TOTAL_PROFIT_THIS_PERIOD :Kopējā peļņa šajā periodā
STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Vidējā peļņa iepriekšējā gadā
+STR_SORT_BY_AVERAGE_PROFIT_LAST_PERIOD :Vidējā peļņa pēdējā periodā
STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Vidējā peļņa šajā gadā
STR_SORT_BY_AVERAGE_PROFIT_THIS_PERIOD :Vidējā peļņa šajā periodā
@@ -383,32 +386,32 @@ STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Pauzēt
STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}Paātrināta spēle
STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Opcijas un iestatījumi
STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}Saglabājiet, ielādējiet vai pametiet spēli, iziet no programmas
-STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Rādīt karti, papildu skata logu, kravas plūsmu vai zīmju sarakstu
-STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}Rādīt pilsētu sarakstu
-STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Rādīt subsīdijas
-STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Rādīt uzņēmuma staciju sarakstu
-STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Rādīt uzņēmuma finanšu stāvokli
-STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Rādīt uzņēmuma vispārējo informāciju
-STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Rādīt stāstu grāmatu
-STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Rādīt mērķu sarakstu
-STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Rādīt uzņēmumu grafikus un kravas maksājumu likmes
-STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Rādīt uzņēmumu rangu sarakstu
-STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Izpētiet nozares vai finansējiet jaunas nozares celtniecību
-STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Rādīt uzņēmuma vilcienu sarakstu. Ctrl+klikšķis pārslēdz grupu/transportlīdzekļu saraksta atvēršanu
-STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Rādīt uzņēmuma autotransporta sarakstu. Ctrl+klikšķis pārslēdz grupu/transportlīdzekļu saraksta atvēršanu
-STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Rādīt uzņēmuma kuģu sarakstu. Ctrl+klikšķis pārslēdz grupu/transportlīdzekļu saraksta atvēršanu
-STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Rādīt uzņēmuma lidaparātu sarakstu. Ctrl+klikšķis pārslēdz grupu/transportlīdzekļu saraksta atvēršanu
-STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Pietuvināt skatu
-STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Attālināt skatu
-STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Būvēt sliežu ceļu
-STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Būvēt ceļus
-STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Būvēt tramvajus
-STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Būvēt kuģu piestātnes
+STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Atvērt karti, papildu skata logu, kravas plūsmu vai zīmju sarakstu
+STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}Atvērt pilsētu sarakstu vai dibināt pilsētu
+STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Atvērt subsīdiju sarakstu
+STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Atvērt uzņēmuma staciju sarakstu
+STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Atvērt uzņēmuma finanšu stāvokli
+STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Atvērt uzņēmuma vispārējo informāciju
+STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Atvērt stāstu grāmatu
+STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Atvērt mērķu sarakstu
+STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Atvērt uzņēmumu grafikus un kravas maksājumu likmes
+STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Atvērt uzņēmumu rangu sarakstu
+STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Atvērt ražotņu sarakstu, ražošanas ķēdi vai subsidēt jauno ražotņu izveidi
+STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Atvērt uzņēmuma vilcienu sarakstu. Ctrl+noklikšķiniet, lai parādītu vai paslēptu transportlīdzekļu grupas pretēji izvēlētiem iestatījumiem
+STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Rādīt uzņēmuma autotransporta sarakstu. Ctrl+klikšķis, lai parādītu vai paslēptu transportlīdzekļu grupas pretēji izvēlētajiem iestatījumiem
+STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Atvērt uzņēmuma kuģu sarakstu. Ctrl+klikšķis, lai parādītu vai paslēptu transportlīdzekļu grupas pretēji izvēlētiem iestatījumiem
+STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Atvērt uzņēmuma lidaparātu sarakstu. Ctrl+klikšķis, lai parādītu vai paslēptu transportlīdzekļu grupas pretēji izvēlētiem iestatījumiem
+STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Pietuvināt
+STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Attālināt
+STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Buvēt dzelzceļa infrastruktūru
+STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Buvēt ceļu infrastruktūru
+STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Buvēt tramvaju infrastruktūru
+STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Būvēt ūdensceļu infrastruktūru
STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Būvēt lidostas
-STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Atvērt ainavas rīkjoslu, lai paceltu/nolaistu zemes līmeni, stādītu kokus utt.
-STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Rādīt skaņas/mūzikas logu
-STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Rādīt pēdējo ziņojumu/ziņu pārskatu, ziņojumu vēsturi vai dzēst visus ziņojumus
-STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Informācija par zemi, ekrānuzņēmums par OpenTTD un izstrādātāju rīkiem
+STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Atveriet ainavu izvēlni, koku izvēlni vai novietojiet zīmi
+STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Atvērt skaņas/mūzikas logu
+STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Atvērt pēdējo ziņojumu/ziņu pārskatu, ziņojumu vēsturi vai dzēst visus ziņojumus
+STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Atvērt zemes informāciju, ekrānuzņēmumu izvēlni, OpenTTD kredītus vai izstrādātāju rīkus
STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR :{BLACK}Pārslēgt rīkjoslas
# Extra tooltips for the scenario editor toolbar
@@ -418,15 +421,15 @@ STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR :{YELLOW}scenār
STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD :{BLACK}Pārvietot sākuma datumu 1 gadu atpakaļ
STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD :{BLACK}Pārvietot sākuma datumu 1 gadu uz priekšu
STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE :{BLACK}Klikšķināt, lai ievadītu sākuma gadu
-STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Rādīt karti, pilsētu sarakstu
-STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Ainavas radīšana
-STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Pilsētu radīšana
-STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Ražotņu radīšana
-STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Ceļu būvēšana
-STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Tramvaju sliežu ceļu būvniecība
-STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Iestādiet kokus. Ctrl atlasa apgabalu pa diagonāli. Shift pārslēdz celt/parādīt izmaksas
+STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Atvērt karti, papildu skata logu, zīmju sarakstu vai pilsētas vai ražotņu sarakstu
+STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Atvērt ainavu izvēlni vai izveidot jaunu pasauli
+STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Buvēt vai ģenerēt pilsētas
+STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Veidot vai ģenerēt ražotnes
+STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Būvēt ceļu infrastruktūru
+STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Būvēt tramvaju infrastruktūru
+STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Iestādiet kokus. Velkot Ctrl+klikšķis atlasīs apgabalu pa diagonāli. Shift parāda izmaksas, neveicot iegādi
STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Novietot zīmi
-STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Novietojiet objektu. Ctrl atlasa apgabalu pa diagonāli. Shift pārslēdz ēku/rāda izmaksu tāmi
+STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Novietojiet objektu. Velkot Ctrl+klikšķis tiek atlasīts apgabals pa diagonāli. Shift parāda novērtētās izmaksas, neveicot iegādi
# Scenario editor file menu
###length 7
@@ -611,8 +614,10 @@ STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Pārvad
STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Uzņēmuma darbības vērtējumi (maksimālais ir 1000)
STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Uzņēmuma vērtības diagramma
+STR_GRAPH_LAST_72_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}Pēdējās 72 minūtes
STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Kravas apmaksas cenas
+STR_GRAPH_CARGO_PAYMENT_RATES_DAYS :{TINY_FONT}{BLACK}Dienas ceļā
STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS :{TINY_FONT}{BLACK}Sekundes tranzītā
STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Izmaksas par 10 vienību (vai 10,000 litru) kravas pārvadāšanu par 20 lauciņiem
STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Iespējot visu
@@ -667,6 +672,7 @@ STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_YEARS :{BLACK}To trans
STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_PERIODS :{BLACK}Transportlīdzekļu skaits, kas pagājušajā periodā guva peļņu. Tas ietver autotransporta līdzekļus, vilcienus, kuģus un lidmašīnas
STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Nesen apkalpoto staciju skaits. Dzelzceļa stacijas, autoostas, lidostas un tamlīdzīgas tiek skaitītas kā atsevišķas, pat ja tās ir savienotas kā viena stacija
STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_YEARS :{BLACK}Transportlīdzekļa peļņa ar viszemākajiem ienākumiem (tiek ņemti vērā tikai transportlīdzekļi, kas vecāki par diviem gadiem)
+STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_PERIODS :{BLACK}Transportlīdzekļa peļņa ar viszemākajiem ienākumiem (tiek ņemti vērā tikai transportlīdzekļi, kas vecāki par diviem periodiem)
STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Nopelnītās naudas daudzums ceturksnī ar vismazāko peļņu pēdējos 12 ceturkšņos
STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Nopelnītās naudas daudzums ceturksnī ar vislielāko peļņu pēdējos 12 ceturkšņos
STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Kravu vienības , kas piegādātas pēdējos četros ceturkšņos
@@ -899,6 +905,7 @@ STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE
STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD_AND :{WHITE}{VEHICLE} ir kļuvis ļoti vecs un tam steidzami nepieciešama nomaiņa
STR_NEWS_TRAIN_IS_STUCK :{WHITE}{VEHICLE} nevar atrast ceļu, lai turpinātu
STR_NEWS_VEHICLE_IS_LOST :{WHITE}{VEHICLE} ir apmaldījies
+STR_NEWS_VEHICLE_UNPROFITABLE_YEAR :Uzņēmuma {WHITE}{VEHICLE} peļņa pagājušajā gadā bija {CURRENCY_LONG}
STR_NEWS_VEHICLE_UNPROFITABLE_PERIOD :{WHITE}{VEHICLE} peļņa pagājušajā periodā bija {CURRENCY_LONG}
STR_NEWS_AIRCRAFT_DEST_TOO_FAR :{WHITE}{VEHICLE} nevar doties uz nākamo galamērķi, jo tas ir ārpus apgabala
@@ -918,10 +925,16 @@ STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLAC
STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Subsidēšana atcelta:{}{}{STRING} pārvadājumi no {STRING} uz {STRING} turpmāk vairs netiek subsidēti
STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Pakalpojuma subsīdijas piedāvājums:{}{}Pirmais {STRING} no {STRING} līdz {STRING} saņems {UNITS_YEARS_OR_MINUTES} subsīdiju no vietējās pašvaldības!
###length 4
+STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}Pakalpojuma subsīdija piešķirta uzņēmumam {STRING}!{}{} Pārvadājot {STRING} no {STRING} līdz {STRING} saņems 50% piemaksu par nākamo {UNITS_YEARS_OR_MINUTES}!
+STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}Pakalpojuma subsīdija piešķirta uzņēmumam {STRING}!{}{}Pārvadājot {STRING} no {STRING} līdz {STRING} saņems dubultās likmes nākamos {UNITS_YEARS_OR_MINUTES}!
+STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Pakalpojuma subsīdija piešķirta uzņēmumam {STRING}!{}{}Pārvadājot{STRING} no {STRING} līdz {STRING} saņems trīskāršu maksu nākamo {UNITS_YEARS_OR_MINUTES}!
+STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Pakalpojuma subsīdija piešķirta uzņēmumam {STRING}!{}{}Pārvadājot {STRING} no {STRING} līdz {STRING} saņems četrkāršu tarifu par nākamo {UNITS_YEARS_OR_MINUTES}!
STR_NEWS_ROAD_REBUILDING_MONTHS :{BIG_FONT}{BLACK}Satiksmes haoss pilsētā {TOWN}!{}{} Dēļ {STRING} finansētā ceļu atjaunošanas programmas, tuprmākos 6 mēnešus
+STR_NEWS_ROAD_REBUILDING_MINUTES :{BIG_FONT}{BLACK}Satiksmes haoss pilsētā {TOWN}!{}{}{STRING} finansētā ceļu atjaunošanas programma autobraucējiem sagādā 6 minūtes posta!
STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Pārvadājumu monopols!
STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MONTHS :{BIG_FONT}{BLACK}{TOWN} vietējā pašvaldība paraksta līgumu ar {STRING} par ekskluzīvām transporta tiesībām uz 12 mēnešiem!
+STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MINUTES :{BIG_FONT}{BLACK}{TOWN} vietējā pašvaldība paraksta līgumu ar {STRING} par ekskluzīvām transporta tiesībām uz 12 minūtēm!
# Extra view window
STR_EXTRA_VIEWPORT_TITLE :{WHITE}Skatvieta {COMMA}
@@ -939,6 +952,8 @@ STR_GAME_OPTIONS_TAB_GRAPHICS :Grafika
STR_GAME_OPTIONS_TAB_GRAPHICS_TT :{BLACK}Izvēlieties grafikas iestatījumus
STR_GAME_OPTIONS_TAB_SOUND :Skaņa
STR_GAME_OPTIONS_TAB_SOUND_TT :{BLACK}Izvēlieties skaņas un mūzikas iestatījumus
+STR_GAME_OPTIONS_TAB_SOCIAL :Sociālais tīkls
+STR_GAME_OPTIONS_TAB_SOCIAL_TT :{BLACK}Izvēlieties sociālās integrācijas iestatījumus
STR_GAME_OPTIONS_VOLUME :Skaļums
STR_GAME_OPTIONS_SFX_VOLUME :Skaņas efekti
@@ -1028,20 +1043,22 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK} Atzīm
STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Šis iestatījums stāsies spēkā tikai pēc spēles restartēšanas
STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync
-STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Atzīmējiet šo izvēlni, lai sinhronizētu ekrānu. Mainīts iestatījums tiks piemērots tikai pēc spēles restartēšanas. Darbojas tikai ar iespējotu aparatūras paātrinājumu
+STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Atzīmējiet šo izvēlni, lai sinhronizētu ekrānu. Mainīts iestatījums tiks piemērots tikai pēc spēles restartēšanas. Darbojas tikai ar ieslēgtu aparatūras paātrinājumu
STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Esošais vadītājs: {STRING}
STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Saskarnes izmērs
-STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Velciet slīdni, lai iestatītu interfeisa izmēru. Turiet nospiestu taustiņu Ctrl, lai veiktu nepārtrauktu regulēšanu
+STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Velciet slīdni, lai iestatītu saskarnes izmēru. Velciet Ctrl nepārtrauktai pielāgošanai
STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Automātiski noteikt izmēru
STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Atzīmējiet šo izvēlni, lai automātiski noteiktu interfeisa izmēru
STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Mēroga slīpumi
STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Atzīmējiet šo izvēlni, lai mērogotu slīpumu pēc saskarnes lieluma
-STR_GAME_OPTIONS_GUI_FONT_SPRITE :{BLACK}Izmantot radicionālo sprite fontu
+STR_GAME_OPTIONS_GUI_FONT_SPRITE :{BLACK}Izmantot tradicionālo sprite fontu
STR_GAME_OPTIONS_GUI_FONT_SPRITE_TOOLTIP :{BLACK}Atzīmējiet šo izvēli, ja vēlaties izmantot tradicionālo fiksētā izmēra sprite fontu.
+STR_GAME_OPTIONS_GUI_FONT_AA :{BLACK}Anti-alias fonti
+STR_GAME_OPTIONS_GUI_FONT_AA_TOOLTIP :{BLACK}Atzīmējiet šo izvēli, ja vēlaties mainīt fontus ar anti-alias izmēru.
STR_GAME_OPTIONS_GUI_SCALE_1X :1x
STR_GAME_OPTIONS_GUI_SCALE_2X :2x
@@ -1076,12 +1093,19 @@ STR_GAME_OPTIONS_BASE_MUSIC :{BLACK}Pamata m
STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Atlasīt lietošanai pamata mūzikas kopu
STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Papildinformācija par pamata mūzikas kopu
+STR_GAME_OPTIONS_SOCIAL_PLUGINS_NONE :{LTBLUE}(nav instalētu spraudņu, ko integrēt ar sociālajām platformām)
STR_GAME_OPTIONS_SOCIAL_PLUGIN_TITLE :{BLACK}{STRING} ({STRING})
+STR_GAME_OPTIONS_SOCIAL_PLUGIN_PLATFORM :{BLACK}Platforma:
STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE :{BLACK}Spraudņa stāvoklis:
+STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_RUNNING :{GREEN}Darbojas
STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_FAILED :{RED}Neizdevās instalēt
+STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_PLATFORM_NOT_RUNNING :{ORANGE}{STRING} nedarbojas
+STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_UNLOADED :{RED}Izkrauts
STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_DUPLICATE :{RED}Dublēts spraudnis
+STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_UNSUPPORTED_API :{RED}Neatbalstīta versija
+STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_INVALID_SIGNATURE :{RED}Nederīgs paraksts
STR_BASESET_STATUS :{STRING} {RED}({NUM} trūkst/bojāts fail{P s i ""})
@@ -1230,7 +1254,7 @@ STR_CONFIG_SETTING_CATEGORY_AND_TYPE_HIDES :{BLACK}Rādīt
###length 3
STR_CONFIG_SETTING_OFF :izslēgts
STR_CONFIG_SETTING_ON :ieslēgts
-STR_CONFIG_SETTING_DISABLED :atspējots
+STR_CONFIG_SETTING_DISABLED :Atspējots
###length 3
STR_CONFIG_SETTING_COMPANIES_OFF :izslēgts
@@ -1249,6 +1273,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :pa labi
STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}sekund{P 0 i es ""}
+STR_CONFIG_SETTING_INFINITE_MONEY :Bezgalīga nauda: {STRING}
STR_CONFIG_SETTING_INFINITE_MONEY_HELPTEXT :Atļaut neierobežotus tēriņus un izslēgt uzņēmumu bankrotu
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maksimālais sākotnējais aizdevums: {STRING}
@@ -1277,6 +1302,7 @@ STR_CONFIG_SETTING_SUBSIDY_DURATION :Subsīdiju ilgu
STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Nosakiet gadu skaitu, par kuru tiek piešķirta subsīdija
STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT_PERIODS :Iestatiet periodu skaitu, par kuriem tiek piešķirta subsīdija
+STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR_PERIODS}
###setting-zero-is-special
STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Bez subsīdijām
@@ -1284,7 +1310,7 @@ STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Būvēšanas iz
STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Iestatīt būvēšanas un pirkumu izmaksas
STR_CONFIG_SETTING_RECESSIONS :Lejupslīde: {STRING}
-STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Ja ieslēgts, ik pa laikam var gadīties recesijas. To laikā visa ražošana būtiski samazinās (tā atgriežas sākotnējā līmenī pēc recesijas beigām).
+STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Ja ieslēgts, periodiski var rasties recesijas. Recesijas laikā visa ražošana ir ievērojami zemāka (tā atgriežas iepriekšējā līmenī, kad recesija ir beigusies)
STR_CONFIG_SETTING_TRAIN_REVERSING :Neatļaut vilcienu apgriešanos stacijās: {STRING}
STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Ja ieslēgts, stacijās vilcieni negriezīsies pretējā virzienā, pat ja braucot tādā veidā tie atrastu īsāku ceļu un nākamo pieturu; izņēmums ir gala stacijas
@@ -1338,7 +1364,7 @@ STR_CONFIG_SETTING_FORBID_90_DEG :Aizliegt vilcie
STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :90 grādu pagriezieni rodas, ja horizontālam sliežu ceļa posmam tieši seko vertikāls sliežu ceļa posms uz blakus esošā lauciņa. Tādējādi vilciens, šķērsojot lauciņu malas, veic 90 grādu pagriezienu, nevis parasto 45 grādu kā citām sliežu ceļu kombinācijām. Tas attiecas arī uz kuģu pagrieziena leņķiem. Tas arī attiecas uz kuģu pagriešanās rādiusu.
STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS :Atļaut savienot stacijas, kas neatrodas tieši blakus: {STRING}
-STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Atļaut pievienot staciju daļas, tām nesaskaroties ar jau esošajām. Novietojot jaunās daļas, ir nepieciešams nospiest Ctrl+klikšķis
+STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Ļauj pievienot staciju daļas, tām nesaskaroties ar jau esošajām spiežot Ctrl+klikšķis, novietojot jaunas daļas
STR_CONFIG_SETTING_INFLATION :Inflācija: {STRING}
STR_CONFIG_SETTING_INFLATION_HELPTEXT :Atļaut inflāciju ekonomikā, kur izmaksu celšanās nedaudz apsteidz ienākumus
@@ -1374,10 +1400,11 @@ STR_CONFIG_SETTING_SIGNALSIDE_RIGHT :labajā pusē
###length 2
STR_CONFIG_SETTING_SHOWFINANCES :Gada beigās rādīt finanšu pārskatu: {STRING}
+STR_CONFIG_SETTING_SHOWFINANCES_PERIOD :Rādīt finanšu logu perioda beigās: {STRING}
###length 2
STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :Ja ieslēgts, katra gada beigās uznirst finanšu logs, lai varētu viegli pārbaudīt uzņēmuma finansiālo stāvokli
-STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT_PERIOD :Ja iespējots, finanšu logs tiek parādīts katra perioda beigās, lai varētu viegli pārbaudīt uzņēmuma finansiālo stāvokli
+STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT_PERIOD :Ja ieslēgts, finanšu logs tiek parādīts katra perioda beigās, lai varētu viegli pārbaudīt uzņēmuma finansiālo stāvokli
STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Jaunie rīkojumi noklusējumā ir 'bez pieturām': {STRING}
STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Transportlīdzeklis parasti pietur pie katras caurbraucamās stacijas. Ieslēdzot šo iestatījumu, tas dosies cauri visām ceļa stacijām uz savu galamērķi bez pieturām. Ņemiet vērā, ka šis iestatījums nosaka noklusējuma vērtību tikai jaunajiem rīkojumiem. Tomēr ir iespējams katru rīkojumu iestatīt arī atsevišķi
@@ -1390,7 +1417,7 @@ STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :vidū
STR_CONFIG_SETTING_STOP_LOCATION_FAR_END :beigās
STR_CONFIG_SETTING_AUTOSCROLL :Bīdīt logu, kad peles kursors atrodas tā malā: {STRING}
-STR_CONFIG_SETTING_AUTOSCROLL_HELPTEXT :Ja iespējots, skatvieta sāk ritināties kad peles kursors ir pie loga malas
+STR_CONFIG_SETTING_AUTOSCROLL_HELPTEXT :Ja ieslēgts, skatvieta sāk ritināties kad peles kursors ir pie loga malas
###length 4
STR_CONFIG_SETTING_AUTOSCROLL_DISABLED :atspējots
STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT_FULLSCREEN :galveno skatvietu, tikai pilnekrāna spēlei
@@ -1400,10 +1427,11 @@ STR_CONFIG_SETTING_AUTOSCROLL_EVERY_VIEWPORT :katru skatvietu
STR_CONFIG_SETTING_BRIBE :Atļaut piekukuļot vietējās pašvaldības: {STRING}
###length 2
STR_CONFIG_SETTING_BRIBE_HELPTEXT :Lauj uzņēmumiem mēģināt piekukuļot pilsētu vietējo pašvaldību. Ja inspektors paziņo par kukuli, tad uzņēmums pilsētā nevarēs darboties sešus mēnešus
+STR_CONFIG_SETTING_BRIBE_HELPTEXT_MINUTES :Ļaujiet uzņēmumiem mēģināt uzpirkt vietējās pašvaldības. Ja kukuli pamanīs inspektors, uzņēmums nevarēs rīkoties pilsētā sešas minūtes
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Atļaut pirkt pārvadājumu izņēmuma tiesības: {STRING}
###length 2
-STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Ja uzņēmums pērk pārvadājumu izņēmuma tiesības pilsētā, pretinieku stacijas (pasažieru un kravas) veselu gadu nesaņems nekādu kravu
+STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Ja uzņēmums pērk ekskluzīvas pilsētas transporta tiesības, pretinieku stacijas (pasažieru un kravas) nesaņems nevienu kravu 12 mēnešus.
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT_MINUTES :Ja uzņēmums pērk ekskluzīvas pilsētas transporta tiesības, pretinieku stacijas (pasažieru un kravas) nesaņems nevienu kravu 12 minūtes.
STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Atļaut ēku finansēšanu: {STRING}
@@ -1463,21 +1491,28 @@ STR_CONFIG_SETTING_ORDER_REVIEW_ON :visiem transpor
STR_CONFIG_SETTING_WARN_INCOME_LESS :Brīdināt, ja transportlīdzekļa ienākumi ir negatīvi: {STRING}
###length 2
STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Ja ieslēgts, tiks sūtīts ziņojums gadījumā kad transportlīdzeklis negūst nekādu peļņu kalendārā gada laikā
-STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT_PERIOD :Ja iespējots, tik nosūtīts ziņojums, ja transportlīdzeklis noteiktā periodā nav guvis peļņu
+STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT_PERIOD :Ja ieslēgts, tik nosūtīts ziņojums, ja transportlīdzeklis noteiktā periodā nav guvis peļņu
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Transportlīdzekļi nekad "nemirst": {STRING}
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Kad ieslēgts, visi transportlīdzekļu modeļi pēc to ieviešanas vienmēr ir pieejami
STR_CONFIG_SETTING_TIMEKEEPING_UNITS :Laika uzskaite: {STRING}
+STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :Izvēlieties spēles laika mērīšanas vienības. Vēlāk to nevar mainīt.{}{}Kalendāra pamatā ir klasiskā OpenTTD pieredze, kurā gads sastāv no 12 mēnešiem un katru mēnesi ir 28–31 diena.{}{}{}Uz sienas pulksteni balstītā laikā, transportlīdzekļu kustībā, kravu ražošana, un finanses ir balstītas uz vienas minūtes soli, kas ir aptuveni tikpat ilgs laiks, cik 30 dienu mēnesis aizņem kalendāra režīmā. Tie ir sagrupēti 12 minūšu periodos, kas ir līdzvērtīgi gadam kalendāra režīmā.{}{}{}Abos režīmos vienmēr ir klasisks kalendārs, kas tiek izmantots transportlīdzekļu, māju un citas infrastruktūras datu ievadīšanai.
###length 2
STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :Kalendārs
+STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Sienas pulkstenis
+STR_CONFIG_SETTING_MINUTES_PER_YEAR :Minūtes gadā: {STRING}
STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT :Izvēlieties minūšu skaitu kalendārajā gadā. Noklusējums ir 12 minūtes. Iestatiet uz 0, lai apturētu kalendāra laika izmaiņas. Šis iestatījums neietekmē spēles ekonomisko simulāciju un ir pieejams tikai tad, ja tiek izmantots sienas pulksteņa laika mērijums
+STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM}
###setting-zero-is-special
+STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (kalendāra laiks ir iesaldēts)
STR_CONFIG_SETTING_TOWN_CARGO_SCALE :Mērogot pilsētas kravu ražošana: {STRING}
STR_CONFIG_SETTING_TOWN_CARGO_SCALE_HELPTEXT :Mērogojiet pilsētu kravu ražošanu par šo procentu.
+STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE :Merogot industrijas kravu ražošanu: {STRING}
+STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_HELPTEXT :Mērogojiet nozaru kravu ražošanu par šo procentu.
STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}%
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Automātiski atjaunot transportlīdzekļus, kad tie ir kļuvuši veci: {STRING}
@@ -1510,7 +1545,7 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Diagrammu līni
STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Rādīt jauno NewGRF paplašinājumu nosaukumus uzbūvēto transportlīdzekļu logā: {STRING}
STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Uzbūvēto transportlīdzekļu loga pievienot rindu, kurā būtu redzams, no kura NewGRF nāk izvēlētais transportlīdzeklis.
STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS :Rādīt kravas, ko transportlīdzekļi var pārvadāt saraksta logos {STRING}
-STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :Ja iespējots, transportlīdzekļa transportējamā krava parādīsies virs tās transportlīdzekļu sarakstos
+STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :Ja ieslēgts, transportlīdzekļa transportējamā krava parādīsies virs tās transportlīdzekļu sarakstos
STR_CONFIG_SETTING_LANDSCAPE :Ainava: {STRING}
STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Ainavas nosaka pamata spēles scenārijus ar dažādām kravām un pilsētu izaugsmes nosacījumiem. NewGRF un spēles skripti dod smalkākas kontroles iespējas
@@ -1641,7 +1676,7 @@ STR_CONFIG_SETTING_SCROLLWHEEL_OFF :izslēgts
STR_CONFIG_SETTING_OSK_ACTIVATION :Ekrāntastatūra: {STRING}
STR_CONFIG_SETTING_OSK_ACTIVATION_HELPTEXT :Izvēlieties metodi, kas atvērs ekrnāna tastatūru, lai teksta lauciņos varētu ievadīt tekstu, izmantojot rādītājierīces. Tas ir domāts ierīcēm, kurām nav tastatūras.
###length 4
-STR_CONFIG_SETTING_OSK_ACTIVATION_DISABLED :atspējota
+STR_CONFIG_SETTING_OSK_ACTIVATION_DISABLED :Atspējots
STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :dubultklikšķis
STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :viens klikšķis (kad fokusēta)
STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :viens klikšķis (nekavējoties)
@@ -1721,7 +1756,7 @@ STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS :Automātiski no
STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS_HELPTEXT :Automātiski noņemiet signālus dzelzceļa būvniecības laikā, ja signāli ir uz ceļa. Ņemiet vērā, ka tas var izraisīt vilcienu avārijas.
STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT :Ātrās pārsniegšanas ātruma ierobežojums: {STRING}
-STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_HELPTEXT :Ierobežojiet spēles ātrumu, kad ir iespējota ātrā spēles gaita. 0 = nav ierobežojumu (tik ātri, cik ļauj jūsu dators). Vērtības, kas zemākas par 100%, palēnina spēli. Augšējā robeža ir atkarīga no jūsu datora specifikācijas un var atšķirties atkarībā no spēles.
+STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_HELPTEXT :Ierobežojiet spēles ātrumu, kad ir ieslēgta ātrā spēles gaita. 0 = nav ierobežojumu (tik ātri, cik ļauj jūsu dators). Vērtības, kas zemākas par 100%, palēnina spēli. Augšējā robeža ir atkarīga no jūsu datora specifikācijas un var atšķirties atkarībā no spēles.
STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_VAL :{NUM}% standarta spēles ātrums
###setting-zero-is-special
STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_ZERO :Bez ierobežojumiem (tik ātri, cik ļauj jūsu dators)
@@ -1738,6 +1773,7 @@ STR_CONFIG_SETTING_SOUND_NEW_PERIOD :Perioda beigas:
###length 2
STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :Atskaņot skaņu gada beigās, apkopojot uzņēmuma darbības sasniegumus gada laikā salīdzinājumā ar iepriekšējo gadu
+STR_CONFIG_SETTING_SOUND_NEW_PERIOD_HELPTEXT :Atskaņojiet skaņu perioda beigās, apkopojot uzņēmuma darbību attiecīgajā periodā salīdzinājumā ar iepriekšējo periodu
STR_CONFIG_SETTING_SOUND_CONFIRM :Būvniecība: {STRING}
STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT :Atskaņot skaņu pēc sekmīgas būvēšanas vai citām darbībām
@@ -1798,7 +1834,7 @@ STR_CONFIG_SETTING_SERVINT_AIRCRAFT :Lidaparātu apk
STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :Izvēlēties jauniem lidaparātiem apkopju noklusējuma starplaiku, ja transportlīdzeklim tas nav noteikts
STR_CONFIG_SETTING_SERVINT_SHIPS :Kuģu apkopju noklusējuma starplaiks: {STRING}
STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :Izvēlēties jauniem kuģiem apkopju noklusējuma starplaiku, ja transportlīdzeklim tas nav noteikts
-STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}dien{P 0 a as u}/%
+STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}Dien{P 0 a as u}/Minūt{P 0 e es es}/%
###setting-zero-is-special
STR_CONFIG_SETTING_SERVINT_DISABLED :izslēgts
@@ -1890,7 +1926,7 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Velkot izvietot
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Iestatīt attālumus, kādos līdz nākamajam šķērslim (signālierīcei, dzelzceļa mezglam) uz ceļa tiks būvētas signālierīces, ja tās tiek vilktas
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} lauciņ{P 0 a a a}
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Velkot paturēt vienādu attālumu starp signālierīcēm: {STRING}
-STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Signālierīču izvietošanas uzvedības izvēle, kad to veic ar Ctrl+velkot. Ja izslēgts, signālierīces tiek novietotas pie tuneļiem un tiltiem, lai izvairītos no gariem posmiem bez signālierīcēm. Ja ieslēgts, signālierīces tiek izvietotas uz katra N lauciņa, atvieglojot to izkārtošanu uz paralēliem sliežu ceļiem
+STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Velkot signālus, izvēlaties izvietojuma opciju. Ja ieslēgts, signāli tiek novietoti ap tuneļiem vai tiltiem, lai izvairītos no gariem posmiem bez signāliem. Ja atslēgts, signāli tiek ievietoti ik pēc n elementiem, atvieglojot signālu izlīdzināšanu paralēlos sliežu ceļus
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Automātiski būvēt semaforus pirms: {STRING} gada
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Izvēlēties gadu, kad ceļiem sāks izmantot elektriskās signālierīces. Pirms šā gada tiks izmantotas neelektriskās signālierīces (kam ir tieši tāda pati funkcija, bet ar atšķirīgu izskatu)
@@ -1898,6 +1934,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Izvēlēties ga
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Braukt garām signālu veidiem: {STRING}
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Atlasiet, kādus signālu veidus izmantot, izmantojot Ctrl+noklikšķinot uz izveidotā signāla, izmantojot signāla rīku
###length 2
+STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Tikai pašreizējā grupa
STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Redzami visi
STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Rādīt signāla tipus: {STRING}
@@ -2030,6 +2067,8 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Vai lietotāja
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :impērijas, britu (jūdzes stundā)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :metriskās (km/h)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI, starptautiskās (m/s)
+STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_DAYS :Spēles vienības (rūtiņas/dienā)
+STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_SECS :Spēles vienības (rūtiņas/sek.)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_KNOTS :Mezgli
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Transportlīdzekļu jaudas mērvienības: {STRING}
@@ -2168,14 +2207,14 @@ STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Izvēlē
STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Izvēlēties 'subtropu klimata' ainavas stilu
STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Izvēlēties 'rotaļlietu zemes' ainavas stilu
-STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Rādīt spēles opcijas
-STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Rādīt sasniegumu tabulu
+STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Atvērt spēles opcijas
+STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Atvērt sasniegumu tabulu
STR_INTRO_TOOLTIP_HELP :{BLACK}Piekļūstiet dokumentācijai un tiešsaistes resursiem
-STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Displeja iestatījumi
-STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Rādīt NewGRF iestatījumus
+STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Atvērt iestatījumus
+STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Atvērt NewGRF iestatījumus
STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Pārbaudīt vai lejupielādei nav pieejams jauns un atjaunināts saturs
-STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Parādīt AI iestatījumus
-STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Displeja spēles skripta iestatījumi
+STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Atvērt AI iestatījumus
+STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Atvērt spēles skripta iestatījumi
STR_INTRO_TOOLTIP_QUIT :{BLACK}Iziet no 'OpenTTD'
STR_INTRO_BASESET :{BLACK}Pašlaik izvēlētajai bāzes grafikas kopai trūkst {NUM} sprait{P s i u}. Lūdzu, pārbaudiet, vai bāzes kopai ir atjauninājumi.
@@ -2206,7 +2245,7 @@ STR_HELP_WINDOW_BUGTRACKER :{BLACK}Ziņot p
STR_HELP_WINDOW_COMMUNITY :{BLACK}Kopiena
# Cheat window
-STR_CHEATS :{WHITE}Blēdības
+STR_CHEATS :{WHITE}Smilškastes Opcijas
STR_CHEAT_MONEY :{LTBLUE}Palielināt naudas līdzekļus par {CURRENCY_LONG}
STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Spēlēt kā uzņēmumam: {ORANGE}{COMMA}
STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Burvju buldozers (nojauc ražotnes, nepārvietojamus objektus): {ORANGE}{STRING}
@@ -2231,7 +2270,7 @@ STR_LIVERY_TRAIN_GROUP_TOOLTIP :{BLACK}Rādīt
STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP :{BLACK}Rādīt autotransporta grupu krāsas
STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Rādīt kuģu grupu krāsas
STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP :{BLACK}Rādīt lidaparātu grupu krāsas
-STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Izvēlēties galveno identitātes krāsu atlasītajai shēmai. Ctrl+klikšķis iestatīs šo krāsu katrai shēmai
+STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Izvēlieties primāro krāsu atlasītajai shēmai. Ctrl+klikšķis, lai iestatītu šo krāsu katrai shēmai
STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Izvēlēties papildu identitātes krāsu atlasītajai shēmai. Ctrl+klikšķis iestatīs šo krāsu katrai shēmai
STR_LIVERY_PANEL_TOOLTIP :{BLACK}Izvēlēties kuru identitātes krāsu shēmu mainīt, vai vairākas ar Ctrl+klikšķi. Klikšķināt uz rūtiņas, lai pārslēgtu shēmas izmantošanu
STR_LIVERY_TRAIN_GROUP_EMPTY :Vilcienu grupas nav izveidotas
@@ -2343,6 +2382,9 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Kartes i
STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Spēles kartes izmērs{}Klikšķināt, lai šķirotu laukumos
STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Datums
STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Šībrīža datums
+STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}h {NUM}m
+STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION :{BLACK}Spēles laiks
+STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP :{BLACK}Spēles laiks, kamēr{} spēle netika apturēta
STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Valoda, servera versija utt.
STR_NETWORK_SERVER_LIST_CLICK_GAME_TO_SELECT :{BLACK}Klikšķināt sarakstā uz spēles, lai to izvēlētos
@@ -2717,6 +2759,7 @@ STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLA
STR_LINKGRAPH_STATS_TOOLTIP_MONTH :{BLACK}{CARGO_LONG}, kas jāpārvadā mēnesī no {STATION} uz {STATION} ({COMMA}% no jaudas){STRING}
STR_LINKGRAPH_STATS_TOOLTIP_MINUTE :{BLACK}{CARGO_LONG}, kas jāpārvadā minūtē no {STATION} uz {STATION} ({COMMA}% no jaudas){STRING}
STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} jātransportē atpakaļ ({COMMA}% no pārvadājuma)
+STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Vidējais braucina laiks: {UNITS_DAYS_OR_SECONDS}
# Base for station construction window(s)
STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Pārklājuma iezīmēšana
@@ -2745,16 +2788,16 @@ STR_RAIL_TOOLBAR_ELRAIL_CONSTRUCTION_CAPTION :Elektrificētā
STR_RAIL_TOOLBAR_MONORAIL_CONSTRUCTION_CAPTION :Viensliedes būvniecība
STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Magleva būvēšana
-STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Būvēt sliedes. Ctrl pārslēdz sliežu būvniecību/nojaukšanu. Shift pārslēdz būve/rādīt izmaksu tāmi
-STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Būvēt dzelzceļu, izmantojot automātisko sliežu režīmu. Ctrl pārslēdz sliežu būvniecību/demolēšanu
-STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Būvēt vilcienu depo (vilcienu pirkšanai un apkopei). Shift pārslēdz būvi/rādīt izmaksu tāmi
-STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Izveidojiet ceļa punktu uz dzelzceļa. Ctrl ļauj pievienot vairākus pieturas punktus. Shift rāda izmaksu tāmi
-STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Būvēt dzelzceļa staciju. Ctrl iespējo staciju apvienošanu. Shift pārslēdz būve/rādīt izmaksu tāmi
-STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Būvēt signālu uz dzelzceļa. Ctrl pārslēdz semaforu/gaismas signālus{}Velkot, signāli tiek veidoti taisnā sliedes posmā. Ctrl veido signālus līdz nākamajam krustojumam vai signālam{}Ctrl+Click pārslēdz signāla atlases loga atvēršanu. Shift rāda izmaksu tāmi
+STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Būvēt sliedes. Ctrl pārslēdz sliežu būvniecību/nojaukšanu. Shift parāda novērtētās izmaksas, neveicot būvēšanu
+STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Būvēt dzelzceļu, izmantojot automātisko sliežu režīmu. Ctrl+klikšķis pārslēdz sliežu būvniecību/demolēšanu. Shift parāda novērtētās izmaksas, neveicot būvēšanu
+STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Būvēt vilcienu depo (vilcienu pirkšanai un apkopei). Shift parāda novērtētās izmaksas, neveicot būvēšanu
+STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Izveidojiet ceļa punktu uz dzelzceļa. Ctrl ļauj pievienot vairākus pieturas punktus. Shift parāda novērtētās izmaksas, neveicot būvēšanu
+STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Būvēt dzelzceļa staciju. Ctrl+klikšķis iespējo staciju apvienošanu. Shift parāda izmaksas, neveicot būvēšanu
+STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Būvēt dzelzceļa signālu. Ctrl+klikšķis, lai izveidotu alternatīvu signāla stilu{} Velciet lai aizpildītu signālus līdz nākamajam krustojumam, stacijai vai signālam. Shiftparāda izmaksas, neveicot iegādi
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Būvēt dzelzceļa tiltu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu
-STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Būvēt dzelzceļa tuneli. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu
-STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Pārslēgties starp sliežu, signālierīču, pieturas punktu būvēšanu/noņemšanu. Aizturēt Ctrl, lai noņemtu arī sliedes no pieturas punktiem un stacijām
-STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Pārveidot/uzlabot sliežu veidu. Shift pārslēdz būvēšanu/izmaksu novērtējumu rādīšanu
+STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Būvēt dzelzceļa tuneli. Shift parāda izmaksas, neveicot būvēšanu
+STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Pārslēgties starp sliežu, signālierīču, pieturas punktu būvēšanu/noņemšanu. Aizturēt Ctrl+klikšķis, lai noņemtu arī sliedes no pieturas punktiem un stacijām
+STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Pārveidot/uzlabot sliežu veidu. Shift parāda novērtētās izmaksas, neveicot iegādi
STR_RAIL_NAME_RAILROAD :Dzelzceļš
STR_RAIL_NAME_ELRAIL :Elektrificēts dzelzceļš
@@ -2830,25 +2873,25 @@ STR_BRIDGE_TUBULAR_SILICON :Cauruļveida, s
# Road construction toolbar
STR_ROAD_TOOLBAR_ROAD_CONSTRUCTION_CAPTION :{WHITE}Ceļu būvniecība
STR_ROAD_TOOLBAR_TRAM_CONSTRUCTION_CAPTION :{WHITE}Tramvaju sliežu ceļu būvniecība
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Ceļu būves izvēle. Ctrl pārslēdz ceļa būvešanu/nojaukšanu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Tramvaju sliežu būves izvēle. Ctrl pārslēdz tramvaju sliežu būvešanu/nojaukšanu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Būvēt ceļu izmantojot automātiskā ceļa paņēmienu. Ctrl pārslēdz ceļu būvēšanu/nojaukšanu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Būvēt tramvaju sliedes izmantojot automātisko paņēmienu. Ctrl pārslēdz tramvaju sliežu būvēšanu/nojaukšanu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Ceļu būves izvēle. Ctrl+klikšķis pārslēdz ceļa būvešanu/nojaukšanu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Būvēt tramvaja posmu. Ctrl+klikšķis, lai noņemtu tramvaja posmu. Shift parāda novērtētās izmaksas, neveicot būvēšanu
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Būvēt ceļu izmantojot automātiskā ceļa paņēmienu. Ctrl+klikšķis pārslēdz ceļu būvēšanu/nojaukšanu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Būvēt tramvaju sliedes izmantojot automātisko paņēmienu. Ctrl+klikšķis pārslēdz tramvaju sliežu būvēšanu/nojaukšanu. Shift parāda novērtētās izmaksas, neveicot būvēšanu
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Būvēt autotransporta depo (autotransporta līdzekļu pirkšanai un apkopei). Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Būvēt tramvaju depo (tramvaju pirkšanai un apkopei). Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Būvēt autobusu pieturvietu. Ctrl ieslēdz pieturvietu apvienošanu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Būvēt pasažieru tramvaju pieturvietu. Ctrl ieslēdz pieturvietu apvienošanu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Uzbūvēt kravas automašīnu staciju. Ctrl ļauj buvēt stacijas. Shift rāda izmaksu tāmi
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Būvēt kravas tramvaju pieturvietu. Ctrl ieslēdz pieturvietu apvienošanu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Būvēt tramvaju depo (tramvaju pirkšanai un apkopei). Shift parāda izmaksas, neveicot būvēšanu
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Būvēt autobusu pieturvietu. Ctrl+klikšķis ieslēdz pieturvietu apvienošanu. Shift+klikšķis parāda izmaksas, neveicot būvēšanu
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Būvēt pasažieru tramvaju staciju. Ctrl+klikšķis, lai atlasītu citu staciju, kurai pievienoties. Nospiediet taustiņu Shift, lai rādītu izmaksu tāmi
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Būvēt kravas automašīnu staciju. Ctrl+klikšķis iespējo staciju apvienošanu. Shift parāda izmaksas, neveicot būvēšanu
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Būvēt kravas tramvaju pieturvietu. Ctrl+klikšķis ieslēdz pieturvietu apvienošanu. Shift parāda novērtētās izmaksas, neveicot būvēšanu
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Ieslēgt/izslēgt vienvirziena ceļus
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Būvēt ceļa tiltu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Būvēt tramvaju tiltu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Būvēt ceļa tuneli. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Būvēt tramvaju tuneli. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Būvēt ceļa tiltu. Nospiediet taustiņu Shift, lai rādītu tikai izmaksu tāmi
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Būvē tramvaja tiltu. Nospiediet taustiņu Shift, lai rādītu tikai izmaksu tāmi
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Būvēt ceļa tuneli. Shift parāda novērtētās izmaksas, neveicot būvēšanu
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Būvēt tramvaju tuneli. Shift parāda novērtētās izmaksas, neveicot būvēšanu
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Pārslēgties starp ceļa būvēšanas/nojaukšanas režīmiem
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Pārslēgt būvēt/novākt tramvaju būvei
-STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Pārveidot/uzlabot ceļa veidu. Shift pārslēdz būvēšanu/izmaksu novērtējumu rādīšanu
-STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Pārveidot/uzlabot tramvaju veidu. Shift pārslēdz būvēšanu/izmaksu novērtējumu rādīšanu
+STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Pārveidot/uzlabot ceļa veidu. Shift parāda izmaksas, neveicot uzlabojumu
+STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Pārveidot/uzlabot tramvaju veidu. Shift parāda izmaksas, neveicot uzlabošanu
STR_ROAD_NAME_ROAD :Ceļš
STR_ROAD_NAME_TRAM :Tramvaja ceļš
@@ -2872,14 +2915,14 @@ STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Izvēlē
# Waterways toolbar (last two for SE only)
STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Ūdensceļu būvniecība
STR_WATERWAYS_TOOLBAR_CAPTION_SE :{WHITE}Ūdensceļi
-STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Būvēt kanālus. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu
-STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Būvēt slūžas. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu
-STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Būvēt kuģu depo (kuģu būvēšanai un apkopei). Shift pārslēdz būvēšanu/izmaksu novērtējuma rādīšanu
-STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Būvēt kuģu piestātni. Ctrl ieslēdz staciju apvienošanu. Shift pārslēdz būvēšanu/izmaksu novērtējuma rādīšanu
-STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Izvietot boju, kura var kalpot kā pieturas punkts. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu
-STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Būvēt akveduktu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu
-STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Norādīt ūdens laukumu.{}Būvēt kanālu. Ja tur nospiestu Ctrl jūras līmenī, tad appludinās apkārtni
-STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Pievienot updes. Ctrl pievieno apgabalu diagonāli
+STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Būvēt kanālus. Shift parāda izmaksas, neveicot būvēšanu
+STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Būvēt slūžas. Shift parāda novērtētās izmaksas, neveicot būvēšanu
+STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Būvēt kuģu depo (kuģu būvēšanai un apkopei). Shift parāda novērtētās izmaksas, neveicot būvēšanu
+STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Būvēt kuģu piestātni. Ctrl+klikšķis ieslēdz staciju apvienošanu. Shift pārslēdz būvēšanu/izmaksu novērtējuma rādīšanu
+STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Izvietot boju, kura var kalpot kā pieturas punkts. Shift parāda novērtētās izmaksas, neveicot izvietojumu
+STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Būvēt akveduktu. Shift parāda novērtētās izmaksas, neveicot buvēšanu
+STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Būvēt kanālu. Ctrl+klikšķis jūras līmenī, lai tā vietā appludinātu ar jūras ūdeni
+STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Izveidot upes. Ctrl+klikšķis, lai veidotu pa diagonāli
# Ship depot construction window
STR_DEPOT_BUILD_SHIP_CAPTION :{WHITE}Kuģu depo virziens
@@ -2890,7 +2933,7 @@ STR_STATION_BUILD_DOCK_CAPTION :{WHITE}Piestāt
# Airport toolbar
STR_TOOLBAR_AIRCRAFT_CAPTION :{WHITE}Lidostas
-STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP :{BLACK}Būvēt lidostu. Ctrl ieslēdz staciju apvienošanu. Shift pārslēdz būvēšanu/izmaksu novērtējuma rādīšanu
+STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP :{BLACK}Būvēt lidostu. Ctrl+klikšķis ieslēdz staciju apvienošanu. Shift parāda izmaksas, neveicot būvēšanu
# Airport construction window
STR_STATION_BUILD_AIRPORT_CAPTION :{WHITE}Lidostas izvēle
@@ -2917,14 +2960,14 @@ STR_STATION_BUILD_NOISE :{BLACK}Radītai
# Landscaping toolbar
STR_LANDSCAPING_TOOLBAR :{WHITE}Ainavas veidošana
-STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Pazemināt zemes stūri. Vilkšana pazemina pirmo izvēlēto stūri un nolīdzina izvēlēto laukumu uz stūra jauno augstumu. Ctrl iezīmē laukumu diagonāli. Shift pārslēdz būvēšanu/izmaksu novērtējuma rādīšanu
-STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Pacelt zemes stūri. Vilkšana paceļ pirmo izvēlēto stūri un nolīdzina izvēlēto laukumu uz stūra jauno augstumu. Ctrl iezīmē laukumu diagonāli. Shift pārslēdz būvēšanu/izmaksu novērtējuma rādīšanu
-STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Izlīdzināt zemes laukumu pirmā izvēlētā stūra augstumā. Ctrl iezīmē laukumu diagonāli. Shift pārslēdz būvēšanu/izmaksu novērtējuma rādīšanu
-STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Iegādājieties zemi turpmākai lietošanai. Ctrl atlasa apgabalu pa diagonāli. Shift pārslēdz ēku/rāda izmaksu tāmi
+STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Pazemināt zemes stūri. Vilkšana pazemina pirmo izvēlēto stūri un nolīdzina izvēlēto laukumu uz stūra jauno augstumu. Velkot Ctrl+klikšķis iezīmē laukumu diagonāli. Shift parāda izmaksas, neveicot iegādi
+STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Pacelt zemes stūri. Vilkšana paceļ pirmo izvēlēto stūri un nolīdzina izvēlēto laukumu uz stūra jauno augstumu. Ctrl iezīmē laukumu diagonāli. Shift parāda izmaksas, neveicot iegādi
+STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Izlīdzināt zemes laukumu pirmā izvēlētā stūra augstumā. Ctrl iezīmē laukumu diagonāli. Shift parāda izmaksas, neveicot iegādi
+STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Iegādājieties zemi turpmākai lietošanai. Velkot Ctrl+klikšķis atlasa apgabalu pa diagonāli. Shift parāda izmaksas, neveicot iegādi
# Object construction window
STR_OBJECT_BUILD_CAPTION :{WHITE}Objektu izvēle
-STR_OBJECT_BUILD_TOOLTIP :{BLACK}Izvēlēlaties buvējamo objektu. Ctrl atlasa apgabalu pa diagonāli. Shift pārslēdz ēku/rāda izmaksu tāmi
+STR_OBJECT_BUILD_TOOLTIP :{BLACK}Izvēlēlaties buvējamo objektu. Ctrl atlasa apgabalu pa diagonāli. Shift parāda novērtētās izmaksas, neveicot būvēšanu
STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Izvēlēties būvējamā objekta klasi
STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Objekta priekšskatījums
STR_OBJECT_BUILD_SIZE :{BLACK}Izmērs: {GOLD}{NUM} x {NUM} lauciņi
@@ -2936,7 +2979,7 @@ STR_OBJECT_CLASS_TRNS :Raidītāji
STR_PLANT_TREE_CAPTION :{WHITE}Koki
STR_PLANT_TREE_TOOLTIP :{BLACK}Izvēlēties koka veidu stādīšanai. Ja lauciņš jau ir koks, tas pievienos vairāk jauktu veidu kokus neatkarīgi no izvēlētā veida
STR_TREES_RANDOM_TYPE :{BLACK}Nejauši izvēlēta veida koki
-STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Novietojiet jaukta veida kokus. Ctrl atlasa apgabalu pa diagonāli. Shift pārslēdz celtniecību/rāda izmaksas
+STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Novietojiet jaukta veida kokus. Velkot Ctrl+klikšķis atlasa apgabalu pa diagonāli. Shift parāda izmaksas, neveicot iegādi
STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Nejauši koki
STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Stādīt nejaušus kokus visā ainavā
STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Normāls
@@ -2949,7 +2992,7 @@ STR_TREES_MODE_FOREST_LG_TOOLTIP :{BLACK}Stādiet
# Land generation window (SE)
STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Zemes radīšana
STR_TERRAFORM_TOOLTIP_PLACE_ROCKY_AREAS_ON_LANDSCAPE :{BLACK}Ainavā novietot akmeņainus apvidus
-STR_TERRAFORM_TOOLTIP_DEFINE_DESERT_AREA :{BLACK}Norādīt tuksneša laukumu.{}Turēt nospiestu Ctrl, lai to noņemtu
+STR_TERRAFORM_TOOLTIP_DEFINE_DESERT_AREA :{BLACK}Norādīt tuksneša laukumu.{}Turēt nospiestu Ctrl+klikšķis, lai to noņemtu
STR_TERRAFORM_TOOLTIP_INCREASE_SIZE_OF_LAND_AREA :{BLACK}Palielināt zemes apgabalu pazemināšanai/paaugstināšanai
STR_TERRAFORM_TOOLTIP_DECREASE_SIZE_OF_LAND_AREA :{BLACK}Samazināt zemes apgabalu pazemināšanai/paaugstināšanai
STR_TERRAFORM_TOOLTIP_GENERATE_RANDOM_LAND :{BLACK}Radīt nejaušu zemi
@@ -2963,7 +3006,7 @@ STR_RESET_LANDSCAPE_CONFIRMATION_TEXT :{WHITE}Vai tie
# Town generation window (SE)
STR_FOUND_TOWN_CAPTION :{WHITE}Pilsētu radīšana
STR_FOUND_TOWN_NEW_TOWN_BUTTON :{BLACK}Jauna pilsēta
-STR_FOUND_TOWN_NEW_TOWN_TOOLTIP :{BLACK}Dibināt jaunu pilsētu. Shift+klikšķis rāda tikai izmaksu tāmi
+STR_FOUND_TOWN_NEW_TOWN_TOOLTIP :{BLACK}Dibināt jaunu pilsētu. Shift parāda izmaksas, neveicot dibināšanu
STR_FOUND_TOWN_RANDOM_TOWN_BUTTON :{BLACK}Nejauša pilsēta
STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP :{BLACK}Dibināt pilsētu nejaušā vietā
STR_FOUND_TOWN_MANY_RANDOM_TOWNS :{BLACK}Daudz nejauši izveidotu pilsētu
@@ -3029,7 +3072,7 @@ STR_INDUSTRY_CARGOES_SELECT_INDUSTRY_TOOLTIP :{BLACK}Izvēlē
# Land area window
STR_LAND_AREA_INFORMATION_CAPTION :{WHITE}Zemes platības informācija
-STR_LAND_AREA_INFORMATION_LOCATION_TOOLTIP :{BLACK} Centrējiet galveno skatu uz lauciņa atrašanās vietu. Ctrl + klikšķis atver jaunu skatu logu lauciņa atrašanās vietā
+STR_LAND_AREA_INFORMATION_LOCATION_TOOLTIP :{BLACK} Centrējiet galveno skatu uz lauciņa atrašanās vietu. Ctrl+klikšķis atvērs skatu uz lauciņu jaunā skatlaukā
STR_LAND_AREA_INFORMATION_COST_TO_CLEAR_N_A :{BLACK}Notīrīšanas izmaksa: {LTBLUE}nav zināma
STR_LAND_AREA_INFORMATION_COST_TO_CLEAR :{BLACK}Notīrīšanas izmaksa: {RED}{CURRENCY_LONG}
STR_LAND_AREA_INFORMATION_REVENUE_WHEN_CLEARED :{BLACK}Ieņēmumi pēc notīrīšanas: {LTBLUE}{CURRENCY_LONG}
@@ -3042,7 +3085,7 @@ STR_LAND_AREA_INFORMATION_RAIL_OWNER.kas :{BLACK}Dzelzce
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Pašvaldība: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Neviena
STR_LAND_AREA_INFORMATION_LANDINFO_COORDS :{BLACK}Koordinātes: {LTBLUE}{NUM} x {NUM} x {NUM} ({STRING})
-STR_LAND_AREA_INFORMATION_BUILD_DATE :{BLACK}Uzbūvēts: {LTBLUE}{DATE_LONG}
+STR_LAND_AREA_INFORMATION_BUILD_DATE :{BLACK}Buvēts/atjaunots: {LTBLUE}{DATE_LONG}
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Stacijas klase: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Stacijas tips: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_AIRPORT_CLASS :{BLACK}Lidostas klase: {LTBLUE}{STRING}
@@ -3277,11 +3320,11 @@ STR_MAPGEN_VARIETY :{BLACK}Dažād
STR_MAPGEN_GENERATE :{WHITE}Radīt
STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Izveidojiet pasauli un spēlējiet OpenTTD!
STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF Iestatījumi
-STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Rādīt NewGRF iestatījumus
+STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Atvērt NewGRF iestatījumus
STR_MAPGEN_AI_SETTINGS :{BLACK}AI iestatījumi
-STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Parādīt AI iestatījumus
+STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Atvērt AI iestatījumus
STR_MAPGEN_GS_SETTINGS :{BLACK}Spēles skripta iestatījumi
-STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Rādīt spēles skripta iestatījumus
+STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Atvērt spēles skripta iestatījumus
###length 21
STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Angļu (sākotnējie)
@@ -3559,7 +3602,7 @@ STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Pārslē
# Sign window
STR_EDIT_SIGN_CAPTION :{WHITE}Labot zīmi
-STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Centrējiet norādes atrašanās vietas galveno skatu. Ctrl + klikšķis atver jaunu skata zīmi uz zīmes atrašanās vietas
+STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Centrējiet norādes atrašanās vietas galveno skatu. Ctrl+klikšķis atver jaunu skata zīmi uz zīmes atrašanās vietas
STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Doties uz nākamo zīmi
STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Doties uz iepriekšējo zīmi
@@ -3571,7 +3614,7 @@ STR_TOWN_DIRECTORY_NONE :{G=m}{ORANGE}-
STR_TOWN_DIRECTORY_NONE.kas :{ORANGE}- Neviena -
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA})
STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Pilsēta){BLACK} ({COMMA})
-STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Pilsētu nosaukumi - klikšķināt uz nosaukuma, lai centrētu skatu uz to. Ctrl+klikšķis atvērs jaunu skatu lauku uz pilsētu
+STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Pilsētu nosaukumi - klikšķināt uz nosaukuma, lai centrētu skatu uz to.Ctrl+klikšķis atvērs skatu uz pilsētu jaunā skatlaukā
STR_TOWN_POPULATION :{BLACK}Pasaules iedzīvotāju skaits: {COMMA}
# Town view window
@@ -3586,6 +3629,8 @@ STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{ORANGE}{STRING}{GREEN} piegādāts
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{RED} (joprojām pieprasīts)
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{GREEN} (piegādāts)
+STR_TOWN_VIEW_TOWN_GROWS_EVERY :{BLACK}Pilsēta attīstās ik pēc {ORANGE}{UNITS_DAYS_OR_SECONDS}
+STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}Pilsēta attīstās ik pēc {ORANGE}{UNITS_DAYS_OR_SECONDS} (finansēts)
STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}Pilsēta {RED}neattīstās{BLACK}
STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Trokšņu ierobežojums pilsētā: {ORANGE}{COMMA}{BLACK} maks.: {ORANGE}{COMMA}
STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Centrēt galveno skatu uz pilsētu. Ctrl+klikšķis atvērs skatu uz pilsētu jaunā skatlaukā
@@ -3625,8 +3670,11 @@ STR_LOCAL_AUTHORITY_ACTION_BRIBE :Dot kukuli paš
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Sāciet nelielu vietējo reklāmas kampaņu, lai piesaistītu vairāk pasažieru un kravas saviem transporta pakalpojumiem.{}Nodrošina īslaicīgu staciju vērtējuma palielinājumu nelielā rādiusā ap pilsētas centru.{}{POP_COLOUR}Izmaksas: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Veiciet vidējo reklāmas kampaņu lai palielinātu pasažieru un kravu parvadājumu savās stacijās.{}Tas īslaicīgi palielinās to staciju vērtējumu, kuras atrodas netālu no pilsētas centra.{}{POP_COLOUR}Izmaksas: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Sāciet lielu vietējo reklāmas kampaņu lai piesaistītu vairāk pasažieru un kravas saviem transporta pakalpojumiem.{}Nodrošina īslaicīgu staciju vērtējuma palielinājumu lielā rādiusā ap pilsētas centru.{}{POP_COLOUR}Izmaksas: {CURRENCY_LONG}
+STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MONTHS :{PUSH_COLOUR}{YELLOW}Finansējiet pilsētas ceļu tīkla rekonstrukciju.{}Izraisa ievērojamus ceļu satiksmes traucējumus līdz pat 6 mēnešiem.{}{POP_COLOUR}Izmaksas: {CURRENCY_LONG}
+STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MINUTES :{PUSH_COLOUR}{YELLOW}Finansējiet pilsētas ceļu tīkla rekonstrukciju.{}Izraisa ievērojamus ceļu satiksmes traucējumus līdz pat 6 minūtēm.{}{POP_COLOUR}Izmaksas: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Uzceliet statuju par godu savam uzņēmumam.{}Nodrošina pastāvīgu staciju vērtējuma palielinājumu šajā pilsētā.{}{POP_COLOUR}Izmaksas: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Finansējiet jaunu ēku celtniecību pilsētā.{}Nodrošina īslaicīgu stimulu pilsētas izaugsmei šajā pilsētā.{}{POP_COLOUR}Izmaksas: {CURRENCY_LONG}
+STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MONTHS :{PUSH_COLOUR}{YELLOW}Iegādājieties ekskluzīvas transporta tiesības pilsētā uz 12 mēnešiem.{}Pašvaldība neļaus pasažieriem un kravai izmantot jūsu konkurentu stacijas. Veiksmīgs kukulis no konkurenta atcels šo līgumu.{}{POP_COLOUR}Izmaksas: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MINUTES :{PUSH_COLOUR}{YELLOW}Iegādājieties ekskluzīvas transporta tiesības pilsētā uz 12 minūtēm.{}Pilsētas pārvalde neļaus pasažieriem un kravai izmantot jūsu konkurentu stacijas. Veiksmīgs kukulis no konkurenta atcels šo līgumu.{}{POP_COLOUR}Izmaksas: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Piekukuļot vietējo pašvaldību, lai paaugstinātu savu vērtējumu un atceltu konkurenta ekskluzīvās transporta tiesības, riskējot ar bargu sodu, ja tiksiet pieķerts.{}{POP_COLOUR}Izmaksas: {CURRENCY_LONG}
@@ -3676,11 +3724,14 @@ STR_GOAL_QUESTION_BUTTON_CLOSE :Aizvērt
# Subsidies window
STR_SUBSIDIES_CAPTION :{WHITE}Subsīdijas
STR_SUBSIDIES_OFFERED_TITLE :{BLACK}Piedāvājumā esošās subsīdijas par pakalpojumu nodrošināšanu:
+STR_SUBSIDIES_OFFERED_FROM_TO :{ORANGE}{STRING} no {STRING} līdz {STRING}{YELLOW} ({STRING})
STR_SUBSIDIES_NONE :{ORANGE}- Neviens -
STR_SUBSIDIES_SUBSIDISED_TITLE :{BLACK}Pašlaik subsidētie pakalpojumi:
-STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klikšķināt uz servisa, lai iecentrētu skatu uz rūpnīcu/pilsētu. Ctrl+klikšķis atvērs jaunu skatu lauku uz pilsētu/rūpnīcu
+STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING} no {STRING} līdz {STRING}{YELLOW} ({COMPANY}{YELLOW}, {STRING})
+STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klikšķināt uz servisa, lai iecentrētu skatu uz rūpnīcu/pilsētu. Ctrl+klikšķis atvērs skatu uz pilsētu jaunā skatlaukā
STR_SUBSIDIES_OFFERED_EXPIRY_DATE :līdz {DATE_SHORT}
STR_SUBSIDIES_OFFERED_EXPIRY_TIME :{UNITS_MONTHS_OR_MINUTES} laikā
+STR_SUBSIDIES_SUBSIDISED_EXPIRY_DATE :līdz {DATE_SHORT}
STR_SUBSIDIES_SUBSIDISED_EXPIRY_TIME :{UNITS_MONTHS_OR_MINUTES} atlikušais kalpošanas laiks
# Story book window
@@ -3697,8 +3748,8 @@ STR_STORY_BOOK_NEXT_PAGE_TOOLTIP :{BLACK}Doties u
STR_STORY_BOOK_INVALID_GOAL_REF :{RED}Mērķa norāde ir nederīga
# Station list window
-STR_STATION_LIST_TOOLTIP :{BLACK}Staciju nosaukumi - klikšķināt uz nosaukuma, lai centrētu galveno skatu uz staciju. Ctrl+klikšķis atvērs jaunu skatvietu pie stacijas
-STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE :{BLACK}Aizturēt Ctrl, lai izvēlētos vairākus
+STR_STATION_LIST_TOOLTIP :{BLACK}Staciju nosaukumi - klišķināt uz nosaukuma, lai centrētu galveno skatu uz staciju. Ctrl+klikšķis atvērs skatu uz stacijas atrašanos jaunā skatlaukā
+STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE :{BLACK}Ctrl+klikšķis, atlasa vairākus vienumus
STR_STATION_LIST_CAPTION :{WHITE}{COMPANY} - {COMMA} stacij{P a as u}
STR_STATION_LIST_STATION :{YELLOW}{STATION} {STATION_FEATURES}
STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOINT}
@@ -3851,7 +3902,7 @@ STR_COMPANY_VIEW_BUILD_HQ_TOOLTIP :{BLACK}Būvēt
STR_COMPANY_VIEW_VIEW_HQ_BUTTON :{BLACK}Skatīt biroju
STR_COMPANY_VIEW_VIEW_HQ_TOOLTIP :{BLACK}Rādīt uzņēmuma vadības ēku
STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Pārvietot biroju
-STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Pārcelt uzņēmuma centrālo biroju uz citu vietu samaksājot 1% no uzņēmuma vērtības. Shift+klikšķis parāda izmaksu novērtējumu, nemainot biroja atrašanās vietu
+STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Pārcelt uzņēmuma centrālo biroju uz citu vietu samaksājot 1% no uzņēmuma vērtības. Shift parāda izmaksas, neveicot pārcelšanu
STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}Sīkāk
STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Skatīt detalizētāku infrastruktūras uzskaiti
STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :{BLACK}Iedot naudu
@@ -3908,6 +3959,7 @@ STR_INDUSTRY_DIRECTORY_FILTER_NONE :Nav
# Industry view
STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY}
STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Iepriekšējā mēnesī saražots:
+STR_INDUSTRY_VIEW_PRODUCTION_LAST_MINUTE_TITLE :{BLACK}Ražošanas pēdējā minūtē:
STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} (pārvadāti {COMMA}%)
STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Centrēt galveno skatu uz ražotni. Ctrl+klikšķis atvērs skatu uz ražotni jaunā skatlaukā
STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Ražošanas līmenis: {YELLOW}{COMMA}%
@@ -3949,6 +4001,7 @@ STR_VEHICLE_LIST_REPLACE_VEHICLES :Nomainīt trans
STR_VEHICLE_LIST_SEND_FOR_SERVICING :Sūtīt uz apkopi
STR_VEHICLE_LIST_CREATE_GROUP :Izveidot grupu
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Peļņa šogad: {CURRENCY_LONG} (pērn: {CURRENCY_LONG})
+STR_VEHICLE_LIST_PROFIT_THIS_PERIOD_LAST_PERIOD :{TINY_FONT}{BLACK}Peļņa šajā periodā: {CURRENCY_LONG} (pēdējais periods: {CURRENCY_LONG})
STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}]
STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING}
@@ -4024,6 +4077,7 @@ STR_PURCHASE_INFO_SPEED :{BLACK}Ātrums:
STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}Ātrums okeānā: {GOLD}{VELOCITY}
STR_PURCHASE_INFO_SPEED_CANAL :{BLACK}Ātrums kanālā/upē: {GOLD}{VELOCITY}
STR_PURCHASE_INFO_RUNNINGCOST_YEAR :{BLACK}Darbības izmaksas: {GOLD}{CURRENCY_LONG}/gadā
+STR_PURCHASE_INFO_RUNNINGCOST_PERIOD :{BLACK}Darbības izmaksas: {GOLD}{CURRENCY_LONG}/periodā
STR_PURCHASE_INFO_CAPACITY :{BLACK}Ietilpība: {GOLD}{CARGO_LONG} {STRING}
STR_PURCHASE_INFO_REFITTABLE :(pielāgojams)
STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Projektēts: {GOLD}{NUM}{BLACK} Kalpošanas laiks: {GOLD}{COMMA} gad{P s i u}
@@ -4050,10 +4104,10 @@ STR_CARGO_TYPE_FILTER_FREIGHT :Krava
STR_CARGO_TYPE_FILTER_NONE :Nav
###length VEHICLE_TYPES
-STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Vilciena vagonu atlasīšanas saraksts - klikšķināt uz transportlīdzekļa, lai iegūtu informāciju
-STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Autotransporta atlasīšanas saraksts - klikšķināt uz transportlīdzekļa, lai iegūtu informāciju
-STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Kuģu atlasīšanas saraksts - klikšķināt uz transportlīdzekļa, lai iegūtu informāciju
-STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lidaparātu atlasīšanas saraksts - klikšķināt uz transportlīdzekļa, lai iegūtu informāciju
+STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Vilciena vagonu atlasīšanas saraksts - klikšķināt uz transportlīdzekļa, lai iegūtu informāciju. Ctrl+klikškis, lai parādītu/paslēptu šo vagona veidu
+STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Autotransporta atlasīšanas saraksts - klikšķināt uz transportlīdzekļa, lai iegūtu informāciju. trl+klikškis, lai parādītu/paslēptu šo autotransporta veidu
+STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Kuģu atlasīšanas saraksts - klikšķināt uz transportlīdzekļa, lai iegūtu informāciju. Ctrl+klikškis, lai parādītu/paslēptu šo kuģa veidu
+STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lidaparātu atlasīšanas saraksts - klikšķināt uz transportlīdzekļa, lai iegūtu informāciju. Ctrl+klikškis, lai parādītu/paslēptu šo lidaparātu veidu
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_BUTTON :{BLACK}Pirkt transportlīdzekli
@@ -4068,14 +4122,14 @@ STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Pirkt un
STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Pirkt un pielāgot lidaparātu
###length VEHICLE_TYPES
-STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Pirkt atzīmēto vilciena vagonu. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu
-STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Pirkt atzīmēto transportlīdzekli. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu
-STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Pirkt atzīmēto kuģi. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu
-STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Pirkt izvēlēto lidaparātu. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu
+STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Pirkt atzīmēto vilciena vagonu. Shift rāda izmaksu novērtējumu, neveicot pirkumu
+STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Pirkt atzīmēto transportlīdzekli. Shift rāda izmaksu novērtējumu, neveicot pirkumu
+STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Pirkt atzīmēto kuģi. Shift rāda izmaksu novērtējumu, neveicot pirkumu
+STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Pirkt izcelto lidmašīnu. Nospiediet taustiņu Shift, lai rādītu izmaksu tāmi
###length VEHICLE_TYPES
-STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Pirkt un pielāgot izcelto vilcienu. Shift+klikšķis parāda novērtētās izmaksas, neveicot iegādi
-STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Pirkt un pielāgot izcelto ceļa transportlīdzekli. Shift+klikšķis parāda novērtētās izmaksas, neveicot iegādi
+STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Pirkt un pielāgot izcelto vilcienu. Shift parāda novērtētās izmaksas, neveicot iegādi
+STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Pirkt un pielāgot izcelto ceļa transportlīdzekli. Shift parāda novērtētās izmaksas, neveicot iegādi
STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Pirkt un pielāgot izcelto kuģi. Shift+klikšķis parāda novērtētās izmaksas, neveicot iegādi
STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Pirkt un pielāgot izcelto lidaparātu. Shift+klikšķis parāda novērtētās izmaksas, neveicot iegādi
@@ -4127,7 +4181,7 @@ STR_DEPOT_VEHICLE_TOOLTIP_CHAIN :{BLACK}{NUM} tr
STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG} ({CARGO_SHORT})
###length VEHICLE_TYPES
-STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Vilcieni - villkt sastāva daļu, lai pievienotu/atvienotu no vilciena. Klikšķināt uz vilciena, lai iegūtu informāciju. Turēt piespiestu Ctrl, lai attiecinātu abas funkcijas sekojošajai ķēdei
+STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Vilcieni - velciet transportlīdzekli ar kreiso klikšķi, lai pievienotu/noņemtu no vilciena, ar labo klikšķi lai iegūtu informāciju. Ctrl+klikšķis, lai lietotu kādu no funkcijām sekojošai ķēdei
STR_DEPOT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Transportlīdzekļi - labais klikšķis uz transportlīdzekļa, lai uzzinātu vairāk
STR_DEPOT_SHIP_LIST_TOOLTIP :{BLACK}Kuģi - labais klikšķis uz kuģa, lai uzzinātu vairāk
STR_DEPOT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lidaparāti - labais klikšķis uz lidaparāta, lai uzzinātu vairāk
@@ -4169,15 +4223,15 @@ STR_DEPOT_CLONE_SHIP :{BLACK}Klonēt
STR_DEPOT_CLONE_AIRCRAFT :{BLACK}Klonēt lidaparātu
###length VEHICLE_TYPES
-STR_DEPOT_CLONE_TRAIN_DEPOT_INFO :{BLACK}Nopirkt vilciena kopiju ar visiem vagoniem. Spiediet šo pogu, un pēc tam uz vilciena, kas atrodas depo vai ārpus tā. Ctrl+Klikšķis, lai koplietotu rīkojumus. Shift+Klikšķis rāda izmaksu novērtējumu, neveicot pirkumu
-STR_DEPOT_CLONE_ROAD_VEHICLE_DEPOT_INFO :{BLACK}Tas nopirks autotransporta kopiju. Spiediet uz pogas un pēc tam uz autotransporta, kas atrodas depo vai ārpus tā. Ctrl+klikšķis, lai koplietotu rīkojumus. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu
-STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Tas nopirks kuģa kopiju. Spiediet šo pogu un pēc tam uz kuģa, kas atrodas depo vai ārpus tā. Ctrl+klikšķis, lai koplietotu rīkojumus. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu
-STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Tas pirks lidaparāta kopiju. Spiediet uz pogas un pēc tam uz lidaparāta, kas atrodas angārā vai ārpus tā. Ctrl+klikšķis, lai koplietotu rīkojumus. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu
+STR_DEPOT_CLONE_TRAIN_DEPOT_INFO :{BLACK}Nopirkt vilciena kopiju ar visiem vagoniem. Spiediet šo pogu, un pēc tam uz vilciena, kas atrodas depo vai ārpus tā. Ctrl+Klikšķis, lai koplietotu rīkojumus. Shift rāda izmaksu novērtējumu, neveicot pirkumu
+STR_DEPOT_CLONE_ROAD_VEHICLE_DEPOT_INFO :{BLACK}Nopirkt autotransporta kopiju. Spiediet uz pogas un pēc tam uz autotransporta, kas atrodas depo vai ārpus tā. Ctrl+klikšķis, lai koplietotu rīkojumus. Shift rāda izmaksu novērtējumu, neveicot pirkumu
+STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Nopirkt kuģa kopiju. Spiediet šo pogu un pēc tam uz kuģa, kas atrodas depo vai ārpus tā. Ctrl+klikšķis, lai koplietotu rīkojumus. Shift rāda izmaksu novērtējumu, neveicot pirkumu
+STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Pirkt lidaparāta kopiju. Spiediet uz pogas un pēc tam uz lidaparāta, kas atrodas angārā vai ārpus tā. Ctrl+klikšķis, lai koplietotu rīkojumus. Shift rāda izmaksu novērtējumu, neveicot pirkumu
###length VEHICLE_TYPES
STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Centrēt galveno skatu uz vilcienu depo. Ctrl+klikšķis atvērs skatu uz depo jaunā skatlaukā
STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Centrēt galveno skatu uz autotransporta depo. Ctrl+klikšķis atvērs skatu uz depo jaunā skatlaukā
-STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Centrēt galveno skatu uz kuģu depo. Ctrl+klikšķis atvērs skatu uz depo jaunā skatlaukā
+STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Centrēt galveno skatu uz kuģu depo. Ctrl+klikšķis atvērs skatu uz depo jaunā skatlaukā
STR_DEPOT_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Centrēt galveno skatu uz angāru. Ctrl+klikšķis atvērs skatu uz angāru jaunā skatlaukā
###length VEHICLE_TYPES
@@ -4216,10 +4270,18 @@ STR_ENGINE_PREVIEW_TRAM_VEHICLE :tramvajs
STR_ENGINE_PREVIEW_AIRCRAFT :lidaparāts
STR_ENGINE_PREVIEW_SHIP :kuģis
+STR_ENGINE_PREVIEW_TEXT3 :{BLACK}{STRING}{}{5:STRING}{}{STRING}
+STR_ENGINE_PREVIEW_TEXT4 :{BLACK}{STRING}{}{STRING}{}{STRING}{}{STRING}
+STR_ENGINE_PREVIEW_COST_WEIGHT :Izmaksas: {CURRENCY_LONG} Svars: {WEIGHT_SHORT}
+STR_ENGINE_PREVIEW_COST_MAX_SPEED :Maksa: {CURRENCY_LONG} maks. ātrums: {VELOCITY}
STR_ENGINE_PREVIEW_SPEED_POWER :Ātrums: {VELOCITY} Jauda: {POWER}
STR_ENGINE_PREVIEW_SPEED_POWER_MAX_TE :Ātrums: {VELOCITY} Jauda: {POWER} Maks. V.S.: {FORCE}
STR_ENGINE_PREVIEW_TYPE :Lidaparāta veids: {STRING}
+STR_ENGINE_PREVIEW_TYPE_RANGE :Lidaparāta tips: {STRING} Attālums: {COMMA} rūtiņas
+STR_ENGINE_PREVIEW_RUNCOST_YEAR :Darbības izmaksas: {CURRENCY_LONG}/gadā
+STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Darbības izmaksas: {CURRENCY_LONG}/periodā
STR_ENGINE_PREVIEW_CAPACITY :Ietilpība: {CARGO_LONG}
+STR_ENGINE_PREVIEW_CAPACITY_2 :Ietilpība: {CARGO_LONG}, {CARGO_LONG}
# Autoreplace window
STR_REPLACE_VEHICLES_WHITE :{WHITE}Nomainīt {STRING} - {STRING}
@@ -4276,10 +4338,10 @@ STR_REPLACE_REMOVE_WAGON_GROUP_HELP :{STRING}. Klik
STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE}
###length VEHICLE_TYPES
-STR_VEHICLE_VIEW_TRAIN_CENTER_TOOLTIP :{BLACK} Centra galvenais skats uz vilciena atrašanās vietu. Veicot dubultklikšķi, vilcienam sekos galvenais skats. Ctrl + Click atver jaunu skata punktu vilciena atrašanās vietā
-STR_VEHICLE_VIEW_ROAD_VEHICLE_CENTER_TOOLTIP :{BLACK} Centrēt transportlīdzekļa atrašanās vietas galveno skatu. Veicot dubultklikšķi, galvenais skats sekos transportlīdzeklim. Ctrl + klikšķis atver jaunu skatu uz transportlīdzekļa atrašanās vietu
-STR_VEHICLE_VIEW_SHIP_CENTER_TOOLTIP :{BLACK}Centrēt galveno skatu uz kuģa atrašanās vietas. Dubultais klikšķis sekos kuģim galvenajā skatlaukā. Ctrl+klikšķis atvers jaunu boju kuģa lokācijā
-STR_VEHICLE_VIEW_AIRCRAFT_CENTER_TOOLTIP :{BLACK}Centrēt lidmašīnas atrašanās vietas galveno skatu. Veicot dubultklikšķi, galvenajais skats sekos lidmašīnai. Ctrl + klikšķis atver jaunu skatu uz lidmašīnas atrašanās vietu
+STR_VEHICLE_VIEW_TRAIN_CENTER_TOOLTIP :{BLACK} Centra galvenais skats uz vilciena atrašanās vietu. Veicot dubultklikšķi, vilcienam sekos galvenais skats. Ctrl+klikšķis atvērs skatu uz vilcienu jaunā skatlaukā
+STR_VEHICLE_VIEW_ROAD_VEHICLE_CENTER_TOOLTIP :{BLACK} Centrēt transportlīdzekļa atrašanās vietas galveno skatu. Veicot dubultklikšķi, galvenais skats sekos transportlīdzeklim. Ctrl+klikšķis atvērs skatu uz transportlīdzekl jaunā skatlaukā
+STR_VEHICLE_VIEW_SHIP_CENTER_TOOLTIP :{BLACK}Centrēt galveno skatu uz kuģa atrašanās vietas. Dubultais klikšķis sekos kuģim galvenajā skatlaukā. Ctrl+klikšķis atvērs jaunu boju kuģa lokācijā
+STR_VEHICLE_VIEW_AIRCRAFT_CENTER_TOOLTIP :{BLACK}Centrēt lidmašīnas atrašanās vietas galveno skatu. Veicot dubultklikšķi, galvenajais skats sekos lidmašīnai. Ctrl+klikšķis atvērs skatu uz lidmašīnu jaunā skatlaukā
###length VEHICLE_TYPES
STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Sūtīt vilcienu uz depo. Ctrl+klikšķis - izvēlēties tikai apkopi
@@ -4288,15 +4350,15 @@ STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Sūtīt
STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}Sūtīt lidaparātu uz angāru. Ctrl+klikšķis - izvēlēties tikai apkopi
###length VEHICLE_TYPES
-STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}Tas nopirks vilciena kopiju ar visiem vagoniem. Izmantojot Ctrl+klikšķis, vilcieni rīkojumus lietos kopīgi. Shift+klikšķis rāda izmaksu vērtību, neveicot pirkumu
-STR_VEHICLE_VIEW_CLONE_ROAD_VEHICLE_INFO :{BLACK}Tas nopirks autotransporta līdzekļa kopiju. Izmantojot Ctrl+klikšķis, autotransporta līdzekļi rīkojumus lietos kopīgi. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu
-STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}Tas nopirks kuģa kopiju. Izmantojot Ctrl+klikšķis, kuģi rīkojumus lietos kopīgi. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu
-STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Tas nopirks lidaparāta kopiju. Izmantojot Ctrl+klikšķis, lidaparāti rīkojumus lietos kopīgi. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu
+STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}Pirkt vilciena kopiju ar visiem vagoniem. Izmantojot Ctrl+klikšķis, vilcieni rīkojumus lietos kopīgi. Shift rāda izmaksu vērtību, neveicot pirkumu
+STR_VEHICLE_VIEW_CLONE_ROAD_VEHICLE_INFO :{BLACK}Nopirkt autotransporta līdzekļa kopiju. Izmantojot Ctrl+klikšķis, autotransporta līdzekļi rīkojumus lietos kopīgi. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu
+STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}Nopirkt kuģa kopiju. Izmantojot Ctrl+klikšķis, kuģi rīkojumus lietos kopīgi. Shift parāda novērtētās izmaksas, neveicot iegādi
+STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Pirkt lidmašīnas kopiju. Ctrl+klikšķis, lai kopīgotu pasūtījumus. Nospiežot Shift, rāda izmaksu novērtējumu, neveicot pirkumu
STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}Piespiest vilcienu doties tālāk, neievērojot signālu
STR_VEHICLE_VIEW_TRAIN_REVERSE_TOOLTIP :{BLACK}Apgriezt vilcienu pretējā virzienā
STR_VEHICLE_VIEW_ROAD_VEHICLE_REVERSE_TOOLTIP :{BLACK}Piespiest transportlīdzekli apgriezties
-STR_VEHICLE_VIEW_ORDER_LOCATION_TOOLTIP :{BLACK} Centrēt pasūtījuma galamērķa galveno skatu. Ctrl + klikšķis atver jaunu skata punktu pasūtījuma galamērķa atrašanās vietā
+STR_VEHICLE_VIEW_ORDER_LOCATION_TOOLTIP :{BLACK}Centrēt galveno skatu uz pasūtijuma galamērķi. Ctrl+klikšķis atvērs skatu uz pasūtijuma galamērķi jaunā skatlaukā
###length VEHICLE_TYPES
STR_VEHICLE_VIEW_TRAIN_REFIT_TOOLTIP :{BLACK}Pielāgot vilcienu citam kravas veidam
@@ -4325,6 +4387,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Pašreiz
# Messages in the start stop button in the vehicle view
STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Iekraušana / Izkraušana
STR_VEHICLE_STATUS_LEAVING :{LTBLUE}Aizbrauc
+STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}Gaida atdalīšanu
STR_VEHICLE_STATUS_CRASHED :{RED}Cietis avārijā!
STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}Salūzis
STR_VEHICLE_STATUS_STOPPED :{RED}Apstādināts
@@ -4338,6 +4401,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}Nav rī
STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Dodas uz {WAYPOINT}, {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}Dodas uz {DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Veikt apkopi {DEPOT}, {VELOCITY}
+STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}Atvienot un apkalpot {DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}Nevar sasniegt {STATION}, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}Nevar sasniegt {WAYPOINT}, {VELOCITY}
@@ -4364,7 +4428,8 @@ STR_VEHICLE_DETAILS_AIRCRAFT_RENAME :{BLACK}Nosaukt
STR_VEHICLE_INFO_AGE :{COMMA} gad{P s i u} ({COMMA})
STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} gad{P s i u} ({COMMA})
-STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Vecums: {LTBLUE}{STRING}{BLACK} Izmaksas: {LTBLUE}{CURRENCY_LONG} gadā
+STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Vecums: {LTBLUE}{STRING}{BLACK} Darbības izmaksas: {LTBLUE}{CURRENCY_LONG}/gadā
+STR_VEHICLE_INFO_AGE_RUNNING_COST_PERIOD :{BLACK}Vecums: {LTBLUE}{STRING}{BLACK} Darbības izmaksas: {LTBLUE}{CURRENCY_LONG}/periods
STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Maks. ātrums: {LTBLUE}{VELOCITY}
STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Maks. ātrums: {LTBLUE}{VELOCITY} {BLACK}Lidaparāta veids: {LTBLUE}{STRING}
@@ -4374,6 +4439,7 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Svars: {
STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Peļņa šogad: {LTBLUE}{CURRENCY_LONG} (pagājušajā gadā: {CURRENCY_LONG})
STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Peļņa šogad: {LTBLUE}{CURRENCY_LONG} (pagājušajā gadā: {CURRENCY_LONG}) {BLACK}Min. veiktspēja: {LTBLUE}{POWER_TO_WEIGHT}
+STR_VEHICLE_INFO_PROFIT_THIS_PERIOD_LAST_PERIOD :{BLACK}Peļņa šajā periodā: {LTBLUE}{CURRENCY_LONG} (pēdējais periods: {CURRENCY_LONG})
STR_VEHICLE_INFO_PROFIT_THIS_PERIOD_LAST_PERIOD_MIN_PERFORMANCE :{BLACK}Peļņa šajā periodā: {LTBLUE}{CURRENCY_LONG} (pēdējais periods: {CURRENCY_LONG}) {BLACK}Min. veiktspēja: {LTBLUE}{POWER_TO_WEIGHT}
STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Drošums: {LTBLUE}{COMMA}% {BLACK}Ķibeles kopš pēdējās apkopes: {LTBLUE}{COMMA}
@@ -4385,11 +4451,21 @@ STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Ietilpī
STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Pārvadājumu ieņēmumi: {LTBLUE}{CURRENCY_LONG}
+STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS :{BLACK}Apkopes intervāls: {LTBLUE}{COMMA}{NBSP}dienas{BLACK} {STRING}
+STR_VEHICLE_DETAILS_SERVICING_INTERVAL_MINUTES :{BLACK}Apkopes intervāls: {LTBLUE}{COMMA}{NBSP}minūtes{BLACK} {STRING}
+STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Apkopes intervāls: {LTBLUE}{COMMA}%{BLACK} {STRING}
+STR_VEHICLE_DETAILS_LAST_SERVICE_DATE :Pēdējā apkalpošana: {LTBLUE}{DATE_LONG}
+STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :Pēdējā apkope: pirms {LTBLUE}{NUM} minūtēm
+STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Palieliniet apkopes intervālu par 10 dienām. Ctrl+klikšķis, lai palielinātu apkopes intervālu par 5 dienām
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Palieliniet apkopes intervālu par 5 minūtēm. Ctrl+klikšķis, lai palielinātu apkopes intervālu par 1 minūti
+STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Palieliniet apkopes intervālu par 10 procentiem. Ctrl+klikšķis, lai palielinātu apkopes intervālu par 5 procentiem
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Samaziniet apkopes intervālu par 10 dienām. Ctrl+klikšķis, lai samazinātu apkopes intervālu par 5 dienām
+STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Samaziniet apkopes intervālu par 5 minūtēm. Ctrl+klikšķis, lai samazinātu apkopes intervālu par 1 minūti
+STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Samaziniet apkopes intervālu par 10 procentiem. Ctrl+klikšķis, lai samazinātu apkopes intervālu par 5 procentiem
STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Mainīt apkopes starplaiku veidu
STR_VEHICLE_DETAILS_DEFAULT :Noklusējuma
+STR_VEHICLE_DETAILS_DAYS :Dienas
STR_VEHICLE_DETAILS_MINUTES :Minūtes
STR_VEHICLE_DETAILS_PERCENT :Procenti
@@ -4429,7 +4505,7 @@ STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Jaunā i
STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}Jaunā ietilpība: {GOLD}{CARGO_LONG}{}{BLACK}Ienākumi no pielāgošanas: {GREEN}{CURRENCY_LONG}
STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Jaunā ietilpība: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Pielāgošanas izmaksas: {RED}{CURRENCY_LONG}
STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Jaunā ietilpība: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Ienākumi no pielāgošanas: {GREEN}{CURRENCY_LONG}
-STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Izvēlēties transportlīdzekļus pielāgošanai. Vilkšana ar peli ļauj izvēlēties vairākus transportlīdzekļus. Klikšķināšana tukšumā atzīmēs visus transportlīdzekļus. Ctrl+klikšķis atzīmēs izvēlēto un visus tam sekojošus transportlīdzekļus
+STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Atlasiet transportlīdzekļus, ko pārbūvēt. Velciet ar peli lai atlasītu vairākus transportlīdzekļus. Noklikšķiniet uz tukšas vietas, lai atlasītu visu transportlīdzekli. Ctrl+klikšķis, lai atlasītu visus sekojošos transportlīdzekļus
###length VEHICLE_TYPES
STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Izvēlēties, kuru kravas veidu vilciens pārvadās
@@ -4454,8 +4530,9 @@ STR_ORDERS_CAPTION :{WHITE}{VEHICLE
STR_ORDERS_TIMETABLE_VIEW :{BLACK}Saraksts
STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Pārslēgt uz saraksta skatu
-STR_ORDERS_LIST_TOOLTIP :{BLACK}Rīkojumu saraksts - klikšķināt uz rīkojuma, lai to atzīmētu. Ctrl+klikšķis ritina uz rīkojuma galamērķi
+STR_ORDERS_LIST_TOOLTIP :{BLACK}Pasūtījumu saraksts - noklikšķiniet uz pasūtījuma, lai to iezīmētu. Ctrl+klikšķis, ritina līdz pasūtījuma galamērķim
STR_ORDER_INDEX :{COMMA}:{NBSP}
+STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING}
STR_ORDERS_END_OF_ORDERS :- - Rīkojumu beigas - -
STR_ORDERS_END_OF_SHARED_ORDERS :- - Koplietojamo rīkojumu beigas - -
@@ -4492,6 +4569,15 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :Pieejamā krava
STR_ORDER_DROP_GO_ALWAYS_DEPOT :Vienmēr doties
STR_ORDER_DROP_SERVICE_DEPOT :Apkope, ja nepieciešama
STR_ORDER_DROP_HALT_DEPOT :Apstādināt
+STR_ORDER_DROP_UNBUNCH :Atdalīt
+
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Atlasiet darbību, kas jāveic šajā depo
+STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Atlasiet darbību, kas jāveic šajā depo
+STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Atlasiet darbību, kas jāveic šajā depo
+STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Atlasiet darbību, kas jāveic šajā angārā
+###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Vehicle data to base jumping on
@@ -4534,7 +4620,7 @@ STR_ORDER_GO_TO_NEAREST_DEPOT :Doties uz tuvā
STR_ORDER_GO_TO_NEAREST_HANGAR :Doties uz tuvāko angāru
STR_ORDER_CONDITIONAL :Nosacītais rīkojuma lēciens
STR_ORDER_SHARE :Koplietot rīkojumus
-STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Ievietot jaunu rīkojumu pirms iezīmētā rīkojuma vai saraksta beigās. Ctrl izveido stacijas rīkojumu 'piekraut pilnu ar jebkuru kravu', liek braukt cauri pieturas punktam 'neapstājoties' un depo veikt 'apkopi'. 'Koplietot rīkojumus' vai Ctrl ļauj šim transportlīdzeklim lietot rīkojumus kopīgi ar atlasīto transportlīdzekli. Klikšķināšana uz transportlīdzekļa kopēs tā rīkojumus. Depo rīkojums izslēdz automātisko apkopi.
+STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Ievietot jaunu rīkojumu pirms iezīmētā rīkojuma vai saraksta beigās. Ctrl+klikšķis izveido stacijas rīkojumu 'piekraut pilnu ar jebkuru kravu', liek braukt cauri pieturas punktam 'neapstājoties' un depo veikt 'apkopi'. 'Koplietot rīkojumus' vai Ctrl+klikšķis ļauj šim transportlīdzeklim lietot rīkojumus kopīgi ar atlasīto transportlīdzekli. Klikšķināšana uz transportlīdzekļa kopēs tā rīkojumus. Depo rīkojums izslēdz automātisko apkopi.
STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Rādīt visus ar šo plānu saistītos transportlīdzekļus
@@ -4560,6 +4646,7 @@ STR_ORDER_REFIT_ORDER :(Pielāgot uz {
STR_ORDER_REFIT_STOP_ORDER :(Pielāgot uz {STRING} un apstāties)
STR_ORDER_STOP_ORDER :(Apstādināt)
+STR_ORDER_WAIT_TO_UNBUNCH :(gaida atdalīšanu)
STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING}
STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Nevar izmantot staciju){POP_COLOUR} {STRING} {STATION} {STRING}
@@ -4641,24 +4728,24 @@ STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Šis gra
STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Šis grafiks sāksies pēc {COMMA} sekundēm
STR_TIMETABLE_START :{BLACK}Sākt Grafiku
-STR_TIMETABLE_START_TOOLTIP :{BLACK}Atlasiet, kad sākas šis saraksts. Ctrl+klikšķis vienmērīgi sadala visu transportlīdzekļu sākumu, kas koplieto šo pasūtījumu, pamatojoties uz to relatīvo pasūtījumu, ja pasūtījumam ir pilnībā noteikts saraksts
+STR_TIMETABLE_START_TOOLTIP :{BLACK}Atlasiet, kad sākas šis grafiks. Ctrl+klikšķis, lai vienmērīgi sadalītu visu transportlīdzekļu sākumu, kas koplieto šo rīkojumu. Rīkojumā visiem transportiem jāizmanto grafiks
STR_TIMETABLE_START_SECONDS_QUERY :Sekundes līdz grafika sākumam
STR_TIMETABLE_CHANGE_TIME :{BLACK}Mainīt laiku
-STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Mainiet laiku, kas nepieciešams iezīmētajam pasūtījumam. Ctrl+Click iestata laiku visiem pasūtījumiem
+STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Mainiet laiku, kas nepieciešams iezīmētajam pasūtījumam. Ctrl+klikšķis iestata laiku visiem pasūtījumiem
STR_TIMETABLE_CLEAR_TIME :{BLACK}Notīrīt laiku
STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Dzēst iezīmētā pasūtījuma laiku. Ctrl+klikšķis notīra laiku visiem pasūtījumiem
STR_TIMETABLE_CHANGE_SPEED :{BLACK}Mainīt ātruma ierobežojumu
-STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Mainiet izceltā pasūtījuma maksimālo braukšanas ātrumu. Ctrl+Click iestata ātrumu visiem pasūtījumiem
+STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Mainiet izceltā pasūtījuma maksimālo braukšanas ātrumu. Ctrl+klikšķis iestata ātrumu visiem pasūtījumiem
STR_TIMETABLE_CLEAR_SPEED :{BLACK}Nodzēst ātruma ierobežojumu
STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Dzēst iezīmētā pasūtījuma maksimālo braukšanas ātrumu. Ctrl+klikšķis notīra ātrumu visiem pasūtījumiem
STR_TIMETABLE_RESET_LATENESS :{BLACK}Atiestatīt kavējuma skaitītāju
-STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Atiestatiet kavējuma skaitītāju, lai transportlīdzeklis būtu laikā. Nospiežot taustiņu kombināciju Ctrl+klikšķis, tiks atiestatīta visa grupa, lai jaunākais transportlīdzeklis būtu laicīgi un visi pārējie ātrāk
+STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Atiestatiet kavējuma skaitītāju, lai transportlīdzeklis būtu laikā. Ctrl+klikšķis, lai atiestatītu visu grupu, lai jaunākais transportlīdzeklis būtu laikā un pārējie būtu agri
STR_TIMETABLE_AUTOFILL :{BLACK}Automātiska aizpildīšana
STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Automātiski aizpildiet kustības grafiku ar vērtībām no nākamā brauciena. Ctrl+noklikšķiniet, lai mēģinātu saglabāt gaidīšanas laiku
@@ -4763,6 +4850,7 @@ STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Spēles skripts
STR_AI_SETTINGS_CLOSE :{BLACK}Aizvērt
STR_AI_SETTINGS_RESET :{BLACK}Atiestatīt
STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING}
+STR_AI_SETTINGS_SETTING_DEVIATION :{STRING}: {ORANGE}[{STRING}, {STRING}]
STR_AI_SETTINGS_JUST_DEVIATION :[{STRING}, {STRING}]
@@ -5030,6 +5118,11 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Nevar at
STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Nepareizs depo veids
# Depot unbunching related errors
+STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}... var būt tikai viens atdalīts pasūtījums
+STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}... nevar izmantot pilnas kravas pasūtījumus, ja transportlīdzeklim ir atdalīts pasūtījums
+STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}... nevar atdalīt transportlīdzekli ar pilnu kravas pasūtījumu
+STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}... nevar izmantot nosacījumu pasūtījumus, ja transportlīdzeklim ir atdalīts pasūtījums
+STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}... nevar atdalīt transportlīdzekli ar nosacījumu pasūtījumu
# Autoreplace related errors
STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} pēc aizstāšanas ir pārāk garš
@@ -5690,6 +5783,7 @@ STR_UNKNOWN_STATION :nezināma staci
STR_DEFAULT_SIGN_NAME :Zīme
STR_COMPANY_SOMEONE :kāds
+STR_SAVEGAME_DURATION_REALTIME :{NUM}h {NUM}mlj.
STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING}
STR_SAVEGAME_NAME_SPECTATOR :Novērotājs, {1:STRING}
@@ -5726,6 +5820,7 @@ STR_WAYPOINT_NAME :{WAYPOINT}
STR_CURRENCY_SHORT_KILO :{NBSP}tk.
STR_CURRENCY_SHORT_MEGA :{NBSP}m
STR_CURRENCY_SHORT_GIGA :{NBSP}mljrd.
+STR_CURRENCY_SHORT_TERA :{NBSP}tonna
STR_JUST_CARGO :{CARGO_LONG}
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}
diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt
index 23953206f3..ef1b6d6efc 100644
--- a/src/lang/lithuanian.txt
+++ b/src/lang/lithuanian.txt
@@ -4473,6 +4473,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Vykti visuomet
STR_ORDER_DROP_SERVICE_DEPOT :Vykti, jei reikia
STR_ORDER_DROP_HALT_DEPOT :Nuvykti ir sustoti
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Transporto priemonės parametras, kuriuo bus remiamasi vykdant sąlyginę užduotį
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt
index 95bbf7c997..030acc75b3 100644
--- a/src/lang/luxembourgish.txt
+++ b/src/lang/luxembourgish.txt
@@ -4284,6 +4284,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Géi ëmmer
STR_ORDER_DROP_SERVICE_DEPOT :Revisioun falls néideg
STR_ORDER_DROP_HALT_DEPOT :Stop
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Gefierdaten als Basis fir den Optragssprong
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/macedonian.txt b/src/lang/macedonian.txt
index 3932ed0e08..564df399c9 100644
--- a/src/lang/macedonian.txt
+++ b/src/lang/macedonian.txt
@@ -1877,6 +1877,10 @@ STR_ORDER_INDEX :{COMMA}:{NBSP}
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
# Conditional order variables, must follow order of OrderConditionVariable enum
###length 8
diff --git a/src/lang/malay.txt b/src/lang/malay.txt
index a8f9f83b40..2ea48244e3 100644
--- a/src/lang/malay.txt
+++ b/src/lang/malay.txt
@@ -3535,6 +3535,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Sentiasa pergi
STR_ORDER_DROP_SERVICE_DEPOT :Selenggara sekiranya perlu
STR_ORDER_DROP_HALT_DEPOT :Berhenti
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Lompatan data kenderaan ke pengkalan diaktifkan
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/maltese.txt b/src/lang/maltese.txt
index 39c9af3805..044b9c049a 100644
--- a/src/lang/maltese.txt
+++ b/src/lang/maltese.txt
@@ -1267,6 +1267,10 @@ STR_ORDER_INDEX :{COMMA}:{NBSP}
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
# Conditional order variables, must follow order of OrderConditionVariable enum
###length 8
diff --git a/src/lang/marathi.txt b/src/lang/marathi.txt
index 4f94543e75..bb7cc5d3a0 100644
--- a/src/lang/marathi.txt
+++ b/src/lang/marathi.txt
@@ -1677,6 +1677,10 @@ STR_ORDER_INDEX :{COMMA}:{NBSP}
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
# Conditional order variables, must follow order of OrderConditionVariable enum
###length 8
diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt
index 8cec9e0327..bac7c042ba 100644
--- a/src/lang/norwegian_bokmal.txt
+++ b/src/lang/norwegian_bokmal.txt
@@ -4231,6 +4231,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Alltid gå
STR_ORDER_DROP_SERVICE_DEPOT :Vedlikehold ved behov
STR_ORDER_DROP_HALT_DEPOT :Stopp
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Kjøretøydata å basere hopp på
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt
index b553b83763..0379084467 100644
--- a/src/lang/norwegian_nynorsk.txt
+++ b/src/lang/norwegian_nynorsk.txt
@@ -3754,6 +3754,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Alltid gå
STR_ORDER_DROP_SERVICE_DEPOT :Vedlikehald om naudsynt
STR_ORDER_DROP_HALT_DEPOT :Stopp
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Køyretøy-data å basere hopp på
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/persian.txt b/src/lang/persian.txt
index 25f79d2946..25b5f3f0d9 100644
--- a/src/lang/persian.txt
+++ b/src/lang/persian.txt
@@ -3313,6 +3313,10 @@ STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :درصورت پ
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
# Conditional order variables, must follow order of OrderConditionVariable enum
###length 8
diff --git a/src/lang/polish.txt b/src/lang/polish.txt
index 8c18860fbe..523ba3d6db 100644
--- a/src/lang/polish.txt
+++ b/src/lang/polish.txt
@@ -593,6 +593,8 @@ STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :Taki jak podsta
STR_UNITS_VELOCITY_IMPERIAL :{DECIMAL}{NBSP}mph
STR_UNITS_VELOCITY_METRIC :{DECIMAL}{NBSP}km/h
STR_UNITS_VELOCITY_SI :{DECIMAL}{NBSP}m/s
+STR_UNITS_VELOCITY_GAMEUNITS_DAY :{DECIMAL}{NBSP}p{P ole ola ól}/dzień
+STR_UNITS_VELOCITY_GAMEUNITS_SEC :{DECIMAL}{NBSP}p{P ole ola ól}/s
STR_UNITS_VELOCITY_KNOTS :{DECIMAL}{NBSP}w.
STR_UNITS_POWER_IMPERIAL :{DECIMAL}{NBSP}hp
@@ -638,7 +640,11 @@ STR_UNITS_DAYS :{COMMA}{NBSP}d{
STR_UNITS_SECONDS :{COMMA}{NBSP}sekund{P a y ""}
STR_UNITS_TICKS :{COMMA}{NBSP}tyknię{P cie cia ć}
+STR_UNITS_MONTHS :{NUM}{NBSP}miesi{P ąc ące ęcy}
+STR_UNITS_MINUTES :{NUM}{NBSP}minut{P a y ""}
+STR_UNITS_YEARS :{NUM}{NBSP}{P rok lata lat}
+STR_UNITS_PERIODS :{NUM}{NBSP}okres{P "" y ów}
# Common window strings
STR_LIST_FILTER_TITLE :{BLACK}Filtr:
@@ -704,8 +710,10 @@ STR_SORT_BY_PRODUCTION :Produkcja
STR_SORT_BY_TYPE :Typ
STR_SORT_BY_TRANSPORTED :Przetransportowano
STR_SORT_BY_NUMBER :Numer
-STR_SORT_BY_PROFIT_LAST_YEAR :Zysk w ostatnim roku
+STR_SORT_BY_PROFIT_LAST_YEAR :Zysk w poprzednim roku
+STR_SORT_BY_PROFIT_LAST_PERIOD :Zysk w poprzednim okresie
STR_SORT_BY_PROFIT_THIS_YEAR :Zysk w tym roku
+STR_SORT_BY_PROFIT_THIS_PERIOD :Zysk w tym okresie
STR_SORT_BY_AGE :Wiek
STR_SORT_BY_RELIABILITY :Niezawodność
STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :Całkowita ładowność po typie ładunku
@@ -732,10 +740,14 @@ STR_SORT_BY_RANGE :Zasięg
STR_SORT_BY_POPULATION :Liczba mieszkańców
STR_SORT_BY_RATING :Ocena
STR_SORT_BY_NUM_VEHICLES :Ilość pojazdów
-STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Całkowity zysk w zeszłym roku
+STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Całkowity zysk w poprzednim roku
+STR_SORT_BY_TOTAL_PROFIT_LAST_PERIOD :Całkowity zysk w poprzednim okresie
STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Całkowity zysk w obecnym roku
-STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Średni zysk w zeszłym roku
-STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Średni zysk w obecnym roku
+STR_SORT_BY_TOTAL_PROFIT_THIS_PERIOD :Całkowity zysk w tym okresie
+STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Średni zysk w poprzednim roku
+STR_SORT_BY_AVERAGE_PROFIT_LAST_PERIOD :Średni zysk w poprzednim okresie
+STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Średni zysk w tym roku
+STR_SORT_BY_AVERAGE_PROFIT_THIS_PERIOD :Średni zysk w tym okresie
# Group by options for vehicle list
STR_GROUP_BY_NONE :Brak
@@ -786,12 +798,12 @@ STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR :{YELLOW}Edytor
STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD :{BLACK}Zmień datę początkową do tyłu o 1 rok
STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD :{BLACK}Zmień datę początkową do przodu o 1 rok
STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE :{BLACK}Kliknij aby wpisać datę początkową
-STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Wyświetl mapę, listę miast
-STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Tworzenie krajobrazu
-STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Tworzenie miast
-STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Tworzenie przedsiębiorstw
-STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Konstrukcja dróg
-STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Konstrukcja torów tramwajowych
+STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Otwórz mapę, dodatkowy podgląd, listę napisów, miast lub spis przedsiębiorstw
+STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Otwórz menu kształtowania krajobrazu lub wygeneruj nowy świat
+STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Budowanie oraz generowanie miast
+STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Budowanie lub generowanie przedsiębiorstw
+STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Budowa infrastruktury drogowej
+STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Budowanie infrastruktury tramwajowej
STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Posadź drzewa. Ctrl zaznacza teren po przekątnej. Shift przełącza pomiędzy trybem sadzenia a szacowaniem jego kosztów
STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Umieść napis
STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Umieść obiekt. Ctrl zaznacza obszar po przekątnej. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
@@ -813,6 +825,7 @@ STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Ustawienia
STR_SETTINGS_MENU_AI_SETTINGS :Ustawienia SI
STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Ustawienia Game Script
STR_SETTINGS_MENU_NEWGRF_SETTINGS :Ustawienia NewGRF
+STR_SETTINGS_MENU_SANDBOX_OPTIONS :Opcje swobodnej rozgrywki
STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Opcje przeźroczystości
STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Wyświetlanie nazw miast
STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED :Wyświetlanie nazw stacji
@@ -978,8 +991,11 @@ STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Dostarcz
STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Ocena wydajności firmy (maks. ocena=1000)
STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Wykres wartości firmy
+STR_GRAPH_LAST_72_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}Ostatnie 72 minuty
STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Stawki płatności za ładunek
+STR_GRAPH_CARGO_PAYMENT_RATES_DAYS :{TINY_FONT}{BLACK}Dni w transporcie
+STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS :{TINY_FONT}{BLACK}Sekund w transporcie
STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Dochód z przewozu 10 jednostek (lub 10,000 litrów) ładunku na odległość 20 pól
STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Włącz wszystko
STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Wyłącz wszystko
@@ -997,6 +1013,7 @@ STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Kliknij
# Company league window
STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Ranking firm
STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPANY} {BLACK}{COMPANY_NUM} „{STRING}”
+STR_COMPANY_LEAGUE_COMPANY_RANK :{YELLOW}{NUM}.
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER :Inżynier
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER :Administrator Ruchu
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR :Koordynator Transportu
@@ -1021,18 +1038,22 @@ STR_PERFORMANCE_DETAIL_STATIONS :{BLACK}Stacje:
STR_PERFORMANCE_DETAIL_MIN_PROFIT :{BLACK}Min. zysk:
STR_PERFORMANCE_DETAIL_MIN_INCOME :{BLACK}Min. przychód:
STR_PERFORMANCE_DETAIL_MAX_INCOME :{BLACK}Maks. przychód:
-STR_PERFORMANCE_DETAIL_DELIVERED :{BLACK}Przewieziono:
+STR_PERFORMANCE_DETAIL_DELIVERED :{BLACK}Dostarczono:
STR_PERFORMANCE_DETAIL_CARGO :{BLACK}Ładunek:
STR_PERFORMANCE_DETAIL_MONEY :{BLACK}Pieniądze:
STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Pożyczka:
STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Łącznie:
###next-name-looks-similar
+STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_YEARS :{BLACK}Liczba pojazdów, które przyniosły zysk w poprzednim roku. Dotyczy to pojazdów drogowych, pociągów, statków i samolotów
+STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_PERIODS :{BLACK}Liczba pojazdów, które przyniosły zysk w poprzednim okresie. Dotyczy to pojazdów drogowych, pociągów, statków i samolotów
STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Liczba ostatnio obsłużonych stacji. Dworce, przystanki, lotniska itp. są liczone osobno, nawet jeśli są połączone w jedną stację
-STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Ilość zarobionych pieniędzy w kwartale z najmniejszym zyskiem z ostatnich 12 kwartałów
-STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Ilość zarobionych pieniędzy w kwartale z największym zyskiem z ostatnich 12 kwartałów
-STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Ilość ładunku przewiezionego w poprzednich 4 kwartałach
-STR_PERFORMANCE_DETAIL_CARGO_TOOLTIP :{BLACK}Ilość różnych typów ładunku przewiezionych w ostatnim kwartale
+STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_YEARS :{BLACK}Zysk pojazdu o najniższym przychodzie (pod uwagę brane są tylko pojazdy starsze niż dwa lata)
+STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_PERIODS :{BLACK}Zysk pojazdu o najniższym przychodzie (pod uwagę brane są tylko pojazdy starsze niż dwa okresy)
+STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Kwota pieniędzy zarobionych w kwartale z najniższym zyskiem spośród poprzednich 12 kwartałów
+STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Kwota pieniędzy zarobionych w kwartale z najwyższym zyskiem spośród poprzednich 12 kwartałów
+STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Ilość ładunku dostarczonego w poprzednich 4 kwartałach
+STR_PERFORMANCE_DETAIL_CARGO_TOOLTIP :{BLACK}Ilość różnych typów ładunku dostarczonych w poprzednim kwartale
STR_PERFORMANCE_DETAIL_MONEY_TOOLTIP :{BLACK}Ilość dostępnych środków pieniężnych
STR_PERFORMANCE_DETAIL_LOAN_TOOLTIP :{BLACK}Wielkość pożyczki wziętej przez firmę
STR_PERFORMANCE_DETAIL_TOTAL_TOOLTIP :{BLACK}Suma przyznanych punktów
@@ -1177,6 +1198,7 @@ STR_STATUSBAR_AUTOSAVE :{RED}AUTOZAPIS
STR_STATUSBAR_SAVING_GAME :{RED}* * ZAPISYWANIE GRY * *
STR_STATUSBAR_SPECTATOR :{WHITE}(obserwator)
+STR_STATUSBAR_INFINITE_MONEY :{WHITE}(nieskończone pieniądze)
# News message history
STR_MESSAGE_HISTORY :{WHITE}Poprzednie wiadomości
@@ -1261,6 +1283,8 @@ STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE
STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD_AND :{WHITE}{VEHICLE} bardzo się starzeje i potrzebuje natychmiastowej wymiany
STR_NEWS_TRAIN_IS_STUCK :{WHITE}{VEHICLE} nie potrafi znaleźć trasy, aby kontynuować
STR_NEWS_VEHICLE_IS_LOST :{WHITE}{VEHICLE} się zgubił
+STR_NEWS_VEHICLE_UNPROFITABLE_YEAR :{WHITE}Dochód {VEHICLE} w poprzednim roku wyniósł {CURRENCY_LONG}
+STR_NEWS_VEHICLE_UNPROFITABLE_PERIOD :{WHITE}Dochód {VEHICLE} w poprzednim okresie wyniósł {CURRENCY_LONG}
STR_NEWS_AIRCRAFT_DEST_TOO_FAR :{WHITE}{VEHICLE} nie może dotrzeć do kolejnego punktu docelowego, ponieważ punkt ten leży poza jego zasięgiem
STR_NEWS_ORDER_REFIT_FAILED :{WHITE}Zaplanowane przeładowanie zatrzymane {VEHICLE}
@@ -1277,7 +1301,12 @@ STR_NEWS_STATION_NOW_ACCEPTS_CARGO_LIST :{WHITE}{STATION
STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Dotacja wygasła:{}{}{STRING} z {STRING} do {STRING} nie będzie już dotowane
STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Koniec dotacji:{}{}Przewóz {STRING.d} z {STRING} do {STRING} nie jest już dotowany
+STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Oferta usługi dotowanej:{}{}Pierwszy przewóz {STRING.d} z {STRING} do {STRING} będzie dotowany przez następn{P 3 y e ych} {UNITS_YEARS_OR_MINUTES} przez lokalne władze!
###length 4
+STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}Przyznano dotację dla {STRING}!{}{}Przewóz {STRING.d} z {STRING} do {STRING} będzie opłacany o 50% więcej przez następn{P 4 y e ych} {UNITS_YEARS_OR_MINUTES}!
+STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}Przyznano dotację dla {STRING}!{}{}Przewóz {STRING.d} z {STRING} do {STRING} będzie opłacany podwójnie przez następn{P 4 y e ych} {UNITS_YEARS_OR_MINUTES}!
+STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Przyznano dotację dla {STRING}!{}{}Przewóz {STRING.d} z {STRING} do {STRING} będzie opłacany potrójnie przez następn{P 4 y e ych} {UNITS_YEARS_OR_MINUTES}!
+STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Przyznano dotację dla {STRING}!{}{}Przewóz {STRING.d} z {STRING} do {STRING} będzie opłacany poczwórnie przez następn{P 4 y e ych} {UNITS_YEARS_OR_MINUTES}!
STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Monopol transportowy!
@@ -1297,6 +1326,8 @@ STR_GAME_OPTIONS_TAB_GRAPHICS :Grafika
STR_GAME_OPTIONS_TAB_GRAPHICS_TT :{BLACK}Wybierz opcje grafiki
STR_GAME_OPTIONS_TAB_SOUND :Dźwięk
STR_GAME_OPTIONS_TAB_SOUND_TT :{BLACK}Wybierz opcje dźwięku i muzyki
+STR_GAME_OPTIONS_TAB_SOCIAL :Społeczność
+STR_GAME_OPTIONS_TAB_SOCIAL_TT :{BLACK}Wybierz ustawienia integracji sieci społecznościowych
STR_GAME_OPTIONS_VOLUME :Głośność
STR_GAME_OPTIONS_SFX_VOLUME :Efekty dźwiękowe
@@ -1391,7 +1422,7 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Zaznacz
STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Bieżący sterownik: {STRING}
STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Rozmiar interfejsu
-STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Przeciągnij suwak, aby ustawić rozmiar interfejsu. Przytrzymaj Ctrl, aby uzyskać płynną regulację
+STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Przeciągnij suwak, aby ustawić rozmiar interfejsu. Ctrl+przeciągnij, aby uzyskać płynną regulację
STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Wykryj rozmiar automatycznie
STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Zaznacz to pole, aby rozmiar interfejsu był wykrywany automatycznie
@@ -1436,8 +1467,19 @@ STR_GAME_OPTIONS_BASE_MUSIC :{BLACK}Podstawo
STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Wybierz podstawowy zestaw muzyki do użycia
STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Dodatkowe informacje o muzyce podstawowej
+STR_GAME_OPTIONS_SOCIAL_PLUGINS_NONE :{LTBLUE}(brak zainstalowanych wtyczek do integracji z platformami społecznościowymi)
+STR_GAME_OPTIONS_SOCIAL_PLUGIN_TITLE :{BLACK}{STRING} ({STRING})
+STR_GAME_OPTIONS_SOCIAL_PLUGIN_PLATFORM :{BLACK}Platforma:
+STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE :{BLACK}Stan wtyczki:
+STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_RUNNING :{GREEN}Uruchomiona
+STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_FAILED :{RED}Inicjalizacja nie powiodła się
+STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_PLATFORM_NOT_RUNNING :{ORANGE}{STRING} nie uruchomiona
+STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_UNLOADED :{RED}Niezaładowana
+STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_DUPLICATE :{RED}Zdublowana wtyczka
+STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_UNSUPPORTED_API :{RED}Wersja nieobsługiwana
+STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_INVALID_SIGNATURE :{RED}Nieprawidłowa sygnatura
STR_BASESET_STATUS :{STRING} {RED}({NUM} brakując{P y e ych}/uszkodzon{P y e ych} plik{P "" i ów})
@@ -1605,6 +1647,8 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :z prawej strony
STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}sekund{P 0 ę y ""}
+STR_CONFIG_SETTING_INFINITE_MONEY :Nieskończona ilość pieniędzy: {STRING}
+STR_CONFIG_SETTING_INFINITE_MONEY_HELPTEXT :Pozwól na nieograniczone wydatki i wyłącz bankructwa firm
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maksymalna wysokość początkowej pożyczki: {STRING}
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maksymalna wysokość pożyczki, jaką firma może zaciągnąć (bez uwzględnienia inflacji)
@@ -1631,6 +1675,7 @@ STR_CONFIG_SETTING_SUBSIDY_DURATION :Czas trwania do
###length 2
STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Określ liczbę lat, na które przyznawana jest dotacja
+STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR_PERIODS}
###setting-zero-is-special
STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Brak dotacji
@@ -1638,7 +1683,7 @@ STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Koszty konstruk
STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Ustaw poziom kosztów konstrukcji i kupna
STR_CONFIG_SETTING_RECESSIONS :Kryzys: {STRING}
-STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Jeśli włączone, kryzys może wystąpić co kilka lat. Podczas kryzysu produkcja jest znacznie niższa (powraca do poprzedniego poziomu, kiedy kryzys się kończy)
+STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Jeśli włączone, kryzys może występować okresowo. Podczas kryzysu produkcja jest znacznie niższa (powraca do poprzedniego poziomu, kiedy kryzys się kończy)
STR_CONFIG_SETTING_TRAIN_REVERSING :Nie pozwalaj pociągom zawracać na stacjach: {STRING}
STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Jeśli włączone, pociągi nie będą zawracać na stacjach dwu-wjazdowych, nawet jeśli droga do następnego celu jest krótsza po zawróceniu
@@ -1692,7 +1737,7 @@ STR_CONFIG_SETTING_FORBID_90_DEG :Zabroń pociąg
STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :90-stopniowy zakręt występuje wtedy, gdy bezpośrednio po poziomym odcinku toru występuje odcinek pionowy (lub na odwrót), zmuszając pociąg do ostrzejszego skrętu (zamiast normalnego, 45-stopniowego skrętu w innych kombinacjach torów)
STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS :Pozwól na łączenie stacji nie sąsiadujących bezpośrednio: {STRING}
-STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Pozwalaj na dodawanie części stacji nie stykających się ze sobą. Naciśnij Ctrl przed postawieniem nowej części
+STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Pozwala na dołączanie części stacji nie stykających się ze sobą, wciskając Ctrl+klik przy stawianiu nowej części
STR_CONFIG_SETTING_INFLATION :Inflacja: {STRING}
STR_CONFIG_SETTING_INFLATION_HELPTEXT :Włącz lub wyłącz inflację (sytuacja ekonomiczna, w związku z którą koszty rosną nieco szybciej niż zapłaty)
@@ -1756,7 +1801,7 @@ STR_CONFIG_SETTING_BRIBE_HELPTEXT :Pozwalaj firmom
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Pozwól na kupno wyłączności transportowej: {STRING}
###length 2
-STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Kiedy firma wykupuje wyłączność na transport w mieście, to przystanki i stacje przeciwników (pasażerskie i towarowe) nie otrzymają żadnego ładunku przez cały rok
+STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Kiedy firma wykupuje wyłączność na transport w mieście, to przystanki i stacje przeciwników (pasażerskie i towarowe) nie otrzymują żadnego ładunku przez dwanaście miesięcy
STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Pozwól na fundowanie budynków: {STRING}
STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :Pozwalaj firmom na sponsorowanie budowy nowych budynków w miastach
@@ -1814,16 +1859,23 @@ STR_CONFIG_SETTING_ORDER_REVIEW_ON :Wszystkich poja
STR_CONFIG_SETTING_WARN_INCOME_LESS :Powiadom, jeśli pojazd przynosi straty: {STRING}
###length 2
-STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Kiedy włączone, otrzymasz wiadomość o tym, że pojazd nie przyniósł żadnych zysków w całym roku kalendarzowym
+STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Kiedy włączone, wiadomość zostanie wyświetlona, gdy pojazd nie osiągnie zysku w ciągu roku
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Pojazdy nigdy nie są wycofywane: {STRING}
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Kiedy włączone, wszystkie modele pojazdów pozostają dostępne na zawsze od daty ich wprowadzenia
+STR_CONFIG_SETTING_TIMEKEEPING_UNITS :Miara czasu: {STRING}
+STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :Wybierz jednostki pomiaru czasu w grze. Nie można tego zmienić później.{}{}Kalendarz jest klasycznym trybem OpenTTD, z rokiem składającym się z 12 miesięcy, a każdy miesiąc ma 28-31 dni.{}{}W trybie opartym na zegarze ruch pojazdów, produkcja ładunków i finanse są natomiast oparte na jednominutowych przyrostach, czyli mniej więcej tak długo, jak trwa 30-dniowy miesiąc w trybie opartym na kalendarzu. Są one pogrupowane w 12-minutowe okresy, co odpowiada rokowi w trybie opartym na kalendarzu.{}{}W obu trybach zawsze funkcjonuje klasyczny kalendarz, który jest używany do dat wprowadzenia pojazdów, domów i innej infrastruktury.
###length 2
+STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :Kalendarz
+STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Zegar
+STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM}
###setting-zero-is-special
+STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (zamrożenie czasu kalendarza)
+STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}%
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Autoodnawianie pojazdów gdy stają się stare: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Kiedy włączone, pojazd zbliżający się do końca swojej żywotności zostaje automatycznie zastąpiony, gdy warunki jego odnowienia są spełnione
@@ -2079,6 +2131,7 @@ STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT :Odtwarzaj dźwi
###length 2
STR_CONFIG_SETTING_SOUND_NEW_YEAR :Koniec roku: {STRING}
+STR_CONFIG_SETTING_SOUND_NEW_PERIOD :Koniec okresu: {STRING}
###length 2
STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :Odtwarzaj dźwięk na koniec roku podsumowując roczną sytuację przedsiębiorstwa w porównaniu do roku poprzedniego
@@ -2142,7 +2195,7 @@ STR_CONFIG_SETTING_SERVINT_AIRCRAFT :Domyślny inter
STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :Ustaw domyślny okres serwisowania dla nowych maszyn latających, jeśli takowy nie istnieje dla określonego pojazdu
STR_CONFIG_SETTING_SERVINT_SHIPS :Domyślny interwał serwisowania statków: {STRING}
STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :Ustaw domyślny okres serwisowania dla nowych statków, jeśli takowy nie istnieje dla określonego pojazdu
-STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}d{P zień ni ni}/%
+STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}D{P zień ni ni}/Minut{P a y ""}/%
###setting-zero-is-special
STR_CONFIG_SETTING_SERVINT_DISABLED :Wyłączone
@@ -2234,7 +2287,7 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Podczas przeci
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Ustaw dystans, na jakim semafory będą budowane przy torach aż do następnej przeszkody (semafor, zwrotnica), przy przeciąganiu
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} p{P ole ola ól}
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Zachowaj stały odstęp między semaforami przy przeciąganiu: {STRING}
-STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Wybierz sposób budowania semaforów przy przeciąganiu z wciśniętym Ctrl. Kiedy wyłączone, semafory są stawiane przy tunelach lub mostach, by nie zostawiać długich odcinków bez sygnałów. Kiedy włączone, semafory są stawiane co X pól, sprawiając, że stawianie semaforów na rownoległych torach jest łatwiejsze
+STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Wybierz sposób rozmieszczania sygnalizacji podczas przeciągania. Kiedy wyłączone, sygnały są stawiane przy tunelach lub mostach, by nie zostawiać długich odcinków bez sygnałów. Kiedy włączone, sygnały są umieszczane co X pól, sprawiając że stawianie sygnalizacji na równoległych torach jest łatwiejsze
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Automatycznie buduj semafory przed: {STRING}
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Ustaw rok, w którym semafory świetlne będą używane. Przed tym rokiem w użyciu będą semafory kształtowe (które mają te same właściwości, tylko inny wygląd)
@@ -2242,6 +2295,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Ustaw rok, w kt
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Przełączaj typy sygnalizatorów: {STRING}
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Wybierz, między jakimi typami sygnalizatorów przełączać po naciśnięciu Ctrl+klik przy budowaniu sygnalizatorów
###length 2
+STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Tylko bieżąca grupa
STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Wszystkie widoczne
STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Pokazuj typy sygnalizatorów: {STRING}
@@ -2374,6 +2428,8 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Kiedy prędkoś
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Imperialne (mph)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metryczne (km/h)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s)
+STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_DAYS :Jednostki gry (pola/dzień)
+STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_SECS :Jednostki gry (pola/s)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_KNOTS :Węzły
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Jednostka mocy pojazdów: {STRING}
@@ -2510,14 +2566,14 @@ STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Wybierz
STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Wybierz krajobraz „tropikalny”
STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Wybierz krajobraz „zabawkowy”
-STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Wyświetl opcje gry
-STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Wyświetl tabelę wyników
+STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Otwórz opcje gry
+STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Otwórz tabelę wyników
STR_INTRO_TOOLTIP_HELP :{BLACK}Uzyskaj dostęp do dokumentacji i zasobów online
-STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Wyświetl ustawienia gry
-STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Wyświetl ustawienia NewGRF
+STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Otwórz ustawienia gry
+STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Otwórz ustawienia NewGRF
STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Poszukaj nowych lub zaktualizowanych dodatków do pobrania
-STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Wyświetl ustawienia SI
-STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Wyświetl ustawienia Game Script
+STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Otwórz ustawienia SI
+STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Otwórz ustawienia Game Script
STR_INTRO_TOOLTIP_QUIT :{BLACK}Wyjdź z „OpenTTD”
STR_INTRO_BASESET :{BLACK}Aktualnie używany podstawowy zestaw graficzny nie posiada {NUM} wymagan{P ego ych ych} sprite{P 'u 'ów 'ów}. Proszę poszukać aktualizacji dla zestawu podstawowego.
@@ -2548,7 +2604,7 @@ STR_HELP_WINDOW_BUGTRACKER :{BLACK}Zgłoś
STR_HELP_WINDOW_COMMUNITY :{BLACK}Społeczność
# Cheat window
-STR_CHEATS :{WHITE}Oszustwa
+STR_CHEATS :{WHITE}Opcje Swobodnej Rozgrywki
STR_CHEAT_MONEY :{LTBLUE}Zwiększ ilość pieniędzy o {CURRENCY_LONG}
STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Grasz jako firma: {ORANGE}{COMMA}
STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Magiczny buldożer (usuwanie przedsiębiorstw, nieprzesuwalnych obiektów): {ORANGE}{STRING}
@@ -2685,6 +2741,9 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Rozmiar
STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Rozmiar mapy{}Kliknij, by sortować wg powierzchni
STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Data
STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Bieżąca data
+STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}h {NUM}min
+STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION :{BLACK}Czas gry
+STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP :{BLACK}Czas rozgrywki,{}gdy gra nie była wstrzymana
STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Język, wersja serwera, itp.
STR_NETWORK_SERVER_LIST_CLICK_GAME_TO_SELECT :{BLACK}Kliknij na grze z listy by ją wybrać
@@ -2700,6 +2759,7 @@ STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Adres s
STR_NETWORK_SERVER_LIST_INVITE_CODE :{SILVER}Kod zaproszenia: {WHITE}{STRING}
STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Data uruchomienia: {WHITE}{DATE_SHORT}
STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Aktualna data: {WHITE}{DATE_SHORT}
+STR_NETWORK_SERVER_LIST_PLAY_TIME :{SILVER}Czas gry: {WHITE}{NUM}h {NUM}min
STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Game Script: {WHITE}{STRING} (v{NUM})
STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}Chronione hasłem!
STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}SERWER WYŁĄCZONY
@@ -3055,7 +3115,10 @@ STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLA
STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}przeładowany
# Linkgraph tooltip
+STR_LINKGRAPH_STATS_TOOLTIP_MONTH :{BLACK}{CARGO_LONG} do przetransportowania w ciągu miesiąca z {STATION} do {STATION} ({COMMA}% przepustowości){STRING}
+STR_LINKGRAPH_STATS_TOOLTIP_MINUTE :{BLACK}{CARGO_LONG} do przetransportowania w ciągu minuty z {STATION} do {STATION} ({COMMA}% przepustowości){STRING}
STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} do przetransportowania z powrotem ({COMMA}% przepustowości)
+STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Średni czas podróży: {UNITS_DAYS_OR_SECONDS}
# Base for station construction window(s)
STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Podświetlaj zasięg
@@ -3090,7 +3153,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Zbuduj s
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Zbuduj sygnały na torach. Ctrl przełącza semafory/sygnały świetlne{}Przeciąganie buduje sygnały wzdłuż prostej linii torów, z Ctrl buduje sygnały aż do najbliższego skrzyżowania lub sygnału{}Ctrl+klik przełącza wyświetlanie okna wyboru sygnałów. Shift przełącza pomiędzy budowaniem a szacowaniem jego kosztów
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Zbuduj most kolejowy. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Zbuduj tunel kolejowy. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
-STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Przełącz buduj/usuń dla torów kolejowych, sygnałów, posterunków i stacji. Przetrzymanie Ctrl usuwa także tory kolejowe z posterunków i stacji
+STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Przełącz budowanie/usuwanie torów kolejowych, sygnałów, posterunków i stacji. Ctrl+klik usuwa także tory kolejowe z posterunków i stacji
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Zamiana typu torów. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_RAIL_NAME_RAILROAD :Kolej
@@ -3141,7 +3204,7 @@ STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Sygnaliz
STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Sygnalizator złożony (elektryczny){}Sygnalizator złożony działa jako sygnał wejściowy i wyjściowy. Umożliwia to budowę wielkich „drzew” presygnalizatorów
STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Sygnalizator trasy (elektryczny){}Sygnalizator trasy umożliwiający wejście więcej niż jednemu pociagowi do bloku sygnalizatorów, o ile pociąg może zarezerwować trasę do bezpiecznego punktu zatrzymania. Zwykłe sygnalizatory trasy mogą być mijane w przeciwnym kierunku
STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Jednokierunkowy sygnalizator trasy (elektryczny){}Sygnalizator trasy umożliwiający wejście więcej niż jednemu pociagowi do bloku sygnalizatorów, o ile pociąg może zarezerwować trasę do bezpiecznego punktu zatrzymania. Sygnalizatory jednokierunkowe nie mogą być mijane w przeciwnym kierunku
-STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Zamiana sygnałów{}Jeżeli włączone, kliknięcie na istniejący sygnał spowoduje zamianę go na wybrany typ i wariant. Ctrl+klik przełącza istniejący wariant. Shift+klik pokazuje szacowany koszt zamiany
+STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Zamiana sygnałów{}Kliknij na istniejący sygnał, aby zamienić go na wybrany typ i wariant. Ctrl+klik przełącza istniejący wariant. Shift+klik pokazuje szacowany koszt zamiany
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}Odległość między sygnałami przy przeciąganiu
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}Zmniejsz odległość między sygnałami przy przeciąganiu
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Zwiększ odległość między sygnałami przy przeciąganiu
@@ -3215,8 +3278,8 @@ STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Wybuduj
STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Zbuduj port. Ctrl umożliwia łączenie stacji. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Ustaw boję, która może być użyta jako punkt orientacyjny. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Zbuduj akwedukt. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
-STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Stwórz akwen wodny.{}Tworzy kanał, chyba że przytrzymany jest CTRL na poziomie morza, wtedy pobliski teren zostanie zatopiony
-STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Umieszczanie rzek. Ctrl zaznacza obszar po przekątnej.
+STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Zbuduj kanał. Ctrl+klik na poziomie morza spowoduje zatopienie terenu
+STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Umieszczanie rzek. Ctrl+klik zaznacza obszar po przekątnej
# Ship depot construction window
STR_DEPOT_BUILD_SHIP_CAPTION :{WHITE}Ukierunkowanie stoczni
@@ -3261,7 +3324,7 @@ STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Zakup te
# Object construction window
STR_OBJECT_BUILD_CAPTION :{WHITE}Wybór obiektu
-STR_OBJECT_BUILD_TOOLTIP :{BLACK}Wybierz obiekt do budowy. Ctrl zaznacza obszar po przekątnej. Shift przełącza pomiędzy trybem budowy a szacowaniem jej kosztów
+STR_OBJECT_BUILD_TOOLTIP :{BLACK}Wybierz obiekt do budowy. Ctrl+klik+przeciągnięcie zaznacza obszar po przekątnej. Dodatkowo wciśnięcie Shift wyświetli jedynie szacunkowy koszt
STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Wybierz rodzaj obiektu do budowy
STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Podgląd obiektu
STR_OBJECT_BUILD_SIZE :{BLACK}Rozmiar: {GOLD}{NUM} x {NUM} pól
@@ -3613,11 +3676,11 @@ STR_MAPGEN_VARIETY :{BLACK}Różnor
STR_MAPGEN_GENERATE :{WHITE}Stwórz
STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Stwórz świat i graj w OpenTTD!
STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Ustawienia NewGRF
-STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Wyświetl ustawienia NewGRF
+STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Otwórz ustawienia NewGRF
STR_MAPGEN_AI_SETTINGS :{BLACK}Ustawienia SI
-STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Wyświetl ustawienia SI
+STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Otwórz ustawienia SI
STR_MAPGEN_GS_SETTINGS :{BLACK}Ustawienia Game Script
-STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Wyświetl ustawienia Game Script
+STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Otwórz ustawienia Game Script
###length 21
STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Angielskie (Oryginalne)
@@ -3911,13 +3974,16 @@ STR_TOWN_POPULATION :{BLACK}Populacj
STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN}
STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Metropolia)
STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Populacja: {ORANGE}{COMMA}{BLACK} Domów: {ORANGE}{COMMA}
-STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} w ostatnim miesiącu: {ORANGE}{COMMA}{BLACK} najwięcej: {ORANGE}{COMMA}
+STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} w poprzednim miesiącu: {ORANGE}{COMMA}{BLACK} maks.: {ORANGE}{COMMA}
+STR_TOWN_VIEW_CARGO_LAST_MINUTE_MAX :{BLACK}{CARGO_LIST} w poprzedniej minucie: {ORANGE}{COMMA}{BLACK} maks.: {ORANGE}{COMMA}
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Ładunek potrzebny do rozwoju miasta:
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{RED}Wymagana {ORANGE}{STRING}
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} wymagane zimą
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{G=f}{ORANGE}{STRING}{GREEN} dostarczona
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED :{G=m}{ORANGE}{CARGO_TINY} / {CARGO_LONG}{RED} (wciąż wymagany)
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED :{G=m}{ORANGE}{CARGO_TINY} / {CARGO_LONG}{GREEN} (dostarczony)
+STR_TOWN_VIEW_TOWN_GROWS_EVERY :{BLACK}Miasto rośnie co {ORANGE}{UNITS_DAYS_OR_SECONDS}
+STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}Miasto rośnie co {ORANGE}{UNITS_DAYS_OR_SECONDS} (ufundowane)
STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}Miasto {RED}nie{BLACK} rośnie
STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Limit hałasu w mieście: {ORANGE}{COMMA}{BLACK} maksymalnie: {ORANGE}{COMMA}
STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Wyśrodkuj widok główny na lokalizacji miasta. Ctrl+klik otwiera nowy podgląd na jego lokalizację
@@ -3973,7 +4039,7 @@ STR_GOALS_TEXT :{ORANGE}{STRING
STR_GOALS_NONE :{ORANGE}- Brak -
STR_GOALS_PROGRESS :{ORANGE}{STRING}
STR_GOALS_PROGRESS_COMPLETE :{GREEN}{STRING}
-STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Kliknij na celu by wyśrodkować widok na przedsiębiorstwie/mieście/polu. Ctrl+klik otwiera nowe okno podglądu
+STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Kliknij na celu, aby wyśrodkować widok na przedsiębiorstwie/mieście/polu. Ctrl+klik otwiera nowe okno podglądu
# Goal question window
STR_GOAL_QUESTION_CAPTION_QUESTION :Pytanie
@@ -4109,6 +4175,8 @@ STR_EDIT_WAYPOINT_NAME :{WHITE}Edytuj n
# Finances window
STR_FINANCES_CAPTION :{WHITE}Finanse {COMPANY} {BLACK}{COMPANY_NUM}
STR_FINANCES_YEAR :{WHITE}{NUM}
+STR_FINANCES_YEAR_CAPTION :{WHITE}Rok
+STR_FINANCES_PERIOD_CAPTION :{WHITE}Okres
###length 3
STR_FINANCES_REVENUE_TITLE :{WHITE}Przychody
@@ -4210,6 +4278,8 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanały
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stacje:
STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS :{WHITE}Pola stacji
STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS :{WHITE}Lotniska
+STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_YEAR :{WHITE}{CURRENCY_LONG}/rok
+STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/okres
# Industry directory
STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Przedsiębiorstwa
@@ -4228,7 +4298,8 @@ STR_INDUSTRY_DIRECTORY_FILTER_NONE :Żadne
# Industry view
STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY}
-STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Wyprodukowano w ostatnim miesiącu:
+STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Wyprodukowano w poprzednim miesiącu:
+STR_INDUSTRY_VIEW_PRODUCTION_LAST_MINUTE_TITLE :{BLACK}Wyprodukowano w poprzedniej minucie:
STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} ({COMMA}% przetransportowano)
STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Wyśrodkuj widok główny na lokalizacji przedsiębiorstwa. Ctrl+klik otwiera nowy podgląd na jego lokalizację
STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Poziom produkcji: {YELLOW}{COMMA}%
@@ -4269,7 +4340,7 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Wyślij
STR_VEHICLE_LIST_REPLACE_VEHICLES :Zastąp pojazdy
STR_VEHICLE_LIST_SEND_FOR_SERVICING :Wyślij do serwisu
STR_VEHICLE_LIST_CREATE_GROUP :Stwórz grupę
-STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Zysk w tym roku: {CURRENCY_LONG} (ostatni rok: {CURRENCY_LONG})
+STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Zysk w tym roku: {CURRENCY_LONG} (poprzedni rok: {CURRENCY_LONG})
STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}]
STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING}
@@ -4315,7 +4386,9 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Usuń wszystkie
STR_GROUP_RENAME_CAPTION :{BLACK}Zmień nazwę grupy
STR_GROUP_PROFIT_THIS_YEAR :Zysk w tym roku:
-STR_GROUP_PROFIT_LAST_YEAR :Zysk w zeszłym roku:
+STR_GROUP_PROFIT_THIS_PERIOD :Zysk w tym okresie:
+STR_GROUP_PROFIT_LAST_YEAR :Zysk w poprzednim roku:
+STR_GROUP_PROFIT_LAST_PERIOD :Zysk w poprzednim okresie:
STR_GROUP_OCCUPANCY :Aktualne wykorzystanie:
STR_GROUP_OCCUPANCY_VALUE :{NUM}%
@@ -4342,6 +4415,8 @@ STR_PURCHASE_INFO_SPEED_POWER :{BLACK}Prędko
STR_PURCHASE_INFO_SPEED :{BLACK}Prędkość: {GOLD}{VELOCITY}
STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}Prędkość na oceanie: {GOLD}{VELOCITY}
STR_PURCHASE_INFO_SPEED_CANAL :{BLACK}Prędkość na kanale/rzece: {GOLD}{VELOCITY}
+STR_PURCHASE_INFO_RUNNINGCOST_YEAR :{BLACK}Kosz Utrzymania: {GOLD}{CURRENCY_LONG}/rok
+STR_PURCHASE_INFO_RUNNINGCOST_PERIOD :{BLACK}Kosz Utrzymania: {GOLD}{CURRENCY_LONG}/okres
STR_PURCHASE_INFO_CAPACITY :{BLACK}Ładowność: {GOLD}{CARGO_LONG} {STRING}
STR_PURCHASE_INFO_REFITTABLE :(przebudowywalny)
STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Zaprojektowany: {GOLD}{NUM}{BLACK} Żywotność: {GOLD}{COMMA} lat
@@ -4368,10 +4443,10 @@ STR_CARGO_TYPE_FILTER_FREIGHT :Fracht
STR_CARGO_TYPE_FILTER_NONE :Żaden
###length VEHICLE_TYPES
-STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista wyboru pociągów - kliknij na pojazd, aby uzyskać informacje. Ctrl+klik przełącza ukrywanie typu pojazdu
-STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Lista wyboru pojazdów drogowych - kliknij na pojazd, aby uzyskać więcej informacji. Ctrl+klik przełącza ukrywanie typu pojazdu
-STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Lista wyboru statków - kliknij na statek, aby uzyskać informacje. Ctrl+klik przełącza ukrywanie typu statku
-STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lista wyboru samolotów - kliknij na samolocie, aby uzyskać informacje. Ctrl+klik przełącza ukrywanie typu samolotu
+STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista wyboru pociągów. Kliknij na pojazd, aby uzyskać informacje. Ctrl+klik przełącza wyświetlanie/ukrywanie typu pojazdu
+STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Lista wyboru pojazdów drogowych. Kliknij na pojazd, aby uzyskać informacje. Ctrl+klik przełącza wyświetlanie/ukrywanie typu pojazdu
+STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Lista wyboru statków. Kliknij na statek, aby uzyskać informacje. Ctrl+klik przełącza wyświetlanie/ukrywanie typu statku
+STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lista wyboru samolotów. Kliknij na samolot, aby uzyskać informacje. Ctrl+klik przełącza wyświetlanie/ukrywanie typu samolotu
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_BUTTON :{BLACK}Kup tabor kolejowy
@@ -4445,7 +4520,7 @@ STR_DEPOT_VEHICLE_TOOLTIP_CHAIN :{BLACK}{NUM} po
STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG} ({CARGO_SHORT})
###length VEHICLE_TYPES
-STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Pociągi - przeciągnij pojazd/wagon przytrzymując lewy klawisz myszy, aby go dodać/usunąć ze składu pociągu, kliknij na pociągu prawym aby uzyskać informacje. Przytrzymanie Ctrl dla podanych akcji stosuje zmiany do całego składu pociągu
+STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Pociągi - przeciągnij pojazd/wagon lewym przyciskiem myszy, aby go dodać/usunąć ze składu pociągu; kliknij prawym, aby uzyskać o nim informacje. Ctrl+klik wykona te funkcje dla ciągu wagonów aż do ostatniego
STR_DEPOT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Pojazdy - prawy klik na pojeździe pozwala uzyskać więcej informacji
STR_DEPOT_SHIP_LIST_TOOLTIP :{BLACK}Statki - prawy klik pozwala uzyskać informacje o statku
STR_DEPOT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Samolot - prawy klik na samolocie pozwala uzyskać informacje
@@ -4540,6 +4615,11 @@ STR_ENGINE_PREVIEW_AIRCRAFT.b :samolot
STR_ENGINE_PREVIEW_SHIP :{G=m}statek
STR_ENGINE_PREVIEW_SHIP.b :statek
+STR_ENGINE_PREVIEW_TEXT3 :{BLACK}{STRING}{}{5:STRING}{}{STRING}
+STR_ENGINE_PREVIEW_TEXT4 :{BLACK}{STRING}{}{STRING}{}{STRING}{}{STRING}
+STR_ENGINE_PREVIEW_RUNCOST_YEAR :Kosz Utrzymania: {CURRENCY_LONG}/rok
+STR_ENGINE_PREVIEW_CAPACITY :Ładowność: {CARGO_LONG}
+STR_ENGINE_PREVIEW_CAPACITY_2 :Ładowność: {CARGO_LONG}, {CARGO_LONG}
# Autoreplace window
STR_REPLACE_VEHICLES_WHITE :{WHITE}Zastąp {STRING} - {STRING}
@@ -4692,8 +4772,8 @@ STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Max. pr
STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Masa: {LTBLUE}{WEIGHT_SHORT} {BLACK}Moc: {LTBLUE}{POWER}{BLACK} Prędkość maksymalna: {LTBLUE}{VELOCITY}
STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Masa: {LTBLUE}{WEIGHT_SHORT} {BLACK}Moc: {LTBLUE}{POWER}{BLACK} Prędkość maksymalna: {LTBLUE}{VELOCITY} {BLACK}Maksymalna siła pociągowa: {LTBLUE}{FORCE}
-STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Zysk w tym roku: {LTBLUE}{CURRENCY_LONG} (ostatni rok: {CURRENCY_LONG})
-STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Zysk w tym roku: {LTBLUE}{CURRENCY_LONG} (ostatni rok: {CURRENCY_LONG}) {BLACK}Min. wydajność: {LTBLUE}{POWER_TO_WEIGHT}
+STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Zysk w tym roku: {LTBLUE}{CURRENCY_LONG} (poprzedni rok: {CURRENCY_LONG})
+STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Zysk w tym roku: {LTBLUE}{CURRENCY_LONG} (poprzedni rok: {CURRENCY_LONG}) {BLACK}Min. wydajność: {LTBLUE}{POWER_TO_WEIGHT}
STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Niezawodność: {LTBLUE}{COMMA}% {BLACK}Awarie od ostatniego serwisowania: {LTBLUE}{COMMA}
STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Zakupiony: {LTBLUE}{NUM}{BLACK} Wartość: {LTBLUE}{CURRENCY_LONG}
@@ -4747,7 +4827,7 @@ STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Nowa ła
STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}Nowa ładowność: {GOLD}{CARGO_LONG}{}{BLACK}Przychód z przebudowy: {GREEN}{CURRENCY_LONG}
STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Nowa ładowność: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Koszt przebudowy: {RED}{CURRENCY_LONG}
STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Nowa ładowność: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Przychód z przebudowy: {GREEN}{CURRENCY_LONG}
-STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Wybierz pojazdy do przebudowania. Przeciągając myszkę można wybierać więcej pojazdów. Klikając na puste pole zaznaczysz cały pojazd. Ctrl+klik zaznaczy pojazd i dołączony skład
+STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Wybierz pojazdy/wagony do przebudowania. Klik+przeciągnięcie zaznacza wiele pojazdów/wagonów. Kliknięcie na puste pole zaznacza cały pojazd. Ctrl+klik zaznacza pojazd/wagon i następne aż do ostatniego
###length VEHICLE_TYPES
STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Wybierz jaki ładunek ma przewozić pociąg
@@ -4774,6 +4854,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Otwórz
STR_ORDERS_LIST_TOOLTIP :{BLACK}Lista poleceń - kliknij na poleceniu, aby zaznaczyć. Ctrl+klik przenosi do stacji docelowej
STR_ORDER_INDEX :{COMMA}:{NBSP}
+STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING}
STR_ORDERS_END_OF_ORDERS :- - Koniec poleceń - -
STR_ORDERS_END_OF_SHARED_ORDERS :- - Koniec współdzielonych poleceń - -
@@ -4811,6 +4892,14 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Zawsze do
STR_ORDER_DROP_SERVICE_DEPOT :Serwisuj jeśli trzeba
STR_ORDER_DROP_HALT_DEPOT :Zatrzymaj
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Wybierz akcję do wykonania w tych warsztatach
+STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Wybierz akcję do wykonania w tej zajezdni
+STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Wybierz akcję do wykonania w tej stoczni
+STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Wybierz akcję do wykonania w tym hangarze
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dane pojazdu wykorzystane w warunku
# Conditional order variables, must follow order of OrderConditionVariable enum
@@ -4852,7 +4941,7 @@ STR_ORDER_GO_TO_NEAREST_DEPOT :Idź do najbli
STR_ORDER_GO_TO_NEAREST_HANGAR :Leć do najbliższego hangaru
STR_ORDER_CONDITIONAL :Warunkowy skok poleceń
STR_ORDER_SHARE :Współdzielenie poleceń
-STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Dodaj nowe polecenie na końcu listy lub przed zaznaczonym poleceniem. Ctrl ustawi polecenie stacji na „pełny załadunek któregoś z towarów”, posterunku na „bez zatrzymywania się”, a zajezdni na „serwisuj”. Kliknięcie innego pojazdu kopiuje jego polecenia. „Współdzielenie poleceń” lub Ctrl+klik pozwala na współdzielenie z nim poleceń. Polecenie zajezdni wyłącza automatyczne serwisowanie tego pojazdu
+STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Dodaj nowe polecenie na końcu listy lub przed zaznaczonym poleceniem. Ctrl+klik ustawia polecenie stacji na „pełny załadunek któregoś z towarów”, posterunku na „bez zatrzymywania się”, a zajezdni na „serwisuj”. Kliknięcie innego pojazdu kopiuje jego polecenia, a Ctrl+klik pozwala na współdzielenie z nim poleceń. Polecenie do zajezdni wyłącza automatyczne serwisowanie tego pojazdu
STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Pokaż wszystkie pojazdy współdzielące te polecenia
@@ -5081,6 +5170,8 @@ STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Game Script
STR_AI_SETTINGS_CLOSE :{BLACK}Zamknij
STR_AI_SETTINGS_RESET :{BLACK}Resetuj
STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING}
+STR_AI_SETTINGS_SETTING_DEVIATION :{STRING}: {ORANGE}[{STRING}, {STRING}]
+STR_AI_SETTINGS_JUST_DEVIATION :[{STRING}, {STRING}]
# Textfile window
@@ -6050,6 +6141,7 @@ STR_COMPANY_SOMEONE.n :kimś
STR_COMPANY_SOMEONE.m :kimś
STR_COMPANY_SOMEONE.w :ktoś
+STR_SAVEGAME_DURATION_REALTIME :{NUM}h {NUM}min
STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING}
STR_SAVEGAME_NAME_SPECTATOR :Obserwator, {1:STRING}
@@ -6083,6 +6175,10 @@ STR_TOWN_NAME :{TOWN}
STR_VEHICLE_NAME :{VEHICLE}
STR_WAYPOINT_NAME :{WAYPOINT}
+STR_CURRENCY_SHORT_KILO :{NBSP}k
+STR_CURRENCY_SHORT_MEGA :{NBSP}M
+STR_CURRENCY_SHORT_GIGA :{NBSP}G
+STR_CURRENCY_SHORT_TERA :{NBSP}T
STR_JUST_CARGO :{CARGO_LONG}
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}
diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt
index a9081a16f1..46bff439e3 100644
--- a/src/lang/portuguese.txt
+++ b/src/lang/portuguese.txt
@@ -402,14 +402,14 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Mostrar
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Mostrar lista de aeronaves da empresa. Ctrl+Clique alterna entre abrir a lista de grupos/veículos
STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Ampliar
STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Reduzir
-STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construir caminhos-de-ferro
+STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construir infraestrutura ferroviária
STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Construir infraestrutura rodoviária
STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Construir carris para elétricos
STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Construir docas para navios
STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Construir aeroportos
STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Abra a barra de modelação ambiental para elevar ou baixar terreno, plantar árvores, etc.
STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Mostrar janela som/música
-STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Mostrar a última mensagem/notícia, histórico de mensagens ou eliminar todas as mensagens
+STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Abrir a última mensagem/notícia, histórico de mensagens ou eliminar todas as mensagens
STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Informações do terreno, captura de ecrã, sobre o OpenTTD e ferramentas de desenvolvedor
STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR :{BLACK}Trocar barras de ferramentas
@@ -428,7 +428,7 @@ STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Construi
STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Construção de carris para elétricos
STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Plantar árvores. "Ctrl" seleciona a área na diagonal. "Shift" alterna construir/mostrar custo estimado
STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Colocar sinais
-STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Colocar objeto. Ctrl seleciona a área diagonalmente. Shift alterna construir/mostrar custo estimado
+STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Colocar objeto. Ctrl+Clique+Arrastar para selecionar a área diagonalmente. Pressione também Shift para mostrar o custo estimado
# Scenario editor file menu
###length 7
@@ -720,10 +720,10 @@ STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLA
STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Programa - '{STRING}'
STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Limpar
STR_PLAYLIST_CHANGE_SET :{BLACK}Mudar conjunto
-STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Limpar programa actual (somente Personaliz. 1 ou Personaliz. 2)
+STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Limpar programa atual (apenas Personalizado 1 ou Personalizado 2)
STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Mudar selecção musical para outro conjunto instalado
-STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Clique na faixa de música para a adicionar ao programa actual (somente Personaliz. 1 ou Personaliz. 2)
-STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Faça clique numa faixa para a remover da lista (Personaliz. 1 ou Personaliz. 2 apenas)
+STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Clique na faixa de música para a adicionar ao programa atual (apenas Personalização 1 ou Personalização 2)
+STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Clique numa faixa para a remover da lista (apenas Personalização 1 ou Personalização 2)
# Highscore window
STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Melhores empresas
@@ -814,7 +814,7 @@ STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Mostrar
STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Mostrar a última mensagem ou notícia
STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - -
STR_STATUSBAR_PAUSED :{YELLOW}* * EM PAUSA * *
-STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * EM PAUSA (aguardando pela atualização do gráfico de links) * *
+STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * EM PAUSA (em espera pela atualização do gráfico de ligações) * *
STR_STATUSBAR_AUTOSAVE :{RED}AUTOGUARDADO
STR_STATUSBAR_SAVING_GAME :{RED}* * A GUARDAR JOGO * *
@@ -1305,7 +1305,7 @@ STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Custos de const
STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Configurar o nível de construção e custos de compra
STR_CONFIG_SETTING_RECESSIONS :Recessões: {STRING}
-STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Se ativo, podem ocorrer recessões em intervalos de poucos anos. Durante uma recessão a produção em geral é mais baixa (volta aos níveis anteriores quando termina)
+STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Se ativo, podem ocorrer recessões periodicamente. Durante uma recessão a produção em geral é mais baixa (e regressa aos níveis anteriores quando termina a recessão)
STR_CONFIG_SETTING_TRAIN_REVERSING :Desabilitar inversão de combóios nas estações: {STRING}
STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Quando ativo, os comboios não podem inverter marcha em estações não-terminais, mesmo se existir um caminho mais curto para o próximo destino ao inverter
@@ -1921,7 +1921,7 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Ao arrastar, co
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Define a distância a que os sinais serão construídos num carril até ao próximo obstáculo (sinal, junção), se os sinais são arrastados
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} quadrado{P 0 "" s}
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Ao arrastar, manter distância fixa entre sinais: {STRING}
-STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Selecionar o comportamento da colocação de sinais ao usar Ctrl+arrasto. Se desativado, os sinais são colocados à volta de túneis ou pontes para evitar longos trajetos sem sinais. Se ativo, os sinais são colocados a cada N mosaicos, facilitando o alinhamento de sinais em linhas paralelas
+STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Selecionar o comportamento da colocação de sinais ao arrastar os sinais. Se desativado, os sinais são colocados à volta de túneis ou pontes para evitar longos trajetos sem sinais. Se ativo, os sinais são colocados a cada N mosaicos, facilitando o alinhamento de sinais em linhas paralelas
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Usar automaticamente sinais clássicos antes de: {STRING}
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Configurar o ano em que sinais eléctricos podem ser usados para os carris. Antes deste ano, sinais não-eléctricos serão usados (que têm a mesma funcionalidade, mas aspecto diferente)
@@ -1929,6 +1929,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Configurar o an
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Trocar tipos de faróis: {STRING}
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Selecione os tipos de sinais a percorrer ao usar Ctrl+clique num sinal com a ferramenta de sinais
###length 2
+STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Apenas grupo atual
STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Todos visíveis
STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Mostrar tipos de sinais: {STRING}
@@ -2623,7 +2624,7 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :número de joga
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :a ligar clientes
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :manual
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :script de jogo
-STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :esperando pela atualização do gráfico de links
+STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :Em espera pela atualização do gráfico de ligações
STR_NETWORK_MESSAGE_CLIENT_LEAVING :a sair
STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} entrou no jogo
@@ -2869,16 +2870,16 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Construi
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Construir secção de carris para elétricos. Ctrl alterna a construção/remoção de carris para elétricos. Shift alterna construir/mostrar custo estimado
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Construir estradas usando o modo automático. Ctrl alterna a construção/remoção de estradas. Shift alterna construir/mostrar custo estimado
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Construir carris para elétricos usando o modo automático. Ctrl alterna a construção/remoção de carris para elétricos. Shift alterna construir/mostrar custo estimado
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Construir garagem rodoviária (para compra e manutenção de veículos rodoviários). Shift alterna construir/mostrar custo estimado
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Construir garagem rodoviária (para compra e manutenção de veículos rodoviários). Pressione também Shift para apenas mostrar o custo estimado
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Construir garagem para elétricos (para compra e manutenção). Shift alterna construir/mostrar custo estimado
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Construir estação de autocarros. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Construir paragem de elétricos para passageiros. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Construir estação de camiões. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Construir estação de camiões. Ctrl+Clique para selecionar outra estação para se unir. Pressione também Shift para mostrar o custo estimado
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Construir paragem de elétricos para carga. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Ativar/Desativar estradas de sentido único
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Construir ponte rodoviária. Shift alterna construir/mostrar custo estimado
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Construir ponte para elétricos. Shift alterna construir/mostrar custo estimado
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Construir túnel rodoviário. Shift alterna construir/mostrar custo estimado
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Construir túnel rodoviário. Pressione também Shift para mostrar apenas o custo estimado
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Construir túnel para elétricos. Shift alterna construir/mostrar custo estimado
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Alternar entre construir/remover estradas
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Alternar construir/remover linhas de eléctricos e sinais
@@ -2910,7 +2911,7 @@ STR_WATERWAYS_TOOLBAR_CAPTION_SE :{WHITE}Canais
STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Construir canais. Shift alterna construção/estimativa de custos
STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Construir eclusas. Shift alterna construir/mostrar custo estimado
STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Construir estaleiro naval (para compra e manutenção de navios). Shift alterna construir/mostrar custo estimado
-STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Construir doca naval. Ctrl permite juntar estações. Shift alterna construir/mostar custo estimado
+STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Construir doca naval. Ctrl+Clique para selecionar outra estação para se juntar. Pressione também Shift para mostrar apenas o custo estimado
STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Esta bóia de posição pode ser usada para marcar pontos de rota adicionais. Shift alterna construção/mostra de custos estimados
STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Construir aqueduto. Shift alterna construir/mostrar custo estimado
STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Definir área de água.{}Construir um canal, a não ser que a tecla Ctrl esteja pressionada a nível do mar, nesse caso inundará as zonas circundantes
@@ -3311,11 +3312,11 @@ STR_MAPGEN_VARIETY :{BLACK}Variedad
STR_MAPGEN_GENERATE :{WHITE}Gerar
STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Criar o mapa e jogar OpenTTD!
STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Definições de NewGRF
-STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Mostrar definições de NewGRF
+STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Abrir definições de NewGRF
STR_MAPGEN_AI_SETTINGS :{BLACK}Definições de IA
STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Mostrar definições de IA
STR_MAPGEN_GS_SETTINGS :{BLACK}Definições de Script de Jogo
-STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Mostrar definições de script de jogo
+STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Abrir definições de script de jogo
###length 21
STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Inglês
@@ -3935,7 +3936,7 @@ STR_INDUSTRY_DIRECTORY_ITEM_PROD1 :{ORANGE}{INDUST
STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUSTRY} {STRING}, {STRING}
STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING}
STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} e mais {NUM} ...
-STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Nomes de indústrias - clique no nome para centrar-se na indústria. Ctrl+Clique abre um novo visualizador na localização da indústria
+STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Nomes de indústrias - clique no nome para centrar a visualização na indústria. Ctrl+Clique para abrir um novo visualizador na localização da indústria
STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Carga aceite: {SILVER}{STRING}
STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}Carga produzida: {SILVER}{STRING}
STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :Todos os tipos de carga
@@ -4091,7 +4092,7 @@ STR_CARGO_TYPE_FILTER_NONE :Nenhum
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista de veículos ferroviários - clique num veículo para informações
STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Lista de veículos rodoviários - clique num veículo para informações
-STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Lista de selecção de barcos. Clique num navio para informações. Ctrl+Clique para alternar/ocultar o tipo de barco
+STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Lista de seleção de navios. Clique num navio para informações. Ctrl+Clique para mostrar/ocultar este tipo de navio
STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lista de aeronaves - clique na aeronave para informações
###length VEHICLE_TYPES
@@ -4166,7 +4167,7 @@ STR_DEPOT_VEHICLE_TOOLTIP_CHAIN :{BLACK}{NUM} ve
STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG} ({CARGO_SHORT})
###length VEHICLE_TYPES
-STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Comboios - arraste o veículo com o botão esquerdo do rato para acrescentar/retirar do comboio; clique com o botão direito para informações. Pressionando a tecla Ctrl aplica ambas as funções à cadeia seguinte
+STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Comboios - arraste o veículo com o botão esquerdo do rato para acrescentar/retirar do comboio; clique com o botão direito para informações. Ctrl+Clique para aplicar ambas as funções à cadeia seguinte
STR_DEPOT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Veículos - clique com o botão direito num veículo para informações
STR_DEPOT_SHIP_LIST_TOOLTIP :{BLACK}Navios - clique com o botão direito num navio para informações
STR_DEPOT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Aeronave - Clique com o botão direito na aeronave para informações
@@ -4214,7 +4215,7 @@ STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Esta aç
STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Esta ação irá comprar uma cópia de uma aeronave. Clique neste botão e de seguida, numa aeronave que se encontre dentro ou fora do hangar. Ctrl+Clique irá partilhar as ordens. Shift+Clique mostra a estimativa de custo, sem comprar
###length VEHICLE_TYPES
-STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Centrar visualização na localização do depósito ferroviário. Ctrl+Clique abre um novo visualizador na localização do depósito ferroviário
+STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Centrar visualização na localização do depósito ferroviário. Ctrl+Clique para abrir um novo visualizador na localização do depósito ferroviário
STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Centrar visualização na localização da garagem de veículos rodoviários. Ctrl+Clique abre um novo visualizador na localização da garagem
STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Centrar visualização na localização do estaleiro naval. Ctrl+Clique abre um novo visualizador na localização do estaleiro naval
STR_DEPOT_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Centrar visualização na localização do hangar. Ctrl+Clique abre um novo visualizador na localização do hangar
@@ -4331,7 +4332,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_CENTER_TOOLTIP :{BLACK} Central
###length VEHICLE_TYPES
STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar comboio para o depósito. Ctrl+Clique fará apenas manutenção
STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar veículo para a garagem. Ctrl+Clique fará apenas manutenção
-STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar navio para o estaleiro. Ctrl+Clique fará apenas manutenção
+STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar navio para o estaleiro. Ctrl+Clique para fazer apenas manutenção
STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar aeronave para o hangar. Ctrl+Clique fará apenas manutenção
###length VEHICLE_TYPES
@@ -4343,7 +4344,7 @@ STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Esta aç
STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}Forçar comboio a prosseguir sem esperar pelo sinal
STR_VEHICLE_VIEW_TRAIN_REVERSE_TOOLTIP :{BLACK}Inverter direcção do comboio
STR_VEHICLE_VIEW_ROAD_VEHICLE_REVERSE_TOOLTIP :{BLACK}Forçar veículo a dar a volta
-STR_VEHICLE_VIEW_ORDER_LOCATION_TOOLTIP :{BLACK}Centrar visualização no destino da ordem. Ctrl+Clique abre um novo visualizador na localização do destino da ordem
+STR_VEHICLE_VIEW_ORDER_LOCATION_TOOLTIP :{BLACK}Centrar visualização no destino da ordem. Ctrl+Clique para abrir um novo visualizador na localização do destino da ordem
###length VEHICLE_TYPES
STR_VEHICLE_VIEW_TRAIN_REFIT_TOOLTIP :{BLACK}Converter comboio para transportar outro tipo de carga
@@ -4372,6 +4373,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Ação a
# Messages in the start stop button in the vehicle view
STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}A carregar / descarregar
STR_VEHICLE_STATUS_LEAVING :{LTBLUE}A partir
+STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}Em espera por desagrupar
STR_VEHICLE_STATUS_CRASHED :{RED}Acidentado!
STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}Avariado
STR_VEHICLE_STATUS_STOPPED :{RED}Parado
@@ -4385,6 +4387,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}Sem ord
STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Dirige-se a {WAYPOINT}, {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}Dirige-se para {DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Manutenção em {DEPOT}, {VELOCITY}
+STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}Desagrupar e efetuar manutenção em {DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}Não é possível chegar a {STATION}, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}Não é possível chegar a {WAYPOINT}, {VELOCITY}
@@ -4551,6 +4554,11 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :Mercadoria disp
STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ir sempre
STR_ORDER_DROP_SERVICE_DEPOT :Manutenção, se necessária
STR_ORDER_DROP_HALT_DEPOT :Parar
+STR_ORDER_DROP_UNBUNCH :Desagrupar
+
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dados de veículo para ida à base
@@ -4619,6 +4627,7 @@ STR_ORDER_REFIT_ORDER :(Adaptar para {
STR_ORDER_REFIT_STOP_ORDER :(Adaptar para {STRING} e parar)
STR_ORDER_STOP_ORDER :(Parar)
+STR_ORDER_WAIT_TO_UNBUNCH :(esperar por desagrupar)
STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING}
STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Não pode usar a estação){POP_COLOUR} {STRING} {STATION} {STRING}
@@ -4823,6 +4832,7 @@ STR_AI_SETTINGS_CLOSE :{BLACK}Fechar
STR_AI_SETTINGS_RESET :{BLACK}Repor
STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING}
STR_AI_SETTINGS_SETTING_DEVIATION :{STRING}: {ORANGE}[{STRING}, {STRING}]
+STR_AI_SETTINGS_JUST_DEVIATION :[{STRING}, {STRING}]
# Textfile window
@@ -5089,6 +5099,11 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Não é
STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Tipo de depósito errado
# Depot unbunching related errors
+STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}... só pode ter uma ordem de desagrupar
+STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}... não é possível usar ordens de carga completa quando o veículo tem uma ordem de desagrupar
+STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}... não é possível desagrupar um veículo com ordem de carga completa
+STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}... não é possível usar ordens condicionais quando um veículo tem uma ordem de desagrupar
+STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}... não é possível desagrupar um veículo com uma ordem condicional
# Autoreplace related errors
STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} é muito longo depois de substituído
diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt
index 9466182fec..7c9137a9a9 100644
--- a/src/lang/romanian.txt
+++ b/src/lang/romanian.txt
@@ -4416,6 +4416,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Merge mereu
STR_ORDER_DROP_SERVICE_DEPOT :Service dacă este nevoie
STR_ORDER_DROP_HALT_DEPOT :Stop
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Datele vehiculului pe care se bazează
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/russian.txt b/src/lang/russian.txt
index 697b17954f..02ee735444 100644
--- a/src/lang/russian.txt
+++ b/src/lang/russian.txt
@@ -1074,6 +1074,7 @@ STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLAC
STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Компания «{STRING}» получает субсидию!{}{}Перевозка {STRING.gen} по маршруту {STRING} - {STRING} будет оплачиваться в четырёхкратном размере в течение {UNITS_YEARS_OR_MINUTES}!
STR_NEWS_ROAD_REBUILDING_MONTHS :{BIG_FONT}{BLACK}Хаос на дорогах г.{NBSP}{TOWN}!{}{}Реконструкция дорожной сети, профинансированная компанией «{STRING}», принесёт водителям полгода страданий!
+STR_NEWS_ROAD_REBUILDING_MINUTES :{BIG_FONT}{BLACK}Хаос на дорогах г.{NBSP}{TOWN}!{}{}Реконструкция дорожной сети, профинансированная компанией «{STRING}», принесёт водителям 6{NBSP}минут страданий!
STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Транспортный монополист!
STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MONTHS :{BIG_FONT}{BLACK}Администрация г.{NBSP}{TOWN} предоставила компании «{STRING}» эксклюзивные транспортные права сроком на 12 месяцев!
STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MINUTES :{BIG_FONT}{BLACK}Администрация г.{NBSP}{TOWN} предоставила компании «{STRING}» эксклюзивные транспортные права сроком на 12 минут!
@@ -1577,7 +1578,7 @@ STR_CONFIG_SETTING_BRIBE_HELPTEXT_MINUTES :Позволя
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Разрешить покупать эксклюзивные транспортные права: {STRING}
###length 2
-STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Если компания покапает эксклюзивные транспортные права, то на станции конкурентов не будет поступать груз и не будут приходить пассажиры в течение года
+STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Если компания покапает эксклюзивные транспортные права, то на станции конкурентов не будет поступать груз и не будут приходить пассажиры в течение 12{NBSP}месяцев
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT_MINUTES :Если компания покапает эксклюзивные транспортные права, то на станции конкурентов не будет поступать груз и не будут приходить пассажиры в течение 12{NBSP}минут.
STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Разрешить финансирование строительства зданий: {STRING}
@@ -1636,7 +1637,8 @@ STR_CONFIG_SETTING_ORDER_REVIEW_ON :у всех
STR_CONFIG_SETTING_WARN_INCOME_LESS :Предупреждать, если доход ТС отрицателен: {STRING}
###length 2
-STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Включает сообщения о транспортых средствах, не принёсших прибыли по итогам прошедшего года
+STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Включает сообщения о транспортных средствах, не принёсших прибыли по итогам прошедшего года.
+STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT_PERIOD :Включает сообщения о транспортных средствах, не принёсших прибыли по итогам прошедшего цикла.
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Транспорт не будет выходить из эксплуатации: {STRING}
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :При включении все транспортные средства остаются доступными для покупки в любое время после начала их производства
@@ -2079,6 +2081,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Год, нач
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Выбор сигналов (Ctrl+щелчок): {STRING}
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Выбор предлагаемых типов сигналов при их модификации с помощью Ctrl+щелчка по установленному сигналу
###length 2
+STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Только текущая группа
STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :все отображаемые
STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Типы сигналов в панели строительства: {STRING}
@@ -2968,7 +2971,7 @@ STR_RAIL_NAME_MAGLEV.n :Магнитн
# Rail depot construction window
STR_BUILD_DEPOT_TRAIN_ORIENTATION_CAPTION :{WHITE}Направление депо
-STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP :{BLACK}Выбор направления депо
+STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP :{BLACK}Выбор ориентации депо
# Rail waypoint construction window
STR_WAYPOINT_CAPTION :{WHITE}Точка пути
@@ -2977,7 +2980,7 @@ STR_WAYPOINT_GRAPHICS_TOOLTIP :{BLACK}Выбо
# Rail station construction window
STR_STATION_BUILD_RAIL_CAPTION :{WHITE}Выбор ж/д станции
STR_STATION_BUILD_ORIENTATION :{BLACK}Направление
-STR_STATION_BUILD_RAILROAD_ORIENTATION_TOOLTIP :{BLACK}Выберите направление ж/д станции
+STR_STATION_BUILD_RAILROAD_ORIENTATION_TOOLTIP :{BLACK}Выберите ориентацию ж/д станции
STR_STATION_BUILD_NUMBER_OF_TRACKS :{BLACK}Количество путей
STR_STATION_BUILD_NUMBER_OF_TRACKS_TOOLTIP :{BLACK}Укажите количество платформ ж/д станции
STR_STATION_BUILD_PLATFORM_LENGTH :{BLACK}Длина платформы
@@ -3066,13 +3069,13 @@ STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP :{BLACK}Выбо
# Road vehicle station construction window
STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Направление остановки
-STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP :{BLACK}Выберите направление остановки
+STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP :{BLACK}Выберите ориентацию остановки
STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Ориентация терминала
STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Выберите направление грузового терминала
STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Направление пассажирской трамвайной остановки
STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Выберите направление пассажирской трамвайной остановки
STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Направление грузовой трамвайной остановки
-STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Выберите направление грузовой трамвайной остановки
+STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Выберите ориентацию грузовой трамвайной станции
# Waterways toolbar (last two for SE only)
STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Судоходные коммуникации
@@ -3088,7 +3091,7 @@ STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Созд
# Ship depot construction window
STR_DEPOT_BUILD_SHIP_CAPTION :{WHITE}Направление дока
-STR_DEPOT_BUILD_SHIP_ORIENTATION_TOOLTIP :{BLACK}Выберите направление дока
+STR_DEPOT_BUILD_SHIP_ORIENTATION_TOOLTIP :{BLACK}Выберите ориентацию дока
# Dock construction window
STR_STATION_BUILD_DOCK_CAPTION :{WHITE}Пристань
@@ -4701,6 +4704,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Пока
STR_ORDERS_LIST_TOOLTIP :{BLACK}Список заданий - щёлкните задание для выделения. Ctrl+щелчок - обзор станции назначения.
STR_ORDER_INDEX :{COMMA}:{NBSP}
+STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING}
STR_ORDERS_END_OF_ORDERS :- - Конец заданий - -
STR_ORDERS_END_OF_SHARED_ORDERS :- - Конец общих заданий - -
@@ -4738,6 +4742,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Всегда
STR_ORDER_DROP_SERVICE_DEPOT :Если требуется
STR_ORDER_DROP_HALT_DEPOT :Стоп
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Параметр транспорта для сравнения
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt
index c9c85f1841..795a880397 100644
--- a/src/lang/serbian.txt
+++ b/src/lang/serbian.txt
@@ -4520,6 +4520,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Uvek
STR_ORDER_DROP_SERVICE_DEPOT :Servis po potrebi
STR_ORDER_DROP_HALT_DEPOT :Zaustavljanje
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Skok na osnovu podatka o vozilu
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt
index dcfd3150b3..3f100d7136 100644
--- a/src/lang/simplified_chinese.txt
+++ b/src/lang/simplified_chinese.txt
@@ -1308,7 +1308,7 @@ STR_CONFIG_SETTING_CONSTRUCTION_COSTS :建设费用: {
STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :设定建造的成本水平。
STR_CONFIG_SETTING_RECESSIONS :经济衰退: {STRING}
-STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :启用后,经济衰退将每隔几年就出现。在衰退期内,所有产出将大幅下降直至衰退结束。
+STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :启用时,经济衰退将每隔几经济周期发生一次。经济衰退时所有工业货物产量都将大幅下降,直至衰退结束为止。
STR_CONFIG_SETTING_TRAIN_REVERSING :禁止列车在站台调头: {STRING}
STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :启用后,如果列车有到下一站的捷径,列车将不在非终点站台调头,
@@ -1429,8 +1429,8 @@ STR_CONFIG_SETTING_BRIBE_HELPTEXT_MINUTES :允许公司尝
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :允许买断经营权: {STRING}
###length 2
-STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :如果一家公司购买了城市独家经营权,其它公司的站台将在一年之内不再产生乘客或者货物。
-STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT_MINUTES :如果一家公司购买了城市独家经营权,其它公司的站台将在 12 分钟之内不再产生乘客或者货物。
+STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :如果一家公司购买了一座城镇的独家经营权,其他公司在此城镇的车站在十二个月之内将不会收到任何货物与乘客。
+STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT_MINUTES :如果一家公司购买了一座城镇的独家经营权,其他公司在此城镇的车站在 12 分钟之内将不会收到任何货物与乘客。
STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :允许资助城镇建设: {STRING}
STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :“打开”时,允许公司提供资助新建房屋
@@ -1516,11 +1516,11 @@ STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}%
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :当车辆报废时自动更新:{STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :“打开”时,车辆在临近它的报废期限时自动更新
-STR_CONFIG_SETTING_AUTORENEW_MONTHS :当车辆还有 {STRING} 到达最大年限时自动更新
+STR_CONFIG_SETTING_AUTORENEW_MONTHS :自动替换年龄到达使用期限{STRING}的载具。
STR_CONFIG_SETTING_AUTORENEW_MONTHS_HELPTEXT :设置车辆自动更新的时间
###length 2
-STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_BEFORE :{COMMA} 个月前
-STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_AFTER :{COMMA} 个月后
+STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_BEFORE :前 {COMMA} 个月
+STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_AFTER :后 {COMMA} 个月
STR_CONFIG_SETTING_AUTORENEW_MONEY :启动自动更新需要的最少现金:{STRING}
STR_CONFIG_SETTING_AUTORENEW_MONEY_HELPTEXT :启动自动更新车辆时需要保留的最少现金
@@ -1830,7 +1830,7 @@ STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES :汽车默认保
STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES_HELPTEXT :如果没有为汽车指定保养周期,设定汽车的默认保养周期
STR_CONFIG_SETTING_SERVINT_AIRCRAFT :飞机默认保养周期:{STRING}
STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :如果没有为飞机指定保养周期,设定飞机的默认保养周期
-STR_CONFIG_SETTING_SERVINT_SHIPS :船只的默认保养周期:{STRING}
+STR_CONFIG_SETTING_SERVINT_SHIPS :船只默认保养周期:{STRING}
STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :如果没有为船只设定保养周期,按照这里设定的默认保养周期执行
STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}日 / 分钟 / %
###setting-zero-is-special
@@ -1932,6 +1932,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :设置电子信
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :在以下信号类型中循环: {STRING}
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :选择用Ctrl+点击的方式切换信号灯类型时的备选类型
###length 2
+STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :仅当前信号组
STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :全部可见
STR_CONFIG_SETTING_SIGNAL_GUI_MODE :显示信号类型: {STRING}
@@ -2208,7 +2209,7 @@ STR_INTRO_TOOLTIP_HELP :{BLACK}获取
STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}显示设置
STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}显示 NewGRF 设定
STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}连接服务器并查找扩展包
-STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}显示AI设置
+STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}显示 AI 设置
STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}显示游戏脚本设置
STR_INTRO_TOOLTIP_QUIT :{BLACK}退出 'OpenTTD'
@@ -2660,9 +2661,9 @@ STR_CONTENT_SELECT_UPDATES_CAPTION_TOOLTIP :{BLACK}更新
STR_CONTENT_UNSELECT_ALL_CAPTION :{BLACK}取消全选
STR_CONTENT_UNSELECT_ALL_CAPTION_TOOLTIP :{BLACK}取消全部选择
STR_CONTENT_SEARCH_EXTERNAL :{BLACK}在外部网站搜索
-STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}在与OpenTTD没有联系的网站搜寻没有纳入OpenTTD內容服务的內容
+STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}在与 OpenTTD 没有联系的网站搜寻没有纳入 OpenTTD 內容服务的內容
STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}正在离开游戏!
-STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}在外部网站下载內容的规则及条款可能跟OpenTTD引用的规则及条款不同。{}您需要参照有关网站以取得在OpenTTD安装有关內容的资讯。{}您要継续吗?
+STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}在外部网站下载內容的规则及条款可能跟 OpenTTD 引用的规则及条款不同。{}您需要参照有关网站以取得在 OpenTTD 安装有关內容的资讯。{}您要継续吗?
STR_CONTENT_FILTER_TITLE :{BLACK}标签/名称过滤器
STR_CONTENT_OPEN_URL :{BLACK}主页
STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}打开该扩展包主页
@@ -2829,7 +2830,7 @@ STR_STATION_CLASS_WAYP_WAYPOINT :默认路点
# Signal window
STR_BUILD_SIGNAL_CAPTION :{WHITE}信号选择
-STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}选择是否显示高级信号灯类型
+STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}切换显示逻辑信号机
STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}通过信号灯(悬臂){}是最基本的信号灯,只允许一列车进入该信号灯以后的区间
STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}入口信号灯(悬臂){}在下一轨道区间上至少有一个出口信号灯是绿色时此信号亮绿灯,否则亮红灯
STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}出口信号灯(悬臂){}信号显示条件与通过信号灯相同,但是它的状态可以触发入口及复合信号灯
@@ -2842,7 +2843,7 @@ STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}出口
STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}复合信号(电子){}复合信号灯是入口和出口信号灯的组合,这样允许建立大型“树状”预警信号灯系统
STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}路径信号灯(电子){}路径信号灯为列车预留一条到安全停车位的路径,而其它路径仍然可以使用,从而允许一列以上的列车同时进入一个信号区间
STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}单向路径信号灯(电子){}路径信号灯为列车预留一条到安全停车位的路径,而其它路径仍然可以使用,从而允许一列以上的列车同时进入一个信号区间
-STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}信号转换工具{}按下此按钮,可以将已存在的信号转化为选择的信号类型,按下Ctrl键单击,可以在电子信号和悬臂信号之间转换。按住Shift键单击显示预估成本。
+STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}信号转换{}使用此工具时可以将现有的信号机转换成选择的信号种类及风格。按住 键单击以仅在灯式/悬臂式之间切换。按住 键单击以显示预计费用。
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}拖拽布置信号灯的间隔距离
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}减少拖拽布置信号的间隔距离
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}增加拖拽布置信号灯的间隔距离
@@ -2876,7 +2877,7 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}建设
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}建造电车车库(可以购买与维护车辆)
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}建设公共汽车站。按住 Ctrl 键允许合并站台
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}建设客运电车站。按住 Ctrl 键允许合并站台
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}建设汽车货场。按住 Ctrl 键允许合并站台
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}建设汽车货场。按住 键点击以合并站台,按住 键以显示预计费用。
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}建设货运电车站。按住 键单击以合并站台。按住 键以显示预计费用。
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}选择是否建设单行道
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}建设公路桥梁
@@ -2962,7 +2963,7 @@ STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}购买
# Object construction window
STR_OBJECT_BUILD_CAPTION :{WHITE}物体选单
-STR_OBJECT_BUILD_TOOLTIP :{BLACK}选择建设项目.。按住Ctrl可沿对角线选择区域。按住Shift键建设可以显示建设费用
+STR_OBJECT_BUILD_TOOLTIP :{BLACK}选择要建设的物体。按住 键以沿对角线建设,按住 键操作以显示预计成本。
STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}选择要建造的物件类型
STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}物件预览
STR_OBJECT_BUILD_SIZE :{BLACK}大小: {GOLD}{NUM} x {NUM} 瓦
@@ -3312,11 +3313,11 @@ STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}河流
STR_MAPGEN_SMOOTHNESS :{BLACK}平滑程度:
STR_MAPGEN_VARIETY :{BLACK}多样地形:
STR_MAPGEN_GENERATE :{WHITE}生成
-STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}创建世界并开始游玩OpenTTD!
+STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}创建世界并开始游玩 OpenTTD!
STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF设置
STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}显示 NewGRF 设置
STR_MAPGEN_AI_SETTINGS :{BLACK}AI 设置
-STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}显示AI设置
+STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}显示 AI 设置
STR_MAPGEN_GS_SETTINGS :{BLACK}游戏脚本设置
STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}显示游戏脚本设置
@@ -3762,7 +3763,7 @@ STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPAN
STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}评价
STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}显示车站评价
STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MONTH :{BLACK}每月供应数量与本地评价:
-STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MINUTE :每分钟供应量与本地评价:
+STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MINUTE :{BLACK}每分钟供应量与本地评价:
STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}: {YELLOW}{COMMA} / {STRING} ({COMMA}%)
STR_STATION_VIEW_GROUP :{BLACK}群组方式
@@ -4339,8 +4340,8 @@ STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}命令
###length VEHICLE_TYPES
STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}复制这列火车。按住 Ctrl 键单击可以同时共享调度计划,按住 Shift 键单击可以显示所需资金
-STR_VEHICLE_VIEW_CLONE_ROAD_VEHICLE_INFO :{BLACK}复制这辆汽车。按住 Ctrl 键单击可以同时共享调度计划,按住 Shift 键单击可以显示所需资金
-STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}复制这条船只。按住 Ctrl 键单击可以同时共享调度计划,按住 Shift 键单击可以显示所需资金
+STR_VEHICLE_VIEW_CLONE_ROAD_VEHICLE_INFO :{BLACK}复制这辆汽车。按住 键单击以共享调度计划,按住 键单击以显示预计费用。
+STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}复制这条船只。按住 键单击以共享调度计划,按住 键单击以显示所需资金。
STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}复制这架飞机。按住 Ctrl 键单击可以同时共享调度计划,按住 Shift 键单击可以显示所需资金
STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}命令列车强行通过信号
@@ -4375,6 +4376,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}当前
# Messages in the start stop button in the vehicle view
STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}装载/卸货
STR_VEHICLE_STATUS_LEAVING :{LTBLUE}发车
+STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}等待班次均匀发车时间
STR_VEHICLE_STATUS_CRASHED :{RED}已撞毁!
STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}抛锚
STR_VEHICLE_STATUS_STOPPED :{RED}停运
@@ -4388,6 +4390,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}没有
STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}正在前往{WAYPOINT},{VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}正在前往 {DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}正在服务于 {DEPOT}, {VELOCITY}
+STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}正前往 {DEPOT} 以维护与调节班次, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}不能到达 {STATION}, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}不能到达 {WAYPOINT}, {VELOCITY}
@@ -4518,6 +4521,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}切换
STR_ORDERS_LIST_TOOLTIP :{BLACK}调度列表{}单击一个调度指令以选定{}CTRL+左键{}将视点移动到相应的车站
STR_ORDER_INDEX :{COMMA}:{NBSP}
+STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING}
STR_ORDERS_END_OF_ORDERS :-- 调度计划结束 --
STR_ORDERS_END_OF_SHARED_ORDERS :- - 共享调度计划结束 - -
@@ -4528,21 +4532,21 @@ STR_ORDER_GO_TO :前往
STR_ORDER_GO_NON_STOP_TO :不停车前往
STR_ORDER_GO_VIA :经由
STR_ORDER_GO_NON_STOP_VIA :经由(不停车)
-STR_ORDER_TOOLTIP_NON_STOP :{BLACK}改变当前选中车站停车时的执行动作
+STR_ORDER_TOOLTIP_NON_STOP :{BLACK}修改当前指令在车站的停靠措施
STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}装满任意货物
STR_ORDER_DROP_LOAD_IF_POSSIBLE :若有的话就装载
STR_ORDER_DROP_FULL_LOAD_ALL :装满所有货物
STR_ORDER_DROP_FULL_LOAD_ANY :装满任意货物
STR_ORDER_DROP_NO_LOADING :不装载
-STR_ORDER_TOOLTIP_FULL_LOAD :{BLACK}改变当前选中车站装载时的执行动作
+STR_ORDER_TOOLTIP_FULL_LOAD :{BLACK}修改当前指令在车站的装载措施
STR_ORDER_TOGGLE_UNLOAD :{BLACK}卸载全部
STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :若接受的话就卸载
STR_ORDER_DROP_UNLOAD :卸载全部
STR_ORDER_DROP_TRANSFER :联运
STR_ORDER_DROP_NO_UNLOADING :不卸载
-STR_ORDER_TOOLTIP_UNLOAD :{BLACK}改变当前选中车站卸载时的执行动作
+STR_ORDER_TOOLTIP_UNLOAD :{BLACK}修改当前指令在车站的卸载措施
STR_ORDER_REFIT :{BLACK}改装
STR_ORDER_REFIT_TOOLTIP :{BLACK}选择要在调度计划中改装的货物类型{}CTRL+单击 可以去掉改装计划
@@ -4554,6 +4558,15 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :可用类型
STR_ORDER_DROP_GO_ALWAYS_DEPOT :一直前进
STR_ORDER_DROP_SERVICE_DEPOT :若需要则维护
STR_ORDER_DROP_HALT_DEPOT :停留
+STR_ORDER_DROP_UNBUNCH :班次均匀
+
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}选择在此车库采取的措施
+STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}选择在此车库采取的措施
+STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}选择在此船坞采取的措施
+STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}选择在此机库采取的措施
+###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}跳过所需的车辆数据值
@@ -4622,6 +4635,7 @@ STR_ORDER_REFIT_ORDER :(改装为 {STR
STR_ORDER_REFIT_STOP_ORDER :(改装为{STRING}并停留)
STR_ORDER_STOP_ORDER :(停留)
+STR_ORDER_WAIT_TO_UNBUNCH :(班次均匀)
STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING}
STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(不能使用车站){POP_COLOUR} {STRING} {STATION} {STRING}
@@ -4844,9 +4858,9 @@ STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :查看此项目
STR_TEXTFILE_VIEW_LICENCE :{BLACK}版权信息
STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :查看此项目的许可证
###length 5
-STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} {STRING} 的说明
+STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} {STRING} {WHITE}的说明
STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} {STRING} 的更新日志
-STR_TEXTFILE_LICENCE_CAPTION :{WHITE}{STRING} {STRING} 的版权信息
+STR_TEXTFILE_LICENCE_CAPTION :{WHITE}{STRING} {STRING} {WHITE}的版权信息
STR_TEXTFILE_SURVEY_RESULT_CAPTION :{WHITE}预览调查结果
STR_TEXTFILE_GAME_MANUAL_CAPTION :{WHITE}OpenTTD 文档 '{STRING}'
@@ -5093,6 +5107,11 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}在附
STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :车库类型错误
# Depot unbunching related errors
+STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}……载具只能有一项班次均匀命令
+STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}……不能对有班次均匀的载具应用满载命令
+STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}……不能对有满载命令的载具应用班次均匀
+STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}……不能对有班次均匀的载具应用条件性命令
+STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}……不能对有条件性命令的载具应用班次均匀
# Autoreplace related errors
STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE}在更新后总长会过长
diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt
index 34a211b4d0..1b19d1497c 100644
--- a/src/lang/slovak.txt
+++ b/src/lang/slovak.txt
@@ -4400,6 +4400,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Vždy choď
STR_ORDER_DROP_SERVICE_DEPOT :Servis, ak je potrebný
STR_ORDER_DROP_HALT_DEPOT :Zastav
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Údaje vozidla na základe ktorých sa vykoná skok
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt
index fd5e978eae..d89253cd40 100644
--- a/src/lang/slovenian.txt
+++ b/src/lang/slovenian.txt
@@ -3999,6 +3999,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Vedno pojdi
STR_ORDER_DROP_SERVICE_DEPOT :Servisiraj po potrebi
STR_ORDER_DROP_HALT_DEPOT :Stop
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Podatki vozila na osnovni preskok
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt
index e463f153c3..3b39c6293e 100644
--- a/src/lang/spanish.txt
+++ b/src/lang/spanish.txt
@@ -536,7 +536,7 @@ STR_ABOUT_MENU_ABOUT_OPENTTD :Acerca de 'Open
STR_ABOUT_MENU_SPRITE_ALIGNER :Alineador de sprites
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Activar cajas delimitadoras
STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Activar/Desactivar coloreado de bloques modificados
-STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES :Activar/desactivar los bordes de los "widgets"
+STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES :Activa/Desactiva los bordes de los "widgets"
###length 31
STR_DAY_NUMBER_1ST :1
@@ -758,9 +758,9 @@ STR_SMALLMAP_TOOLTIP_SHOW_LINK_STATS_ON_MAP :{BLACK}Muestra
STR_SMALLMAP_TOOLTIP_SHOW_TRANSPORT_ROUTES_ON :{BLACK}Muestra las rutas de transporte en el mapa
STR_SMALLMAP_TOOLTIP_SHOW_VEGETATION_ON_MAP :{BLACK}Muestra la vegetación en el mapa
STR_SMALLMAP_TOOLTIP_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Muestra los propietarios de terreno en el mapa
-STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Haz clic en un tipo de industria para mostrarlo u ocultarlo. Ctrl+Clic alterna entre mostrar todos los tipos, con excepción del elegido, o mostrar solo el elegido
-STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Haz clic en una empresa para mostrar u ocultar sus bienes. Ctrl+Clic alterna entre mostrar todas las empresas, con excepción de la elegida, o mostrar solo la elegida
-STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Haz clic en una carga para mostrar u ocultar sus bienes. Ctrl+Clic alterna entre mostrar todas las cargas, con excepción de la elegida, o mostrar solo la elegida
+STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Clica en un tipo de industria para mostrarlo u ocultarlo. Ctrl+Clic alterna entre mostrar todos los tipos, con excepción del elegido, o mostrar solo el elegido
+STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Clica en una empresa para mostrar u ocultar sus propiedades. Ctrl+Clic alterna entre mostrar todas las empresas, con excepción de la elegida, o mostrar solo la elegida
+STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Clica en una carga para mostrar u ocultar sus flujos. Ctrl+Clic alterna entre mostrar todas las cargas, con excepción de la elegida, o mostrar solo la elegida
STR_SMALLMAP_LEGENDA_ROADS :{TINY_FONT}{BLACK}Carreteras
STR_SMALLMAP_LEGENDA_RAILROADS :{TINY_FONT}{BLACK}Ferrocarriles
@@ -1065,11 +1065,11 @@ STR_GAME_OPTIONS_GUI_SCALE_5X :5x
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_FRAME :{BLACK}Encuesta automática
STR_GAME_OPTIONS_PARTICIPATE_SURVEY :{BLACK}Participar en la encuesta automática
-STR_GAME_OPTIONS_PARTICIPATE_SURVEY_TOOLTIP :{BLACK}Si está activado, OpenTTD enviará una encuesta al finalizar el juego
+STR_GAME_OPTIONS_PARTICIPATE_SURVEY_TOOLTIP :{BLACK}Si está activado, OpenTTD enviará una encuesta al salir el juego
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK :{BLACK}Acerca de la encuesta y la privacidad
-STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK_TOOLTIP :{BLACK}Se abrirá un navegador web con más información sobre la encuesta automática
-STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW :{BLACK}Visualizar el resultado de la encuesta
-STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW_TOOLTIP :{BLACK}Mostrar el resultado de la encuesta del juego actual
+STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK_TOOLTIP :{BLACK}Se abrirá el navegador web con más información sobre la encuesta automática
+STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW :{BLACK}Vista previa del resultado
+STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW_TOOLTIP :{BLACK}Muestra el resultado de la encuesta para el juego actual
STR_GAME_OPTIONS_GRAPHICS :{BLACK}Gráficos
@@ -1452,8 +1452,8 @@ STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Ninguno*
STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :Reducida
STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :Normal
-STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR :Permitir intersecciones con carreteras o ferrocarriles que sean propiedad de otras empresas: {STRING}
-STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR_HELPTEXT :Permitir construir intersecciones en carreteras o ferrocarriles que sean propiedad de otras empresas
+STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR :Permitir pasos a nivel con carreteras o ferrocarriles propiedad de otras empresas: {STRING}
+STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR_HELPTEXT :Permite construir pasos a nivel en carreteras o ferrocarriles que sean propiedad de otras empresas
STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Permitir construir paradas sobre carreteras de los municipios: {STRING}
STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Permite construir estaciones de paso en carreteras que sean propiedad de los municipios
@@ -1467,8 +1467,8 @@ STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Si se activa, l
STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :Color inicial de la empresa: {STRING}
STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :Selecciona el color inicial de la empresa
-STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY :Color secundario inicial de la empresa: {STRING}
-STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY_HELPTEXT :Selecciona un color secundario para la empresa, si usas un NewGRF que lo permita
+STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY :Color secundario de la empresa inicial: {STRING}
+STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY_HELPTEXT :Selecciona un color secundario para la empresa, si usas un NewGRF que lo permita.
STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Aeropuertos nunca caducan: {STRING}
STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Permite a todos los aeropuertos estar disponibles permanentemente una vez han sido introducidos
@@ -1491,7 +1491,7 @@ STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT_PERIOD :Cuando se activ
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Los vehículos nunca caducan: {STRING}
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Cuando se activa, todos los modelos de vehículos permanecen disponibles para siempre una vez han sido introducidos
-STR_CONFIG_SETTING_TIMEKEEPING_UNITS :Control de horarios: {STRING}
+STR_CONFIG_SETTING_TIMEKEEPING_UNITS :Cronometraje: {STRING}
STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :Selecciona las unidades de gestión temporal del juego. Este ajuste no puede ser cambiado más adelante.{}{}"Basado en calendario" es la experiencia clásica de OpenTTD, donde un año tiene 12 meses y cada mes entre 28 y 31 días.{}{}En "Basado en reloj", el movimiento de los vehículos, la producción de carga y la gestión financiera se basan en incrementos de un minuto, que es similar a lo que tarda un mes de 30 días en el modo "basado en calendario". Estos se agrupan en períodos de 12 minutos, que equivalen a un año en el modo "basado en calendario".{}{}En uno y otro modo siempre hay un calendario clásico que es usado para las fechas de aparición de vehículos, casas y otras infraestructuras.
###length 2
STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :Calendario
@@ -4544,6 +4544,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ir siempre
STR_ORDER_DROP_SERVICE_DEPOT :Mantenimiento si es necesario
STR_ORDER_DROP_HALT_DEPOT :Detenerse
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Datos del vehículo en los que se basará para realizar el salto de orden
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt
index b9a3de3ccf..e055165a6a 100644
--- a/src/lang/spanish_MX.txt
+++ b/src/lang/spanish_MX.txt
@@ -239,6 +239,7 @@ STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}
# Time units used in string control characters
+STR_UNITS_MONTHS :{NUM}{NBSP}mes{P "" es}
# Common window strings
@@ -493,6 +494,7 @@ STR_NEWS_MENU_DELETE_ALL_MESSAGES :Eliminar todos
# About menu
STR_ABOUT_MENU_LAND_BLOCK_INFO :Información sobre área de terreno
+STR_ABOUT_MENU_HELP :Ayuda y manuales
STR_ABOUT_MENU_TOGGLE_CONSOLE :Activar consola
STR_ABOUT_MENU_AI_DEBUG :Depuración de scripts de IA o juego
STR_ABOUT_MENU_SCREENSHOT :Captura de pantalla
@@ -973,6 +975,8 @@ STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Detectar
STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Ajustar biseles
STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Ajustar el tamaño de los biseles respecto a la interfaz
+STR_GAME_OPTIONS_GUI_FONT_SPRITE :{BLACK}Usar la fuente sprite tradicional
+STR_GAME_OPTIONS_GUI_FONT_SPRITE_TOOLTIP :{BLACK}Marca esta casilla si prefieres usar la fuente de letra tradicional.
STR_GAME_OPTIONS_GUI_SCALE_1X :1x
STR_GAME_OPTIONS_GUI_SCALE_2X :2x
@@ -4015,6 +4019,7 @@ STR_ENGINE_PREVIEW_TRAM_VEHICLE :tranvía
STR_ENGINE_PREVIEW_AIRCRAFT :{G=f}aeronave
STR_ENGINE_PREVIEW_SHIP :{G=m}barco
+STR_ENGINE_PREVIEW_SPEED_POWER :Velocidad: {VELOCITY} Potencia: {POWER}
# Autoreplace window
STR_REPLACE_VEHICLES_WHITE :{WHITE}Reemplazar {STRING} - {STRING}
@@ -4284,6 +4289,11 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ir siempre
STR_ORDER_DROP_SERVICE_DEPOT :Mantto. si es necesario
STR_ORDER_DROP_HALT_DEPOT :Detenerse
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :Seleccione una acción que quiera realizar en este depósito.
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Datos del vehículo para recorridos condicionales
# Conditional order variables, must follow order of OrderConditionVariable enum
@@ -4995,6 +5005,7 @@ STR_ERROR_AIRCRAFT_NOT_ENOUGH_RANGE :{WHITE}... la a
# Extra messages which go on the third line of errors, explaining why orders failed
STR_ERROR_NO_BUS_STATION :{WHITE}No hay una estación de autobus
STR_ERROR_NO_STOP_COMPATIBLE_TRAM_TYPE :{WHITE}No hay paradas con un tipo de tramo compatible
+STR_ERROR_AIRPORT_NO_HELICOPTERS :{WHITE}El helicóptero no puede aterrizar en este aeropuerto
# Timetable related errors
STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}No se pueden asignar itinerarios al vehículo...
diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt
index a34cf3ffdf..9e8b6eb911 100644
--- a/src/lang/swedish.txt
+++ b/src/lang/swedish.txt
@@ -4362,6 +4362,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Åk alltid
STR_ORDER_DROP_SERVICE_DEPOT :Service vid behov
STR_ORDER_DROP_HALT_DEPOT :Stanna
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Fordonsdata att basera hopp på
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt
index a3129f5430..9729f6aa95 100644
--- a/src/lang/tamil.txt
+++ b/src/lang/tamil.txt
@@ -3831,6 +3831,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :எப்போ
STR_ORDER_DROP_SERVICE_DEPOT :தேவைப்பட்டால் பராமரிப்பிற்கு செல்
STR_ORDER_DROP_HALT_DEPOT :நிறுத்து
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}அடிப்படை ஜம்பிங் செய்ய வாகனத் தரவு
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/thai.txt b/src/lang/thai.txt
index 1f8e184d20..f0e4c5de86 100644
--- a/src/lang/thai.txt
+++ b/src/lang/thai.txt
@@ -3955,6 +3955,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :ไปทุก
STR_ORDER_DROP_SERVICE_DEPOT :เข้าซ่อมบำรุงหากต้องการ
STR_ORDER_DROP_HALT_DEPOT :หยุด
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}ข้อมูลยานพาหนะที่จะข้ามไป
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt
index 537d032aff..70c108842b 100644
--- a/src/lang/traditional_chinese.txt
+++ b/src/lang/traditional_chinese.txt
@@ -4355,6 +4355,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :總是進行
STR_ORDER_DROP_SERVICE_DEPOT :若需要則維護
STR_ORDER_DROP_HALT_DEPOT :停留
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}跳躍指令依據
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt
index fff9c88647..db7ff8022a 100644
--- a/src/lang/turkish.txt
+++ b/src/lang/turkish.txt
@@ -4393,6 +4393,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Her zaman git
STR_ORDER_DROP_SERVICE_DEPOT :Gerekiyorsa bakıma gir
STR_ORDER_DROP_HALT_DEPOT :Dur
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dallanmanın temel alacağı araç verisi
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt
index 269ad8cf9a..52d3b67253 100644
--- a/src/lang/ukrainian.txt
+++ b/src/lang/ukrainian.txt
@@ -4444,6 +4444,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Завжди п
STR_ORDER_DROP_SERVICE_DEPOT :Прямувати при потребі в техогляді
STR_ORDER_DROP_HALT_DEPOT :Прямувати і зупинитись
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Дані транспорту для базування наказу
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/urdu.txt b/src/lang/urdu.txt
index 50248b0f26..3f5410a63b 100644
--- a/src/lang/urdu.txt
+++ b/src/lang/urdu.txt
@@ -2627,6 +2627,10 @@ STR_ORDER_INDEX :{COMMA}:{NBSP}
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
# Conditional order variables, must follow order of OrderConditionVariable enum
###length 8
diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt
index 937aa977bd..ec8e88bc06 100644
--- a/src/lang/vietnamese.txt
+++ b/src/lang/vietnamese.txt
@@ -4421,6 +4421,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Chạy suốt
STR_ORDER_DROP_SERVICE_DEPOT :Bảo trì nếu cần
STR_ORDER_DROP_HALT_DEPOT :Dừng
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dữ kiện của phương tiện để xác định
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt
index fed34c0368..9232a66892 100644
--- a/src/lang/welsh.txt
+++ b/src/lang/welsh.txt
@@ -3979,6 +3979,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Mynd bob tro
STR_ORDER_DROP_SERVICE_DEPOT :Gwasanaethu os oes angen
STR_ORDER_DROP_HALT_DEPOT :Stopio
+# Depot action tooltips, one per vehicle type
+###length VEHICLE_TYPES
+###next-name-looks-similar
+
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Data cerbyd i seilio'r naid arno
# Conditional order variables, must follow order of OrderConditionVariable enum
diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp
index 2e9928e793..adea0e237f 100644
--- a/src/misc_gui.cpp
+++ b/src/misc_gui.cpp
@@ -29,6 +29,7 @@
#include "rev.h"
#include "timer/timer.h"
#include "timer/timer_window.h"
+#include "pathfinder/water_regions.h"
#include "widgets/misc_widget.h"
@@ -128,6 +129,8 @@ public:
Debug(misc, LANDINFOD_LEVEL, "m6 = 0x{:x}", tile.m6());
Debug(misc, LANDINFOD_LEVEL, "m7 = 0x{:x}", tile.m7());
Debug(misc, LANDINFOD_LEVEL, "m8 = 0x{:x}", tile.m8());
+
+ PrintWaterRegionDebugInfo(tile);
#undef LANDINFOD_LEVEL
}
diff --git a/src/network/core/config.h b/src/network/core/config.h
index 6beaf9504f..df8991ad69 100644
--- a/src/network/core/config.h
+++ b/src/network/core/config.h
@@ -25,7 +25,7 @@ static const uint16_t NETWORK_CONTENT_SERVER_PORT = 3978; ///< The
static const uint16_t NETWORK_DEFAULT_PORT = 3979; ///< The default port of the game server (TCP & UDP)
static const uint16_t NETWORK_ADMIN_PORT = 3977; ///< The default port for admin network
-static const uint16_t UDP_MTU = 1460; ///< Number of bytes we can pack in a single UDP packet
+static const size_t UDP_MTU = 1460; ///< Number of bytes we can pack in a single UDP packet
static const std::string NETWORK_SURVEY_DETAILS_LINK = "https://survey.openttd.org/participate"; ///< Link with more details & privacy statement of the survey.
/*
@@ -42,8 +42,8 @@ static const std::string NETWORK_SURVEY_DETAILS_LINK = "https://survey.openttd.o
* Send_uint16(GB(size, 16, 14) | 0b10 << 14)
* Send_uint16(GB(size, 0, 16))
*/
-static const uint16_t TCP_MTU = 32767; ///< Number of bytes we can pack in a single TCP packet
-static const uint16_t COMPAT_MTU = 1460; ///< Number of bytes we can pack in a single packet for backward compatibility
+static const size_t TCP_MTU = 32767; ///< Number of bytes we can pack in a single TCP packet
+static const size_t COMPAT_MTU = 1460; ///< Number of bytes we can pack in a single packet for backward compatibility
static const byte NETWORK_GAME_ADMIN_VERSION = 3; ///< What version of the admin network do we use?
static const byte NETWORK_GAME_INFO_VERSION = 7; ///< What version of game-info do we use?
diff --git a/src/network/core/network_game_info.cpp b/src/network/core/network_game_info.cpp
index ceffa9e227..adecf1643f 100644
--- a/src/network/core/network_game_info.cpp
+++ b/src/network/core/network_game_info.cpp
@@ -141,7 +141,7 @@ void FillStaticNetworkServerGameInfo()
* Get the NetworkServerGameInfo structure with the latest information of the server.
* @return The current NetworkServerGameInfo.
*/
-const NetworkServerGameInfo *GetCurrentNetworkServerGameInfo()
+const NetworkServerGameInfo &GetCurrentNetworkServerGameInfo()
{
/* These variables are updated inside _network_game_info as if they are global variables:
* - clients_on
@@ -152,7 +152,7 @@ const NetworkServerGameInfo *GetCurrentNetworkServerGameInfo()
_network_game_info.spectators_on = NetworkSpectatorCount();
_network_game_info.calendar_date = TimerGameCalendar::date;
_network_game_info.ticks_playing = TimerGameTick::counter;
- return &_network_game_info;
+ return _network_game_info;
}
/**
@@ -184,9 +184,9 @@ static void HandleIncomingNetworkGameInfoGRFConfig(GRFConfig *config, std::strin
* @param p the packet to write the data to.
* @param info the NetworkGameInfo struct to serialize from.
*/
-void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info, bool send_newgrf_names)
+void SerializeNetworkGameInfo(Packet &p, const NetworkServerGameInfo &info, bool send_newgrf_names)
{
- p->Send_uint8 (NETWORK_GAME_INFO_VERSION);
+ p.Send_uint8 (NETWORK_GAME_INFO_VERSION);
/*
* Please observe the order.
@@ -197,15 +197,15 @@ void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info, bool
* to the NetworkGameInfo wire-protocol! */
/* NETWORK_GAME_INFO_VERSION = 7 */
- p->Send_uint64(info->ticks_playing);
+ p.Send_uint64(info.ticks_playing);
/* NETWORK_GAME_INFO_VERSION = 6 */
- p->Send_uint8(send_newgrf_names ? NST_GRFID_MD5_NAME : NST_GRFID_MD5);
+ p.Send_uint8(send_newgrf_names ? NST_GRFID_MD5_NAME : NST_GRFID_MD5);
/* NETWORK_GAME_INFO_VERSION = 5 */
GameInfo *game_info = Game::GetInfo();
- p->Send_uint32(game_info == nullptr ? -1 : (uint32_t)game_info->GetVersion());
- p->Send_string(game_info == nullptr ? "" : game_info->GetName());
+ p.Send_uint32(game_info == nullptr ? -1 : (uint32_t)game_info->GetVersion());
+ p.Send_string(game_info == nullptr ? "" : game_info->GetName());
/* NETWORK_GAME_INFO_VERSION = 4 */
{
@@ -217,40 +217,40 @@ void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info, bool
uint count = 0;
/* Count number of GRFs to send information about */
- for (c = info->grfconfig; c != nullptr; c = c->next) {
+ for (c = info.grfconfig; c != nullptr; c = c->next) {
if (!HasBit(c->flags, GCF_STATIC)) count++;
}
- p->Send_uint8 (count); // Send number of GRFs
+ p.Send_uint8 (count); // Send number of GRFs
/* Send actual GRF Identifications */
- for (c = info->grfconfig; c != nullptr; c = c->next) {
+ for (c = info.grfconfig; c != nullptr; c = c->next) {
if (HasBit(c->flags, GCF_STATIC)) continue;
- SerializeGRFIdentifier(p, &c->ident);
- if (send_newgrf_names) p->Send_string(c->GetName());
+ SerializeGRFIdentifier(p, c->ident);
+ if (send_newgrf_names) p.Send_string(c->GetName());
}
}
/* NETWORK_GAME_INFO_VERSION = 3 */
- p->Send_uint32(info->calendar_date.base());
- p->Send_uint32(info->calendar_start.base());
+ p.Send_uint32(info.calendar_date.base());
+ p.Send_uint32(info.calendar_start.base());
/* NETWORK_GAME_INFO_VERSION = 2 */
- p->Send_uint8 (info->companies_max);
- p->Send_uint8 (info->companies_on);
- p->Send_uint8 (info->clients_max); // Used to be max-spectators
+ p.Send_uint8 (info.companies_max);
+ p.Send_uint8 (info.companies_on);
+ p.Send_uint8 (info.clients_max); // Used to be max-spectators
/* NETWORK_GAME_INFO_VERSION = 1 */
- p->Send_string(info->server_name);
- p->Send_string(info->server_revision);
- p->Send_bool (info->use_password);
- p->Send_uint8 (info->clients_max);
- p->Send_uint8 (info->clients_on);
- p->Send_uint8 (info->spectators_on);
- p->Send_uint16(info->map_width);
- p->Send_uint16(info->map_height);
- p->Send_uint8 (info->landscape);
- p->Send_bool (info->dedicated);
+ p.Send_string(info.server_name);
+ p.Send_string(info.server_revision);
+ p.Send_bool (info.use_password);
+ p.Send_uint8 (info.clients_max);
+ p.Send_uint8 (info.clients_on);
+ p.Send_uint8 (info.spectators_on);
+ p.Send_uint16(info.map_width);
+ p.Send_uint16(info.map_height);
+ p.Send_uint8 (info.landscape);
+ p.Send_bool (info.dedicated);
}
/**
@@ -258,9 +258,9 @@ void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info, bool
* @param p the packet to read the data from.
* @param info the NetworkGameInfo to deserialize into.
*/
-void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info, const GameInfoNewGRFLookupTable *newgrf_lookup_table)
+void DeserializeNetworkGameInfo(Packet &p, NetworkGameInfo &info, const GameInfoNewGRFLookupTable *newgrf_lookup_table)
{
- byte game_info_version = p->Recv_uint8();
+ byte game_info_version = p.Recv_uint8();
NewGRFSerializationType newgrf_serialisation = NST_GRFID_MD5;
/*
@@ -273,17 +273,17 @@ void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info, const GameInfo
switch (game_info_version) {
case 7:
- info->ticks_playing = p->Recv_uint64();
+ info.ticks_playing = p.Recv_uint64();
[[fallthrough]];
case 6:
- newgrf_serialisation = (NewGRFSerializationType)p->Recv_uint8();
+ newgrf_serialisation = (NewGRFSerializationType)p.Recv_uint8();
if (newgrf_serialisation >= NST_END) return;
[[fallthrough]];
case 5: {
- info->gamescript_version = (int)p->Recv_uint32();
- info->gamescript_name = p->Recv_string(NETWORK_NAME_LENGTH);
+ info.gamescript_version = (int)p.Recv_uint32();
+ info.gamescript_name = p.Recv_string(NETWORK_NAME_LENGTH);
[[fallthrough]];
}
@@ -292,23 +292,23 @@ void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info, const GameInfo
* protocol are matched to eachother. If that is not the case anymore a
* check must be added to ensure the received data is still valid. */
static_assert(std::numeric_limits::max() == NETWORK_MAX_GRF_COUNT);
- uint num_grfs = p->Recv_uint8();
+ uint num_grfs = p.Recv_uint8();
- GRFConfig **dst = &info->grfconfig;
+ GRFConfig **dst = &info.grfconfig;
for (uint i = 0; i < num_grfs; i++) {
NamedGRFIdentifier grf;
switch (newgrf_serialisation) {
case NST_GRFID_MD5:
- DeserializeGRFIdentifier(p, &grf.ident);
+ DeserializeGRFIdentifier(p, grf.ident);
break;
case NST_GRFID_MD5_NAME:
- DeserializeGRFIdentifierWithName(p, &grf);
+ DeserializeGRFIdentifierWithName(p, grf);
break;
case NST_LOOKUP_ID: {
if (newgrf_lookup_table == nullptr) return;
- auto it = newgrf_lookup_table->find(p->Recv_uint32());
+ auto it = newgrf_lookup_table->find(p.Recv_uint32());
if (it == newgrf_lookup_table->end()) return;
grf = it->second;
break;
@@ -330,40 +330,40 @@ void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info, const GameInfo
}
case 3:
- info->calendar_date = Clamp(p->Recv_uint32(), 0, CalendarTime::MAX_DATE.base());
- info->calendar_start = Clamp(p->Recv_uint32(), 0, CalendarTime::MAX_DATE.base());
+ info.calendar_date = Clamp(p.Recv_uint32(), 0, CalendarTime::MAX_DATE.base());
+ info.calendar_start = Clamp(p.Recv_uint32(), 0, CalendarTime::MAX_DATE.base());
[[fallthrough]];
case 2:
- info->companies_max = p->Recv_uint8 ();
- info->companies_on = p->Recv_uint8 ();
- p->Recv_uint8(); // Used to contain max-spectators.
+ info.companies_max = p.Recv_uint8 ();
+ info.companies_on = p.Recv_uint8 ();
+ p.Recv_uint8(); // Used to contain max-spectators.
[[fallthrough]];
case 1:
- info->server_name = p->Recv_string(NETWORK_NAME_LENGTH);
- info->server_revision = p->Recv_string(NETWORK_REVISION_LENGTH);
- if (game_info_version < 6) p->Recv_uint8 (); // Used to contain server-lang.
- info->use_password = p->Recv_bool ();
- info->clients_max = p->Recv_uint8 ();
- info->clients_on = p->Recv_uint8 ();
- info->spectators_on = p->Recv_uint8 ();
+ info.server_name = p.Recv_string(NETWORK_NAME_LENGTH);
+ info.server_revision = p.Recv_string(NETWORK_REVISION_LENGTH);
+ if (game_info_version < 6) p.Recv_uint8 (); // Used to contain server-lang.
+ info.use_password = p.Recv_bool ();
+ info.clients_max = p.Recv_uint8 ();
+ info.clients_on = p.Recv_uint8 ();
+ info.spectators_on = p.Recv_uint8 ();
if (game_info_version < 3) { // 16 bits dates got scrapped and are read earlier
- info->calendar_date = p->Recv_uint16() + CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR;
- info->calendar_start = p->Recv_uint16() + CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR;
+ info.calendar_date = p.Recv_uint16() + CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR;
+ info.calendar_start = p.Recv_uint16() + CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR;
}
- if (game_info_version < 6) while (p->Recv_uint8() != 0) {} // Used to contain the map-name.
- info->map_width = p->Recv_uint16();
- info->map_height = p->Recv_uint16();
- info->landscape = p->Recv_uint8 ();
- info->dedicated = p->Recv_bool ();
+ if (game_info_version < 6) while (p.Recv_uint8() != 0) {} // Used to contain the map-name.
+ info.map_width = p.Recv_uint16();
+ info.map_height = p.Recv_uint16();
+ info.landscape = p.Recv_uint8 ();
+ info.dedicated = p.Recv_bool ();
- if (info->landscape >= NUM_LANDSCAPE) info->landscape = 0;
+ if (info.landscape >= NUM_LANDSCAPE) info.landscape = 0;
}
/* For older servers, estimate the ticks running based on the calendar date. */
if (game_info_version < 7) {
- info->ticks_playing = static_cast(std::max(0, info->calendar_date.base() - info->calendar_start.base())) * Ticks::DAY_TICKS;
+ info.ticks_playing = static_cast(std::max(0, info.calendar_date.base() - info.calendar_start.base())) * Ticks::DAY_TICKS;
}
}
@@ -372,11 +372,11 @@ void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info, const GameInfo
* @param p the packet to write the data to.
* @param grf the GRFIdentifier to serialize.
*/
-void SerializeGRFIdentifier(Packet *p, const GRFIdentifier *grf)
+void SerializeGRFIdentifier(Packet &p, const GRFIdentifier &grf)
{
- p->Send_uint32(grf->grfid);
- for (size_t j = 0; j < grf->md5sum.size(); j++) {
- p->Send_uint8(grf->md5sum[j]);
+ p.Send_uint32(grf.grfid);
+ for (size_t j = 0; j < grf.md5sum.size(); j++) {
+ p.Send_uint8(grf.md5sum[j]);
}
}
@@ -385,11 +385,11 @@ void SerializeGRFIdentifier(Packet *p, const GRFIdentifier *grf)
* @param p the packet to read the data from.
* @param grf the GRFIdentifier to deserialize.
*/
-void DeserializeGRFIdentifier(Packet *p, GRFIdentifier *grf)
+void DeserializeGRFIdentifier(Packet &p, GRFIdentifier &grf)
{
- grf->grfid = p->Recv_uint32();
- for (size_t j = 0; j < grf->md5sum.size(); j++) {
- grf->md5sum[j] = p->Recv_uint8();
+ grf.grfid = p.Recv_uint32();
+ for (size_t j = 0; j < grf.md5sum.size(); j++) {
+ grf.md5sum[j] = p.Recv_uint8();
}
}
@@ -398,8 +398,8 @@ void DeserializeGRFIdentifier(Packet *p, GRFIdentifier *grf)
* @param p the packet to read the data from.
* @param grf the NamedGRFIdentifier to deserialize.
*/
-void DeserializeGRFIdentifierWithName(Packet *p, NamedGRFIdentifier *grf)
+void DeserializeGRFIdentifierWithName(Packet &p, NamedGRFIdentifier &grf)
{
- DeserializeGRFIdentifier(p, &grf->ident);
- grf->name = p->Recv_string(NETWORK_GRF_NAME_LENGTH);
+ DeserializeGRFIdentifier(p, grf.ident);
+ grf.name = p.Recv_string(NETWORK_GRF_NAME_LENGTH);
}
diff --git a/src/network/core/network_game_info.h b/src/network/core/network_game_info.h
index 293a20f92a..8b63d2d151 100644
--- a/src/network/core/network_game_info.h
+++ b/src/network/core/network_game_info.h
@@ -141,13 +141,13 @@ bool IsNetworkCompatibleVersion(std::string_view other);
void CheckGameCompatibility(NetworkGameInfo &ngi);
void FillStaticNetworkServerGameInfo();
-const NetworkServerGameInfo *GetCurrentNetworkServerGameInfo();
+const NetworkServerGameInfo &GetCurrentNetworkServerGameInfo();
-void DeserializeGRFIdentifier(Packet *p, GRFIdentifier *grf);
-void DeserializeGRFIdentifierWithName(Packet *p, NamedGRFIdentifier *grf);
-void SerializeGRFIdentifier(Packet *p, const GRFIdentifier *grf);
+void DeserializeGRFIdentifier(Packet &p, GRFIdentifier &grf);
+void DeserializeGRFIdentifierWithName(Packet &p, NamedGRFIdentifier &grf);
+void SerializeGRFIdentifier(Packet &p, const GRFIdentifier &grf);
-void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info, const GameInfoNewGRFLookupTable *newgrf_lookup_table = nullptr);
-void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info, bool send_newgrf_names = true);
+void DeserializeNetworkGameInfo(Packet &p, NetworkGameInfo &info, const GameInfoNewGRFLookupTable *newgrf_lookup_table = nullptr);
+void SerializeNetworkGameInfo(Packet &p, const NetworkServerGameInfo &info, bool send_newgrf_names = true);
#endif /* NETWORK_CORE_GAME_INFO_H */
diff --git a/src/network/core/packet.cpp b/src/network/core/packet.cpp
index 42de5c2653..d4cf165125 100644
--- a/src/network/core/packet.cpp
+++ b/src/network/core/packet.cpp
@@ -28,7 +28,7 @@
* loose some the data of the packet, so there you pass the maximum
* size for the packet you expect from the network.
*/
-Packet::Packet(NetworkSocketHandler *cs, size_t limit, size_t initial_read_size) : next(nullptr), pos(0), limit(limit)
+Packet::Packet(NetworkSocketHandler *cs, size_t limit, size_t initial_read_size) : pos(0), limit(limit)
{
assert(cs != nullptr);
@@ -44,45 +44,20 @@ Packet::Packet(NetworkSocketHandler *cs, size_t limit, size_t initial_read_size)
* the limit as it might break things if the other side is not expecting
* much larger packets than what they support.
*/
-Packet::Packet(PacketType type, size_t limit) : next(nullptr), pos(0), limit(limit), cs(nullptr)
+Packet::Packet(PacketType type, size_t limit) : pos(0), limit(limit), cs(nullptr)
{
/* Allocate space for the the size so we can write that in just before sending the packet. */
this->Send_uint16(0);
this->Send_uint8(type);
}
-/**
- * Add the given Packet to the end of the queue of packets.
- * @param queue The pointer to the begin of the queue.
- * @param packet The packet to append to the queue.
- */
-/* static */ void Packet::AddToQueue(Packet **queue, Packet *packet)
-{
- while (*queue != nullptr) queue = &(*queue)->next;
- *queue = packet;
-}
-
-/**
- * Pop the packet from the begin of the queue and set the
- * begin of the queue to the second element in the queue.
- * @param queue The pointer to the begin of the queue.
- * @return The Packet that used to be a the begin of the queue.
- */
-/* static */ Packet *Packet::PopFromQueue(Packet **queue)
-{
- Packet *p = *queue;
- *queue = p->next;
- p->next = nullptr;
- return p;
-}
-
/**
* Writes the packet size from the raw packet from packet->size
*/
void Packet::PrepareToSend()
{
- assert(this->cs == nullptr && this->next == nullptr);
+ assert(this->cs == nullptr);
this->buffer[0] = GB(this->Size(), 0, 8);
this->buffer[1] = GB(this->Size(), 8, 8);
@@ -268,7 +243,7 @@ size_t Packet::Size() const
*/
bool Packet::ParsePacketSize()
{
- assert(this->cs != nullptr && this->next == nullptr);
+ assert(this->cs != nullptr);
size_t size = (size_t)this->buffer[0];
size += (size_t)this->buffer[1] << 8;
diff --git a/src/network/core/packet.h b/src/network/core/packet.h
index 8a1931e971..9cedfd63e1 100644
--- a/src/network/core/packet.h
+++ b/src/network/core/packet.h
@@ -41,8 +41,6 @@ typedef uint8_t PacketType; ///< Identifier for the packet
*/
struct Packet {
private:
- /** The next packet. Used for queueing packets before sending. */
- Packet *next;
/** The current read/write position in the packet */
PacketSize pos;
/** The buffer of this packet. */
@@ -57,9 +55,6 @@ public:
Packet(NetworkSocketHandler *cs, size_t limit, size_t initial_read_size = sizeof(PacketSize));
Packet(PacketType type, size_t limit = COMPAT_MTU);
- static void AddToQueue(Packet **queue, Packet *packet);
- static Packet *PopFromQueue(Packet **queue);
-
/* Sending/writing of packets */
void PrepareToSend();
diff --git a/src/network/core/tcp.cpp b/src/network/core/tcp.cpp
index 626f978b42..b01b8cd075 100644
--- a/src/network/core/tcp.cpp
+++ b/src/network/core/tcp.cpp
@@ -22,29 +22,15 @@
*/
NetworkTCPSocketHandler::NetworkTCPSocketHandler(SOCKET s) :
NetworkSocketHandler(),
- packet_queue(nullptr), packet_recv(nullptr),
sock(s), writable(false)
{
}
NetworkTCPSocketHandler::~NetworkTCPSocketHandler()
{
- this->EmptyPacketQueue();
this->CloseSocket();
}
-/**
- * Free all pending and partially received packets.
- */
-void NetworkTCPSocketHandler::EmptyPacketQueue()
-{
- while (this->packet_queue != nullptr) {
- delete Packet::PopFromQueue(&this->packet_queue);
- }
- delete this->packet_recv;
- this->packet_recv = nullptr;
-}
-
/**
* Close the actual socket of the connection.
* Please make sure CloseConnection is called before CloseSocket, as
@@ -67,7 +53,8 @@ NetworkRecvStatus NetworkTCPSocketHandler::CloseConnection([[maybe_unused]] bool
this->MarkClosed();
this->writable = false;
- this->EmptyPacketQueue();
+ this->packet_queue.clear();
+ this->packet_recv = nullptr;
return NETWORK_RECV_STATUS_OKAY;
}
@@ -78,12 +65,12 @@ NetworkRecvStatus NetworkTCPSocketHandler::CloseConnection([[maybe_unused]] bool
* if the OS-network-buffer is full)
* @param packet the packet to send
*/
-void NetworkTCPSocketHandler::SendPacket(Packet *packet)
+void NetworkTCPSocketHandler::SendPacket(std::unique_ptr &&packet)
{
assert(packet != nullptr);
packet->PrepareToSend();
- Packet::AddToQueue(&this->packet_queue, packet);
+ this->packet_queue.push_back(std::move(packet));
}
/**
@@ -98,15 +85,13 @@ void NetworkTCPSocketHandler::SendPacket(Packet *packet)
*/
SendPacketsState NetworkTCPSocketHandler::SendPackets(bool closing_down)
{
- ssize_t res;
- Packet *p;
-
/* We can not write to this socket!! */
if (!this->writable) return SPS_NONE_SENT;
if (!this->IsConnected()) return SPS_CLOSED;
- while ((p = this->packet_queue) != nullptr) {
- res = p->TransferOut(send, this->sock, 0);
+ while (!this->packet_queue.empty()) {
+ Packet &p = *this->packet_queue.front();
+ ssize_t res = p.TransferOut(send, this->sock, 0);
if (res == -1) {
NetworkError err = NetworkError::GetLast();
if (!err.WouldBlock()) {
@@ -126,9 +111,9 @@ SendPacketsState NetworkTCPSocketHandler::SendPackets(bool closing_down)
}
/* Is this packet sent? */
- if (p->RemainingBytesToTransfer() == 0) {
+ if (p.RemainingBytesToTransfer() == 0) {
/* Go to the next packet */
- delete Packet::PopFromQueue(&this->packet_queue);
+ this->packet_queue.pop_front();
} else {
return SPS_PARTLY_SENT;
}
@@ -141,22 +126,22 @@ SendPacketsState NetworkTCPSocketHandler::SendPackets(bool closing_down)
* Receives a packet for the given client
* @return The received packet (or nullptr when it didn't receive one)
*/
-Packet *NetworkTCPSocketHandler::ReceivePacket()
+std::unique_ptr NetworkTCPSocketHandler::ReceivePacket()
{
ssize_t res;
if (!this->IsConnected()) return nullptr;
if (this->packet_recv == nullptr) {
- this->packet_recv = new Packet(this, TCP_MTU);
+ this->packet_recv = std::make_unique(this, TCP_MTU);
}
- Packet *p = this->packet_recv;
+ Packet &p = *this->packet_recv.get();
/* Read packet size */
- if (!p->HasPacketSizeData()) {
- while (p->RemainingBytesToTransfer() != 0) {
- res = p->TransferIn(recv, this->sock, 0);
+ if (!p.HasPacketSizeData()) {
+ while (p.RemainingBytesToTransfer() != 0) {
+ res = p.TransferIn(recv, this->sock, 0);
if (res == -1) {
NetworkError err = NetworkError::GetLast();
if (!err.WouldBlock()) {
@@ -176,15 +161,15 @@ Packet *NetworkTCPSocketHandler::ReceivePacket()
}
/* Parse the size in the received packet and if not valid, close the connection. */
- if (!p->ParsePacketSize()) {
+ if (!p.ParsePacketSize()) {
this->CloseConnection();
return nullptr;
}
}
/* Read rest of packet */
- while (p->RemainingBytesToTransfer() != 0) {
- res = p->TransferIn(recv, this->sock, 0);
+ while (p.RemainingBytesToTransfer() != 0) {
+ res = p.TransferIn(recv, this->sock, 0);
if (res == -1) {
NetworkError err = NetworkError::GetLast();
if (!err.WouldBlock()) {
@@ -203,11 +188,8 @@ Packet *NetworkTCPSocketHandler::ReceivePacket()
}
}
- /* Prepare for receiving a new packet */
- this->packet_recv = nullptr;
-
- p->PrepareToRead();
- return p;
+ p.PrepareToRead();
+ return std::move(this->packet_recv);
}
/**
diff --git a/src/network/core/tcp.h b/src/network/core/tcp.h
index caade125b0..419a278587 100644
--- a/src/network/core/tcp.h
+++ b/src/network/core/tcp.h
@@ -30,8 +30,8 @@ enum SendPacketsState {
/** Base socket handler for all TCP sockets */
class NetworkTCPSocketHandler : public NetworkSocketHandler {
private:
- Packet *packet_queue; ///< Packets that are awaiting delivery
- Packet *packet_recv; ///< Partially received packet
+ std::deque> packet_queue; ///< Packets that are awaiting delivery. Cannot be std::queue as that does not have a clear() function.
+ std::unique_ptr packet_recv; ///< Partially received packet
void EmptyPacketQueue();
public:
@@ -47,10 +47,10 @@ public:
virtual NetworkRecvStatus CloseConnection(bool error = true);
void CloseSocket();
- virtual void SendPacket(Packet *packet);
+ virtual void SendPacket(std::unique_ptr &&packet);
SendPacketsState SendPackets(bool closing_down = false);
- virtual Packet *ReceivePacket();
+ virtual std::unique_ptr ReceivePacket();
bool CanSendReceive();
@@ -58,7 +58,7 @@ public:
* Whether there is something pending in the send queue.
* @return true when something is pending in the send queue.
*/
- bool HasSendQueue() { return this->packet_queue != nullptr; }
+ bool HasSendQueue() { return !this->packet_queue.empty(); }
NetworkTCPSocketHandler(SOCKET s = INVALID_SOCKET);
~NetworkTCPSocketHandler();
diff --git a/src/network/core/tcp_admin.cpp b/src/network/core/tcp_admin.cpp
index 895817cad3..d29e08ba63 100644
--- a/src/network/core/tcp_admin.cpp
+++ b/src/network/core/tcp_admin.cpp
@@ -43,9 +43,9 @@ NetworkRecvStatus NetworkAdminSocketHandler::CloseConnection(bool)
* @param p the packet to handle.
* @return #NetworkRecvStatus of handling.
*/
-NetworkRecvStatus NetworkAdminSocketHandler::HandlePacket(Packet *p)
+NetworkRecvStatus NetworkAdminSocketHandler::HandlePacket(Packet &p)
{
- PacketAdminType type = (PacketAdminType)p->Recv_uint8();
+ PacketAdminType type = (PacketAdminType)p.Recv_uint8();
if (this->HasClientQuit()) {
Debug(net, 0, "[tcp/admin] Received invalid packet from '{}' ({})", this->admin_name, this->admin_version);
@@ -108,10 +108,9 @@ NetworkRecvStatus NetworkAdminSocketHandler::HandlePacket(Packet *p)
*/
NetworkRecvStatus NetworkAdminSocketHandler::ReceivePackets()
{
- Packet *p;
+ std::unique_ptr p;
while ((p = this->ReceivePacket()) != nullptr) {
- NetworkRecvStatus res = this->HandlePacket(p);
- delete p;
+ NetworkRecvStatus res = this->HandlePacket(*p);
if (res != NETWORK_RECV_STATUS_OKAY) return res;
}
@@ -129,40 +128,40 @@ NetworkRecvStatus NetworkAdminSocketHandler::ReceiveInvalidPacket(PacketAdminTyp
return NETWORK_RECV_STATUS_MALFORMED_PACKET;
}
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_JOIN); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_QUIT(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_QUIT); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENCY(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_UPDATE_FREQUENCY); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_POLL); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_CHAT); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_EXTERNAL_CHAT(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_EXTERNAL_CHAT); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_RCON); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_GAMESCRIPT); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_PING(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_PING); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_JOIN); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_QUIT(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_QUIT); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENCY(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_UPDATE_FREQUENCY); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_POLL); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_CHAT); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_EXTERNAL_CHAT(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_EXTERNAL_CHAT); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_RCON); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_GAMESCRIPT); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_PING(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_PING); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_FULL(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_FULL); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_BANNED(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_BANNED); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_ERROR(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_ERROR); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_PROTOCOL(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_PROTOCOL); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_WELCOME(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_WELCOME); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_NEWGAME(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_NEWGAME); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_SHUTDOWN(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_SHUTDOWN); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_FULL(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_FULL); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_BANNED(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_BANNED); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_ERROR(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_ERROR); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_PROTOCOL(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_PROTOCOL); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_WELCOME(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_WELCOME); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_NEWGAME(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_NEWGAME); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_SHUTDOWN(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_SHUTDOWN); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_DATE(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_DATE); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_JOIN(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_JOIN); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_INFO(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_INFO); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_UPDATE(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_UPDATE); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_QUIT(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_QUIT); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_ERROR(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_ERROR); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_NEW(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_NEW); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_INFO(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_INFO); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_UPDATE(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_UPDATE); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_REMOVE(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_REMOVE); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_ECONOMY(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_ECONOMY); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_STATS(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_STATS); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CHAT(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CHAT); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_RCON(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_RCON); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CONSOLE(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CONSOLE); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CMD_NAMES(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CMD_NAMES); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CMD_LOGGING(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CMD_LOGGING); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_RCON_END(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_RCON_END); }
-NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_PONG(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_PONG); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_DATE(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_DATE); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_JOIN(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_JOIN); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_INFO(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_INFO); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_UPDATE(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_UPDATE); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_QUIT(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_QUIT); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_ERROR(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_ERROR); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_NEW(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_NEW); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_INFO(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_INFO); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_UPDATE(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_UPDATE); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_REMOVE(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_REMOVE); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_ECONOMY(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_ECONOMY); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_STATS(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_STATS); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CHAT(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CHAT); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_RCON(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_RCON); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CONSOLE(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CONSOLE); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CMD_NAMES(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CMD_NAMES); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CMD_LOGGING(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CMD_LOGGING); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_RCON_END(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_RCON_END); }
+NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_PONG(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_PONG); }
diff --git a/src/network/core/tcp_admin.h b/src/network/core/tcp_admin.h
index 567a791496..4320a06f66 100644
--- a/src/network/core/tcp_admin.h
+++ b/src/network/core/tcp_admin.h
@@ -21,7 +21,7 @@
* Enum with types of TCP packets specific to the admin network.
* This protocol may only be extended to ensure stability.
*/
-enum PacketAdminType {
+enum PacketAdminType : uint8_t {
ADMIN_PACKET_ADMIN_JOIN, ///< The admin announces and authenticates itself to the server.
ADMIN_PACKET_ADMIN_QUIT, ///< The admin tells the server that it is quitting.
ADMIN_PACKET_ADMIN_UPDATE_FREQUENCY, ///< The admin tells the server the update frequency of a particular piece of information.
@@ -125,14 +125,14 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_ADMIN_JOIN(Packet *p);
+ virtual NetworkRecvStatus Receive_ADMIN_JOIN(Packet &p);
/**
* Notification to the server that this admin is quitting.
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_ADMIN_QUIT(Packet *p);
+ virtual NetworkRecvStatus Receive_ADMIN_QUIT(Packet &p);
/**
* Register updates to be sent at certain frequencies (as announced in the PROTOCOL packet):
@@ -141,7 +141,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_ADMIN_UPDATE_FREQUENCY(Packet *p);
+ virtual NetworkRecvStatus Receive_ADMIN_UPDATE_FREQUENCY(Packet &p);
/**
* Poll the server for certain updates, an invalid poll (e.g. not existent id) gets silently dropped:
@@ -152,7 +152,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_ADMIN_POLL(Packet *p);
+ virtual NetworkRecvStatus Receive_ADMIN_POLL(Packet &p);
/**
* Send chat as the server:
@@ -163,7 +163,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_ADMIN_CHAT(Packet *p);
+ virtual NetworkRecvStatus Receive_ADMIN_CHAT(Packet &p);
/**
* Send chat from the external source:
@@ -174,7 +174,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_ADMIN_EXTERNAL_CHAT(Packet *p);
+ virtual NetworkRecvStatus Receive_ADMIN_EXTERNAL_CHAT(Packet &p);
/**
* Execute a command on the servers console:
@@ -182,7 +182,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_ADMIN_RCON(Packet *p);
+ virtual NetworkRecvStatus Receive_ADMIN_RCON(Packet &p);
/**
* Send a JSON string to the current active GameScript.
@@ -190,7 +190,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_ADMIN_GAMESCRIPT(Packet *p);
+ virtual NetworkRecvStatus Receive_ADMIN_GAMESCRIPT(Packet &p);
/**
* Ping the server, requiring the server to reply with a pong packet.
@@ -198,21 +198,21 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_ADMIN_PING(Packet *p);
+ virtual NetworkRecvStatus Receive_ADMIN_PING(Packet &p);
/**
* The server is full (connection gets closed).
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_FULL(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_FULL(Packet &p);
/**
* The source IP address is banned (connection gets closed).
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_BANNED(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_BANNED(Packet &p);
/**
* An error was caused by this admin connection (connection gets closed).
@@ -220,7 +220,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_ERROR(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_ERROR(Packet &p);
/**
* Inform a just joined admin about the protocol specifics:
@@ -231,7 +231,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_PROTOCOL(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_PROTOCOL(Packet &p);
/**
* Welcome a connected admin to the game:
@@ -247,21 +247,21 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_WELCOME(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_WELCOME(Packet &p);
/**
* Notification about a newgame.
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_NEWGAME(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_NEWGAME(Packet &p);
/**
* Notification about the server shutting down.
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_SHUTDOWN(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_SHUTDOWN(Packet &p);
/**
* Send the current date of the game:
@@ -269,7 +269,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_DATE(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_DATE(Packet &p);
/**
* Notification of a new client:
@@ -277,7 +277,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_CLIENT_JOIN(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_CLIENT_JOIN(Packet &p);
/**
* Client information of a specific client:
@@ -290,7 +290,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet &p);
/**
* Client update details on a specific client (e.g. after rename or move):
@@ -300,7 +300,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_CLIENT_UPDATE(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_CLIENT_UPDATE(Packet &p);
/**
* Notification about a client leaving the game.
@@ -308,7 +308,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_CLIENT_QUIT(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_CLIENT_QUIT(Packet &p);
/**
* Notification about a client error (and thus the clients disconnection).
@@ -317,7 +317,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_CLIENT_ERROR(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_CLIENT_ERROR(Packet &p);
/**
* Notification of a new company:
@@ -325,7 +325,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_COMPANY_NEW(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_COMPANY_NEW(Packet &p);
/**
* Company information on a specific company:
@@ -339,7 +339,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_COMPANY_INFO(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_COMPANY_INFO(Packet &p);
/**
* Company information of a specific company:
@@ -356,7 +356,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_COMPANY_UPDATE(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_COMPANY_UPDATE(Packet &p);
/**
* Notification about a removed company (e.g. due to bankruptcy).
@@ -365,7 +365,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_COMPANY_REMOVE(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_COMPANY_REMOVE(Packet &p);
/**
* Economy update of a specific company:
@@ -383,7 +383,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_COMPANY_ECONOMY(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_COMPANY_ECONOMY(Packet &p);
/**
* Company statistics on stations and vehicles:
@@ -401,7 +401,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_COMPANY_STATS(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_COMPANY_STATS(Packet &p);
/**
* Send chat from the game into the admin network:
@@ -413,7 +413,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_CHAT(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_CHAT(Packet &p);
/**
* Result of an rcon command:
@@ -422,7 +422,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_RCON(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_RCON(Packet &p);
/**
* Send what would be printed on the server's console also into the admin network.
@@ -431,7 +431,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_CONSOLE(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_CONSOLE(Packet &p);
/**
* Send DoCommand names to the bot upon request only.
@@ -450,7 +450,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_CMD_NAMES(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_CMD_NAMES(Packet &p);
/**
* Send incoming command packets to the admin network.
@@ -470,7 +470,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_CMD_LOGGING(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_CMD_LOGGING(Packet &p);
/**
* Send a ping-reply (pong) to the admin that sent us the ping packet.
@@ -478,7 +478,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_PONG(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_PONG(Packet &p);
/**
* Notify the admin connection that the rcon command has finished.
@@ -486,9 +486,9 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
- virtual NetworkRecvStatus Receive_SERVER_RCON_END(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_RCON_END(Packet &p);
- NetworkRecvStatus HandlePacket(Packet *p);
+ NetworkRecvStatus HandlePacket(Packet &p);
public:
NetworkRecvStatus CloseConnection(bool error = true) override;
diff --git a/src/network/core/tcp_content.cpp b/src/network/core/tcp_content.cpp
index 11df443b86..4c22c8e47c 100644
--- a/src/network/core/tcp_content.cpp
+++ b/src/network/core/tcp_content.cpp
@@ -98,9 +98,9 @@ std::optional ContentInfo::GetTextfile(TextfileType type) const
* @param p the packet to handle
* @return true if we should immediately handle further packets, false otherwise
*/
-bool NetworkContentSocketHandler::HandlePacket(Packet *p)
+bool NetworkContentSocketHandler::HandlePacket(Packet &p)
{
- PacketContentType type = (PacketContentType)p->Recv_uint8();
+ PacketContentType type = (PacketContentType)p.Recv_uint8();
switch (this->HasClientQuit() ? PACKET_CONTENT_END : type) {
case PACKET_CONTENT_CLIENT_INFO_LIST: return this->Receive_CLIENT_INFO_LIST(p);
@@ -146,12 +146,11 @@ bool NetworkContentSocketHandler::ReceivePackets()
*
* What arbitrary number to choose is the ultimate question though.
*/
- Packet *p;
+ std::unique_ptr p;
static const int MAX_PACKETS_TO_RECEIVE = 42;
int i = MAX_PACKETS_TO_RECEIVE;
while (--i != 0 && (p = this->ReceivePacket()) != nullptr) {
- bool cont = this->HandlePacket(p);
- delete p;
+ bool cont = this->HandlePacket(*p);
if (!cont) return true;
}
@@ -170,13 +169,13 @@ bool NetworkContentSocketHandler::ReceiveInvalidPacket(PacketContentType type)
return false;
}
-bool NetworkContentSocketHandler::Receive_CLIENT_INFO_LIST(Packet *) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_LIST); }
-bool NetworkContentSocketHandler::Receive_CLIENT_INFO_ID(Packet *) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_ID); }
-bool NetworkContentSocketHandler::Receive_CLIENT_INFO_EXTID(Packet *) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_EXTID); }
-bool NetworkContentSocketHandler::Receive_CLIENT_INFO_EXTID_MD5(Packet *) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_EXTID_MD5); }
-bool NetworkContentSocketHandler::Receive_SERVER_INFO(Packet *) { return this->ReceiveInvalidPacket(PACKET_CONTENT_SERVER_INFO); }
-bool NetworkContentSocketHandler::Receive_CLIENT_CONTENT(Packet *) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_CONTENT); }
-bool NetworkContentSocketHandler::Receive_SERVER_CONTENT(Packet *) { return this->ReceiveInvalidPacket(PACKET_CONTENT_SERVER_CONTENT); }
+bool NetworkContentSocketHandler::Receive_CLIENT_INFO_LIST(Packet &) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_LIST); }
+bool NetworkContentSocketHandler::Receive_CLIENT_INFO_ID(Packet &) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_ID); }
+bool NetworkContentSocketHandler::Receive_CLIENT_INFO_EXTID(Packet &) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_EXTID); }
+bool NetworkContentSocketHandler::Receive_CLIENT_INFO_EXTID_MD5(Packet &) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_EXTID_MD5); }
+bool NetworkContentSocketHandler::Receive_SERVER_INFO(Packet &) { return this->ReceiveInvalidPacket(PACKET_CONTENT_SERVER_INFO); }
+bool NetworkContentSocketHandler::Receive_CLIENT_CONTENT(Packet &) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_CONTENT); }
+bool NetworkContentSocketHandler::Receive_SERVER_CONTENT(Packet &) { return this->ReceiveInvalidPacket(PACKET_CONTENT_SERVER_CONTENT); }
/**
* Helper to get the subdirectory a #ContentInfo is located in.
diff --git a/src/network/core/tcp_content.h b/src/network/core/tcp_content.h
index 05924f05e4..95ee2805ef 100644
--- a/src/network/core/tcp_content.h
+++ b/src/network/core/tcp_content.h
@@ -34,7 +34,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_CLIENT_INFO_LIST(Packet *p);
+ virtual bool Receive_CLIENT_INFO_LIST(Packet &p);
/**
* Client requesting a list of content info:
@@ -43,7 +43,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_CLIENT_INFO_ID(Packet *p);
+ virtual bool Receive_CLIENT_INFO_ID(Packet &p);
/**
* Client requesting a list of content info based on an external
@@ -57,7 +57,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_CLIENT_INFO_EXTID(Packet *p);
+ virtual bool Receive_CLIENT_INFO_EXTID(Packet &p);
/**
* Client requesting a list of content info based on an external
@@ -72,7 +72,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_CLIENT_INFO_EXTID_MD5(Packet *p);
+ virtual bool Receive_CLIENT_INFO_EXTID_MD5(Packet &p);
/**
* Server sending list of content info:
@@ -90,7 +90,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_SERVER_INFO(Packet *p);
+ virtual bool Receive_SERVER_INFO(Packet &p);
/**
* Client requesting the actual content:
@@ -99,7 +99,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_CLIENT_CONTENT(Packet *p);
+ virtual bool Receive_CLIENT_CONTENT(Packet &p);
/**
* Server sending list of content info:
@@ -111,9 +111,9 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_SERVER_CONTENT(Packet *p);
+ virtual bool Receive_SERVER_CONTENT(Packet &p);
- bool HandlePacket(Packet *p);
+ bool HandlePacket(Packet &p);
public:
/**
* Create a new cs socket handler for a given cs
diff --git a/src/network/core/tcp_content_type.h b/src/network/core/tcp_content_type.h
index bc903bf234..23a0d65c4c 100644
--- a/src/network/core/tcp_content_type.h
+++ b/src/network/core/tcp_content_type.h
@@ -32,7 +32,7 @@ enum ContentType {
};
/** Enum with all types of TCP content packets. The order MUST not be changed **/
-enum PacketContentType {
+enum PacketContentType : uint8_t {
PACKET_CONTENT_CLIENT_INFO_LIST, ///< Queries the content server for a list of info of a given content type
PACKET_CONTENT_CLIENT_INFO_ID, ///< Queries the content server for information about a list of internal IDs
PACKET_CONTENT_CLIENT_INFO_EXTID, ///< Queries the content server for information about a list of external IDs
diff --git a/src/network/core/tcp_coordinator.cpp b/src/network/core/tcp_coordinator.cpp
index cffb36ab6d..da030dd680 100644
--- a/src/network/core/tcp_coordinator.cpp
+++ b/src/network/core/tcp_coordinator.cpp
@@ -22,9 +22,9 @@
* @param p The packet to handle.
* @return True iff we should immediately handle further packets.
*/
-bool NetworkCoordinatorSocketHandler::HandlePacket(Packet *p)
+bool NetworkCoordinatorSocketHandler::HandlePacket(Packet &p)
{
- PacketCoordinatorType type = (PacketCoordinatorType)p->Recv_uint8();
+ PacketCoordinatorType type = (PacketCoordinatorType)p.Recv_uint8();
switch (type) {
case PACKET_COORDINATOR_GC_ERROR: return this->Receive_GC_ERROR(p);
@@ -64,12 +64,11 @@ bool NetworkCoordinatorSocketHandler::ReceivePackets()
*
* What arbitrary number to choose is the ultimate question though.
*/
- Packet *p;
+ std::unique_ptr p;
static const int MAX_PACKETS_TO_RECEIVE = 42;
int i = MAX_PACKETS_TO_RECEIVE;
while (--i != 0 && (p = this->ReceivePacket()) != nullptr) {
- bool cont = this->HandlePacket(p);
- delete p;
+ bool cont = this->HandlePacket(*p);
if (!cont) return true;
}
@@ -87,20 +86,20 @@ bool NetworkCoordinatorSocketHandler::ReceiveInvalidPacket(PacketCoordinatorType
return false;
}
-bool NetworkCoordinatorSocketHandler::Receive_GC_ERROR(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_ERROR); }
-bool NetworkCoordinatorSocketHandler::Receive_SERVER_REGISTER(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERVER_REGISTER); }
-bool NetworkCoordinatorSocketHandler::Receive_GC_REGISTER_ACK(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_REGISTER_ACK); }
-bool NetworkCoordinatorSocketHandler::Receive_SERVER_UPDATE(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERVER_UPDATE); }
-bool NetworkCoordinatorSocketHandler::Receive_CLIENT_LISTING(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_CLIENT_LISTING); }
-bool NetworkCoordinatorSocketHandler::Receive_GC_LISTING(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_LISTING); }
-bool NetworkCoordinatorSocketHandler::Receive_CLIENT_CONNECT(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_CLIENT_CONNECT); }
-bool NetworkCoordinatorSocketHandler::Receive_GC_CONNECTING(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_CONNECTING); }
-bool NetworkCoordinatorSocketHandler::Receive_SERCLI_CONNECT_FAILED(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERCLI_CONNECT_FAILED); }
-bool NetworkCoordinatorSocketHandler::Receive_GC_CONNECT_FAILED(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_CONNECT_FAILED); }
-bool NetworkCoordinatorSocketHandler::Receive_CLIENT_CONNECTED(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_CLIENT_CONNECTED); }
-bool NetworkCoordinatorSocketHandler::Receive_GC_DIRECT_CONNECT(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_DIRECT_CONNECT); }
-bool NetworkCoordinatorSocketHandler::Receive_GC_STUN_REQUEST(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_STUN_REQUEST); }
-bool NetworkCoordinatorSocketHandler::Receive_SERCLI_STUN_RESULT(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERCLI_STUN_RESULT); }
-bool NetworkCoordinatorSocketHandler::Receive_GC_STUN_CONNECT(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_STUN_CONNECT); }
-bool NetworkCoordinatorSocketHandler::Receive_GC_NEWGRF_LOOKUP(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_NEWGRF_LOOKUP); }
-bool NetworkCoordinatorSocketHandler::Receive_GC_TURN_CONNECT(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_TURN_CONNECT); }
+bool NetworkCoordinatorSocketHandler::Receive_GC_ERROR(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_ERROR); }
+bool NetworkCoordinatorSocketHandler::Receive_SERVER_REGISTER(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERVER_REGISTER); }
+bool NetworkCoordinatorSocketHandler::Receive_GC_REGISTER_ACK(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_REGISTER_ACK); }
+bool NetworkCoordinatorSocketHandler::Receive_SERVER_UPDATE(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERVER_UPDATE); }
+bool NetworkCoordinatorSocketHandler::Receive_CLIENT_LISTING(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_CLIENT_LISTING); }
+bool NetworkCoordinatorSocketHandler::Receive_GC_LISTING(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_LISTING); }
+bool NetworkCoordinatorSocketHandler::Receive_CLIENT_CONNECT(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_CLIENT_CONNECT); }
+bool NetworkCoordinatorSocketHandler::Receive_GC_CONNECTING(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_CONNECTING); }
+bool NetworkCoordinatorSocketHandler::Receive_SERCLI_CONNECT_FAILED(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERCLI_CONNECT_FAILED); }
+bool NetworkCoordinatorSocketHandler::Receive_GC_CONNECT_FAILED(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_CONNECT_FAILED); }
+bool NetworkCoordinatorSocketHandler::Receive_CLIENT_CONNECTED(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_CLIENT_CONNECTED); }
+bool NetworkCoordinatorSocketHandler::Receive_GC_DIRECT_CONNECT(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_DIRECT_CONNECT); }
+bool NetworkCoordinatorSocketHandler::Receive_GC_STUN_REQUEST(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_STUN_REQUEST); }
+bool NetworkCoordinatorSocketHandler::Receive_SERCLI_STUN_RESULT(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERCLI_STUN_RESULT); }
+bool NetworkCoordinatorSocketHandler::Receive_GC_STUN_CONNECT(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_STUN_CONNECT); }
+bool NetworkCoordinatorSocketHandler::Receive_GC_NEWGRF_LOOKUP(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_NEWGRF_LOOKUP); }
+bool NetworkCoordinatorSocketHandler::Receive_GC_TURN_CONNECT(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_TURN_CONNECT); }
diff --git a/src/network/core/tcp_coordinator.h b/src/network/core/tcp_coordinator.h
index 6e6b98f5c1..9f00714891 100644
--- a/src/network/core/tcp_coordinator.h
+++ b/src/network/core/tcp_coordinator.h
@@ -25,7 +25,7 @@
* CLIENT -> packets from Client to Game Coordinator.
* SERCLI -> packets from either the Server or Client to Game Coordinator.
**/
-enum PacketCoordinatorType {
+enum PacketCoordinatorType : uint8_t {
PACKET_COORDINATOR_GC_ERROR, ///< Game Coordinator indicates there was an error.
PACKET_COORDINATOR_SERVER_REGISTER, ///< Server registration.
PACKET_COORDINATOR_GC_REGISTER_ACK, ///< Game Coordinator accepts the registration.
@@ -83,7 +83,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_GC_ERROR(Packet *p);
+ virtual bool Receive_GC_ERROR(Packet &p);
/**
* Server is starting a multiplayer game and wants to let the
@@ -98,7 +98,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_SERVER_REGISTER(Packet *p);
+ virtual bool Receive_SERVER_REGISTER(Packet &p);
/**
* Game Coordinator acknowledges the registration.
@@ -110,7 +110,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_GC_REGISTER_ACK(Packet *p);
+ virtual bool Receive_GC_REGISTER_ACK(Packet &p);
/**
* Send an update of the current state of the server to the Game Coordinator.
@@ -121,7 +121,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_SERVER_UPDATE(Packet *p);
+ virtual bool Receive_SERVER_UPDATE(Packet &p);
/**
* Client requests a list of all public servers.
@@ -134,7 +134,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_CLIENT_LISTING(Packet *p);
+ virtual bool Receive_CLIENT_LISTING(Packet &p);
/**
* Game Coordinator replies with a list of all public servers. Multiple
@@ -149,7 +149,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_GC_LISTING(Packet *p);
+ virtual bool Receive_GC_LISTING(Packet &p);
/**
* Client wants to connect to a Server.
@@ -160,7 +160,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_CLIENT_CONNECT(Packet *p);
+ virtual bool Receive_CLIENT_CONNECT(Packet &p);
/**
* Game Coordinator informs the Client under what token it will start the
@@ -172,7 +172,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_GC_CONNECTING(Packet *p);
+ virtual bool Receive_GC_CONNECTING(Packet &p);
/**
* Client or Server failed to connect to the remote side.
@@ -184,7 +184,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_SERCLI_CONNECT_FAILED(Packet *p);
+ virtual bool Receive_SERCLI_CONNECT_FAILED(Packet &p);
/**
* Game Coordinator informs the Client that it failed to find a way to
@@ -196,7 +196,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_GC_CONNECT_FAILED(Packet *p);
+ virtual bool Receive_GC_CONNECT_FAILED(Packet &p);
/**
* Client informs the Game Coordinator the connection with the Server is
@@ -208,7 +208,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_CLIENT_CONNECTED(Packet *p);
+ virtual bool Receive_CLIENT_CONNECTED(Packet &p);
/**
* Game Coordinator requests that the Client makes a direct connection to
@@ -222,7 +222,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_GC_DIRECT_CONNECT(Packet *p);
+ virtual bool Receive_GC_DIRECT_CONNECT(Packet &p);
/**
* Game Coordinator requests the client/server to do a STUN request to the
@@ -237,7 +237,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_GC_STUN_REQUEST(Packet *p);
+ virtual bool Receive_GC_STUN_REQUEST(Packet &p);
/**
* Client/server informs the Game Coordinator the result of a STUN request.
@@ -250,7 +250,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_SERCLI_STUN_RESULT(Packet *p);
+ virtual bool Receive_SERCLI_STUN_RESULT(Packet &p);
/**
* Game Coordinator informs the client/server of its STUN peer (the host:ip
@@ -266,7 +266,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_GC_STUN_CONNECT(Packet *p);
+ virtual bool Receive_GC_STUN_CONNECT(Packet &p);
/**
* Game Coordinator informs the client of updates for the NewGRFs lookup table
@@ -289,7 +289,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_GC_NEWGRF_LOOKUP(Packet *p);
+ virtual bool Receive_GC_NEWGRF_LOOKUP(Packet &p);
/**
* Game Coordinator requests that we make a connection to the indicated
@@ -303,9 +303,9 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_GC_TURN_CONNECT(Packet *p);
+ virtual bool Receive_GC_TURN_CONNECT(Packet &p);
- bool HandlePacket(Packet *p);
+ bool HandlePacket(Packet &p);
public:
/**
* Create a new cs socket handler for a given cs.
diff --git a/src/network/core/tcp_game.cpp b/src/network/core/tcp_game.cpp
index 0f8051eef6..4bd32ec153 100644
--- a/src/network/core/tcp_game.cpp
+++ b/src/network/core/tcp_game.cpp
@@ -61,9 +61,9 @@ NetworkRecvStatus NetworkGameSocketHandler::CloseConnection(bool)
* @param p the packet to handle
* @return #NetworkRecvStatus of handling.
*/
-NetworkRecvStatus NetworkGameSocketHandler::HandlePacket(Packet *p)
+NetworkRecvStatus NetworkGameSocketHandler::HandlePacket(Packet &p)
{
- PacketGameType type = (PacketGameType)p->Recv_uint8();
+ PacketGameType type = (PacketGameType)p.Recv_uint8();
if (this->HasClientQuit()) {
Debug(net, 0, "[tcp/game] Received invalid packet from client {}", this->client_id);
@@ -135,10 +135,9 @@ NetworkRecvStatus NetworkGameSocketHandler::HandlePacket(Packet *p)
*/
NetworkRecvStatus NetworkGameSocketHandler::ReceivePackets()
{
- Packet *p;
+ std::unique_ptr p;
while ((p = this->ReceivePacket()) != nullptr) {
- NetworkRecvStatus res = HandlePacket(p);
- delete p;
+ NetworkRecvStatus res = HandlePacket(*p);
if (res != NETWORK_RECV_STATUS_OKAY) return res;
}
@@ -156,50 +155,50 @@ NetworkRecvStatus NetworkGameSocketHandler::ReceiveInvalidPacket(PacketGameType
return NETWORK_RECV_STATUS_MALFORMED_PACKET;
}
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_FULL(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_FULL); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_BANNED); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_JOIN); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_ERROR); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_GAME_INFO(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_GAME_INFO); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_GAME_INFO); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_CLIENT_INFO); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_NEED_GAME_PASSWORD(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_NEED_GAME_PASSWORD); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_NEED_COMPANY_PASSWORD(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_NEED_COMPANY_PASSWORD); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_GAME_PASSWORD(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_GAME_PASSWORD); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_COMPANY_PASSWORD(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_COMPANY_PASSWORD); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_WELCOME(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_WELCOME); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_GETMAP(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_GETMAP); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_WAIT(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_WAIT); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_BEGIN(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_BEGIN); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_SIZE(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_SIZE); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_DATA(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_DATA); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_DONE); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_MAP_OK(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_MAP_OK); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_JOIN(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_JOIN); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_FRAME(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_FRAME); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_SYNC(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_SYNC); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_ACK(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_ACK); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_COMMAND); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_COMMAND); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_CHAT(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_CHAT); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CHAT(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_CHAT); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_EXTERNAL_CHAT(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_EXTERNAL_CHAT); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_SET_PASSWORD(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_SET_PASSWORD); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_SET_NAME); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_QUIT(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_QUIT); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_ERROR); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_QUIT(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_QUIT); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_ERROR_QUIT(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_ERROR_QUIT); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_SHUTDOWN(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_SHUTDOWN); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_NEWGAME(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_NEWGAME); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_RCON(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_RCON); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_RCON(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_RCON); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_CHECK_NEWGRFS); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_NEWGRFS_CHECKED(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_NEWGRFS_CHECKED); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MOVE(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_MOVE); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_MOVE(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_MOVE); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_COMPANY_UPDATE(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_COMPANY_UPDATE); }
-NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CONFIG_UPDATE(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_CONFIG_UPDATE); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_FULL(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_FULL); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_BANNED(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_BANNED); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_JOIN); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_ERROR(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_ERROR); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_GAME_INFO(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_GAME_INFO); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_GAME_INFO); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_CLIENT_INFO); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_NEED_GAME_PASSWORD(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_NEED_GAME_PASSWORD); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_NEED_COMPANY_PASSWORD(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_NEED_COMPANY_PASSWORD); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_GAME_PASSWORD(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_GAME_PASSWORD); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_COMPANY_PASSWORD(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_COMPANY_PASSWORD); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_WELCOME(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_WELCOME); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_GETMAP(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_GETMAP); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_WAIT(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_WAIT); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_BEGIN(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_BEGIN); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_SIZE(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_SIZE); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_DATA(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_DATA); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_DONE); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_MAP_OK(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_MAP_OK); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_JOIN(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_JOIN); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_FRAME(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_FRAME); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_SYNC(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_SYNC); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_ACK(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_ACK); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_COMMAND); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_COMMAND); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_CHAT(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_CHAT); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CHAT(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_CHAT); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_EXTERNAL_CHAT(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_EXTERNAL_CHAT); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_SET_PASSWORD(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_SET_PASSWORD); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_SET_NAME); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_QUIT(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_QUIT); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_ERROR); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_QUIT(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_QUIT); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_ERROR_QUIT(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_ERROR_QUIT); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_SHUTDOWN(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_SHUTDOWN); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_NEWGAME(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_NEWGAME); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_RCON(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_RCON); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_RCON(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_RCON); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_CHECK_NEWGRFS); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_NEWGRFS_CHECKED(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_NEWGRFS_CHECKED); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MOVE(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_MOVE); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_MOVE(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_MOVE); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_COMPANY_UPDATE(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_COMPANY_UPDATE); }
+NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CONFIG_UPDATE(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_CONFIG_UPDATE); }
void NetworkGameSocketHandler::DeferDeletion()
{
diff --git a/src/network/core/tcp_game.h b/src/network/core/tcp_game.h
index 86705a0723..ce031aa07b 100644
--- a/src/network/core/tcp_game.h
+++ b/src/network/core/tcp_game.h
@@ -22,7 +22,7 @@
* Enum with all types of TCP packets.
* For the exact meaning, look at #NetworkGameSocketHandler.
*/
-enum PacketGameType {
+enum PacketGameType : uint8_t {
/*
* These first four pair of packets (thus eight in
* total) must remain in this order for backward
@@ -131,24 +131,12 @@ enum PacketGameType {
/** Packet that wraps a command */
struct CommandPacket;
-/** A queue of CommandPackets. */
-class CommandQueue {
- CommandPacket *first; ///< The first packet in the queue.
- CommandPacket *last; ///< The last packet in the queue; only valid when first != nullptr.
- uint count; ///< The number of items in the queue.
-
-public:
- /** Initialise the command queue. */
- CommandQueue() : first(nullptr), last(nullptr), count(0) {}
- /** Clear the command queue. */
- ~CommandQueue() { this->Free(); }
- void Append(CommandPacket *p);
- CommandPacket *Pop(bool ignore_paused = false);
- CommandPacket *Peek(bool ignore_paused = false);
- void Free();
- /** Get the number of items in the queue. */
- uint Count() const { return this->count; }
-};
+/**
+ * A "queue" of CommandPackets.
+ * Not a std::queue because, when paused, some commands remain on the queue.
+ * In other words, you do not always pop the first element from this queue.
+ */
+using CommandQueue = std::vector;
/** Base socket handler for all TCP sockets */
class NetworkGameSocketHandler : public NetworkTCPSocketHandler {
@@ -164,13 +152,13 @@ protected:
* Notification that the server is full.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_FULL(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_FULL(Packet &p);
/**
* Notification that the client trying to join is banned.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_BANNED(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_BANNED(Packet &p);
/**
* Try to join the server:
@@ -180,27 +168,27 @@ protected:
* uint8_t ID of the clients Language.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_CLIENT_JOIN(Packet *p);
+ virtual NetworkRecvStatus Receive_CLIENT_JOIN(Packet &p);
/**
* The client made an error:
* uint8_t Error code caused (see NetworkErrorCode).
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_ERROR(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_ERROR(Packet &p);
/**
* Request game information.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_CLIENT_GAME_INFO(Packet *p);
+ virtual NetworkRecvStatus Receive_CLIENT_GAME_INFO(Packet &p);
/**
* Sends information about the game.
* Serialized NetworkGameInfo. See game_info.h for details.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_GAME_INFO(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_GAME_INFO(Packet &p);
/**
* Send information about a client:
@@ -209,13 +197,13 @@ protected:
* string Name of the client.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet &p);
/**
* Indication to the client that the server needs a game password.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_NEED_GAME_PASSWORD(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_NEED_GAME_PASSWORD(Packet &p);
/**
* Indication to the client that the server needs a company password:
@@ -223,7 +211,7 @@ protected:
* string Network ID of the server.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_NEED_COMPANY_PASSWORD(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_NEED_COMPANY_PASSWORD(Packet &p);
/**
* Send a password to the server to authorize:
@@ -231,7 +219,7 @@ protected:
* string The password.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_CLIENT_GAME_PASSWORD(Packet *p);
+ virtual NetworkRecvStatus Receive_CLIENT_GAME_PASSWORD(Packet &p);
/**
* Send a password to the server to authorize
@@ -239,7 +227,7 @@ protected:
* string The password.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_CLIENT_COMPANY_PASSWORD(Packet *p);
+ virtual NetworkRecvStatus Receive_CLIENT_COMPANY_PASSWORD(Packet &p);
/**
* The client is joined and ready to receive their map:
@@ -248,61 +236,61 @@ protected:
* string Network ID of the server.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_WELCOME(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_WELCOME(Packet &p);
/**
* Request the map from the server.
* uint32_t NewGRF version (release versions of OpenTTD only).
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_CLIENT_GETMAP(Packet *p);
+ virtual NetworkRecvStatus Receive_CLIENT_GETMAP(Packet &p);
/**
* Notification that another client is currently receiving the map:
* uint8_t Number of clients waiting in front of you.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_WAIT(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_WAIT(Packet &p);
/**
* Sends that the server will begin with sending the map to the client:
* uint32_t Current frame.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_MAP_BEGIN(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_MAP_BEGIN(Packet &p);
/**
* Sends the size of the map to the client.
* uint32_t Size of the (compressed) map (in bytes).
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_MAP_SIZE(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_MAP_SIZE(Packet &p);
/**
* Sends the data of the map to the client:
* Contains a part of the map (until max size of packet).
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_MAP_DATA(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_MAP_DATA(Packet &p);
/**
* Sends that all data of the map are sent to the client:
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_MAP_DONE(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_MAP_DONE(Packet &p);
/**
* Tell the server that we are done receiving/loading the map.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_CLIENT_MAP_OK(Packet *p);
+ virtual NetworkRecvStatus Receive_CLIENT_MAP_OK(Packet &p);
/**
* A client joined (PACKET_CLIENT_MAP_OK), what usually directly follows is a PACKET_SERVER_CLIENT_INFO:
* uint32_t ID of the client that just joined the game.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_JOIN(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_JOIN(Packet &p);
/**
* Sends the current frame counter to the client:
@@ -313,7 +301,7 @@ protected:
* uint8_t Random token to validate the client is actually listening (only occasionally present).
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_FRAME(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_FRAME(Packet &p);
/**
* Sends a sync-check to the client:
@@ -322,7 +310,7 @@ protected:
* uint32_t General seed 2 (dependent on compile settings, not default).
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_SYNC(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_SYNC(Packet &p);
/**
* Tell the server we are done with this frame:
@@ -330,7 +318,7 @@ protected:
* uint8_t The random token that the server sent in the PACKET_SERVER_FRAME packet.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_CLIENT_ACK(Packet *p);
+ virtual NetworkRecvStatus Receive_CLIENT_ACK(Packet &p);
/**
* Send a DoCommand to the Server:
@@ -341,7 +329,7 @@ protected:
* uint8_t ID of the callback.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_CLIENT_COMMAND(Packet *p);
+ virtual NetworkRecvStatus Receive_CLIENT_COMMAND(Packet &p);
/**
* Sends a DoCommand to the client:
@@ -353,7 +341,7 @@ protected:
* uint32_t Frame of execution.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_COMMAND(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_COMMAND(Packet &p);
/**
* Sends a chat-packet to the server:
@@ -364,7 +352,7 @@ protected:
* uint64_t data (used e.g. for 'give money' actions).
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_CLIENT_CHAT(Packet *p);
+ virtual NetworkRecvStatus Receive_CLIENT_CHAT(Packet &p);
/**
* Sends a chat-packet to the client:
@@ -374,7 +362,7 @@ protected:
* uint64_t data (used e.g. for 'give money' actions).
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_CHAT(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_CHAT(Packet &p);
/**
* Sends a chat-packet for external source to the client:
@@ -384,41 +372,41 @@ protected:
* string Message (max NETWORK_CHAT_LENGTH).
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_EXTERNAL_CHAT(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_EXTERNAL_CHAT(Packet &p);
/**
* Set the password for the clients current company:
* string The password.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_CLIENT_SET_PASSWORD(Packet *p);
+ virtual NetworkRecvStatus Receive_CLIENT_SET_PASSWORD(Packet &p);
/**
* Gives the client a new name:
* string New name of the client.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_CLIENT_SET_NAME(Packet *p);
+ virtual NetworkRecvStatus Receive_CLIENT_SET_NAME(Packet &p);
/**
* The client is quitting the game.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_CLIENT_QUIT(Packet *p);
+ virtual NetworkRecvStatus Receive_CLIENT_QUIT(Packet &p);
/**
* The client made an error and is quitting the game.
* uint8_t Error of the code caused (see NetworkErrorCode).
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_CLIENT_ERROR(Packet *p);
+ virtual NetworkRecvStatus Receive_CLIENT_ERROR(Packet &p);
/**
* Notification that a client left the game:
* uint32_t ID of the client.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_QUIT(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_QUIT(Packet &p);
/**
* Inform all clients that one client made an error and thus has quit/been disconnected:
@@ -426,19 +414,19 @@ protected:
* uint8_t Code of the error caused (see NetworkErrorCode).
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_ERROR_QUIT(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_ERROR_QUIT(Packet &p);
/**
* Let the clients know that the server is closing.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_SHUTDOWN(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_SHUTDOWN(Packet &p);
/**
* Let the clients know that the server is loading a new map.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_NEWGAME(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_NEWGAME(Packet &p);
/**
* Send the result of an issues RCon command back to the client:
@@ -446,7 +434,7 @@ protected:
* string Output of the RCon command
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_RCON(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_RCON(Packet &p);
/**
* Send an RCon command to the server:
@@ -454,7 +442,7 @@ protected:
* string Command to be executed.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_CLIENT_RCON(Packet *p);
+ virtual NetworkRecvStatus Receive_CLIENT_RCON(Packet &p);
/**
* Sends information about all used GRFs to the client:
@@ -463,13 +451,13 @@ protected:
* 16 * uint8_t MD5 checksum of the GRF
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_CHECK_NEWGRFS(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_CHECK_NEWGRFS(Packet &p);
/**
* Tell the server that we have the required GRFs
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_CLIENT_NEWGRFS_CHECKED(Packet *p);
+ virtual NetworkRecvStatus Receive_CLIENT_NEWGRFS_CHECKED(Packet &p);
/**
* Move a client from one company into another:
@@ -477,7 +465,7 @@ protected:
* uint8_t ID of the new company.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_MOVE(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_MOVE(Packet &p);
/**
* Request the server to move this client into another company:
@@ -485,14 +473,14 @@ protected:
* string Password, if the company is password protected.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_CLIENT_MOVE(Packet *p);
+ virtual NetworkRecvStatus Receive_CLIENT_MOVE(Packet &p);
/**
* Update the clients knowledge of which company is password protected:
* uint16_t Bitwise representation of each company
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_COMPANY_UPDATE(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_COMPANY_UPDATE(Packet &p);
/**
* Update the clients knowledge of the max settings:
@@ -500,9 +488,9 @@ protected:
* uint8_t Maximum number of spectators allowed.
* @param p The packet that was just received.
*/
- virtual NetworkRecvStatus Receive_SERVER_CONFIG_UPDATE(Packet *p);
+ virtual NetworkRecvStatus Receive_SERVER_CONFIG_UPDATE(Packet &p);
- NetworkRecvStatus HandlePacket(Packet *p);
+ NetworkRecvStatus HandlePacket(Packet &p);
NetworkGameSocketHandler(SOCKET s);
public:
@@ -542,8 +530,8 @@ public:
NetworkRecvStatus ReceivePackets();
- const char *ReceiveCommand(Packet *p, CommandPacket *cp);
- void SendCommand(Packet *p, const CommandPacket *cp);
+ const char *ReceiveCommand(Packet &p, CommandPacket &cp);
+ void SendCommand(Packet &p, const CommandPacket &cp);
bool IsPendingDeletion() const { return this->is_pending_deletion; }
diff --git a/src/network/core/tcp_stun.cpp b/src/network/core/tcp_stun.cpp
index 1445fe30e5..a03bb7cf72 100644
--- a/src/network/core/tcp_stun.cpp
+++ b/src/network/core/tcp_stun.cpp
@@ -26,4 +26,4 @@ bool NetworkStunSocketHandler::ReceiveInvalidPacket(PacketStunType type)
return false;
}
-bool NetworkStunSocketHandler::Receive_SERCLI_STUN(Packet *) { return this->ReceiveInvalidPacket(PACKET_STUN_SERCLI_STUN); }
+bool NetworkStunSocketHandler::Receive_SERCLI_STUN(Packet &) { return this->ReceiveInvalidPacket(PACKET_STUN_SERCLI_STUN); }
diff --git a/src/network/core/tcp_stun.h b/src/network/core/tcp_stun.h
index 2eca700181..0fce3b2a07 100644
--- a/src/network/core/tcp_stun.h
+++ b/src/network/core/tcp_stun.h
@@ -17,7 +17,7 @@
#include "packet.h"
/** Enum with all types of TCP STUN packets. The order MUST not be changed. **/
-enum PacketStunType {
+enum PacketStunType : uint8_t {
PACKET_STUN_SERCLI_STUN, ///< Send a STUN request to the STUN server.
PACKET_STUN_END, ///< Must ALWAYS be on the end of this list!! (period)
};
@@ -39,7 +39,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_SERCLI_STUN(Packet *p);
+ virtual bool Receive_SERCLI_STUN(Packet &p);
public:
/**
diff --git a/src/network/core/tcp_turn.cpp b/src/network/core/tcp_turn.cpp
index 76096aeb2b..ae600e7bfb 100644
--- a/src/network/core/tcp_turn.cpp
+++ b/src/network/core/tcp_turn.cpp
@@ -22,9 +22,9 @@
* @param p the packet to handle
* @return true if we should immediately handle further packets, false otherwise
*/
-bool NetworkTurnSocketHandler::HandlePacket(Packet *p)
+bool NetworkTurnSocketHandler::HandlePacket(Packet &p)
{
- PacketTurnType type = (PacketTurnType)p->Recv_uint8();
+ PacketTurnType type = (PacketTurnType)p.Recv_uint8();
switch (type) {
case PACKET_TURN_TURN_ERROR: return this->Receive_TURN_ERROR(p);
@@ -43,12 +43,11 @@ bool NetworkTurnSocketHandler::HandlePacket(Packet *p)
*/
bool NetworkTurnSocketHandler::ReceivePackets()
{
- Packet *p;
+ std::unique_ptr p;
static const int MAX_PACKETS_TO_RECEIVE = 4;
int i = MAX_PACKETS_TO_RECEIVE;
while (--i != 0 && (p = this->ReceivePacket()) != nullptr) {
- bool cont = this->HandlePacket(p);
- delete p;
+ bool cont = this->HandlePacket(*p);
if (!cont) return true;
}
@@ -66,6 +65,6 @@ bool NetworkTurnSocketHandler::ReceiveInvalidPacket(PacketTurnType type)
return false;
}
-bool NetworkTurnSocketHandler::Receive_TURN_ERROR(Packet *) { return this->ReceiveInvalidPacket(PACKET_TURN_TURN_ERROR); }
-bool NetworkTurnSocketHandler::Receive_SERCLI_CONNECT(Packet *) { return this->ReceiveInvalidPacket(PACKET_TURN_SERCLI_CONNECT); }
-bool NetworkTurnSocketHandler::Receive_TURN_CONNECTED(Packet *) { return this->ReceiveInvalidPacket(PACKET_TURN_TURN_CONNECTED); }
+bool NetworkTurnSocketHandler::Receive_TURN_ERROR(Packet &) { return this->ReceiveInvalidPacket(PACKET_TURN_TURN_ERROR); }
+bool NetworkTurnSocketHandler::Receive_SERCLI_CONNECT(Packet &) { return this->ReceiveInvalidPacket(PACKET_TURN_SERCLI_CONNECT); }
+bool NetworkTurnSocketHandler::Receive_TURN_CONNECTED(Packet &) { return this->ReceiveInvalidPacket(PACKET_TURN_TURN_CONNECTED); }
diff --git a/src/network/core/tcp_turn.h b/src/network/core/tcp_turn.h
index b54a857982..e9558b252e 100644
--- a/src/network/core/tcp_turn.h
+++ b/src/network/core/tcp_turn.h
@@ -18,7 +18,7 @@
#include "network_game_info.h"
/** Enum with all types of TCP TURN packets. The order MUST not be changed. **/
-enum PacketTurnType {
+enum PacketTurnType : uint8_t {
PACKET_TURN_TURN_ERROR, ///< TURN server is unable to relay.
PACKET_TURN_SERCLI_CONNECT, ///< Client or server is connecting to the TURN server.
PACKET_TURN_TURN_CONNECTED, ///< TURN server indicates the socket is now being relayed.
@@ -38,7 +38,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_TURN_ERROR(Packet *p);
+ virtual bool Receive_TURN_ERROR(Packet &p);
/**
* Client or servers wants to connect to the TURN server (on request by
@@ -50,7 +50,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_SERCLI_CONNECT(Packet *p);
+ virtual bool Receive_SERCLI_CONNECT(Packet &p);
/**
* TURN server has connected client and server together and will now relay
@@ -62,9 +62,9 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
- virtual bool Receive_TURN_CONNECTED(Packet *p);
+ virtual bool Receive_TURN_CONNECTED(Packet &p);
- bool HandlePacket(Packet *p);
+ bool HandlePacket(Packet &p);
public:
/**
* Create a new cs socket handler for a given cs.
diff --git a/src/network/core/udp.cpp b/src/network/core/udp.cpp
index 2efb14e1dd..04324e0098 100644
--- a/src/network/core/udp.cpp
+++ b/src/network/core/udp.cpp
@@ -71,19 +71,19 @@ void NetworkUDPSocketHandler::CloseSocket()
* @param all send the packet using all sockets that can send it
* @param broadcast whether to send a broadcast message
*/
-void NetworkUDPSocketHandler::SendPacket(Packet *p, NetworkAddress *recv, bool all, bool broadcast)
+void NetworkUDPSocketHandler::SendPacket(Packet &p, NetworkAddress &recv, bool all, bool broadcast)
{
if (this->sockets.empty()) this->Listen();
for (auto &s : this->sockets) {
/* Make a local copy because if we resolve it we cannot
* easily unresolve it so we can resolve it later again. */
- NetworkAddress send(*recv);
+ NetworkAddress send(recv);
/* Not the same type */
if (!send.IsFamily(s.second.GetAddress()->ss_family)) continue;
- p->PrepareToSend();
+ p.PrepareToSend();
if (broadcast) {
/* Enable broadcast */
@@ -94,7 +94,7 @@ void NetworkUDPSocketHandler::SendPacket(Packet *p, NetworkAddress *recv, bool a
}
/* Send the buffer */
- ssize_t res = p->TransferOut(sendto, s.first, 0, (const struct sockaddr *)send.GetAddress(), send.GetAddressLength());
+ ssize_t res = p.TransferOut(sendto, s.first, 0, (const struct sockaddr *)send.GetAddress(), send.GetAddressLength());
Debug(net, 7, "sendto({})", send.GetAddressAsString());
/* Check for any errors, but ignore it otherwise */
@@ -140,7 +140,7 @@ void NetworkUDPSocketHandler::ReceivePackets()
p.PrepareToRead();
/* Handle the packet */
- this->HandleUDPPacket(&p, &address);
+ this->HandleUDPPacket(p, address);
}
}
}
@@ -150,14 +150,14 @@ void NetworkUDPSocketHandler::ReceivePackets()
* @param p the received packet
* @param client_addr the sender of the packet
*/
-void NetworkUDPSocketHandler::HandleUDPPacket(Packet *p, NetworkAddress *client_addr)
+void NetworkUDPSocketHandler::HandleUDPPacket(Packet &p, NetworkAddress &client_addr)
{
PacketUDPType type;
/* New packet == new client, which has not quit yet */
this->Reopen();
- type = (PacketUDPType)p->Recv_uint8();
+ type = (PacketUDPType)p.Recv_uint8();
switch (this->HasClientQuit() ? PACKET_UDP_END : type) {
case PACKET_UDP_CLIENT_FIND_SERVER: this->Receive_CLIENT_FIND_SERVER(p, client_addr); break;
@@ -165,9 +165,9 @@ void NetworkUDPSocketHandler::HandleUDPPacket(Packet *p, NetworkAddress *client_
default:
if (this->HasClientQuit()) {
- Debug(net, 0, "[udp] Received invalid packet type {} from {}", type, client_addr->GetAddressAsString());
+ Debug(net, 0, "[udp] Received invalid packet type {} from {}", type, client_addr.GetAddressAsString());
} else {
- Debug(net, 0, "[udp] Received illegal packet from {}", client_addr->GetAddressAsString());
+ Debug(net, 0, "[udp] Received illegal packet from {}", client_addr.GetAddressAsString());
}
break;
}
@@ -178,10 +178,10 @@ void NetworkUDPSocketHandler::HandleUDPPacket(Packet *p, NetworkAddress *client_
* @param type The received packet type.
* @param client_addr The address we received the packet from.
*/
-void NetworkUDPSocketHandler::ReceiveInvalidPacket(PacketUDPType type, NetworkAddress *client_addr)
+void NetworkUDPSocketHandler::ReceiveInvalidPacket(PacketUDPType type, NetworkAddress &client_addr)
{
- Debug(net, 0, "[udp] Received packet type {} on wrong port from {}", type, client_addr->GetAddressAsString());
+ Debug(net, 0, "[udp] Received packet type {} on wrong port from {}", type, client_addr.GetAddressAsString());
}
-void NetworkUDPSocketHandler::Receive_CLIENT_FIND_SERVER(Packet *, NetworkAddress *client_addr) { this->ReceiveInvalidPacket(PACKET_UDP_CLIENT_FIND_SERVER, client_addr); }
-void NetworkUDPSocketHandler::Receive_SERVER_RESPONSE(Packet *, NetworkAddress *client_addr) { this->ReceiveInvalidPacket(PACKET_UDP_SERVER_RESPONSE, client_addr); }
+void NetworkUDPSocketHandler::Receive_CLIENT_FIND_SERVER(Packet &, NetworkAddress &client_addr) { this->ReceiveInvalidPacket(PACKET_UDP_CLIENT_FIND_SERVER, client_addr); }
+void NetworkUDPSocketHandler::Receive_SERVER_RESPONSE(Packet &, NetworkAddress &client_addr) { this->ReceiveInvalidPacket(PACKET_UDP_SERVER_RESPONSE, client_addr); }
diff --git a/src/network/core/udp.h b/src/network/core/udp.h
index 61866351d8..fc5412b861 100644
--- a/src/network/core/udp.h
+++ b/src/network/core/udp.h
@@ -16,7 +16,7 @@
#include "packet.h"
/** Enum with all types of UDP packets. The order MUST not be changed **/
-enum PacketUDPType {
+enum PacketUDPType : uint8_t {
PACKET_UDP_CLIENT_FIND_SERVER, ///< Queries a game server for game information
PACKET_UDP_SERVER_RESPONSE, ///< Reply of the game server with game information
PACKET_UDP_END, ///< Must ALWAYS be on the end of this list!! (period)
@@ -30,23 +30,23 @@ protected:
/** The opened sockets. */
SocketList sockets;
- void ReceiveInvalidPacket(PacketUDPType, NetworkAddress *client_addr);
+ void ReceiveInvalidPacket(PacketUDPType, NetworkAddress &client_addr);
/**
* Queries to the server for information about the game.
* @param p The received packet.
* @param client_addr The origin of the packet.
*/
- virtual void Receive_CLIENT_FIND_SERVER(Packet *p, NetworkAddress *client_addr);
+ virtual void Receive_CLIENT_FIND_SERVER(Packet &p, NetworkAddress &client_addr);
/**
* Response to a query letting the client know we are here.
* @param p The received packet.
* @param client_addr The origin of the packet.
*/
- virtual void Receive_SERVER_RESPONSE(Packet *p, NetworkAddress *client_addr);
+ virtual void Receive_SERVER_RESPONSE(Packet &p, NetworkAddress &client_addr);
- void HandleUDPPacket(Packet *p, NetworkAddress *client_addr);
+ void HandleUDPPacket(Packet &p, NetworkAddress &client_addr);
public:
NetworkUDPSocketHandler(NetworkAddressList *bind = nullptr);
@@ -56,7 +56,7 @@ public:
bool Listen();
void CloseSocket();
- void SendPacket(Packet *p, NetworkAddress *recv, bool all = false, bool broadcast = false);
+ void SendPacket(Packet &p, NetworkAddress &recv, bool all = false, bool broadcast = false);
void ReceivePackets();
};
diff --git a/src/network/network_admin.cpp b/src/network/network_admin.cpp
index 3df0182937..a9633c4437 100644
--- a/src/network/network_admin.cpp
+++ b/src/network/network_admin.cpp
@@ -134,10 +134,10 @@ ServerNetworkAdminSocketHandler::~ServerNetworkAdminSocketHandler()
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendError(NetworkErrorCode error)
{
- Packet *p = new Packet(ADMIN_PACKET_SERVER_ERROR);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_ERROR);
p->Send_uint8(error);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
std::string error_message = GetString(GetNetworkErrorMsg(error));
@@ -149,7 +149,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendError(NetworkErrorCode er
/** Send the protocol version to the admin. */
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendProtocol()
{
- Packet *p = new Packet(ADMIN_PACKET_SERVER_PROTOCOL);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_PROTOCOL);
/* announce the protocol version */
p->Send_uint8(NETWORK_GAME_ADMIN_VERSION);
@@ -161,7 +161,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendProtocol()
}
p->Send_bool(false);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return this->SendWelcome();
}
@@ -169,7 +169,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendProtocol()
/** Send a welcome message to the admin. */
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendWelcome()
{
- Packet *p = new Packet(ADMIN_PACKET_SERVER_WELCOME);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_WELCOME);
p->Send_string(_settings_client.network.server_name);
p->Send_string(GetNetworkRevisionString());
@@ -182,7 +182,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendWelcome()
p->Send_uint16(Map::SizeX());
p->Send_uint16(Map::SizeY());
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -190,26 +190,26 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendWelcome()
/** Tell the admin we started a new game. */
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendNewGame()
{
- Packet *p = new Packet(ADMIN_PACKET_SERVER_NEWGAME);
- this->SendPacket(p);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_NEWGAME);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
/** Tell the admin we're shutting down. */
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendShutdown()
{
- Packet *p = new Packet(ADMIN_PACKET_SERVER_SHUTDOWN);
- this->SendPacket(p);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_SHUTDOWN);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
/** Tell the admin the date. */
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendDate()
{
- Packet *p = new Packet(ADMIN_PACKET_SERVER_DATE);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_DATE);
p->Send_uint32(TimerGameCalendar::date.base());
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -220,10 +220,10 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendDate()
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientJoin(ClientID client_id)
{
- Packet *p = new Packet(ADMIN_PACKET_SERVER_CLIENT_JOIN);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_CLIENT_JOIN);
p->Send_uint32(client_id);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -238,7 +238,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientInfo(const NetworkC
/* Only send data when we're a proper client, not just someone trying to query the server. */
if (ci == nullptr) return NETWORK_RECV_STATUS_OKAY;
- Packet *p = new Packet(ADMIN_PACKET_SERVER_CLIENT_INFO);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_CLIENT_INFO);
p->Send_uint32(ci->client_id);
p->Send_string(cs == nullptr ? "" : const_cast(cs->client_address).GetHostname());
@@ -247,7 +247,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientInfo(const NetworkC
p->Send_uint32(ci->join_date.base());
p->Send_uint8 (ci->client_playas);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -259,13 +259,13 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientInfo(const NetworkC
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientUpdate(const NetworkClientInfo *ci)
{
- Packet *p = new Packet(ADMIN_PACKET_SERVER_CLIENT_UPDATE);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_CLIENT_UPDATE);
p->Send_uint32(ci->client_id);
p->Send_string(ci->client_name);
p->Send_uint8 (ci->client_playas);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -276,10 +276,10 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientUpdate(const Networ
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientQuit(ClientID client_id)
{
- Packet *p = new Packet(ADMIN_PACKET_SERVER_CLIENT_QUIT);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_CLIENT_QUIT);
p->Send_uint32(client_id);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -291,11 +291,11 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientQuit(ClientID clien
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientError(ClientID client_id, NetworkErrorCode error)
{
- Packet *p = new Packet(ADMIN_PACKET_SERVER_CLIENT_ERROR);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_CLIENT_ERROR);
p->Send_uint32(client_id);
p->Send_uint8 (error);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -306,10 +306,10 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientError(ClientID clie
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyNew(CompanyID company_id)
{
- Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_NEW);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_COMPANY_NEW);
p->Send_uint8(company_id);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -320,7 +320,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyNew(CompanyID comp
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyInfo(const Company *c)
{
- Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_INFO);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_COMPANY_INFO);
p->Send_uint8 (c->index);
SetDParam(0, c->index);
@@ -333,7 +333,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyInfo(const Company
p->Send_bool (c->is_ai);
p->Send_uint8 (CeilDiv(c->months_of_bankruptcy, 3)); // send as quarters_of_bankruptcy
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -345,7 +345,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyInfo(const Company
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyUpdate(const Company *c)
{
- Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_UPDATE);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_COMPANY_UPDATE);
p->Send_uint8 (c->index);
SetDParam(0, c->index);
@@ -356,7 +356,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyUpdate(const Compa
p->Send_bool (NetworkCompanyIsPassworded(c->index));
p->Send_uint8 (CeilDiv(c->months_of_bankruptcy, 3)); // send as quarters_of_bankruptcy
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -368,12 +368,12 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyUpdate(const Compa
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyRemove(CompanyID company_id, AdminCompanyRemoveReason acrr)
{
- Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_REMOVE);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_COMPANY_REMOVE);
p->Send_uint8(company_id);
p->Send_uint8(acrr);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -385,7 +385,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyEconomy()
/* Get the income. */
Money income = -std::reduce(std::begin(company->yearly_expenses[0]), std::end(company->yearly_expenses[0]));
- Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_ECONOMY);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_COMPANY_ECONOMY);
p->Send_uint8(company->index);
@@ -402,7 +402,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyEconomy()
p->Send_uint16(static_cast(std::min(UINT16_MAX, company->old_economy[i].delivered_cargo.GetSum())));
}
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
}
@@ -418,7 +418,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyStats()
/* Go through all the companies. */
for (const Company *company : Company::Iterate()) {
- Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_STATS);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_COMPANY_STATS);
/* Send the information. */
p->Send_uint8(company->index);
@@ -431,7 +431,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyStats()
p->Send_uint16(company_stats[company->index].num_station[i]);
}
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
}
return NETWORK_RECV_STATUS_OKAY;
@@ -447,7 +447,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyStats()
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendChat(NetworkAction action, DestType desttype, ClientID client_id, const std::string &msg, int64_t data)
{
- Packet *p = new Packet(ADMIN_PACKET_SERVER_CHAT);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_CHAT);
p->Send_uint8 (action);
p->Send_uint8 (desttype);
@@ -455,7 +455,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendChat(NetworkAction action
p->Send_string(msg);
p->Send_uint64(data);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -465,10 +465,10 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendChat(NetworkAction action
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendRconEnd(const std::string_view command)
{
- Packet *p = new Packet(ADMIN_PACKET_SERVER_RCON_END);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_RCON_END);
p->Send_string(command);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -480,20 +480,20 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendRconEnd(const std::string
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendRcon(uint16_t colour, const std::string_view result)
{
- Packet *p = new Packet(ADMIN_PACKET_SERVER_RCON);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_RCON);
p->Send_uint16(colour);
p->Send_string(result);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet *p)
+NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet &p)
{
if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
- std::string command = p->Recv_string(NETWORK_RCONCOMMAND_LENGTH);
+ std::string command = p.Recv_string(NETWORK_RCONCOMMAND_LENGTH);
Debug(net, 3, "[admin] Rcon command from '{}' ({}): {}", this->admin_name, this->admin_version, command);
@@ -503,11 +503,11 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet *p)
return this->SendRconEnd(command);
}
-NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Packet *p)
+NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Packet &p)
{
if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
- std::string json = p->Recv_string(NETWORK_GAMESCRIPT_JSON_LENGTH);
+ std::string json = p.Recv_string(NETWORK_GAMESCRIPT_JSON_LENGTH);
Debug(net, 6, "[admin] GameScript JSON from '{}' ({}): {}", this->admin_name, this->admin_version, json);
@@ -515,11 +515,11 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Pack
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_PING(Packet *p)
+NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_PING(Packet &p)
{
if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
- uint32_t d1 = p->Recv_uint32();
+ uint32_t d1 = p.Recv_uint32();
Debug(net, 6, "[admin] Ping from '{}' ({}): {}", this->admin_name, this->admin_version, d1);
@@ -539,11 +539,11 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendConsole(const std::string
* smaller than COMPAT_MTU. */
if (origin.size() + string.size() + 2 + 3 >= COMPAT_MTU) return NETWORK_RECV_STATUS_OKAY;
- Packet *p = new Packet(ADMIN_PACKET_SERVER_CONSOLE);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_CONSOLE);
p->Send_string(origin);
p->Send_string(string);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -554,10 +554,10 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendConsole(const std::string
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendGameScript(const std::string_view json)
{
- Packet *p = new Packet(ADMIN_PACKET_SERVER_GAMESCRIPT);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_GAMESCRIPT);
p->Send_string(json);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -565,10 +565,10 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendGameScript(const std::str
/** Send ping-reply (pong) to admin **/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendPong(uint32_t d1)
{
- Packet *p = new Packet(ADMIN_PACKET_SERVER_PONG);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_PONG);
p->Send_uint32(d1);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -576,7 +576,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendPong(uint32_t d1)
/** Send the names of the commands. */
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdNames()
{
- Packet *p = new Packet(ADMIN_PACKET_SERVER_CMD_NAMES);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_CMD_NAMES);
for (uint16_t i = 0; i < CMD_END; i++) {
const char *cmdname = GetCommandName(static_cast(i));
@@ -586,9 +586,9 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdNames()
* byte for string '\0' termination and 1 bool "no more data" */
if (!p->CanWriteToPacket(strlen(cmdname) + 5)) {
p->Send_bool(false);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
- p = new Packet(ADMIN_PACKET_SERVER_CMD_NAMES);
+ p = std::make_unique(ADMIN_PACKET_SERVER_CMD_NAMES);
}
p->Send_bool(true);
@@ -598,7 +598,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdNames()
/* Marker to notify the end of the packet has been reached. */
p->Send_bool(false);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -608,17 +608,17 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdNames()
* @param client_id The client executing the command.
* @param cp The command that would be executed.
*/
-NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdLogging(ClientID client_id, const CommandPacket *cp)
+NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdLogging(ClientID client_id, const CommandPacket &cp)
{
- Packet *p = new Packet(ADMIN_PACKET_SERVER_CMD_LOGGING);
+ auto p = std::make_unique(ADMIN_PACKET_SERVER_CMD_LOGGING);
p->Send_uint32(client_id);
- p->Send_uint8 (cp->company);
- p->Send_uint16(cp->cmd);
- p->Send_buffer(cp->data);
- p->Send_uint32(cp->frame);
+ p->Send_uint8 (cp.company);
+ p->Send_uint16(cp.cmd);
+ p->Send_buffer(cp.data);
+ p->Send_uint32(cp.frame);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -627,11 +627,11 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdLogging(ClientID clien
* Receiving functions
************/
-NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet *p)
+NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet &p)
{
if (this->status != ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
- std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH);
+ std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH);
if (_settings_client.network.admin_password.empty() ||
_settings_client.network.admin_password.compare(password) != 0) {
@@ -639,8 +639,8 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet *p)
return this->SendError(NETWORK_ERROR_WRONG_PASSWORD);
}
- this->admin_name = p->Recv_string(NETWORK_CLIENT_NAME_LENGTH);
- this->admin_version = p->Recv_string(NETWORK_REVISION_LENGTH);
+ this->admin_name = p.Recv_string(NETWORK_CLIENT_NAME_LENGTH);
+ this->admin_version = p.Recv_string(NETWORK_REVISION_LENGTH);
if (this->admin_name.empty() || this->admin_version.empty()) {
/* no name or version supplied */
@@ -654,18 +654,18 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet *p)
return this->SendProtocol();
}
-NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_QUIT(Packet *)
+NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_QUIT(Packet &)
{
/* The admin is leaving nothing else to do */
return this->CloseConnection();
}
-NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENCY(Packet *p)
+NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENCY(Packet &p)
{
if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
- AdminUpdateType type = (AdminUpdateType)p->Recv_uint16();
- AdminUpdateFrequency freq = (AdminUpdateFrequency)p->Recv_uint16();
+ AdminUpdateType type = (AdminUpdateType)p.Recv_uint16();
+ AdminUpdateFrequency freq = (AdminUpdateFrequency)p.Recv_uint16();
if (type >= ADMIN_UPDATE_END || (_admin_update_type_frequencies[type] & freq) != freq) {
/* The server does not know of this UpdateType. */
@@ -680,12 +680,12 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENC
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet *p)
+NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet &p)
{
if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
- AdminUpdateType type = (AdminUpdateType)p->Recv_uint8();
- uint32_t d1 = p->Recv_uint32();
+ AdminUpdateType type = (AdminUpdateType)p.Recv_uint8();
+ uint32_t d1 = p.Recv_uint32();
switch (type) {
case ADMIN_UPDATE_DATE:
@@ -746,15 +746,15 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet *p)
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet *p)
+NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet &p)
{
if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
- NetworkAction action = (NetworkAction)p->Recv_uint8();
- DestType desttype = (DestType)p->Recv_uint8();
- int dest = p->Recv_uint32();
+ NetworkAction action = (NetworkAction)p.Recv_uint8();
+ DestType desttype = (DestType)p.Recv_uint8();
+ int dest = p.Recv_uint32();
- std::string msg = p->Recv_string(NETWORK_CHAT_LENGTH);
+ std::string msg = p.Recv_string(NETWORK_CHAT_LENGTH);
switch (action) {
case NETWORK_ACTION_CHAT:
@@ -772,14 +772,14 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet *p)
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_EXTERNAL_CHAT(Packet *p)
+NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_EXTERNAL_CHAT(Packet &p)
{
if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
- std::string source = p->Recv_string(NETWORK_CHAT_LENGTH);
- TextColour colour = (TextColour)p->Recv_uint16();
- std::string user = p->Recv_string(NETWORK_CHAT_LENGTH);
- std::string msg = p->Recv_string(NETWORK_CHAT_LENGTH);
+ std::string source = p.Recv_string(NETWORK_CHAT_LENGTH);
+ TextColour colour = (TextColour)p.Recv_uint16();
+ std::string user = p.Recv_string(NETWORK_CHAT_LENGTH);
+ std::string msg = p.Recv_string(NETWORK_CHAT_LENGTH);
if (!IsValidConsoleColour(colour)) {
Debug(net, 1, "[admin] Not supported chat colour {} ({}, {}, {}) from '{}' ({}).", (uint16_t)colour, source, user, msg, this->admin_name, this->admin_version);
@@ -959,7 +959,7 @@ void NetworkAdminGameScript(const std::string_view json)
* @param owner The owner of the CommandPacket (who sent us the CommandPacket).
* @param cp The CommandPacket to be distributed.
*/
-void NetworkAdminCmdLogging(const NetworkClientSocket *owner, const CommandPacket *cp)
+void NetworkAdminCmdLogging(const NetworkClientSocket *owner, const CommandPacket &cp)
{
ClientID client_id = owner == nullptr ? _network_own_client_id : owner->client_id;
diff --git a/src/network/network_admin.h b/src/network/network_admin.h
index 0d39a313df..63c80545ce 100644
--- a/src/network/network_admin.h
+++ b/src/network/network_admin.h
@@ -24,15 +24,15 @@ extern NetworkAdminSocketPool _networkadminsocket_pool;
/** Class for handling the server side of the game connection. */
class ServerNetworkAdminSocketHandler : public NetworkAdminSocketPool::PoolItem<&_networkadminsocket_pool>, public NetworkAdminSocketHandler, public TCPListenHandler {
protected:
- NetworkRecvStatus Receive_ADMIN_JOIN(Packet *p) override;
- NetworkRecvStatus Receive_ADMIN_QUIT(Packet *p) override;
- NetworkRecvStatus Receive_ADMIN_UPDATE_FREQUENCY(Packet *p) override;
- NetworkRecvStatus Receive_ADMIN_POLL(Packet *p) override;
- NetworkRecvStatus Receive_ADMIN_CHAT(Packet *p) override;
- NetworkRecvStatus Receive_ADMIN_EXTERNAL_CHAT(Packet *p) override;
- NetworkRecvStatus Receive_ADMIN_RCON(Packet *p) override;
- NetworkRecvStatus Receive_ADMIN_GAMESCRIPT(Packet *p) override;
- NetworkRecvStatus Receive_ADMIN_PING(Packet *p) override;
+ NetworkRecvStatus Receive_ADMIN_JOIN(Packet &p) override;
+ NetworkRecvStatus Receive_ADMIN_QUIT(Packet &p) override;
+ NetworkRecvStatus Receive_ADMIN_UPDATE_FREQUENCY(Packet &p) override;
+ NetworkRecvStatus Receive_ADMIN_POLL(Packet &p) override;
+ NetworkRecvStatus Receive_ADMIN_CHAT(Packet &p) override;
+ NetworkRecvStatus Receive_ADMIN_EXTERNAL_CHAT(Packet &p) override;
+ NetworkRecvStatus Receive_ADMIN_RCON(Packet &p) override;
+ NetworkRecvStatus Receive_ADMIN_GAMESCRIPT(Packet &p) override;
+ NetworkRecvStatus Receive_ADMIN_PING(Packet &p) override;
NetworkRecvStatus SendProtocol();
NetworkRecvStatus SendPong(uint32_t d1);
@@ -67,7 +67,7 @@ public:
NetworkRecvStatus SendConsole(const std::string_view origin, const std::string_view command);
NetworkRecvStatus SendGameScript(const std::string_view json);
NetworkRecvStatus SendCmdNames();
- NetworkRecvStatus SendCmdLogging(ClientID client_id, const CommandPacket *cp);
+ NetworkRecvStatus SendCmdLogging(ClientID client_id, const CommandPacket &cp);
NetworkRecvStatus SendRconEnd(const std::string_view command);
static void Send();
@@ -112,6 +112,6 @@ void NetworkAdminUpdate(AdminUpdateFrequency freq);
void NetworkServerSendAdminRcon(AdminIndex admin_index, TextColour colour_code, const std::string_view string);
void NetworkAdminConsole(const std::string_view origin, const std::string_view string);
void NetworkAdminGameScript(const std::string_view json);
-void NetworkAdminCmdLogging(const NetworkClientSocket *owner, const CommandPacket *cp);
+void NetworkAdminCmdLogging(const NetworkClientSocket *owner, const CommandPacket &cp);
#endif /* NETWORK_ADMIN_H */
diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp
index 6c9fd88273..334b3bc243 100644
--- a/src/network/network_client.cpp
+++ b/src/network/network_client.cpp
@@ -81,19 +81,19 @@ struct PacketReader : LoadFilter {
* Add a packet to this buffer.
* @param p The packet to add.
*/
- void AddPacket(Packet *p)
+ void AddPacket(Packet &p)
{
assert(this->read_bytes == 0);
- p->TransferOutWithLimit(TransferOutMemCopy, this->bufe - this->buf, this);
+ p.TransferOutWithLimit(TransferOutMemCopy, this->bufe - this->buf, this);
/* Did everything fit in the current chunk, then we're done. */
- if (p->RemainingBytesToTransfer() == 0) return;
+ if (p.RemainingBytesToTransfer() == 0) return;
/* Allocate a new chunk and add the remaining data. */
this->blocks.push_back(this->buf = CallocT(CHUNK));
this->bufe = this->buf + CHUNK;
- p->TransferOutWithLimit(TransferOutMemCopy, this->bufe - this->buf, this);
+ p.TransferOutWithLimit(TransferOutMemCopy, this->bufe - this->buf, this);
}
size_t Read(byte *rbuf, size_t size) override
@@ -155,7 +155,6 @@ ClientNetworkGameSocketHandler::~ClientNetworkGameSocketHandler()
assert(ClientNetworkGameSocketHandler::my_client == this);
ClientNetworkGameSocketHandler::my_client = nullptr;
- delete this->savegame;
delete this->GetInfo();
}
@@ -332,7 +331,6 @@ static_assert(NETWORK_SERVER_ID_LENGTH == MD5_HASH_BYTES * 2 + 1);
/***********
* Sending functions
- * DEF_CLIENT_SEND_COMMAND has no parameters
************/
/** Tell the server we would like to join. */
@@ -346,13 +344,13 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendJoin()
_network_join_status = NETWORK_JOIN_STATUS_AUTHORIZING;
SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN);
- Packet *p = new Packet(PACKET_CLIENT_JOIN);
+ auto p = std::make_unique(PACKET_CLIENT_JOIN);
p->Send_string(GetNetworkRevisionString());
p->Send_uint32(_openttd_newgrf_version);
p->Send_string(_settings_client.network.client_name); // Client name
p->Send_uint8 (_network_join.company); // PlayAs
p->Send_uint8 (0); // Used to be language
- my_client->SendPacket(p);
+ my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -361,8 +359,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendNewGRFsOk()
{
Debug(net, 9, "Client::SendNewGRFsOk()");
- Packet *p = new Packet(PACKET_CLIENT_NEWGRFS_CHECKED);
- my_client->SendPacket(p);
+ auto p = std::make_unique(PACKET_CLIENT_NEWGRFS_CHECKED);
+ my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -374,9 +372,9 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendGamePassword(const std::st
{
Debug(net, 9, "Client::SendGamePassword()");
- Packet *p = new Packet(PACKET_CLIENT_GAME_PASSWORD);
+ auto p = std::make_unique(PACKET_CLIENT_GAME_PASSWORD);
p->Send_string(password);
- my_client->SendPacket(p);
+ my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -388,9 +386,9 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendCompanyPassword(const std:
{
Debug(net, 9, "Client::SendCompanyPassword()");
- Packet *p = new Packet(PACKET_CLIENT_COMPANY_PASSWORD);
+ auto p = std::make_unique(PACKET_CLIENT_COMPANY_PASSWORD);
p->Send_string(GenerateCompanyPasswordHash(password, _password_server_id, _password_game_seed));
- my_client->SendPacket(p);
+ my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -402,8 +400,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendGetMap()
Debug(net, 9, "Client::status = MAP_WAIT");
my_client->status = STATUS_MAP_WAIT;
- Packet *p = new Packet(PACKET_CLIENT_GETMAP);
- my_client->SendPacket(p);
+ auto p = std::make_unique(PACKET_CLIENT_GETMAP);
+ my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -415,8 +413,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendMapOk()
Debug(net, 9, "Client::status = ACTIVE");
my_client->status = STATUS_ACTIVE;
- Packet *p = new Packet(PACKET_CLIENT_MAP_OK);
- my_client->SendPacket(p);
+ auto p = std::make_unique(PACKET_CLIENT_MAP_OK);
+ my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -425,11 +423,11 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendAck()
{
Debug(net, 9, "Client::SendAck()");
- Packet *p = new Packet(PACKET_CLIENT_ACK);
+ auto p = std::make_unique(PACKET_CLIENT_ACK);
p->Send_uint32(_frame_counter);
p->Send_uint8 (my_client->token);
- my_client->SendPacket(p);
+ my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -437,14 +435,14 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendAck()
* Send a command to the server.
* @param cp The command to send.
*/
-NetworkRecvStatus ClientNetworkGameSocketHandler::SendCommand(const CommandPacket *cp)
+NetworkRecvStatus ClientNetworkGameSocketHandler::SendCommand(const CommandPacket &cp)
{
- Debug(net, 9, "Client::SendCommand(): cmd={}", cp->cmd);
+ Debug(net, 9, "Client::SendCommand(): cmd={}", cp.cmd);
- Packet *p = new Packet(PACKET_CLIENT_COMMAND);
- my_client->NetworkGameSocketHandler::SendCommand(p, cp);
+ auto p = std::make_unique(PACKET_CLIENT_COMMAND);
+ my_client->NetworkGameSocketHandler::SendCommand(*p, cp);
- my_client->SendPacket(p);
+ my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -453,7 +451,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendChat(NetworkAction action,
{
Debug(net, 9, "Client::SendChat(): action={}, type={}, dest={}", action, type, dest);
- Packet *p = new Packet(PACKET_CLIENT_CHAT);
+ auto p = std::make_unique(PACKET_CLIENT_CHAT);
p->Send_uint8 (action);
p->Send_uint8 (type);
@@ -461,7 +459,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendChat(NetworkAction action,
p->Send_string(msg);
p->Send_uint64(data);
- my_client->SendPacket(p);
+ my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -470,10 +468,10 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendError(NetworkErrorCode err
{
Debug(net, 9, "Client::SendError(): errorno={}", errorno);
- Packet *p = new Packet(PACKET_CLIENT_ERROR);
+ auto p = std::make_unique(PACKET_CLIENT_ERROR);
p->Send_uint8(errorno);
- my_client->SendPacket(p);
+ my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -485,10 +483,10 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendSetPassword(const std::str
{
Debug(net, 9, "Client::SendSetPassword()");
- Packet *p = new Packet(PACKET_CLIENT_SET_PASSWORD);
+ auto p = std::make_unique(PACKET_CLIENT_SET_PASSWORD);
p->Send_string(GenerateCompanyPasswordHash(password, _password_server_id, _password_game_seed));
- my_client->SendPacket(p);
+ my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -500,10 +498,10 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendSetName(const std::string
{
Debug(net, 9, "Client::SendSetName()");
- Packet *p = new Packet(PACKET_CLIENT_SET_NAME);
+ auto p = std::make_unique(PACKET_CLIENT_SET_NAME);
p->Send_string(name);
- my_client->SendPacket(p);
+ my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -514,9 +512,9 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendQuit()
{
Debug(net, 9, "Client::SendSetName()");
- Packet *p = new Packet(PACKET_CLIENT_QUIT);
+ auto p = std::make_unique(PACKET_CLIENT_QUIT);
- my_client->SendPacket(p);
+ my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -529,10 +527,10 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendRCon(const std::string &pa
{
Debug(net, 9, "Client::SendRCon()");
- Packet *p = new Packet(PACKET_CLIENT_RCON);
+ auto p = std::make_unique(PACKET_CLIENT_RCON);
p->Send_string(pass);
p->Send_string(command);
- my_client->SendPacket(p);
+ my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -545,10 +543,10 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendMove(CompanyID company, co
{
Debug(net, 9, "Client::SendMove(): company={}", company);
- Packet *p = new Packet(PACKET_CLIENT_MOVE);
+ auto p = std::make_unique(PACKET_CLIENT_MOVE);
p->Send_uint8(company);
p->Send_string(GenerateCompanyPasswordHash(password, _password_server_id, _password_game_seed));
- my_client->SendPacket(p);
+ my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -564,12 +562,11 @@ bool ClientNetworkGameSocketHandler::IsConnected()
/***********
* Receiving functions
- * DEF_CLIENT_RECEIVE_COMMAND has parameter: Packet *p
************/
-extern bool SafeLoad(const std::string &filename, SaveLoadOperation fop, DetailedFileType dft, GameMode newgm, Subdirectory subdir, struct LoadFilter *lf = nullptr);
+extern bool SafeLoad(const std::string &filename, SaveLoadOperation fop, DetailedFileType dft, GameMode newgm, Subdirectory subdir, std::shared_ptr lf);
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FULL(Packet &)
{
Debug(net, 9, "Client::Receive_SERVER_FULL()");
@@ -579,7 +576,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *)
return NETWORK_RECV_STATUS_SERVER_FULL;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet &)
{
Debug(net, 9, "Client::Receive_SERVER_BANNED()");
@@ -592,15 +589,15 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *
/* This packet contains info about the client (playas and name)
* as client we save this in NetworkClientInfo, linked via 'client_id'
* which is always an unique number on a server. */
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Packet *p)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Packet &p)
{
NetworkClientInfo *ci;
- ClientID client_id = (ClientID)p->Recv_uint32();
- CompanyID playas = (CompanyID)p->Recv_uint8();
+ ClientID client_id = (ClientID)p.Recv_uint32();
+ CompanyID playas = (CompanyID)p.Recv_uint8();
Debug(net, 9, "Client::Receive_SERVER_CLIENT_INFO(): client_id={}, playas={}", client_id, playas);
- std::string name = p->Recv_string(NETWORK_NAME_LENGTH);
+ std::string name = p.Recv_string(NETWORK_NAME_LENGTH);
if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CLIENT_QUIT;
@@ -650,7 +647,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Pac
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet &p)
{
static const StringID network_error_strings[] = {
STR_NETWORK_ERROR_LOSTCONNECTION, // NETWORK_ERROR_GENERAL
@@ -677,15 +674,15 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p
};
static_assert(lengthof(network_error_strings) == NETWORK_ERROR_END);
- NetworkErrorCode error = (NetworkErrorCode)p->Recv_uint8();
+ NetworkErrorCode error = (NetworkErrorCode)p.Recv_uint8();
Debug(net, 9, "Client::Receive_SERVER_ERROR(): error={}", error);
StringID err = STR_NETWORK_ERROR_LOSTCONNECTION;
if (error < (ptrdiff_t)lengthof(network_error_strings)) err = network_error_strings[error];
/* In case of kicking a client, we assume there is a kick message in the packet if we can read one byte */
- if (error == NETWORK_ERROR_KICKED && p->CanReadFromPacket(1)) {
- SetDParamStr(0, p->Recv_string(NETWORK_CHAT_LENGTH));
+ if (error == NETWORK_ERROR_KICKED && p.CanReadFromPacket(1)) {
+ SetDParamStr(0, p.Recv_string(NETWORK_CHAT_LENGTH));
ShowErrorMessage(err, STR_NETWORK_ERROR_KICK_MESSAGE, WL_CRITICAL);
} else {
ShowErrorMessage(err, INVALID_STRING_ID, WL_CRITICAL);
@@ -697,11 +694,11 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p
return NETWORK_RECV_STATUS_SERVER_ERROR;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(Packet *p)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(Packet &p)
{
if (this->status != STATUS_JOIN) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
- uint grf_count = p->Recv_uint8();
+ uint grf_count = p.Recv_uint8();
NetworkRecvStatus ret = NETWORK_RECV_STATUS_OKAY;
Debug(net, 9, "Client::Receive_SERVER_CHECK_NEWGRFS(): grf_count={}", grf_count);
@@ -709,7 +706,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(P
/* Check all GRFs */
for (; grf_count > 0; grf_count--) {
GRFIdentifier c;
- DeserializeGRFIdentifier(p, &c);
+ DeserializeGRFIdentifier(p, c);
/* Check whether we know this GRF */
const GRFConfig *f = FindGRFConfig(c.grfid, FGCM_EXACT, &c.md5sum);
@@ -730,7 +727,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(P
return ret;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_GAME_PASSWORD(Packet *)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_GAME_PASSWORD(Packet &)
{
if (this->status < STATUS_JOIN || this->status >= STATUS_AUTH_GAME) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
Debug(net, 9, "Client::status = AUTH_GAME");
@@ -747,7 +744,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_GAME_PASSW
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_COMPANY_PASSWORD(Packet *p)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_COMPANY_PASSWORD(Packet &p)
{
if (this->status < STATUS_JOIN || this->status >= STATUS_AUTH_COMPANY) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
Debug(net, 9, "Client::status = AUTH_COMPANY");
@@ -755,8 +752,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_COMPANY_PA
Debug(net, 9, "Client::Receive_SERVER_NEED_COMPANY_PASSWORD()");
- _password_game_seed = p->Recv_uint32();
- _password_server_id = p->Recv_string(NETWORK_SERVER_ID_LENGTH);
+ _password_game_seed = p.Recv_uint32();
+ _password_server_id = p.Recv_string(NETWORK_SERVER_ID_LENGTH);
if (this->HasClientQuit()) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
if (!_network_join.company_password.empty()) {
@@ -768,25 +765,25 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_COMPANY_PA
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_WELCOME(Packet *p)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_WELCOME(Packet &p)
{
if (this->status < STATUS_JOIN || this->status >= STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
Debug(net, 9, "Client::status = AUTHORIZED");
this->status = STATUS_AUTHORIZED;
- _network_own_client_id = (ClientID)p->Recv_uint32();
+ _network_own_client_id = (ClientID)p.Recv_uint32();
Debug(net, 9, "Client::Receive_SERVER_WELCOME(): client_id={}", _network_own_client_id);
/* Initialize the password hash salting variables, even if they were previously. */
- _password_game_seed = p->Recv_uint32();
- _password_server_id = p->Recv_string(NETWORK_SERVER_ID_LENGTH);
+ _password_game_seed = p.Recv_uint32();
+ _password_server_id = p.Recv_string(NETWORK_SERVER_ID_LENGTH);
/* Start receiving the map */
return SendGetMap();
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_WAIT(Packet *p)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_WAIT(Packet &p)
{
/* We set the internal wait state when requesting the map. */
if (this->status != STATUS_MAP_WAIT) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
@@ -796,13 +793,13 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_WAIT(Packet *p)
/* But... only now we set the join status to waiting, instead of requesting. */
Debug(net, 9, "Client::join_status = WAITING");
_network_join_status = NETWORK_JOIN_STATUS_WAITING;
- _network_join_waiting = p->Recv_uint8();
+ _network_join_waiting = p.Recv_uint8();
SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN);
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_BEGIN(Packet *p)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_BEGIN(Packet &p)
{
if (this->status < STATUS_AUTHORIZED || this->status >= STATUS_MAP) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
Debug(net, 9, "Client::status = MAP");
@@ -810,9 +807,9 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_BEGIN(Packe
if (this->savegame != nullptr) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
- this->savegame = new PacketReader();
+ this->savegame = std::make_shared();
- _frame_counter = _frame_counter_server = _frame_counter_max = p->Recv_uint32();
+ _frame_counter = _frame_counter_server = _frame_counter_max = p.Recv_uint32();
Debug(net, 9, "Client::Receive_SERVER_MAP_BEGIN(): frame_counter={}", _frame_counter);
@@ -826,12 +823,12 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_BEGIN(Packe
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_SIZE(Packet *p)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_SIZE(Packet &p)
{
if (this->status != STATUS_MAP) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
if (this->savegame == nullptr) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
- _network_join_bytes_total = p->Recv_uint32();
+ _network_join_bytes_total = p.Recv_uint32();
SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN);
Debug(net, 9, "Client::Receive_SERVER_MAP_SIZE(): bytes_total={}", _network_join_bytes_total);
@@ -839,7 +836,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_SIZE(Packet
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DATA(Packet *p)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DATA(Packet &p)
{
if (this->status != STATUS_MAP) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
if (this->savegame == nullptr) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
@@ -853,7 +850,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DATA(Packet
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet *)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet &)
{
if (this->status != STATUS_MAP) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
if (this->savegame == nullptr) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
@@ -864,20 +861,12 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet
_network_join_status = NETWORK_JOIN_STATUS_PROCESSING;
SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN);
- /*
- * Make sure everything is set for reading.
- *
- * We need the local copy and reset this->savegame because when
- * loading fails the network gets reset upon loading the intro
- * game, which would cause us to free this->savegame twice.
- */
- LoadFilter *lf = this->savegame;
- this->savegame = nullptr;
- lf->Reset();
+ this->savegame->Reset();
/* The map is done downloading, load it */
ClearErrorMessages();
- bool load_success = SafeLoad({}, SLO_LOAD, DFT_GAME_FILE, GM_NORMAL, NO_DIRECTORY, lf);
+ bool load_success = SafeLoad({}, SLO_LOAD, DFT_GAME_FILE, GM_NORMAL, NO_DIRECTORY, this->savegame);
+ this->savegame = nullptr;
/* Long savegame loads shouldn't affect the lag calculation! */
this->last_packet = std::chrono::steady_clock::now();
@@ -917,29 +906,29 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FRAME(Packet *p)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FRAME(Packet &p)
{
if (this->status != STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
- _frame_counter_server = p->Recv_uint32();
- _frame_counter_max = p->Recv_uint32();
+ _frame_counter_server = p.Recv_uint32();
+ _frame_counter_max = p.Recv_uint32();
#ifdef ENABLE_NETWORK_SYNC_EVERY_FRAME
/* Test if the server supports this option
* and if we are at the frame the server is */
#ifdef NETWORK_SEND_DOUBLE_SEED
- if (p->CanReadFromPacket(sizeof(uint32_t) + sizeof(uint32_t))) {
+ if (p.CanReadFromPacket(sizeof(uint32_t) + sizeof(uint32_t))) {
#else
- if (p->CanReadFromPacket(sizeof(uint32_t))) {
+ if (p.CanReadFromPacket(sizeof(uint32_t))) {
#endif
_sync_frame = _frame_counter_server;
- _sync_seed_1 = p->Recv_uint32();
+ _sync_seed_1 = p.Recv_uint32();
#ifdef NETWORK_SEND_DOUBLE_SEED
- _sync_seed_2 = p->Recv_uint32();
+ _sync_seed_2 = p.Recv_uint32();
#endif
}
#endif
/* Receive the token. */
- if (p->CanReadFromPacket(sizeof(uint8_t))) this->token = p->Recv_uint8();
+ if (p.CanReadFromPacket(sizeof(uint8_t))) this->token = p.Recv_uint8();
/* Let the server know that we received this frame correctly
* We do this only once per day, to save some bandwidth ;) */
@@ -952,14 +941,14 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FRAME(Packet *p
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SYNC(Packet *p)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SYNC(Packet &p)
{
if (this->status != STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
- _sync_frame = p->Recv_uint32();
- _sync_seed_1 = p->Recv_uint32();
+ _sync_frame = p.Recv_uint32();
+ _sync_seed_1 = p.Recv_uint32();
#ifdef NETWORK_SEND_DOUBLE_SEED
- _sync_seed_2 = p->Recv_uint32();
+ _sync_seed_2 = p.Recv_uint32();
#endif
Debug(net, 9, "Client::Receive_SERVER_SYNC(): sync_frame={}, sync_seed_1={}", _sync_frame, _sync_seed_1);
@@ -967,14 +956,14 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SYNC(Packet *p)
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet *p)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet &p)
{
if (this->status != STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
CommandPacket cp;
- const char *err = this->ReceiveCommand(p, &cp);
- cp.frame = p->Recv_uint32();
- cp.my_cmd = p->Recv_bool();
+ const char *err = this->ReceiveCommand(p, cp);
+ cp.frame = p.Recv_uint32();
+ cp.my_cmd = p.Recv_bool();
Debug(net, 9, "Client::Receive_SERVER_COMMAND(): cmd={}, frame={}", cp.cmd, cp.frame);
@@ -983,23 +972,23 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet
return NETWORK_RECV_STATUS_MALFORMED_PACKET;
}
- this->incoming_queue.Append(&cp);
+ this->incoming_queue.push_back(cp);
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHAT(Packet *p)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHAT(Packet &p)
{
if (this->status != STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
std::string name;
const NetworkClientInfo *ci = nullptr, *ci_to;
- NetworkAction action = (NetworkAction)p->Recv_uint8();
- ClientID client_id = (ClientID)p->Recv_uint32();
- bool self_send = p->Recv_bool();
- std::string msg = p->Recv_string(NETWORK_CHAT_LENGTH);
- int64_t data = p->Recv_uint64();
+ NetworkAction action = (NetworkAction)p.Recv_uint8();
+ ClientID client_id = (ClientID)p.Recv_uint32();
+ bool self_send = p.Recv_bool();
+ std::string msg = p.Recv_string(NETWORK_CHAT_LENGTH);
+ int64_t data = p.Recv_uint64();
Debug(net, 9, "Client::Receive_SERVER_CHAT(): action={}, client_id={}, self_send={}", action, client_id, self_send);
@@ -1039,14 +1028,14 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHAT(Packet *p)
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_EXTERNAL_CHAT(Packet *p)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_EXTERNAL_CHAT(Packet &p)
{
if (this->status != STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
- std::string source = p->Recv_string(NETWORK_CHAT_LENGTH);
- TextColour colour = (TextColour)p->Recv_uint16();
- std::string user = p->Recv_string(NETWORK_CHAT_LENGTH);
- std::string msg = p->Recv_string(NETWORK_CHAT_LENGTH);
+ std::string source = p.Recv_string(NETWORK_CHAT_LENGTH);
+ TextColour colour = (TextColour)p.Recv_uint16();
+ std::string user = p.Recv_string(NETWORK_CHAT_LENGTH);
+ std::string msg = p.Recv_string(NETWORK_CHAT_LENGTH);
Debug(net, 9, "Client::Receive_SERVER_EXTERNAL_CHAT(): source={}", source);
@@ -1057,17 +1046,17 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_EXTERNAL_CHAT(P
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR_QUIT(Packet *p)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR_QUIT(Packet &p)
{
if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
- ClientID client_id = (ClientID)p->Recv_uint32();
+ ClientID client_id = (ClientID)p.Recv_uint32();
Debug(net, 9, "Client::Receive_SERVER_ERROR_QUIT(): client_id={}", client_id);
NetworkClientInfo *ci = NetworkClientInfo::GetByClientID(client_id);
if (ci != nullptr) {
- NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, ci->client_name, "", GetNetworkErrorMsg((NetworkErrorCode)p->Recv_uint8()));
+ NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, ci->client_name, "", GetNetworkErrorMsg((NetworkErrorCode)p.Recv_uint8()));
delete ci;
}
@@ -1076,11 +1065,11 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR_QUIT(Pack
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_QUIT(Packet *p)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_QUIT(Packet &p)
{
if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
- ClientID client_id = (ClientID)p->Recv_uint32();
+ ClientID client_id = (ClientID)p.Recv_uint32();
Debug(net, 9, "Client::Receive_SERVER_QUIT(): client_id={}", client_id);
@@ -1098,11 +1087,11 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_QUIT(Packet *p)
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_JOIN(Packet *p)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_JOIN(Packet &p)
{
if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
- ClientID client_id = (ClientID)p->Recv_uint32();
+ ClientID client_id = (ClientID)p.Recv_uint32();
Debug(net, 9, "Client::Receive_SERVER_JOIN(): client_id={}", client_id);
@@ -1116,7 +1105,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_JOIN(Packet *p)
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SHUTDOWN(Packet *)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SHUTDOWN(Packet &)
{
Debug(net, 9, "Client::Receive_SERVER_SHUTDOWN()");
@@ -1131,7 +1120,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SHUTDOWN(Packet
return NETWORK_RECV_STATUS_SERVER_ERROR;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEWGAME(Packet *)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEWGAME(Packet &)
{
Debug(net, 9, "Client::Receive_SERVER_NEWGAME()");
@@ -1150,29 +1139,29 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEWGAME(Packet
return NETWORK_RECV_STATUS_SERVER_ERROR;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_RCON(Packet *p)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_RCON(Packet &p)
{
if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
Debug(net, 9, "Client::Receive_SERVER_RCON()");
- TextColour colour_code = (TextColour)p->Recv_uint16();
+ TextColour colour_code = (TextColour)p.Recv_uint16();
if (!IsValidConsoleColour(colour_code)) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
- std::string rcon_out = p->Recv_string(NETWORK_RCONCOMMAND_LENGTH);
+ std::string rcon_out = p.Recv_string(NETWORK_RCONCOMMAND_LENGTH);
IConsolePrint(colour_code, rcon_out);
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MOVE(Packet *p)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MOVE(Packet &p)
{
if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
/* Nothing more in this packet... */
- ClientID client_id = (ClientID)p->Recv_uint32();
- CompanyID company_id = (CompanyID)p->Recv_uint8();
+ ClientID client_id = (ClientID)p.Recv_uint32();
+ CompanyID company_id = (CompanyID)p.Recv_uint8();
Debug(net, 9, "Client::Receive_SERVER_MOVE(): client_id={}, comapny_id={}", client_id, company_id);
@@ -1196,12 +1185,12 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MOVE(Packet *p)
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CONFIG_UPDATE(Packet *p)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CONFIG_UPDATE(Packet &p)
{
if (this->status < STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
- _network_server_max_companies = p->Recv_uint8();
- _network_server_name = p->Recv_string(NETWORK_NAME_LENGTH);
+ _network_server_max_companies = p.Recv_uint8();
+ _network_server_name = p.Recv_string(NETWORK_NAME_LENGTH);
SetWindowClassesDirty(WC_CLIENT_LIST);
Debug(net, 9, "Client::Receive_SERVER_CONFIG_UPDATE(): max_companies={}", _network_server_max_companies);
@@ -1209,12 +1198,12 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CONFIG_UPDATE(P
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMPANY_UPDATE(Packet *p)
+NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMPANY_UPDATE(Packet &p)
{
if (this->status < STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
static_assert(sizeof(_network_company_passworded) <= sizeof(uint16_t));
- _network_company_passworded = p->Recv_uint16();
+ _network_company_passworded = p.Recv_uint16();
SetWindowClassesDirty(WC_COMPANY);
Debug(net, 9, "Client::Receive_SERVER_COMPANY_UPDATE()");
diff --git a/src/network/network_client.h b/src/network/network_client.h
index 42caac9289..d314ddc41a 100644
--- a/src/network/network_client.h
+++ b/src/network/network_client.h
@@ -16,7 +16,7 @@
class ClientNetworkGameSocketHandler : public ZeroedMemoryAllocator, public NetworkGameSocketHandler {
private:
std::string connection_string; ///< Address we are connected to.
- struct PacketReader *savegame; ///< Packet reader for reading the savegame.
+ std::shared_ptr savegame; ///< Packet reader for reading the savegame.
byte token; ///< The token we need to send back to the server to prove we're the right client.
/** Status of the connection with the server. */
@@ -40,33 +40,33 @@ protected:
friend void NetworkClose(bool close_admins);
static ClientNetworkGameSocketHandler *my_client; ///< This is us!
- NetworkRecvStatus Receive_SERVER_FULL(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_BANNED(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_ERROR(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_NEED_GAME_PASSWORD(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_NEED_COMPANY_PASSWORD(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_WELCOME(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_WAIT(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_MAP_BEGIN(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_MAP_SIZE(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_MAP_DATA(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_MAP_DONE(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_JOIN(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_FRAME(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_SYNC(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_COMMAND(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_CHAT(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_EXTERNAL_CHAT(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_QUIT(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_ERROR_QUIT(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_SHUTDOWN(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_NEWGAME(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_RCON(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_CHECK_NEWGRFS(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_MOVE(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_COMPANY_UPDATE(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_CONFIG_UPDATE(Packet *p) override;
+ NetworkRecvStatus Receive_SERVER_FULL(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_BANNED(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_ERROR(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_NEED_GAME_PASSWORD(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_NEED_COMPANY_PASSWORD(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_WELCOME(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_WAIT(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_MAP_BEGIN(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_MAP_SIZE(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_MAP_DATA(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_MAP_DONE(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_JOIN(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_FRAME(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_SYNC(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_COMMAND(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_CHAT(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_EXTERNAL_CHAT(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_QUIT(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_ERROR_QUIT(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_SHUTDOWN(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_NEWGAME(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_RCON(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_CHECK_NEWGRFS(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_MOVE(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_COMPANY_UPDATE(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_CONFIG_UPDATE(Packet &p) override;
static NetworkRecvStatus SendNewGRFsOk();
static NetworkRecvStatus SendGetMap();
@@ -80,7 +80,7 @@ public:
void ClientError(NetworkRecvStatus res);
static NetworkRecvStatus SendJoin();
- static NetworkRecvStatus SendCommand(const CommandPacket *cp);
+ static NetworkRecvStatus SendCommand(const CommandPacket &cp);
static NetworkRecvStatus SendError(NetworkErrorCode errorno);
static NetworkRecvStatus SendQuit();
static NetworkRecvStatus SendAck();
diff --git a/src/network/network_command.cpp b/src/network/network_command.cpp
index ef3ca67c3e..8512d37d20 100644
--- a/src/network/network_command.cpp
+++ b/src/network/network_command.cpp
@@ -122,9 +122,9 @@ struct CallbackArgsHelper
/* Helpers to generate the command dispatch table from the command traits. */
template static CommandDataBuffer SanitizeCmdStrings(const CommandDataBuffer &data);
-template static void UnpackNetworkCommand(const CommandPacket *cp);
+template static void UnpackNetworkCommand(const CommandPacket &cp);
template static void NetworkReplaceCommandClientId(CommandPacket &cp, ClientID client_id);
-using UnpackNetworkCommandProc = void (*)(const CommandPacket *);
+using UnpackNetworkCommandProc = void (*)(const CommandPacket &);
using UnpackDispatchT = std::array;
struct CommandDispatch {
CommandDataBuffer(*Sanitize)(const CommandDataBuffer &);
@@ -165,76 +165,6 @@ static constexpr auto _cmd_dispatch = MakeDispatchTable(std::make_integer_sequen
# pragma GCC diagnostic pop
#endif
-
-/**
- * Append a CommandPacket at the end of the queue.
- * @param p The packet to append to the queue.
- * @note A new instance of the CommandPacket will be made.
- */
-void CommandQueue::Append(CommandPacket *p)
-{
- CommandPacket *add = new CommandPacket();
- *add = *p;
- add->next = nullptr;
- if (this->first == nullptr) {
- this->first = add;
- } else {
- this->last->next = add;
- }
- this->last = add;
- this->count++;
-}
-
-/**
- * Return the first item in the queue and remove it from the queue.
- * @param ignore_paused Whether to ignore commands that may not be executed while paused.
- * @return the first item in the queue.
- */
-CommandPacket *CommandQueue::Pop(bool ignore_paused)
-{
- CommandPacket **prev = &this->first;
- CommandPacket *ret = this->first;
- CommandPacket *prev_item = nullptr;
- if (ignore_paused && _pause_mode != PM_UNPAUSED) {
- while (ret != nullptr && !IsCommandAllowedWhilePaused(ret->cmd)) {
- prev_item = ret;
- prev = &ret->next;
- ret = ret->next;
- }
- }
- if (ret != nullptr) {
- if (ret == this->last) this->last = prev_item;
- *prev = ret->next;
- this->count--;
- }
- return ret;
-}
-
-/**
- * Return the first item in the queue, but don't remove it.
- * @param ignore_paused Whether to ignore commands that may not be executed while paused.
- * @return the first item in the queue.
- */
-CommandPacket *CommandQueue::Peek(bool ignore_paused)
-{
- if (!ignore_paused || _pause_mode == PM_UNPAUSED) return this->first;
-
- for (CommandPacket *p = this->first; p != nullptr; p = p->next) {
- if (IsCommandAllowedWhilePaused(p->cmd)) return p;
- }
- return nullptr;
-}
-
-/** Free everything that is in the queue. */
-void CommandQueue::Free()
-{
- CommandPacket *cp;
- while ((cp = this->Pop()) != nullptr) {
- delete cp;
- }
- assert(this->count == 0);
-}
-
/** Local queue of packets waiting for handling. */
static CommandQueue _local_wait_queue;
/** Local queue of packets waiting for execution. */
@@ -282,14 +212,14 @@ void NetworkSendCommand(Commands cmd, StringID err_message, CommandCallback *cal
c.frame = _frame_counter_max + 1;
c.my_cmd = true;
- _local_wait_queue.Append(&c);
+ _local_wait_queue.push_back(c);
return;
}
c.frame = 0; // The client can't tell which frame, so just make it 0
/* Clients send their command to the server and forget all about the packet */
- MyClient::SendCommand(&c);
+ MyClient::SendCommand(c);
}
/**
@@ -303,10 +233,9 @@ void NetworkSendCommand(Commands cmd, StringID err_message, CommandCallback *cal
*/
void NetworkSyncCommandQueue(NetworkClientSocket *cs)
{
- for (CommandPacket *p = _local_execution_queue.Peek(); p != nullptr; p = p->next) {
- CommandPacket c = *p;
+ for (auto &p : _local_execution_queue) {
+ CommandPacket &c = cs->outgoing_queue.emplace_back(p);
c.callback = nullptr;
- cs->outgoing_queue.Append(&c);
}
}
@@ -319,8 +248,8 @@ void NetworkExecuteLocalCommandQueue()
CommandQueue &queue = (_network_server ? _local_execution_queue : ClientNetworkGameSocketHandler::my_client->incoming_queue);
- CommandPacket *cp;
- while ((cp = queue.Peek()) != nullptr) {
+ auto cp = queue.begin();
+ for (; cp != queue.end(); cp++) {
/* The queue is always in order, which means
* that the first element will be executed first. */
if (_frame_counter < cp->frame) break;
@@ -336,11 +265,9 @@ void NetworkExecuteLocalCommandQueue()
size_t cb_index = FindCallbackIndex(cp->callback);
assert(cb_index < _callback_tuple_size);
assert(_cmd_dispatch[cp->cmd].Unpack[cb_index] != nullptr);
- _cmd_dispatch[cp->cmd].Unpack[cb_index](cp);
-
- queue.Pop();
- delete cp;
+ _cmd_dispatch[cp->cmd].Unpack[cb_index](*cp);
}
+ queue.erase(queue.begin(), cp);
/* Local company may have changed, so we should not restore the old value */
_current_company = _local_company;
@@ -351,8 +278,8 @@ void NetworkExecuteLocalCommandQueue()
*/
void NetworkFreeLocalCommandQueue()
{
- _local_wait_queue.Free();
- _local_execution_queue.Free();
+ _local_wait_queue.clear();
+ _local_execution_queue.clear();
}
/**
@@ -371,13 +298,13 @@ static void DistributeCommandPacket(CommandPacket &cp, const NetworkClientSocket
* first place. This filters that out. */
cp.callback = (cs != owner) ? nullptr : callback;
cp.my_cmd = (cs == owner);
- cs->outgoing_queue.Append(&cp);
+ cs->outgoing_queue.push_back(cp);
}
}
cp.callback = (nullptr != owner) ? nullptr : callback;
cp.my_cmd = (nullptr == owner);
- _local_execution_queue.Append(&cp);
+ _local_execution_queue.push_back(cp);
}
/**
@@ -385,7 +312,7 @@ static void DistributeCommandPacket(CommandPacket &cp, const NetworkClientSocket
* @param queue The queue of commands that has to be distributed.
* @param owner The client that owns the commands,
*/
-static void DistributeQueue(CommandQueue *queue, const NetworkClientSocket *owner)
+static void DistributeQueue(CommandQueue &queue, const NetworkClientSocket *owner)
{
#ifdef DEBUG_DUMP_COMMANDS
/* When replaying we do not want this limitation. */
@@ -398,11 +325,20 @@ static void DistributeQueue(CommandQueue *queue, const NetworkClientSocket *owne
}
#endif
- CommandPacket *cp;
- while (--to_go >= 0 && (cp = queue->Pop(true)) != nullptr) {
+ /* Not technically the most performant way, but consider clients rarely click more than once per tick. */
+ for (auto cp = queue.begin(); cp != queue.end(); /* removing some items */) {
+ /* Limit the number of commands per client per tick. */
+ if (--to_go < 0) break;
+
+ /* Do not distribute commands when paused and the command is not allowed while paused. */
+ if (_pause_mode != PM_UNPAUSED && !IsCommandAllowedWhilePaused(cp->cmd)) {
+ ++cp;
+ continue;
+ }
+
DistributeCommandPacket(*cp, owner);
- NetworkAdminCmdLogging(owner, cp);
- delete cp;
+ NetworkAdminCmdLogging(owner, *cp);
+ cp = queue.erase(cp);
}
}
@@ -410,11 +346,11 @@ static void DistributeQueue(CommandQueue *queue, const NetworkClientSocket *owne
void NetworkDistributeCommands()
{
/* First send the server's commands. */
- DistributeQueue(&_local_wait_queue, nullptr);
+ DistributeQueue(_local_wait_queue, nullptr);
/* Then send the queues of the others. */
for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
- DistributeQueue(&cs->incoming_queue, cs);
+ DistributeQueue(cs->incoming_queue, cs);
}
}
@@ -424,19 +360,19 @@ void NetworkDistributeCommands()
* @param cp the struct to write the data to.
* @return an error message. When nullptr there has been no error.
*/
-const char *NetworkGameSocketHandler::ReceiveCommand(Packet *p, CommandPacket *cp)
+const char *NetworkGameSocketHandler::ReceiveCommand(Packet &p, CommandPacket &cp)
{
- cp->company = (CompanyID)p->Recv_uint8();
- cp->cmd = static_cast(p->Recv_uint16());
- if (!IsValidCommand(cp->cmd)) return "invalid command";
- if (GetCommandFlags(cp->cmd) & CMD_OFFLINE) return "single-player only command";
- cp->err_msg = p->Recv_uint16();
- cp->data = _cmd_dispatch[cp->cmd].Sanitize(p->Recv_buffer());
+ cp.company = (CompanyID)p.Recv_uint8();
+ cp.cmd = static_cast(p.Recv_uint16());
+ if (!IsValidCommand(cp.cmd)) return "invalid command";
+ if (GetCommandFlags(cp.cmd) & CMD_OFFLINE) return "single-player only command";
+ cp.err_msg = p.Recv_uint16();
+ cp.data = _cmd_dispatch[cp.cmd].Sanitize(p.Recv_buffer());
- byte callback = p->Recv_uint8();
- if (callback >= _callback_table.size() || _cmd_dispatch[cp->cmd].Unpack[callback] == nullptr) return "invalid callback";
+ byte callback = p.Recv_uint8();
+ if (callback >= _callback_table.size() || _cmd_dispatch[cp.cmd].Unpack[callback] == nullptr) return "invalid callback";
- cp->callback = _callback_table[callback];
+ cp.callback = _callback_table[callback];
return nullptr;
}
@@ -445,19 +381,19 @@ const char *NetworkGameSocketHandler::ReceiveCommand(Packet *p, CommandPacket *c
* @param p the packet to send it in.
* @param cp the packet to actually send.
*/
-void NetworkGameSocketHandler::SendCommand(Packet *p, const CommandPacket *cp)
+void NetworkGameSocketHandler::SendCommand(Packet &p, const CommandPacket &cp)
{
- p->Send_uint8(cp->company);
- p->Send_uint16(cp->cmd);
- p->Send_uint16(cp->err_msg);
- p->Send_buffer(cp->data);
+ p.Send_uint8(cp.company);
+ p.Send_uint16(cp.cmd);
+ p.Send_uint16(cp.err_msg);
+ p.Send_buffer(cp.data);
- size_t callback = FindCallbackIndex(cp->callback);
- if (callback > UINT8_MAX || _cmd_dispatch[cp->cmd].Unpack[callback] == nullptr) {
- Debug(net, 0, "Unknown callback for command; no callback sent (command: {})", cp->cmd);
+ size_t callback = FindCallbackIndex(cp.callback);
+ if (callback > UINT8_MAX || _cmd_dispatch[cp.cmd].Unpack[callback] == nullptr) {
+ Debug(net, 0, "Unknown callback for command; no callback sent (command: {})", cp.cmd);
callback = 0; // _callback_table[0] == nullptr
}
- p->Send_uint8 ((uint8_t)callback);
+ p.Send_uint8 ((uint8_t)callback);
}
/** Helper to process a single ClientID argument. */
@@ -537,8 +473,8 @@ CommandDataBuffer SanitizeCmdStrings(const CommandDataBuffer &data)
* @param cp Command packet to unpack.
*/
template
-void UnpackNetworkCommand(const CommandPacket *cp)
+void UnpackNetworkCommand(const CommandPacket &cp)
{
- auto args = EndianBufferReader::ToValue::Args>(cp->data);
- Command::PostFromNet(cp->err_msg, std::get(_callback_tuple), cp->my_cmd, args);
+ auto args = EndianBufferReader::ToValue::Args>(cp.data);
+ Command::PostFromNet(cp.err_msg, std::get(_callback_tuple), cp.my_cmd, args);
}
diff --git a/src/network/network_content.cpp b/src/network/network_content.cpp
index e4a8ea8675..20a73af1a4 100644
--- a/src/network/network_content.cpp
+++ b/src/network/network_content.cpp
@@ -49,34 +49,34 @@ static bool HasGRFConfig(const ContentInfo *ci, bool md5sum)
*/
typedef bool (*HasProc)(const ContentInfo *ci, bool md5sum);
-bool ClientNetworkContentSocketHandler::Receive_SERVER_INFO(Packet *p)
+bool ClientNetworkContentSocketHandler::Receive_SERVER_INFO(Packet &p)
{
ContentInfo *ci = new ContentInfo();
- ci->type = (ContentType)p->Recv_uint8();
- ci->id = (ContentID)p->Recv_uint32();
- ci->filesize = p->Recv_uint32();
+ ci->type = (ContentType)p.Recv_uint8();
+ ci->id = (ContentID)p.Recv_uint32();
+ ci->filesize = p.Recv_uint32();
- ci->name = p->Recv_string(NETWORK_CONTENT_NAME_LENGTH);
- ci->version = p->Recv_string(NETWORK_CONTENT_VERSION_LENGTH);
- ci->url = p->Recv_string(NETWORK_CONTENT_URL_LENGTH);
- ci->description = p->Recv_string(NETWORK_CONTENT_DESC_LENGTH, SVS_REPLACE_WITH_QUESTION_MARK | SVS_ALLOW_NEWLINE);
+ ci->name = p.Recv_string(NETWORK_CONTENT_NAME_LENGTH);
+ ci->version = p.Recv_string(NETWORK_CONTENT_VERSION_LENGTH);
+ ci->url = p.Recv_string(NETWORK_CONTENT_URL_LENGTH);
+ ci->description = p.Recv_string(NETWORK_CONTENT_DESC_LENGTH, SVS_REPLACE_WITH_QUESTION_MARK | SVS_ALLOW_NEWLINE);
- ci->unique_id = p->Recv_uint32();
+ ci->unique_id = p.Recv_uint32();
for (size_t j = 0; j < ci->md5sum.size(); j++) {
- ci->md5sum[j] = p->Recv_uint8();
+ ci->md5sum[j] = p.Recv_uint8();
}
- uint dependency_count = p->Recv_uint8();
+ uint dependency_count = p.Recv_uint8();
ci->dependencies.reserve(dependency_count);
for (uint i = 0; i < dependency_count; i++) {
- ContentID dependency_cid = (ContentID)p->Recv_uint32();
+ ContentID dependency_cid = (ContentID)p.Recv_uint32();
ci->dependencies.push_back(dependency_cid);
this->reverse_dependency_map.insert({ dependency_cid, ci->id });
}
- uint tag_count = p->Recv_uint8();
+ uint tag_count = p.Recv_uint8();
ci->tags.reserve(tag_count);
- for (uint i = 0; i < tag_count; i++) ci->tags.push_back(p->Recv_string(NETWORK_CONTENT_TAG_LENGTH));
+ for (uint i = 0; i < tag_count; i++) ci->tags.push_back(p.Recv_string(NETWORK_CONTENT_TAG_LENGTH));
if (!ci->IsValid()) {
delete ci;
@@ -204,7 +204,7 @@ void ClientNetworkContentSocketHandler::RequestContentList(ContentType type)
this->Connect();
- Packet *p = new Packet(PACKET_CONTENT_CLIENT_INFO_LIST);
+ auto p = std::make_unique(PACKET_CONTENT_CLIENT_INFO_LIST);
p->Send_uint8 ((byte)type);
p->Send_uint32(0xffffffff);
p->Send_uint8 (1);
@@ -221,7 +221,7 @@ void ClientNetworkContentSocketHandler::RequestContentList(ContentType type)
*/
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
}
/**
@@ -240,14 +240,14 @@ void ClientNetworkContentSocketHandler::RequestContentList(uint count, const Con
* The rest of the packet can be used for the IDs. */
uint p_count = std::min(count, (TCP_MTU - sizeof(PacketSize) - sizeof(byte) - sizeof(uint16_t)) / sizeof(uint32_t));
- Packet *p = new Packet(PACKET_CONTENT_CLIENT_INFO_ID, TCP_MTU);
+ auto p = std::make_unique(PACKET_CONTENT_CLIENT_INFO_ID, TCP_MTU);
p->Send_uint16(p_count);
for (uint i = 0; i < p_count; i++) {
p->Send_uint32(content_ids[i]);
}
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
count -= p_count;
content_ids += p_count;
}
@@ -268,7 +268,7 @@ void ClientNetworkContentSocketHandler::RequestContentList(ContentVector *cv, bo
assert(cv->size() < (TCP_MTU - sizeof(PacketSize) - sizeof(byte) - sizeof(uint8_t)) /
(sizeof(uint8_t) + sizeof(uint32_t) + (send_md5sum ? MD5_HASH_BYTES : 0)));
- Packet *p = new Packet(send_md5sum ? PACKET_CONTENT_CLIENT_INFO_EXTID_MD5 : PACKET_CONTENT_CLIENT_INFO_EXTID, TCP_MTU);
+ auto p = std::make_unique(send_md5sum ? PACKET_CONTENT_CLIENT_INFO_EXTID_MD5 : PACKET_CONTENT_CLIENT_INFO_EXTID, TCP_MTU);
p->Send_uint8((uint8_t)cv->size());
for (const ContentInfo *ci : *cv) {
@@ -281,7 +281,7 @@ void ClientNetworkContentSocketHandler::RequestContentList(ContentVector *cv, bo
}
}
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
for (ContentInfo *ci : *cv) {
bool found = false;
@@ -365,14 +365,14 @@ void ClientNetworkContentSocketHandler::DownloadSelectedContentFallback(const Co
* The rest of the packet can be used for the IDs. */
uint p_count = std::min(count, (TCP_MTU - sizeof(PacketSize) - sizeof(byte) - sizeof(uint16_t)) / sizeof(uint32_t));
- Packet *p = new Packet(PACKET_CONTENT_CLIENT_CONTENT, TCP_MTU);
+ auto p = std::make_unique(PACKET_CONTENT_CLIENT_CONTENT, TCP_MTU);
p->Send_uint16(p_count);
for (uint i = 0; i < p_count; i++) {
p->Send_uint32(content_ids[i]);
}
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
count -= p_count;
content_ids += p_count;
}
@@ -477,16 +477,16 @@ static inline ssize_t TransferOutFWrite(FILE *file, const char *buffer, size_t a
return fwrite(buffer, 1, amount, file);
}
-bool ClientNetworkContentSocketHandler::Receive_SERVER_CONTENT(Packet *p)
+bool ClientNetworkContentSocketHandler::Receive_SERVER_CONTENT(Packet &p)
{
if (this->curFile == nullptr) {
delete this->curInfo;
/* When we haven't opened a file this must be our first packet with metadata. */
this->curInfo = new ContentInfo;
- this->curInfo->type = (ContentType)p->Recv_uint8();
- this->curInfo->id = (ContentID)p->Recv_uint32();
- this->curInfo->filesize = p->Recv_uint32();
- this->curInfo->filename = p->Recv_string(NETWORK_CONTENT_FILENAME_LENGTH);
+ this->curInfo->type = (ContentType)p.Recv_uint8();
+ this->curInfo->id = (ContentID)p.Recv_uint32();
+ this->curInfo->filesize = p.Recv_uint32();
+ this->curInfo->filename = p.Recv_string(NETWORK_CONTENT_FILENAME_LENGTH);
if (!this->BeforeDownload()) {
this->CloseConnection();
@@ -494,8 +494,8 @@ bool ClientNetworkContentSocketHandler::Receive_SERVER_CONTENT(Packet *p)
}
} else {
/* We have a file opened, thus are downloading internal content */
- size_t toRead = p->RemainingBytesToTransfer();
- if (toRead != 0 && (size_t)p->TransferOut(TransferOutFWrite, this->curFile) != toRead) {
+ size_t toRead = p.RemainingBytesToTransfer();
+ if (toRead != 0 && (size_t)p.TransferOut(TransferOutFWrite, this->curFile) != toRead) {
CloseWindowById(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_CONTENT_DOWNLOAD);
ShowErrorMessage(STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD, STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_FILE_NOT_WRITABLE, WL_ERROR);
this->CloseConnection();
diff --git a/src/network/network_content.h b/src/network/network_content.h
index a5f75bcd84..1d4764feed 100644
--- a/src/network/network_content.h
+++ b/src/network/network_content.h
@@ -82,8 +82,8 @@ protected:
friend class NetworkContentConnecter;
- bool Receive_SERVER_INFO(Packet *p) override;
- bool Receive_SERVER_CONTENT(Packet *p) override;
+ bool Receive_SERVER_INFO(Packet &p) override;
+ bool Receive_SERVER_CONTENT(Packet &p) override;
ContentInfo *GetContent(ContentID cid) const;
void DownloadContentInfo(ContentID cid);
diff --git a/src/network/network_coordinator.cpp b/src/network/network_coordinator.cpp
index b049376cc9..129b26f8fb 100644
--- a/src/network/network_coordinator.cpp
+++ b/src/network/network_coordinator.cpp
@@ -124,10 +124,10 @@ public:
}
};
-bool ClientNetworkCoordinatorSocketHandler::Receive_GC_ERROR(Packet *p)
+bool ClientNetworkCoordinatorSocketHandler::Receive_GC_ERROR(Packet &p)
{
- NetworkCoordinatorErrorType error = (NetworkCoordinatorErrorType)p->Recv_uint8();
- std::string detail = p->Recv_string(NETWORK_ERROR_DETAIL_LENGTH);
+ NetworkCoordinatorErrorType error = (NetworkCoordinatorErrorType)p.Recv_uint8();
+ std::string detail = p.Recv_string(NETWORK_ERROR_DETAIL_LENGTH);
switch (error) {
case NETWORK_COORDINATOR_ERROR_UNKNOWN:
@@ -174,14 +174,14 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_ERROR(Packet *p)
}
}
-bool ClientNetworkCoordinatorSocketHandler::Receive_GC_REGISTER_ACK(Packet *p)
+bool ClientNetworkCoordinatorSocketHandler::Receive_GC_REGISTER_ACK(Packet &p)
{
/* Schedule sending an update. */
this->next_update = std::chrono::steady_clock::now();
- _settings_client.network.server_invite_code = p->Recv_string(NETWORK_INVITE_CODE_LENGTH);
- _settings_client.network.server_invite_code_secret = p->Recv_string(NETWORK_INVITE_CODE_SECRET_LENGTH);
- _network_server_connection_type = (ConnectionType)p->Recv_uint8();
+ _settings_client.network.server_invite_code = p.Recv_string(NETWORK_INVITE_CODE_LENGTH);
+ _settings_client.network.server_invite_code_secret = p.Recv_string(NETWORK_INVITE_CODE_SECRET_LENGTH);
+ _network_server_connection_type = (ConnectionType)p.Recv_uint8();
if (_network_server_connection_type == CONNECTION_TYPE_ISOLATED) {
ShowErrorMessage(STR_NETWORK_ERROR_COORDINATOR_ISOLATED, STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL, WL_ERROR);
@@ -230,9 +230,9 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_REGISTER_ACK(Packet *p)
return true;
}
-bool ClientNetworkCoordinatorSocketHandler::Receive_GC_LISTING(Packet *p)
+bool ClientNetworkCoordinatorSocketHandler::Receive_GC_LISTING(Packet &p)
{
- uint8_t servers = p->Recv_uint16();
+ uint8_t servers = p.Recv_uint16();
/* End of list; we can now remove all expired items from the list. */
if (servers == 0) {
@@ -241,11 +241,11 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_LISTING(Packet *p)
}
for (; servers > 0; servers--) {
- std::string connection_string = p->Recv_string(NETWORK_HOSTNAME_PORT_LENGTH);
+ std::string connection_string = p.Recv_string(NETWORK_HOSTNAME_PORT_LENGTH);
/* Read the NetworkGameInfo from the packet. */
NetworkGameInfo ngi = {};
- DeserializeNetworkGameInfo(p, &ngi, &this->newgrf_lookup_table);
+ DeserializeNetworkGameInfo(p, ngi, &this->newgrf_lookup_table);
/* Now we know the connection string, we can add it to our list. */
NetworkGameList *item = NetworkGameListAddItem(connection_string);
@@ -266,10 +266,10 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_LISTING(Packet *p)
return true;
}
-bool ClientNetworkCoordinatorSocketHandler::Receive_GC_CONNECTING(Packet *p)
+bool ClientNetworkCoordinatorSocketHandler::Receive_GC_CONNECTING(Packet &p)
{
- std::string token = p->Recv_string(NETWORK_TOKEN_LENGTH);
- std::string invite_code = p->Recv_string(NETWORK_INVITE_CODE_LENGTH);
+ std::string token = p.Recv_string(NETWORK_TOKEN_LENGTH);
+ std::string invite_code = p.Recv_string(NETWORK_INVITE_CODE_LENGTH);
/* Find the connecter based on the invite code. */
auto connecter_pre_it = this->connecter_pre.find(invite_code);
@@ -285,20 +285,20 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_CONNECTING(Packet *p)
return true;
}
-bool ClientNetworkCoordinatorSocketHandler::Receive_GC_CONNECT_FAILED(Packet *p)
+bool ClientNetworkCoordinatorSocketHandler::Receive_GC_CONNECT_FAILED(Packet &p)
{
- std::string token = p->Recv_string(NETWORK_TOKEN_LENGTH);
+ std::string token = p.Recv_string(NETWORK_TOKEN_LENGTH);
this->CloseToken(token);
return true;
}
-bool ClientNetworkCoordinatorSocketHandler::Receive_GC_DIRECT_CONNECT(Packet *p)
+bool ClientNetworkCoordinatorSocketHandler::Receive_GC_DIRECT_CONNECT(Packet &p)
{
- std::string token = p->Recv_string(NETWORK_TOKEN_LENGTH);
- uint8_t tracking_number = p->Recv_uint8();
- std::string hostname = p->Recv_string(NETWORK_HOSTNAME_LENGTH);
- uint16_t port = p->Recv_uint16();
+ std::string token = p.Recv_string(NETWORK_TOKEN_LENGTH);
+ uint8_t tracking_number = p.Recv_uint8();
+ std::string hostname = p.Recv_string(NETWORK_HOSTNAME_LENGTH);
+ uint16_t port = p.Recv_uint16();
/* Ensure all other pending connection attempts are killed. */
if (this->game_connecter != nullptr) {
@@ -310,22 +310,22 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_DIRECT_CONNECT(Packet *p)
return true;
}
-bool ClientNetworkCoordinatorSocketHandler::Receive_GC_STUN_REQUEST(Packet *p)
+bool ClientNetworkCoordinatorSocketHandler::Receive_GC_STUN_REQUEST(Packet &p)
{
- std::string token = p->Recv_string(NETWORK_TOKEN_LENGTH);
+ std::string token = p.Recv_string(NETWORK_TOKEN_LENGTH);
this->stun_handlers[token][AF_INET6] = ClientNetworkStunSocketHandler::Stun(token, AF_INET6);
this->stun_handlers[token][AF_INET] = ClientNetworkStunSocketHandler::Stun(token, AF_INET);
return true;
}
-bool ClientNetworkCoordinatorSocketHandler::Receive_GC_STUN_CONNECT(Packet *p)
+bool ClientNetworkCoordinatorSocketHandler::Receive_GC_STUN_CONNECT(Packet &p)
{
- std::string token = p->Recv_string(NETWORK_TOKEN_LENGTH);
- uint8_t tracking_number = p->Recv_uint8();
- uint8_t family = p->Recv_uint8();
- std::string host = p->Recv_string(NETWORK_HOSTNAME_PORT_LENGTH);
- uint16_t port = p->Recv_uint16();
+ std::string token = p.Recv_string(NETWORK_TOKEN_LENGTH);
+ uint8_t tracking_number = p.Recv_uint8();
+ uint8_t family = p.Recv_uint8();
+ std::string host = p.Recv_string(NETWORK_HOSTNAME_PORT_LENGTH);
+ uint16_t port = p.Recv_uint16();
/* Check if we know this token. */
auto stun_it = this->stun_handlers.find(token);
@@ -353,24 +353,24 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_STUN_CONNECT(Packet *p)
return true;
}
-bool ClientNetworkCoordinatorSocketHandler::Receive_GC_NEWGRF_LOOKUP(Packet *p)
+bool ClientNetworkCoordinatorSocketHandler::Receive_GC_NEWGRF_LOOKUP(Packet &p)
{
- this->newgrf_lookup_table_cursor = p->Recv_uint32();
+ this->newgrf_lookup_table_cursor = p.Recv_uint32();
- uint16_t newgrfs = p->Recv_uint16();
+ uint16_t newgrfs = p.Recv_uint16();
for (; newgrfs> 0; newgrfs--) {
- uint32_t index = p->Recv_uint32();
- DeserializeGRFIdentifierWithName(p, &this->newgrf_lookup_table[index]);
+ uint32_t index = p.Recv_uint32();
+ DeserializeGRFIdentifierWithName(p, this->newgrf_lookup_table[index]);
}
return true;
}
-bool ClientNetworkCoordinatorSocketHandler::Receive_GC_TURN_CONNECT(Packet *p)
+bool ClientNetworkCoordinatorSocketHandler::Receive_GC_TURN_CONNECT(Packet &p)
{
- std::string token = p->Recv_string(NETWORK_TOKEN_LENGTH);
- uint8_t tracking_number = p->Recv_uint8();
- std::string ticket = p->Recv_string(NETWORK_TOKEN_LENGTH);
- std::string connection_string = p->Recv_string(NETWORK_HOSTNAME_PORT_LENGTH);
+ std::string token = p.Recv_string(NETWORK_TOKEN_LENGTH);
+ uint8_t tracking_number = p.Recv_uint8();
+ std::string ticket = p.Recv_string(NETWORK_TOKEN_LENGTH);
+ std::string connection_string = p.Recv_string(NETWORK_HOSTNAME_PORT_LENGTH);
/* Ensure all other pending connection attempts are killed. */
if (this->game_connecter != nullptr) {
@@ -458,7 +458,7 @@ void ClientNetworkCoordinatorSocketHandler::Register()
this->Connect();
- Packet *p = new Packet(PACKET_COORDINATOR_SERVER_REGISTER);
+ auto p = std::make_unique(PACKET_COORDINATOR_SERVER_REGISTER);
p->Send_uint8(NETWORK_COORDINATOR_VERSION);
p->Send_uint8(_settings_client.network.server_game_type);
p->Send_uint16(_settings_client.network.server_port);
@@ -470,7 +470,7 @@ void ClientNetworkCoordinatorSocketHandler::Register()
p->Send_string(_settings_client.network.server_invite_code_secret);
}
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
}
/**
@@ -480,11 +480,11 @@ void ClientNetworkCoordinatorSocketHandler::SendServerUpdate()
{
Debug(net, 6, "Sending server update to Game Coordinator");
- Packet *p = new Packet(PACKET_COORDINATOR_SERVER_UPDATE, TCP_MTU);
+ auto p = std::make_unique(PACKET_COORDINATOR_SERVER_UPDATE, TCP_MTU);
p->Send_uint8(NETWORK_COORDINATOR_VERSION);
- SerializeNetworkGameInfo(p, GetCurrentNetworkServerGameInfo(), this->next_update.time_since_epoch() != std::chrono::nanoseconds::zero());
+ SerializeNetworkGameInfo(*p, GetCurrentNetworkServerGameInfo(), this->next_update.time_since_epoch() != std::chrono::nanoseconds::zero());
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
this->next_update = std::chrono::steady_clock::now() + NETWORK_COORDINATOR_DELAY_BETWEEN_UPDATES;
}
@@ -498,13 +498,13 @@ void ClientNetworkCoordinatorSocketHandler::GetListing()
_network_game_list_version++;
- Packet *p = new Packet(PACKET_COORDINATOR_CLIENT_LISTING);
+ auto p = std::make_unique(PACKET_COORDINATOR_CLIENT_LISTING);
p->Send_uint8(NETWORK_COORDINATOR_VERSION);
p->Send_uint8(NETWORK_GAME_INFO_VERSION);
p->Send_string(_openttd_revision);
p->Send_uint32(this->newgrf_lookup_table_cursor);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
}
/**
@@ -530,11 +530,11 @@ void ClientNetworkCoordinatorSocketHandler::ConnectToServer(const std::string &i
this->Connect();
- Packet *p = new Packet(PACKET_COORDINATOR_CLIENT_CONNECT);
+ auto p = std::make_unique(PACKET_COORDINATOR_CLIENT_CONNECT);
p->Send_uint8(NETWORK_COORDINATOR_VERSION);
p->Send_string(invite_code);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
}
/**
@@ -547,12 +547,12 @@ void ClientNetworkCoordinatorSocketHandler::ConnectFailure(const std::string &to
/* Connecter will destroy itself. */
this->game_connecter = nullptr;
- Packet *p = new Packet(PACKET_COORDINATOR_SERCLI_CONNECT_FAILED);
+ auto p = std::make_unique(PACKET_COORDINATOR_SERCLI_CONNECT_FAILED);
p->Send_uint8(NETWORK_COORDINATOR_VERSION);
p->Send_string(token);
p->Send_uint8(tracking_number);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
/* We do not close the associated connecter here yet, as the
* Game Coordinator might have other methods of connecting available. */
@@ -578,10 +578,10 @@ void ClientNetworkCoordinatorSocketHandler::ConnectSuccess(const std::string &to
} else {
/* The client informs the Game Coordinator about the success. The server
* doesn't have to, as it is implied by the client telling. */
- Packet *p = new Packet(PACKET_COORDINATOR_CLIENT_CONNECTED);
+ auto p = std::make_unique(PACKET_COORDINATOR_CLIENT_CONNECTED);
p->Send_uint8(NETWORK_COORDINATOR_VERSION);
p->Send_string(token);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
/* Find the connecter; it can happen it no longer exist, in cases where
* we aborted the connect but the Game Coordinator was already in the
@@ -606,12 +606,12 @@ void ClientNetworkCoordinatorSocketHandler::ConnectSuccess(const std::string &to
*/
void ClientNetworkCoordinatorSocketHandler::StunResult(const std::string &token, uint8_t family, bool result)
{
- Packet *p = new Packet(PACKET_COORDINATOR_SERCLI_STUN_RESULT);
+ auto p = std::make_unique(PACKET_COORDINATOR_SERCLI_STUN_RESULT);
p->Send_uint8(NETWORK_COORDINATOR_VERSION);
p->Send_string(token);
p->Send_uint8(family);
p->Send_bool(result);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
}
/**
diff --git a/src/network/network_coordinator.h b/src/network/network_coordinator.h
index ccb74e4921..f8aa88e6b8 100644
--- a/src/network/network_coordinator.h
+++ b/src/network/network_coordinator.h
@@ -63,16 +63,16 @@ private:
GameInfoNewGRFLookupTable newgrf_lookup_table; ///< Table to look up NewGRFs in the GC_LISTING packets.
protected:
- bool Receive_GC_ERROR(Packet *p) override;
- bool Receive_GC_REGISTER_ACK(Packet *p) override;
- bool Receive_GC_LISTING(Packet *p) override;
- bool Receive_GC_CONNECTING(Packet *p) override;
- bool Receive_GC_CONNECT_FAILED(Packet *p) override;
- bool Receive_GC_DIRECT_CONNECT(Packet *p) override;
- bool Receive_GC_STUN_REQUEST(Packet *p) override;
- bool Receive_GC_STUN_CONNECT(Packet *p) override;
- bool Receive_GC_NEWGRF_LOOKUP(Packet *p) override;
- bool Receive_GC_TURN_CONNECT(Packet *p) override;
+ bool Receive_GC_ERROR(Packet &p) override;
+ bool Receive_GC_REGISTER_ACK(Packet &p) override;
+ bool Receive_GC_LISTING(Packet &p) override;
+ bool Receive_GC_CONNECTING(Packet &p) override;
+ bool Receive_GC_CONNECT_FAILED(Packet &p) override;
+ bool Receive_GC_DIRECT_CONNECT(Packet &p) override;
+ bool Receive_GC_STUN_REQUEST(Packet &p) override;
+ bool Receive_GC_STUN_CONNECT(Packet &p) override;
+ bool Receive_GC_NEWGRF_LOOKUP(Packet &p) override;
+ bool Receive_GC_TURN_CONNECT(Packet &p) override;
public:
/** The idle timeout; when to close the connection because it's idle. */
diff --git a/src/network/network_internal.h b/src/network/network_internal.h
index 395e12194f..66dea11be4 100644
--- a/src/network/network_internal.h
+++ b/src/network/network_internal.h
@@ -107,9 +107,7 @@ void UpdateNetworkGameWindow();
* Everything we need to know about a command to be able to execute it.
*/
struct CommandPacket {
- /** Make sure the pointer is nullptr. */
- CommandPacket() : next(nullptr), company(INVALID_COMPANY), frame(0), my_cmd(false) {}
- CommandPacket *next; ///< the next command packet (if in queue)
+ CommandPacket() : company(INVALID_COMPANY), frame(0), my_cmd(false) {}
CompanyID company; ///< company that is executing the command
uint32_t frame; ///< the frame in which this packet is executed
bool my_cmd; ///< did the command originate from "me"
diff --git a/src/network/network_query.cpp b/src/network/network_query.cpp
index 0fb128b610..34cbd09289 100644
--- a/src/network/network_query.cpp
+++ b/src/network/network_query.cpp
@@ -83,11 +83,11 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::SendGameInfo()
{
Debug(net, 9, "Query::SendGameInfo()");
- this->SendPacket(new Packet(PACKET_CLIENT_GAME_INFO));
+ this->SendPacket(std::make_unique(PACKET_CLIENT_GAME_INFO));
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *)
+NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_FULL(Packet &)
{
Debug(net, 9, "Query::Receive_SERVER_FULL()");
@@ -100,7 +100,7 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *)
return NETWORK_RECV_STATUS_CLOSE_QUERY;
}
-NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *)
+NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet &)
{
Debug(net, 9, "Query::Receive_SERVER_BANNED()");
@@ -113,7 +113,7 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *)
return NETWORK_RECV_STATUS_CLOSE_QUERY;
}
-NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet *p)
+NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet &p)
{
Debug(net, 9, "Query::Receive_SERVER_GAME_INFO()");
@@ -122,7 +122,7 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet
/* Clear any existing GRFConfig chain. */
ClearGRFConfigList(&item->info.grfconfig);
/* Retrieve the NetworkGameInfo from the packet. */
- DeserializeNetworkGameInfo(p, &item->info);
+ DeserializeNetworkGameInfo(p, item->info);
/* Check for compatability with the client. */
CheckGameCompatibility(item->info);
/* Ensure we consider the server online. */
@@ -134,9 +134,9 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet
return NETWORK_RECV_STATUS_CLOSE_QUERY;
}
-NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p)
+NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet &p)
{
- NetworkErrorCode error = (NetworkErrorCode)p->Recv_uint8();
+ NetworkErrorCode error = (NetworkErrorCode)p.Recv_uint8();
Debug(net, 9, "Query::Receive_SERVER_ERROR(): error={}", error);
diff --git a/src/network/network_query.h b/src/network/network_query.h
index ab0f8cd1d2..0f7348838f 100644
--- a/src/network/network_query.h
+++ b/src/network/network_query.h
@@ -19,10 +19,10 @@ private:
std::string connection_string; ///< Address we are connected to.
protected:
- NetworkRecvStatus Receive_SERVER_FULL(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_BANNED(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_ERROR(Packet *p) override;
- NetworkRecvStatus Receive_SERVER_GAME_INFO(Packet *p) override;
+ NetworkRecvStatus Receive_SERVER_FULL(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_BANNED(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_ERROR(Packet &p) override;
+ NetworkRecvStatus Receive_SERVER_GAME_INFO(Packet &p) override;
NetworkRecvStatus SendGameInfo();
diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp
index 96c95434e5..a60ed66ed9 100644
--- a/src/network/network_server.cpp
+++ b/src/network/network_server.cpp
@@ -61,9 +61,9 @@ template SocketList TCPListenHandler current; ///< The packet we're currently writing to.
size_t total_size; ///< Total size of the compressed savegame.
- Packet *packets; ///< Packet queue of the savegame; send these "slowly" to the client.
+ std::deque> packets; ///< Packet queue of the savegame; send these "slowly" to the client. Cannot be a std::queue as we want to push the map size packet in front of the data packets.
std::mutex mutex; ///< Mutex for making threaded saving safe.
std::condition_variable exit_sig; ///< Signal for threaded destruction of this packet writer.
@@ -71,7 +71,7 @@ struct PacketWriter : SaveFilter {
* Create the packet writer.
* @param cs The socket handler we're making the packets for.
*/
- PacketWriter(ServerNetworkGameSocketHandler *cs) : SaveFilter(nullptr), cs(cs), current(nullptr), total_size(0), packets(nullptr)
+ PacketWriter(ServerNetworkGameSocketHandler *cs) : SaveFilter(nullptr), cs(cs), total_size(0)
{
}
@@ -84,11 +84,9 @@ struct PacketWriter : SaveFilter {
/* This must all wait until the Destroy function is called. */
- while (this->packets != nullptr) {
- delete Packet::PopFromQueue(&this->packets);
- }
-
- delete this->current;
+ Debug(net, 0, "Destruct!");
+ this->packets.clear();
+ this->current = nullptr;
}
/**
@@ -125,14 +123,14 @@ struct PacketWriter : SaveFilter {
bool TransferToNetworkQueue(ServerNetworkGameSocketHandler *socket)
{
/* Unsafe check for the queue being empty or not. */
- if (this->packets == nullptr) return false;
+ if (this->packets.empty()) return false;
std::lock_guard lock(this->mutex);
- while (this->packets != nullptr) {
- Packet *p = Packet::PopFromQueue(&this->packets);
- bool last_packet = p->GetPacketType() == PACKET_SERVER_MAP_DONE;
- socket->SendPacket(p);
+ while (!this->packets.empty()) {
+ bool last_packet = this->packets.front()->GetPacketType() == PACKET_SERVER_MAP_DONE;
+ socket->SendPacket(std::move(this->packets.front()));
+ this->packets.pop_front();
if (last_packet) return true;
}
@@ -140,32 +138,12 @@ struct PacketWriter : SaveFilter {
return false;
}
- /** Append the current packet to the queue. */
- void AppendQueue()
- {
- if (this->current == nullptr) return;
-
- Packet::AddToQueue(&this->packets, this->current);
- this->current = nullptr;
- }
-
- /** Prepend the current packet to the queue. */
- void PrependQueue()
- {
- if (this->current == nullptr) return;
-
- /* Reversed from AppendQueue so the queue gets added to the current one. */
- Packet::AddToQueue(&this->current, this->packets);
- this->packets = this->current;
- this->current = nullptr;
- }
-
void Write(byte *buf, size_t size) override
{
/* We want to abort the saving when the socket is closed. */
if (this->cs == nullptr) SlError(STR_NETWORK_ERROR_LOSTCONNECTION);
- if (this->current == nullptr) this->current = new Packet(PACKET_SERVER_MAP_DATA, TCP_MTU);
+ if (this->current == nullptr) this->current = std::make_unique(PACKET_SERVER_MAP_DATA, TCP_MTU);
std::lock_guard lock(this->mutex);
@@ -175,8 +153,8 @@ struct PacketWriter : SaveFilter {
buf += written;
if (!this->current->CanWriteToPacket(1)) {
- this->AppendQueue();
- if (buf != bufe) this->current = new Packet(PACKET_SERVER_MAP_DATA, TCP_MTU);
+ this->packets.push_back(std::move(this->current));
+ if (buf != bufe) this->current = std::make_unique(PACKET_SERVER_MAP_DATA, TCP_MTU);
}
}
@@ -191,16 +169,15 @@ struct PacketWriter : SaveFilter {
std::lock_guard lock(this->mutex);
/* Make sure the last packet is flushed. */
- this->AppendQueue();
+ if (this->current != nullptr) this->packets.push_back(std::move(this->current));
/* Add a packet stating that this is the end to the queue. */
- this->current = new Packet(PACKET_SERVER_MAP_DONE);
- this->AppendQueue();
+ this->packets.push_back(std::make_unique(PACKET_SERVER_MAP_DONE));
/* Fast-track the size to the client. */
- this->current = new Packet(PACKET_SERVER_MAP_SIZE);
- this->current->Send_uint32((uint32_t)this->total_size);
- this->PrependQueue();
+ auto p = std::make_unique(PACKET_SERVER_MAP_SIZE);
+ p->Send_uint32((uint32_t)this->total_size);
+ this->packets.push_front(std::move(p));
}
};
@@ -239,7 +216,7 @@ ServerNetworkGameSocketHandler::~ServerNetworkGameSocketHandler()
}
}
-Packet *ServerNetworkGameSocketHandler::ReceivePacket()
+std::unique_ptr ServerNetworkGameSocketHandler::ReceivePacket()
{
/* Only allow receiving when we have some buffer free; this value
* can go negative, but eventually it will become positive again. */
@@ -247,7 +224,7 @@ Packet *ServerNetworkGameSocketHandler::ReceivePacket()
/* We can receive a packet, so try that and if needed account for
* the amount of received data. */
- Packet *p = this->NetworkTCPSocketHandler::ReceivePacket();
+ std::unique_ptr p = this->NetworkTCPSocketHandler::ReceivePacket();
if (p != nullptr) this->receive_limit -= p->Size();
return p;
}
@@ -338,7 +315,6 @@ static void NetworkHandleCommandQueue(NetworkClientSocket *cs);
/***********
* Sending functions
- * DEF_SERVER_SEND_COMMAND has parameter: NetworkClientSocket *cs
************/
/**
@@ -350,12 +326,12 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendClientInfo(NetworkClientIn
Debug(net, 9, "client[{}] SendClientInfo(): client_id={}", this->client_id, ci->client_id);
if (ci->client_id != INVALID_CLIENT_ID) {
- Packet *p = new Packet(PACKET_SERVER_CLIENT_INFO);
+ auto p = std::make_unique(PACKET_SERVER_CLIENT_INFO);
p->Send_uint32(ci->client_id);
p->Send_uint8 (ci->client_playas);
p->Send_string(ci->client_name);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
}
return NETWORK_RECV_STATUS_OKAY;
}
@@ -365,10 +341,10 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendGameInfo()
{
Debug(net, 9, "client[{}] SendGameInfo()", this->client_id);
- Packet *p = new Packet(PACKET_SERVER_GAME_INFO, TCP_MTU);
- SerializeNetworkGameInfo(p, GetCurrentNetworkServerGameInfo());
+ auto p = std::make_unique(PACKET_SERVER_GAME_INFO, TCP_MTU);
+ SerializeNetworkGameInfo(*p, GetCurrentNetworkServerGameInfo());
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -382,11 +358,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendError(NetworkErrorCode err
{
Debug(net, 9, "client[{}] SendError(): error={}", this->client_id, error);
- Packet *p = new Packet(PACKET_SERVER_ERROR);
+ auto p = std::make_unique(PACKET_SERVER_ERROR);
p->Send_uint8(error);
if (!reason.empty()) p->Send_string(reason);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
StringID strid = GetNetworkErrorMsg(error);
@@ -427,7 +403,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNewGRFCheck()
{
Debug(net, 9, "client[{}] SendNewGRFCheck()", this->client_id);
- Packet *p = new Packet(PACKET_SERVER_CHECK_NEWGRFS, TCP_MTU);
+ auto p = std::make_unique(PACKET_SERVER_CHECK_NEWGRFS, TCP_MTU);
const GRFConfig *c;
uint grf_count = 0;
@@ -437,16 +413,21 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNewGRFCheck()
p->Send_uint8 (grf_count);
for (c = _grfconfig; c != nullptr; c = c->next) {
- if (!HasBit(c->flags, GCF_STATIC)) SerializeGRFIdentifier(p, &c->ident);
+ if (!HasBit(c->flags, GCF_STATIC)) SerializeGRFIdentifier(*p, c->ident);
}
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
/** Request the game password. */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendNeedGamePassword()
{
+ if (_settings_client.network.server_password.empty()) {
+ /* Do not actually need a game password, continue with the company password. */
+ return this->SendNeedCompanyPassword();
+ }
+
Debug(net, 9, "client[{}] SendNeedGamePassword()", this->client_id);
/* Invalid packet when status is STATUS_AUTH_GAME or higher */
@@ -457,14 +438,19 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNeedGamePassword()
/* Reset 'lag' counters */
this->last_frame = this->last_frame_server = _frame_counter;
- Packet *p = new Packet(PACKET_SERVER_NEED_GAME_PASSWORD);
- this->SendPacket(p);
+ auto p = std::make_unique(PACKET_SERVER_NEED_GAME_PASSWORD);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
/** Request the company password. */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendNeedCompanyPassword()
{
+ NetworkClientInfo *ci = this->GetInfo();
+ if (!Company::IsValidID(ci->client_playas) || _network_company_states[ci->client_playas].password.empty()) {
+ return this->SendWelcome();
+ }
+
Debug(net, 9, "client[{}] SendNeedCompanyPassword()", this->client_id);
/* Invalid packet when status is STATUS_AUTH_COMPANY or higher */
@@ -475,10 +461,10 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNeedCompanyPassword()
/* Reset 'lag' counters */
this->last_frame = this->last_frame_server = _frame_counter;
- Packet *p = new Packet(PACKET_SERVER_NEED_COMPANY_PASSWORD);
+ auto p = std::make_unique(PACKET_SERVER_NEED_COMPANY_PASSWORD);
p->Send_uint32(_settings_game.game_creation.generation_seed);
p->Send_string(_settings_client.network.network_id);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -487,8 +473,6 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendWelcome()
{
Debug(net, 9, "client[{}] SendWelcome()", this->client_id);
- Packet *p;
-
/* Invalid packet when status is AUTH or higher */
if (this->status >= STATUS_AUTHORIZED) return this->CloseConnection(NETWORK_RECV_STATUS_MALFORMED_PACKET);
@@ -499,11 +483,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendWelcome()
_network_game_info.clients_on++;
- p = new Packet(PACKET_SERVER_WELCOME);
+ auto p = std::make_unique(PACKET_SERVER_WELCOME);
p->Send_uint32(this->client_id);
p->Send_uint32(_settings_game.game_creation.generation_seed);
p->Send_string(_settings_client.network.network_id);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
/* Transmit info about all the active clients */
for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
@@ -521,7 +505,6 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendWait()
Debug(net, 9, "client[{}] SendWait()", this->client_id);
int waiting = 1; // current player getting the map counts as 1
- Packet *p;
/* Count how many clients are waiting in the queue, in front of you! */
for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
@@ -529,9 +512,9 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendWait()
if (new_cs->GetInfo()->join_date < this->GetInfo()->join_date || (new_cs->GetInfo()->join_date == this->GetInfo()->join_date && new_cs->client_id < this->client_id)) waiting++;
}
- p = new Packet(PACKET_SERVER_WAIT);
+ auto p = std::make_unique(PACKET_SERVER_WAIT);
p->Send_uint8(waiting);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -576,12 +559,12 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendMap()
Debug(net, 9, "client[{}] SendMap(): first_packet", this->client_id);
WaitTillSaved();
- this->savegame = new PacketWriter(this);
+ this->savegame = std::make_shared(this);
/* Now send the _frame_counter and how many packets are coming */
- Packet *p = new Packet(PACKET_SERVER_MAP_BEGIN);
+ auto p = std::make_unique(PACKET_SERVER_MAP_BEGIN);
p->Send_uint32(_frame_counter);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
NetworkSyncCommandQueue(this);
Debug(net, 9, "client[{}] status = MAP", this->client_id);
@@ -622,18 +605,18 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendJoin(ClientID client_id)
{
Debug(net, 9, "client[{}] SendJoin(): client_id={}", this->client_id, client_id);
- Packet *p = new Packet(PACKET_SERVER_JOIN);
+ auto p = std::make_unique(PACKET_SERVER_JOIN);
p->Send_uint32(client_id);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
/** Tell the client that they may run to a particular frame. */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendFrame()
{
- Packet *p = new Packet(PACKET_SERVER_FRAME);
+ auto p = std::make_unique(PACKET_SERVER_FRAME);
p->Send_uint32(_frame_counter);
p->Send_uint32(_frame_counter_max);
#ifdef ENABLE_NETWORK_SYNC_EVERY_FRAME
@@ -649,7 +632,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendFrame()
p->Send_uint8(this->last_token);
}
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -658,14 +641,14 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendSync()
{
Debug(net, 9, "client[{}] SendSync(), frame_counter={}, sync_seed_1={}", this->client_id, _frame_counter, _sync_seed_1);
- Packet *p = new Packet(PACKET_SERVER_SYNC);
+ auto p = std::make_unique(PACKET_SERVER_SYNC);
p->Send_uint32(_frame_counter);
p->Send_uint32(_sync_seed_1);
#ifdef NETWORK_SEND_DOUBLE_SEED
p->Send_uint32(_sync_seed_2);
#endif
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -673,17 +656,17 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendSync()
* Send a command to the client to execute.
* @param cp The command to send.
*/
-NetworkRecvStatus ServerNetworkGameSocketHandler::SendCommand(const CommandPacket *cp)
+NetworkRecvStatus ServerNetworkGameSocketHandler::SendCommand(const CommandPacket &cp)
{
- Debug(net, 9, "client[{}] SendCommand(): cmd={}", this->client_id, cp->cmd);
+ Debug(net, 9, "client[{}] SendCommand(): cmd={}", this->client_id, cp.cmd);
- Packet *p = new Packet(PACKET_SERVER_COMMAND);
+ auto p = std::make_unique(PACKET_SERVER_COMMAND);
- this->NetworkGameSocketHandler::SendCommand(p, cp);
- p->Send_uint32(cp->frame);
- p->Send_bool (cp->my_cmd);
+ this->NetworkGameSocketHandler::SendCommand(*p, cp);
+ p->Send_uint32(cp.frame);
+ p->Send_bool (cp.my_cmd);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -701,7 +684,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendChat(NetworkAction action,
if (this->status < STATUS_PRE_ACTIVE) return NETWORK_RECV_STATUS_OKAY;
- Packet *p = new Packet(PACKET_SERVER_CHAT);
+ auto p = std::make_unique(PACKET_SERVER_CHAT);
p->Send_uint8 (action);
p->Send_uint32(client_id);
@@ -709,7 +692,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendChat(NetworkAction action,
p->Send_string(msg);
p->Send_uint64(data);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -726,14 +709,14 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendExternalChat(const std::st
if (this->status < STATUS_PRE_ACTIVE) return NETWORK_RECV_STATUS_OKAY;
- Packet *p = new Packet(PACKET_SERVER_EXTERNAL_CHAT);
+ auto p = std::make_unique(PACKET_SERVER_EXTERNAL_CHAT);
p->Send_string(source);
p->Send_uint16(colour);
p->Send_string(user);
p->Send_string(msg);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -746,12 +729,12 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendErrorQuit(ClientID client_
{
Debug(net, 9, "client[{}] SendErrorQuit(): client_id={}, errorno={}", this->client_id, client_id, errorno);
- Packet *p = new Packet(PACKET_SERVER_ERROR_QUIT);
+ auto p = std::make_unique(PACKET_SERVER_ERROR_QUIT);
p->Send_uint32(client_id);
p->Send_uint8 (errorno);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -763,11 +746,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendQuit(ClientID client_id)
{
Debug(net, 9, "client[{}] SendQuit(): client_id={}", this->client_id, client_id);
- Packet *p = new Packet(PACKET_SERVER_QUIT);
+ auto p = std::make_unique(PACKET_SERVER_QUIT);
p->Send_uint32(client_id);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -776,8 +759,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendShutdown()
{
Debug(net, 9, "client[{}] SendShutdown()", this->client_id);
- Packet *p = new Packet(PACKET_SERVER_SHUTDOWN);
- this->SendPacket(p);
+ auto p = std::make_unique(PACKET_SERVER_SHUTDOWN);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -786,8 +769,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNewGame()
{
Debug(net, 9, "client[{}] SendNewGame()", this->client_id);
- Packet *p = new Packet(PACKET_SERVER_NEWGAME);
- this->SendPacket(p);
+ auto p = std::make_unique(PACKET_SERVER_NEWGAME);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -800,11 +783,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendRConResult(uint16_t colour
{
Debug(net, 9, "client[{}] SendRConResult()", this->client_id);
- Packet *p = new Packet(PACKET_SERVER_RCON);
+ auto p = std::make_unique(PACKET_SERVER_RCON);
p->Send_uint16(colour);
p->Send_string(command);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -817,11 +800,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendMove(ClientID client_id, C
{
Debug(net, 9, "client[{}] SendMove(): client_id={}", this->client_id, client_id);
- Packet *p = new Packet(PACKET_SERVER_MOVE);
+ auto p = std::make_unique(PACKET_SERVER_MOVE);
p->Send_uint32(client_id);
p->Send_uint8(company_id);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -830,11 +813,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendCompanyUpdate()
{
Debug(net, 9, "client[{}] SendCompanyUpdate()", this->client_id);
- Packet *p = new Packet(PACKET_SERVER_COMPANY_UPDATE);
+ auto p = std::make_unique(PACKET_SERVER_COMPANY_UPDATE);
static_assert(sizeof(_network_company_passworded) <= sizeof(uint16_t));
p->Send_uint16(_network_company_passworded);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -843,27 +826,26 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendConfigUpdate()
{
Debug(net, 9, "client[{}] SendConfigUpdate()", this->client_id);
- Packet *p = new Packet(PACKET_SERVER_CONFIG_UPDATE);
+ auto p = std::make_unique(PACKET_SERVER_CONFIG_UPDATE);
p->Send_uint8(_settings_client.network.max_companies);
p->Send_string(_settings_client.network.server_name);
- this->SendPacket(p);
+ this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
/***********
* Receiving functions
- * DEF_SERVER_RECEIVE_COMMAND has parameter: NetworkClientSocket *cs, Packet *p
************/
-NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_INFO(Packet *)
+NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_INFO(Packet &)
{
Debug(net, 9, "client[{}] Receive_CLIENT_GAME_INFO()", this->client_id);
return this->SendGameInfo();
}
-NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_NEWGRFS_CHECKED(Packet *)
+NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_NEWGRFS_CHECKED(Packet &)
{
if (this->status != STATUS_NEWGRFS_CHECK) {
/* Illegal call, return error and ignore the packet */
@@ -872,21 +854,10 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_NEWGRFS_CHECKED
Debug(net, 9, "client[{}] Receive_CLIENT_NEWGRFS_CHECKED()", this->client_id);
- NetworkClientInfo *ci = this->GetInfo();
-
- /* We now want a password from the client else we do not allow them in! */
- if (!_settings_client.network.server_password.empty()) {
- return this->SendNeedGamePassword();
- }
-
- if (Company::IsValidID(ci->client_playas) && !_network_company_states[ci->client_playas].password.empty()) {
- return this->SendNeedCompanyPassword();
- }
-
- return this->SendWelcome();
+ return this->SendNeedGamePassword();
}
-NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p)
+NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet &p)
{
if (this->status != STATUS_INACTIVE) {
/* Illegal call, return error and ignore the packet */
@@ -898,8 +869,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p)
return this->SendError(NETWORK_ERROR_FULL);
}
- std::string client_revision = p->Recv_string(NETWORK_REVISION_LENGTH);
- uint32_t newgrf_version = p->Recv_uint32();
+ std::string client_revision = p.Recv_string(NETWORK_REVISION_LENGTH);
+ uint32_t newgrf_version = p.Recv_uint32();
Debug(net, 9, "client[{}] Receive_CLIENT_JOIN(): client_revision={}, newgrf_version={}", this->client_id, client_revision, newgrf_version);
@@ -909,8 +880,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p)
return this->SendError(NETWORK_ERROR_WRONG_REVISION);
}
- std::string client_name = p->Recv_string(NETWORK_CLIENT_NAME_LENGTH);
- CompanyID playas = (Owner)p->Recv_uint8();
+ std::string client_name = p.Recv_string(NETWORK_CLIENT_NAME_LENGTH);
+ CompanyID playas = (Owner)p.Recv_uint8();
if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CLIENT_QUIT;
@@ -957,14 +928,14 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p)
this->status = STATUS_NEWGRFS_CHECK;
if (_grfconfig == nullptr) {
- /* Behave as if we received PACKET_CLIENT_NEWGRFS_CHECKED */
- return this->Receive_CLIENT_NEWGRFS_CHECKED(nullptr);
+ /* Continue asking for the game password. */
+ return this->SendNeedGamePassword();
}
return this->SendNewGRFCheck();
}
-NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_PASSWORD(Packet *p)
+NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_PASSWORD(Packet &p)
{
if (this->status != STATUS_AUTH_GAME) {
return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
@@ -972,7 +943,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_PASSWORD(P
Debug(net, 9, "client[{}] Receive_CLIENT_GAME_PASSWORD()", this->client_id);
- std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH);
+ std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH);
/* Check game password. Allow joining if we cleared the password meanwhile */
if (!_settings_client.network.server_password.empty() &&
@@ -981,16 +952,10 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_PASSWORD(P
return this->SendError(NETWORK_ERROR_WRONG_PASSWORD);
}
- const NetworkClientInfo *ci = this->GetInfo();
- if (Company::IsValidID(ci->client_playas) && !_network_company_states[ci->client_playas].password.empty()) {
- return this->SendNeedCompanyPassword();
- }
-
- /* Valid password, allow user */
- return this->SendWelcome();
+ return this->SendNeedCompanyPassword();
}
-NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMPANY_PASSWORD(Packet *p)
+NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMPANY_PASSWORD(Packet &p)
{
if (this->status != STATUS_AUTH_COMPANY) {
return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
@@ -998,7 +963,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMPANY_PASSWOR
Debug(net, 9, "client[{}] Receive_CLIENT_COMPANY_PASSWORD()", this->client_id);
- std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH);
+ std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH);
/* Check company password. Allow joining if we cleared the password meanwhile.
* Also, check the company is still valid - client could be moved to spectators
@@ -1013,7 +978,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMPANY_PASSWOR
return this->SendWelcome();
}
-NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GETMAP(Packet *)
+NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GETMAP(Packet &)
{
/* The client was never joined.. so this is impossible, right?
* Ignore the packet, give the client a warning, and close the connection */
@@ -1037,7 +1002,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GETMAP(Packet *
return this->SendMap();
}
-NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MAP_OK(Packet *)
+NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MAP_OK(Packet &)
{
/* Client has the map, now start syncing */
if (this->status == STATUS_DONE_MAP && !this->HasClientQuit()) {
@@ -1087,7 +1052,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MAP_OK(Packet *
* The client has done a command and wants us to handle it
* @param p the packet in which the command was sent
*/
-NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet *p)
+NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet &p)
{
/* The client was never joined.. so this is impossible, right?
* Ignore the packet, give the client a warning, and close the connection */
@@ -1095,14 +1060,14 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet
return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
}
- if (this->incoming_queue.Count() >= _settings_client.network.max_commands_in_queue) {
+ if (this->incoming_queue.size() >= _settings_client.network.max_commands_in_queue) {
return this->SendError(NETWORK_ERROR_TOO_MANY_COMMANDS);
}
Debug(net, 9, "client[{}] Receive_CLIENT_COMMAND()", this->client_id);
CommandPacket cp;
- const char *err = this->ReceiveCommand(p, &cp);
+ const char *err = this->ReceiveCommand(p, cp);
if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CLIENT_QUIT;
@@ -1150,15 +1115,15 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet
if (GetCommandFlags(cp.cmd) & CMD_CLIENT_ID) NetworkReplaceCommandClientId(cp, this->client_id);
- this->incoming_queue.Append(&cp);
+ this->incoming_queue.push_back(cp);
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet *p)
+NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet &p)
{
/* This packets means a client noticed an error and is reporting this
* to us. Display the error and report it to the other clients */
- NetworkErrorCode errorno = (NetworkErrorCode)p->Recv_uint8();
+ NetworkErrorCode errorno = (NetworkErrorCode)p.Recv_uint8();
Debug(net, 9, "client[{}] Receive_CLIENT_ERROR(): errorno={}", this->client_id, errorno);
@@ -1185,7 +1150,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet *p
return this->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT);
}
-NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_QUIT(Packet *)
+NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_QUIT(Packet &)
{
/* The client was never joined.. thank the client for the packet, but ignore it */
if (this->status < STATUS_DONE_MAP || this->HasClientQuit()) {
@@ -1209,14 +1174,14 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_QUIT(Packet *)
return this->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT);
}
-NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ACK(Packet *p)
+NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ACK(Packet &p)
{
if (this->status < STATUS_AUTHORIZED) {
/* Illegal call, return error and ignore the packet */
return this->SendError(NETWORK_ERROR_NOT_AUTHORIZED);
}
- uint32_t frame = p->Recv_uint32();
+ uint32_t frame = p.Recv_uint32();
Debug(net, 9, "client[{}] Receive_CLIENT_ACK(): frame={}", this->client_id, frame);
@@ -1235,7 +1200,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ACK(Packet *p)
}
/* Get, and validate the token. */
- uint8_t token = p->Recv_uint8();
+ uint8_t token = p.Recv_uint8();
if (token == this->last_token) {
/* We differentiate between last_token_frame and last_frame so the lag
* test uses the actual lag of the client instead of the lag for getting
@@ -1394,21 +1359,21 @@ void NetworkServerSendExternalChat(const std::string &source, TextColour colour,
NetworkTextMessage(NETWORK_ACTION_EXTERNAL_CHAT, colour, false, user, msg, 0, source);
}
-NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_CHAT(Packet *p)
+NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_CHAT(Packet &p)
{
if (this->status < STATUS_PRE_ACTIVE) {
/* Illegal call, return error and ignore the packet */
return this->SendError(NETWORK_ERROR_NOT_AUTHORIZED);
}
- NetworkAction action = (NetworkAction)p->Recv_uint8();
- DestType desttype = (DestType)p->Recv_uint8();
- int dest = p->Recv_uint32();
+ NetworkAction action = (NetworkAction)p.Recv_uint8();
+ DestType desttype = (DestType)p.Recv_uint8();
+ int dest = p.Recv_uint32();
Debug(net, 9, "client[{}] Receive_CLIENT_CHAT(): action={}, desttype={}, dest={}", this->client_id, action, desttype, dest);
- std::string msg = p->Recv_string(NETWORK_CHAT_LENGTH);
- int64_t data = p->Recv_uint64();
+ std::string msg = p.Recv_string(NETWORK_CHAT_LENGTH);
+ int64_t data = p.Recv_uint64();
NetworkClientInfo *ci = this->GetInfo();
switch (action) {
@@ -1424,7 +1389,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_CHAT(Packet *p)
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_PASSWORD(Packet *p)
+NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_PASSWORD(Packet &p)
{
if (this->status != STATUS_ACTIVE) {
/* Illegal call, return error and ignore the packet */
@@ -1433,14 +1398,14 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_PASSWORD(Pa
Debug(net, 9, "client[{}] Receive_CLIENT_SET_PASSWORD()", this->client_id);
- std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH);
+ std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH);
const NetworkClientInfo *ci = this->GetInfo();
NetworkServerSetCompanyPassword(ci->client_playas, password);
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet *p)
+NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet &p)
{
if (this->status != STATUS_ACTIVE) {
/* Illegal call, return error and ignore the packet */
@@ -1451,7 +1416,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet
NetworkClientInfo *ci;
- std::string client_name = p->Recv_string(NETWORK_CLIENT_NAME_LENGTH);
+ std::string client_name = p.Recv_string(NETWORK_CLIENT_NAME_LENGTH);
ci = this->GetInfo();
if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CLIENT_QUIT;
@@ -1474,7 +1439,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_RCON(Packet *p)
+NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_RCON(Packet &p)
{
if (this->status != STATUS_ACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
@@ -1482,8 +1447,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_RCON(Packet *p)
Debug(net, 9, "client[{}] Receive_CLIENT_RCON()", this->client_id);
- std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH);
- std::string command = p->Recv_string(NETWORK_RCONCOMMAND_LENGTH);
+ std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH);
+ std::string command = p.Recv_string(NETWORK_RCONCOMMAND_LENGTH);
if (_settings_client.network.rcon_password.compare(password) != 0) {
Debug(net, 1, "[rcon] Wrong password from client-id {}", this->client_id);
@@ -1498,11 +1463,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_RCON(Packet *p)
return NETWORK_RECV_STATUS_OKAY;
}
-NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MOVE(Packet *p)
+NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MOVE(Packet &p)
{
if (this->status != STATUS_ACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
- CompanyID company_id = (Owner)p->Recv_uint8();
+ CompanyID company_id = (Owner)p.Recv_uint8();
Debug(net, 9, "client[{}] Receive_CLIENT_MOVE(): company_id={}", this->client_id, company_id);
@@ -1512,7 +1477,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MOVE(Packet *p)
/* Check if we require a password for this company */
if (company_id != COMPANY_SPECTATOR && !_network_company_states[company_id].password.empty()) {
/* we need a password from the client - should be in this packet */
- std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH);
+ std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH);
/* Incorrect password sent, return! */
if (_network_company_states[company_id].password.compare(password) != 0) {
@@ -1736,11 +1701,8 @@ void NetworkServerSetCompanyPassword(CompanyID company_id, const std::string &pa
*/
static void NetworkHandleCommandQueue(NetworkClientSocket *cs)
{
- CommandPacket *cp;
- while ((cp = cs->outgoing_queue.Pop()) != nullptr) {
- cs->SendCommand(cp);
- delete cp;
- }
+ for (auto &cp : cs->outgoing_queue) cs->SendCommand(cp);
+ cs->outgoing_queue.clear();
}
/**
diff --git a/src/network/network_server.h b/src/network/network_server.h
index 171a89233d..bbf9817248 100644
--- a/src/network/network_server.h
+++ b/src/network/network_server.h
@@ -23,22 +23,22 @@ extern NetworkClientSocketPool _networkclientsocket_pool;
/** Class for handling the server side of the game connection. */
class ServerNetworkGameSocketHandler : public NetworkClientSocketPool::PoolItem<&_networkclientsocket_pool>, public NetworkGameSocketHandler, public TCPListenHandler {
protected:
- NetworkRecvStatus Receive_CLIENT_JOIN(Packet *p) override;
- NetworkRecvStatus Receive_CLIENT_GAME_INFO(Packet *p) override;
- NetworkRecvStatus Receive_CLIENT_GAME_PASSWORD(Packet *p) override;
- NetworkRecvStatus Receive_CLIENT_COMPANY_PASSWORD(Packet *p) override;
- NetworkRecvStatus Receive_CLIENT_GETMAP(Packet *p) override;
- NetworkRecvStatus Receive_CLIENT_MAP_OK(Packet *p) override;
- NetworkRecvStatus Receive_CLIENT_ACK(Packet *p) override;
- NetworkRecvStatus Receive_CLIENT_COMMAND(Packet *p) override;
- NetworkRecvStatus Receive_CLIENT_CHAT(Packet *p) override;
- NetworkRecvStatus Receive_CLIENT_SET_PASSWORD(Packet *p) override;
- NetworkRecvStatus Receive_CLIENT_SET_NAME(Packet *p) override;
- NetworkRecvStatus Receive_CLIENT_QUIT(Packet *p) override;
- NetworkRecvStatus Receive_CLIENT_ERROR(Packet *p) override;
- NetworkRecvStatus Receive_CLIENT_RCON(Packet *p) override;
- NetworkRecvStatus Receive_CLIENT_NEWGRFS_CHECKED(Packet *p) override;
- NetworkRecvStatus Receive_CLIENT_MOVE(Packet *p) override;
+ NetworkRecvStatus Receive_CLIENT_JOIN(Packet &p) override;
+ NetworkRecvStatus Receive_CLIENT_GAME_INFO(Packet &p) override;
+ NetworkRecvStatus Receive_CLIENT_GAME_PASSWORD(Packet &p) override;
+ NetworkRecvStatus Receive_CLIENT_COMPANY_PASSWORD(Packet &p) override;
+ NetworkRecvStatus Receive_CLIENT_GETMAP(Packet &p) override;
+ NetworkRecvStatus Receive_CLIENT_MAP_OK(Packet &p) override;
+ NetworkRecvStatus Receive_CLIENT_ACK(Packet &p) override;
+ NetworkRecvStatus Receive_CLIENT_COMMAND(Packet &p) override;
+ NetworkRecvStatus Receive_CLIENT_CHAT(Packet &p) override;
+ NetworkRecvStatus Receive_CLIENT_SET_PASSWORD(Packet &p) override;
+ NetworkRecvStatus Receive_CLIENT_SET_NAME(Packet &p) override;
+ NetworkRecvStatus Receive_CLIENT_QUIT(Packet &p) override;
+ NetworkRecvStatus Receive_CLIENT_ERROR(Packet &p) override;
+ NetworkRecvStatus Receive_CLIENT_RCON(Packet &p) override;
+ NetworkRecvStatus Receive_CLIENT_NEWGRFS_CHECKED(Packet &p) override;
+ NetworkRecvStatus Receive_CLIENT_MOVE(Packet &p) override;
NetworkRecvStatus SendGameInfo();
NetworkRecvStatus SendNewGRFCheck();
@@ -66,16 +66,16 @@ public:
byte last_token; ///< The last random token we did send to verify the client is listening
uint32_t last_token_frame; ///< The last frame we received the right token
ClientStatus status; ///< Status of this client
- CommandQueue outgoing_queue; ///< The command-queue awaiting delivery
+ CommandQueue outgoing_queue; ///< The command-queue awaiting delivery; conceptually more a bucket to gather commands in, after which the whole bucket is sent to the client.
size_t receive_limit; ///< Amount of bytes that we can receive at this moment
- struct PacketWriter *savegame; ///< Writer used to write the savegame.
+ std::shared_ptr savegame; ///< Writer used to write the savegame.
NetworkAddress client_address; ///< IP-address of the client (so they can be banned)
ServerNetworkGameSocketHandler(SOCKET s);
~ServerNetworkGameSocketHandler();
- Packet *ReceivePacket() override;
+ std::unique_ptr ReceivePacket() override;
NetworkRecvStatus CloseConnection(NetworkRecvStatus status) override;
std::string GetClientName() const;
@@ -97,7 +97,7 @@ public:
NetworkRecvStatus SendJoin(ClientID client_id);
NetworkRecvStatus SendFrame();
NetworkRecvStatus SendSync();
- NetworkRecvStatus SendCommand(const CommandPacket *cp);
+ NetworkRecvStatus SendCommand(const CommandPacket &cp);
NetworkRecvStatus SendCompanyUpdate();
NetworkRecvStatus SendConfigUpdate();
diff --git a/src/network/network_stun.cpp b/src/network/network_stun.cpp
index dd394c669b..c606ff0c83 100644
--- a/src/network/network_stun.cpp
+++ b/src/network/network_stun.cpp
@@ -92,12 +92,12 @@ std::unique_ptr ClientNetworkStunSocketHandler::
stun_handler->Connect(token, family);
- Packet *p = new Packet(PACKET_STUN_SERCLI_STUN);
+ auto p = std::make_unique(PACKET_STUN_SERCLI_STUN);
p->Send_uint8(NETWORK_COORDINATOR_VERSION);
p->Send_string(token);
p->Send_uint8(family);
- stun_handler->SendPacket(p);
+ stun_handler->SendPacket(std::move(p));
return stun_handler;
}
diff --git a/src/network/network_turn.cpp b/src/network/network_turn.cpp
index 7a9bd43fc5..c3dfa75a0b 100644
--- a/src/network/network_turn.cpp
+++ b/src/network/network_turn.cpp
@@ -49,7 +49,7 @@ public:
}
};
-bool ClientNetworkTurnSocketHandler::Receive_TURN_ERROR(Packet *)
+bool ClientNetworkTurnSocketHandler::Receive_TURN_ERROR(Packet &)
{
Debug(net, 9, "Receive_TURN_ERROR()");
@@ -58,11 +58,11 @@ bool ClientNetworkTurnSocketHandler::Receive_TURN_ERROR(Packet *)
return false;
}
-bool ClientNetworkTurnSocketHandler::Receive_TURN_CONNECTED(Packet *p)
+bool ClientNetworkTurnSocketHandler::Receive_TURN_CONNECTED(Packet &p)
{
Debug(net, 9, "Receive_TURN_CONNECTED()");
- std::string hostname = p->Recv_string(NETWORK_HOSTNAME_LENGTH);
+ std::string hostname = p.Recv_string(NETWORK_HOSTNAME_LENGTH);
/* Act like we no longer have a socket, as we are handing it over to the
* game handler. */
@@ -100,11 +100,11 @@ void ClientNetworkTurnSocketHandler::Connect()
{
auto turn_handler = std::make_unique(token, tracking_number, connection_string);
- Packet *p = new Packet(PACKET_TURN_SERCLI_CONNECT);
+ auto p = std::make_unique(PACKET_TURN_SERCLI_CONNECT);
p->Send_uint8(NETWORK_COORDINATOR_VERSION);
p->Send_string(ticket);
- turn_handler->SendPacket(p);
+ turn_handler->SendPacket(std::move(p));
return turn_handler;
}
diff --git a/src/network/network_turn.h b/src/network/network_turn.h
index 0b0ca8a851..961a961788 100644
--- a/src/network/network_turn.h
+++ b/src/network/network_turn.h
@@ -20,8 +20,8 @@ private:
std::string connection_string; ///< The connection string of the TURN server we are connecting to.
protected:
- bool Receive_TURN_ERROR(Packet *p) override;
- bool Receive_TURN_CONNECTED(Packet *p) override;
+ bool Receive_TURN_ERROR(Packet &p) override;
+ bool Receive_TURN_CONNECTED(Packet &p) override;
public:
std::shared_ptr connecter{}; ///< Connecter instance.
diff --git a/src/network/network_udp.cpp b/src/network/network_udp.cpp
index 4d5ff526ea..478e804eaf 100644
--- a/src/network/network_udp.cpp
+++ b/src/network/network_udp.cpp
@@ -63,7 +63,7 @@ static UDPSocket _udp_server("Server"); ///< udp server socket
/** Helper class for handling all server side communication. */
class ServerNetworkUDPSocketHandler : public NetworkUDPSocketHandler {
protected:
- void Receive_CLIENT_FIND_SERVER(Packet *p, NetworkAddress *client_addr) override;
+ void Receive_CLIENT_FIND_SERVER(Packet &p, NetworkAddress &client_addr) override;
public:
/**
* Create the socket.
@@ -73,12 +73,12 @@ public:
virtual ~ServerNetworkUDPSocketHandler() = default;
};
-void ServerNetworkUDPSocketHandler::Receive_CLIENT_FIND_SERVER(Packet *, NetworkAddress *client_addr)
+void ServerNetworkUDPSocketHandler::Receive_CLIENT_FIND_SERVER(Packet &, NetworkAddress &client_addr)
{
Packet packet(PACKET_UDP_SERVER_RESPONSE);
- this->SendPacket(&packet, client_addr);
+ this->SendPacket(packet, client_addr);
- Debug(net, 7, "Queried from {}", client_addr->GetHostname());
+ Debug(net, 7, "Queried from {}", client_addr.GetHostname());
}
///*** Communication with servers (we are client) ***/
@@ -86,16 +86,16 @@ void ServerNetworkUDPSocketHandler::Receive_CLIENT_FIND_SERVER(Packet *, Network
/** Helper class for handling all client side communication. */
class ClientNetworkUDPSocketHandler : public NetworkUDPSocketHandler {
protected:
- void Receive_SERVER_RESPONSE(Packet *p, NetworkAddress *client_addr) override;
+ void Receive_SERVER_RESPONSE(Packet &p, NetworkAddress &client_addr) override;
public:
virtual ~ClientNetworkUDPSocketHandler() = default;
};
-void ClientNetworkUDPSocketHandler::Receive_SERVER_RESPONSE(Packet *, NetworkAddress *client_addr)
+void ClientNetworkUDPSocketHandler::Receive_SERVER_RESPONSE(Packet &, NetworkAddress &client_addr)
{
- Debug(net, 3, "Server response from {}", client_addr->GetAddressAsString());
+ Debug(net, 3, "Server response from {}", client_addr.GetAddressAsString());
- NetworkAddServer(client_addr->GetAddressAsString(false), false, true);
+ NetworkAddServer(client_addr.GetAddressAsString(false), false, true);
}
/** Broadcast to all ips */
@@ -105,7 +105,7 @@ static void NetworkUDPBroadCast(NetworkUDPSocketHandler *socket)
Debug(net, 5, "Broadcasting to {}", addr.GetHostname());
Packet p(PACKET_UDP_CLIENT_FIND_SERVER);
- socket->SendPacket(&p, &addr, true, true);
+ socket->SendPacket(p, addr, true, true);
}
}
diff --git a/src/newgrf.cpp b/src/newgrf.cpp
index 22455baf61..ffc16c067a 100644
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -1151,6 +1151,7 @@ static ChangeInfoResult RailVehicleChangeInfo(uint engine, int numinfo, int prop
ei->cargo_type = INVALID_CARGO;
GrfMsg(2, "RailVehicleChangeInfo: Invalid cargo type {}, using first refittable", ctype);
}
+ ei->cargo_label = CT_INVALID;
break;
}
@@ -1412,6 +1413,7 @@ static ChangeInfoResult RoadVehicleChangeInfo(uint engine, int numinfo, int prop
ei->cargo_type = INVALID_CARGO;
GrfMsg(2, "RailVehicleChangeInfo: Invalid cargo type {}, using first refittable", ctype);
}
+ ei->cargo_label = CT_INVALID;
break;
}
@@ -1607,6 +1609,7 @@ static ChangeInfoResult ShipVehicleChangeInfo(uint engine, int numinfo, int prop
ei->cargo_type = INVALID_CARGO;
GrfMsg(2, "ShipVehicleChangeInfo: Invalid cargo type {}, using first refittable", ctype);
}
+ ei->cargo_label = CT_INVALID;
break;
}
@@ -2426,7 +2429,9 @@ static ChangeInfoResult TownHouseChangeInfo(uint hid, int numinfo, int prop, Byt
* climate. This can cause problems when copying the properties
* of a house that accepts food, where the new house is valid
* in the temperate climate. */
- if (!CargoSpec::Get(housespec->accepts_cargo[2])->IsValid()) {
+ CargoID cid = housespec->accepts_cargo[2];
+ if (!IsValidCargoID(cid)) cid = GetCargoIDByLabel(housespec->accepts_cargo_label[2]);
+ if (!IsValidCargoID(cid)) {
housespec->cargo_acceptance[2] = 0;
}
}
@@ -2462,13 +2467,14 @@ static ChangeInfoResult TownHouseChangeInfo(uint hid, int numinfo, int prop, Byt
/* If value of goods is negative, it means in fact food or, if in toyland, fizzy_drink acceptance.
* Else, we have "standard" 3rd cargo type, goods or candy, for toyland once more */
- CargoID cid = (goods >= 0) ? ((_settings_game.game_creation.landscape == LT_TOYLAND) ? CT_CANDY : CT_GOODS) :
- ((_settings_game.game_creation.landscape == LT_TOYLAND) ? CT_FIZZY_DRINKS : CT_FOOD);
+ CargoID cid = (goods >= 0) ? ((_settings_game.game_creation.landscape == LT_TOYLAND) ? GetCargoIDByLabel(CT_CANDY) : GetCargoIDByLabel(CT_GOODS)) :
+ ((_settings_game.game_creation.landscape == LT_TOYLAND) ? GetCargoIDByLabel(CT_FIZZY_DRINKS) : GetCargoIDByLabel(CT_FOOD));
/* Make sure the cargo type is valid in this climate. */
- if (!CargoSpec::Get(cid)->IsValid()) goods = 0;
+ if (!IsValidCargoID(cid)) goods = 0;
housespec->accepts_cargo[2] = cid;
+ housespec->accepts_cargo_label[2] = CT_INVALID;
housespec->cargo_acceptance[2] = abs(goods); // but we do need positive value here
break;
}
@@ -2636,7 +2642,7 @@ static ChangeInfoResult TownHouseChangeInfo(uint hid, int numinfo, int prop, Byt
* @return ChangeInfoResult.
*/
template
-static ChangeInfoResult LoadTranslationTable(uint gvid, int numinfo, ByteReader *buf, T &translation_table, const char *name)
+static ChangeInfoResult LoadTranslationTable(uint gvid, int numinfo, ByteReader *buf, std::vector &translation_table, const char *name)
{
if (gvid != 0) {
GrfMsg(1, "LoadTranslationTable: {} translation table must start at zero", name);
@@ -2645,8 +2651,7 @@ static ChangeInfoResult LoadTranslationTable(uint gvid, int numinfo, ByteReader
translation_table.clear();
for (int i = 0; i < numinfo; i++) {
- uint32_t item = buf->ReadDWord();
- translation_table.push_back(BSWAP32(item));
+ translation_table.push_back(T(BSWAP32(buf->ReadDWord())));
}
return CIR_SUCCESS;
@@ -2991,6 +2996,7 @@ static ChangeInfoResult CargoChangeInfo(uint cid, int numinfo, int prop, ByteRea
} else {
ClrBit(_cargo_mask, cid + i);
}
+ BuildCargoLabelMap();
break;
case 0x09: // String ID for cargo type name
@@ -3058,8 +3064,8 @@ static ChangeInfoResult CargoChangeInfo(uint cid, int numinfo, int prop, ByteRea
break;
case 0x17: // Cargo label
- cs->label = buf->ReadDWord();
- cs->label = BSWAP32(cs->label);
+ cs->label = CargoLabel{BSWAP32(buf->ReadDWord())};
+ BuildCargoLabelMap();
break;
case 0x18: { // Town growth substitute type
@@ -3666,12 +3672,14 @@ static ChangeInfoResult IndustriesChangeInfo(uint indid, int numinfo, int prop,
case 0x10: // Production cargo types
for (byte j = 0; j < 2; j++) {
indsp->produced_cargo[j] = GetCargoTranslation(buf->ReadByte(), _cur.grffile);
+ indsp->produced_cargo_label[j] = CT_INVALID;
}
break;
case 0x11: // Acceptance cargo types
for (byte j = 0; j < 3; j++) {
indsp->accepts_cargo[j] = GetCargoTranslation(buf->ReadByte(), _cur.grffile);
+ indsp->accepts_cargo_label[j] = CT_INVALID;
}
buf->ReadByte(); // Unnused, eat it up
break;
@@ -5564,18 +5572,18 @@ static CargoID TranslateCargo(uint8_t feature, uint8_t ctype)
/* Look up the cargo label from the translation table */
CargoLabel cl = _cur.grffile->cargo_list[ctype];
- if (cl == 0) {
+ if (cl == CT_INVALID) {
GrfMsg(5, "TranslateCargo: Cargo type {} not available in this climate, skipping.", ctype);
return INVALID_CARGO;
}
CargoID cid = GetCargoIDByLabel(cl);
if (!IsValidCargoID(cid)) {
- GrfMsg(5, "TranslateCargo: Cargo '{:c}{:c}{:c}{:c}' unsupported, skipping.", GB(cl, 24, 8), GB(cl, 16, 8), GB(cl, 8, 8), GB(cl, 0, 8));
+ GrfMsg(5, "TranslateCargo: Cargo '{:c}{:c}{:c}{:c}' unsupported, skipping.", GB(cl.base(), 24, 8), GB(cl.base(), 16, 8), GB(cl.base(), 8, 8), GB(cl.base(), 0, 8));
return INVALID_CARGO;
}
- GrfMsg(6, "TranslateCargo: Cargo '{:c}{:c}{:c}{:c}' mapped to cargo type {}.", GB(cl, 24, 8), GB(cl, 16, 8), GB(cl, 8, 8), GB(cl, 0, 8), cid);
+ GrfMsg(6, "TranslateCargo: Cargo '{:c}{:c}{:c}{:c}' mapped to cargo type {}.", GB(cl.base(), 24, 8), GB(cl.base(), 16, 8), GB(cl.base(), 8, 8), GB(cl.base(), 0, 8), cid);
return cid;
}
@@ -6864,9 +6872,9 @@ static void SkipIf(ByteReader *buf)
if (condtype >= 0x0B) {
/* Tests that ignore 'param' */
switch (condtype) {
- case 0x0B: result = !IsValidCargoID(GetCargoIDByLabel(BSWAP32(cond_val)));
+ case 0x0B: result = !IsValidCargoID(GetCargoIDByLabel(CargoLabel(BSWAP32(cond_val))));
break;
- case 0x0C: result = IsValidCargoID(GetCargoIDByLabel(BSWAP32(cond_val)));
+ case 0x0C: result = IsValidCargoID(GetCargoIDByLabel(CargoLabel(BSWAP32(cond_val))));
break;
case 0x0D: result = GetRailTypeByLabel(BSWAP32(cond_val)) == INVALID_RAILTYPE;
break;
@@ -8954,6 +8962,38 @@ GRFFile::~GRFFile()
delete[] this->language_map;
}
+/**
+ * Find first cargo label that exists and is active from a list of cargo labels.
+ * @param labels List of cargo labels.
+ * @returns First cargo label in list that exists, or CT_INVALID if none exist.
+ */
+static CargoLabel GetActiveCargoLabel(const std::initializer_list &labels)
+{
+ for (const CargoLabel &label : labels) {
+ CargoID cid = GetCargoIDByLabel(label);
+ if (cid != INVALID_CARGO) return label;
+ }
+ return CT_INVALID;
+}
+
+/**
+ * Get active cargo label from either a cargo label or climate-dependent mixed cargo type.
+ * @param label Cargo label or climate-dependent mixed cargo type.
+ * @returns Active cargo label, or CT_INVALID if cargo label is not active.
+ */
+static CargoLabel GetActiveCargoLabel(const std::variant &label)
+{
+ if (std::holds_alternative(label)) return std::get(label);
+ if (std::holds_alternative(label)) {
+ switch (std::get(label)) {
+ case MCT_LIVESTOCK_FRUIT: return GetActiveCargoLabel({CT_LIVESTOCK, CT_FRUIT});
+ case MCT_GRAIN_WHEAT_MAIZE: return GetActiveCargoLabel({CT_GRAIN, CT_WHEAT, CT_MAIZE});
+ case MCT_VALUABLES_GOLD_DIAMONDS: return GetActiveCargoLabel({CT_VALUABLES, CT_GOLD, CT_DIAMONDS});
+ default: NOT_REACHED();
+ }
+ }
+ NOT_REACHED();
+}
/**
* Precalculate refit masks from cargo classes for all vehicles.
@@ -8961,9 +9001,8 @@ GRFFile::~GRFFile()
static void CalculateRefitMasks()
{
CargoTypes original_known_cargoes = 0;
- for (int ct = 0; ct != NUM_ORIGINAL_CARGO; ++ct) {
- CargoID cid = GetDefaultCargoID(_settings_game.game_creation.landscape, static_cast(ct));
- if (IsValidCargoID(cid)) SetBit(original_known_cargoes, cid);
+ for (CargoID cid = 0; cid != NUM_CARGO; ++cid) {
+ if (IsDefaultCargo(cid)) SetBit(original_known_cargoes, cid);
}
for (Engine *e : Engine::Iterate()) {
@@ -8971,6 +9010,11 @@ static void CalculateRefitMasks()
EngineInfo *ei = &e->info;
bool only_defaultcargo; ///< Set if the vehicle shall carry only the default cargo
+ /* Apply default cargo translation map if cargo type hasn't been set, either explicitly or by aircraft cargo handling. */
+ if (!IsValidCargoID(e->info.cargo_type)) {
+ e->info.cargo_type = GetCargoIDByLabel(GetActiveCargoLabel(e->info.cargo_label));
+ }
+
/* If the NewGRF did not set any cargo properties, we apply default values. */
if (_gted[engine].defaultcargo_grf == nullptr) {
/* If the vehicle has any capacity, apply the default refit masks */
@@ -8981,7 +9025,7 @@ static void CalculateRefitMasks()
static constexpr byte Y = 1 << LT_TOYLAND;
static const struct DefaultRefitMasks {
byte climate;
- CargoType cargo_type;
+ CargoLabel cargo_label;
CargoTypes cargo_allowed;
CargoTypes cargo_disallowed;
} _default_refit_masks[] = {
@@ -9005,13 +9049,14 @@ static void CalculateRefitMasks()
_gted[engine].cargo_allowed = CC_PASSENGERS | CC_MAIL | CC_ARMOURED | CC_EXPRESS;
_gted[engine].cargo_disallowed = CC_LIQUID;
} else if (e->type == VEH_SHIP) {
- switch (ei->cargo_type) {
- case CT_PASSENGERS:
+ CargoLabel label = GetActiveCargoLabel(ei->cargo_label);
+ switch (label.base()) {
+ case CT_PASSENGERS.base():
/* Ferries */
_gted[engine].cargo_allowed = CC_PASSENGERS;
_gted[engine].cargo_disallowed = 0;
break;
- case CT_OIL:
+ case CT_OIL.base():
/* Tankers */
_gted[engine].cargo_allowed = CC_LIQUID;
_gted[engine].cargo_disallowed = 0;
@@ -9036,9 +9081,10 @@ static void CalculateRefitMasks()
_gted[engine].cargo_disallowed = 0;
} else {
/* Train wagons and road vehicles are classified by their default cargo type */
+ CargoLabel label = GetActiveCargoLabel(ei->cargo_label);
for (const auto &drm : _default_refit_masks) {
if (!HasBit(drm.climate, _settings_game.game_creation.landscape)) continue;
- if (drm.cargo_type != ei->cargo_type) continue;
+ if (drm.cargo_label != label) continue;
_gted[engine].cargo_allowed = drm.cargo_allowed;
_gted[engine].cargo_disallowed = drm.cargo_disallowed;
@@ -9051,8 +9097,6 @@ static void CalculateRefitMasks()
}
_gted[engine].UpdateRefittability(_gted[engine].cargo_allowed != 0);
- /* Translate cargo_type using the original climate-specific cargo table. */
- ei->cargo_type = GetDefaultCargoID(_settings_game.game_creation.landscape, static_cast(ei->cargo_type));
if (IsValidCargoID(ei->cargo_type)) ClrBit(_gted[engine].ctt_exclude_mask, ei->cargo_type);
}
@@ -9206,10 +9250,10 @@ void FinaliseCargoArray()
for (CargoSpec &cs : CargoSpec::array) {
if (cs.town_production_effect == INVALID_TPE) {
/* Set default town production effect by cargo label. */
- switch (cs.label) {
- case 'PASS': cs.town_production_effect = TPE_PASSENGERS; break;
- case 'MAIL': cs.town_production_effect = TPE_MAIL; break;
- default: cs.town_production_effect = TPE_NONE; break;
+ switch (cs.label.base()) {
+ case CT_PASSENGERS.base(): cs.town_production_effect = TPE_PASSENGERS; break;
+ case CT_MAIL.base(): cs.town_production_effect = TPE_MAIL; break;
+ default: cs.town_production_effect = TPE_NONE; break;
}
}
if (!cs.IsValid()) {
@@ -9352,6 +9396,13 @@ static void FinaliseHouseArray()
* this one in the pool is properly handled as 1x1 house. */
hs->building_flags = TILE_NO_FLAG;
}
+
+ /* Apply default cargo translation map for unset cargo slots */
+ for (uint i = 0; i < lengthof(hs->accepts_cargo); ++i) {
+ if (!IsValidCargoID(hs->accepts_cargo[i])) hs->accepts_cargo[i] = GetCargoIDByLabel(hs->accepts_cargo_label[i]);
+ /* Disable acceptance if cargo type is invalid. */
+ if (!IsValidCargoID(hs->accepts_cargo[i])) hs->cargo_acceptance[i] = 0;
+ }
}
HouseZones climate_mask = (HouseZones)(1 << (_settings_game.game_creation.landscape + 12));
@@ -9426,6 +9477,21 @@ static void FinaliseIndustriesArray()
if (!indsp.enabled) {
indsp.name = STR_NEWGRF_INVALID_INDUSTRYTYPE;
}
+
+ /* Apply default cargo translation map for unset cargo slots */
+ for (uint i = 0; i < lengthof(indsp.produced_cargo); ++i) {
+ if (!IsValidCargoID(indsp.produced_cargo[i])) indsp.produced_cargo[i] = GetCargoIDByLabel(GetActiveCargoLabel(indsp.produced_cargo_label[i]));
+ }
+ for (uint i = 0; i < lengthof(indsp.accepts_cargo); ++i) {
+ if (!IsValidCargoID(indsp.accepts_cargo[i])) indsp.accepts_cargo[i] = GetCargoIDByLabel(GetActiveCargoLabel(indsp.accepts_cargo_label[i]));
+ }
+ }
+
+ for (auto &indtsp : _industry_tile_specs) {
+ /* Apply default cargo translation map for unset cargo slots */
+ for (uint i = 0; i < lengthof(indtsp.accepts_cargo); ++i) {
+ if (!IsValidCargoID(indtsp.accepts_cargo[i])) indtsp.accepts_cargo[i] = GetCargoIDByLabel(GetActiveCargoLabel(indtsp.accepts_cargo_label[i]));
+ }
}
}
diff --git a/src/newgrf_cargo.cpp b/src/newgrf_cargo.cpp
index ffd1c44269..97eaebec87 100644
--- a/src/newgrf_cargo.cpp
+++ b/src/newgrf_cargo.cpp
@@ -30,7 +30,7 @@ GrfSpecFeature CargoResolverObject::GetFeature() const
uint32_t CargoResolverObject::GetDebugID() const
{
- return this->cargospec->label;
+ return this->cargospec->label.base();
}
/**
diff --git a/src/newgrf_town.cpp b/src/newgrf_town.cpp
index 57a68941a8..0bd4924e34 100644
--- a/src/newgrf_town.cpp
+++ b/src/newgrf_town.cpp
@@ -17,6 +17,7 @@
/* virtual */ uint32_t TownScopeResolver::GetVariable(byte variable, [[maybe_unused]] uint32_t parameter, bool *available) const
{
+ CargoID cid;
switch (variable) {
/* Larger towns */
case 0x40:
@@ -81,24 +82,24 @@
case 0xB2: return this->t->statues;
case 0xB6: return ClampTo(this->t->cache.num_houses);
case 0xB9: return this->t->growth_rate / Ticks::TOWN_GROWTH_TICKS;
- case 0xBA: return ClampTo(this->t->supplied[CT_PASSENGERS].new_max);
- case 0xBB: return GB(ClampTo(this->t->supplied[CT_PASSENGERS].new_max), 8, 8);
- case 0xBC: return ClampTo(this->t->supplied[CT_MAIL].new_max);
- case 0xBD: return GB(ClampTo(this->t->supplied[CT_MAIL].new_max), 8, 8);
- case 0xBE: return ClampTo(this->t->supplied[CT_PASSENGERS].new_act);
- case 0xBF: return GB(ClampTo(this->t->supplied[CT_PASSENGERS].new_act), 8, 8);
- case 0xC0: return ClampTo(this->t->supplied[CT_MAIL].new_act);
- case 0xC1: return GB(ClampTo(this->t->supplied[CT_MAIL].new_act), 8, 8);
- case 0xC2: return ClampTo(this->t->supplied[CT_PASSENGERS].old_max);
- case 0xC3: return GB(ClampTo(this->t->supplied[CT_PASSENGERS].old_max), 8, 8);
- case 0xC4: return ClampTo(this->t->supplied[CT_MAIL].old_max);
- case 0xC5: return GB(ClampTo(this->t->supplied[CT_MAIL].old_max), 8, 8);
- case 0xC6: return ClampTo(this->t->supplied[CT_PASSENGERS].old_act);
- case 0xC7: return GB(ClampTo(this->t->supplied[CT_PASSENGERS].old_act), 8, 8);
- case 0xC8: return ClampTo(this->t->supplied[CT_MAIL].old_act);
- case 0xC9: return GB(ClampTo(this->t->supplied[CT_MAIL].old_act), 8, 8);
- case 0xCA: return this->t->GetPercentTransported(CT_PASSENGERS);
- case 0xCB: return this->t->GetPercentTransported(CT_MAIL);
+ case 0xBA: cid = GetCargoIDByLabel(CT_PASSENGERS); return IsValidCargoID(cid) ? ClampTo(this->t->supplied[cid].new_max) : 0;
+ case 0xBB: cid = GetCargoIDByLabel(CT_PASSENGERS); return IsValidCargoID(cid) ? GB(ClampTo(this->t->supplied[cid].new_max), 8, 8) : 0;
+ case 0xBC: cid = GetCargoIDByLabel(CT_MAIL); return IsValidCargoID(cid) ? ClampTo(this->t->supplied[cid].new_max) : 0;
+ case 0xBD: cid = GetCargoIDByLabel(CT_MAIL); return IsValidCargoID(cid) ? GB(ClampTo(this->t->supplied[cid].new_max), 8, 8) : 0;
+ case 0xBE: cid = GetCargoIDByLabel(CT_PASSENGERS); return IsValidCargoID(cid) ? ClampTo(this->t->supplied[cid].new_act) : 0;
+ case 0xBF: cid = GetCargoIDByLabel(CT_PASSENGERS); return IsValidCargoID(cid) ? GB(ClampTo(this->t->supplied[cid].new_act), 8, 8) : 0;
+ case 0xC0: cid = GetCargoIDByLabel(CT_MAIL); return IsValidCargoID(cid) ? ClampTo(this->t->supplied[cid].new_act) : 0;
+ case 0xC1: cid = GetCargoIDByLabel(CT_MAIL); return IsValidCargoID(cid) ? GB(ClampTo(this->t->supplied[cid].new_act), 8, 8) : 0;
+ case 0xC2: cid = GetCargoIDByLabel(CT_PASSENGERS); return IsValidCargoID(cid) ? ClampTo(this->t->supplied[cid].old_max) : 0;
+ case 0xC3: cid = GetCargoIDByLabel(CT_PASSENGERS); return IsValidCargoID(cid) ? GB(ClampTo(this->t->supplied[cid].old_max), 8, 8) : 0;
+ case 0xC4: cid = GetCargoIDByLabel(CT_MAIL); return IsValidCargoID(cid) ? ClampTo(this->t->supplied[cid].old_max) : 0;
+ case 0xC5: cid = GetCargoIDByLabel(CT_MAIL); return IsValidCargoID(cid) ? GB(ClampTo(this->t->supplied[cid].old_max), 8, 8) : 0;
+ case 0xC6: cid = GetCargoIDByLabel(CT_PASSENGERS); return IsValidCargoID(cid) ? ClampTo(this->t->supplied[cid].old_act) : 0;
+ case 0xC7: cid = GetCargoIDByLabel(CT_PASSENGERS); return IsValidCargoID(cid) ? GB(ClampTo(this->t->supplied[cid].old_act), 8, 8) : 0;
+ case 0xC8: cid = GetCargoIDByLabel(CT_MAIL); return IsValidCargoID(cid) ? ClampTo(this->t->supplied[cid].old_act) : 0;
+ case 0xC9: cid = GetCargoIDByLabel(CT_MAIL); return IsValidCargoID(cid) ? GB(ClampTo(this->t->supplied[cid].old_act), 8, 8) : 0;
+ case 0xCA: return this->t->GetPercentTransported(GetCargoIDByLabel(CT_PASSENGERS));
+ case 0xCB: return this->t->GetPercentTransported(GetCargoIDByLabel(CT_MAIL));
case 0xCC: return this->t->received[TAE_FOOD].new_act;
case 0xCD: return GB(this->t->received[TAE_FOOD].new_act, 8, 8);
case 0xCE: return this->t->received[TAE_WATER].new_act;
diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp
index ab4907eb1f..3e2654a853 100644
--- a/src/object_cmd.cpp
+++ b/src/object_cmd.cpp
@@ -630,23 +630,31 @@ static void AddAcceptedCargo_Object(TileIndex tile, CargoArray &acceptance, Carg
/* Top town building generates 10, so to make HQ interesting, the top
* type makes 20. */
- acceptance[CT_PASSENGERS] += std::max(1U, level);
- SetBit(*always_accepted, CT_PASSENGERS);
+ CargoID pass = GetCargoIDByLabel(CT_PASSENGERS);
+ if (IsValidCargoID(pass)) {
+ acceptance[pass] += std::max(1U, level);
+ SetBit(*always_accepted, pass);
+ }
/* Top town building generates 4, HQ can make up to 8. The
* proportion passengers:mail is different because such a huge
* commercial building generates unusually high amount of mail
* correspondence per physical visitor. */
- acceptance[CT_MAIL] += std::max(1U, level / 2);
- SetBit(*always_accepted, CT_MAIL);
+ CargoID mail = GetCargoIDByLabel(CT_MAIL);
+ if (IsValidCargoID(mail)) {
+ acceptance[mail] += std::max(1U, level / 2);
+ SetBit(*always_accepted, mail);
+ }
}
static void AddProducedCargo_Object(TileIndex tile, CargoArray &produced)
{
if (!IsObjectType(tile, OBJECT_HQ)) return;
- produced[CT_PASSENGERS]++;
- produced[CT_MAIL]++;
+ CargoID pass = GetCargoIDByLabel(CT_PASSENGERS);
+ if (IsValidCargoID(pass)) produced[pass]++;
+ CargoID mail = GetCargoIDByLabel(CT_MAIL);
+ if (IsValidCargoID(mail)) produced[mail]++;
}
@@ -686,7 +694,8 @@ static void TileLoop_Object(TileIndex tile)
uint r = Random();
/* Top town buildings generate 250, so the top HQ type makes 256. */
- if (GB(r, 0, 8) < (256 / 4 / (6 - level))) {
+ CargoID pass = GetCargoIDByLabel(CT_PASSENGERS);
+ if (IsValidCargoID(pass) && GB(r, 0, 8) < (256 / 4 / (6 - level))) {
uint amt = GB(r, 0, 8) / 8 / 4 + 1;
/* Production is halved during recessions. */
@@ -695,13 +704,14 @@ static void TileLoop_Object(TileIndex tile)
/* Scale by cargo scale setting. */
amt = ScaleByCargoScale(amt, true);
- MoveGoodsToStation(CT_PASSENGERS, amt, SourceType::Headquarters, GetTileOwner(tile), stations.GetStations());
+ MoveGoodsToStation(pass, amt, SourceType::Headquarters, GetTileOwner(tile), stations.GetStations());
}
/* Top town building generates 90, HQ can make up to 196. The
* proportion passengers:mail is about the same as in the acceptance
* equations. */
- if (GB(r, 8, 8) < (196 / 4 / (6 - level))) {
+ CargoID mail = GetCargoIDByLabel(CT_MAIL);
+ if (IsValidCargoID(mail) && GB(r, 8, 8) < (196 / 4 / (6 - level))) {
uint amt = GB(r, 8, 8) / 8 / 4 + 1;
/* Production is halved during recessions. */
@@ -710,7 +720,7 @@ static void TileLoop_Object(TileIndex tile)
/* Scale by cargo scale setting. */
amt = ScaleByCargoScale(amt, true);
- MoveGoodsToStation(CT_MAIL, amt, SourceType::Headquarters, GetTileOwner(tile), stations.GetStations());
+ MoveGoodsToStation(mail, amt, SourceType::Headquarters, GetTileOwner(tile), stations.GetStations());
}
}
diff --git a/src/openttd.cpp b/src/openttd.cpp
index 3af31509e1..31db6b0d60 100644
--- a/src/openttd.cpp
+++ b/src/openttd.cpp
@@ -966,7 +966,7 @@ static void MakeNewEditorWorld()
* @param subdir default directory to look for filename, set to 0 if not needed
* @param lf Load filter to use, if nullptr: use filename + subdir.
*/
-bool SafeLoad(const std::string &filename, SaveLoadOperation fop, DetailedFileType dft, GameMode newgm, Subdirectory subdir, struct LoadFilter *lf = nullptr)
+bool SafeLoad(const std::string &filename, SaveLoadOperation fop, DetailedFileType dft, GameMode newgm, Subdirectory subdir, std::shared_ptr lf = nullptr)
{
assert(fop == SLO_LOAD);
assert(dft == DFT_GAME_FILE || (lf == nullptr && dft == DFT_OLD_GAME_FILE));
diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp
index 8dd4218930..707fe82318 100644
--- a/src/order_cmd.cpp
+++ b/src/order_cmd.cpp
@@ -1300,9 +1300,6 @@ CommandCost CmdModifyOrder(DoCommandFlag flags, VehicleID veh, VehicleOrderID se
case MOF_DEPOT_ACTION:
if (data >= DA_END) return CMD_ERROR;
- /* The vehicle must always go to the depot (not just if it needs servicing) in order to unbunch there. */
- if ((data == DA_SERVICE) && (order->GetDepotActionType() & ODATFB_UNBUNCH)) return_cmd_error(STR_ERROR_UNBUNCHING_NO_SERVICE_IF_NEEDED);
-
/* Check if we are allowed to add unbunching. We are always allowed to remove it. */
if (data == DA_UNBUNCH) {
/* Only one unbunching order is allowed in a vehicle's orders. If this order already has an unbunching action, no error is needed. */
@@ -1312,8 +1309,6 @@ CommandCost CmdModifyOrder(DoCommandFlag flags, VehicleID veh, VehicleOrderID se
if (o->IsType(OT_CONDITIONAL)) return_cmd_error(STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL);
/* We don't allow unbunching if the vehicle has a full load order. */
if (o->IsType(OT_GOTO_STATION) && o->GetLoadType() & (OLFB_FULL_LOAD | OLF_FULL_LOAD_ANY)) return_cmd_error(STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD);
- /* The vehicle must always go to the depot (not just if it needs servicing) in order to unbunch there. */
- if (o->IsType(OT_GOTO_DEPOT) && o->GetDepotOrderType() & ODTFB_SERVICE) return_cmd_error(STR_ERROR_UNBUNCHING_NO_SERVICE_IF_NEEDED);
}
}
break;
diff --git a/src/order_gui.cpp b/src/order_gui.cpp
index d4ec09cb84..c23472ed74 100644
--- a/src/order_gui.cpp
+++ b/src/order_gui.cpp
@@ -785,6 +785,9 @@ public:
this->CreateNestedTree();
this->vscroll = this->GetScrollbar(WID_O_SCROLLBAR);
+ if (NWidgetCore *nwid = this->GetWidget(WID_O_DEPOT_ACTION); nwid != nullptr) {
+ nwid->tool_tip = STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP + v->type;
+ }
this->FinishInitNested(v->index);
this->selected_order = -1;
@@ -1165,7 +1168,11 @@ public:
case WID_O_DEPOT_ACTION: {
VehicleOrderID sel = this->OrderGetSel();
const Order *order = this->vehicle->GetOrder(sel);
- if (order == nullptr || !order->IsType(OT_GOTO_DEPOT)) break;
+ if (order == nullptr || !order->IsType(OT_GOTO_DEPOT)) {
+ /* We can't leave this param unset or the undefined behavior can cause a crash. */
+ SetDParam(0, STR_EMPTY);
+ break;
+ };
/* Select the current action selected in the dropdown. The flags don't match the dropdown so we can't just use an index. */
if (order->GetDepotOrderType() & ODTFB_SERVICE) {
@@ -1614,7 +1621,7 @@ static constexpr NWidgetPart _nested_orders_train_widgets[] = {
NWidget(NWID_BUTTON_DROPDOWN, COLOUR_GREY, WID_O_UNLOAD), SetMinimalSize(93, 12), SetFill(1, 0),
SetDataTip(STR_ORDER_TOGGLE_UNLOAD, STR_ORDER_TOOLTIP_UNLOAD), SetResize(1, 0),
NWidget(NWID_BUTTON_DROPDOWN, COLOUR_GREY, WID_O_DEPOT_ACTION), SetMinimalSize(93, 12), SetFill(1, 0),
- SetDataTip(STR_JUST_STRING, STR_ORDER_DEPOT_ACTION_TOOLTIP), SetResize(1, 0),
+ SetDataTip(STR_JUST_STRING, STR_NULL), SetResize(1, 0),
EndContainer(),
NWidget(NWID_SELECTION, INVALID_COLOUR, WID_O_SEL_TOP_RIGHT),
NWidget(WWT_PANEL, COLOUR_GREY), SetMinimalSize(93, 12), SetFill(1, 0), SetResize(1, 0), EndContainer(),
@@ -1692,7 +1699,7 @@ static constexpr NWidgetPart _nested_orders_widgets[] = {
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_O_REFIT), SetMinimalSize(186, 12), SetFill(1, 0),
SetDataTip(STR_ORDER_REFIT, STR_ORDER_REFIT_TOOLTIP), SetResize(1, 0),
NWidget(NWID_BUTTON_DROPDOWN, COLOUR_GREY, WID_O_DEPOT_ACTION), SetMinimalSize(124, 12), SetFill(1, 0),
- SetDataTip(STR_JUST_STRING, STR_ORDER_DEPOT_ACTION_TOOLTIP), SetResize(1, 0),
+ SetDataTip(STR_JUST_STRING, STR_NULL), SetResize(1, 0),
EndContainer(),
/* Buttons for setting a condition. */
diff --git a/src/os/macosx/G5_detector.cpp b/src/os/macosx/G5_detector.cpp
deleted file mode 100644
index cf2aeab0d5..0000000000
--- a/src/os/macosx/G5_detector.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * This file is part of OpenTTD.
- * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
- * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see .
- */
-
-/** @file G5_detector.cpp Detection for G5 machines (PowerPC). */
-
-#include
-#include