diff --git a/.dorpsgek.yml b/.dorpsgek.yml
new file mode 100644
index 0000000000..a8b976f5c7
--- /dev/null
+++ b/.dorpsgek.yml
@@ -0,0 +1,13 @@
+notifications:
+ push:
+ irc:
+ - openttd
+ - openttd.notice
+ pull-request:
+ irc:
+ - openttd
+ - openttd.notice
+ issue:
+ irc:
+ - openttd
+ - openttd.notice
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index ca151022ba..2c7ce528c9 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -149,6 +149,16 @@ git push
**IMPORTANT**: By submitting a patch, you agree to the [License](#license).
+### Privacy Notice
+
+We would like to make you aware that contributing to OpenTTD via git will permanently store the name and email address you provide as well as the actual changes and the time and date you made it inside git's version history.
+
+This is inevitable, because it is a main feature of git. If you are concerned about your privacy, we strongly recommend to use "Anonymous <anonymous@openttd.org>" as the git commit author. We might refuse anonymous contributions if malicious intent is suspected.
+
+Please note that the contributor identity, once given, is used for copyright verification and to provide proof should a malicious commit be made. As such, the [EU GDPR](https://www.eugdpr.org/key-changes.html) "right to be forgotten" does not apply, as this is an overriding legitimate interest.
+
+Please also note that your commit is public and as such will potentially be processed by many third-parties. Git's distributed nature makes it impossible to track where exactly your commit, and thus your personal data, will be stored and be processed. If you would not like to accept this risk, please do either commit anonymously or refrain from contributing to the OpenTTD project.
+
### Pull request validation
Continuous integration (CI) tools monitor pull requests, and help us identify build and code quality issues.
@@ -168,3 +178,4 @@ By contributing your code, you agree to license your contribution under the [GPL
### Attribution of this Contributing Guide
This contributing guide is adapted from [Bootstrap](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md) under the [Creative Commons Attribution 3.0 Unported License](https://github.com/twbs/bootstrap/blob/master/docs/LICENSE) terms for Bootstrap documentation.
+The GDPR notice is adapted from [rsyslog](https://github.com/rsyslog/rsyslog/blob/master/CONTRIBUTING.md) under the [GNU General Public License](https://github.com/rsyslog/rsyslog/blob/master/COPYING).
diff --git a/Doxyfile b/Doxyfile
index 58d7f0a89a..251b36be15 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -8,9 +8,14 @@
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
+DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = OpenTTD
+PROJECT_NUMBER =
+PROJECT_BRIEF =
+PROJECT_LOGO =
OUTPUT_DIRECTORY = docs/source/
-CREATE_SUBDIRS = NO
+CREATE_SUBDIRS = YES
+ALLOW_UNICODE_NAMES = NO
OUTPUT_LANGUAGE = English
BRIEF_MEMBER_DESC = YES
REPEAT_BRIEF = YES
@@ -32,22 +37,42 @@ STRIP_FROM_PATH = ./
STRIP_FROM_INC_PATH =
SHORT_NAMES = NO
JAVADOC_AUTOBRIEF = YES
+QT_AUTOBRIEF = NO
MULTILINE_CPP_IS_BRIEF = NO
INHERIT_DOCS = YES
-DISTRIBUTE_GROUP_DOC = NO
+SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 2
ALIASES =
+TCL_SUBST =
OPTIMIZE_OUTPUT_FOR_C = YES
OPTIMIZE_OUTPUT_JAVA = NO
+OPTIMIZE_FOR_FORTRAN = NO
+OPTIMIZE_OUTPUT_VHDL = NO
+EXTENSION_MAPPING =
+MARKDOWN_SUPPORT = YES
+TOC_INCLUDE_HEADINGS = 0
+AUTOLINK_SUPPORT = YES
+BUILTIN_STL_SUPPORT = NO
+CPP_CLI_SUPPORT = NO
+SIP_SUPPORT = NO
+IDL_PROPERTY_SUPPORT = YES
+DISTRIBUTE_GROUP_DOC = NO
+GROUP_NESTED_COMPOUNDS = NO
SUBGROUPING = YES
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS = NO
+TYPEDEF_HIDES_STRUCT = NO
+LOOKUP_CACHE_SIZE = 0
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
EXTRACT_ALL = NO
EXTRACT_PRIVATE = YES
+EXTRACT_PACKAGE = NO
EXTRACT_STATIC = YES
EXTRACT_LOCAL_CLASSES = YES
EXTRACT_LOCAL_METHODS = YES
+EXTRACT_ANON_NSPACES = YES
HIDE_UNDOC_MEMBERS = NO
HIDE_UNDOC_CLASSES = NO
HIDE_FRIEND_COMPOUNDS = NO
@@ -55,11 +80,17 @@ HIDE_IN_BODY_DOCS = NO
INTERNAL_DOCS = NO
CASE_SENSE_NAMES = YES
HIDE_SCOPE_NAMES = NO
+HIDE_COMPOUND_REFERENCE= NO
SHOW_INCLUDE_FILES = YES
+SHOW_GROUPED_MEMB_INC = NO
+FORCE_LOCAL_INCLUDES = NO
INLINE_INFO = YES
SORT_MEMBER_DOCS = YES
SORT_BRIEF_DOCS = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES = NO
SORT_BY_SCOPE_NAME = NO
+STRICT_PROTO_MATCHING = NO
GENERATE_TODOLIST = YES
GENERATE_TESTLIST = YES
GENERATE_BUGLIST = YES
@@ -67,22 +98,27 @@ GENERATE_DEPRECATEDLIST= YES
ENABLED_SECTIONS =
MAX_INITIALIZER_LINES = 30
SHOW_USED_FILES = YES
-SHOW_DIRECTORIES = YES
+SHOW_FILES = YES
+SHOW_NAMESPACES = YES
FILE_VERSION_FILTER =
+LAYOUT_FILE =
+CITE_BIB_FILES =
#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
+# Configuration options related to warning and progress messages
#---------------------------------------------------------------------------
QUIET = NO
WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES
WARN_IF_DOC_ERROR = YES
WARN_NO_PARAMDOC = NO
+WARN_AS_ERROR = NO
WARN_FORMAT = "$file:$line: $text"
WARN_LOGFILE =
#---------------------------------------------------------------------------
-# configuration options related to the input files
+# Configuration options related to the input files
#---------------------------------------------------------------------------
INPUT = ./src/
+INPUT_ENCODING = UTF-8
FILE_PATTERNS = *.c \
*.cc \
*.cxx \
@@ -93,31 +129,38 @@ FILE_PATTERNS = *.c \
RECURSIVE = YES
EXCLUDE =
EXCLUDE_SYMLINKS = NO
-EXCLUDE_PATTERNS = */3rdparty */.svn */script/api
+EXCLUDE_PATTERNS = */3rdparty \
+ */script/api
+EXCLUDE_SYMBOLS =
EXAMPLE_PATH =
EXAMPLE_PATTERNS = *
EXAMPLE_RECURSIVE = NO
-IMAGE_PATH =./docs/
+IMAGE_PATH = ./docs/
INPUT_FILTER =
FILTER_PATTERNS =
FILTER_SOURCE_FILES = NO
+FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE =
#---------------------------------------------------------------------------
-# configuration options related to source browsing
+# Configuration options related to source browsing
#---------------------------------------------------------------------------
SOURCE_BROWSER = YES
INLINE_SOURCES = NO
STRIP_CODE_COMMENTS = YES
REFERENCED_BY_RELATION = YES
REFERENCES_RELATION = YES
+REFERENCES_LINK_SOURCE = YES
+SOURCE_TOOLTIPS = YES
+USE_HTAGS = NO
VERBATIM_HEADERS = YES
#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
+# Configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
ALPHABETICAL_INDEX = NO
COLS_IN_ALPHA_INDEX = 5
IGNORE_PREFIX =
#---------------------------------------------------------------------------
-# configuration options related to the HTML output
+# Configuration options related to the HTML output
#---------------------------------------------------------------------------
GENERATE_HTML = YES
HTML_OUTPUT = html
@@ -125,19 +168,58 @@ HTML_FILE_EXTENSION = .html
HTML_HEADER =
HTML_FOOTER =
HTML_STYLESHEET =
-HTML_ALIGN_MEMBERS = YES
-GENERATE_HTMLHELP = YES
+HTML_EXTRA_STYLESHEET =
+HTML_EXTRA_FILES =
+HTML_COLORSTYLE_HUE = 220
+HTML_COLORSTYLE_SAT = 100
+HTML_COLORSTYLE_GAMMA = 80
+HTML_TIMESTAMP = NO
+HTML_DYNAMIC_MENUS = YES
+HTML_DYNAMIC_SECTIONS = NO
+HTML_INDEX_NUM_ENTRIES = 100
+GENERATE_DOCSET = NO
+DOCSET_FEEDNAME = "Doxygen generated docs"
+DOCSET_BUNDLE_ID = org.doxygen.Project
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME = Publisher
+GENERATE_HTMLHELP = NO
CHM_FILE =
HHC_LOCATION =
GENERATE_CHI = NO
+CHM_INDEX_ENCODING =
BINARY_TOC = NO
TOC_EXPAND = YES
+GENERATE_QHP = NO
+QCH_FILE =
+QHP_NAMESPACE = org.doxygen.Project
+QHP_VIRTUAL_FOLDER = doc
+QHP_CUST_FILTER_NAME =
+QHP_CUST_FILTER_ATTRS =
+QHP_SECT_FILTER_ATTRS =
+QHG_LOCATION =
+GENERATE_ECLIPSEHELP = NO
+ECLIPSE_DOC_ID = org.doxygen.Project
DISABLE_INDEX = NO
-ENUM_VALUES_PER_LINE = 4
GENERATE_TREEVIEW = YES
+ENUM_VALUES_PER_LINE = 4
TREEVIEW_WIDTH = 250
+EXT_LINKS_IN_WINDOW = NO
+FORMULA_FONTSIZE = 10
+FORMULA_TRANSPARENT = YES
+USE_MATHJAX = NO
+MATHJAX_FORMAT = HTML-CSS
+MATHJAX_RELPATH = https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/
+MATHJAX_EXTENSIONS =
+MATHJAX_CODEFILE =
+SEARCHENGINE = NO
+SERVER_BASED_SEARCH = NO
+EXTERNAL_SEARCH = NO
+SEARCHENGINE_URL =
+SEARCHDATA_FILE = searchdata.xml
+EXTERNAL_SEARCH_ID =
+EXTRA_SEARCH_MAPPINGS =
#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
+# Configuration options related to the LaTeX output
#---------------------------------------------------------------------------
GENERATE_LATEX = NO
LATEX_OUTPUT = latex
@@ -147,12 +229,18 @@ COMPACT_LATEX = NO
PAPER_TYPE = a4wide
EXTRA_PACKAGES =
LATEX_HEADER =
+LATEX_FOOTER =
+LATEX_EXTRA_STYLESHEET =
+LATEX_EXTRA_FILES =
PDF_HYPERLINKS = NO
USE_PDFLATEX = NO
LATEX_BATCHMODE = NO
LATEX_HIDE_INDICES = NO
+LATEX_SOURCE_CODE = NO
+LATEX_BIB_STYLE = plain
+LATEX_TIMESTAMP = NO
#---------------------------------------------------------------------------
-# configuration options related to the RTF output
+# Configuration options related to the RTF output
#---------------------------------------------------------------------------
GENERATE_RTF = NO
RTF_OUTPUT = rtf
@@ -160,27 +248,33 @@ COMPACT_RTF = NO
RTF_HYPERLINKS = NO
RTF_STYLESHEET_FILE =
RTF_EXTENSIONS_FILE =
+RTF_SOURCE_CODE = NO
#---------------------------------------------------------------------------
-# configuration options related to the man page output
+# Configuration options related to the man page output
#---------------------------------------------------------------------------
GENERATE_MAN = NO
MAN_OUTPUT = man
MAN_EXTENSION = .3
+MAN_SUBDIR =
MAN_LINKS = NO
#---------------------------------------------------------------------------
-# configuration options related to the XML output
+# Configuration options related to the XML output
#---------------------------------------------------------------------------
GENERATE_XML = NO
XML_OUTPUT = xml
-XML_SCHEMA =
-XML_DTD =
XML_PROGRAMLISTING = YES
#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK = NO
+DOCBOOK_OUTPUT = docbook
+DOCBOOK_PROGRAMLISTING = NO
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
-# configuration options related to the Perl module output
+# Configuration options related to the Perl module output
#---------------------------------------------------------------------------
GENERATE_PERLMOD = NO
PERLMOD_LATEX = NO
@@ -195,42 +289,67 @@ EXPAND_ONLY_PREDEF = YES
SEARCH_INCLUDES = YES
INCLUDE_PATH =
INCLUDE_FILE_PATTERNS =
-PREDEFINED = ENABLE_NETWORK WITH_ZLIB WITH_LZO WITH_LZMA WITH_SDL WITH_PNG WITH_FONTCONFIG WITH_FREETYPE WITH_ICU_SORT WITH_ICU_LAYOUT UNICODE _UNICODE _GNU_SOURCE FINAL=
+PREDEFINED = ENABLE_NETWORK \
+ WITH_ZLIB \
+ WITH_LZO \
+ WITH_LZMA \
+ WITH_SDL \
+ WITH_PNG \
+ WITH_FONTCONFIG \
+ WITH_FREETYPE \
+ WITH_ICU_SORT \
+ WITH_ICU_LAYOUT \
+ UNICODE \
+ _UNICODE \
+ _GNU_SOURCE \
+ FINAL=
EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
-# Configuration::additions related to external references
+# Configuration options related to external references
#---------------------------------------------------------------------------
TAGFILES =
GENERATE_TAGFILE = objs/openttd.tag
ALLEXTERNALS = NO
EXTERNAL_GROUPS = YES
+EXTERNAL_PAGES = YES
PERL_PATH = /usr/bin/perl
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
CLASS_DIAGRAMS = YES
+MSCGEN_PATH =
+DIA_PATH =
HIDE_UNDOC_RELATIONS = YES
HAVE_DOT = NO
+DOT_NUM_THREADS = 0
+DOT_FONTNAME = Helvetica
+DOT_FONTSIZE = 10
+DOT_FONTPATH =
CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES
GROUP_GRAPHS = YES
UML_LOOK = NO
+UML_LIMIT_NUM_FIELDS = 10
TEMPLATE_RELATIONS = NO
INCLUDE_GRAPH = YES
INCLUDED_BY_GRAPH = YES
CALL_GRAPH = NO
+CALLER_GRAPH = NO
GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES
DOT_IMAGE_FORMAT = png
+INTERACTIVE_SVG = NO
DOT_PATH =
DOTFILE_DIRS =
+MSCFILE_DIRS =
+DIAFILE_DIRS =
+PLANTUML_JAR_PATH =
+PLANTUML_CFG_FILE =
+PLANTUML_INCLUDE_PATH =
+DOT_GRAPH_MAX_NODES = 50
MAX_DOT_GRAPH_DEPTH = 1000
DOT_TRANSPARENT = NO
DOT_MULTI_TARGETS = NO
GENERATE_LEGEND = YES
DOT_CLEANUP = YES
-#---------------------------------------------------------------------------
-# Configuration::additions related to the search engine
-#---------------------------------------------------------------------------
-SEARCHENGINE = NO
diff --git a/Jenkinsfile b/Jenkinsfile
deleted file mode 100644
index af7968e71e..0000000000
--- a/Jenkinsfile
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/usr/bin/env groovy
-
-// The stages we run one by one
-// Please don't add more than 2 items in a single stage; this hurts performance
-def ci_stages = [
- "Checkers": [
- "commit-checker": "openttd/compile-farm-ci:commit-checker",
- ],
- "Compilers": [
- "linux-amd64-gcc-6": "openttd/compile-farm-ci:linux-amd64-gcc-6",
- "linux-amd64-clang-3.8": "openttd/compile-farm-ci:linux-amd64-clang-3.8",
- ],
- "Archs": [
- "linux-i386-gcc-6": "openttd/compile-farm-ci:linux-i386-gcc-6",
- ],
- "OS": [
- "osx-10.9": "openttd/compile-farm-ci:osx-10.9",
- ],
-]
-
-def generateStage(targets) {
- return targets.collectEntries{ key, target ->
- ["${key}": generateCI(key, target)]
- }
-}
-
-def generateCI(display_name, image_name) {
- return {
- githubNotify context: 'openttd/' + display_name, description: 'This commit is being built', status: 'PENDING'
-
- try {
- dir("${display_name}") {
- unstash "source"
-
- docker.image("${image_name}").pull()
- docker.image("${image_name}").withRun("--volumes-from ${hostname} --workdir " + pwd()) { c ->
- sh "docker logs --follow ${c.id}; exit `docker wait ${c.id}`"
- }
- }
-
- githubNotify context: 'openttd/' + display_name, description: 'The commit looks good', status: 'SUCCESS'
- }
- catch (error) {
- githubNotify context: 'openttd/' + display_name, description: 'The commit cannot be built', status: 'FAILURE'
- throw error
- }
- }
-}
-
-node {
- ansiColor('xterm') {
- stage("Checkout") {
- checkout scm
-
- // Ensure user.email and user.name is set, otherwise rebase cannot work
- sh "git config user.email 'info@openttd.org'"
- sh "git config user.name 'OpenTTD CI'"
-
- // Ensure we also have origin/master available
- sh "git fetch --no-tags origin master:refs/remotes/origin/master"
-
- // Try to rebase to origin/master; if this fails, fail the CI
- sh "git rebase origin/master"
-
- stash name: "source", useDefaultExcludes: false
- }
-
- ci_stages.each { ci_stage ->
- stage(ci_stage.key) {
- parallel generateStage(ci_stage.value)
- }
- }
- }
-}
-
diff --git a/Makefile.lang.in b/Makefile.lang.in
index 7ce331913d..2853ae3898 100644
--- a/Makefile.lang.in
+++ b/Makefile.lang.in
@@ -78,7 +78,7 @@ depend:
clean:
$(E) '$(STAGE) Cleaning up language files'
- $(Q)rm -f strgen.o string.o alloc_func.o getoptdata.o table/strings.h $(STRGEN) $(LANGS) $(LANGS:%=$(BIN_DIR)/lang/%) lang/english.*
+ $(Q)rm -f strgen_base.o strgen.o string.o alloc_func.o getoptdata.o table/strings.h $(STRGEN) $(LANGS) $(LANGS:%=$(BIN_DIR)/lang/%) lang/english.*
mrproper: clean
$(Q)rm -rf $(BIN_DIR)/lang
diff --git a/Makefile.setting.in b/Makefile.setting.in
index 656de05723..1e2dc992f8 100644
--- a/Makefile.setting.in
+++ b/Makefile.setting.in
@@ -58,7 +58,7 @@ depend:
clean:
$(E) '$(STAGE) Cleaning up settings files'
- $(Q)rm -f settingsgen.o alloc_func.o getoptdata.o ini_load.o $(SETTINGSGEN) table/settings.h
+ $(Q)rm -f settingsgen.o alloc_func.o getoptdata.o string.o ini_load.o $(SETTINGSGEN) table/settings.h
mrproper: clean
diff --git a/README.md b/README.md
index 7f5d244f58..96d3e49f36 100644
--- a/README.md
+++ b/README.md
@@ -14,6 +14,7 @@
- 4.4) [Files in tar (archives)](#44-files-in-tar-archives)
- 5.0) [OpenTTD features](#50-openttd-features)
- 5.1) [Logging of potentially dangerous actions](#51-logging-of-potentially-dangerous-actions)
+ - 5.2) [Frame rate and performance metrics](#52-frame-rate-and-performance-metrics)
- 6.0) [Configuration file](#60-configuration-file)
- 7.0) [Compiling](#70-compiling)
- 7.1) [Required/optional libraries](#71-requiredoptional-libraries)
@@ -433,6 +434,70 @@ No personal information is stored.
You can show the game log by typing 'gamelog' in the console or by running
OpenTTD in debug mode.
+### 5.2) Frame rate and performance metrics
+
+The Help menu in-game has a function to open the Frame rate window. This
+window shows various real-time performance statistics, measuring what parts
+of the game require the most processing power currently.
+
+A summary of the statistics can also be retrieved from the console with the
+`fps` command. This is especially useful on dedicated servers, where the
+administrator might want to determine what's limiting performance in a slow
+game.
+
+The frame rate is given as two figures, the simulation rate and the graphics
+frame rate. Usually these are identical, as the screen is rendered exactly
+once per simulated tick, but in the future there might be support for graphics
+and simulation running at different rates. When the game is paused, the
+simulation rate drops to zero.
+
+In addition to the simulation rate, a game speed factor is also calculated.
+This is based on the target simulation speed, which is 30 milliseconds per
+game tick. At that speed, the expected frame rate is 33.33 frames/second, and
+the game speed factor is how close to that target the actual rate is. When
+the game is in fast forward mode, the game speed factor shows how much
+speed up is achieved.
+
+The lower part of the window shows timing statistics for individual parts of
+the game. The times shown are short-term and long-term averages of how long
+it takes to process one tick of game time, all figures are in milliseconds.
+
+Clicking a line in the lower part of the window opens a graph window, giving
+detailed readings on each tick simulated by the game.
+
+The following is an explanation of the different statistics:
+
+- *Game loop* - Total processing time used per simulated "tick" in the game.
+ This includes all pathfinding, world updates, and economy handling.
+- *Cargo handling* - Time spent loading/unloading cargo at stations, and
+ industries and towns sending/retrieving cargo from stations.
+- *Train ticks*, *Road vehicle ticks*, *Ship ticks*, *Aircraft ticks* -
+ Time spent on pathfinding and other processing for each player vehicle type.
+- *World ticks* - Time spent on other world/landscape processing. This
+ includes towns growing, building animations, updates of farmland and trees,
+ and station rating updates.
+- *Link graph delay* - Time overruns of the cargo distribution link graph
+ update thread. Usually the link graph is updated in a background thread,
+ but these updates need to synchronise with the main game loop occasionally,
+ if the time spent on link graph updates is longer than the time taken to
+ otherwise simulate the game while it was updating, these delays are counted
+ in this figure.
+- *Graphics rendering* - Total time spent rendering all graphics, including
+ both GUI and world viewports. This typically spikes when panning the view
+ around, and when more things are happening on screen at once.
+- *World viewport rendering* - Isolated time spent rendering just world
+ viewports. If this figure is significantly lower than the total graphics
+ rendering time, most time is spent rendering GUI than rendering world.
+- *Video output* - Speed of copying the rendered graphics to the display
+ adapter. Usually this should be very fast (in the range of 0-3 ms), large
+ values for this can indicate a graphics driver problem.
+- *Sound mixing* - Speed of mixing active audio samples together. Usually
+ this should be very fast (in the range of 0-3 ms), if it is slow, consider
+ switching to the NoSound set.
+
+If the frame rate window is shaded, the title bar will instead show just the
+current simulation rate and the game speed factor.
+
## 6.0) Configuration file
The configuration file for OpenTTD (openttd.cfg) is in a simple Windows-like
@@ -446,16 +511,15 @@ create one after closing.
### Windows:
-You need Microsoft Visual Studio .NET. Open the project file
+You need Microsoft Visual Studio 2015 Update 3 or more recent. Open the project file
and it should build automatically. In case you want to build with SDL support
you need to add WITH_SDL to the project settings.
-PNG (WITH_PNG) and ZLIB (WITH_ZLIB) support is enabled by default. For these
-to work you need their development files. For best results, download the
-openttd-useful.zip file from https://www.openttd.org/download-openttd-useful.
-Put the header files into your compiler's include/ directory and the
-library (.lib) files into the lib/ directory.
-For more help with VS see docs/Readme_Windows_MSVC.txt.
+PNG (WITH_PNG), ZLIB (WITH_ZLIB), LZO (WITH_LZO), Freetype (WITH_FREETYPE) and
+LZMA (WITH_LZMA) support is enabled by default. For these to work you need their
+development files. To get them just use vcpkg from https://github.com/Microsoft/vcpkg
+using x86-windows-static and x64-windows-static triplets.
+For more help with VS see docs/Readme_Windows_MSVC.md.
You can also build it using the Makefile with MSYS/MinGW or Cygwin/MinGW.
Please read the Makefile for more information.
@@ -717,6 +781,7 @@ terms for Bootstrap documentation.
- Christoph Elsenhans (frosch) - General coding (since 0.6)
- Loïc Guilloux (glx) - Windows Expert (since 0.4.5)
- Michael Lutz (michi_cc) - Path based signals (since 0.7)
+- Niels Martin Hansen (nielsm) - Music system, general coding (since 1.9)
- Owen Rudge (orudge) - Forum host, OS/2 port (since 0.1)
- Peter Nelson (peter1138) - Spiritual descendant from newGRF gods (since 0.4.5)
- Ingo von Borstel (planetmaker) - General coding, Support (since 1.1)
diff --git a/azure-pipelines-ci.yml b/azure-pipelines-ci.yml
new file mode 100644
index 0000000000..e71ab60ea4
--- /dev/null
+++ b/azure-pipelines-ci.yml
@@ -0,0 +1,116 @@
+trigger:
+- master
+pr:
+- master
+
+jobs:
+- job: windows
+ displayName: 'Windows'
+ pool:
+ vmImage: 'VS2017-Win2016'
+
+ strategy:
+ matrix:
+ Win32:
+ BuildPlatform: 'Win32'
+ Win64:
+ BuildPlatform: 'x64'
+
+ steps:
+ # Rebase to origin/master for every PR. This means users don't have to
+ # rebase every time master changes. As long as the PR applies cleanly, we
+ # will validate it.
+ - script: |
+ git config user.email 'info@openttd.org'
+ git config user.name 'OpenTTD CI'
+ git rebase origin/master
+ displayName: 'Rebase to master'
+ - bash: |
+ set -ex
+ curl -L https://github.com/OpenTTD/OpenTTD-CF/releases/download/latest/windows-dependencies.zip > windows-dependencies.zip
+ unzip windows-dependencies.zip
+ rm -f windows-dependencies.zip
+ displayName: 'Download dependencies'
+ workingDirectory: $(Build.ArtifactStagingDirectory)
+ - script: $(Build.ArtifactStagingDirectory)\windows-dependencies\vcpkg.exe integrate install
+ displayName: 'Install dependencies'
+ - bash: |
+ set -ex
+ cd bin/baseset
+ curl -L https://binaries.openttd.org/extra/opengfx/0.5.2/opengfx-0.5.2-all.zip > opengfx-0.5.2-all.zip
+ unzip opengfx-0.5.2-all.zip
+ rm -f opengfx-0.5.2-all.zip
+ displayName: 'Install OpenGFX'
+ - task: VSBuild@1
+ displayName: 'Build'
+ inputs:
+ solution: 'projects/openttd_vs141.sln'
+ platform: $(BuildPlatform)
+ configuration: Release
+ maximumCpuCount: true
+ - script: |
+ call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x86
+ cd projects
+ call regression.bat
+ displayName: 'Test'
+
+- job: linux
+ displayName: 'Linux'
+ pool:
+ vmImage: 'ubuntu-16.04'
+
+ strategy:
+ matrix:
+ commit-checker: {}
+ linux-amd64-clang-3.8: {}
+ linux-amd64-gcc-6: {}
+ linux-i386-gcc-6: {}
+
+ steps:
+ # Rebase to origin/master for every PR. This means users don't have to
+ # rebase every time master changes. As long as the PR applies cleanly, we
+ # will validate it.
+ - script: |
+ git config user.email 'info@openttd.org'
+ git config user.name 'OpenTTD CI'
+ git rebase origin/master
+ displayName: 'Rebase to master'
+ - task: Docker@1
+ displayName: 'Build and test'
+ inputs:
+ command: 'Run an image'
+ imageName: openttd/compile-farm-ci:$(Agent.JobName)
+ volumes: '$(Build.SourcesDirectory):$(Build.SourcesDirectory)'
+ workingDirectory: '$(Build.SourcesDirectory)'
+ runInBackground: false
+
+- job: macos
+ displayName: 'MacOS'
+ pool:
+ vmImage: 'macOS-10.13'
+
+ steps:
+ # Rebase to origin/master for every PR. This means users don't have to
+ # rebase every time master changes. As long as the PR applies cleanly, we
+ # will validate it.
+ - script: |
+ git config user.email 'info@openttd.org'
+ git config user.name 'OpenTTD CI'
+ git rebase origin/master
+ displayName: 'Rebase to master'
+ - script: HOMEBREW_NO_AUTO_UPDATE=1 brew install pkg-config lzo xz libpng
+ displayName: 'Install dependencies'
+ - bash: |
+ set -ex
+ mkdir -p ~/Documents/OpenTTD/baseset
+ cd ~/Documents/OpenTTD/baseset
+ wget https://binaries.openttd.org/extra/opengfx/0.5.2/opengfx-0.5.2-all.zip
+ unzip opengfx-0.5.2-all.zip
+ rm -f opengfx-0.5.2-all.zip
+ displayName: 'Install OpenGFX'
+ - script: './configure PKG_CONFIG_PATH=/usr/local/lib/pkgconfig --enable-static'
+ displayName: 'Configure'
+ - script: 'make -j2'
+ displayName: 'Build'
+ - script: 'make regression'
+ displayName: 'Test'
diff --git a/bin/ai/regression/run.vbs b/bin/ai/regression/run.vbs
new file mode 100644
index 0000000000..88cea5c4eb
--- /dev/null
+++ b/bin/ai/regression/run.vbs
@@ -0,0 +1,154 @@
+Option Explicit
+
+' $Id$
+'
+' 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 .
+
+Dim FSO
+Set FSO = CreateObject("Scripting.FileSystemObject")
+
+Function GetTestList()
+ Dim retests, i, tests, dir
+ Set retests = New RegExp
+ Set GetTestList = CreateObject("Scripting.Dictionary")
+
+ retests.Pattern = "ai/regression/tst_*"
+ retests.Global = True
+ For i = 0 To WScript.Arguments.Count - 1
+ Dim test
+ test = "ai/regression/tst_" & WScript.Arguments.Item(i)
+ If FSO.FolderExists(test) Then
+ retests.Pattern = test
+ Exit For
+ End If
+ Next
+
+ For Each dir In FSO.GetFolder("ai/regression/").SubFolders
+ Dim name
+ name = "ai/regression/" & dir.Name
+ If retests.Test(name) Then
+ GetTestList.Add name, name
+ End If
+ Next
+End Function
+
+Function GetParams()
+ GetParams = "-snull -mnull -vnull:ticks=30000"
+ If WScript.Arguments.Count = 0 Then Exit Function
+ If WScript.Arguments.Item(0) <> "-r" Then Exit Function
+ GetParams = ""
+End Function
+
+Sub FilterFile(filename)
+ Dim lines, filter, file
+
+ Set file = FSO.OpenTextFile(filename, 1)
+ If Not file.AtEndOfStream Then
+ lines = file.ReadAll
+ End If
+ file.Close
+
+ Set filter = New RegExp
+ filter.Global = True
+ filter.Multiline = True
+ filter.Pattern = "0x(\(nil\)|0+)(x0)?"
+ lines = filter.Replace(lines, "0x00000000")
+ filter.Pattern = "^dbg: \[script\]"
+ lines = filter.Replace(lines, "")
+ filter.Pattern = "^ "
+ lines = filter.Replace(lines, "ERROR: ")
+ filter.Pattern = "ERROR: \[1\] \[P\] "
+ lines = filter.Replace(lines, "")
+ filter.Pattern = "^dbg: .*\r\n"
+ lines = filter.Replace(lines, "")
+
+ Set file = FSO.OpenTextFile(filename, 2)
+ file.Write lines
+ file.Close
+End Sub
+
+Function CompareFiles(filename1, filename2)
+ Dim file, lines1, lines2
+ Set file = FSO.OpenTextFile(filename1, 1)
+ If Not file.AtEndOfStream Then
+ lines1 = file.ReadAll
+ End IF
+ file.Close
+ Set file = FSO.OpenTextFile(filename2, 1)
+ If Not file.AtEndOfStream Then
+ lines2 = file.ReadAll
+ End IF
+ file.Close
+ CompareFiles = (lines1 = lines2)
+End Function
+
+Function RunTest(test, params, ret)
+ Dim WshShell, oExec, sav, command
+ Set WshShell = CreateObject("WScript.Shell")
+
+ ' Make sure that only one info.nut is present for each test run. Otherwise openttd gets confused.
+ FSO.CopyFile "ai/regression/regression_info.nut", test & "/info.nut"
+
+ sav = test & "/test.sav"
+ If Not FSO.FileExists(sav) Then
+ sav = "ai/regression/empty.sav"
+ End If
+
+ command = ".\openttd -x -c ai/regression/regression.cfg " & params & " -g " & sav & " -d script=2 -d misc=9"
+ ' 2>&1 must be after >tmp.regression, else stderr is not redirected to the file
+ WshShell.Run "cmd /c " & command & " >tmp.regression 2>&1", 0, True
+
+ FilterFile "tmp.regression"
+
+ If CompareFiles(test & "/result.txt", "tmp.regression") Then
+ RunTest = "passed!"
+ Else
+ RunTest = "failed!"
+ ret = 1
+ End If
+
+ FSO.DeleteFile test & "/info.nut"
+End Function
+
+On Error Resume Next
+WScript.StdOut.WriteLine ""
+If Err.Number <> 0 Then
+ WScript.Echo "This script must be started with cscript."
+ WScript.Quit 1
+End If
+On Error Goto 0
+
+If Not FSO.FileExists("ai/regression/run.vbs") Then
+ WScript.Echo "Make sure you are in the root of OpenTTD before starting this script."
+ WScript.Quit 1
+End If
+
+If FSO.FileExists("scripts/game_start.scr") Then
+ FSO.MoveFile "scripts/game_start.scr", "scripts/game_start.scr.regression"
+End If
+
+Dim params, test, ret
+params = GetParams()
+ret = 0
+
+For Each test in GetTestList()
+ WScript.StdOut.Write "Running " & test & "... "
+ WScript.StdOut.WriteLine RunTest(test, params, ret)
+Next
+
+If FSO.FileExists("scripts/game_start.scr.regression") Then
+ FSO.MoveFile "scripts/game_start.scr.regression", "scripts/game_start.scr"
+End If
+
+If WScript.Arguments.Count > 0 Then
+ If WScripts.Arguments.Items(0) = "-k" Then
+ WScript.Quit ret
+ End If
+End If
+
+FSO.DeleteFile "tmp.regression"
+
+WScript.Quit ret
diff --git a/bin/ai/regression/tst_regression/main.nut b/bin/ai/regression/tst_regression/main.nut
index f575f53fff..d36db03da7 100644
--- a/bin/ai/regression/tst_regression/main.nut
+++ b/bin/ai/regression/tst_regression/main.nut
@@ -1018,7 +1018,36 @@ function Regression::Rail()
print(" BuildRail(): " + AIRail.BuildRail(10002, 10003, 10006));
print(" HasTransportType(): " + AITile.HasTransportType(10005, AITile.TRANSPORT_RAIL));
print(" HasTransportType(): " + AITile.HasTransportType(10006, AITile.TRANSPORT_RAIL));
- print(" RemoveRail(): " + AIRail.RemoveRail(10005, 10004, 10001));
+ print(" RemoveRail(): " + AIRail.RemoveRail(10006, 10005, 10002));
+ print(" HasTransportType(): " + AITile.HasTransportType(10004, AITile.TRANSPORT_RAIL));
+ print(" HasTransportType(): " + AITile.HasTransportType(10005, AITile.TRANSPORT_RAIL));
+ print(" BuildRailTrack(): " + AIRail.BuildRailTrack(6200, AIRail.RAILTRACK_NE_SW));
+ print(" RemoveRailTrack(): " + AIRail.RemoveRailTrack(6200, AIRail.RAILTRACK_NW_NE));
+ print(" RemoveRailTrack(): " + AIRail.RemoveRailTrack(6200, AIRail.RAILTRACK_NE_SW));
+ print(" BuildRail(): " + AIRail.BuildRail(6200, 6200 + 256, 6200 + (256 * 4)));
+ print(" HasTransportType(): " + AITile.HasTransportType(6200 + (256 * 3), AITile.TRANSPORT_RAIL));
+ print(" HasTransportType(): " + AITile.HasTransportType(6200 + (256 * 4), AITile.TRANSPORT_RAIL));
+ print(" RemoveRail(): " + AIRail.RemoveRail(6200 + (256 * 3), 6200 + (256 * 2), 6200 - 256));
+ print(" HasTransportType(): " + AITile.HasTransportType(6200 + (256 * 3), AITile.TRANSPORT_RAIL));
+ print(" HasTransportType(): " + AITile.HasTransportType(6200 + (256 * 4), AITile.TRANSPORT_RAIL));
+ print(" BuildRailTrack(): " + AIRail.BuildRail(14706, 14705, 12907));
+ print(" HasTransportType(): " + AITile.HasTransportType(13421, AITile.TRANSPORT_RAIL));
+ print(" HasTransportType(): " + AITile.HasTransportType(14191, AITile.TRANSPORT_RAIL));
+ print(" RemoveRail(): " + AIRail.RemoveRail(12907, 13163, 14706));
+ print(" HasTransportType(): " + AITile.HasTransportType(13421, AITile.TRANSPORT_RAIL));
+ print(" HasTransportType(): " + AITile.HasTransportType(14191, AITile.TRANSPORT_RAIL));
+ print(" BuildRailTrack(): " + AIRail.BuildRailTrack(61533, AIRail.RAILTRACK_NW_SW));
+ print(" BuildRailTrack(): " + AIRail.BuildRailTrack(61533, AIRail.RAILTRACK_NE_SE));
+ print(" BuildRailTrack(): " + AIRail.BuildRailTrack(61533, AIRail.RAILTRACK_NW_NE));
+ print(" BuildRailTrack(): " + AIRail.BuildRailTrack(61533, AIRail.RAILTRACK_SW_SE));
+ print(" BuildRailTrack(): " + AIRail.BuildRailTrack(61533, AIRail.RAILTRACK_NE_SW));
+ print(" DemolishTile(): " + AITile.DemolishTile(61533));
+ print(" BuildRailTrack(): " + AIRail.BuildRailTrack(61533, AIRail.RAILTRACK_NE_SW));
+ print(" BuildRailTrack(): " + AIRail.BuildRailTrack(61533, AIRail.RAILTRACK_NW_SE));
+ print(" BuildRailTrack(): " + AIRail.BuildRailTrack(61533, AIRail.RAILTRACK_NW_NE));
+ print(" BuildRailTrack(): " + AIRail.BuildRailTrack(61533, AIRail.RAILTRACK_SW_SE));
+ print(" DemolishTile(): " + AITile.DemolishTile(61533));
+ print(" BuildRailTrack(): " + AIRail.BuildRailTrack(61533, AIRail.RAILTRACK_NW_SE));
print(" Depot");
print(" IsRailTile(): " + AIRail.IsRailTile(33411));
@@ -1053,6 +1082,31 @@ function Regression::Rail()
print(" IsRailStationTile(): " + AIRail.IsRailStationTile(7957));
print(" IsRailStationTile(): " + AIRail.IsRailStationTile(7958));
print(" IsRailStationTile(): " + AIRail.IsRailStationTile(7959));
+
+ print(" Waypoint");
+ print(" BuildRailTrack(): " + AIRail.BuildRailTrack(12646, AIRail.RAILTRACK_NW_SE));
+ print(" BuildRailTrack(): " + AIRail.BuildRailTrack(12648, AIRail.RAILTRACK_NE_SW));
+ print(" BuildRailTrack(): " + AIRail.BuildRailTrack(12650, AIRail.RAILTRACK_NW_NE));
+ print(" BuildRailWaypoint(): " + AIRail.BuildRailWaypoint(12644));
+ print(" BuildRailWaypoint(): " + AIRail.BuildRailWaypoint(12646));
+ print(" BuildRailWaypoint(): " + AIRail.BuildRailWaypoint(12648));
+ print(" BuildRailWaypoint(): " + AIRail.BuildRailWaypoint(12650));
+ print(" IsRailWaypointTile(): " + AIRail.IsRailWaypointTile(12644));
+ print(" IsRailWaypointTile(): " + AIRail.IsRailWaypointTile(12646));
+ print(" IsRailWaypointTile(): " + AIRail.IsRailWaypointTile(12648));
+ print(" IsRailWaypointTile(): " + AIRail.IsRailWaypointTile(12650));
+ print(" RemoveRailWaypointTileRectangle():" + AIRail.RemoveRailWaypointTileRectangle(12644, 12646, false));
+ print(" RemoveRailWaypointTileRectangle():" + AIRail.RemoveRailWaypointTileRectangle(12648, 12650, true));
+ print(" IsRailWaypointTile(): " + AIRail.IsRailWaypointTile(12644));
+ print(" IsRailWaypointTile(): " + AIRail.IsRailWaypointTile(12646));
+ print(" IsRailWaypointTile(): " + AIRail.IsRailWaypointTile(12648));
+ print(" IsRailWaypointTile(): " + AIRail.IsRailWaypointTile(12650));
+ print(" HasTransportType(): " + AITile.HasTransportType(12644, AITile.TRANSPORT_RAIL));
+ print(" HasTransportType(): " + AITile.HasTransportType(12646, AITile.TRANSPORT_RAIL));
+ print(" HasTransportType(): " + AITile.HasTransportType(12648, AITile.TRANSPORT_RAIL));
+ print(" HasTransportType(): " + AITile.HasTransportType(12650, AITile.TRANSPORT_RAIL));
+ print(" DemolishTile(): " + AITile.DemolishTile(12648));
+ print(" DemolishTile(): " + AITile.DemolishTile(12650));
}
function Regression::Road()
@@ -1441,7 +1495,7 @@ function Regression::TileList()
print(" " + i + " => " + list.GetValue(i));
}
- list = AITileList_StationType(4, AIStation.STATION_BUS_STOP);
+ list = AITileList_StationType(6, AIStation.STATION_BUS_STOP);
print("");
print("--TileList_StationType--");
print(" Count(): " + list.Count());
diff --git a/bin/ai/regression/tst_regression/result.txt b/bin/ai/regression/tst_regression/result.txt
index c909e79322..210cf2696a 100644
--- a/bin/ai/regression/tst_regression/result.txt
+++ b/bin/ai/regression/tst_regression/result.txt
@@ -1292,7 +1292,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetRunningCost(): 820
GetPower(): 300
GetWeight(): 47
- GetMaxTractiveEffort(): 139
+ GetMaxTractiveEffort(): 136
GetVehicleType(): 0
GetRailType(): 0
GetRoadType(): -1
@@ -1436,7 +1436,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetRunningCost(): 1968
GetPower(): 1000
GetWeight(): 131
- GetMaxTractiveEffort(): 388
+ GetMaxTractiveEffort(): 381
GetVehicleType(): 0
GetRailType(): 0
GetRoadType(): -1
@@ -1454,7 +1454,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetRunningCost(): 2296
GetPower(): 1200
GetWeight(): 162
- GetMaxTractiveEffort(): 480
+ GetMaxTractiveEffort(): 471
GetVehicleType(): 0
GetRailType(): 0
GetRoadType(): -1
@@ -7253,7 +7253,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
IsBuoyTile(): false
IsLockTile(): false
IsCanalTile(): false
- GetBankBalance(): 479851
+ GetBankBalance(): 479664
BuildWaterDepot(): true
BuildDock(): true
BuildBuoy(): true
@@ -7266,7 +7266,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
IsBuoyTile(): true
IsLockTile(): true
IsCanalTile(): true
- GetBankBalance(): 465257
+ GetBankBalance(): 465070
--AIWaypointList(BUOY)--
Count(): 1
@@ -7285,7 +7285,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
IsBuoyTile(): false
IsLockTile(): false
IsCanalTile(): false
- GetBankBalance(): 459862
+ GetBankBalance(): 459675
BuildWaterDepot(): true
BuildDock(): true
@@ -7334,6 +7334,35 @@ ERROR: IsEnd() is invalid as Begin() is never called
HasTransportType(): true
HasTransportType(): false
RemoveRail(): true
+ HasTransportType(): false
+ HasTransportType(): false
+ BuildRailTrack(): true
+ RemoveRailTrack(): false
+ RemoveRailTrack(): true
+ BuildRail(): true
+ HasTransportType(): true
+ HasTransportType(): false
+ RemoveRail(): true
+ HasTransportType(): true
+ HasTransportType(): false
+ BuildRailTrack(): true
+ HasTransportType(): true
+ HasTransportType(): true
+ RemoveRail(): true
+ HasTransportType(): false
+ HasTransportType(): false
+ BuildRailTrack(): false
+ BuildRailTrack(): false
+ BuildRailTrack(): true
+ BuildRailTrack(): true
+ BuildRailTrack(): false
+ DemolishTile(): true
+ BuildRailTrack(): true
+ BuildRailTrack(): false
+ BuildRailTrack(): false
+ BuildRailTrack(): false
+ DemolishTile(): true
+ BuildRailTrack(): true
Depot
IsRailTile(): false
BuildRailDepot(): false
@@ -7362,6 +7391,30 @@ ERROR: IsEnd() is invalid as Begin() is never called
IsRailStationTile(): false
IsRailStationTile(): false
IsRailStationTile(): false
+ Waypoint
+ BuildRailTrack(): true
+ BuildRailTrack(): true
+ BuildRailTrack(): true
+ BuildRailWaypoint(): false
+ BuildRailWaypoint(): true
+ BuildRailWaypoint(): true
+ BuildRailWaypoint(): false
+ IsRailWaypointTile(): false
+ IsRailWaypointTile(): true
+ IsRailWaypointTile(): true
+ IsRailWaypointTile(): false
+ RemoveRailWaypointTileRectangle():true
+ RemoveRailWaypointTileRectangle():true
+ IsRailWaypointTile(): false
+ IsRailWaypointTile(): false
+ IsRailWaypointTile(): false
+ IsRailWaypointTile(): false
+ HasTransportType(): false
+ HasTransportType(): false
+ HasTransportType(): true
+ HasTransportType(): true
+ DemolishTile(): true
+ DemolishTile(): true
--RailTypeList--
Count(): 1
@@ -7485,9 +7538,9 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetName(0): Look, a station
GetLocation(1): 29253
GetLocation(1000): -1
- GetStationID(33411): 4
+ GetStationID(33411): 6
GetStationID(34411): 65535
- GetStationID(33411): 4
+ GetStationID(33411): 6
HasRoadType(3, TRAM): false
HasRoadType(3, ROAD): false
HasRoadType(33411, TRAM): false
diff --git a/config.lib b/config.lib
index af1a1efe94..5b399d86a3 100644
--- a/config.lib
+++ b/config.lib
@@ -83,6 +83,7 @@ set_default() {
with_midi=""
with_midi_arg=""
with_libtimidity="1"
+ with_fluidsynth="1"
with_freetype="1"
with_fontconfig="1"
with_icu_layout="1"
@@ -160,6 +161,7 @@ set_default() {
with_midi
with_midi_arg
with_libtimidity
+ with_fluidsynth
with_freetype
with_fontconfig
with_icu_layout
@@ -372,6 +374,9 @@ detect_params() {
--without-libtimidity) with_libtimidity="0";;
--with-libtimidity=*) with_libtimidity="$optarg";;
+ --with-fluidsynth) with_fluidsynth="2";;
+ --without-fluidsynth) with_fluidsynth="0";;
+
--with-freetype) with_freetype="2";;
--without-freetype) with_freetype="0";;
--with-freetype=*) with_freetype="$optarg";;
@@ -890,6 +895,7 @@ check_params() {
detect_icu_layout
detect_icu_sort
detect_libtimidity
+ detect_fluidsynth
if [ "$with_direct_music" != "0" ]; then
if [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ]; then
@@ -1229,14 +1235,14 @@ make_compiler_cflags() {
# $5 - name of the features variable
# Get the compiler to tell us who it is
- compiler="`$1 --version | head -n1 | cut -d' ' -f1`"
+ version_line="`$1 --version | head -n1`"
eval eval "flags=\\\$$2"
eval eval "cxxflags=\\\$$3"
eval eval "ldflags=\\\$$4"
eval eval "features=\\\$$5"
- if [ "$compiler" = "icc" ]; then
+ if [ `echo "$version_line" | cut -d' ' -f1` = "icc" ]; then
# Enable some things only for certain ICC versions
cc_version=`$1 -dumpversion | cut -c 1-4 | sed s@\\\.@@g`
@@ -1311,8 +1317,6 @@ make_compiler_cflags() {
if [ $cc_version -ge 110 ]; then
# remark #2259: non-pointer conversion from ... to ... may lose significant bits
flags="$flags -wd2259"
- # Use c++0x mode so static_assert() is available
- cxxflags="$cxxflags -std=c++11"
fi
if [ $cc_version -lt 140 ]; then
@@ -1328,9 +1332,10 @@ make_compiler_cflags() {
features="$features lto"
fi
fi
- elif [ "$compiler" = "clang" ]; then
+ elif echo "$version_line" | grep -q "clang"; then
# Enable some things only for certain clang versions
- cc_version="`$1 -v 2>&1 | head -n 1 | sed s@[^0-9]@@g | cut -c 1-2`"
+ # Need to try really hard to get the version line, because OSX clang likes to hide its true version
+ cc_version="`$1 -v 2>&1 | grep -i version | head -n 1 | sed s@[^0-9]@@g | cut -c 1-2`"
# aliasing rules are not held in openttd code
flags="$flags -fno-strict-aliasing"
@@ -1378,10 +1383,7 @@ make_compiler_cflags() {
flags="$flags -Wno-unused-variable"
fi
- if [ "$cc_version" -ge "33" ]; then
- # clang completed C++11 support in version 3.3
- flags="$flags -std=c++11"
- else
+ if [ "$cc_version" -lt "33" ]; then
log 1 "configure: error: clang version is too old: `$1 -v 2>&1 | head -n 1`, minumum: 3.3"
exit 1
fi
@@ -1444,12 +1446,6 @@ make_compiler_cflags() {
flags="$flags -Wnon-virtual-dtor"
fi
- if [ $cc_version -ge 403 ] && [ $cc_version -lt 600 ]; then
- # Use gnu++0x mode so static_assert() is available.
- # Don't use c++0x, it breaks mingw (with gcc 4.4.0).
- cxxflags="$cxxflags -std=gnu++11"
- fi
-
if [ $cc_version -eq 405 ]; then
# Prevent optimisation supposing enums are in a range specified by the standard
# For details, see http://gcc.gnu.org/PR43680
@@ -1474,7 +1470,7 @@ make_compiler_cflags() {
if [ $cc_version -ge 600 ]; then
# -flifetime-dse=2 (default since GCC 6) doesn't play
# well with our custom pool item allocator
- cxxflags="$cxxflags -flifetime-dse=1 -std=gnu++14"
+ cxxflags="$cxxflags -flifetime-dse=1"
fi
if [ "$enable_lto" != "0" ]; then
@@ -1537,6 +1533,8 @@ make_cflags_and_ldflags() {
CFLAGS="$CFLAGS -D$os"
CFLAGS_BUILD="$CFLAGS_BUILD -D$os"
+ CXXFLAGS="$CXXFLAGS -std=c++11"
+ CXXFLAGS_BUILD="$CXXFLAGS_BUILD -std=c++11"
if [ "$enable_debug" = "0" ]; then
# No debug, add default stuff
@@ -1795,7 +1793,7 @@ make_cflags_and_ldflags() {
CFLAGS="$CFLAGS `$freetype_config --cflags | tr '\n\r' ' '`"
if [ "$enable_static" != "0" ]; then
- LIBS="$LIBS `$freetype_config --libs --static | tr '\n\r' ' '`"
+ LIBS="$LIBS `$freetype_config --libs --static | tr '\n\r' ' '` -lfreetype"
else
LIBS="$LIBS `$freetype_config --libs | tr '\n\r' ' '`"
fi
@@ -1853,6 +1851,11 @@ make_cflags_and_ldflags() {
fi
fi
+ if [ -n "$fluidsynth" ]; then
+ LIBS="$LIBS -lfluidsynth"
+ CFLAGS="$CFLAGS -DFLUIDSYNTH"
+ fi
+
if [ "$with_iconv" != "0" ]; then
CFLAGS="$CFLAGS -DWITH_ICONV"
if [ "$link_to_iconv" = "yes" ]; then
@@ -2209,9 +2212,7 @@ check_direct_music() {
echo "
#include
#include
- #include
#include
- #include
int main(int argc, char *argv[]) { }" > direct_music.test.c
$cxx_host $CFLAGS direct_music.test.c -o direct_music.test 2> /dev/null
res=$?
@@ -2791,6 +2792,10 @@ detect_libtimidity() {
detect_pkg_config "$with_libtimidity" "libtimidity" "libtimidity_config" "0.1" "1"
}
+detect_fluidsynth() {
+ detect_library "$with_fluidsynth" "fluidsynth" "" "" "fluidsynth.h"
+}
+
detect_pkg_config() {
# $1 - config-param ($with_lzma value)
# $2 - package name ('liblzma')
@@ -2891,10 +2896,22 @@ detect_fontconfig() {
}
detect_icu_layout() {
+ if [ "$with_cocoa" != "0" ] && [ "$with_icu_layout" = "1" ]; then
+ log 1 "checking icu-lx... OSX, skipping"
+ icu_layout_config=""
+ return 0
+ fi
+
detect_pkg_config "$with_icu_layout" "icu-lx" "icu_layout_config" "4.8" "1"
}
detect_icu_sort() {
+ if [ "$with_cocoa" != "0" ] && [ "$with_icu_sort" = "1" ]; then
+ log 1 "checking icu-i18n... OSX, skipping"
+ icu_sort_config=""
+ return 0
+ fi
+
detect_pkg_config "$with_icu_sort" "icu-i18n" "icu_sort_config" "4.8" "1"
}
@@ -2916,10 +2933,16 @@ detect_iconv() {
# Try to find iconv.h, seems to only thing to detect iconv with
if [ "$with_iconv" = "1" ] || [ "$with_iconv" = "" ] || [ "$with_iconv" = "2" ]; then
- iconv=`ls -1 /usr/include 2>/dev/null | grep "iconv.h"`
- if [ -z "$iconv" ]; then
- iconv=`ls -1 /usr/local/include 2>/dev/null | grep "iconv.h"`
- fi
+ # Iterate over search paths
+ iconv=""
+ search_paths=`LC_ALL=C $cxx_host $OSX_SYSROOT $CFLAGS -E - -v &1 | \
+ $awk '/#include <...> search starts here:/{flag=1;next}/End of search list./{flag=0}flag'`
+ for path in $search_paths; do
+ iconv=`ls -1 $path 2>/dev/null | grep "iconv.h"`
+ if [ -n "$iconv" ]; then
+ break
+ fi
+ done
else
# Make sure it exists
iconv=`ls $with_iconv/include/iconv.h 2>/dev/null`
@@ -3575,6 +3598,7 @@ showhelp() {
echo " midi-player"
echo " --with-libtimidity[=\"pkg-config libtimidity\"]"
echo " enables libtimidity support"
+ echo " --with-fluidsynth enables fluidsynth support"
echo " --with-allegro[=\"pkg-config allegro\"]"
echo " enables Allegro video driver support"
echo " --with-cocoa enables COCOA video driver (OSX ONLY)"
diff --git a/configure b/configure
index 7ca36480d3..afc1de51b4 100755
--- a/configure
+++ b/configure
@@ -125,6 +125,7 @@ AWKCOMMAND='
if ($0 == "MSVC" && "'$os'" != "MSVC") { next; }
if ($0 == "DIRECTMUSIC" && "'$with_direct_music'" == "0") { next; }
if ($0 == "LIBTIMIDITY" && "'$libtimidity'" == "" ) { next; }
+ if ($0 == "FLUIDSYNTH" && "'$fluidsynth'" == "" ) { next; }
if ($0 == "HAVE_THREAD" && "'$with_threads'" == "0") { next; }
if ($0 == "SSE" && "'$with_sse'" != "1") { next; }
diff --git a/docs/Readme_Windows_MSVC.md b/docs/Readme_Windows_MSVC.md
new file mode 100644
index 0000000000..c60904c72a
--- /dev/null
+++ b/docs/Readme_Windows_MSVC.md
@@ -0,0 +1,70 @@
+# Compiling OpenTTD using Microsoft Visual C++
+
+Last updated: 2018-12-27
+
+## Supported MSVC compilers
+
+OpenTTD includes projects for Visual Studio 2015 Update 3 or more recent.
+You can download the free Visual Studio Community Edition from Microsoft at
+https://visualstudio.microsoft.com/vs/community/.
+
+## Required files
+
+### Microsoft platform files
+
+OpenTTD needs the Platform SDK, if it isn't installed already. This can be
+done during installing Visual Studio, by selecting
+`Visual C++ MFC for x86 and x64` (and possibly
+`Visual C++ ATL for x86 and x64` depending on your version). If not, you
+can get it at this location:
+
+- [MS Windows Platform SDK](http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en)
+
+Install the SDK by following the instructions as given.
+
+### OpenTTD dependencies
+
+Dependencies for OpenTTD on Windows are handled via
+[vcpkg](https://github.com/Microsoft/vcpkg/). First you need to install vcpkg
+by following the `Quick Start` intructions of their
+[README](https://github.com/Microsoft/vcpkg/blob/master/README.md).
+
+After this, you can install the dependencies OpenTTD needs. We advise to use
+the `static` versions, and OpenTTD currently needs the following dependencies:
+
+- freetype
+- liblzma
+- libpng
+- lzo
+- zlib
+
+To install both the x64 (64bit) and x86 (32bit) variants, you can use:
+
+```ps
+.\vcpkg install freetype:x64-windows-static liblzma:x64-windows-static libpng:x64-windows-static lzo:x64-windows-static zlib:x64-windows-static
+.\vcpkg install freetype:x86-windows-static liblzma:x86-windows-static libpng:x86-windows-static lzo:x86-windows-static zlib:x86-windows-static
+```
+
+## TTD Graphics files
+
+See section 4.1 of README.md for the required 3rdparty files and how to install them.
+
+## Compiling
+
+Open the appropriate `sln` (Solution) file for your version of Visual Studio:
+
+- VS 2015: projects/openttd_vs140.sln
+- VS 2017: projects/openttd_vs141.sln
+
+Set the build mode to `Release` in
+`Build > Configuration manager > Active solution configuration`.
+You can now compile.
+
+If everything works well the binary should be in `objs\Win[32|64]\Release\openttd.exe`
+and in `bin\openttd.exe`
+
+## Problems
+
+If compilation fails, double-check that you are using the latest github
+source. If it still doesn't work, check in on IRC (irc://irc.oftc.net/openttd),
+to ask for help.
diff --git a/docs/Readme_Windows_MSVC.txt b/docs/Readme_Windows_MSVC.txt
deleted file mode 100644
index 00896f00b9..0000000000
--- a/docs/Readme_Windows_MSVC.txt
+++ /dev/null
@@ -1,109 +0,0 @@
-Compiling OpenTTD using Microsoft Visual C++
-Last updated: 2018-03-21
---------------------------------------------
-PLEASE READ THE ENTIRE DOCUMENT BEFORE DOING ANY ACTUAL CHANGES!!
-
-
-SUPPORTED MSVC COMPILERS
-------------------------
-OpenTTD includes projects for Microsoft Visual Studio 2005 and later.
-This is the earliest compiler supported, Visual C++ 2003, Visual C++ 6.0,
-or earlier, will not compile OpenTTD.
-You can download the free Visual Studio Community Edition from Microsoft.
-
-
-1) REQUIRED FILES
------------------
-You might already have some of the files already installed, so check before
-downloading; mostly because the Platform SDK is about 500MB.
-Download the following files:
-
- * openttd-useful.zip (http://binaries.openttd.org/extra/openttd-useful/)
- * MS Windows Platform SDK (http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en)
- * afxres.h (http://www-d0.fnal.gov/d0dist/dist/packages/d0ve/devel/windows/AFXRES.H)
-
-...and of course the newest source from svn://svn.openttd.org/trunk
-
-You need an SVN-client to download the source from subversion:
-
- * CLI Subversion (http://subversion.tigris.org/)
- * GUI TortoiseSVN (http://tortoisesvn.tigris.org/)
-
-
-2) INCLUDES AND LIBRARIES
--------------------------
-Put the newly downloaded files in the VC lib\ and include\ directories; where
-"C:\Program Files\Microsoft Visual Studio 9.0\VC" is your location of Visual C.
-If you are compiling for an x64 system, use the include\ and lib\ directories
-from the win64/ folder.
-
- * openttd-useful.zip\include\*
- * afxresh.h
- to > C:\Program Files\Microsoft Visual Studio 9.0\VC\Include
-
- * openttd-useful.zip\lib\*
- to > C:\Program Files\Microsoft Visual Studio 9.0\VC\Lib
-
-Custom directories might be recommended, check 2.2)
-
-
-2.1) INCLUDES AND LIBRARIES - DIRECTX/PLATFORM SDK
---------------------------------------------------
-Basically the same procedure as with the useful zip file, providing
-you are not using the Microsoft installer. Put the include files in the
-include\ directory and the library files to the Lib\ directory.
-
-It is recommended to use custom directories so you don't overwrite any
-default header or library files.
-
-
-2.2) CUSTOM DIRECTORIES
------------------------
-If you have put the above include and/or library files into custom folders,
-MSVC will not find them by default. You need to add these paths to VC through:
-
-Tools > Options > Projects and Solutions > VC++ Directories > show directories for
-
- * Include files: Add the DirectX/Platform SDK include dir you've created
- * Library files: Add the path to the SDK custom lib dir
-
-NOTE: make sure that the directory for the DirectX SDK is the first one in the
-list, above all others, otherwise compilation will most likely fail!!
-
-
-3) TTD GRAPHICS FILES
----------------------
-See section 4.1 of README.md for the required 3rdparty files and how to install them.
-
-
-4) COMPILING
-------------
-Open the appropriate "sln" (Solution) file for your version of Visual Studio:
- - VS 2005: projects/openttd_vs80.sln
- - VS 2008: projects/openttd_vs90.sln
- - VS 2010: projects/openttd_vs100.sln
- - VS 2015: projects/openttd_vs140.sln
-Set the build mode to 'Release' in
-Build > Configuration manager > Active solution configuration > select "Release"
-Compile...
-
-If everything works well the binary should be in objs/Win[32|64]/Release/openttd.exe
-
-
-5) EDITING, CHANGING SOURCE CODE
---------------------------------
-Set the build mode (back to) 'Debug'
-Change the startup project to openttd by right-clicking the 'openttd' project
-in the Solution Explorer and selecting 'Set as Startup Project'. The 'openttd'
-project should now show up bold instead of 'strgen'.
-
-
-6) PROBLEMS?
-------------
-If compilation fails, double-check that you are using the latest SVN (!)
-source. If it still doesn't work, check in on IRC (irc://irc.oftc.net/openttd),
-to ask about reasons; or just wait. The problem will most likely solve itself
-within a few days as the problem is noticed and fixed.
-
-An up-to-date version of this README can be found on the wiki:
-http://wiki.openttd.org/Microsoft_Visual_C%2B%2B_2008_Express_Editions
diff --git a/docs/landscape.html b/docs/landscape.html
index f60e859fc3..a345128ea4 100644
--- a/docs/landscape.html
+++ b/docs/landscape.html
@@ -226,7 +226,7 @@
diff --git a/docs/landscape_grid.html b/docs/landscape_grid.html
index d34fe9840c..8519fa990a 100644
--- a/docs/landscape_grid.html
+++ b/docs/landscape_grid.html
@@ -37,6 +37,7 @@ the array so you can quickly see what is used and what is not.
m5 - 8 bits in size, is used for general storage
m6 - 8 bits in size, is used for general storage
m7 - 8 bits in size, is used for general storage
+
m8 - 16 bits in size, is used for general storage
@@ -52,6 +53,7 @@ the array so you can quickly see what is used and what is not.
m5 (8)
m6 (8)
m7 (8)
+
m8 (16)
bits
@@ -64,6 +66,7 @@ the array so you can quickly see what is used and what is not.
7654 3210
7654 3210
7654 3210
+
FEDC BA98 7654 3210
0
@@ -77,6 +80,7 @@ the array so you can quickly see what is used and what is not.
XXXX XXXX
OOOX XXOO
OOOO OOOO
+
OOOO OOOO OOOO OOOO
farmland
@@ -89,6 +93,7 @@ the array so you can quickly see what is used and what is not.
-inherit-
OOOX XXOO
OOOO OOOO
+
OOOO OOOO OOOO OOOO
1
@@ -97,11 +102,12 @@ the array so you can quickly see what is used and what is not.
XXXX XXXX
OOOX XXXX
OOOO XXXX OOOO OOOO
-
OOOO XXXX
+
OOOO OOOO
OOOO XXXX
XXXX XXXX
OOOO OOOO
OOOO OOOO
+
OOOO OOOO OOXX XXXX
rail with signals
@@ -109,11 +115,12 @@ the array so you can quickly see what is used and what is not.
-inherit-
-inherit-
OOOO XXXX XXXX XXXX
-
XXXX XXXX
+
XXXX OOOO
XXXX XXXX
-inherit-
OOOO OOOO
OOOO OOOO
+
-inherit-
depot
@@ -121,11 +128,12 @@ the array so you can quickly see what is used and what is not.
-inherit-
-inherit-
XXXX XXXX XXXX XXXX
-
OOOO XXXX
+
-inherit-
OOOO XXXX
XXOX OOXX
OOOO OOOO
OOOO OOOO
+
-inherit-
2
@@ -139,6 +147,7 @@ the array so you can quickly see what is used and what is not.
XXXX XXXX
OOXX XOOO
XXXO XXXX
+
OOOO OOOO OOOO OOOO
level crossing
@@ -146,11 +155,12 @@ the array so you can quickly see what is used and what is not.
-inherit-
-inherit-
-inherit-
-
XXXX XXXX
-
-inherit-
-
XXXX OOOX
+
XXXX OOOO
+
OOOO OOOO
+
XXXX OOOX
OOXX XOOO
XXXX XXXX
+
OOOO OOOO OOXX XXXX
road depot
@@ -163,6 +173,7 @@ the array so you can quickly see what is used and what is not.
XXOO OOXX
OOOO OOOO
XXXO XXXX
+
OOOO OOOO OOOO OOOO
3
@@ -176,6 +187,7 @@ the array so you can quickly see what is used and what is not.
XXXX XXXX
XXXX XXOO
XXXX XXXX
+
OOOO OOOO OOOO OOOO
4
@@ -189,6 +201,7 @@ the array so you can quickly see what is used and what is not.
XXOO OXXX
OOOO OOOO
OOOO OOOO
+
OOOO OOOO OOOO OOOO
5
@@ -197,11 +210,12 @@ the array so you can quickly see what is used and what is not.
XXXX XXXX
OXXX XXXX
XXXX XXXX XXXX XXXX
-
XXXX XXXX
+
XXXX OOOO
XXXX XXXX
XXXX XXXX
OOXX XXOO
XXXX XXXX
+
OOOO OOOO OOXX XXXX
rail waypoint
@@ -214,6 +228,7 @@ the array so you can quickly see what is used and what is not.
-inherit-
-inherit-
-inherit-
+
-inherit-
road stop
@@ -226,6 +241,7 @@ the array so you can quickly see what is used and what is not.
~~~~ ~XXX
OOXX XOOO
XXOX XXXX
+
OOOO OOOO OOOO OOOO
dock
@@ -238,6 +254,7 @@ the array so you can quickly see what is used and what is not.
~~~~ ~XXX
OOXX XOOO
OOOO OOOO
+
OOOO OOOO OOOO OOOO
airport
@@ -250,6 +267,7 @@ the array so you can quickly see what is used and what is not.
XXXX XXXX
OOXX XOOO
XXXX XXXX
+
OOOO OOOO OOOO OOOO
buoy
@@ -262,6 +280,7 @@ the array so you can quickly see what is used and what is not.
~~~~ ~~~~
OOXX XOOO
OOOO OOOO
+
OOOO OOOO OOOO OOOO
oilrig
@@ -274,6 +293,7 @@ the array so you can quickly see what is used and what is not.
~~~~ ~~~~
OOXX XOOO
OOOO OOOO
+
OOOO OOOO OOOO OOOO
6
@@ -287,6 +307,7 @@ the array so you can quickly see what is used and what is not.
X~~X XXXX
OOOO OOOO
OOOO OOOO
+
OOOO OOOO OOOO OOOO
canal, river
@@ -299,6 +320,7 @@ the array so you can quickly see what is used and what is not.
-inherit-
OOOO OOOO
OOOO OOOO
+
OOOO OOOO OOOO OOOO
shipdepot
@@ -311,6 +333,7 @@ the array so you can quickly see what is used and what is not.
-inherit-
OOOO OOOO
OOOO OOOO
+
OOOO OOOO OOOO OOOO
8
@@ -324,6 +347,7 @@ the array so you can quickly see what is used and what is not.
XXXX XXXX
OOXX XXOO
XXXX XXXX
+
OOOO OOOO OOOO OOOO
9
@@ -332,23 +356,25 @@ the array so you can quickly see what is used and what is not.
XXXX XXXX
OOOX XXXX
OOOO OOOO OOOO OOOO
-
XXXX XXXX
+
XXXX OOOO
OOOO OOOO
XOOX XXXX
OOOO OOOO
XXXX XXXX
+
OOOO OOOO OOXX XXXX
bridge ramp
-inherit-
-inherit-
-inherit-
+
OOOO OOOO OOOO OOOO
-inherit-
-
-inherit-
-
-inherit-
+
OOOO OOOO
-inherit-
OOXX XXOO
-inherit-
+
-inherit-
A
@@ -362,6 +388,7 @@ the array so you can quickly see what is used and what is not.
XXXX XXXX
OOOO OOOO
XXXX XXXX
+
OOOO OOOO OOOO OOOO
diff --git a/known-bugs.txt b/known-bugs.txt
index e12e0a19fe..8d4fd2204b 100644
--- a/known-bugs.txt
+++ b/known-bugs.txt
@@ -1,6 +1,6 @@
OpenTTD's known bugs
-Last updated: 2016-07-01
-Release version: 1.6.1
+Last updated: 2018-11-05
+Release version: 1.9.0
------------------------------------------------------------------------
@@ -14,12 +14,12 @@ Table of contents
---- -----
All bugs listed below are marked as known. Please do not submit any bugs
that are the same as these. If you do, do not act surprised, because
-we WILL flame you!!
+we WILL flame you!
The current list of known bugs that we intend to fix can be found in our
-bug tracking system at: https://github.com/OpenTTD/OpenTTD/issues
-Also check the closed bugs when searching for your bug in this system as
-we might have fixed the bug in the mean time.
+bug tracking system at https://github.com/OpenTTD/OpenTTD/issues
+Also check the closed bugs when searching for your bug in this system as we
+might have fixed the bug in the mean time.
2.0) Known bugs
@@ -29,436 +29,383 @@ reasons why we think that fixing them is infeasible. We might make some
minor improvements that reduce the scope of these bugs, but we will not
be able to completely fix them.
-No suitable AI can be found
- If you have no AIs and an AI is started the so-called 'dummy' AI will
- be loaded. This AI does nothing but writing a message on the AI debug
- window and showing a red warning. There are basically two solutions
- for this problem: Either you set the number of AI players to 0 so that
- no AI is started. You find that setting at the top of the window in the
- "AI / Game Scripts Settings" window.
- The other solution is acquiring (downloading) some AI. The easiest way
- to do this is via the "Check Online Content" button in the main (intro)
- menu or directly in the "AI / Game Scripts Settings" dialogue via the
- "Check Online Content" button.
+No suitable AI can be found:
+ If you have no AIs and an AI is started the so-called 'dummy' AI will
+ be loaded. This AI does nothing but writing a message on the AI debug
+ window and showing a red warning. There are basically two solutions
+ for this problem: Either you set the number of AI players to 0 so that
+ no AI is started. You find that setting at the top of the window in the
+ "AI / Game Scripts Settings" window.
+ The other solution is acquiring (downloading) some AI. The easiest way
+ to do this is via the "Check Online Content" button in the main (intro)
+ menu or directly in the "AI / Game Scripts Settings" dialogue via the
+ "Check Online Content" button.
-After a while of playing, colours get corrupted
- In Windows 7 the background slideshow corrupts the colour mapping of
- OpenTTD's 8bpp screen modes. Workarounds for this are:
- a) Switching to windowed mode, instead of fullscreen
- b) Switching off background slideshow
- c) Setting up the 32bpp-anim or 32bpp-optimized blitter
+After a while of playing, colours get corrupted:
+ In Windows 7 the background slideshow corrupts the colour mapping
+ of OpenTTD's 8bpp screen modes. Workarounds for this are:
+ a) Switching to windowed mode, instead of fullscreen
+ b) Switching off background slideshow
+ c) Setting up the 32bpp-anim or 32bpp-optimized blitter
-Long delay between switching songs/music
- On Windows there is a delay of a (few) second(s) between switching of
- songs for the "win32" driver. This delay is caused by the fact that
- opening a MIDI file via MCI is extremely slow.
+Custom vehicle type name is incorrectly aligned:
+ Some NewGRFs use sprites that are bigger than normal in the "buy
+ vehicle" window. Due to this they have to encode an offset for
+ the vehicle type name. Upon renaming the vehicle type this encoded
+ offset is stripped from the name because the "edit box" cannot show
+ this encoding. As a result the custom vehicle type names will get
+ the default alignment. The only way to (partially) fix this is by
+ adding spaces to the custom name.
- DirectMusic, known as "dmusic" in OpenTTD, has a much shorter delay.
- However, under some circumstances DirectMusic does not reset its
- state properly causing wrongly pitched/bad sounding songs. This
- problem is in DirectMusic as it is reproducable with Microsoft's
- DirectMusic Producer. DirectMusic has been deprecated since 2004
- and as such has no support for 64 bits OpenTTD.
+Clipping problems [#119]:
+ In some cases sprites are not drawn as one would expect. Examples of
+ this are aircraft that might be hidden below the runway or trees that
+ in some cases are rendered over vehicles.
+ The primary cause of this problem is that OpenTTD does not have enough
+ data (like a 3D model) to properly determine what needs to be drawn in
+ front of what. OpenTTD has bounding boxes but in lots of cases they
+ are either too big or too small and then cause problems with what
+ needs to be drawn in front of what. Also some visual tricks are used.
+ For example trains at 8 pixels high, the catenary needs to be drawn
+ above that. When you want to draw bridges on top of that, which are
+ only one height level (= 8 pixels) higher, you are getting into some
+ big problems.
+ We can not change the height levels; it would require us to either
+ redraw all vehicle or all landscape graphics. Doing so would mean we
+ leave the Transport Tycoon graphics, which in effect means OpenTTD
+ will not be a Transport Tycoon clone anymore.
- As a delay is favourable over bad sounding music the "win32" driver
- is the default driver for OpenTTD. You can change this default by
- setting the "musicdriver" in your openttd.cfg to "dmusic".
+Mouse scrolling not possible at the edges of the screen [#383] [#3966]:
+ Scrolling the viewport with the mouse cursor at the edges of the screen
+ in the same direction of the edge will fail. If the cursor is near the
+ edge the scrolling will be very slow.
+ OpenTTD only receives cursor position updates when the cursor is inside
+ OpenTTD's window. It is not told how far you have moved the cursor
+ outside of OpenTTD's window.
-Custom vehicle type name is incorrectly aligned
- Some NewGRFs use sprites that are bigger than normal in the "buy
- vehicle" window. Due to this they have to encode an offset for the
- vehicle type name. Upon renaming the vehicle type this encoded offset
- is stripped from the name because the "edit box" cannot show this
- encoding. As a result the custom vehicle type names will get the
- default alignment. The only way to (partly) fix this is by adding
- spaces to the custom name.
+Lost trains ignore (block) exit signals [#1473]:
+ If trains are lost they ignore block exit signals, blocking junctions
+ with presignals. This is caused because the path finders cannot tell
+ where the train needs to go. As such a random direction is chosen at
+ each junction. This causes the trains to occasionally to make choices
+ that are unwanted from a player's point of view.
+ This will not be fixed because lost trains are in almost all cases a
+ network problem, e.g. a train can never reach a specific place. This
+ makes the impact of fixing the bug enormously small against the amount
+ of work needed to write a system that prevents the lost trains from
+ taking the wrong direction.
-Clipping problems [FS#119]
- In some cases sprites are not drawn as one would expect. Examples of
- this are aircraft that might be hidden below the runway or trees that
- in some cases are rendered over vehicles.
- The primary cause of this problem is that OpenTTD does not have enough
- data (like a 3D model) to properly determine what needs to be drawn in
- front of what. OpenTTD has bounding boxes but in lots of cases they
- are either too big or too small and then cause problems with what
- needs to be drawn in front of what. Also some visual tricks are used.
- For example trains at 8 pixels high, the catenary needs to be drawn
- above that. When you want to draw bridges on top of that, which are
- only one height level (= 8 pixels) higher, you are getting into some
- big problems.
- We can not change the height levels; it would require us to either
- redraw all vehicle or all landscape graphics. Doing so would mean we
- leave the Transport Tycoon graphics, which in effect means OpenTTD
- will not be a Transport Tycoon clone anymore.
+Vehicle owner of last transfer leg gets paid for all [#2427]:
+ When you make a transfer system that switches vehicle owners. This
+ is only possible with 'industry stations', e.g. the oil rig station
+ the owner of the vehicle that does the final delivery gets paid for
+ the whole trip. It is not shared amongst the different vehicle
+ owners that have participated in transporting the cargo.
+ This sharing is not done because it would enormously increase the
+ memory and CPU usage in big games for something that is happening
+ in only one corner case. We think it is not worth the effort until
+ sharing of stations is an official feature.
-Mouse scrolling not possible at the edges of the screen [FS#383] [FS#3966]
- Scrolling the viewport with the mouse cursor at the edges of the screen
- in the same direction of the edge will fail. If the cursor is near the
- edge the scrolling will be very slow.
- OpenTTD only receives cursor position updates when the cursor is inside
- OpenTTD's window. It is not told how far you have moved the cursor
- outside of OpenTTD's window.
+Forbid 90 degree turns does not work for crossing PBS paths [#2737]:
+ When you run a train through itself on a X junction with PBS turned on
+ the train will not obey the 'forbid 90 degree turns' setting. This is
+ due to the fact that we can not be sure that the setting was turned
+ off when the track was reserved, which means that we assume it was
+ turned on and that the setting does not hold at the time. We made it
+ this way to allow one to change the setting in-game, but it breaks
+ slightly when you are running your train through itself. Running a
+ train through means that your network is broken and is thus a user
+ error which OpenTTD tries to graciously handle.
+ Fixing this bug means that we need to record whether this particular
+ setting was turned on or off at the time the reservation was made. This
+ means adding quite a bit of data to the savegame for solving an issue
+ that is basically an user error. We think it is not worth the effort.
-Lost trains ignore (block) exit signals [FS#1473]
- If trains are lost they ignore block exit signals, blocking junctions
- with presignals. This is caused because the path finders cannot tell
- where the train needs to go. As such a random direction is chosen at
- each junction. This causes the trains to occasionally to make choices
- that are unwanted from a player's point of view.
- This will not be fixed because lost trains are in almost all cases a
- network problem, e.g. a train can never reach a specific place. This
- makes the impact of fixing the bug enormously small against the
- amount of work needed to write a system that prevents the lost trains
- from taking the wrong direction.
+Duplicate (station) names after renaming [#3204]:
+ After renaming stations one can create duplicate station names. This
+ is done giving a station the same custom name as another station with
+ an automatically generated name.
+ The major part of this problem is that station names are translatable.
+ Meaning that a station is called e.g. ' Central' in English and
+ ' Centraal' in Dutch. This means that in network games the
+ renaming of a town could cause the rename to succeed on some clients
+ and fail at others. This creates an inconsistent game state that will
+ be seen as a 'desync'. Secondly the custom names are intended to fall
+ completely outside of the '' naming of stations, so when
+ you rename a town all station names are updated accordingly.
+ As a result the decision has been made that all custom names are only
+ compared to the other custom names in the same class and not compared
+ to the automatically generated names.
-Vehicle owner of last transfer leg gets paid for all [FS#2427]
- When you make a transfer system that switches vehicle owners. This
- is only possible with 'industry stations', e.g. the oil rig station
- the owner of the vehicle that does the final delivery gets paid for
- the whole trip. It is not shared amongst the different vehicle
- owners that have participated in transporting the cargo.
- This sharing is not done because it would enormously increase the
- memory and CPU usage in big games for something that is happening
- in only one corner case. We think it is not worth the effort until
- sharing of stations is an official feature.
+Extreme CPU usage/hangs when using SDL and PulseAudio [#3294],
+OpenTTD hangs/freezes when closing, OpenTTD is slow, OpenTTD uses a lot of CPU:
+ OpenTTD can be extremely slow/use a lot of CPU when the sound is
+ played via SDL and then through PulseAudio's ALSA wrapper. Under the
+ same configuration OpenTTD, or rather SDL, might hang when exiting
+ the game. This problem is seen most in Ubuntu 9.04 and higher.
-Forbid 90 degree turns does not work for crossing PBS paths [FS#2737]
- When you run a train through itself on a X junction with PBS turned on
- the train will not obey the 'forbid 90 degree turns' setting. This is
- due to the fact that we can not be sure that the setting was turned
- off when the track was reserved, which means that we assume it was
- turned on and that the setting does not hold at the time. We made it
- this way to allow one to change the setting in-game, but it breaks
- slightly when you are running your train through itself. Running a
- train through means that your network is broken and is thus a user
- error which OpenTTD tries to graciously handle.
- Fixing this bug means that we need to record whether this particular
- setting was turned on or off at the time the reservation was made. This
- means adding quite a bit of data to the savegame for solving an issue
- that is basically an user error. We think it is not worth the effort.
+ This is because recent versions of the PulseAudio sound server
+ are configured to use timer-based audio scheduling rather than
+ interrupt-based audio scheduling. Configuring PulseAudio to force
+ use of interrupt-based scheduling may resolve sound problems for
+ some users. Under recent versions of Ubuntu Linux (9.04 and higher)
+ this can be accomplished by changing the following line in the
+ /etc/pulse/default.pa file:
+ load-module module-udev-detect
+ to
+ load-module module-udev-detect tsched=0
+ Note that PulseAudio must be restarted for changes to take effect. Older
+ versions of PulseAudio may use the module-hal-detect module instead.
+ Adding tsched=0 to the end of that line will have a similar effect.
-Duplicate (station) names after renaming [FS#3204]
- After renaming stations one can create duplicate station names. This
- is done giving a station the same custom name as another station with
- an automatically generated name.
- The major part of this problem is that station names are translatable.
- Meaning that a station is called e.g. ' Central' in English and
- ' Centraal' in Dutch. This means that in network games the
- renaming of a town could cause the rename to succeed on some clients
- and fail at others. This creates an inconsistent game state that will
- be seen as a 'desync'. Secondly the custom names are intended to fall
- completely outside of the '' naming of stations, so when
- you rename a town all station names are updated accordingly.
- As a result the decision has been made that all custom names are only
- compared to the other custom names in the same class and not compared
- to the automatically generated names.
+ Another possible solution is selecting the "pulse" backend of SDL
+ by either using "SDL_AUDIODRIVER=pulse openttd" at the command
+ prompt or installing the 'libsdl1.2debian-pulseaudio' package from
+ Ubuntu's Universe repository. For other distributions a similar
+ package needs to be installed.
-Extreme CPU usage/hangs when using SDL and PulseAudio [FS#3294]
-OpenTTD hangs/freezes when closing, OpenTTD is slow, OpenTTD uses a lot of CPU
- OpenTTD can be extremely slow/use a lot of CPU when the sound is
- played via SDL and then through PulseAudio's ALSA wrapper. Under the
- same configuration OpenTTD, or rather SDL, might hang when exiting
- the game. This problem is seen most in Ubuntu 9.04 and higher.
-
- This is because recent versions of the PulseAudio sound server are
- configured to use timer-based audio scheduling rather than
- interrupt-based audio scheduling. Configuring PulseAudio to force
- use of interrupt-based scheduling may resolve sound problems for
- some users. Under recent versions of Ubuntu Linux (9.04 and higher)
- this can be accomplished by changing the following line in the
- /etc/pulse/default.pa file:
- load-module module-udev-detect
- to
- load-module module-udev-detect tsched=0
- Note that PulseAudio must be restarted for changes to take effect.
- Older versions of PulseAudio may use the module-hal-detect module
- instead. Adding tsched=0 to the end of that line will have a similar
- effect.
-
- Another possible solution is selecting the "pulse" backend of SDL
- by either using "SDL_AUDIODRIVER=pulse openttd" at the command
- prompt or installing the 'libsdl1.2debian-pulseaudio' package from
- Ubuntu's Universe repository. For other distributions a similar
- package needs to be installed.
-
-OpenTTD not properly resizing with SDL on X [FS#3305]
- Under some X window managers OpenTTD's window does not properly
- resize. You will either end up with a black bar at the right/bottom
- side of the window or you cannot see the right/bottom of the window,
- e.g you cannot see the status bar. The problem is that OpenTTD does
- not always receive a resize event from SDL making it impossible for
- OpenTTD to know that the window was resized; sometimes moving the
- window will solve the problem.
- Window managers that are known to exhibit this behaviour are KDE's
- and GNOME's. With the XFCE's and LXDE's window managers the resize
- event is sent when the user releases the mouse.
+OpenTTD not properly resizing with SDL on X [#3305]:
+ Under some X window managers OpenTTD's window does not properly
+ resize. You will either end up with a black bar at the right/bottom
+ side of the window or you cannot see the right/bottom of the window,
+ e.g. you cannot see the status bar. The problem is that OpenTTD does
+ not always receive a resize event from SDL making it impossible for
+ OpenTTD to know that the window was resized; sometimes moving the
+ window will solve the problem.
+ Window managers that are known to exhibit this behaviour are GNOME's
+ and KDE's. With the XFCE's and LXDE's window managers the resize
+ event is sent when the user releases the mouse.
Incorrect colours, crashes upon exit, debug warnings and smears upon
-window resizing with SDL on Mac OS X [FS#3447]
- Video handling with (lib)SDL under Mac OS X is known to fail on some
- versions of Mac OS X with some hardware configurations. Some of the
- problems happen only under some circumstances whereas others are
- always present.
- We suggest that the SDL video/sound backend is not used for OpenTTD
- in combinations with Mac OS X.
+window resizing with SDL on macOS [#3447]:
+ Video handling with (lib)SDL under macOS is known to fail on some
+ versions of macOS with some hardware configurations. Some of
+ the problems happen only under some circumstances whereas others
+ are always present.
+ We suggest that the SDL video/sound backend is not used for OpenTTD
+ in combinations with macOS.
-Train crashes entering same junction from block and path signals [FS#3928]
- When a train has reserved a path from a path signal to a two way
- block signal and the reservation passes a path signal through the
- back another train can enter the reserved path (only) via that same
- two way block signal.
- The reason for this has to do with optimisation; to fix this issue
- the signal update has to pass all path signals until it finds either
- a train or a backwards facing signal. This is a very expensive task.
- The (signal) setups that allow these crashes can furthermore be
- considered incorrectly signalled; one extra safe waiting point for
- the train entering from path signal just after the backwards facing
- signal (from the path signal train) resolves the issue.
+Train crashes entering same junction from block and path signals [#3928]:
+ When a train has reserved a path from a path signal to a two way
+ block signal and the reservation passes a path signal through the
+ back another train can enter the reserved path (only) via that
+ same two way block signal.
+ The reason for this has to do with optimisation; to fix this issue
+ the signal update has to pass all path signals until it finds either
+ a train or a backwards facing signal. This is a very expensive task.
+ The (signal) setups that allow these crashes can furthermore be
+ considered incorrectly signalled; one extra safe waiting point for
+ the train entering from path signal just after the backwards facing
+ signal (from the path signal train) resolves the issue.
-Crashes when playing music [FS#3941]
- Mac OS X's QuickTime (default music driver) and Windows' MCI (win32
- music driver) crash on some songs from OpenMSX. OpenTTD cannot do
- anything about this. Please report these crashes to the authors of
- OpenMSX so the crash causing songs can be removed or fixed.
+Crashes when run in a VM using Parallels Desktop [#4003]:
+ When the Windows version of OpenTTD is executed in a VM under
+ Parallels Desktop a privileged instruction exception may be thrown.
+ As OpenTTD works natively on macOS as well as natively on Windows and
+ these native builds both don't exhibit this behaviour this crash is
+ most likely due to a bug in the virtual machine, something out of
+ the scope of OpenTTD. Most likely this is due to Parallels Desktop
+ lacking support for RDTSC calls. The problem can be avoided by using
+ other VM-software, Wine, or running natively on macOS.
-Crashes when run in a VM using Parallels Desktop [FS#4003]
- When the Windows version of OpenTTD is executed in a VM under
- Parallels Desktop a privileged instruction exception may be thrown.
- As OpenTTD works natively on OSX as well as natively on Windows and
- these native builds both don't exhibit this behaviour this crash is
- most likely due to a bug in the virtual machine, something out of
- the scope of OpenTTD. Most likely this is due to Parallels Desktop
- lacking support for RDTSC calls. The problem can be avoided by using
- other VM-software, Wine, or running natively on OSX.
+Entry- and exit signals are not dragged [#4378]:
+ Unlike all other signal types, the entry- and exit signals are not
+ dragged but instead normal signals are placed on subsequent track
+ sections. This is done on purpose as this is the usually more
+ convenient solution. There are little to no occasions where more
+ than one entry or exit signal in a row are useful. This is different
+ for all other signal types where several in a row can serve one
+ purpose or another.
-OpenTTD hangs when started on 32 bits Windows [FS#4083]
- Under some circumstances OpenTTD might hang for hours on the
- initialisation of the music driver. The exact circumstances are
- unknown except that it is the "dmusic" music driver that has the
- problem and that the "win32" music driver does not.
- As a result using the "win32" music driver will work around this
- issue.
+Station build date is incorrect [#4415]:
+ The tile query tool will show the date of the last (re)construction
+ at the station and not the date of the first construction. This is
+ due to compatability reasons with NewGRFs and the fact that it is
+ wrong to say that the station is built in a particular year when it
+ was completely destroyed/rebuilt later on.
+ The tile query tool can be fixed by changing the "Build date" text
+ to "Date at which the last (re)construction took place" but this is
+ deemed too specific and long for that window.
- As the exact circumstances are unknown, and the obvious
- configuration settings related to the music driver are at their
- default we are not able to detect this failure, except when Windows'
- music initialisation function returns after several hours and then
- there is no point in switching the music driver anymore.
- The reason we still use the "win32" music driver as default are
- described in the "Long delay between switching music/song" section
- of this document.
+(Temporary) wrong colours when switching to full screen [#4511]:
+ On Windows it can happen that you temporarily see wrong colours
+ when switching to full screen OpenTTD, either by starting
+ OpenTTD in full screen mode, changing to full screen mode or by
+ ALT-TAB-ing into a full screen OpenTTD. This is caused by the
+ fact that OpenTTD, by default, uses 8bpp paletted output. The
+ wrong colours you are seeing is a temporary effect of the video
+ driver switching to 8bpp palette mode.
-Pre- and exit signals are not dragged [FS#4378]
- Unlike all other signal types, the entry- and exit signals are not
- dragged but instead normal signals are placed on subsequent track
- sections. This is done on purpose as this is the usually more con-
- venient solution. There are little to no occasions where more than
- one entry or exit signal in a row are useful. This is different
- for all other signal types where several in a row can serve one
- purpose or another.
+ This issue can be worked around in two ways:
+ a) Setting fullscreen_bpp to 32
+ b) Setting up the 32bpp-anim or 32bpp-optimized blitter
-Station build date is incorrect [FS#4415]
- The tile query tool will show the date of the last (re)construction
- at the station and not the date of the first construction. This is
- due to compatability reasons with NewGRFs and the fact that it is
- wrong to say that the station is built in a particular year when it
- was completely destroyed/rebuilt later on.
- The tile query tool can be fixed by changing the "Build date" text
- to "Date at which the last (re)construction took place" but this is
- deemed too specific and long for that window.
+Can't run OpenTTD with the -d option from a MSYS console [#4587]:
+ The MSYS console does not allow OpenTTD to open an extra console for
+ debugging output. Compiling OpenTTD with the --enable-console
+ configure option prevents this issue and allows the -d option to use
+ the MSYS console for its output.
-Can't change volume inside OpenTTD [FS#4416]
- Some backends do not provide a means to change the volume of sound
- effects or music. The mixing of music and sound is left to external
- libraries/the operating system we can't handle the volume control
- in OpenTTD. As a result you can't change the volume inside OpenTTD
- for backends such as SDL; just use the volume control provided by
- your operating system.
+Unreadable characters for non-latin locales [#4607]:
+ OpenTTD does not ship a non-latin font in its graphics files. As a
+ result OpenTTD needs to acquire the font from somewhere else. What
+ OpenTTD does is ask the operating system, or a system library, for
+ the best font for a given language if the currently loaded font
+ does not provide all characters of the chosen translation. This
+ means that OpenTTD has no influence over the quality of the chosen
+ font; it just does the best it can do.
-Can't run OpenTTD with the -d option from a MSYS console [FS#4587]
- The MSYS console does not allow OpenTTD to open an extra console for
- debugging output. Compiling OpenTTD with the --enable-console
- configure option prevents this issue and allows the -d option to use
- the MSYS console for its output.
+ If the text is unreadable there are several steps that you can take
+ to improve this. The first step is finding a good font and configure
+ this in the configuration file. See section 9.0 of README.md for
+ more information. You can also increase the font size to make the
+ characters bigger and possible better readable.
-Unreadable characters for non-latin locales [FS#4607]
- OpenTTD does not ship a non-latin font in its graphics files. As a
- result OpenTTD needs to acquire the font from somewhere else. What
- OpenTTD does is ask the operating system, or a system library, for
- the best font for a given language if the currently loaded font
- does not provide all characters of the chosen translation. This
- means that OpenTTD has no influence over the quality of the chosen
- font; it just does the best it can do.
+ If the problem is with the clarity of the font you might want to
+ enable anti-aliasing by setting the small_aa/medium_aa/large_aa
+ settings to "true". However, anti-aliasing only works when a 32-bit
+ blitter has been selected, e.g. blitter = "32bpp-anim", as with the
+ 8 bits blitter there are not enough colours to properly perform the
+ anti-aliasing.
- If the text is unreadable there are several steps that you can take
- to improve this. The first step is finding a good font and configure
- this in the configuration file. See section 9.0 of readme.txt for
- more information. You can also increase the font size to make the
- characters bigger and possible better readable.
+Train does not crash with itself [#4635]:
+ When a train drives in a circle the front engine passes through
+ wagons of the same train without crashing. This is intentional.
+ Signals are only aware of tracks, they do not consider the train
+ length and whether there would be enough room for a train in some
+ circle it might drive on. Also the path a train might take is not
+ necessarily known when passing a signal.
+ Checking all circumstances would take a lot of additional
+ computational power for signals, which is not considered worth
+ the effort, as it does not add anything to gameplay.
+ Nevertheless trains shall not crash in normal operation, so making
+ a train not crash with itself is the best solution for everyone.
- If the problem is with the clarity of the font you might want to
- enable anti-aliasing by setting the small_aa/medium_aa/large_aa
- settings to "true". However, anti-aliasing only works when a 32 bits
- blitter has been selected, e.g. blitter = "32bpp-anim", as with the
- 8 bits blitter there are not enough colours to properly perform the
- anti-aliasing.
+Aircraft coming through wall in rotated airports [#4705]:
+ With rotated airports, specifically hangars, you will see that the
+ aircraft will show a part through the back wall of the hangar.
+ This can be solved by only drawing a part of the plane when being
+ at the back of the hangar, however then with transparency turned on
+ the aircraft would be shown partially which would be even weirder.
+ As such the current behaviour is deemed the least bad.
+ The same applies to overly long ships and their depots.
-(Temporary) wrong colours when switching to full screen [FS#4511]:
- On Windows it can happen that you temporarily see wrong colours
- when switching to full screen OpenTTD, either by starting
- OpenTTD in full screen mode, changing to full screen mode or by
- ALT-TAB-ing into a full screen OpenTTD. This is caused by the
- fact that OpenTTD, by default, uses 8bpp paletted output. The
- wrong colours you are seeing is a temporary effect of the video
- driver switching to 8bpp palette mode.
+Vehicles not keeping their "maximum" speed [#4815]:
+ Vehicles that have not enough power to reach and maintain their
+ advertised maximum speed might be constantly jumping between two
+ speeds. This is due to the fact that speed and its calculations
+ are done with integral numbers instead of floating point numbers.
+ As a result of this a vehicle will never reach its equilibrium
+ between the drag/friction and propulsion. So in effect it will be
+ in a vicious circle of speeding up and slowing down due to being
+ just at the other side of the equilibrium.
- This issue can be worked around in two ways:
- a) Setting fullscreen_bpp to 32
- b) Setting up the 32bpp-anim or 32bpp-optimized blitter
+ Not speeding up when near the equilibrium will cause the vehicle to
+ never come in the neighbourhood of the equilibrium and not slowing
+ down when near the equilibrium will cause the vehicle to never slow
+ down towards the equilibrium once it has come down a hill.
-Train does not crash with itself [FS#4635]:
- When a train drives in a circle the front engine passes through
- wagons of the same train without crashing. This is intentional.
- Signals are only aware of tracks, they do not consider the train
- length and whether there would be enough room for a train in some
- circle it might drive on. Also the path a train might take is not
- necessarily known when passing a signal.
- Checking all circumstances would take a lot of additional computational
- power for signals, which is not considered worth the effort, as
- it does not add anything to gameplay.
- Nevertheless trains shall not crash in normal operation, so making
- a train not crash with itself is the best solution for everyone.
+ It is possible to calculate whether the equilibrium will be passed,
+ but then all acceleration calculations need to be done twice.
-Aircraft coming through wall in rotated airports [FS#4705]:
- With rotated airports, specifically hangars, you will see that the
- aircraft will show a part through the back wall of the hangar.
- This can be solved by only drawing a part of the plane when being
- at the back of the hangar, however then with transparency turned on
- the aircraft would be shown partially which would be even weirder.
- As such the current behaviour is deemed the least bad.
- The same applies to overly long ships and their depots.
+Settings not saved when OpenTTD crashes [#4846]:
+ The settings are not saved when OpenTTD crashes for several reasons.
+ The most important is that the game state is broken and as such the
+ settings might contain invalid values, or the settings have not even
+ been loaded yet. This would cause invalid or totally wrong settings
+ to be written to the configuration file.
-Vehicles not keeping their "maximum" speed [FS#4815]:
- Vehicles that have not enough power to reach and maintain their
- advertised maximum speed might be constantly jumping between two
- speeds. This is due to the fact that speed and its calculations
- are done with integral numbers instead of floating point numbers.
- As a result of this a vehicle will never reach its equilibrium
- between the drag/friction and propulsion. So in effect it will be
- in a vicious circle of speeding up and slowing down due to being
- just at the other side of the equilibrium.
+ A solution to that would be saving the settings whenever one changes,
+ however due to the way the configuration file is saved this requires
+ a flush of the file to the disk and OpenTTD needs to wait till that
+ is finished. On some file system implementations this causes the
+ flush of all 'write-dirty' caches, which can be a significant amount
+ of data to be written. This can further be aggravated by spinning
+ down disks to conserve power, in which case this disk needs to be
+ spun up first. This means that many seconds may pass before the
+ configuration file is actually written, and all that time OpenTTD
+ will not be able to show any progress. Changing the way the
+ configuration file is saved is not an option as that leaves us more
+ vulnerable to corrupt configuration files.
- Not speeding up when near the equilibrium will cause the vehicle
- to never come in the neighbourhood of the equilibrium and not
- slowing down when near the equilibrium will cause the vehicle
- to never slow down towards the equilibrium once it has come down
- a hill.
+ Finally, crashes should not be happening. If they happen they should
+ be reported and fixed, so essentially fixing this is fixing the wrong
+ thing. If you really need the configuration changes to be saved,
+ and you need to run a version that crashes regularly, then you can
+ use the 'saveconfig' command in the console to save the settings.
- It is possible to calculate whether the equilibrium will be
- passed, but then all acceleration calculations need to be done
- twice.
+Not all NewGRFs, AIs, game scripts are found [#4887]:
+ Under certain situations, where the path for the content within a
+ tar file is the same as other content on the file system or in another
+ tar file, it is possible that content is not found. A more thorough
+ explanation and solutions are described in section 4.4 of README.md.
-Settings not saved when OpenTTD crashes [FS#4846]:
- The settings are not saved when OpenTTD crashes for several reasons.
- The most important is that the game state is broken and as such the
- settings might contain invalid values, or the settings have not even
- been loaded yet. This would cause invalid or totally wrong settings
- to be written to the configuration file.
+Mouse cursor going missing with SDL [#4997]:
+ Under certain circumstances SDL does not notify OpenTTD of changes with
+ respect to the mouse pointer, specifically whether the mouse pointer
+ is within the bounds of OpenTTD or not. For example, if you "Alt-Tab"
+ to another application the mouse cursor will still be shown in OpenTTD,
+ and when you move the mouse outside of the OpenTTD window so the cursor
+ gets hidden, open/move another application on top of the OpenTTD window
+ and then Alt-tab back into OpenTTD the cursor will not be shown.
- A solution to that would be saving the settings whenever one changes,
- however due to the way the configuration file is saved this requires
- a flush of the file to the disk and OpenTTD needs to wait till that
- is finished. On some file system implementations this causes the
- flush of all 'write-dirty' caches, which can be a significant amount
- of data to be written. This can further be aggravated by spinning
- down disks to conserve power, in which case this disk needs to be
- spun up first. This means that many seconds may pass before the
- configuration file is actually written, and all that time OpenTTD
- will not be able to show any progress. Changing the way the
- configuration file is saved is not an option as that leaves us more
- vulnerable to corrupt configuration files.
+ We cannot fix this problem as SDL simply does not provide the required
+ information in these corner cases. This is a bug in SDL and as such
+ there is little that we can do about it.
- Finally, crashes should not be happening. If they happen they should
- be reported and fixed, so essentially fixing this is fixing the
- wrong thing. If you really need the configuration changes to be
- saved, and you need to run a version that crashes regularly, then
- you can use the 'saveconfig' command in the console to save the
- settings.
+Trains might not stop at platforms that are currently being changed [#5553]:
+ If you add tiles to or remove tiles from a platform while a train is
+ approaching to stop at the same platform, that train can miss the place
+ where it's supposed to stop and pass the station without stopping.
+ This is caused by the fact that the train is considered to already
+ have stopped if it's beyond its assigned stopping location. We can't
+ let the train stop just anywhere in the station because then it would
+ never leave the station if you have the same station in the order
+ list multiple times in a row or if there is only one station
+ in theorder list (see #5684).
-Not all NewGRFs, AIs, game scripts are found [FS#4887]:
- Under certain situations, where the path for the content within a
- tar file is the same as other content on the file system or in another
- tar file, it is possible that content is not found. A more thorough
- explanation and solutions are described in section 4.4 of readme.txt.
+Inconsistent catchment areas [#5661]:
+ Due to performance decisions the catchment area for cargo accepted by a
+ station for delivery to houses or industries differs from the catchment
+ area for cargo that is delivered to stations from houses or industries.
-Mouse cursor going missing with SDL [FS#4997]:
- Under certain circumstances SDL does not notify OpenTTD of changes
- with respect to the mouse pointer, specifically whether the mouse
- pointer is within the bounds of OpenTTD or not. For example, if you
- Alt-tab to another application the mouse cursor will still be shown
- in OpenTTD, and when you move the mouse outside of the OpenTTD
- window so the cursor gets hidden, open/move another application on
- top of the OpenTTD window and then Alt-tab back into OpenTTD the
- cursor will not be shown.
+ Conceptually they work the same, but the effect in game differs. They
+ work by finding the closest destination "around" the source which is
+ within a certain distance. This distance depends on the type of station,
+ e.g. road stops have a smaller catchment area than large airports.
+ In both cases the bounding box, the smallest rectangle that contains
+ all tiles of something, is searched for the target of the cargo,
+ and then spiraling outwards finding the closest tile of the target.
- We cannot fix this problem as SDL simply does not provide the
- required information in these corner cases. This is a bug in SDL
- and as such there is little that we can do about it.
+ In the case of a station with two tiles spread far apart with a house
+ that is within the station's bounding box, it would be possible that
+ the spiraling search from the house does not reach one of the station
+ tiles before the search ends, i.e. all tiles within that distance
+ are searched. So the house does not deliver cargo to the station.
+ On the other hand, the station will deliver cargo because the house
+ falls within the bounding box, and thus search area.
-Inconsistent catchment areas [FS#5661]:
- Due to performance decisions the catchment area for cargo accepted
- by a station for delivery to houses or industries differs from the
- catchment area for cargo that is delivered to stations from houses
- or industries.
+ It is possible to make these consistent, but then cargo from a house
+ to a station needs to search up to 32 tiles around itself, i.e. 64
+ by 64 tiles, to find all possible stations it could deliver to
+ instead of 10 by 10 tiles (40 times more tiles). Alternatively the
+ search from a station could be changed to use the actual tiles, but
+ that would require considering checking 10 by 10 tiles for each of
+ the tiles of a station, instead of just once.
- Conceptually they work the same, but the effect in game differs.
- They work by finding the closest destination "around" the source
- which is within a certain distance. This distance depends on the
- type of station, e.g. road stops have a smaller catchment area than
- large airports. In both cases the bounding box, the smallest
- rectangle that contains all tiles of something, is searched for the
- target of the cargo, and then spiraling outwards finding the closest
- tile of the target.
+Some houses and industries are not affected by transparency [#5817]:
+ Some of the default houses and industries (f.e. the iron ore mine) are
+ not affected by the transparency options. This is because the graphics
+ do not (completely) separate the ground from the building.
+ This is a bug of the original graphics, and unfortunately cannot be
+ fixed with OpenGFX for the sake of maintaining compatibility with
+ the original graphics.
- In the case of a station with two tiles spread far apart with a house
- that is within the station's bounding box, it would be possible that
- the spiraling search from the house does not reach one of the station
- tiles before the search ends, i.e. all tiles within that distance
- are searched. So the house does not deliver cargo to the station. On
- the other hand, the station will deliver cargo because the house
- falls within the bounding box, and thus search area.
-
- It is possible to make these consistent, but then cargo from a house
- to a station needs to search up to 32 tiles around itself, i.e. 64
- by 64 tiles, to find all possible stations it could deliver to
- instead of 10 by 10 tiles (40 times more tiles). Alternatively the
- search from a station could be changed to use the actual tiles, but
- that would require considering checking 10 by 10 tiles for each of
- the tiles of a station, instead of just once.
-
-Trains might not stop at platforms that are currently being changed [FS#5553]:
- If you add tiles to or remove tiles from a platform while a train is
- approaching to stop at the same platform, that train can miss the place
- where it's supposed to stop and pass the station without stopping. This
- is caused by the fact that the train is considered to already have stopped
- if it's beyond its assigned stopping location. We can't let the train stop
- just anywhere in the station because then it would never leave the station
- if you have the same station in the order list multiple times in a row or
- if there is only one station in the order list (see FS#5684).
-
-Some houses and industries are not affected by transparency [FS#5817]:
- Some of the default houses and industries (f.e. the iron ore mine) are
- not affected by the transparency options. This is because the graphics do
- not (completely) separate the ground from the building.
- This is a bug of the original graphics, and unfortunately cannot be
- fixed with OpenGFX for the sake of maintaining compatibility with the
- original graphics.
-
-Involuntary cargo exchange with cargodist via neutral station [FS#6114]:
- When two players serve a neutral station at an industry, a cross-company
- chain for cargo flow can and will be established which can only be
- interrupted if one of the players stops competing for the ressources of
- that industry. There is an easy fix for this: If you are loading at the
- shared station make the order "no unload" and if you're unloading make
- it "no load". Cargodist will then figure out that it should not create
- such a route.
+Involuntary cargo exchange with cargodist via neutral station [#6114]:
+ When two players serve a neutral station at an industry, a cross-company
+ chain for cargo flow can and will be established which can only be
+ interrupted if one of the players stops competing for the ressources of
+ that industry. There is an easy fix for this: If you are loading at the
+ shared station make the order "no unload" and if you're unloading make
+ it "no load". Cargodist will then figure out that it should not create
+ such a route.
diff --git a/media/extra_grf/openttdgui.png b/media/extra_grf/openttdgui.png
index 710adf001b..900a612a87 100644
Binary files a/media/extra_grf/openttdgui.png and b/media/extra_grf/openttdgui.png differ
diff --git a/os/debian/changelog b/os/debian/changelog
index ce2582128c..bb57ca39e8 100644
--- a/os/debian/changelog
+++ b/os/debian/changelog
@@ -1,3 +1,15 @@
+openttd (1.8.0-0) unstable; urgency=low
+
+ * New upstream release 1.8.0
+
+ -- OpenTTD Sun, 01 Apr 2018 14:00:00 +0200
+
+openttd (1.8.0~RC1-0) unstable; urgency=low
+
+ * New upstream release 1.8.0-RC1
+
+ -- OpenTTD Wed, 21 Mar 2018 21:00:00 +0100
+
openttd (1.7.2-0) unstable; urgency=low
* New upstream release 1.7.2
@@ -1002,4 +1014,3 @@ openttd (0.3.5-1) unstable; urgency=low
* Initial Release.
-- Matthijs Kooijman Fri, 24 Dec 2004 02:58:47 +0100
-
diff --git a/projects/generate b/projects/generate
index 28fd255527..af59a83fb2 100755
--- a/projects/generate
+++ b/projects/generate
@@ -40,28 +40,6 @@ fi
# generate_vs140.vcxproj is for MSVC 2015
# version_vs140.vcxproj is for MSVC 2015
-# openttd_vs100.sln is for MSVC 2010
-# openttd_vs100.vcxproj is for MSVC 2010
-# openttd_vs100.vcxproj.filters is for MSVC 2010
-# langs_vs100.vcxproj is for MSVC 2010
-# strgen_vs100.vcxproj is for MSVC 2010
-# strgen_vs100.vcxproj.filters is for MSVC 2010
-# generate_vs100.vcxproj is for MSVC 2010
-# version_vs100.vcxproj is for MSVC 2010
-
-# openttd_vs90.sln is for MSVC 2008
-# openttd_vs90.vcproj is for MSVC 2008
-# langs_vs90.vcproj is for MSVC 2008
-# strgen_vs90.vcproj is for MSVC 2008
-# generate_vs90.vcproj is for MSVC 2008
-# version_vs90.vcproj is for MSVC 2008
-
-# openttd_vs80.sln is for MSVC 2005
-# openttd_vs80.vcproj is for MSVC 2005
-# langs_vs80.vcproj is for MSVC 2005
-# strgen_vs80.vcproj is for MSVC 2005
-# generate_vs80.vcproj is for MSVC 2005
-# version_vs80.vcproj is for MSVC 2005
@@ -74,6 +52,7 @@ enable_dedicated="0"
enable_ai="1"
with_cocoa="0"
enable_directmusic="1"
+enable_fluidsynth="0"
with_threads="1"
file_prefix="..\\\\src\\\\"
@@ -132,6 +111,7 @@ load_main_data() {
"'$os'" != "CYGWIN" && "'$os'" != "MSVC" ) { next; }
if ($0 == "MSVC" && "'$os'" != "MSVC") { next; }
if ($0 == "DIRECTMUSIC" && "'$enable_directmusic'" != "1") { next; }
+ if ($0 == "FLUIDSYNTH" && "'$enable_fluidsynth'" != "1") { next; }
if ($0 == "LIBTIMIDITY" && "'$libtimidity'" == "" ) { next; }
if ($0 == "HAVE_THREAD" && "'$with_threads'" == "0") { next; }
@@ -320,26 +300,14 @@ settingscommand=`echo "$settings" | grep "^#3" | sed "s~#3~~g"`
settingsvcxproj=`echo "$settings" | grep "^#2" | sed "s~#2~~g"`
settings=`echo "$settings" | grep "^#1" | sed "s~#1~~g"`
-generate "$openttd" "openttd_vs80.vcproj"
-generate "$openttd" "openttd_vs90.vcproj"
-generate "$openttdvcxproj" "openttd_vs100.vcxproj"
-generate "$openttdfiles" "openttd_vs100.vcxproj.filters" "$openttdfilters"
generate "$openttdvcxproj" "openttd_vs140.vcxproj"
generate "$openttdfiles" "openttd_vs140.vcxproj.filters" "$openttdfilters"
generate "$openttdvcxproj" "openttd_vs141.vcxproj"
generate "$openttdfiles" "openttd_vs141.vcxproj.filters" "$openttdfilters"
-generate "$lang" "langs_vs80.vcproj"
-generate "$lang" "langs_vs90.vcproj"
-generate "$langvcxproj" "langs_vs100.vcxproj"
-generate "$langfiles" "langs_vs100.vcxproj.filters"
generate "$langvcxproj" "langs_vs140.vcxproj"
generate "$langfiles" "langs_vs140.vcxproj.filters"
generate "$langvcxproj" "langs_vs141.vcxproj"
generate "$langfiles" "langs_vs141.vcxproj.filters"
-generate "$settings" "settings_vs80.vcproj" "$settingscommand"
-generate "$settings" "settings_vs90.vcproj" "$settingscommand"
-generate "$settingsvcxproj" "settings_vs100.vcxproj" "$settingscommand"
-generate "$settingsfiles" "settings_vs100.vcxproj.filters"
generate "$settingsvcxproj" "settings_vs140.vcxproj" "$settingscommand"
generate "$settingsfiles" "settings_vs140.vcxproj.filters"
generate "$settingsvcxproj" "settings_vs141.vcxproj" "$settingscommand"
diff --git a/projects/generate.vbs b/projects/generate.vbs
index a2f4679a69..5439ed7c0d 100755
--- a/projects/generate.vbs
+++ b/projects/generate.vbs
@@ -28,29 +28,6 @@ Set FSO = CreateObject("Scripting.FileSystemObject")
' generate_vs140.vcxproj is for MSVC 2015
' version_vs140.vcxproj is for MSVC 2015
-' openttd_vs100.sln is for MSVC 2010
-' openttd_vs100.vcxproj is for MSVC 2010
-' openttd_vs100.vcxproj.filters is for MSVC 2010
-' langs_vs100.vcxproj is for MSVC 2010
-' strgen_vs100.vcxproj is for MSVC 2010
-' strgen_vs100.vcxproj.filters is for MSVC 2010
-' generate_vs100.vcxproj is for MSVC 2010
-' version_vs100.vcxproj is for MSVC 2010
-
-' openttd_vs90.sln is for MSVC 2008
-' openttd_vs90.vcproj is for MSVC 2008
-' langs_vs90.vcproj is for MSVC 2008
-' strgen_vs90.vcproj is for MSVC 2008
-' generate_vs90.vcproj is for MSVC 2008
-' version_vs90.vcproj is for MSVC 2008
-
-' openttd_vs80.sln is for MSVC 2005
-' openttd_vs80.vcproj is for MSVC 2005
-' langs_vs80.vcproj is for MSVC 2005
-' strgen_vs80.vcproj is for MSVC 2005
-' generate_vs80.vcproj is for MSVC 2005
-' version_vs80.vcproj is for MSVC 2005
-
Sub safety_check(filename)
Dim file, line, regexp, list
@@ -383,10 +360,6 @@ headers_check ROOT_DIR & "/source.list", ROOT_DIR & "\src\" ' Backslashes needed
Dim openttd, openttdvcxproj, openttdfilters, openttdfiles
openttd = load_main_data(ROOT_DIR & "/source.list", openttdvcxproj, openttdfilters, openttdfiles)
-generate openttd, ROOT_DIR & "/projects/openttd_vs80.vcproj", Null
-generate openttd, ROOT_DIR & "/projects/openttd_vs90.vcproj", Null
-generate openttdvcxproj, ROOT_DIR & "/projects/openttd_vs100.vcxproj", Null
-generate openttdfiles, ROOT_DIR & "/projects/openttd_vs100.vcxproj.filters", openttdfilters
generate openttdvcxproj, ROOT_DIR & "/projects/openttd_vs140.vcxproj", Null
generate openttdfiles, ROOT_DIR & "/projects/openttd_vs140.vcxproj.filters", openttdfilters
generate openttdvcxproj, ROOT_DIR & "/projects/openttd_vs141.vcxproj", Null
@@ -394,10 +367,6 @@ generate openttdfiles, ROOT_DIR & "/projects/openttd_vs141.vcxproj.filters", ope
Dim lang, langvcxproj, langfiles
lang = load_lang_data(ROOT_DIR & "/src/lang", langvcxproj, langfiles)
-generate lang, ROOT_DIR & "/projects/langs_vs80.vcproj", Null
-generate lang, ROOT_DIR & "/projects/langs_vs90.vcproj", Null
-generate langvcxproj, ROOT_DIR & "/projects/langs_vs100.vcxproj", Null
-generate langfiles, ROOT_DIR & "/projects/langs_vs100.vcxproj.filters", Null
generate langvcxproj, ROOT_DIR & "/projects/langs_vs140.vcxproj", Null
generate langfiles, ROOT_DIR & "/projects/langs_vs140.vcxproj.filters", Null
generate langvcxproj, ROOT_DIR & "/projects/langs_vs141.vcxproj", Null
@@ -405,10 +374,6 @@ generate langfiles, ROOT_DIR & "/projects/langs_vs141.vcxproj.filters", Null
Dim settings, settingsvcxproj, settingscommand, settingsfiles
settings = load_settings_data(ROOT_DIR & "/src/table", settingsvcxproj, settingscommand, settingsfiles)
-generate settings, ROOT_DIR & "/projects/settings_vs80.vcproj", settingscommand
-generate settings, ROOT_DIR & "/projects/settings_vs90.vcproj", settingscommand
-generate settingsvcxproj, ROOT_DIR & "/projects/settings_vs100.vcxproj", settingscommand
-generate settingsfiles, ROOT_DIR & "/projects/settings_vs100.vcxproj.filters", Null
generate settingsvcxproj, ROOT_DIR & "/projects/settings_vs140.vcxproj", settingscommand
generate settingsfiles, ROOT_DIR & "/projects/settings_vs140.vcxproj.filters", Null
generate settingsvcxproj, ROOT_DIR & "/projects/settings_vs141.vcxproj", settingscommand
diff --git a/projects/generate_vs100.vcxproj b/projects/generate_vs100.vcxproj
deleted file mode 100644
index 4417308e60..0000000000
--- a/projects/generate_vs100.vcxproj
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
-
- Debug
- Win32
-
-
-
- generate
- {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}
- generate
-
-
-
- Utility
-
-
-
-
-
-
-
-
-
- <_ProjectFileVersion>10.0.30319.1
-
-
-
-
-
- Document
- Running %27generate.vbs%27 ...
- cscript "$(ProjectDir)generate.vbs"
- %(FullPath);%(AdditionalInputs)
- $(SolutionDir)openttd_vs80.vcproj;$(SolutionDir)openttd_vs90.vcproj;$(SolutionDir)openttd_vs100.vcxproj;$(SolutionDir)openttd_vs100.vcxproj.filters;$(SolutionDir)langs_vs80.vcproj;$(SolutionDir)langs_vs90.vcproj;$(SolutionDir)langs_vs100.vcxproj;%(Outputs)
-
-
-
-
-
-
diff --git a/projects/generate_vs140.vcxproj b/projects/generate_vs140.vcxproj
index 67b1b7712c..e505315153 100644
--- a/projects/generate_vs140.vcxproj
+++ b/projects/generate_vs140.vcxproj
@@ -37,4 +37,4 @@
-
\ No newline at end of file
+
diff --git a/projects/generate_vs80.vcproj b/projects/generate_vs80.vcproj
deleted file mode 100644
index bc0b6c44c7..0000000000
--- a/projects/generate_vs80.vcproj
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/projects/generate_vs90.vcproj b/projects/generate_vs90.vcproj
deleted file mode 100644
index dc7b3e2f56..0000000000
--- a/projects/generate_vs90.vcproj
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/projects/langs_vs100.vcxproj b/projects/langs_vs100.vcxproj
deleted file mode 100644
index 88cce9e105..0000000000
--- a/projects/langs_vs100.vcxproj
+++ /dev/null
@@ -1,390 +0,0 @@
-
-
-
-
- Debug
- Win32
-
-
-
- langs
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}
- langs
- MakeFileProj
-
-
-
- Utility
- false
-
-
-
-
-
-
-
-
-
- <_ProjectFileVersion>10.0.30319.1
- ..\bin\lang\
- ..\objs\langs\
-
-
-
- Generating strings.h
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\objs\langs\table
-
-
- ./langs.tlb
-
-
-
-
-
-
- Generating english language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\english.lng;%(Outputs)
-
-
- Generating afrikaans language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\afrikaans.lng;%(Outputs)
-
-
- Generating arabic_egypt language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\arabic_egypt.lng;%(Outputs)
-
-
- Generating basque language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\basque.lng;%(Outputs)
-
-
- Generating belarusian language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\belarusian.lng;%(Outputs)
-
-
- Generating brazilian_portuguese language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\brazilian_portuguese.lng;%(Outputs)
-
-
- Generating bulgarian language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\bulgarian.lng;%(Outputs)
-
-
- Generating catalan language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\catalan.lng;%(Outputs)
-
-
- Generating croatian language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\croatian.lng;%(Outputs)
-
-
- Generating czech language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\czech.lng;%(Outputs)
-
-
- Generating danish language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\danish.lng;%(Outputs)
-
-
- Generating dutch language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\dutch.lng;%(Outputs)
-
-
- Generating english_AU language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\english_AU.lng;%(Outputs)
-
-
- Generating english_US language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\english_US.lng;%(Outputs)
-
-
- Generating esperanto language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\esperanto.lng;%(Outputs)
-
-
- Generating estonian language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\estonian.lng;%(Outputs)
-
-
- Generating faroese language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\faroese.lng;%(Outputs)
-
-
- Generating finnish language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\finnish.lng;%(Outputs)
-
-
- Generating french language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\french.lng;%(Outputs)
-
-
- Generating gaelic language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\gaelic.lng;%(Outputs)
-
-
- Generating galician language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\galician.lng;%(Outputs)
-
-
- Generating german language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\german.lng;%(Outputs)
-
-
- Generating greek language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\greek.lng;%(Outputs)
-
-
- Generating hebrew language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\hebrew.lng;%(Outputs)
-
-
- Generating hungarian language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\hungarian.lng;%(Outputs)
-
-
- Generating icelandic language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\icelandic.lng;%(Outputs)
-
-
- Generating indonesian language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\indonesian.lng;%(Outputs)
-
-
- Generating irish language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\irish.lng;%(Outputs)
-
-
- Generating italian language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\italian.lng;%(Outputs)
-
-
- Generating japanese language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\japanese.lng;%(Outputs)
-
-
- Generating korean language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\korean.lng;%(Outputs)
-
-
- Generating latin language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\latin.lng;%(Outputs)
-
-
- Generating latvian language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\latvian.lng;%(Outputs)
-
-
- Generating lithuanian language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\lithuanian.lng;%(Outputs)
-
-
- Generating luxembourgish language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\luxembourgish.lng;%(Outputs)
-
-
- Generating malay language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\malay.lng;%(Outputs)
-
-
- Generating norwegian_bokmal language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\norwegian_bokmal.lng;%(Outputs)
-
-
- Generating norwegian_nynorsk language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\norwegian_nynorsk.lng;%(Outputs)
-
-
- Generating polish language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\polish.lng;%(Outputs)
-
-
- Generating portuguese language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\portuguese.lng;%(Outputs)
-
-
- Generating romanian language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\romanian.lng;%(Outputs)
-
-
- Generating russian language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\russian.lng;%(Outputs)
-
-
- Generating serbian language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\serbian.lng;%(Outputs)
-
-
- Generating simplified_chinese language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\simplified_chinese.lng;%(Outputs)
-
-
- Generating slovak language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\slovak.lng;%(Outputs)
-
-
- Generating slovenian language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\slovenian.lng;%(Outputs)
-
-
- Generating spanish language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\spanish.lng;%(Outputs)
-
-
- Generating spanish_MX language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\spanish_MX.lng;%(Outputs)
-
-
- Generating swedish language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\swedish.lng;%(Outputs)
-
-
- Generating tamil language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\tamil.lng;%(Outputs)
-
-
- Generating thai language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\thai.lng;%(Outputs)
-
-
- Generating traditional_chinese language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\traditional_chinese.lng;%(Outputs)
-
-
- Generating turkish language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\turkish.lng;%(Outputs)
-
-
- Generating ukrainian language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\ukrainian.lng;%(Outputs)
-
-
- Generating vietnamese language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\vietnamese.lng;%(Outputs)
-
-
- Generating welsh language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\welsh.lng;%(Outputs)
-
-
-
-
- {a133a442-bd0a-4ade-b117-ad7545e4bdd1}
- false
-
-
-
-
-
-
diff --git a/projects/langs_vs100.vcxproj.filters b/projects/langs_vs100.vcxproj.filters
deleted file mode 100644
index bf5257ec82..0000000000
--- a/projects/langs_vs100.vcxproj.filters
+++ /dev/null
@@ -1,176 +0,0 @@
-
-
-
-
- {2a164580-9033-4a01-974b-b21da507efda}
-
-
-
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
- Translations
-
-
-
diff --git a/projects/langs_vs100.vcxproj.filters.in b/projects/langs_vs100.vcxproj.filters.in
deleted file mode 100644
index 0d60ee9595..0000000000
--- a/projects/langs_vs100.vcxproj.filters.in
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
- {2a164580-9033-4a01-974b-b21da507efda}
-
-
-
-
-!!FILES!!
-
-
diff --git a/projects/langs_vs100.vcxproj.in b/projects/langs_vs100.vcxproj.in
deleted file mode 100644
index 5bfec8bf0f..0000000000
--- a/projects/langs_vs100.vcxproj.in
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
- Debug
- Win32
-
-
-
- langs
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}
- langs
- MakeFileProj
-
-
-
- Utility
- false
-
-
-
-
-
-
-
-
-
- <_ProjectFileVersion>10.0.30319.1
- ..\bin\lang\
- ..\objs\langs\
-
-
-
- Generating strings.h
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\objs\langs\table
-
-
- ./langs.tlb
-
-
-
-
-
-
- Generating english language file
- ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
- ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
- ..\bin\lang\english.lng;%(Outputs)
-
-!!FILES!!
-
-
-
- {a133a442-bd0a-4ade-b117-ad7545e4bdd1}
- false
-
-
-
-
-
-
diff --git a/projects/langs_vs80.vcproj b/projects/langs_vs80.vcproj
deleted file mode 100644
index 909613b59b..0000000000
--- a/projects/langs_vs80.vcproj
+++ /dev/null
@@ -1,895 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/projects/langs_vs80.vcproj.in b/projects/langs_vs80.vcproj.in
deleted file mode 100644
index 548a0b0179..0000000000
--- a/projects/langs_vs80.vcproj.in
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-!!FILES!!
-
-
-
-
-
diff --git a/projects/langs_vs90.vcproj b/projects/langs_vs90.vcproj
deleted file mode 100644
index 583e0f9a5d..0000000000
--- a/projects/langs_vs90.vcproj
+++ /dev/null
@@ -1,896 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/projects/langs_vs90.vcproj.in b/projects/langs_vs90.vcproj.in
deleted file mode 100644
index f03b231fc3..0000000000
--- a/projects/langs_vs90.vcproj.in
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-!!FILES!!
-
-
-
-
-
diff --git a/projects/openttd_vs100.sln b/projects/openttd_vs100.sln
deleted file mode 100644
index a2ec939d30..0000000000
--- a/projects/openttd_vs100.sln
+++ /dev/null
@@ -1,91 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual C++ Express 2010
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "openttd", "openttd_vs100.vcxproj", "{668328A0-B40E-4CDB-BD72-D0064424414A}"
- ProjectSection(ProjectDependencies) = postProject
- {0817F629-589E-4A3B-B81A-8647BC571E35} = {0817F629-589E-4A3B-B81A-8647BC571E35}
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7} = {E9548DE9-F089-49B7-93A6-30BE2CC311C7}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "strgen", "strgen_vs100.vcxproj", "{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "langs", "langs_vs100.vcxproj", "{0F066B23-18DF-4284-8265-F4A5E7E3B966}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "version", "version_vs100.vcxproj", "{1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "generate", "generate_vs100.vcxproj", "{2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settings", "settings_vs100.vcxproj", "{0817F629-589E-4A3B-B81A-8647BC571E35}"
- ProjectSection(ProjectDependencies) = postProject
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7} = {E9548DE9-F089-49B7-93A6-30BE2CC311C7}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settingsgen", "settingsgen_vs100.vcxproj", "{E9548DE9-F089-49B7-93A6-30BE2CC311C7}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Debug|x64 = Debug|x64
- Release|Win32 = Release|Win32
- Release|x64 = Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|Win32.ActiveCfg = Debug|Win32
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|Win32.Build.0 = Debug|Win32
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|x64.ActiveCfg = Debug|x64
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|x64.Build.0 = Debug|x64
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|Win32.ActiveCfg = Release|Win32
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|Win32.Build.0 = Release|Win32
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|x64.ActiveCfg = Release|x64
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|x64.Build.0 = Release|x64
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|Win32.ActiveCfg = Debug|Win32
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|Win32.Build.0 = Debug|Win32
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|x64.ActiveCfg = Debug|Win32
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|x64.Build.0 = Debug|Win32
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|Win32.ActiveCfg = Debug|Win32
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|Win32.Build.0 = Debug|Win32
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|x64.ActiveCfg = Debug|Win32
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|x64.Build.0 = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|Win32.ActiveCfg = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|Win32.Build.0 = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|x64.ActiveCfg = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|x64.Build.0 = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|Win32.ActiveCfg = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|Win32.Build.0 = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|x64.ActiveCfg = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|x64.Build.0 = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|Win32.ActiveCfg = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|Win32.Build.0 = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|x64.ActiveCfg = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|x64.Build.0 = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|Win32.ActiveCfg = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|Win32.Build.0 = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|x64.ActiveCfg = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|x64.Build.0 = Debug|Win32
- {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Debug|Win32.ActiveCfg = Debug|Win32
- {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Debug|x64.ActiveCfg = Debug|Win32
- {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Release|Win32.ActiveCfg = Debug|Win32
- {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Release|x64.ActiveCfg = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|Win32.ActiveCfg = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|Win32.Build.0 = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|x64.ActiveCfg = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|x64.Build.0 = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|Win32.ActiveCfg = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|Win32.Build.0 = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|x64.ActiveCfg = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|x64.Build.0 = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|Win32.ActiveCfg = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|Win32.Build.0 = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|x64.ActiveCfg = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|x64.Build.0 = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|Win32.ActiveCfg = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|Win32.Build.0 = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|x64.ActiveCfg = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|x64.Build.0 = Debug|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(DPCodeReviewSolutionGUID) = preSolution
- DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000}
- EndGlobalSection
-EndGlobal
diff --git a/projects/openttd_vs100.vcxproj b/projects/openttd_vs100.vcxproj
index a11947991d..3baeeb5eb7 100644
--- a/projects/openttd_vs100.vcxproj
+++ b/projects/openttd_vs100.vcxproj
@@ -102,7 +102,7 @@
Sizetrue..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions)
+ WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions)trueSyncMultiThreaded
@@ -131,7 +131,7 @@
0x0809
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
+ winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;icuuc.lib;icuin.lib;icudt.lib;icule.lib;iculx.lib;%(AdditionalDependencies)true%(IgnoreSpecificDefaultLibraries)true
@@ -162,7 +162,7 @@
/MP %(AdditionalOptions)Disabled..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions)
+ WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions)EnableFastChecksMultiThreadedDebug
@@ -182,7 +182,7 @@
0x0809
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
+ winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;icuuc.lib;icuin.lib;icudt.lib;icule.lib;iculx.lib;%(AdditionalDependencies)trueLIBCMT.lib;%(IgnoreSpecificDefaultLibraries)true
@@ -216,7 +216,7 @@
Sizetrue..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions)
+ WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions)trueSyncMultiThreaded
@@ -245,7 +245,7 @@
0x0809
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
+ winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;icuuc.lib;icuin.lib;icudt.lib;icule.lib;iculx.lib;%(AdditionalDependencies)true%(IgnoreSpecificDefaultLibraries)true
@@ -274,7 +274,7 @@
/MP %(AdditionalOptions)Disabled..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions)
+ WIN32;_DEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions)EnableFastChecksMultiThreadedDebug
@@ -298,7 +298,7 @@
0x0809
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
+ winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;icuuc.lib;icuin.lib;icudt.lib;icule.lib;iculx.lib;%(AdditionalDependencies)trueLIBCMT.lib;%(IgnoreSpecificDefaultLibraries)true
@@ -569,8 +569,6 @@
-
-
@@ -632,7 +630,6 @@
-
@@ -686,7 +683,6 @@
-
@@ -1156,8 +1152,6 @@
-
-
@@ -1302,15 +1296,12 @@
-
-
-
diff --git a/projects/openttd_vs100.vcxproj.filters b/projects/openttd_vs100.vcxproj.filters
index 02f2075a3f..515f2b4c05 100644
--- a/projects/openttd_vs100.vcxproj.filters
+++ b/projects/openttd_vs100.vcxproj.filters
@@ -864,12 +864,6 @@
Header Files
-
- Header Files
-
-
- Header Files
- Header Files
@@ -1053,9 +1047,6 @@
Header Files
-
- Header Files
- Header Files
@@ -1215,9 +1206,6 @@
Header Files
-
- Header Files
- Header Files
@@ -2625,12 +2613,6 @@
Blitters
-
- Blitters
-
-
- Blitters
- Blitters
@@ -3063,9 +3045,6 @@
Music
-
- Music
- Music
@@ -3078,18 +3057,12 @@
Sound
-
- Sound
- Windows filesWindows files
-
- Windows files
- Windows files
diff --git a/projects/openttd_vs100.vcxproj.filters.in b/projects/openttd_vs100.vcxproj.filters.in
deleted file mode 100644
index 126bd61459..0000000000
--- a/projects/openttd_vs100.vcxproj.filters.in
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-!!FILTERS!!
-
-
-!!FILES!!
-
-
-
-
-
-
diff --git a/projects/openttd_vs100.vcxproj.in b/projects/openttd_vs100.vcxproj.in
deleted file mode 100644
index b2eb33d316..0000000000
--- a/projects/openttd_vs100.vcxproj.in
+++ /dev/null
@@ -1,339 +0,0 @@
-
-
-
-
- Debug
- Win32
-
-
- Debug
- x64
-
-
- Release
- Win32
-
-
- Release
- x64
-
-
-
- openttd
- {668328A0-B40E-4CDB-BD72-D0064424414A}
- openttd
-
-
-
- Application
- false
- Unicode
-
-
- Application
- false
- Unicode
- true
-
-
- Application
- false
- Unicode
-
-
- Application
- false
- Unicode
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <_ProjectFileVersion>10.0.30319.1
- $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
- $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
- false
- $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
- $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
-
- $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
- false
- $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
- $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
-
- AllRules.ruleset
-
-
- AllRules.ruleset
-
-
- AllRules.ruleset
-
-
- AllRules.ruleset
-
-
- $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
- $(ProjectDir)..\bin
-
-
-
- .\Release/openttd.tlb
-
-
-
-
- /MP /J %(AdditionalOptions)
- Full
- AnySuitable
- true
- Size
- true
- ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions)
- true
- Sync
- MultiThreaded
- 4Bytes
- false
- true
-
-
-
-
-
-
- All
- $(IntDir)
- $(IntDir)
- $(IntDir)$(TargetName).pdb
- Level3
- false
- true
- ProgramDatabase
- FastCall
- Default
-
-
- NDEBUG;%(PreprocessorDefinitions)
- 0x0809
-
-
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
- true
- %(IgnoreSpecificDefaultLibraries)
- true
- Windows
- 1048576
- 1048576
- true
- false
-
-
- MachineX86
- true
-
-
- dpi_aware.manifest;os_versions.manifest
-
-
- copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)"
-
-
-
-
- .\Debug/openttd.tlb
-
-
-
-
- /MP %(AdditionalOptions)
- Disabled
- ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions)
- EnableFastChecks
- MultiThreadedDebug
-
-
- $(IntDir)
- $(IntDir)
- $(IntDir)$(TargetName).pdb
- Level3
- false
- true
- EditAndContinue
- FastCall
- Default
-
-
- _DEBUG;%(PreprocessorDefinitions)
- 0x0809
-
-
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
- true
- LIBCMT.lib;%(IgnoreSpecificDefaultLibraries)
- true
- Windows
- 1048576
- 1048576
- false
-
-
- MachineX86
-
-
- dpi_aware.manifest;os_versions.manifest
-
-
- copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)"
-
-
-
-
- X64
- .\Release/openttd.tlb
-
-
-
-
- /MP /J %(AdditionalOptions)
- Full
- AnySuitable
- true
- Size
- true
- ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions)
- true
- Sync
- MultiThreaded
- Default
- false
- true
-
-
-
-
-
-
- All
- $(IntDir)
- $(IntDir)
- $(IntDir)$(TargetName).pdb
- Level3
- false
- true
- ProgramDatabase
- FastCall
- Default
-
-
- NDEBUG;%(PreprocessorDefinitions)
- 0x0809
-
-
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
- true
- %(IgnoreSpecificDefaultLibraries)
- true
- Windows
- 1048576
- 1048576
- true
- MachineX64
- true
-
-
- dpi_aware.manifest;os_versions.manifest
-
-
- copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)"
-
-
-
-
- X64
- .\Debug/openttd.tlb
-
-
-
-
- /MP %(AdditionalOptions)
- Disabled
- ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions)
- EnableFastChecks
- MultiThreadedDebug
-
-
-
-
-
-
- $(IntDir)
- $(IntDir)
- $(IntDir)$(TargetName).pdb
- Level3
- false
- true
- ProgramDatabase
- Cdecl
- Default
-
-
- _DEBUG;%(PreprocessorDefinitions)
- 0x0809
-
-
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
- true
- LIBCMT.lib;%(IgnoreSpecificDefaultLibraries)
- true
- Windows
- 1048576
- 1048576
- MachineX64
-
-
- dpi_aware.manifest;os_versions.manifest
-
-
- copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)"
-
-
-
-!!FILES!!
-
-
-
-
-
-
-
- {0f066b23-18df-4284-8265-f4a5e7e3b966}
- false
-
-
- {a133a442-bd0a-4ade-b117-ad7545e4bdd1}
- false
-
-
- {1a2b3c5e-1c23-41a5-9c9b-acba2aa75fec}
- false
-
-
-
-
diff --git a/projects/openttd_vs140.sln b/projects/openttd_vs140.sln
index d256cfa495..32f3033fb2 100644
--- a/projects/openttd_vs140.sln
+++ b/projects/openttd_vs140.sln
@@ -24,6 +24,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settings", "settings_vs140.
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settingsgen", "settingsgen_vs140.vcxproj", "{E9548DE9-F089-49B7-93A6-30BE2CC311C7}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "regression", "regression_vs140.vcxproj", "{4712B013-437D-42CE-947F-DEBABA15261F}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
@@ -84,6 +86,10 @@ Global
{E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|Win32.Build.0 = Debug|Win32
{E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|x64.ActiveCfg = Debug|Win32
{E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|x64.Build.0 = Debug|Win32
+ {4712B013-437D-42CE-947F-DEBABA15261F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {4712B013-437D-42CE-947F-DEBABA15261F}.Debug|x64.ActiveCfg = Debug|Win32
+ {4712B013-437D-42CE-947F-DEBABA15261F}.Release|Win32.ActiveCfg = Debug|Win32
+ {4712B013-437D-42CE-947F-DEBABA15261F}.Release|x64.ActiveCfg = Debug|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/projects/openttd_vs140.vcxproj b/projects/openttd_vs140.vcxproj
index 7375eb0a60..c141b6d1ae 100644
--- a/projects/openttd_vs140.vcxproj
+++ b/projects/openttd_vs140.vcxproj
@@ -22,6 +22,8 @@
openttd{668328A0-B40E-4CDB-BD72-D0064424414A}openttd
+ x86-windows-static
+ x64-windows-static
@@ -105,7 +107,7 @@
Sizetrue..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions)
+ NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions)trueSyncMultiThreaded
@@ -136,7 +138,7 @@
0x0809
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
+ winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies)true%(IgnoreSpecificDefaultLibraries)true
@@ -170,7 +172,7 @@
Disabledtrue..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions)
+ _DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions)EnableFastChecksMultiThreadedDebug
@@ -192,7 +194,7 @@
0x0809
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
+ winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies)trueLIBCMT.lib;%(IgnoreSpecificDefaultLibraries)true
@@ -228,7 +230,7 @@
Sizetrue..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions)
+ NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions)trueSyncMultiThreaded
@@ -259,7 +261,7 @@
0x0809
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
+ winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies)true%(IgnoreSpecificDefaultLibraries)true
@@ -291,7 +293,7 @@
Disabledtrue..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions)
+ _DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions)EnableFastChecksMultiThreadedDebug
@@ -317,7 +319,7 @@
0x0809
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
+ winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies)trueLIBCMT.lib;%(IgnoreSpecificDefaultLibraries)true
@@ -502,6 +504,7 @@
+
@@ -755,6 +758,7 @@
+
@@ -816,6 +820,7 @@
+
diff --git a/projects/openttd_vs140.vcxproj.filters b/projects/openttd_vs140.vcxproj.filters
index 02f2075a3f..1fdac48354 100644
--- a/projects/openttd_vs140.vcxproj.filters
+++ b/projects/openttd_vs140.vcxproj.filters
@@ -600,6 +600,9 @@
Header Files
+
+ Header Files
+ Header Files
@@ -1359,6 +1362,9 @@
GUI Source Code
+
+ GUI Source Code
+ GUI Source Code
@@ -1542,6 +1548,9 @@
Widgets
+
+ Widgets
+ Widgets
diff --git a/projects/openttd_vs140.vcxproj.in b/projects/openttd_vs140.vcxproj.in
index d6ba126b5f..75aac94bab 100644
--- a/projects/openttd_vs140.vcxproj.in
+++ b/projects/openttd_vs140.vcxproj.in
@@ -22,6 +22,8 @@
openttd{668328A0-B40E-4CDB-BD72-D0064424414A}openttd
+ x86-windows-static
+ x64-windows-static
@@ -105,7 +107,7 @@
Sizetrue..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions)
+ NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions)trueSyncMultiThreaded
@@ -136,7 +138,7 @@
0x0809
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
+ winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies)true%(IgnoreSpecificDefaultLibraries)true
@@ -170,7 +172,7 @@
Disabledtrue..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions)
+ _DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions)EnableFastChecksMultiThreadedDebug
@@ -192,7 +194,7 @@
0x0809
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
+ winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies)trueLIBCMT.lib;%(IgnoreSpecificDefaultLibraries)true
@@ -228,7 +230,7 @@
Sizetrue..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions)
+ NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions)trueSyncMultiThreaded
@@ -259,7 +261,7 @@
0x0809
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
+ winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies)true%(IgnoreSpecificDefaultLibraries)true
@@ -291,7 +293,7 @@
Disabledtrue..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions)
+ _DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions)EnableFastChecksMultiThreadedDebug
@@ -317,7 +319,7 @@
0x0809
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
+ winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies)trueLIBCMT.lib;%(IgnoreSpecificDefaultLibraries)true
diff --git a/projects/openttd_vs141.sln b/projects/openttd_vs141.sln
index e314c628a7..86f2685cd9 100644
--- a/projects/openttd_vs141.sln
+++ b/projects/openttd_vs141.sln
@@ -24,6 +24,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settings", "settings_vs141.
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settingsgen", "settingsgen_vs141.vcxproj", "{E9548DE9-F089-49B7-93A6-30BE2CC311C7}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "regression", "regression_vs141.vcxproj", "{4712B013-437D-42CE-947F-DEBABA15261F}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
@@ -84,6 +86,10 @@ Global
{E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|Win32.Build.0 = Debug|Win32
{E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|x64.ActiveCfg = Debug|Win32
{E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|x64.Build.0 = Debug|Win32
+ {4712B013-437D-42CE-947F-DEBABA15261F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {4712B013-437D-42CE-947F-DEBABA15261F}.Debug|x64.ActiveCfg = Debug|Win32
+ {4712B013-437D-42CE-947F-DEBABA15261F}.Release|Win32.ActiveCfg = Debug|Win32
+ {4712B013-437D-42CE-947F-DEBABA15261F}.Release|x64.ActiveCfg = Debug|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/projects/openttd_vs141.vcxproj b/projects/openttd_vs141.vcxproj
index f956e4b2d6..5b305767ce 100644
--- a/projects/openttd_vs141.vcxproj
+++ b/projects/openttd_vs141.vcxproj
@@ -22,6 +22,8 @@
openttd{668328A0-B40E-4CDB-BD72-D0064424414A}openttd
+ x86-windows-static
+ x64-windows-static
@@ -105,7 +107,7 @@
Sizetrue..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions)
+ NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions)trueSyncMultiThreaded
@@ -136,7 +138,7 @@
0x0809
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
+ winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies)true%(IgnoreSpecificDefaultLibraries)true
@@ -170,7 +172,7 @@
Disabledtrue..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions)
+ _DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions)EnableFastChecksMultiThreadedDebug
@@ -192,7 +194,7 @@
0x0809
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
+ winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies)trueLIBCMT.lib;%(IgnoreSpecificDefaultLibraries)true
@@ -228,7 +230,7 @@
Sizetrue..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions)
+ NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions)trueSyncMultiThreaded
@@ -259,7 +261,7 @@
0x0809
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
+ winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies)true%(IgnoreSpecificDefaultLibraries)true
@@ -291,7 +293,7 @@
Disabledtrue..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions)
+ _DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions)EnableFastChecksMultiThreadedDebug
@@ -317,7 +319,7 @@
0x0809
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
+ winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies)trueLIBCMT.lib;%(IgnoreSpecificDefaultLibraries)true
@@ -502,6 +504,7 @@
+
@@ -618,6 +621,7 @@
+
@@ -715,6 +719,8 @@
+
+
@@ -752,6 +758,7 @@
+
@@ -813,6 +820,7 @@
+
diff --git a/projects/openttd_vs141.vcxproj.filters b/projects/openttd_vs141.vcxproj.filters
index 7ed9f00cef..b8bcc77042 100644
--- a/projects/openttd_vs141.vcxproj.filters
+++ b/projects/openttd_vs141.vcxproj.filters
@@ -600,6 +600,9 @@
Header Files
+
+ Header Files
+ Header Files
@@ -948,6 +951,9 @@
Header Files
+
+ Header Files
+ Header Files
@@ -1239,6 +1245,12 @@
Core Source Code
+
+ Core Source Code
+
+
+ Core Source Code
+ Core Source Code
@@ -1350,6 +1362,9 @@
GUI Source Code
+
+ GUI Source Code
+ GUI Source Code
@@ -1533,6 +1548,9 @@
Widgets
+
+ Widgets
+ Widgets
diff --git a/projects/openttd_vs141.vcxproj.in b/projects/openttd_vs141.vcxproj.in
index f231c6264d..a054c2580e 100644
--- a/projects/openttd_vs141.vcxproj.in
+++ b/projects/openttd_vs141.vcxproj.in
@@ -22,6 +22,8 @@
openttd{668328A0-B40E-4CDB-BD72-D0064424414A}openttd
+ x86-windows-static
+ x64-windows-static
@@ -105,7 +107,7 @@
Sizetrue..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions)
+ NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions)trueSyncMultiThreaded
@@ -136,7 +138,7 @@
0x0809
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
+ winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies)true%(IgnoreSpecificDefaultLibraries)true
@@ -170,7 +172,7 @@
Disabledtrue..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions)
+ _DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions)EnableFastChecksMultiThreadedDebug
@@ -192,7 +194,7 @@
0x0809
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
+ winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies)trueLIBCMT.lib;%(IgnoreSpecificDefaultLibraries)true
@@ -228,7 +230,7 @@
Sizetrue..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions)
+ NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions)trueSyncMultiThreaded
@@ -259,7 +261,7 @@
0x0809
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
+ winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies)true%(IgnoreSpecificDefaultLibraries)true
@@ -291,7 +293,7 @@
Disabledtrue..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions)
+ _DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions)EnableFastChecksMultiThreadedDebug
@@ -317,7 +319,7 @@
0x0809
- winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;%(AdditionalDependencies)
+ winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies)trueLIBCMT.lib;%(IgnoreSpecificDefaultLibraries)true
diff --git a/projects/openttd_vs80.sln b/projects/openttd_vs80.sln
deleted file mode 100644
index 9e6dd1219d..0000000000
--- a/projects/openttd_vs80.sln
+++ /dev/null
@@ -1,95 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual C++ Express 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "openttd", "openttd_vs80.vcproj", "{668328A0-B40E-4CDB-BD72-D0064424414A}"
- ProjectSection(ProjectDependencies) = postProject
- {0F066B23-18DF-4284-8265-F4A5E7E3B966} = {0F066B23-18DF-4284-8265-F4A5E7E3B966}
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC} = {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}
- {0817F629-589E-4A3B-B81A-8647BC571E35} = {0817F629-589E-4A3B-B81A-8647BC571E35}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "strgen", "strgen_vs80.vcproj", "{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "langs", "langs_vs80.vcproj", "{0F066B23-18DF-4284-8265-F4A5E7E3B966}"
- ProjectSection(ProjectDependencies) = postProject
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1} = {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "version", "version_vs80.vcproj", "{1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "generate", "generate_vs80.vcproj", "{2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settings", "settings_vs80.vcproj", "{0817F629-589E-4A3B-B81A-8647BC571E35}"
- ProjectSection(ProjectDependencies) = postProject
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7} = {E9548DE9-F089-49B7-93A6-30BE2CC311C7}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settings_gen", "settingsgen_vs80.vcproj", "{E9548DE9-F089-49B7-93A6-30BE2CC311C7}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Debug|x64 = Debug|x64
- Release|Win32 = Release|Win32
- Release|x64 = Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|Win32.ActiveCfg = Debug|Win32
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|Win32.Build.0 = Debug|Win32
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|x64.ActiveCfg = Debug|x64
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|x64.Build.0 = Debug|x64
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|Win32.ActiveCfg = Release|Win32
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|Win32.Build.0 = Release|Win32
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|x64.ActiveCfg = Release|x64
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|x64.Build.0 = Release|x64
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|Win32.ActiveCfg = Debug|Win32
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|Win32.Build.0 = Debug|Win32
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|x64.ActiveCfg = Debug|Win32
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|x64.Build.0 = Debug|Win32
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|Win32.ActiveCfg = Debug|Win32
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|Win32.Build.0 = Debug|Win32
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|x64.ActiveCfg = Debug|Win32
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|x64.Build.0 = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|Win32.ActiveCfg = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|Win32.Build.0 = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|x64.ActiveCfg = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|x64.Build.0 = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|Win32.ActiveCfg = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|Win32.Build.0 = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|x64.ActiveCfg = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|x64.Build.0 = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|Win32.ActiveCfg = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|Win32.Build.0 = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|x64.ActiveCfg = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|x64.Build.0 = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|Win32.ActiveCfg = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|Win32.Build.0 = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|x64.ActiveCfg = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|x64.Build.0 = Debug|Win32
- {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Debug|Win32.ActiveCfg = Debug|Win32
- {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Debug|x64.ActiveCfg = Debug|Win32
- {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Release|Win32.ActiveCfg = Debug|Win32
- {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Release|x64.ActiveCfg = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|Win32.ActiveCfg = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|Win32.Build.0 = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|x64.ActiveCfg = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|x64.Build.0 = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|Win32.ActiveCfg = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|Win32.Build.0 = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|x64.ActiveCfg = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|x64.Build.0 = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|Win32.ActiveCfg = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|Win32.Build.0 = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|x64.ActiveCfg = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|x64.Build.0 = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|Win32.ActiveCfg = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|Win32.Build.0 = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|x64.ActiveCfg = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|x64.Build.0 = Debug|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(DPCodeReviewSolutionGUID) = preSolution
- DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000}
- EndGlobalSection
-EndGlobal
diff --git a/projects/openttd_vs80.vcproj b/projects/openttd_vs80.vcproj
index ba1f2f1b3a..8e1ddd90b6 100644
--- a/projects/openttd_vs80.vcproj
+++ b/projects/openttd_vs80.vcproj
@@ -52,7 +52,7 @@
FavorSizeOrSpeed="2"
OmitFramePointers="true"
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
StringPooling="true"
ExceptionHandling="1"
RuntimeLibrary="0"
@@ -87,7 +87,7 @@
/>
-
-
-
-
@@ -1714,10 +1706,6 @@
RelativePath=".\..\src\string_type.h"
>
-
-
@@ -1930,10 +1918,6 @@
RelativePath=".\..\src\window_type.h"
>
-
-
@@ -3878,14 +3862,6 @@
RelativePath=".\..\src\blitter\32bpp_anim.hpp"
>
-
-
-
-
@@ -4506,10 +4482,6 @@
RelativePath=".\..\src\music\null_m.cpp"
>
-
-
@@ -4530,10 +4502,6 @@
RelativePath=".\..\src\sound\win32_s.cpp"
>
-
-
-
-
diff --git a/projects/openttd_vs80.vcproj.in b/projects/openttd_vs80.vcproj.in
deleted file mode 100644
index 3363d0d019..0000000000
--- a/projects/openttd_vs80.vcproj.in
+++ /dev/null
@@ -1,454 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-!!FILES!!
-
-
-
-
-
-
-
-
diff --git a/projects/openttd_vs80.vcproj.user b/projects/openttd_vs80.vcproj.user
deleted file mode 100644
index 2d523a7cef..0000000000
--- a/projects/openttd_vs80.vcproj.user
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/projects/openttd_vs90.sln b/projects/openttd_vs90.sln
deleted file mode 100644
index a33f315d30..0000000000
--- a/projects/openttd_vs90.sln
+++ /dev/null
@@ -1,95 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual C++ Express 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "openttd", "openttd_vs90.vcproj", "{668328A0-B40E-4CDB-BD72-D0064424414A}"
- ProjectSection(ProjectDependencies) = postProject
- {0F066B23-18DF-4284-8265-F4A5E7E3B966} = {0F066B23-18DF-4284-8265-F4A5E7E3B966}
- {0817F629-589E-4A3B-B81A-8647BC571E35} = {0817F629-589E-4A3B-B81A-8647BC571E35}
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC} = {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "strgen", "strgen_vs90.vcproj", "{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "langs", "langs_vs90.vcproj", "{0F066B23-18DF-4284-8265-F4A5E7E3B966}"
- ProjectSection(ProjectDependencies) = postProject
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1} = {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "version", "version_vs90.vcproj", "{1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "generate", "generate_vs90.vcproj", "{2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settings", "settings_vs90.vcproj", "{0817F629-589E-4A3B-B81A-8647BC571E35}"
- ProjectSection(ProjectDependencies) = postProject
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7} = {E9548DE9-F089-49B7-93A6-30BE2CC311C7}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settingsgen", "settingsgen_vs90.vcproj", "{E9548DE9-F089-49B7-93A6-30BE2CC311C7}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Debug|x64 = Debug|x64
- Release|Win32 = Release|Win32
- Release|x64 = Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|Win32.ActiveCfg = Debug|Win32
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|Win32.Build.0 = Debug|Win32
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|x64.ActiveCfg = Debug|x64
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|x64.Build.0 = Debug|x64
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|Win32.ActiveCfg = Release|Win32
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|Win32.Build.0 = Release|Win32
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|x64.ActiveCfg = Release|x64
- {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|x64.Build.0 = Release|x64
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|Win32.ActiveCfg = Debug|Win32
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|Win32.Build.0 = Debug|Win32
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|x64.ActiveCfg = Debug|Win32
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|x64.Build.0 = Debug|Win32
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|Win32.ActiveCfg = Debug|Win32
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|Win32.Build.0 = Debug|Win32
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|x64.ActiveCfg = Debug|Win32
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|x64.Build.0 = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|Win32.ActiveCfg = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|Win32.Build.0 = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|x64.ActiveCfg = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|x64.Build.0 = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|Win32.ActiveCfg = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|Win32.Build.0 = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|x64.ActiveCfg = Debug|Win32
- {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|x64.Build.0 = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|Win32.ActiveCfg = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|Win32.Build.0 = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|x64.ActiveCfg = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|x64.Build.0 = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|Win32.ActiveCfg = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|Win32.Build.0 = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|x64.ActiveCfg = Debug|Win32
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|x64.Build.0 = Debug|Win32
- {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Debug|Win32.ActiveCfg = Debug|Win32
- {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Debug|x64.ActiveCfg = Debug|Win32
- {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Release|Win32.ActiveCfg = Debug|Win32
- {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Release|x64.ActiveCfg = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|Win32.ActiveCfg = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|Win32.Build.0 = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|x64.ActiveCfg = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|x64.Build.0 = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|Win32.ActiveCfg = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|Win32.Build.0 = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|x64.ActiveCfg = Debug|Win32
- {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|x64.Build.0 = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|Win32.ActiveCfg = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|Win32.Build.0 = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|x64.ActiveCfg = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|x64.Build.0 = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|Win32.ActiveCfg = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|Win32.Build.0 = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|x64.ActiveCfg = Debug|Win32
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|x64.Build.0 = Debug|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(DPCodeReviewSolutionGUID) = preSolution
- DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000}
- EndGlobalSection
-EndGlobal
diff --git a/projects/openttd_vs90.vcproj b/projects/openttd_vs90.vcproj
index e15aa4a3a8..fad57781ef 100644
--- a/projects/openttd_vs90.vcproj
+++ b/projects/openttd_vs90.vcproj
@@ -53,7 +53,7 @@
FavorSizeOrSpeed="2"
OmitFramePointers="true"
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
StringPooling="true"
ExceptionHandling="1"
RuntimeLibrary="0"
@@ -88,7 +88,7 @@
/>
-
-
-
-
@@ -1711,10 +1703,6 @@
RelativePath=".\..\src\string_type.h"
>
-
-
@@ -1927,10 +1915,6 @@
RelativePath=".\..\src\window_type.h"
>
-
-
@@ -3875,14 +3859,6 @@
RelativePath=".\..\src\blitter\32bpp_anim.hpp"
>
-
-
-
-
@@ -4503,10 +4479,6 @@
RelativePath=".\..\src\music\null_m.cpp"
>
-
-
@@ -4527,10 +4499,6 @@
RelativePath=".\..\src\sound\win32_s.cpp"
>
-
-
-
-
diff --git a/projects/openttd_vs90.vcproj.in b/projects/openttd_vs90.vcproj.in
deleted file mode 100644
index b2d3fdeb9c..0000000000
--- a/projects/openttd_vs90.vcproj.in
+++ /dev/null
@@ -1,451 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-!!FILES!!
-
-
-
-
-
-
-
-
diff --git a/projects/openttd_vs90.vcproj.user b/projects/openttd_vs90.vcproj.user
deleted file mode 100644
index b49492a503..0000000000
--- a/projects/openttd_vs90.vcproj.user
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/projects/regression.bat b/projects/regression.bat
new file mode 100644
index 0000000000..db373c371b
--- /dev/null
+++ b/projects/regression.bat
@@ -0,0 +1,6 @@
+cd ..\bin
+editbin /nologo /subsystem:console openttd.exe
+cscript /nologo ai\regression\run.vbs
+set RESULT=%ERRORLEVEL%
+editbin /nologo /subsystem:windows openttd.exe
+exit %RESULT%
diff --git a/projects/regression_vs140.vcxproj b/projects/regression_vs140.vcxproj
new file mode 100644
index 0000000000..b1c9f4930a
--- /dev/null
+++ b/projects/regression_vs140.vcxproj
@@ -0,0 +1,41 @@
+
+
+
+
+ Debug
+ Win32
+
+
+
+ {4712B013-437D-42CE-947F-DEBABA15261F}
+ regression
+ regression
+
+
+
+ Makefile
+ v140
+
+
+
+
+
+
+
+
+
+
+
+ call regression.bat
+ call regression.bat
+ del ..\bin\tmp.regression
+
+
+
+ {668328a0-b40e-4cdb-bd72-d0064424414a}
+
+
+
+
+
+
diff --git a/projects/regression_vs141.vcxproj b/projects/regression_vs141.vcxproj
new file mode 100644
index 0000000000..fda3f3312d
--- /dev/null
+++ b/projects/regression_vs141.vcxproj
@@ -0,0 +1,41 @@
+
+
+
+
+ Debug
+ Win32
+
+
+
+ {4712B013-437D-42CE-947F-DEBABA15261F}
+ regression
+ regression
+
+
+
+ Makefile
+ v141
+
+
+
+
+
+
+
+
+
+
+
+ call regression.bat
+ call regression.bat
+ del ..\bin\tmp.regression
+
+
+
+ {668328a0-b40e-4cdb-bd72-d0064424414a}
+
+
+
+
+
+
diff --git a/projects/settings_vs100.vcxproj b/projects/settings_vs100.vcxproj
deleted file mode 100644
index 61b289757a..0000000000
--- a/projects/settings_vs100.vcxproj
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-
-
- Debug
- Win32
-
-
-
- settings
- {0817F629-589E-4A3B-B81A-8647BC571E35}
- settings
-
-
-
- Makefile
-
-
-
-
-
-
-
-
-
-..\objs\settings\settings_gen.exe -o ..\objs\settings\table\settings.h -b ..\src\table\settings.h.preamble -a ..\src\table\settings.h.postamble ..\src\table\company_settings.ini ..\src\table\currency_settings.ini ..\src\table\gameopt_settings.ini ..\src\table\misc_settings.ini ..\src\table\settings.ini ..\src\table\win32_settings.ini ..\src\table\window_settings.ini
-
-
-
- <_ProjectFileVersion>10.0.30319.1
- ..\objs\settings\table\
- ..\objs\settings\table\
- $(SettingsCommandLine)
- $(SettingsCommandLine)
- del ..\objs\settings\table\settings.h
- ..\objs\settings\table\settings.h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/projects/settings_vs100.vcxproj.filters b/projects/settings_vs100.vcxproj.filters
deleted file mode 100644
index 8caf9fa0a6..0000000000
--- a/projects/settings_vs100.vcxproj.filters
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
- {21deca6c-8df4-4f34-9dad-17d7781cd5a0}
-
-
-
-
- INI
-
-
- INI
-
-
- INI
-
-
- INI
-
-
- INI
-
-
- INI
-
-
- INI
-
-
-
-
-
-
-
diff --git a/projects/settings_vs100.vcxproj.filters.in b/projects/settings_vs100.vcxproj.filters.in
deleted file mode 100644
index 08f90670d2..0000000000
--- a/projects/settings_vs100.vcxproj.filters.in
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
- {21deca6c-8df4-4f34-9dad-17d7781cd5a0}
-
-
-
-!!FILES!!
-
-
-
-
-
-
diff --git a/projects/settings_vs100.vcxproj.in b/projects/settings_vs100.vcxproj.in
deleted file mode 100644
index 46064b53cf..0000000000
--- a/projects/settings_vs100.vcxproj.in
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
- Debug
- Win32
-
-
-
- settings
- {0817F629-589E-4A3B-B81A-8647BC571E35}
- settings
-
-
-
- Makefile
-
-
-
-
-
-
-
-
-
-!!FILTERS!!
-
-
-
- <_ProjectFileVersion>10.0.30319.1
- ..\objs\settings\table\
- ..\objs\settings\table\
- $(SettingsCommandLine)
- $(SettingsCommandLine)
- del ..\objs\settings\table\settings.h
- ..\objs\settings\table\settings.h
-
-
-!!FILES!!
-
-
-
-
-
-
-
-
-
diff --git a/projects/settings_vs80.vcproj b/projects/settings_vs80.vcproj
deleted file mode 100644
index 0084dcbc57..0000000000
--- a/projects/settings_vs80.vcproj
+++ /dev/null
@@ -1,87 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/projects/settings_vs80.vcproj.in b/projects/settings_vs80.vcproj.in
deleted file mode 100644
index a0f10fb096..0000000000
--- a/projects/settings_vs80.vcproj.in
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-!!FILES!!
-
-
-
-
-
-
-
-
-
diff --git a/projects/settings_vs90.vcproj b/projects/settings_vs90.vcproj
deleted file mode 100644
index 4361e8df54..0000000000
--- a/projects/settings_vs90.vcproj
+++ /dev/null
@@ -1,88 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/projects/settings_vs90.vcproj.in b/projects/settings_vs90.vcproj.in
deleted file mode 100644
index a342e2b327..0000000000
--- a/projects/settings_vs90.vcproj.in
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-!!FILES!!
-
-
-
-
-
-
-
-
-
diff --git a/projects/settingsgen_vs100.vcxproj b/projects/settingsgen_vs100.vcxproj
deleted file mode 100644
index 30454d81f8..0000000000
--- a/projects/settingsgen_vs100.vcxproj
+++ /dev/null
@@ -1,81 +0,0 @@
-
-
-
-
- Debug
- Win32
-
-
-
- settingsgen
- {E9548DE9-F089-49B7-93A6-30BE2CC311C7}
- settings
-
-
-
- Application
- MultiByte
-
-
-
-
-
-
-
-
-
- <_ProjectFileVersion>10.0.30319.1
- ..\objs\settings\
- ..\objs\settings\
- settings_gen
-
-
-
-
-
-
-
- %(Inputs)
-
-
- MinSpace
- Size
- SETTINGSGEN;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
- All
- $(IntDir)$(TargetName).pdb
- Level3
- true
- ProgramDatabase
- MultiThreadedDebug
-
-
- $(OutDir)settings_gen.exe
- true
- false
-
-
- Console
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/projects/settingsgen_vs100.vcxproj.filters b/projects/settingsgen_vs100.vcxproj.filters
deleted file mode 100644
index c8afe0c8ed..0000000000
--- a/projects/settingsgen_vs100.vcxproj.filters
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
- {a4678737-b3b3-4be5-9db1-fa6ccd164c59}
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
-
-
-
-
-
-
-
-
diff --git a/projects/settingsgen_vs140.vcxproj b/projects/settingsgen_vs140.vcxproj
index fc6d079e8e..12ce280f3a 100644
--- a/projects/settingsgen_vs140.vcxproj
+++ b/projects/settingsgen_vs140.vcxproj
@@ -80,4 +80,4 @@
-
\ No newline at end of file
+
diff --git a/projects/settingsgen_vs80.vcproj b/projects/settingsgen_vs80.vcproj
deleted file mode 100644
index 7568ce9748..0000000000
--- a/projects/settingsgen_vs80.vcproj
+++ /dev/null
@@ -1,143 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/projects/settingsgen_vs90.vcproj b/projects/settingsgen_vs90.vcproj
deleted file mode 100644
index 015ddd2af5..0000000000
--- a/projects/settingsgen_vs90.vcproj
+++ /dev/null
@@ -1,142 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/projects/strgen_vs100.vcxproj b/projects/strgen_vs100.vcxproj
deleted file mode 100644
index 7a43b4debb..0000000000
--- a/projects/strgen_vs100.vcxproj
+++ /dev/null
@@ -1,94 +0,0 @@
-
-
-
-
- Debug
- Win32
-
-
-
- strgen
- {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}
- strgen
-
-
-
- Application
- false
- MultiByte
-
-
-
-
-
-
-
-
-
- <_ProjectFileVersion>10.0.30319.1
- $(SolutionDir)..\objs\strgen\
- $(SolutionDir)..\objs\strgen\
- false
- AllRules.ruleset
-
-
-
-
-
- .\Debug/strgen.tlb
-
-
-
-
- /MP %(AdditionalOptions)
- MinSpace
- Size
- STRGEN;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
- Default
- MultiThreadedDebug
-
-
- All
- $(IntDir)
- $(IntDir)
- $(IntDir)$(TargetName).pdb
- Level3
- true
- true
- ProgramDatabase
-
-
- _DEBUG;%(PreprocessorDefinitions)
- 0x041d
-
-
- true
- true
- $(IntDir)strgen.pdb
- Console
- false
-
-
- MachineX86
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/projects/strgen_vs100.vcxproj.filters b/projects/strgen_vs100.vcxproj.filters
deleted file mode 100644
index 58864ee691..0000000000
--- a/projects/strgen_vs100.vcxproj.filters
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
- {5894294c-d4dc-41f0-be31-e56cff4e0405}
- cpp;c;cxx;rc;def;r;odl;idl;hpj;bat
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/projects/strgen_vs140.vcxproj b/projects/strgen_vs140.vcxproj
index ebf56a4daf..b972d873eb 100644
--- a/projects/strgen_vs140.vcxproj
+++ b/projects/strgen_vs140.vcxproj
@@ -92,4 +92,4 @@
-
\ No newline at end of file
+
diff --git a/projects/strgen_vs80.vcproj b/projects/strgen_vs80.vcproj
deleted file mode 100644
index 4450279303..0000000000
--- a/projects/strgen_vs80.vcproj
+++ /dev/null
@@ -1,168 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/projects/strgen_vs90.vcproj b/projects/strgen_vs90.vcproj
deleted file mode 100644
index ca194e078f..0000000000
--- a/projects/strgen_vs90.vcproj
+++ /dev/null
@@ -1,168 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/projects/version_vs100.vcxproj b/projects/version_vs100.vcxproj
deleted file mode 100644
index 008e6dd665..0000000000
--- a/projects/version_vs100.vcxproj
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
-
- Debug
- Win32
-
-
-
- version
- {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}
- version
-
-
-
- Makefile
- MultiByte
-
-
-
-
-
-
-
-
-
- <_ProjectFileVersion>10.0.30319.1
- $(SolutionDir)..\objs\version\
- $(SolutionDir)..\objs\version\
- cscript "$(ProjectDir)/determineversion.vbs"
- cscript "$(ProjectDir)/determineversion.vbs"
- ..\src\rev.cpp
- del ..\src\rev.cpp
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/projects/version_vs140.vcxproj b/projects/version_vs140.vcxproj
index baf374bca0..6e71a88201 100644
--- a/projects/version_vs140.vcxproj
+++ b/projects/version_vs140.vcxproj
@@ -39,4 +39,4 @@
-
\ No newline at end of file
+
diff --git a/projects/version_vs80.vcproj b/projects/version_vs80.vcproj
deleted file mode 100644
index 4b1660b69d..0000000000
--- a/projects/version_vs80.vcproj
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/projects/version_vs90.vcproj b/projects/version_vs90.vcproj
deleted file mode 100644
index 3c3d58a692..0000000000
--- a/projects/version_vs90.vcproj
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/source.list b/source.list
index 9f2f3fc2f3..d77b549cfd 100644
--- a/source.list
+++ b/source.list
@@ -193,6 +193,7 @@ fileio_type.h
fios.h
fontcache.h
fontdetection.h
+framerate_type.h
base_consist.h
gamelog.h
gamelog_internal.h
@@ -408,11 +409,13 @@ music/bemidi.h
music/cocoa_m.h
music/extmidi.h
music/libtimidity.h
+music/fluidsynth.h
music/os2_m.h
music/qtmidi.h
os/macosx/macos.h
os/macosx/osx_stdafx.h
os/macosx/splash.h
+os/macosx/string_osx.h
sound/cocoa_s.h
video/cocoa/cocoa_keys.h
video/cocoa/cocoa_v.h
@@ -466,6 +469,7 @@ dock_gui.cpp
engine_gui.cpp
error_gui.cpp
fios_gui.cpp
+framerate_gui.cpp
genworld_gui.cpp
goal_gui.cpp
graph_gui.cpp
@@ -529,6 +533,7 @@ widgets/dropdown_widget.h
widgets/engine_widget.h
widgets/error_widget.h
widgets/fios_widget.h
+widgets/framerate_widget.h
widgets/genworld_widget.h
widgets/goal_widget.h
widgets/graph_widget.h
@@ -1131,6 +1136,9 @@ music/midifile.cpp
#if LIBTIMIDITY
music/libtimidity.cpp
#end
+#if FLUIDSYNTH
+ music/fluidsynth.cpp
+#end
#end
# Sound
@@ -1167,6 +1175,7 @@ sound/null_s.cpp
music/cocoa_m.cpp
sound/cocoa_s.cpp
os/macosx/splash.cpp
+ os/macosx/string_osx.cpp
#end
#end
diff --git a/src/ai/ai_info.cpp b/src/ai/ai_info.cpp
index 9c27006c47..43a4345460 100644
--- a/src/ai/ai_info.cpp
+++ b/src/ai/ai_info.cpp
@@ -32,9 +32,9 @@ static bool CheckAPIVersion(const char *api_version)
strcmp(api_version, "1.8") == 0 || strcmp(api_version, "1.9") == 0;
}
-#if defined(WIN32)
+#if defined(_WIN32)
#undef GetClassName
-#endif /* WIN32 */
+#endif /* _WIN32 */
template <> const char *GetClassName() { return "AIInfo"; }
/* static */ void AIInfo::RegisterAPI(Squirrel *engine)
diff --git a/src/aircraft.h b/src/aircraft.h
index d4deba5809..f4fce09be1 100644
--- a/src/aircraft.h
+++ b/src/aircraft.h
@@ -45,6 +45,8 @@ enum AirVehicleFlags {
* landscape at a fixed altitude. This only has effect when there are more than 15 height levels. */
VAF_IN_MAX_HEIGHT_CORRECTION = 1, ///< The vehicle is currently lowering its altitude because it hit the upper bound.
VAF_IN_MIN_HEIGHT_CORRECTION = 2, ///< The vehicle is currently raising its altitude because it hit the lower bound.
+
+ VAF_HELI_DIRECT_DESCENT = 3, ///< The helicopter is descending directly at its destination (helipad or in front of hangar)
};
static const int ROTOR_Z_OFFSET = 5; ///< Z Offset between helicopter- and rotorsprite.
diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp
index 94ad00fb9a..b495a1dff5 100644
--- a/src/aircraft_cmd.cpp
+++ b/src/aircraft_cmd.cpp
@@ -37,6 +37,7 @@
#include "core/backup_type.hpp"
#include "zoom_func.h"
#include "disaster_vehicle.h"
+#include "framerate_type.h"
#include "table/strings.h"
@@ -247,7 +248,7 @@ void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height, int &xoff
* @param flags type of operation.
* @param e the engine to build.
* @param data unused.
- * @param ret[out] the vehicle that has been built.
+ * @param[out] ret the vehicle that has been built.
* @return the cost of this operation or an error.
*/
CommandCost CmdBuildAircraft(TileIndex tile, DoCommandFlag flags, const Engine *e, uint16 data, Vehicle **ret)
@@ -634,6 +635,12 @@ static int UpdateAircraftSpeed(Aircraft *v, uint speed_limit = SPEED_LIMIT_NONE,
* and take-off speeds being too low. */
speed_limit *= _settings_game.vehicle.plane_speed;
+ /* adjust speed for broken vehicles */
+ if (v->vehstatus & VS_AIRCRAFT_BROKEN) {
+ if (SPEED_LIMIT_BROKEN < speed_limit) hard_limit = false;
+ speed_limit = min(speed_limit, SPEED_LIMIT_BROKEN);
+ }
+
if (v->vcache.cached_max_speed < speed_limit) {
if (v->cur_speed < speed_limit) hard_limit = false;
speed_limit = v->vcache.cached_max_speed;
@@ -653,9 +660,6 @@ static int UpdateAircraftSpeed(Aircraft *v, uint speed_limit = SPEED_LIMIT_NONE,
spd = min(v->cur_speed + (spd >> 8) + (v->subspeed < t), speed_limit);
- /* adjust speed for broken vehicles */
- if (v->vehstatus & VS_AIRCRAFT_BROKEN) spd = min(spd, SPEED_LIMIT_BROKEN);
-
/* updates statusbar only if speed have changed to save CPU time */
if (spd != v->cur_speed) {
v->cur_speed = spd;
@@ -693,9 +697,9 @@ int GetTileHeightBelowAircraft(const Vehicle *v)
* When the maximum is reached the vehicle should consider descending.
* When the minimum is reached the vehicle should consider ascending.
*
- * @param v The vehicle to get the flight levels for.
- * @param [out] min_level The minimum bounds for flight level.
- * @param [out] max_level The maximum bounds for flight level.
+ * @param v The vehicle to get the flight levels for.
+ * @param[out] min_level The minimum bounds for flight level.
+ * @param[out] max_level The maximum bounds for flight level.
*/
void GetAircraftFlightLevelBounds(const Vehicle *v, int *min_level, int *max_level)
{
@@ -727,7 +731,7 @@ void GetAircraftFlightLevelBounds(const Vehicle *v, int *min_level, int *max_lev
/**
* Gets the maximum 'flight level' for the holding pattern of the aircraft,
- * in pixels 'z_pos' 0, depending on terrain below..
+ * in pixels 'z_pos' 0, depending on terrain below.
*
* @param v The aircraft that may or may not need to decrease its altitude.
* @return Maximal aircraft holding altitude, while in normal flight, in pixels.
@@ -914,6 +918,8 @@ static bool AircraftController(Aircraft *v)
/* Helicopter landing. */
if (amd.flag & AMED_HELI_LOWER) {
+ SetBit(v->flags, VAF_HELI_DIRECT_DESCENT);
+
if (st == NULL) {
/* FIXME - AircraftController -> if station no longer exists, do not land
* helicopter will circle until sign disappears, then go to next order
@@ -934,7 +940,10 @@ static bool AircraftController(Aircraft *v)
Vehicle *u = v->Next()->Next();
/* Increase speed of rotors. When speed is 80, we've landed. */
- if (u->cur_speed >= 80) return true;
+ if (u->cur_speed >= 80) {
+ ClrBit(v->flags, VAF_HELI_DIRECT_DESCENT);
+ return true;
+ }
u->cur_speed += 4;
} else {
count = UpdateAircraftSpeed(v);
@@ -1599,6 +1608,7 @@ static void AircraftEventHandler_Flying(Aircraft *v, const AirportFTAClass *apc)
uint16 tsubspeed = v->subspeed;
if (!AirportHasBlock(v, current, apc)) {
v->state = landingtype; // LANDING / HELILANDING
+ if (v->state == HELILANDING) SetBit(v->flags, VAF_HELI_DIRECT_DESCENT);
/* it's a bit dirty, but I need to set position to next position, otherwise
* if there are multiple runways, plane won't know which one it took (because
* they all have heading LANDING). And also occupy that block! */
@@ -1888,7 +1898,7 @@ static bool FreeTerminal(Aircraft *v, byte i, byte last_terminal)
/**
* Get the number of terminals at the airport.
- * @param afc Airport description.
+ * @param apc Airport description.
* @return Number of terminals.
*/
static uint GetNumTerminals(const AirportFTAClass *apc)
@@ -2038,6 +2048,8 @@ bool Aircraft::Tick()
{
if (!this->IsNormalAircraft()) return true;
+ PerformanceAccumulator framerate(PFE_GL_AIRCRAFT);
+
this->tick_counter++;
if (!(this->vehstatus & VS_STOPPED)) this->running_ticks++;
diff --git a/src/animated_tile.cpp b/src/animated_tile.cpp
index 796c5f5e09..2a4cd89583 100644
--- a/src/animated_tile.cpp
+++ b/src/animated_tile.cpp
@@ -14,6 +14,7 @@
#include "core/smallvec_type.hpp"
#include "tile_cmd.h"
#include "viewport_func.h"
+#include "framerate_type.h"
#include "safeguards.h"
@@ -50,6 +51,8 @@ void AddAnimatedTile(TileIndex tile)
*/
void AnimateAnimatedTiles()
{
+ PerformanceAccumulator framerate(PFE_GL_LANDSCAPE);
+
const TileIndex *ti = _animated_tiles.Begin();
while (ti < _animated_tiles.End()) {
const TileIndex curr = *ti;
diff --git a/src/autoreplace_cmd.cpp b/src/autoreplace_cmd.cpp
index 96eada7345..48f818c947 100644
--- a/src/autoreplace_cmd.cpp
+++ b/src/autoreplace_cmd.cpp
@@ -32,7 +32,6 @@ extern void ChangeVehicleViewWindow(VehicleID from_index, VehicleID to_index);
* Figure out if two engines got at least one type of cargo in common (refitting if needed)
* @param engine_a one of the EngineIDs
* @param engine_b the other EngineID
- * @param type the type of the engines
* @return true if they can both carry the same type of cargo (or at least one of them got no capacity at all)
*/
static bool EnginesHaveCargoInCommon(EngineID engine_a, EngineID engine_b)
@@ -237,7 +236,7 @@ static CargoID GetNewCargoTypeForReplace(Vehicle *v, EngineID engine_type, bool
* @param v The vehicle to find a replacement for
* @param c The vehicle's owner (it's faster to forward the pointer than refinding it)
* @param always_replace Always replace, even if not old.
- * @param [out] e the EngineID of the replacement. INVALID_ENGINE if no replacement is found
+ * @param[out] e the EngineID of the replacement. INVALID_ENGINE if no replacement is found
* @return Error if the engine to build is not available
*/
static CommandCost GetNewEngineType(const Vehicle *v, const Company *c, bool always_replace, EngineID &e)
diff --git a/src/autoreplace_gui.cpp b/src/autoreplace_gui.cpp
index 1074d1dd78..eae0a378eb 100644
--- a/src/autoreplace_gui.cpp
+++ b/src/autoreplace_gui.cpp
@@ -81,7 +81,7 @@ class ReplaceVehicleWindow : public Window {
EngineID sel_engine[2]; ///< Selected engine left and right.
GUIEngineList engines[2]; ///< Left and right list of engines.
bool replace_engines; ///< If \c true, engines are replaced, if \c false, wagons are replaced (only for trains).
- bool reset_sel_engine; ///< Also reset #sel_engine while updating left and/or right (#update_left and/or #update_right) and no valid engine selected.
+ bool reset_sel_engine; ///< Also reset #sel_engine while updating left and/or right and no valid engine selected.
GroupID sel_group; ///< Group selected to replace.
int details_height; ///< Minimal needed height of the details panels (found so far).
byte sort_criteria; ///< Criteria of sorting vehicles.
diff --git a/src/blitter/32bpp_anim_sse4.cpp b/src/blitter/32bpp_anim_sse4.cpp
index 219fb466bb..24d1d7531f 100644
--- a/src/blitter/32bpp_anim_sse4.cpp
+++ b/src/blitter/32bpp_anim_sse4.cpp
@@ -7,7 +7,7 @@
* 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 32bpp_sse4_anim.cpp Implementation of the SSE4 32 bpp blitter with animation support. */
+/** @file 32bpp_anim_sse4.cpp Implementation of the SSE4 32 bpp blitter with animation support. */
#ifdef WITH_SSE
diff --git a/src/blitter/32bpp_anim_sse4.hpp b/src/blitter/32bpp_anim_sse4.hpp
index 9d9ad5dd92..5ff1fb01be 100644
--- a/src/blitter/32bpp_anim_sse4.hpp
+++ b/src/blitter/32bpp_anim_sse4.hpp
@@ -7,7 +7,7 @@
* 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 32bpp_sse4_anim.hpp A SSE4 32 bpp blitter with animation support. */
+/** @file 32bpp_anim_sse4.hpp A SSE4 32 bpp blitter with animation support. */
#ifndef BLITTER_32BPP_SSE4_ANIM_HPP
#define BLITTER_32BPP_SSE4_ANIM_HPP
diff --git a/src/blitter/32bpp_sse_type.h b/src/blitter/32bpp_sse_type.h
index b32d3c5abd..49c7a68c20 100644
--- a/src/blitter/32bpp_sse_type.h
+++ b/src/blitter/32bpp_sse_type.h
@@ -7,10 +7,10 @@
* 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 32bpp_sse_type.hpp Types related to SSE 32 bpp blitter. */
+/** @file 32bpp_sse_type.h Types related to SSE 32 bpp blitter. */
-#ifndef BLITTER_32BPP_SSE_TYPE_HPP
-#define BLITTER_32BPP_SSE_TYPE_HPP
+#ifndef BLITTER_32BPP_SSE_TYPE_H
+#define BLITTER_32BPP_SSE_TYPE_H
#ifdef WITH_SSE
@@ -55,4 +55,4 @@ typedef union ALIGN(16) um128i {
#define TRANSPARENT_NOM_BASE _mm_setr_epi16(256, 256, 256, 256, 256, 256, 256, 256)
#endif /* WITH_SSE */
-#endif /* BLITTER_32BPP_SSE_TYPE_HPP */
+#endif /* BLITTER_32BPP_SSE_TYPE_H */
diff --git a/src/bootstrap_gui.cpp b/src/bootstrap_gui.cpp
index 62f5450c5b..3fb52a1f9e 100644
--- a/src/bootstrap_gui.cpp
+++ b/src/bootstrap_gui.cpp
@@ -220,7 +220,7 @@ bool HandleBootstrap()
if (BlitterFactory::GetCurrentBlitter()->GetScreenDepth() == 0) goto failure;
/* If there is no network or no freetype, then there is nothing we can do. Go straight to failure. */
-#if defined(ENABLE_NETWORK) && defined(WITH_FREETYPE) && (defined(WITH_FONTCONFIG) || defined(WIN32) || defined(__APPLE__))
+#if defined(ENABLE_NETWORK) && defined(WITH_FREETYPE) && (defined(WITH_FONTCONFIG) || defined(_WIN32) || defined(__APPLE__))
if (!_network_available) goto failure;
/* First tell the game we're bootstrapping. */
diff --git a/src/bridge_gui.cpp b/src/bridge_gui.cpp
index 797ead1f51..768691f080 100644
--- a/src/bridge_gui.cpp
+++ b/src/bridge_gui.cpp
@@ -55,7 +55,7 @@ typedef GUIList GUIBridgeList; ///< List of bridges, used in #B
* @param p1 packed start tile coords (~ dx)
* @param p2 various bitstuffed elements
* - p2 = (bit 0- 7) - bridge type (hi bh)
- * - p2 = (bit 8-11) - rail type or road types.
+ * - p2 = (bit 8-13) - rail type or road types.
* - p2 = (bit 15-16) - transport type.
*/
void CcBuildBridge(const CommandCost &result, TileIndex end_tile, uint32 p1, uint32 p2)
diff --git a/src/bridge_map.cpp b/src/bridge_map.cpp
index d1e0d6024a..b738895065 100644
--- a/src/bridge_map.cpp
+++ b/src/bridge_map.cpp
@@ -56,7 +56,7 @@ TileIndex GetSouthernBridgeEnd(TileIndex t)
/**
* Starting at one bridge end finds the other bridge end
- * @param t the bridge ramp tile to find the other bridge ramp for
+ * @param tile the bridge ramp tile to find the other bridge ramp for
*/
TileIndex GetOtherBridgeEnd(TileIndex tile)
{
@@ -66,7 +66,7 @@ TileIndex GetOtherBridgeEnd(TileIndex tile)
/**
* Get the height ('z') of a bridge.
- * @param tile the bridge ramp tile to get the bridge height from
+ * @param t the bridge ramp tile to get the bridge height from
* @return the height of the bridge.
*/
int GetBridgeHeight(TileIndex t)
diff --git a/src/bridge_map.h b/src/bridge_map.h
index 74c6974db2..75b20498d1 100644
--- a/src/bridge_map.h
+++ b/src/bridge_map.h
@@ -131,11 +131,12 @@ static inline void MakeBridgeRamp(TileIndex t, Owner o, BridgeType bridgetype, D
SetTileType(t, MP_TUNNELBRIDGE);
SetTileOwner(t, o);
_m[t].m2 = 0;
- _m[t].m3 = rt;
+ _m[t].m3 = 0;
_m[t].m4 = 0;
_m[t].m5 = 1 << 7 | tt << 2 | d;
SB(_me[t].m6, 2, 4, bridgetype);
_me[t].m7 = 0;
+ _me[t].m8 = rt;
}
/**
diff --git a/src/cargo_type.h b/src/cargo_type.h
index c84f1f4902..79d1c84f46 100644
--- a/src/cargo_type.h
+++ b/src/cargo_type.h
@@ -70,9 +70,14 @@ enum CargoType {
CT_INVALID = 0xFF, ///< Invalid cargo type.
};
+/** Test whether cargo type is not CT_INVALID */
+inline bool IsCargoTypeValid(CargoType t) { return t != CT_INVALID; }
+/** Test whether cargo type is not CT_INVALID */
+inline bool IsCargoIDValid(CargoID t) { return t != CT_INVALID; }
+
typedef uint64 CargoTypes;
-static const CargoTypes ALL_CARGOTYPES = (CargoTypes)UINT32_MAX;
+static const CargoTypes ALL_CARGOTYPES = (CargoTypes)UINT64_MAX;
/** Class for storing amounts of cargo */
struct CargoArray {
diff --git a/src/cargopacket.cpp b/src/cargopacket.cpp
index 9b96be62eb..9e699d6f42 100644
--- a/src/cargopacket.cpp
+++ b/src/cargopacket.cpp
@@ -602,7 +602,7 @@ uint VehicleCargoList::Reassign
static inline T ROL(const T x, const uint8 n)
{
+ if (n == 0) return x;
return (T)(x << n | x >> (sizeof(x) * 8 - n));
}
@@ -317,6 +318,7 @@ static inline T ROL(const T x, const uint8 n)
template
static inline T ROR(const T x, const uint8 n)
{
+ if (n == 0) return x;
return (T)(x >> n | x << (sizeof(x) * 8 - n));
}
diff --git a/src/core/endian_type.hpp b/src/core/endian_type.hpp
index 453bf5402c..4058c5c19a 100644
--- a/src/core/endian_type.hpp
+++ b/src/core/endian_type.hpp
@@ -26,7 +26,7 @@
#define TTD_BIG_ENDIAN 1
/* Windows has always LITTLE_ENDIAN */
-#if defined(WIN32) || defined(__OS2__) || defined(WIN64)
+#if defined(_WIN32) || defined(__OS2__)
# define TTD_ENDIAN TTD_LITTLE_ENDIAN
#elif defined(OSX)
# include
@@ -42,6 +42,6 @@
# else
# define TTD_ENDIAN TTD_BIG_ENDIAN
# endif
-#endif /* WIN32 || __OS2__ || WIN64 */
+#endif /* _WIN32 || __OS2__ */
#endif /* ENDIAN_TYPE_HPP */
diff --git a/src/core/smallmatrix_type.hpp b/src/core/smallmatrix_type.hpp
index 9ebf0372c2..cd4dee4e3a 100644
--- a/src/core/smallmatrix_type.hpp
+++ b/src/core/smallmatrix_type.hpp
@@ -159,7 +159,7 @@ public:
/**
* Erase a row, replacing it with the last one.
- * @param x Position of the row.
+ * @param y Position of the row.
*/
void EraseRow(uint y)
{
@@ -174,7 +174,7 @@ public:
/**
* Remove columns from the matrix while preserving the order of other columns.
- * @param x First column to remove.
+ * @param y First column to remove.
* @param count Number of consecutive columns to remove.
*/
void EraseRowPreservingOrder(uint y, uint count = 1)
@@ -210,8 +210,8 @@ public:
/**
* Set the size to a specific width and height, preserving item positions
* as far as possible in the process.
- * @param width Target width.
- * @param height Target height.
+ * @param new_width Target width.
+ * @param new_height Target height.
*/
inline void Resize(uint new_width, uint new_height)
{
@@ -297,7 +297,7 @@ public:
/**
* Get column "number" (const)
*
- * @param X Position of the column.
+ * @param x Position of the column.
* @return Column at "number".
*/
inline const T *operator[](uint x) const
@@ -309,7 +309,7 @@ public:
/**
* Get column "number" (const)
*
- * @param X Position of the column.
+ * @param x Position of the column.
* @return Column at "number".
*/
inline T *operator[](uint x)
diff --git a/src/currency.cpp b/src/currency.cpp
index 8cc385fc04..615c5113bb 100644
--- a/src/currency.cpp
+++ b/src/currency.cpp
@@ -62,6 +62,7 @@ static const CurrencySpec origin_currency_specs[CURRENCY_END] = {
{ 1, "", CF_NOEURO, "", "", 2, STR_GAME_OPTIONS_CURRENCY_CUSTOM }, ///< custom currency (add further languages below)
{ 3, "", CF_NOEURO, "", NBSP "GEL", 1, STR_GAME_OPTIONS_CURRENCY_GEL }, ///< Georgian Lari
{ 4901, "", CF_NOEURO, "", NBSP "Rls", 1, STR_GAME_OPTIONS_CURRENCY_IRR }, ///< Iranian Rial
+ { 80, "", CF_NOEURO, "", NBSP "rub", 1, STR_GAME_OPTIONS_CURRENCY_RUB }, ///< New Russian Ruble
};
/** Array of currencies used by the system */
diff --git a/src/currency.h b/src/currency.h
index ab8026002d..2529aca11f 100644
--- a/src/currency.h
+++ b/src/currency.h
@@ -58,6 +58,7 @@ enum Currencies {
CURRENCY_CUSTOM, ///< Custom currency
CURRENCY_GEL, ///< Georgian Lari
CURRENCY_IRR, ///< Iranian Rial
+ CURRENCY_RUB, ///< New Russian Ruble
CURRENCY_END, ///< always the last item
};
diff --git a/src/debug.cpp b/src/debug.cpp
index f8f3f0ad56..13df98db34 100644
--- a/src/debug.cpp
+++ b/src/debug.cpp
@@ -17,7 +17,7 @@
#include "fileio_func.h"
#include "settings_type.h"
-#if defined(WIN32) || defined(WIN64)
+#if defined(_WIN32)
#include "os/windows/win32.h"
#endif
@@ -139,7 +139,7 @@ static void debug_print(const char *dbg, const char *buf)
} else {
char buffer[512];
seprintf(buffer, lastof(buffer), "%sdbg: [%s] %s\n", GetLogPrefix(), dbg, buf);
-#if defined(WIN32) || defined(WIN64)
+#if defined(_WIN32)
TCHAR system_buf[512];
convert_to_fs(buffer, system_buf, lengthof(system_buf), true);
_fputts(system_buf, stderr);
diff --git a/src/depend/depend.cpp b/src/depend/depend.cpp
index d4b102ddcf..f57acba25c 100644
--- a/src/depend/depend.cpp
+++ b/src/depend/depend.cpp
@@ -217,22 +217,22 @@ enum Token {
TOKEN_LOCAL, ///< Read a local include
TOKEN_GLOBAL, ///< Read a global include
TOKEN_IDENTIFIER, ///< Identifier within the data.
- TOKEN_DEFINE, ///< (#)define in code
- TOKEN_IF, ///< (#)if in code
- TOKEN_IFDEF, ///< (#)ifdef in code
- TOKEN_IFNDEF, ///< (#)ifndef in code
- TOKEN_ELIF, ///< (#)elif in code
- TOKEN_ELSE, ///< (#)else in code
- TOKEN_ENDIF, ///< (#)endif in code
- TOKEN_UNDEF, ///< (#)undef in code
- TOKEN_OR, ///< '||' within #if expression
- TOKEN_AND, ///< '&&' within #if expression
- TOKEN_DEFINED, ///< 'defined' within #if expression
- TOKEN_OPEN, ///< '(' within #if expression
- TOKEN_CLOSE, ///< ')' within #if expression
- TOKEN_NOT, ///< '!' within #if expression
- TOKEN_ZERO, ///< '0' within #if expression
- TOKEN_INCLUDE, ///< (#)include in code
+ TOKEN_DEFINE, ///< \c \#define in code
+ TOKEN_IF, ///< \c \#if in code
+ TOKEN_IFDEF, ///< \c \#ifdef in code
+ TOKEN_IFNDEF, ///< \c \#ifndef in code
+ TOKEN_ELIF, ///< \c \#elif in code
+ TOKEN_ELSE, ///< \c \#else in code
+ TOKEN_ENDIF, ///< \c \#endif in code
+ TOKEN_UNDEF, ///< \c \#undef in code
+ TOKEN_OR, ///< '||' within \c \#if expression
+ TOKEN_AND, ///< '&&' within \c \#if expression
+ TOKEN_DEFINED, ///< 'defined' within \c \#if expression
+ TOKEN_OPEN, ///< '(' within \c \#if expression
+ TOKEN_CLOSE, ///< ')' within \c \#if expression
+ TOKEN_NOT, ///< '!' within \c \#if expression
+ TOKEN_ZERO, ///< '0' within \c \#if expression
+ TOKEN_INCLUDE, ///< \c \#include in code
};
/** Mapping from a C-style keyword representation to a Token. */
@@ -681,8 +681,8 @@ bool ExpressionOr(Lexer *lexer, StringSet *defines, bool verbose)
/** Enumerator to tell how long to ignore 'stuff'. */
enum Ignore {
NOT_IGNORE, ///< No ignoring.
- IGNORE_UNTIL_ELSE, ///< Ignore till a #else is reached.
- IGNORE_UNTIL_ENDIF, ///< Ignore till a #endif is reached.
+ IGNORE_UNTIL_ELSE, ///< Ignore till a \c \#else is reached.
+ IGNORE_UNTIL_ENDIF, ///< Ignore till a \c \#endif is reached.
};
/**
diff --git a/src/depot_gui.cpp b/src/depot_gui.cpp
index 14461d8817..39accd65f1 100644
--- a/src/depot_gui.cpp
+++ b/src/depot_gui.cpp
@@ -908,9 +908,16 @@ struct DepotWindow : Window {
*/
virtual bool OnVehicleSelect(const Vehicle *v)
{
- if (DoCommandP(this->window_number, v->index, _ctrl_pressed ? 1 : 0, CMD_CLONE_VEHICLE | CMD_MSG(STR_ERROR_CAN_T_BUY_TRAIN + v->type), CcCloneVehicle)) {
- ResetObjectToPlace();
+ if (_ctrl_pressed) {
+ /* Share-clone, do not open new viewport, and keep tool active */
+ DoCommandP(this->window_number, v->index, 1, CMD_CLONE_VEHICLE | CMD_MSG(STR_ERROR_CAN_T_BUY_TRAIN + v->type), NULL);
+ } else {
+ /* Copy-clone, open viewport for new vehicle, and deselect the tool (assume player wants to changs things on new vehicle) */
+ if (DoCommandP(this->window_number, v->index, 0, CMD_CLONE_VEHICLE | CMD_MSG(STR_ERROR_CAN_T_BUY_TRAIN + v->type), CcCloneVehicle)) {
+ ResetObjectToPlace();
+ }
}
+
return true;
}
diff --git a/src/dock_gui.cpp b/src/dock_gui.cpp
index 79eaa89b14..f09720b357 100644
--- a/src/dock_gui.cpp
+++ b/src/dock_gui.cpp
@@ -56,8 +56,8 @@ void CcPlaySound_SPLAT_WATER(const CommandCost &result, TileIndex tile, uint32 p
/**
* Gets the other end of the aqueduct, if possible.
- * @param tile_from The begin tile for the aqueduct.
- * @param [out] tile_to The tile till where to show a selection for the aqueduct.
+ * @param tile_from The begin tile for the aqueduct.
+ * @param[out] tile_to The tile till where to show a selection for the aqueduct.
* @return The other end of the aqueduct, or otherwise a tile in line with the aqueduct to cause the right error message.
*/
static TileIndex GetOtherAqueductEnd(TileIndex tile_from, TileIndex *tile_to = NULL)
diff --git a/src/economy.cpp b/src/economy.cpp
index fae71f3e42..c7ffa96cc7 100644
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -95,7 +95,7 @@ const ScoreInfo _score_info[] = {
{ 0, 0} // SCORE_TOTAL
};
-int _score_part[MAX_COMPANIES][SCORE_END];
+int64 _score_part[MAX_COMPANIES][SCORE_END];
Economy _economy;
Prices _price;
Money _additional_cash_required;
@@ -183,7 +183,7 @@ int UpdateCompanyRatingAndValue(Company *c, bool update)
_score_part[owner][SCORE_VEHICLES] = num;
/* Don't allow negative min_profit to show */
if (min_profit > 0) {
- _score_part[owner][SCORE_MIN_PROFIT] = ClampToI32(min_profit);
+ _score_part[owner][SCORE_MIN_PROFIT] = min_profit;
}
}
@@ -213,10 +213,10 @@ int UpdateCompanyRatingAndValue(Company *c, bool update)
} while (++cee, --numec);
if (min_income > 0) {
- _score_part[owner][SCORE_MIN_INCOME] = ClampToI32(min_income);
+ _score_part[owner][SCORE_MIN_INCOME] = min_income;
}
- _score_part[owner][SCORE_MAX_INCOME] = ClampToI32(max_income);
+ _score_part[owner][SCORE_MAX_INCOME] = max_income;
}
}
@@ -230,7 +230,7 @@ int UpdateCompanyRatingAndValue(Company *c, bool update)
total_delivered += cee->delivered_cargo.GetSum();
} while (++cee, --numec);
- _score_part[owner][SCORE_DELIVERED] = ClampToI32(total_delivered);
+ _score_part[owner][SCORE_DELIVERED] = total_delivered;
}
}
@@ -242,13 +242,13 @@ int UpdateCompanyRatingAndValue(Company *c, bool update)
/* Generate score for company's money */
{
if (c->money > 0) {
- _score_part[owner][SCORE_MONEY] = ClampToI32(c->money);
+ _score_part[owner][SCORE_MONEY] = c->money;
}
}
/* Generate score for loan */
{
- _score_part[owner][SCORE_LOAN] = ClampToI32(_score_info[SCORE_LOAN].needed - c->current_loan);
+ _score_part[owner][SCORE_LOAN] = _score_info[SCORE_LOAN].needed - c->current_loan;
}
/* Now we calculate the score for each item.. */
@@ -1062,6 +1062,7 @@ static uint DeliverGoodsToIndustry(const Station *st, CargoID cargo_type, uint n
uint amount = min(num_pieces, 0xFFFFU - ind->incoming_cargo_waiting[cargo_index]);
ind->incoming_cargo_waiting[cargo_index] += amount;
+ ind->last_cargo_accepted_at[cargo_index] = _date;
num_pieces -= amount;
accepted += amount;
}
@@ -1138,7 +1139,6 @@ static void TriggerIndustryProduction(Industry *i)
uint16 callback = indspec->callback_mask;
i->was_cargo_delivered = true;
- i->last_cargo_accepted_at = _date;
if (HasBit(callback, CBM_IND_PRODUCTION_CARGO_ARRIVAL) || HasBit(callback, CBM_IND_PRODUCTION_256_TICKS)) {
if (HasBit(callback, CBM_IND_PRODUCTION_CARGO_ARRIVAL)) {
@@ -1147,14 +1147,15 @@ static void TriggerIndustryProduction(Industry *i)
SetWindowDirty(WC_INDUSTRY_VIEW, i->index);
}
} else {
- for (uint cargo_index = 0; cargo_index < lengthof(i->incoming_cargo_waiting); cargo_index++) {
- uint cargo_waiting = i->incoming_cargo_waiting[cargo_index];
+ for (uint ci_in = 0; ci_in < lengthof(i->incoming_cargo_waiting); ci_in++) {
+ uint cargo_waiting = i->incoming_cargo_waiting[ci_in];
if (cargo_waiting == 0) continue;
- i->produced_cargo_waiting[0] = min(i->produced_cargo_waiting[0] + (cargo_waiting * indspec->input_cargo_multiplier[cargo_index][0] / 256), 0xFFFF);
- i->produced_cargo_waiting[1] = min(i->produced_cargo_waiting[1] + (cargo_waiting * indspec->input_cargo_multiplier[cargo_index][1] / 256), 0xFFFF);
+ for (uint ci_out = 0; ci_out < lengthof(i->produced_cargo_waiting); ci_out++) {
+ i->produced_cargo_waiting[ci_out] = min(i->produced_cargo_waiting[ci_out] + (cargo_waiting * indspec->input_cargo_multiplier[ci_in][ci_out] / 256), 0xFFFF);
+ }
- i->incoming_cargo_waiting[cargo_index] = 0;
+ i->incoming_cargo_waiting[ci_in] = 0;
}
}
@@ -1242,7 +1243,6 @@ Money CargoPayment::PayTransfer(const CargoPacket *cp, uint count)
/**
* Prepare the vehicle to be unloaded.
- * @param curr_station the station where the consist is at the moment
* @param front_v the vehicle to be unloaded
*/
void PrepareUnload(Vehicle *front_v)
diff --git a/src/economy_func.h b/src/economy_func.h
index 111ce85a27..7b369b7d60 100644
--- a/src/economy_func.h
+++ b/src/economy_func.h
@@ -22,7 +22,7 @@ void ResetPriceBaseMultipliers();
void SetPriceBaseMultiplier(Price price, int factor);
extern const ScoreInfo _score_info[];
-extern int _score_part[MAX_COMPANIES][SCORE_END];
+extern int64 _score_part[MAX_COMPANIES][SCORE_END];
extern Economy _economy;
/* Prices and also the fractional part. */
extern Prices _price;
diff --git a/src/engine.cpp b/src/engine.cpp
index ac2e8df0ec..9f500e1cdf 100644
--- a/src/engine.cpp
+++ b/src/engine.cpp
@@ -431,9 +431,9 @@ uint Engine::GetDisplayMaxTractiveEffort() const
/* Only trains and road vehicles have 'tractive effort'. */
switch (this->type) {
case VEH_TRAIN:
- return (10 * this->GetDisplayWeight() * GetEngineProperty(this->index, PROP_TRAIN_TRACTIVE_EFFORT, this->u.rail.tractive_effort)) / 256;
+ return (GROUND_ACCELERATION * this->GetDisplayWeight() * GetEngineProperty(this->index, PROP_TRAIN_TRACTIVE_EFFORT, this->u.rail.tractive_effort)) / 256 / 1000;
case VEH_ROAD:
- return (10 * this->GetDisplayWeight() * GetEngineProperty(this->index, PROP_ROADVEH_TRACTIVE_EFFORT, this->u.road.tractive_effort)) / 256;
+ return (GROUND_ACCELERATION * this->GetDisplayWeight() * GetEngineProperty(this->index, PROP_ROADVEH_TRACTIVE_EFFORT, this->u.road.tractive_effort)) / 256 / 1000;
default: NOT_REACHED();
}
@@ -573,7 +573,7 @@ static bool IsWagon(EngineID index)
}
/**
- * Update #reliability of engine \a e, (if needed) update the engine GUIs.
+ * Update #Engine::reliability and (if needed) update the engine GUIs.
* @param e %Engine to update.
*/
static void CalcEngineReliability(Engine *e)
diff --git a/src/error_gui.cpp b/src/error_gui.cpp
index c8c603afb3..1c59b7e8d0 100644
--- a/src/error_gui.cpp
+++ b/src/error_gui.cpp
@@ -425,7 +425,7 @@ void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, WarningLevel
/**
* Schedule a list of errors.
* Note: This does not try to display the error now. This is useful if the window system is not yet running.
- * @param data Error message datas; cleared afterwards
+ * @param datas Error message datas; cleared afterwards
*/
void ScheduleErrorMessage(ErrorList &datas)
{
diff --git a/src/fileio.cpp b/src/fileio.cpp
index 3ad5be711d..0e6d86e3c7 100644
--- a/src/fileio.cpp
+++ b/src/fileio.cpp
@@ -15,7 +15,7 @@
#include "fios.h"
#include "string_func.h"
#include "tar_type.h"
-#ifdef WIN32
+#ifdef _WIN32
#include
# define access _taccess
#elif defined(__HAIKU__)
@@ -347,7 +347,7 @@ char *FioGetFullPath(char *buf, const char *last, Searchpath sp, Subdirectory su
/**
* Find a path to the filename in one of the search directories.
- * @param buf [out] Destination buffer for the path.
+ * @param[out] buf Destination buffer for the path.
* @param last End of the destination buffer.
* @param subdir Subdirectory to try.
* @param filename Filename to look for.
@@ -361,7 +361,7 @@ char *FioFindFullPath(char *buf, const char *last, Subdirectory subdir, const ch
FOR_ALL_SEARCHPATHS(sp) {
FioGetFullPath(buf, last, sp, subdir, filename);
if (FileExists(buf)) return buf;
-#if !defined(WIN32)
+#if !defined(_WIN32)
/* Be, as opening files, aware that sometimes the filename
* might be in uppercase when it is in lowercase on the
* disk. Of course Windows doesn't care about casing. */
@@ -399,7 +399,7 @@ char *FioGetDirectory(char *buf, const char *last, Subdirectory subdir)
static FILE *FioFOpenFileSp(const char *filename, const char *mode, Searchpath sp, Subdirectory subdir, size_t *filesize)
{
-#if defined(WIN32) && defined(UNICODE)
+#if defined(_WIN32) && defined(UNICODE)
/* fopen is implemented as a define with ellipses for
* Unicode support (prepend an L). As we are not sending
* a string, but a variable, it 'renames' the variable,
@@ -416,12 +416,12 @@ static FILE *FioFOpenFileSp(const char *filename, const char *mode, Searchpath s
seprintf(buf, lastof(buf), "%s%s%s", _searchpaths[sp], _subdirs[subdir], filename);
}
-#if defined(WIN32)
+#if defined(_WIN32)
if (mode[0] == 'r' && GetFileAttributes(OTTD2FS(buf)) == INVALID_FILE_ATTRIBUTES) return NULL;
#endif
f = fopen(buf, mode);
-#if !defined(WIN32)
+#if !defined(_WIN32)
if (f == NULL && strtolower(buf + ((subdir == NO_DIRECTORY) ? 0 : strlen(_searchpaths[sp]) - 1))) {
f = fopen(buf, mode);
}
@@ -438,7 +438,7 @@ static FILE *FioFOpenFileSp(const char *filename, const char *mode, Searchpath s
/**
* Opens a file from inside a tar archive.
* @param entry The entry to open.
- * @param filesize [out] If not \c NULL, size of the opened file.
+ * @param[out] filesize If not \c NULL, size of the opened file.
* @return File handle of the opened file, or \c NULL if the file is not available.
* @note The file is read from within the tar file, and may not return \c EOF after reading the whole file.
*/
@@ -460,7 +460,6 @@ FILE *FioFOpenFileTar(TarFileListEntry *entry, size_t *filesize)
* Opens a OpenTTD file somewhere in a personal or global directory.
* @param filename Name of the file to open.
* @param subdir Subdirectory to open.
- * @param filename Name of the file to open.
* @return File handle of the opened file, or \c NULL if the file is not available.
*/
FILE *FioFOpenFile(const char *filename, const char *mode, Subdirectory subdir, size_t *filesize)
@@ -536,7 +535,7 @@ void FioCreateDirectory(const char *name)
{
/* Ignore directory creation errors; they'll surface later on, and most
* of the time they are 'directory already exists' errors anyhow. */
-#if defined(WIN32)
+#if defined(_WIN32)
CreateDirectory(OTTD2FS(name), NULL);
#elif defined(OS2) && !defined(__INNOTEK_LIBC__)
mkdir(OTTD2FS(name));
@@ -632,7 +631,7 @@ static void SimplifyFileName(char *name)
/**
* Perform the scanning of a particular subdirectory.
- * @param subdir The subdirectory to scan.
+ * @param sd The subdirectory to scan.
* @return The number of found tar files.
*/
uint TarScanner::DoScan(Subdirectory sd)
@@ -980,14 +979,14 @@ bool ExtractTar(const char *tar_filename, Subdirectory subdir)
return true;
}
-#if defined(WIN32)
+#if defined(_WIN32)
/**
* Determine the base (personal dir and game data dir) paths
* @param exe the path from the current path to the executable
* @note defined in the OS related files (os2.cpp, win32.cpp, unix.cpp etc)
*/
extern void DetermineBasePaths(const char *exe);
-#else /* defined(WIN32) */
+#else /* defined(_WIN32) */
/**
* Changes the working directory to the path of the give executable.
@@ -1150,7 +1149,7 @@ extern void cocoaSetApplicationBundleDir();
_searchpaths[SP_APPLICATION_BUNDLE_DIR] = NULL;
#endif
}
-#endif /* defined(WIN32) */
+#endif /* defined(_WIN32) */
const char *_personal_dir;
@@ -1303,7 +1302,7 @@ void SanitizeFilename(char *filename)
/**
* Load a file into memory.
* @param filename Name of the file to load.
- * @param lenp [out] Length of loaded data.
+ * @param[out] lenp Length of loaded data.
* @param maxsize Maximum size to load.
* @return Pointer to new memory containing the loaded data, or \c NULL if loading failed.
* @note If \a maxsize less than the length of the file, loading fails.
diff --git a/src/fileio_func.h b/src/fileio_func.h
index 6383180744..f5ef58ac06 100644
--- a/src/fileio_func.h
+++ b/src/fileio_func.h
@@ -118,7 +118,7 @@ public:
DECLARE_ENUM_AS_BIT_SET(TarScanner::Mode)
/* Implementation of opendir/readdir/closedir for Windows */
-#if defined(WIN32)
+#if defined(_WIN32)
struct DIR;
struct dirent { // XXX - only d_name implemented
@@ -136,7 +136,7 @@ int closedir(DIR *d);
/* Use system-supplied opendir/readdir/closedir functions */
# include
# include
-#endif /* defined(WIN32) */
+#endif /* defined(_WIN32) */
/**
* A wrapper around opendir() which will convert the string from
diff --git a/src/fios.cpp b/src/fios.cpp
index f4a25e1ed2..73365ddc29 100644
--- a/src/fios.cpp
+++ b/src/fios.cpp
@@ -20,9 +20,9 @@
#include "string_func.h"
#include
-#ifndef WIN32
+#ifndef _WIN32
# include
-#endif /* WIN32 */
+#endif /* _WIN32 */
#include "table/strings.h"
@@ -153,7 +153,7 @@ const char *FiosBrowseTo(const FiosItem *item)
{
switch (item->type) {
case FIOS_TYPE_DRIVE:
-#if defined(WIN32) || defined(__OS2__)
+#if defined(_WIN32) || defined(__OS2__)
seprintf(_fios_path, _fios_path_last, "%c:" PATHSEP, item->title[0]);
#endif
break;
@@ -318,7 +318,7 @@ bool FiosFileScanner::AddFile(const char *filename, size_t basepath_length, cons
}
FiosItem *fios = file_list.Append();
-#ifdef WIN32
+#ifdef _WIN32
struct _stat sb;
if (_tstat(OTTD2FS(filename), &sb) == 0) {
#else
diff --git a/src/fios.h b/src/fios.h
index 5e17e8ee17..24c9f370eb 100644
--- a/src/fios.h
+++ b/src/fios.h
@@ -18,6 +18,13 @@
#include "network/core/tcp_content.h"
+/** Special values for save-load window for the data parameter of #InvalidateWindowData. */
+enum SaveLoadInvalidateWindowData {
+ SLIWD_RESCAN_FILES, ///< Rescan all files (when changed directory, ...)
+ SLIWD_SELECTION_CHANGES, ///< File selection has changed (user click, ...)
+ SLIWD_FILTER_CHANGES, ///< The filename filter has changed (via the editbox)
+};
+
typedef SmallMap CompanyPropertiesMap;
/**
diff --git a/src/fios_gui.cpp b/src/fios_gui.cpp
index f20cfd7927..e149d07b47 100644
--- a/src/fios_gui.cpp
+++ b/src/fios_gui.cpp
@@ -28,6 +28,7 @@
#include "date_func.h"
#include "core/geometry_func.hpp"
#include "gamelog.h"
+#include "stringfilter_type.h"
#include "widgets/fios_widget.h"
@@ -76,9 +77,20 @@ static const NWidgetPart _nested_load_dialog_widgets[] = {
NWidget(WWT_CAPTION, COLOUR_GREY, WID_SL_CAPTION),
NWidget(WWT_DEFSIZEBOX, COLOUR_GREY),
EndContainer(),
+ /* Current directory and free space */
NWidget(WWT_PANEL, COLOUR_GREY, WID_SL_BACKGROUND), SetFill(1, 0), SetResize(1, 0), EndContainer(),
+
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
- NWidget(NWID_VERTICAL),
+ /* Left side : filter box and available files */
+ NWidget(WWT_PANEL, COLOUR_GREY), SetFill(1, 1), SetResize(1, 1),
+ /* Filter box with label */
+ NWidget(NWID_HORIZONTAL), SetPadding(WD_FRAMERECT_TOP, 0, WD_FRAMERECT_BOTTOM, 0),
+ SetPIP(WD_FRAMETEXT_LEFT, WD_FRAMETEXT_RIGHT, 0),
+ NWidget(WWT_TEXT, COLOUR_GREY), SetFill(0, 1), SetDataTip(STR_SAVELOAD_FILTER_TITLE , STR_NULL),
+ NWidget(WWT_EDITBOX, COLOUR_GREY, WID_SL_FILTER), SetFill(1, 0), SetMinimalSize(50, 12), SetResize(1, 0),
+ SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP),
+ EndContainer(),
+ /* Sort buttons */
NWidget(NWID_HORIZONTAL),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SL_SORT_BYNAME), SetDataTip(STR_SORT_BY_CAPTION_NAME, STR_TOOLTIP_SORT_ORDER), SetFill(1, 0), SetResize(1, 0),
@@ -86,6 +98,7 @@ static const NWidgetPart _nested_load_dialog_widgets[] = {
EndContainer(),
NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SL_HOME_BUTTON), SetMinimalSize(12, 12), SetDataTip(SPR_HOUSE_ICON, STR_SAVELOAD_HOME_BUTTON),
EndContainer(),
+ /* Files */
NWidget(WWT_PANEL, COLOUR_GREY, WID_SL_FILE_BACKGROUND),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_INSET, COLOUR_GREY, WID_SL_DRIVES_DIRECTORIES_LIST), SetFill(1, 1), SetPadding(2, 1, 2, 2),
@@ -98,6 +111,8 @@ static const NWidgetPart _nested_load_dialog_widgets[] = {
EndContainer(),
EndContainer(),
EndContainer(),
+
+ /* Right side : game details */
NWidget(WWT_PANEL, COLOUR_GREY),
NWidget(WWT_EMPTY, INVALID_COLOUR, WID_SL_DETAILS), SetResize(1, 1), SetFill(1, 1),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SL_MISSING_NEWGRFS), SetDataTip(STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_BUTTON, STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_TOOLTIP), SetFill(1, 0), SetResize(1, 0),
@@ -119,8 +134,18 @@ static const NWidgetPart _nested_load_heightmap_dialog_widgets[] = {
NWidget(WWT_CAPTION, COLOUR_GREY, WID_SL_CAPTION),
NWidget(WWT_DEFSIZEBOX, COLOUR_GREY),
EndContainer(),
+ /* Current directory and free space */
NWidget(WWT_PANEL, COLOUR_GREY, WID_SL_BACKGROUND), SetFill(1, 0), SetResize(1, 0), EndContainer(),
- NWidget(NWID_VERTICAL),
+
+ NWidget(WWT_PANEL, COLOUR_GREY), SetFill(1, 1), SetResize(1, 1),
+ /* Filter box with label */
+ NWidget(NWID_HORIZONTAL), SetPadding(WD_FRAMERECT_TOP, 0, WD_FRAMERECT_BOTTOM, 0),
+ SetPIP(WD_FRAMETEXT_LEFT, WD_FRAMETEXT_RIGHT, 0),
+ NWidget(WWT_TEXT, COLOUR_GREY), SetFill(0, 1), SetDataTip(STR_SAVELOAD_FILTER_TITLE , STR_NULL),
+ NWidget(WWT_EDITBOX, COLOUR_GREY, WID_SL_FILTER), SetFill(1, 0), SetMinimalSize(50, 12), SetResize(1, 0),
+ SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP),
+ EndContainer(),
+ /* Sort Buttons */
NWidget(NWID_HORIZONTAL),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SL_SORT_BYNAME), SetDataTip(STR_SORT_BY_CAPTION_NAME, STR_TOOLTIP_SORT_ORDER), SetFill(1, 0), SetResize(1, 0),
@@ -128,6 +153,7 @@ static const NWidgetPart _nested_load_heightmap_dialog_widgets[] = {
EndContainer(),
NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SL_HOME_BUTTON), SetMinimalSize(12, 12), SetDataTip(SPR_HOUSE_ICON, STR_SAVELOAD_HOME_BUTTON),
EndContainer(),
+ /* Files */
NWidget(WWT_PANEL, COLOUR_GREY, WID_SL_FILE_BACKGROUND),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_INSET, COLOUR_GREY, WID_SL_DRIVES_DIRECTORIES_LIST), SetFill(1, 1), SetPadding(2, 1, 2, 2),
@@ -152,9 +178,19 @@ static const NWidgetPart _nested_save_dialog_widgets[] = {
NWidget(WWT_CAPTION, COLOUR_GREY, WID_SL_CAPTION),
NWidget(WWT_DEFSIZEBOX, COLOUR_GREY),
EndContainer(),
+ /* Current directory and free space */
NWidget(WWT_PANEL, COLOUR_GREY, WID_SL_BACKGROUND), SetFill(1, 0), SetResize(1, 0), EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
- NWidget(NWID_VERTICAL),
+ /* Left side : filter box and available files */
+ NWidget(WWT_PANEL, COLOUR_GREY), SetFill(1, 1), SetResize(1, 1),
+ /* Filter box with label */
+ NWidget(NWID_HORIZONTAL), SetPadding(WD_FRAMERECT_TOP, 0, WD_FRAMERECT_BOTTOM, 0),
+ SetPIP(WD_FRAMETEXT_LEFT, WD_FRAMETEXT_RIGHT, 0),
+ NWidget(WWT_TEXT, COLOUR_GREY), SetFill(0, 1), SetDataTip(STR_SAVELOAD_FILTER_TITLE , STR_NULL),
+ NWidget(WWT_EDITBOX, COLOUR_GREY, WID_SL_FILTER), SetFill(1, 0), SetMinimalSize(50, 12), SetResize(1, 0),
+ SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP),
+ EndContainer(),
+ /* Sort buttons */
NWidget(NWID_HORIZONTAL),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SL_SORT_BYNAME), SetDataTip(STR_SORT_BY_CAPTION_NAME, STR_TOOLTIP_SORT_ORDER), SetFill(1, 0), SetResize(1, 0),
@@ -162,6 +198,7 @@ static const NWidgetPart _nested_save_dialog_widgets[] = {
EndContainer(),
NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SL_HOME_BUTTON), SetMinimalSize(12, 12), SetDataTip(SPR_HOUSE_ICON, STR_SAVELOAD_HOME_BUTTON),
EndContainer(),
+ /* Files */
NWidget(WWT_PANEL, COLOUR_GREY, WID_SL_FILE_BACKGROUND),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_INSET, COLOUR_GREY, WID_SL_DRIVES_DIRECTORIES_LIST), SetPadding(2, 1, 0, 2),
@@ -171,11 +208,14 @@ static const NWidgetPart _nested_save_dialog_widgets[] = {
NWidget(WWT_EDITBOX, COLOUR_GREY, WID_SL_SAVE_OSK_TITLE), SetPadding(3, 2, 2, 2), SetFill(1, 0), SetResize(1, 0),
SetDataTip(STR_SAVELOAD_OSKTITLE, STR_SAVELOAD_EDITBOX_TOOLTIP),
EndContainer(),
+ /* Save/delete buttons */
NWidget(NWID_HORIZONTAL),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SL_DELETE_SELECTION), SetDataTip(STR_SAVELOAD_DELETE_BUTTON, STR_SAVELOAD_DELETE_TOOLTIP), SetFill(1, 0), SetResize(1, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SL_SAVE_GAME), SetDataTip(STR_SAVELOAD_SAVE_BUTTON, STR_SAVELOAD_SAVE_TOOLTIP), SetFill(1, 0), SetResize(1, 0),
EndContainer(),
EndContainer(),
+
+ /* Right side : game details */
NWidget(WWT_PANEL, COLOUR_GREY),
NWidget(WWT_EMPTY, INVALID_COLOUR, WID_SL_DETAILS), SetResize(1, 1), SetFill(1, 1),
NWidget(NWID_HORIZONTAL),
@@ -201,7 +241,7 @@ static const TextColour _fios_colours[] = {
/**
* Sort the collected list save games prior to displaying it in the save/load gui.
- * @param [inout] file_list List of save game files found in the directory.
+ * @param[in,out] file_list List of save game files found in the directory.
*/
static void SortSaveGameList(FileList &file_list)
{
@@ -227,6 +267,8 @@ static void SortSaveGameList(FileList &file_list)
struct SaveLoadWindow : public Window {
private:
+ static const uint EDITBOX_MAX_SIZE = 50;
+
QueryString filename_editbox; ///< Filename editbox.
AbstractFileType abstract_filetype; /// Type of file to select.
SaveLoadOperation fop; ///< File operation to perform.
@@ -234,6 +276,11 @@ private:
FiosItem o_dir;
const FiosItem *selected; ///< Selected game in #fios_items, or \c NULL.
Scrollbar *vscroll;
+
+ StringFilter string_filter; ///< Filter for available games.
+ QueryString filter_editbox; ///< Filter editbox;
+ SmallVector fios_items_shown; ///< Map of the filtered out fios items
+
public:
/** Generate a default save filename. */
@@ -244,7 +291,7 @@ public:
}
SaveLoadWindow(WindowDesc *desc, AbstractFileType abstract_filetype, SaveLoadOperation fop)
- : Window(desc), filename_editbox(64), abstract_filetype(abstract_filetype), fop(fop)
+ : Window(desc), filename_editbox(64), abstract_filetype(abstract_filetype), fop(fop), filter_editbox(EDITBOX_MAX_SIZE)
{
assert(this->fop == SLO_SAVE || this->fop == SLO_LOAD);
@@ -296,6 +343,8 @@ public:
this->FinishInitNested(0);
this->LowerWidget(WID_SL_DRIVES_DIRECTORIES_LIST);
+ this->querystrings[WID_SL_FILTER] = &this->filter_editbox;
+ this->filter_editbox.cancel_button = QueryString::ACTION_CLEAR;
/* pause is only used in single-player, non-editor mode, non-menu mode. It
* will be unpaused in the WE_DESTROY event handler. */
@@ -304,7 +353,7 @@ public:
}
SetObjectToPlace(SPR_CURSOR_ZZZ, PAL_NONE, HT_NONE, WC_MAIN_WINDOW, 0);
- this->OnInvalidateData(0);
+ this->OnInvalidateData(SLIWD_RESCAN_FILES);
ResetObjectToPlace();
@@ -327,8 +376,15 @@ public:
strecpy(o_dir.name, _personal_dir, lastof(o_dir.name));
}
- /* Focus the edit box by default in the save windows */
- if (this->fop == SLO_SAVE) this->SetFocusedWidget(WID_SL_SAVE_OSK_TITLE);
+ switch (this->fop) {
+ case SLO_SAVE:
+ /* Focus the edit box by default in the save window */
+ this->SetFocusedWidget(WID_SL_SAVE_OSK_TITLE);
+ break;
+
+ default:
+ this->SetFocusedWidget(WID_SL_FILTER);
+ }
}
virtual ~SaveLoadWindow()
@@ -370,6 +426,10 @@ public:
uint y = r.top + WD_FRAMERECT_TOP;
for (uint pos = this->vscroll->GetPosition(); pos < this->fios_items.Length(); pos++) {
+ if (!this->fios_items_shown[pos]) {
+ /* The current item is filtered out : we do not show it */
+ continue;
+ }
const FiosItem *item = this->fios_items.Get(pos);
if (item == this->selected) {
@@ -507,7 +567,6 @@ public:
SortSaveGameList(this->fios_items);
}
- this->vscroll->SetCount(this->fios_items.Length());
this->DrawWidgets();
}
@@ -530,7 +589,7 @@ public:
case WID_SL_HOME_BUTTON: // OpenTTD 'button', jumps to OpenTTD directory
FiosBrowseTo(&o_dir);
- this->InvalidateData();
+ this->InvalidateData(SLIWD_RESCAN_FILES);
break;
case WID_SL_LOAD_BUTTON:
@@ -572,6 +631,12 @@ public:
int y = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_SL_DRIVES_DIRECTORIES_LIST, WD_FRAMERECT_TOP);
if (y == INT_MAX) return;
+ /* Get the corresponding non-filtered out item from the list */
+ int i = 0;
+ while (i <= y) {
+ if (!this->fios_items_shown[i]) y++;
+ i++;
+ }
const FiosItem *file = this->fios_items.Get(y);
const char *name = FiosBrowseTo(file);
@@ -586,7 +651,7 @@ public:
SaveOrLoad(name, SLO_CHECK, DFT_GAME_FILE, NO_DIRECTORY, false);
}
- this->InvalidateData(1);
+ this->InvalidateData(SLIWD_SELECTION_CHANGES);
}
if (this->fop == SLO_SAVE) {
/* Copy clicked name to editbox */
@@ -611,7 +676,7 @@ public:
}
} else {
/* Changed directory, need refresh. */
- this->InvalidateData();
+ this->InvalidateData(SLIWD_RESCAN_FILES);
}
break;
}
@@ -660,7 +725,7 @@ public:
if (!FiosDelete(this->filename_editbox.text.buf)) {
ShowErrorMessage(STR_ERROR_UNABLE_TO_DELETE_FILE, INVALID_STRING_ID, WL_ERROR);
} else {
- this->InvalidateData();
+ this->InvalidateData(SLIWD_RESCAN_FILES);
/* Reset file name to current date on successful delete */
if (this->abstract_filetype == FT_SAVEGAME) GenerateFileName();
}
@@ -691,7 +756,7 @@ public:
virtual void OnInvalidateData(int data = 0, bool gui_scope = true)
{
switch (data) {
- case 0:
+ case SLIWD_RESCAN_FILES:
/* Rescan files */
this->selected = NULL;
_load_check_data.Clear();
@@ -702,9 +767,13 @@ public:
this->vscroll->SetCount(this->fios_items.Length());
this->selected = NULL;
_load_check_data.Clear();
+
+ /* We reset the files filtered */
+ this->OnInvalidateData(SLIWD_FILTER_CHANGES);
+
FALLTHROUGH;
- case 1:
+ case SLIWD_SELECTION_CHANGES:
/* Selection changes */
if (!gui_scope) break;
@@ -732,6 +801,41 @@ public:
NOT_REACHED();
}
break;
+
+ case SLIWD_FILTER_CHANGES:
+ /* Filter changes */
+ this->fios_items_shown.Resize(this->fios_items.Length());
+ uint items_shown_count = 0; ///< The number of items shown in the list
+ /* We pass through every fios item */
+ for (uint i = 0; i < this->fios_items.Length(); i++) {
+ if (this->string_filter.IsEmpty()) {
+ /* We don't filter anything out if the filter editbox is empty */
+ this->fios_items_shown[i] = true;
+ items_shown_count++;
+ } else {
+ this->string_filter.ResetState();
+ this->string_filter.AddLine(this->fios_items[i].title);
+ /* We set the vector to show this fios element as filtered depending on the result of the filter */
+ this->fios_items_shown[i] = this->string_filter.GetState();
+ if (this->fios_items_shown[i]) items_shown_count++;
+
+ if (&(this->fios_items[i]) == this->selected && this->fios_items_shown[i] == false) {
+ /* The selected element has been filtered out */
+ this->selected = NULL;
+ this->OnInvalidateData(SLIWD_SELECTION_CHANGES);
+ }
+ }
+ }
+ this->vscroll->SetCount(items_shown_count);
+ break;
+ }
+ }
+
+ virtual void OnEditboxChanged(int wid)
+ {
+ if (wid == WID_SL_FILTER) {
+ this->string_filter.SetFilterTerm(this->filter_editbox.text.buf);
+ this->InvalidateData(SLIWD_FILTER_CHANGES);
}
}
};
diff --git a/src/fontcache.cpp b/src/fontcache.cpp
index 3a5dd886c1..55da0c55c8 100644
--- a/src/fontcache.cpp
+++ b/src/fontcache.cpp
@@ -210,6 +210,7 @@ class FreeTypeFontCache : public FontCache {
private:
FT_Face face; ///< The font face associated with this font.
int req_size; ///< Requested font size.
+ int used_size; ///< Used font size.
typedef SmallMap > FontTable; ///< Table with font table cache
FontTable font_tables; ///< Cached font tables.
@@ -243,6 +244,7 @@ private:
public:
FreeTypeFontCache(FontSize fs, FT_Face face, int pixels);
~FreeTypeFontCache();
+ virtual int GetFontSize() const { return this->used_size; }
virtual SpriteID GetUnicodeGlyph(WChar key) { return this->parent->GetUnicodeGlyph(key); }
virtual void SetUnicodeGlyph(WChar key, SpriteID sprite) { this->parent->SetUnicodeGlyph(key, sprite); }
virtual void InitializeUnicodeGlyphMap() { this->parent->InitializeUnicodeGlyphMap(); }
@@ -291,6 +293,7 @@ void FreeTypeFontCache::SetFontSize(FontSize fs, FT_Face face, int pixels)
pixels = Clamp(min(head->Lowest_Rec_PPEM, 20) + diff, scaled_height, MAX_FONT_SIZE);
}
}
+ this->used_size = pixels;
FT_Error err = FT_Set_Pixel_Sizes(this->face, 0, pixels);
if (err != FT_Err_Ok) {
diff --git a/src/fontcache.h b/src/fontcache.h
index 8d66ed3667..1f5e56d924 100644
--- a/src/fontcache.h
+++ b/src/fontcache.h
@@ -64,6 +64,12 @@ public:
*/
inline int GetUnitsPerEM() const { return this->units_per_em; }
+ /**
+ * Get the nominal font size of the font.
+ * @return The nominal font size.
+ */
+ virtual int GetFontSize() const { return this->height; }
+
/**
* Get the SpriteID mapped to the given key
* @param key The key to get the sprite for.
diff --git a/src/fontdetection.cpp b/src/fontdetection.cpp
index 14eef9f640..4279d60f3b 100644
--- a/src/fontdetection.cpp
+++ b/src/fontdetection.cpp
@@ -28,7 +28,7 @@ extern FT_Library _library;
* Windows support
* ======================================================================================== */
-#ifdef WIN32
+#ifdef _WIN32
#include "core/alloc_func.hpp"
#include "core/math_func.hpp"
#include
diff --git a/src/framerate_gui.cpp b/src/framerate_gui.cpp
new file mode 100644
index 0000000000..7e8e5f34fd
--- /dev/null
+++ b/src/framerate_gui.cpp
@@ -0,0 +1,859 @@
+/* $Id$ */
+
+/*
+* 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 framerate_gui.cpp GUI for displaying framerate/game speed information. */
+
+#include "framerate_type.h"
+#include
+#include "gfx_func.h"
+#include "window_gui.h"
+#include "table/sprites.h"
+#include "strings_func.h"
+#include "debug.h"
+#include "console_func.h"
+#include "console_type.h"
+
+#include "widgets/framerate_widget.h"
+
+
+/**
+ * Private declarations for performance measurement implementation
+ */
+namespace {
+
+ /** Number of data points to keep in buffer for each performance measurement */
+ const int NUM_FRAMERATE_POINTS = 512;
+ /** %Units a second is divided into in performance measurements */
+ const TimingMeasurement TIMESTAMP_PRECISION = 1000000;
+
+ struct PerformanceData {
+ /** Duration value indicating the value is not valid should be considered a gap in measurements */
+ static const TimingMeasurement INVALID_DURATION = UINT64_MAX;
+
+ /** Time spent processing each cycle of the performance element, circular buffer */
+ TimingMeasurement durations[NUM_FRAMERATE_POINTS];
+ /** Start time of each cycle of the performance element, circular buffer */
+ TimingMeasurement timestamps[NUM_FRAMERATE_POINTS];
+ /** Expected number of cycles per second when the system is running without slowdowns */
+ double expected_rate;
+ /** Next index to write to in \c durations and \c timestamps */
+ int next_index;
+ /** Last index written to in \c durations and \c timestamps */
+ int prev_index;
+ /** Number of data points recorded, clamped to \c NUM_FRAMERATE_POINTS */
+ int num_valid;
+
+ /** Current accumulated duration */
+ TimingMeasurement acc_duration;
+ /** Start time for current accumulation cycle */
+ TimingMeasurement acc_timestamp;
+
+ /**
+ * Initialize a data element with an expected collection rate
+ * @param expected_rate
+ * Expected number of cycles per second of the performance element. Use 1 if unknown or not relevant.
+ * The rate is used for highlighting slow-running elements in the GUI.
+ */
+ explicit PerformanceData(double expected_rate) : expected_rate(expected_rate), next_index(0), prev_index(0), num_valid(0) { }
+
+ /** Collect a complete measurement, given start and ending times for a processing block */
+ void Add(TimingMeasurement start_time, TimingMeasurement end_time)
+ {
+ this->durations[this->next_index] = end_time - start_time;
+ this->timestamps[this->next_index] = start_time;
+ this->prev_index = this->next_index;
+ this->next_index += 1;
+ if (this->next_index >= NUM_FRAMERATE_POINTS) this->next_index = 0;
+ this->num_valid = min(NUM_FRAMERATE_POINTS, this->num_valid + 1);
+ }
+
+ /** Begin an accumulation of multiple measurements into a single value, from a given start time */
+ void BeginAccumulate(TimingMeasurement start_time)
+ {
+ this->timestamps[this->next_index] = this->acc_timestamp;
+ this->durations[this->next_index] = this->acc_duration;
+ this->prev_index = this->next_index;
+ this->next_index += 1;
+ if (this->next_index >= NUM_FRAMERATE_POINTS) this->next_index = 0;
+ this->num_valid = min(NUM_FRAMERATE_POINTS, this->num_valid + 1);
+
+ this->acc_duration = 0;
+ this->acc_timestamp = start_time;
+ }
+
+ /** Accumulate a period onto the current measurement */
+ void AddAccumulate(TimingMeasurement duration)
+ {
+ this->acc_duration += duration;
+ }
+
+ /** Indicate a pause/expected discontinuity in processing the element */
+ void AddPause(TimingMeasurement start_time)
+ {
+ if (this->durations[this->prev_index] != INVALID_DURATION) {
+ this->timestamps[this->next_index] = start_time;
+ this->durations[this->next_index] = INVALID_DURATION;
+ this->prev_index = this->next_index;
+ this->next_index += 1;
+ if (this->next_index >= NUM_FRAMERATE_POINTS) this->next_index = 0;
+ this->num_valid += 1;
+ }
+ }
+
+ /** Get average cycle processing time over a number of data points */
+ double GetAverageDurationMilliseconds(int count)
+ {
+ count = min(count, this->num_valid);
+
+ int first_point = this->prev_index - count;
+ if (first_point < 0) first_point += NUM_FRAMERATE_POINTS;
+
+ /* Sum durations, skipping invalid points */
+ double sumtime = 0;
+ for (int i = first_point; i < first_point + count; i++) {
+ auto d = this->durations[i % NUM_FRAMERATE_POINTS];
+ if (d != INVALID_DURATION) {
+ sumtime += d;
+ } else {
+ /* Don't count the invalid durations */
+ count--;
+ }
+ }
+
+ if (count == 0) return 0; // avoid div by zero
+ return sumtime * 1000 / count / TIMESTAMP_PRECISION;
+ }
+
+ /** Get current rate of a performance element, based on approximately the past one second of data */
+ double GetRate()
+ {
+ /* Start at last recorded point, end at latest when reaching the earliest recorded point */
+ int point = this->prev_index;
+ int last_point = this->next_index - this->num_valid;
+ if (last_point < 0) last_point += NUM_FRAMERATE_POINTS;
+
+ /* Number of data points collected */
+ int count = 0;
+ /* Time of previous data point */
+ TimingMeasurement last = this->timestamps[point];
+ /* Total duration covered by collected points */
+ TimingMeasurement total = 0;
+
+ while (point != last_point) {
+ /* Only record valid data points, but pretend the gaps in measurements aren't there */
+ if (this->durations[point] != INVALID_DURATION) {
+ total += last - this->timestamps[point];
+ count++;
+ }
+ last = this->timestamps[point];
+ if (total >= TIMESTAMP_PRECISION) break; // end after 1 second has been collected
+ point--;
+ if (point < 0) point = NUM_FRAMERATE_POINTS - 1;
+ }
+
+ if (total == 0 || count == 0) return 0;
+ return (double)count * TIMESTAMP_PRECISION / total;
+ }
+ };
+
+ /** %Game loop rate, cycles per second */
+ static const double GL_RATE = 1000.0 / MILLISECONDS_PER_TICK;
+
+ /**
+ * Storage for all performance element measurements.
+ * Elements are initialized with the expected rate in recorded values per second.
+ * @hideinitializer
+ */
+ PerformanceData _pf_data[PFE_MAX] = {
+ PerformanceData(GL_RATE), // PFE_GAMELOOP
+ PerformanceData(1), // PFE_ACC_GL_ECONOMY
+ PerformanceData(1), // PFE_ACC_GL_TRAINS
+ PerformanceData(1), // PFE_ACC_GL_ROADVEHS
+ PerformanceData(1), // PFE_ACC_GL_SHIPS
+ PerformanceData(1), // PFE_ACC_GL_AIRCRAFT
+ PerformanceData(1), // PFE_GL_LANDSCAPE
+ PerformanceData(1), // PFE_GL_LINKGRAPH
+ PerformanceData(GL_RATE), // PFE_DRAWING
+ PerformanceData(1), // PFE_ACC_DRAWWORLD
+ PerformanceData(60.0), // PFE_VIDEO
+ PerformanceData(1000.0 * 8192 / 44100), // PFE_SOUND
+ };
+
+}
+
+
+/**
+ * Return a timestamp with \c TIMESTAMP_PRECISION ticks per second precision.
+ * The basis of the timestamp is implementation defined, but the value should be steady,
+ * so differences can be taken to reliably measure intervals.
+ */
+static TimingMeasurement GetPerformanceTimer()
+{
+ using namespace std::chrono;
+ return (TimingMeasurement)time_point_cast(high_resolution_clock::now()).time_since_epoch().count();
+}
+
+
+/**
+ * Begin a cycle of a measured element.
+ * @param elem The element to be measured
+ */
+PerformanceMeasurer::PerformanceMeasurer(PerformanceElement elem)
+{
+ assert(elem < PFE_MAX);
+
+ this->elem = elem;
+ this->start_time = GetPerformanceTimer();
+}
+
+/** Finish a cycle of a measured element and store the measurement taken. */
+PerformanceMeasurer::~PerformanceMeasurer()
+{
+ _pf_data[this->elem].Add(this->start_time, GetPerformanceTimer());
+}
+
+/** Set the rate of expected cycles per second of a performance element. */
+void PerformanceMeasurer::SetExpectedRate(double rate)
+{
+ _pf_data[this->elem].expected_rate = rate;
+}
+
+/**
+ * Indicate that a cycle of "pause" where no processing occurs.
+ * @param elem The element not currently being processed
+ */
+void PerformanceMeasurer::Paused(PerformanceElement elem)
+{
+ _pf_data[elem].AddPause(GetPerformanceTimer());
+}
+
+
+/**
+ * Begin measuring one block of the accumulating value.
+ * @param elem The element to be measured
+ */
+PerformanceAccumulator::PerformanceAccumulator(PerformanceElement elem)
+{
+ assert(elem < PFE_MAX);
+
+ this->elem = elem;
+ this->start_time = GetPerformanceTimer();
+}
+
+/** Finish and add one block of the accumulating value. */
+PerformanceAccumulator::~PerformanceAccumulator()
+{
+ _pf_data[this->elem].AddAccumulate(GetPerformanceTimer() - this->start_time);
+}
+
+/**
+ * Store the previous accumulator value and reset for a new cycle of accumulating measurements.
+ * @note This function must be called once per frame, otherwise measurements are not collected.
+ * @param elem The element to begin a new measurement cycle of
+ */
+void PerformanceAccumulator::Reset(PerformanceElement elem)
+{
+ _pf_data[elem].BeginAccumulate(GetPerformanceTimer());
+}
+
+
+void ShowFrametimeGraphWindow(PerformanceElement elem);
+
+
+/** @hideinitializer */
+static const NWidgetPart _framerate_window_widgets[] = {
+ NWidget(NWID_HORIZONTAL),
+ NWidget(WWT_CLOSEBOX, COLOUR_GREY),
+ NWidget(WWT_CAPTION, COLOUR_GREY, WID_FRW_CAPTION), SetDataTip(STR_FRAMERATE_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
+ NWidget(WWT_SHADEBOX, COLOUR_GREY),
+ NWidget(WWT_STICKYBOX, COLOUR_GREY),
+ EndContainer(),
+ NWidget(WWT_PANEL, COLOUR_GREY),
+ NWidget(NWID_VERTICAL), SetPadding(6), SetPIP(0, 3, 0),
+ NWidget(WWT_TEXT, COLOUR_GREY, WID_FRW_RATE_GAMELOOP), SetDataTip(STR_FRAMERATE_RATE_GAMELOOP, STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP),
+ NWidget(WWT_TEXT, COLOUR_GREY, WID_FRW_RATE_DRAWING), SetDataTip(STR_FRAMERATE_RATE_BLITTER, STR_FRAMERATE_RATE_BLITTER_TOOLTIP),
+ NWidget(WWT_TEXT, COLOUR_GREY, WID_FRW_RATE_FACTOR), SetDataTip(STR_FRAMERATE_SPEED_FACTOR, STR_FRAMERATE_SPEED_FACTOR_TOOLTIP),
+ EndContainer(),
+ EndContainer(),
+ NWidget(WWT_PANEL, COLOUR_GREY),
+ NWidget(NWID_VERTICAL), SetPadding(6), SetPIP(0, 3, 0),
+ NWidget(NWID_HORIZONTAL), SetPIP(0, 6, 0),
+ NWidget(WWT_EMPTY, COLOUR_GREY, WID_FRW_TIMES_NAMES),
+ NWidget(WWT_EMPTY, COLOUR_GREY, WID_FRW_TIMES_CURRENT),
+ NWidget(WWT_EMPTY, COLOUR_GREY, WID_FRW_TIMES_AVERAGE),
+ EndContainer(),
+ NWidget(WWT_TEXT, COLOUR_GREY, WID_FRW_INFO_DATA_POINTS), SetDataTip(STR_FRAMERATE_DATA_POINTS, 0x0),
+ EndContainer(),
+ EndContainer(),
+};
+
+struct FramerateWindow : Window {
+ bool small;
+ uint32 next_update;
+
+ struct CachedDecimal {
+ StringID strid;
+ uint32 value;
+
+ inline void SetRate(double value, double target)
+ {
+ const double threshold_good = target * 0.95;
+ const double threshold_bad = target * 2 / 3;
+ value = min(9999.99, value);
+ this->value = (uint32)(value * 100);
+ this->strid = (value > threshold_good) ? STR_FRAMERATE_FPS_GOOD : (value < threshold_bad) ? STR_FRAMERATE_FPS_BAD : STR_FRAMERATE_FPS_WARN;
+ }
+
+ inline void SetTime(double value, double target)
+ {
+ const double threshold_good = target / 3;
+ const double threshold_bad = target;
+ value = min(9999.99, value);
+ this->value = (uint32)(value * 100);
+ this->strid = (value < threshold_good) ? STR_FRAMERATE_MS_GOOD : (value > threshold_bad) ? STR_FRAMERATE_MS_BAD : STR_FRAMERATE_MS_WARN;
+ }
+
+ inline void InsertDParams(uint n) const
+ {
+ SetDParam(n, this->value);
+ SetDParam(n + 1, 2);
+ }
+ };
+
+ CachedDecimal rate_gameloop; ///< cached game loop tick rate
+ CachedDecimal rate_drawing; ///< cached drawing frame rate
+ CachedDecimal speed_gameloop; ///< cached game loop speed factor
+ CachedDecimal times_shortterm[PFE_MAX]; ///< cached short term average times
+ CachedDecimal times_longterm[PFE_MAX]; ///< cached long term average times
+
+ static const int VSPACING = 3; ///< space between column heading and values
+
+ FramerateWindow(WindowDesc *desc, WindowNumber number) : Window(desc)
+ {
+ this->InitNested(number);
+ this->small = this->IsShaded();
+ this->UpdateData();
+ }
+
+ virtual void OnTick()
+ {
+ /* Check if the shaded state has changed, switch caption text if it has */
+ if (this->small != this->IsShaded()) {
+ this->small = this->IsShaded();
+ this->GetWidget(WID_FRW_CAPTION)->SetDataTip(this->small ? STR_FRAMERATE_CAPTION_SMALL : STR_FRAMERATE_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS);
+ this->next_update = 0;
+ }
+
+ if (_realtime_tick >= this->next_update) {
+ this->UpdateData();
+ this->SetDirty();
+ this->next_update = _realtime_tick + 100;
+ }
+ }
+
+ void UpdateData()
+ {
+ double gl_rate = _pf_data[PFE_GAMELOOP].GetRate();
+ this->rate_gameloop.SetRate(gl_rate, _pf_data[PFE_GAMELOOP].expected_rate);
+ this->speed_gameloop.SetRate(gl_rate / _pf_data[PFE_GAMELOOP].expected_rate, 1.0);
+ if (this->small) return; // in small mode, this is everything needed
+
+ this->rate_drawing.SetRate(_pf_data[PFE_DRAWING].GetRate(), _pf_data[PFE_DRAWING].expected_rate);
+
+ for (PerformanceElement e = PFE_FIRST; e < PFE_MAX; e++) {
+ this->times_shortterm[e].SetTime(_pf_data[e].GetAverageDurationMilliseconds(8), MILLISECONDS_PER_TICK);
+ this->times_longterm[e].SetTime(_pf_data[e].GetAverageDurationMilliseconds(NUM_FRAMERATE_POINTS), MILLISECONDS_PER_TICK);
+ }
+ }
+
+ virtual void SetStringParameters(int widget) const
+ {
+ switch (widget) {
+ case WID_FRW_CAPTION:
+ /* When the window is shaded, the caption shows game loop rate and speed factor */
+ if (!this->small) break;
+ SetDParam(0, this->rate_gameloop.strid);
+ this->rate_gameloop.InsertDParams(1);
+ this->speed_gameloop.InsertDParams(3);
+ break;
+
+ case WID_FRW_RATE_GAMELOOP:
+ SetDParam(0, this->rate_gameloop.strid);
+ this->rate_gameloop.InsertDParams(1);
+ break;
+ case WID_FRW_RATE_DRAWING:
+ SetDParam(0, this->rate_drawing.strid);
+ this->rate_drawing.InsertDParams(1);
+ break;
+ case WID_FRW_RATE_FACTOR:
+ this->speed_gameloop.InsertDParams(0);
+ break;
+ case WID_FRW_INFO_DATA_POINTS:
+ SetDParam(0, NUM_FRAMERATE_POINTS);
+ break;
+ }
+ }
+
+ virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
+ {
+ switch (widget) {
+ case WID_FRW_RATE_GAMELOOP:
+ SetDParam(0, STR_FRAMERATE_FPS_GOOD);
+ SetDParam(1, 999999);
+ SetDParam(2, 2);
+ *size = GetStringBoundingBox(STR_FRAMERATE_RATE_GAMELOOP);
+ break;
+ case WID_FRW_RATE_DRAWING:
+ SetDParam(0, STR_FRAMERATE_FPS_GOOD);
+ SetDParam(1, 999999);
+ SetDParam(2, 2);
+ *size = GetStringBoundingBox(STR_FRAMERATE_RATE_BLITTER);
+ break;
+ case WID_FRW_RATE_FACTOR:
+ SetDParam(0, 999999);
+ SetDParam(1, 2);
+ *size = GetStringBoundingBox(STR_FRAMERATE_SPEED_FACTOR);
+ break;
+
+ case WID_FRW_TIMES_NAMES: {
+ int linecount = PFE_MAX - PFE_FIRST;
+ size->width = 0;
+ size->height = FONT_HEIGHT_NORMAL * (linecount + 1) + VSPACING;
+ for (int line = 0; line < linecount; line++) {
+ Dimension line_size = GetStringBoundingBox(STR_FRAMERATE_GAMELOOP + line);
+ size->width = max(size->width, line_size.width);
+ }
+ break;
+ }
+
+ case WID_FRW_TIMES_CURRENT:
+ case WID_FRW_TIMES_AVERAGE: {
+ int linecount = PFE_MAX - PFE_FIRST;
+ *size = GetStringBoundingBox(STR_FRAMERATE_CURRENT + (widget - WID_FRW_TIMES_CURRENT));
+ SetDParam(0, 999999);
+ SetDParam(1, 2);
+ Dimension item_size = GetStringBoundingBox(STR_FRAMERATE_MS_GOOD);
+ size->width = max(size->width, item_size.width);
+ size->height += FONT_HEIGHT_NORMAL * linecount + VSPACING;
+ break;
+ }
+ }
+ }
+
+ /** Render a column of formatted average durations */
+ void DrawElementTimesColumn(const Rect &r, StringID heading_str, const CachedDecimal *values) const
+ {
+ int y = r.top;
+ DrawString(r.left, r.right, y, heading_str, TC_FROMSTRING, SA_CENTER, true);
+ y += FONT_HEIGHT_NORMAL + VSPACING;
+
+ for (PerformanceElement e = PFE_FIRST; e < PFE_MAX; e++) {
+ values[e].InsertDParams(0);
+ DrawString(r.left, r.right, y, values[e].strid, TC_FROMSTRING, SA_RIGHT);
+ y += FONT_HEIGHT_NORMAL;
+ }
+ }
+
+ virtual void DrawWidget(const Rect &r, int widget) const
+ {
+ switch (widget) {
+ case WID_FRW_TIMES_NAMES: {
+ /* Render a column of titles for performance element names */
+ int linecount = PFE_MAX - PFE_FIRST;
+ int y = r.top + FONT_HEIGHT_NORMAL + VSPACING; // first line contains headings in the value columns
+ for (int i = 0; i < linecount; i++) {
+ DrawString(r.left, r.right, y, STR_FRAMERATE_GAMELOOP + i, TC_FROMSTRING, SA_LEFT);
+ y += FONT_HEIGHT_NORMAL;
+ }
+ break;
+ }
+ case WID_FRW_TIMES_CURRENT:
+ /* Render short-term average values */
+ DrawElementTimesColumn(r, STR_FRAMERATE_CURRENT, this->times_shortterm);
+ break;
+ case WID_FRW_TIMES_AVERAGE:
+ /* Render averages of all recorded values */
+ DrawElementTimesColumn(r, STR_FRAMERATE_AVERAGE, this->times_longterm);
+ break;
+ }
+ }
+
+ virtual void OnClick(Point pt, int widget, int click_count)
+ {
+ switch (widget) {
+ case WID_FRW_TIMES_NAMES:
+ case WID_FRW_TIMES_CURRENT:
+ case WID_FRW_TIMES_AVERAGE: {
+ /* Open time graph windows when clicking detail measurement lines */
+ int line = this->GetRowFromWidget(pt.y, widget, VSPACING, FONT_HEIGHT_NORMAL);
+ if (line > 0) {
+ line -= 1;
+ ShowFrametimeGraphWindow((PerformanceElement)line);
+ }
+ break;
+ }
+ }
+ }
+};
+
+static WindowDesc _framerate_display_desc(
+ WDP_AUTO, "framerate_display", 60, 40,
+ WC_FRAMERATE_DISPLAY, WC_NONE,
+ 0,
+ _framerate_window_widgets, lengthof(_framerate_window_widgets)
+);
+
+
+/** @hideinitializer */
+static const NWidgetPart _frametime_graph_window_widgets[] = {
+ NWidget(NWID_HORIZONTAL),
+ NWidget(WWT_CLOSEBOX, COLOUR_GREY),
+ NWidget(WWT_CAPTION, COLOUR_GREY, WID_FGW_CAPTION), SetDataTip(STR_WHITE_STRING, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
+ NWidget(WWT_STICKYBOX, COLOUR_GREY),
+ EndContainer(),
+ NWidget(WWT_PANEL, COLOUR_GREY),
+ NWidget(NWID_VERTICAL), SetPadding(6),
+ NWidget(WWT_EMPTY, COLOUR_GREY, WID_FGW_GRAPH),
+ EndContainer(),
+ EndContainer(),
+};
+
+struct FrametimeGraphWindow : Window {
+ int vertical_scale; ///< number of TIMESTAMP_PRECISION units vertically
+ int horizontal_scale; ///< number of half-second units horizontally
+ uint32 next_scale_update; ///< realtime tick for next scale update
+
+ PerformanceElement element; ///< what element this window renders graph for
+ Dimension graph_size; ///< size of the main graph area (excluding axis labels)
+
+ FrametimeGraphWindow(WindowDesc *desc, WindowNumber number) : Window(desc)
+ {
+ this->element = (PerformanceElement)number;
+ this->horizontal_scale = 4;
+ this->vertical_scale = TIMESTAMP_PRECISION / 10;
+ this->next_scale_update = 0;
+
+ this->InitNested(number);
+ }
+
+ virtual void SetStringParameters(int widget) const
+ {
+ switch (widget) {
+ case WID_FGW_CAPTION:
+ SetDParam(0, STR_FRAMETIME_CAPTION_GAMELOOP + this->element);
+ break;
+ }
+ }
+
+ virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
+ {
+ if (widget == WID_FGW_GRAPH) {
+ SetDParam(0, 100);
+ Dimension size_ms_label = GetStringBoundingBox(STR_FRAMERATE_GRAPH_MILLISECONDS);
+ SetDParam(0, 100);
+ Dimension size_s_label = GetStringBoundingBox(STR_FRAMERATE_GRAPH_SECONDS);
+
+ /* Size graph in height to fit at least 10 vertical labels with space between, or at least 100 pixels */
+ graph_size.height = max(100, 10 * (size_ms_label.height + 1));
+ /* Always 2:1 graph area */
+ graph_size.width = 2 * graph_size.height;
+ *size = graph_size;
+
+ size->width += size_ms_label.width + 2;
+ size->height += size_s_label.height + 2;
+ }
+ }
+
+ void SelectHorizontalScale(TimingMeasurement range)
+ {
+ /* Determine horizontal scale based on period covered by 60 points
+ * (slightly less than 2 seconds at full game speed) */
+ struct ScaleDef { TimingMeasurement range; int scale; };
+ static const ScaleDef hscales[] = {
+ { 120, 60 },
+ { 10, 20 },
+ { 5, 10 },
+ { 3, 4 },
+ { 1, 2 },
+ };
+ for (const ScaleDef *sc = hscales; sc < hscales + lengthof(hscales); sc++) {
+ if (range < sc->range) this->horizontal_scale = sc->scale;
+ }
+ }
+
+ void SelectVerticalScale(TimingMeasurement range)
+ {
+ /* Determine vertical scale based on peak value (within the horizontal scale + a bit) */
+ static const TimingMeasurement vscales[] = {
+ TIMESTAMP_PRECISION * 100,
+ TIMESTAMP_PRECISION * 10,
+ TIMESTAMP_PRECISION * 5,
+ TIMESTAMP_PRECISION,
+ TIMESTAMP_PRECISION / 2,
+ TIMESTAMP_PRECISION / 5,
+ TIMESTAMP_PRECISION / 10,
+ TIMESTAMP_PRECISION / 50,
+ TIMESTAMP_PRECISION / 200,
+ };
+ for (const TimingMeasurement *sc = vscales; sc < vscales + lengthof(vscales); sc++) {
+ if (range < *sc) this->vertical_scale = (int)*sc;
+ }
+ }
+
+ /** Recalculate the graph scaling factors based on current recorded data */
+ void UpdateScale()
+ {
+ const TimingMeasurement *durations = _pf_data[this->element].durations;
+ const TimingMeasurement *timestamps = _pf_data[this->element].timestamps;
+ int num_valid = _pf_data[this->element].num_valid;
+ int point = _pf_data[this->element].prev_index;
+
+ TimingMeasurement lastts = timestamps[point];
+ TimingMeasurement time_sum = 0;
+ TimingMeasurement peak_value = 0;
+ int count = 0;
+
+ /* Sensible default for when too few measurements are available */
+ this->horizontal_scale = 4;
+
+ for (int i = 1; i < num_valid; i++) {
+ point--;
+ if (point < 0) point = NUM_FRAMERATE_POINTS - 1;
+
+ TimingMeasurement value = durations[point];
+ if (value == PerformanceData::INVALID_DURATION) {
+ /* Skip gaps in data by pretending time is continuous across them */
+ lastts = timestamps[point];
+ continue;
+ }
+ if (value > peak_value) peak_value = value;
+ count++;
+
+ /* Accumulate period of time covered by data */
+ time_sum += lastts - timestamps[point];
+ lastts = timestamps[point];
+
+ /* Enough data to select a range and get decent data density */
+ if (count == 60) this->SelectHorizontalScale(time_sum / TIMESTAMP_PRECISION);
+
+ /* End when enough points have been collected and the horizontal scale has been exceeded */
+ if (count >= 60 && time_sum >= (this->horizontal_scale + 2) * TIMESTAMP_PRECISION / 2) break;
+ }
+
+ this->SelectVerticalScale(peak_value);
+ }
+
+ virtual void OnTick()
+ {
+ this->SetDirty();
+
+ if (this->next_scale_update < _realtime_tick) {
+ this->next_scale_update = _realtime_tick + 500;
+ this->UpdateScale();
+ }
+ }
+
+ /** Scale and interpolate a value from a source range into a destination range */
+ template
+ static inline T Scinterlate(T dst_min, T dst_max, T src_min, T src_max, T value)
+ {
+ T dst_diff = dst_max - dst_min;
+ T src_diff = src_max - src_min;
+ return (value - src_min) * dst_diff / src_diff + dst_min;
+ }
+
+ virtual void DrawWidget(const Rect &r, int widget) const
+ {
+ if (widget == WID_FGW_GRAPH) {
+ const TimingMeasurement *durations = _pf_data[this->element].durations;
+ const TimingMeasurement *timestamps = _pf_data[this->element].timestamps;
+ int point = _pf_data[this->element].prev_index;
+
+ const int x_zero = r.right - (int)this->graph_size.width;
+ const int x_max = r.right;
+ const int y_zero = r.top + (int)this->graph_size.height;
+ const int y_max = r.top;
+ const int c_grid = PC_DARK_GREY;
+ const int c_lines = PC_BLACK;
+ const int c_peak = PC_DARK_RED;
+
+ const TimingMeasurement draw_horz_scale = (TimingMeasurement)this->horizontal_scale * TIMESTAMP_PRECISION / 2;
+ const TimingMeasurement draw_vert_scale = (TimingMeasurement)this->vertical_scale;
+
+ /* Number of \c horizontal_scale units in each horizontal division */
+ const uint horz_div_scl = (this->horizontal_scale <= 20) ? 1 : 10;
+ /* Number of divisions of the horizontal axis */
+ const uint horz_divisions = this->horizontal_scale / horz_div_scl;
+ /* Number of divisions of the vertical axis */
+ const uint vert_divisions = 10;
+
+ /* Draw division lines and labels for the vertical axis */
+ for (uint division = 0; division < vert_divisions; division++) {
+ int y = Scinterlate(y_zero, y_max, 0, (int)vert_divisions, (int)division);
+ GfxDrawLine(x_zero, y, x_max, y, c_grid);
+ if (division % 2 == 0) {
+ if ((TimingMeasurement)this->vertical_scale > TIMESTAMP_PRECISION) {
+ SetDParam(0, this->vertical_scale * division / 10 / TIMESTAMP_PRECISION);
+ DrawString(r.left, x_zero - 2, y - FONT_HEIGHT_SMALL, STR_FRAMERATE_GRAPH_SECONDS, TC_GREY, SA_RIGHT | SA_FORCE, false, FS_SMALL);
+ } else {
+ SetDParam(0, this->vertical_scale * division / 10 * 1000 / TIMESTAMP_PRECISION);
+ DrawString(r.left, x_zero - 2, y - FONT_HEIGHT_SMALL, STR_FRAMERATE_GRAPH_MILLISECONDS, TC_GREY, SA_RIGHT | SA_FORCE, false, FS_SMALL);
+ }
+ }
+ }
+ /* Draw divison lines and labels for the horizontal axis */
+ for (uint division = horz_divisions; division > 0; division--) {
+ int x = Scinterlate(x_zero, x_max, 0, (int)horz_divisions, (int)horz_divisions - (int)division);
+ GfxDrawLine(x, y_max, x, y_zero, c_grid);
+ if (division % 2 == 0) {
+ SetDParam(0, division * horz_div_scl / 2);
+ DrawString(x, x_max, y_zero + 2, STR_FRAMERATE_GRAPH_SECONDS, TC_GREY, SA_LEFT | SA_FORCE, false, FS_SMALL);
+ }
+ }
+
+ /* Position of last rendered data point */
+ Point lastpoint = {
+ x_max,
+ (int)Scinterlate(y_zero, y_max, 0, this->vertical_scale, durations[point])
+ };
+ /* Timestamp of last rendered data point */
+ TimingMeasurement lastts = timestamps[point];
+
+ TimingMeasurement peak_value = 0;
+ Point peak_point = { 0, 0 };
+ TimingMeasurement value_sum = 0;
+ TimingMeasurement time_sum = 0;
+ int points_drawn = 0;
+
+ for (int i = 1; i < NUM_FRAMERATE_POINTS; i++) {
+ point--;
+ if (point < 0) point = NUM_FRAMERATE_POINTS - 1;
+
+ TimingMeasurement value = durations[point];
+ if (value == PerformanceData::INVALID_DURATION) {
+ /* Skip gaps in measurements, pretend the data points on each side are continuous */
+ lastts = timestamps[point];
+ continue;
+ }
+
+ /* Use total time period covered for value along horizontal axis */
+ time_sum += lastts - timestamps[point];
+ lastts = timestamps[point];
+ /* Stop if past the width of the graph */
+ if (time_sum > draw_horz_scale) break;
+
+ /* Draw line from previous point to new point */
+ Point newpoint = {
+ (int)Scinterlate(x_zero, x_max, 0, (int64)draw_horz_scale, (int64)draw_horz_scale - (int64)time_sum),
+ (int)Scinterlate(y_zero, y_max, 0, (int64)draw_vert_scale, (int64)value)
+ };
+ assert(newpoint.x <= lastpoint.x);
+ GfxDrawLine(lastpoint.x, lastpoint.y, newpoint.x, newpoint.y, c_lines);
+ lastpoint = newpoint;
+
+ /* Record peak and average value across graphed data */
+ value_sum += value;
+ points_drawn++;
+ if (value > peak_value) {
+ peak_value = value;
+ peak_point = newpoint;
+ }
+ }
+
+ /* If the peak value is significantly larger than the average, mark and label it */
+ if (points_drawn > 0 && peak_value > TIMESTAMP_PRECISION / 100 && 2 * peak_value > 3 * value_sum / points_drawn) {
+ TextColour tc_peak = (TextColour)(TC_IS_PALETTE_COLOUR | c_peak);
+ GfxFillRect(peak_point.x - 1, peak_point.y - 1, peak_point.x + 1, peak_point.y + 1, c_peak);
+ SetDParam(0, peak_value * 1000 / TIMESTAMP_PRECISION);
+ int label_y = max(y_max, peak_point.y - FONT_HEIGHT_SMALL);
+ if (peak_point.x - x_zero > (int)this->graph_size.width / 2) {
+ DrawString(x_zero, peak_point.x - 2, label_y, STR_FRAMERATE_GRAPH_MILLISECONDS, tc_peak, SA_RIGHT | SA_FORCE, false, FS_SMALL);
+ } else {
+ DrawString(peak_point.x + 2, x_max, label_y, STR_FRAMERATE_GRAPH_MILLISECONDS, tc_peak, SA_LEFT | SA_FORCE, false, FS_SMALL);
+ }
+ }
+ }
+ }
+};
+
+static WindowDesc _frametime_graph_window_desc(
+ WDP_AUTO, "frametime_graph", 140, 90,
+ WC_FRAMETIME_GRAPH, WC_NONE,
+ 0,
+ _frametime_graph_window_widgets, lengthof(_frametime_graph_window_widgets)
+);
+
+
+
+/** Open the general framerate window */
+void ShowFramerateWindow()
+{
+ AllocateWindowDescFront(&_framerate_display_desc, 0);
+}
+
+/** Open a graph window for a performance element */
+void ShowFrametimeGraphWindow(PerformanceElement elem)
+{
+ if (elem < PFE_FIRST || elem >= PFE_MAX) return; // maybe warn?
+ AllocateWindowDescFront(&_frametime_graph_window_desc, elem, true);
+}
+
+/** Print performance statistics to game console */
+void ConPrintFramerate()
+{
+ const int count1 = NUM_FRAMERATE_POINTS / 8;
+ const int count2 = NUM_FRAMERATE_POINTS / 4;
+ const int count3 = NUM_FRAMERATE_POINTS / 1;
+
+ IConsolePrintF(TC_SILVER, "Based on num. data points: %d %d %d", count1, count2, count3);
+
+ static const char *MEASUREMENT_NAMES[PFE_MAX] = {
+ "Game loop",
+ " GL station ticks",
+ " GL train ticks",
+ " GL road vehicle ticks",
+ " GL ship ticks",
+ " GL aircraft ticks",
+ " GL landscape ticks",
+ " GL link graph delays",
+ "Drawing",
+ " Viewport drawing",
+ "Video output",
+ "Sound mixing",
+ };
+
+ static const PerformanceElement rate_elements[] = { PFE_GAMELOOP, PFE_DRAWING, PFE_VIDEO };
+
+ bool printed_anything = false;
+
+ for (const PerformanceElement *e = rate_elements; e < rate_elements + lengthof(rate_elements); e++) {
+ auto &pf = _pf_data[*e];
+ if (pf.num_valid == 0) continue;
+ IConsolePrintF(TC_GREEN, "%s rate: %.2ffps (expected: %.2ffps)",
+ MEASUREMENT_NAMES[*e],
+ pf.GetRate(),
+ pf.expected_rate);
+ printed_anything = true;
+ }
+
+ for (PerformanceElement e = PFE_FIRST; e < PFE_MAX; e++) {
+ auto &pf = _pf_data[e];
+ if (pf.num_valid == 0) continue;
+ IConsolePrintF(TC_LIGHT_BLUE, "%s times: %.2fms %.2fms %.2fms",
+ MEASUREMENT_NAMES[e],
+ pf.GetAverageDurationMilliseconds(count1),
+ pf.GetAverageDurationMilliseconds(count2),
+ pf.GetAverageDurationMilliseconds(count3));
+ printed_anything = true;
+ }
+
+ if (!printed_anything) {
+ IConsoleWarning("No performance measurements have been taken yet");
+ }
+}
diff --git a/src/framerate_type.h b/src/framerate_type.h
new file mode 100644
index 0000000000..8df9a279a1
--- /dev/null
+++ b/src/framerate_type.h
@@ -0,0 +1,109 @@
+/* $Id$ */
+
+/*
+* 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 framerate_type.h
+ * Types for recording game performance data.
+ *
+ * @par Adding new measurements
+ * Adding a new measurement requires multiple steps, which are outlined here.
+ * The first thing to do is add a new member of the #PerformanceElement enum.
+ * It must be added before \c PFE_MAX and should be added in a logical place.
+ * For example, an element of the game loop would be added next to the other game loop elements, and a rendering element next to the other rendering elements.
+ *
+ * @par
+ * Second is adding a member to the \link anonymous_namespace{framerate_gui.cpp}::_pf_data _pf_data \endlink array, in the same position as the new #PerformanceElement member.
+ *
+ * @par
+ * Third is adding strings for the new element. There is an array in #ConPrintFramerate with strings used for the console command.
+ * Additionally, there are two sets of strings in \c english.txt for two GUI uses, also in the #PerformanceElement order.
+ * Search for \c STR_FRAMERATE_GAMELOOP and \c STR_FRAMETIME_CAPTION_GAMELOOP in \c english.txt to find those.
+ *
+ * @par
+ * Last is actually adding the measurements. There are two ways to measure, either one-shot (a single function/block handling all processing),
+ * or as an accumulated element (multiple functions/blocks that need to be summed across each frame/tick).
+ * Use either the PerformanceMeasurer or the PerformanceAccumulator class respectively for the two cases.
+ * Either class is used by instantiating an object of it at the beginning of the block to be measured, so it auto-destructs at the end of the block.
+ * For PerformanceAccumulator, make sure to also call PerformanceAccumulator::Reset once at the beginning of a new frame. Usually the StateGameLoop function is appropriate for this.
+ *
+ * @see framerate_gui.cpp for implementation
+ */
+
+#ifndef FRAMERATE_TYPE_H
+#define FRAMERATE_TYPE_H
+
+#include "stdafx.h"
+#include "core/enum_type.hpp"
+
+/**
+ * Elements of game performance that can be measured.
+ *
+ * @note When adding new elements here, make sure to also update all other locations depending on the length and order of this enum.
+ * See Adding new measurements above.
+ */
+enum PerformanceElement {
+ PFE_FIRST = 0,
+ PFE_GAMELOOP = 0, ///< Speed of gameloop processing.
+ PFE_GL_ECONOMY, ///< Time spent processing cargo movement
+ PFE_GL_TRAINS, ///< Time spent processing trains
+ PFE_GL_ROADVEHS, ///< Time spend processing road vehicles
+ PFE_GL_SHIPS, ///< Time spent processing ships
+ PFE_GL_AIRCRAFT, ///< Time spent processing aircraft
+ PFE_GL_LANDSCAPE, ///< Time spent processing other world features
+ PFE_GL_LINKGRAPH, ///< Time spent waiting for link graph background jobs
+ PFE_DRAWING, ///< Speed of drawing world and GUI.
+ PFE_DRAWWORLD, ///< Time spent drawing world viewports in GUI
+ PFE_VIDEO, ///< Speed of painting drawn video buffer.
+ PFE_SOUND, ///< Speed of mixing audio samples
+ PFE_MAX, ///< End of enum, must be last.
+};
+DECLARE_POSTFIX_INCREMENT(PerformanceElement)
+
+/** Type used to hold a performance timing measurement */
+typedef uint64 TimingMeasurement;
+
+/**
+ * RAII class for measuring simple elements of performance.
+ * Construct an object with the appropriate element parameter when processing begins,
+ * time is automatically taken when the object goes out of scope again.
+ *
+ * Call Paused at the start of a frame if the processing of this element is paused.
+ */
+class PerformanceMeasurer {
+ PerformanceElement elem;
+ TimingMeasurement start_time;
+public:
+ PerformanceMeasurer(PerformanceElement elem);
+ ~PerformanceMeasurer();
+ void SetExpectedRate(double rate);
+ static void Paused(PerformanceElement elem);
+};
+
+/**
+ * RAII class for measuring multi-step elements of performance.
+ * At the beginning of a frame, call Reset on the element, then construct an object in the scope where
+ * each processing cycle happens. The measurements are summed between resets.
+ *
+ * Usually StateGameLoop is an appropriate function to place Reset calls in, but for elements with
+ * more isolated scopes it can also be appropriate to Reset somewhere else.
+ * An example is the CallVehicleTicks function where all the vehicle type elements are reset.
+ *
+ * The PerformanceMeasurer::Paused function can also be used with elements otherwise measured with this class.
+ */
+class PerformanceAccumulator {
+ PerformanceElement elem;
+ TimingMeasurement start_time;
+public:
+ PerformanceAccumulator(PerformanceElement elem);
+ ~PerformanceAccumulator();
+ static void Reset(PerformanceElement elem);
+};
+
+void ShowFramerateWindow();
+
+#endif /* FRAMERATE_TYPE_H */
diff --git a/src/game/game_info.cpp b/src/game/game_info.cpp
index 9761532965..f8c04608b7 100644
--- a/src/game/game_info.cpp
+++ b/src/game/game_info.cpp
@@ -29,9 +29,9 @@ static bool CheckAPIVersion(const char *api_version)
strcmp(api_version, "1.8") == 0 || strcmp(api_version, "1.9") == 0;
}
-#if defined(WIN32)
+#if defined(_WIN32)
#undef GetClassName
-#endif /* WIN32 */
+#endif /* _WIN32 */
template <> const char *GetClassName() { return "GSInfo"; }
/* static */ void GameInfo::RegisterAPI(Squirrel *engine)
diff --git a/src/game/game_text.cpp b/src/game/game_text.cpp
index 42ced20083..a32e5b41d7 100644
--- a/src/game/game_text.cpp
+++ b/src/game/game_text.cpp
@@ -142,7 +142,7 @@ struct StringListReader : StringReader {
/**
* Create the reader.
* @param data The data to fill during reading.
- * @param file The file we are reading.
+ * @param strings The language strings we are reading.
* @param master Are we reading the master file?
* @param translation Are we reading a translation?
*/
diff --git a/src/gamelog.cpp b/src/gamelog.cpp
index 400c0d22fb..621117f01b 100644
--- a/src/gamelog.cpp
+++ b/src/gamelog.cpp
@@ -771,9 +771,9 @@ void GamelogGRFUpdate(const GRFConfig *oldc, const GRFConfig *newc)
* Get some basic information from the given gamelog.
* @param gamelog_action Pointer to the gamelog to extract information from.
* @param gamelog_actions Number of actions in the given gamelog.
- * @param [out] last_ottd_rev OpenTTD NewGRF version from the binary that saved the savegame last.
- * @param [out] ever_modified Max value of 'modified' from all binaries that ever saved this savegame.
- * @param [out] removed_newgrfs Set to true if any NewGRFs have been removed.
+ * @param[out] last_ottd_rev OpenTTD NewGRF version from the binary that saved the savegame last.
+ * @param[out] ever_modified Max value of 'modified' from all binaries that ever saved this savegame.
+ * @param[out] removed_newgrfs Set to true if any NewGRFs have been removed.
*/
void GamelogInfo(LoggedAction *gamelog_action, uint gamelog_actions, uint32 *last_ottd_rev, byte *ever_modified, bool *removed_newgrfs)
{
diff --git a/src/genworld.h b/src/genworld.h
index ea3faa15fc..1b1c806e09 100644
--- a/src/genworld.h
+++ b/src/genworld.h
@@ -22,7 +22,7 @@ enum LandscapeGenerator {
LG_TERRAGENESIS = 1, ///< TerraGenesis Perlin landscape generator
};
-static const uint GENERATE_NEW_SEED = UINT_MAX; ///< Create a new random seed
+static const uint32 GENERATE_NEW_SEED = UINT32_MAX; ///< Create a new random seed
/** Modes for GenerateWorld */
enum GenWorldMode {
@@ -97,7 +97,7 @@ void SetGeneratingWorldProgress(GenWorldProgress cls, uint total);
void IncreaseGeneratingWorldProgress(GenWorldProgress cls);
void PrepareGenerateWorldProgress();
void ShowGenerateWorldProgress();
-void StartNewGameWithoutGUI(uint seed);
+void StartNewGameWithoutGUI(uint32 seed);
void ShowCreateScenario();
void StartScenarioEditor();
diff --git a/src/genworld_gui.cpp b/src/genworld_gui.cpp
index 04eea8e660..b22ba5287e 100644
--- a/src/genworld_gui.cpp
+++ b/src/genworld_gui.cpp
@@ -870,7 +870,7 @@ void StartScenarioEditor()
* Start a normal game without the GUI.
* @param seed The seed of the new game.
*/
-void StartNewGameWithoutGUI(uint seed)
+void StartNewGameWithoutGUI(uint32 seed)
{
/* GenerateWorld takes care of the possible GENERATE_NEW_SEED value in 'seed' */
_settings_newgame.game_creation.generation_seed = seed;
diff --git a/src/gfx.cpp b/src/gfx.cpp
index c9c36019ce..605ff7664b 100644
--- a/src/gfx.cpp
+++ b/src/gfx.cpp
@@ -703,8 +703,8 @@ Dimension GetStringBoundingBox(const char *str, FontSize start_fontsize)
}
/**
- * Get bounding box of a string. Uses parameters set by #DParam if needed.
- * Has the same restrictions as #GetStringBoundingBox(const char *str).
+ * Get bounding box of a string. Uses parameters set by #SetDParam if needed.
+ * Has the same restrictions as #GetStringBoundingBox(const char *str, FontSize start_fontsize).
* @param strid String to examine.
* @return Width and height of the bounding box for the string in pixels.
*/
@@ -761,7 +761,7 @@ void DrawCharCentered(WChar c, int x, int y, TextColour colour)
/**
* Get the size of a sprite.
* @param sprid Sprite to examine.
- * @param [out] offset Optionally returns the sprite position offset.
+ * @param[out] offset Optionally returns the sprite position offset.
* @return Sprite size in pixels.
* @note The size assumes (0, 0) as top-left coordinate and ignores any part of the sprite drawn at the left or above that position.
*/
@@ -1170,8 +1170,8 @@ byte GetDigitWidth(FontSize size)
/**
* Determine the broadest digits for guessing the maximum width of a n-digit number.
- * @param [out] front Broadest digit, which is not 0. (Use this digit as first digit for numbers with more than one digit.)
- * @param [out] next Broadest digit, including 0. (Use this digit for all digits, except the first one; or for numbers with only one digit.)
+ * @param[out] front Broadest digit, which is not 0. (Use this digit as first digit for numbers with more than one digit.)
+ * @param[out] next Broadest digit, including 0. (Use this digit for all digits, except the first one; or for numbers with only one digit.)
* @param size Font of the digit
*/
void GetBroadestDigit(uint *front, uint *next, FontSize size)
@@ -1635,8 +1635,8 @@ void SetAnimatedMouseCursor(const AnimCursor *table)
* Update cursor position on mouse movement.
* @param x New X position.
* @param y New Y position.
- * @param queued True, if the OS queues mouse warps after pending mouse movement events.
- * False, if the warp applies instantaneous.
+ * @param queued_warp True, if the OS queues mouse warps after pending mouse movement events.
+ * False, if the warp applies instantaneous.
* @return true, if the OS cursor position should be warped back to this->pos.
*/
bool CursorVars::UpdateCursorPosition(int x, int y, bool queued_warp)
diff --git a/src/gfx_layout.cpp b/src/gfx_layout.cpp
index 0a9f5a0b13..c65ead90e1 100644
--- a/src/gfx_layout.cpp
+++ b/src/gfx_layout.cpp
@@ -25,6 +25,10 @@
#include "os/windows/string_uniscribe.h"
#endif /* WITH_UNISCRIBE */
+#ifdef WITH_COCOA
+#include "os/macosx/string_osx.h"
+#endif
+
#include "safeguards.h"
@@ -121,14 +125,14 @@ le_bool Font::getGlyphPoint(LEGlyphID glyph, le_int32 pointNumber, LEPoint &poin
* Wrapper for doing layouts with ICU.
*/
class ICUParagraphLayout : public AutoDeleteSmallVector, public ParagraphLayouter {
- ParagraphLayout *p; ///< The actual ICU paragraph layout.
+ icu::ParagraphLayout *p; ///< The actual ICU paragraph layout.
public:
/** Visual run contains data about the bit of text with the same font. */
class ICUVisualRun : public ParagraphLayouter::VisualRun {
- const ParagraphLayout::VisualRun *vr; ///< The actual ICU vr.
+ const icu::ParagraphLayout::VisualRun *vr; ///< The actual ICU vr.
public:
- ICUVisualRun(const ParagraphLayout::VisualRun *vr) : vr(vr) { }
+ ICUVisualRun(const icu::ParagraphLayout::VisualRun *vr) : vr(vr) { }
const Font *GetFont() const { return (const Font*)vr->getFont(); }
int GetGlyphCount() const { return vr->getGlyphCount(); }
@@ -140,10 +144,10 @@ public:
/** A single line worth of VisualRuns. */
class ICULine : public AutoDeleteSmallVector, public ParagraphLayouter::Line {
- ParagraphLayout::Line *l; ///< The actual ICU line.
+ icu::ParagraphLayout::Line *l; ///< The actual ICU line.
public:
- ICULine(ParagraphLayout::Line *l) : l(l)
+ ICULine(icu::ParagraphLayout::Line *l) : l(l)
{
for (int i = 0; i < l->countRuns(); i++) {
*this->Append() = new ICUVisualRun(l->getVisualRun(i));
@@ -163,13 +167,13 @@ public:
}
};
- ICUParagraphLayout(ParagraphLayout *p) : p(p) { }
+ ICUParagraphLayout(icu::ParagraphLayout *p) : p(p) { }
~ICUParagraphLayout() { delete p; }
void Reflow() { p->reflow(); }
ParagraphLayouter::Line *NextLine(int max_width)
{
- ParagraphLayout::Line *l = p->nextLine(max_width);
+ icu::ParagraphLayout::Line *l = p->nextLine(max_width);
return l == NULL ? NULL : new ICULine(l);
}
};
@@ -196,7 +200,7 @@ public:
}
/* Fill ICU's FontRuns with the right data. */
- FontRuns runs(fontMapping.Length());
+ icu::FontRuns runs(fontMapping.Length());
for (FontMap::iterator iter = fontMapping.Begin(); iter != fontMapping.End(); iter++) {
runs.add(iter->second, iter->first);
}
@@ -204,7 +208,7 @@ public:
LEErrorCode status = LE_NO_ERROR;
/* ParagraphLayout does not copy "buff", so it must stay valid.
* "runs" is copied according to the ICU source, but the documentation does not specify anything, so this might break somewhen. */
- ParagraphLayout *p = new ParagraphLayout(buff, length, &runs, NULL, NULL, NULL, _current_text_dir == TD_RTL ? UBIDI_DEFAULT_RTL : UBIDI_DEFAULT_LTR, false, status);
+ icu::ParagraphLayout *p = new icu::ParagraphLayout(buff, length, &runs, NULL, NULL, NULL, _current_text_dir == TD_RTL ? UBIDI_DEFAULT_RTL : UBIDI_DEFAULT_LTR, false, status);
if (status != LE_NO_ERROR) {
delete p;
return NULL;
@@ -498,11 +502,6 @@ const ParagraphLayouter::Line *FallbackParagraphLayout::NextLine(int max_width)
return l;
}
- const WChar *begin = this->buffer;
- const WChar *last_space = NULL;
- const WChar *last_char = begin;
- int width = 0;
-
int offset = this->buffer - this->buffer_begin;
FontMap::iterator iter = this->runs.Begin();
while (iter->first <= offset) {
@@ -513,6 +512,10 @@ const ParagraphLayouter::Line *FallbackParagraphLayout::NextLine(int max_width)
const FontCache *fc = iter->second->fc;
const WChar *next_run = this->buffer_begin + iter->first;
+ const WChar *begin = this->buffer;
+ const WChar *last_space = NULL;
+ const WChar *last_char;
+ int width = 0;
for (;;) {
WChar c = *this->buffer;
last_char = this->buffer;
@@ -671,7 +674,9 @@ Layouter::Layouter(const char *str, int maxw, TextColour colour, FontSize fontsi
} else {
/* Line is new, layout it */
FontState old_state = state;
+#if defined(WITH_ICU_LAYOUT) || defined(WITH_UNISCRIBE) || defined(WITH_COCOA)
const char *old_str = str;
+#endif
#ifdef WITH_ICU_LAYOUT
GetLayouter(line, str, state);
@@ -697,6 +702,16 @@ Layouter::Layouter(const char *str, int maxw, TextColour colour, FontSize fontsi
}
#endif
+#ifdef WITH_COCOA
+ if (line.layout == NULL) {
+ GetLayouter(line, str, state);
+ if (line.layout == NULL) {
+ state = old_state;
+ str = old_str;
+ }
+ }
+#endif
+
if (line.layout == NULL) {
GetLayouter(line, str, state);
}
@@ -840,6 +855,9 @@ void Layouter::ResetFontCache(FontSize size)
#if defined(WITH_UNISCRIBE)
UniscribeResetScriptCache(size);
#endif
+#if defined(WITH_COCOA)
+ MacOSResetScriptCache(size);
+#endif
}
/**
diff --git a/src/gfx_layout.h b/src/gfx_layout.h
index 45d79ae474..f6fc3b5c71 100644
--- a/src/gfx_layout.h
+++ b/src/gfx_layout.h
@@ -22,7 +22,7 @@
#ifdef WITH_ICU_LAYOUT
#include "layout/ParagraphLayout.h"
-#define ICU_FONTINSTANCE : public LEFontInstance
+#define ICU_FONTINSTANCE : public icu::LEFontInstance
#else /* WITH_ICU_LAYOUT */
#define ICU_FONTINSTANCE
#endif /* WITH_ICU_LAYOUT */
diff --git a/src/gfx_type.h b/src/gfx_type.h
index ca9bf9fcef..4cfc149a86 100644
--- a/src/gfx_type.h
+++ b/src/gfx_type.h
@@ -189,7 +189,7 @@ union Colour {
/**
* Create a new colour.
- * @param The colour in the correct packed format.
+ * @param data The colour in the correct packed format.
*/
Colour(uint data = 0) : data(data)
{
diff --git a/src/gfxinit.cpp b/src/gfxinit.cpp
index f73027e91e..3613ce0d86 100644
--- a/src/gfxinit.cpp
+++ b/src/gfxinit.cpp
@@ -80,7 +80,7 @@ static uint LoadGrfFile(const char *filename, uint load_index, int file_index)
/**
* Load an old fashioned GRF file to replace already loaded sprites.
* @param filename The name of the file to open.
- * @param index_tlb The offsets of each of the sprites.
+ * @param index_tbl The offsets of each of the sprites.
* @param file_index The Fio offset to load the file in.
* @return The number of loaded sprites.
*/
diff --git a/src/goal_gui.cpp b/src/goal_gui.cpp
index f98189d183..ee4d8170e1 100644
--- a/src/goal_gui.cpp
+++ b/src/goal_gui.cpp
@@ -101,7 +101,7 @@ struct GoalListWindow : public Window {
/**
* Handle clicking at a goal.
- * @param s @Goal clicked at.
+ * @param s #Goal clicked at.
*/
void HandleClick(const Goal *s)
{
@@ -193,7 +193,7 @@ struct GoalListWindow : public Window {
/**
* Draws either the global goals or the company goal section.
* This is a helper method for #DrawWidget.
- * @param pos [inout] Vertical line number to draw.
+ * @param[in,out] pos Vertical line number to draw.
* @param cap Number of lines to draw in the window.
* @param x Left edge of the text line to draw.
* @param y Vertical position of the top edge of the window.
@@ -250,8 +250,8 @@ struct GoalListWindow : public Window {
/**
* Draws a given column of the goal list.
* @param column Which column to draw.
- * @wid Pointer to the goal list widget.
- * @progress_col_width Width of the progress column.
+ * @param wid Pointer to the goal list widget.
+ * @param progress_col_width Width of the progress column.
* @return max width of drawn text
*/
void DrawListColumn(GoalColumn column, NWidgetBase *wid, uint progress_col_width) const
diff --git a/src/graph_gui.cpp b/src/graph_gui.cpp
index f4334429fb..48b8c4c84a 100644
--- a/src/graph_gui.cpp
+++ b/src/graph_gui.cpp
@@ -1402,9 +1402,9 @@ struct PerformanceRatingDetailWindow : Window {
int colour_notdone = _colour_gradient[COLOUR_RED][4];
/* Draw all the score parts */
- int val = _score_part[company][score_type];
- int needed = _score_info[score_type].needed;
- int score = _score_info[score_type].score;
+ int64 val = _score_part[company][score_type];
+ int64 needed = _score_info[score_type].needed;
+ int score = _score_info[score_type].score;
/* SCORE_TOTAL has his own rules ;) */
if (score_type == SCORE_TOTAL) {
@@ -1422,7 +1422,7 @@ struct PerformanceRatingDetailWindow : Window {
DrawString(this->score_info_left, this->score_info_right, text_top, STR_BLACK_COMMA, TC_FROMSTRING, SA_RIGHT);
/* Calculate the %-bar */
- uint x = Clamp(val, 0, needed) * this->bar_width / needed;
+ uint x = Clamp(val, 0, needed) * this->bar_width / needed;
bool rtl = _current_text_dir == TD_RTL;
if (rtl) {
x = this->bar_right - x;
@@ -1435,7 +1435,7 @@ struct PerformanceRatingDetailWindow : Window {
if (x != this->bar_right) GfxFillRect(x, bar_top, this->bar_right, bar_top + this->bar_height, rtl ? colour_done : colour_notdone);
/* Draw it */
- SetDParam(0, Clamp(val, 0, needed) * 100 / needed);
+ SetDParam(0, Clamp(val, 0, needed) * 100 / needed);
DrawString(this->bar_left, this->bar_right, text_top, STR_PERFORMANCE_DETAIL_PERCENT, TC_FROMSTRING, SA_HOR_CENTER);
/* SCORE_LOAN is inversed */
diff --git a/src/ground_vehicle.cpp b/src/ground_vehicle.cpp
index f8efd8e1aa..6fd8d77106 100644
--- a/src/ground_vehicle.cpp
+++ b/src/ground_vehicle.cpp
@@ -58,7 +58,7 @@ void GroundVehicle::PowerChanged()
this->gcache.cached_air_drag = air_drag + 3 * air_drag * number_of_parts / 20;
- max_te *= 9800; // Tractive effort in (tonnes * 1000 * 9.8 =) N.
+ max_te *= GROUND_ACCELERATION; // Tractive effort in (tonnes * 1000 * 9.8 =) N.
max_te /= 256; // Tractive effort is a [0-255] coefficient.
if (this->gcache.cached_power != total_power || this->gcache.cached_max_te != max_te) {
/* Stop the vehicle if it has no power. */
diff --git a/src/group_cmd.cpp b/src/group_cmd.cpp
index 12cce41f74..66d75fb44e 100644
--- a/src/group_cmd.cpp
+++ b/src/group_cmd.cpp
@@ -98,7 +98,7 @@ void GroupStatistics::Clear()
}
/**
- * Update all caches after loading a game, changing NewGRF etc..
+ * Update all caches after loading a game, changing NewGRF, etc.
*/
/* static */ void GroupStatistics::UpdateAfterLoad()
{
diff --git a/src/group_gui.cpp b/src/group_gui.cpp
index d3e1eafbb9..aef934ccf5 100644
--- a/src/group_gui.cpp
+++ b/src/group_gui.cpp
@@ -977,11 +977,11 @@ static inline VehicleGroupWindow *FindVehicleGroupWindow(VehicleType vt, Owner o
}
/**
- * Opens a 'Rename group' window for newly created group
- * @param success did command succeed?
- * @param tile unused
- * @param p1 vehicle type
- * @param p2 unused
+ * Opens a 'Rename group' window for newly created group.
+ * @param result Did command succeed?
+ * @param tile Unused.
+ * @param p1 Vehicle type.
+ * @param p2 Unused.
* @see CmdCreateGroup
*/
void CcCreateGroup(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2)
@@ -995,7 +995,7 @@ void CcCreateGroup(const CommandCost &result, TileIndex tile, uint32 p1, uint32
/**
* Open rename window after adding a vehicle to a new group via drag and drop.
- * @param success Did command succeed?
+ * @param result Did command succeed?
* @param tile Unused.
* @param p1 Unused.
* @param p2 Bit 0-19: Vehicle ID.
diff --git a/src/heightmap.cpp b/src/heightmap.cpp
index 630dc69d7e..17bdbbf610 100644
--- a/src/heightmap.cpp
+++ b/src/heightmap.cpp
@@ -447,9 +447,9 @@ void FixSlopes()
* Reads the heightmap with the correct file reader.
* @param dft Type of image file.
* @param filename Name of the file to load.
- * @param [out] x Length of the image.
- * @param [out] y Height of the image.
- * @param [inout] map If not \c NULL, destination to store the loaded block of image data.
+ * @param[out] x Length of the image.
+ * @param[out] y Height of the image.
+ * @param[in,out] map If not \c NULL, destination to store the loaded block of image data.
* @return Whether loading was successful.
*/
static bool ReadHeightMap(DetailedFileType dft, const char *filename, uint *x, uint *y, byte **map)
diff --git a/src/hotkeys.cpp b/src/hotkeys.cpp
index 870e2cbea6..12bd827fa5 100644
--- a/src/hotkeys.cpp
+++ b/src/hotkeys.cpp
@@ -41,6 +41,7 @@ static const KeycodeNames _keycode_to_name[] = {
{"GLOBAL", WKC_GLOBAL_HOTKEY},
{"ESC", WKC_ESC},
{"DEL", WKC_DELETE},
+ {"BACKSPACE", WKC_BACKSPACE},
{"RETURN", WKC_RETURN},
{"BACKQUOTE", WKC_BACKQUOTE},
{"F1", WKC_F1},
diff --git a/src/house.h b/src/house.h
index ddc2a448c6..94ef62ad54 100644
--- a/src/house.h
+++ b/src/house.h
@@ -120,7 +120,7 @@ struct HouseSpec {
AnimationInfo animation; ///< information about the animation.
byte processing_time; ///< Periodic refresh multiplier
byte minimum_life; ///< The minimum number of years this house will survive before the town rebuilds it
- uint32 watched_cargoes; ///< Cargo types watched for acceptance.
+ CargoTypes watched_cargoes; ///< Cargo types watched for acceptance.
Money GetRemovalCost() const;
diff --git a/src/industry.h b/src/industry.h
index 9b185efc4b..af0208b3cc 100644
--- a/src/industry.h
+++ b/src/industry.h
@@ -12,9 +12,11 @@
#ifndef INDUSTRY_H
#define INDUSTRY_H
+#include
#include "newgrf_storage.h"
#include "subsidy_type.h"
#include "industry_map.h"
+#include "industrytype.h"
#include "tilearea_type.h"
@@ -37,20 +39,20 @@ enum ProductionLevels {
* Defines the internal data of a functional industry.
*/
struct Industry : IndustryPool::PoolItem<&_industry_pool> {
- TileArea location; ///< Location of the industry
- Town *town; ///< Nearest town
- CargoID produced_cargo[2]; ///< 2 production cargo slots
- uint16 produced_cargo_waiting[2]; ///< amount of cargo produced per cargo
- uint16 incoming_cargo_waiting[3]; ///< incoming cargo waiting to be processed
- byte production_rate[2]; ///< production rate for each cargo
- byte prod_level; ///< general production level
- CargoID accepts_cargo[3]; ///< 3 input cargo slots
- uint16 this_month_production[2]; ///< stats of this month's production per cargo
- uint16 this_month_transported[2]; ///< stats of this month's transport per cargo
- byte last_month_pct_transported[2]; ///< percentage transported per cargo in the last full month
- uint16 last_month_production[2]; ///< total units produced per cargo in the last full month
- uint16 last_month_transported[2]; ///< total units transported per cargo in the last full month
- uint16 counter; ///< used for animation and/or production (if available cargo)
+ TileArea location; ///< Location of the industry
+ Town *town; ///< Nearest town
+ CargoID produced_cargo[INDUSTRY_NUM_OUTPUTS]; ///< 16 production cargo slots
+ uint16 produced_cargo_waiting[INDUSTRY_NUM_OUTPUTS]; ///< amount of cargo produced per cargo
+ uint16 incoming_cargo_waiting[INDUSTRY_NUM_INPUTS]; ///< incoming cargo waiting to be processed
+ byte production_rate[INDUSTRY_NUM_OUTPUTS]; ///< production rate for each cargo
+ byte prod_level; ///< general production level
+ CargoID accepts_cargo[INDUSTRY_NUM_INPUTS]; ///< 16 input cargo slots
+ uint16 this_month_production[INDUSTRY_NUM_OUTPUTS]; ///< stats of this month's production per cargo
+ uint16 this_month_transported[INDUSTRY_NUM_OUTPUTS]; ///< stats of this month's transport per cargo
+ byte last_month_pct_transported[INDUSTRY_NUM_OUTPUTS]; ///< percentage transported per cargo in the last full month
+ uint16 last_month_production[INDUSTRY_NUM_OUTPUTS]; ///< total units produced per cargo in the last full month
+ uint16 last_month_transported[INDUSTRY_NUM_OUTPUTS]; ///< total units transported per cargo in the last full month
+ uint16 counter; ///< used for animation and/or production (if available cargo)
IndustryType type; ///< type of industry.
OwnerByte owner; ///< owner of the industry. Which SHOULD always be (imho) OWNER_NONE
@@ -63,7 +65,7 @@ struct Industry : IndustryPool::PoolItem<&_industry_pool> {
OwnerByte founder; ///< Founder of the industry
Date construction_date; ///< Date of the construction of the industry
uint8 construction_type; ///< Way the industry was constructed (@see IndustryConstructionType)
- Date last_cargo_accepted_at; ///< Last day cargo was accepted by this industry
+ Date last_cargo_accepted_at[INDUSTRY_NUM_INPUTS]; ///< Last day each cargo type was accepted by this industry
byte selected_layout; ///< Which tile layout was used when creating the industry
uint16 random; ///< Random value used for randomisation of all kinds of things
@@ -85,6 +87,22 @@ struct Industry : IndustryPool::PoolItem<&_industry_pool> {
return IsTileType(tile, MP_INDUSTRY) && GetIndustryIndex(tile) == this->index;
}
+ inline int GetCargoProducedIndex(CargoID cargo) const
+ {
+ if (cargo == CT_INVALID) return -1;
+ const CargoID *pos = std::find(this->produced_cargo, endof(this->produced_cargo), cargo);
+ if (pos == endof(this->produced_cargo)) return -1;
+ return pos - this->produced_cargo;
+ }
+
+ inline int GetCargoAcceptedIndex(CargoID cargo) const
+ {
+ if (cargo == CT_INVALID) return -1;
+ const CargoID *pos = std::find(this->accepts_cargo, endof(this->accepts_cargo), cargo);
+ if (pos == endof(this->accepts_cargo)) return -1;
+ return pos - this->accepts_cargo;
+ }
+
/**
* Get the industry of the given tile
* @param tile the tile to get the industry from
diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp
index 7d1a7e2e6a..d918ef16bd 100644
--- a/src/industry_cmd.cpp
+++ b/src/industry_cmd.cpp
@@ -394,35 +394,49 @@ static void AddAcceptedCargo_Industry(TileIndex tile, CargoArray &acceptance, Ca
{
IndustryGfx gfx = GetIndustryGfx(tile);
const IndustryTileSpec *itspec = GetIndustryTileSpec(gfx);
+ const Industry *ind = Industry::GetByTile(tile);
- /* When we have to use a callback, we put our data in the next two variables */
- CargoID raw_accepts_cargo[lengthof(itspec->accepts_cargo)];
- uint8 raw_cargo_acceptance[lengthof(itspec->acceptance)];
+ /* Starting point for acceptance */
+ CargoID accepts_cargo[lengthof(itspec->accepts_cargo)];
+ int8 cargo_acceptance[lengthof(itspec->acceptance)];
+ MemCpyT(accepts_cargo, itspec->accepts_cargo, lengthof(accepts_cargo));
+ MemCpyT(cargo_acceptance, itspec->acceptance, lengthof(cargo_acceptance));
- /* And then these will always point to a same sized array with the required data */
- const CargoID *accepts_cargo = itspec->accepts_cargo;
- const uint8 *cargo_acceptance = itspec->acceptance;
+ if (itspec->special_flags & INDTILE_SPECIAL_ACCEPTS_ALL_CARGO) {
+ /* Copy all accepted cargoes from industry itself */
+ for (uint i = 0; i < lengthof(ind->accepts_cargo); i++) {
+ CargoID *pos = std::find(accepts_cargo, endof(accepts_cargo), ind->accepts_cargo[i]);
+ if (pos == endof(accepts_cargo)) {
+ /* Not found, insert */
+ pos = std::find(accepts_cargo, endof(accepts_cargo), CT_INVALID);
+ if (pos == endof(accepts_cargo)) continue; // nowhere to place, give up on this one
+ *pos = ind->accepts_cargo[i];
+ }
+ cargo_acceptance[pos - accepts_cargo] += 8;
+ }
+ }
if (HasBit(itspec->callback_mask, CBM_INDT_ACCEPT_CARGO)) {
+ /* Try callback for accepts list, if success override all existing accepts */
uint16 res = GetIndustryTileCallback(CBID_INDTILE_ACCEPT_CARGO, 0, 0, gfx, Industry::GetByTile(tile), tile);
if (res != CALLBACK_FAILED) {
- accepts_cargo = raw_accepts_cargo;
- for (uint i = 0; i < lengthof(itspec->accepts_cargo); i++) raw_accepts_cargo[i] = GetCargoTranslation(GB(res, i * 5, 5), itspec->grf_prop.grffile);
+ MemSetT(accepts_cargo, CT_INVALID, lengthof(accepts_cargo));
+ for (uint i = 0; i < 3; i++) accepts_cargo[i] = GetCargoTranslation(GB(res, i * 5, 5), itspec->grf_prop.grffile);
}
}
if (HasBit(itspec->callback_mask, CBM_INDT_CARGO_ACCEPTANCE)) {
+ /* Try callback for acceptance list, if success override all existing acceptance */
uint16 res = GetIndustryTileCallback(CBID_INDTILE_CARGO_ACCEPTANCE, 0, 0, gfx, Industry::GetByTile(tile), tile);
if (res != CALLBACK_FAILED) {
- cargo_acceptance = raw_cargo_acceptance;
- for (uint i = 0; i < lengthof(itspec->accepts_cargo); i++) raw_cargo_acceptance[i] = GB(res, i * 4, 4);
+ MemSetT(cargo_acceptance, 0, lengthof(cargo_acceptance));
+ for (uint i = 0; i < 3; i++) cargo_acceptance[i] = GB(res, i * 4, 4);
}
}
- const Industry *ind = Industry::GetByTile(tile);
for (byte i = 0; i < lengthof(itspec->accepts_cargo); i++) {
CargoID a = accepts_cargo[i];
- if (a == CT_INVALID || cargo_acceptance[i] == 0) continue; // work only with valid cargoes
+ if (a == CT_INVALID || cargo_acceptance[i] <= 0) continue; // work only with valid cargoes
/* Add accepted cargo */
acceptance[a] += cargo_acceptance[i];
@@ -1118,8 +1132,9 @@ static void ProduceIndustryGoods(Industry *i)
if (HasBit(indsp->callback_mask, CBM_IND_PRODUCTION_256_TICKS)) IndustryProductionCallback(i, 1);
IndustryBehaviour indbehav = indsp->behaviour;
- i->produced_cargo_waiting[0] = min(0xffff, i->produced_cargo_waiting[0] + i->production_rate[0]);
- i->produced_cargo_waiting[1] = min(0xffff, i->produced_cargo_waiting[1] + i->production_rate[1]);
+ for (size_t j = 0; j < lengthof(i->produced_cargo_waiting); j++) {
+ i->produced_cargo_waiting[j] = min(0xffff, i->produced_cargo_waiting[j] + i->production_rate[j]);
+ }
if ((indbehav & INDUSTRYBEH_PLANT_FIELDS) != 0) {
uint16 cb_res = CALLBACK_FAILED;
@@ -1323,7 +1338,7 @@ static CheckNewIndustryProc * const _check_new_industry_procs[CHECK_END] = {
* Find a town for the industry, while checking for multiple industries in the same town.
* @param tile Position of the industry to build.
* @param type Industry type.
- * @param [out] town Pointer to return town for the new industry, \c NULL is written if no good town can be found.
+ * @param[out] t Pointer to return town for the new industry, \c NULL is written if no good town can be found.
* @return Succeeded or failed command.
*
* @pre \c *t != NULL
@@ -1365,14 +1380,14 @@ bool IsSlopeRefused(Slope current, Slope refused)
/**
* Are the tiles of the industry free?
- * @param tile Position to check.
- * @param it Industry tiles table.
- * @param itspec_index The index of the itsepc to build/fund
- * @param type Type of the industry.
- * @param initial_random_bits The random bits the industry is going to have after construction.
- * @param founder Industry founder
- * @param creation_type The circumstances the industry is created under.
- * @param [out] custom_shape_check Perform custom check for the site.
+ * @param tile Position to check.
+ * @param it Industry tiles table.
+ * @param itspec_index The index of the itsepc to build/fund
+ * @param type Type of the industry.
+ * @param initial_random_bits The random bits the industry is going to have after construction.
+ * @param founder Industry founder
+ * @param creation_type The circumstances the industry is created under.
+ * @param[out] custom_shape_check Perform custom check for the site.
* @return Failed or succeeded command.
*/
static CommandCost CheckIfIndustryTilesAreFree(TileIndex tile, const IndustryTileTable *it, uint itspec_index, int type, uint16 initial_random_bits, Owner founder, IndustryAvailabilityCallType creation_type, bool *custom_shape_check = NULL)
@@ -1648,18 +1663,23 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type,
i->type = type;
Industry::IncIndustryTypeCount(type);
- i->produced_cargo[0] = indspec->produced_cargo[0];
- i->produced_cargo[1] = indspec->produced_cargo[1];
- i->accepts_cargo[0] = indspec->accepts_cargo[0];
- i->accepts_cargo[1] = indspec->accepts_cargo[1];
- i->accepts_cargo[2] = indspec->accepts_cargo[2];
- i->production_rate[0] = indspec->production_rate[0];
- i->production_rate[1] = indspec->production_rate[1];
+ MemCpyT(i->produced_cargo, indspec->produced_cargo, lengthof(i->produced_cargo));
+ MemCpyT(i->production_rate, indspec->production_rate, lengthof(i->production_rate));
+ MemCpyT(i->accepts_cargo, indspec->accepts_cargo, lengthof(i->accepts_cargo));
+
+ MemSetT(i->produced_cargo_waiting, 0, lengthof(i->produced_cargo_waiting));
+ MemSetT(i->this_month_production, 0, lengthof(i->this_month_production));
+ MemSetT(i->this_month_transported, 0, lengthof(i->this_month_transported));
+ MemSetT(i->last_month_pct_transported, 0, lengthof(i->last_month_pct_transported));
+ MemSetT(i->last_month_transported, 0, lengthof(i->last_month_transported));
+ MemSetT(i->incoming_cargo_waiting, 0, lengthof(i->incoming_cargo_waiting));
+ MemSetT(i->last_cargo_accepted_at, 0, lengthof(i->last_cargo_accepted_at));
/* don't use smooth economy for industries using production related callbacks */
if (indspec->UsesSmoothEconomy()) {
- i->production_rate[0] = min((RandomRange(256) + 128) * i->production_rate[0] >> 8, 255);
- i->production_rate[1] = min((RandomRange(256) + 128) * i->production_rate[1] >> 8, 255);
+ for (size_t ci = 0; ci < lengthof(i->production_rate); ci++) {
+ i->production_rate[ci] = min((RandomRange(256) + 128) * i->production_rate[ci] >> 8, 255);
+ }
}
i->town = t;
@@ -1669,19 +1689,6 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type,
i->random_colour = GB(r, 0, 4);
i->counter = GB(r, 4, 12);
i->random = initial_random_bits;
- i->produced_cargo_waiting[0] = 0;
- i->produced_cargo_waiting[1] = 0;
- i->incoming_cargo_waiting[0] = 0;
- i->incoming_cargo_waiting[1] = 0;
- i->incoming_cargo_waiting[2] = 0;
- i->this_month_production[0] = 0;
- i->this_month_production[1] = 0;
- i->this_month_transported[0] = 0;
- i->this_month_transported[1] = 0;
- i->last_month_pct_transported[0] = 0;
- i->last_month_pct_transported[1] = 0;
- i->last_month_transported[0] = 0;
- i->last_month_transported[1] = 0;
i->was_cargo_delivered = false;
i->last_prod_year = _cur_year;
i->founder = founder;
@@ -1712,10 +1719,9 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type,
}
if (_generating_world) {
- i->last_month_production[0] = i->production_rate[0] * 8;
- i->last_month_production[1] = i->production_rate[1] * 8;
- } else {
- i->last_month_production[0] = i->last_month_production[1] = 0;
+ for (size_t ci = 0; ci < lengthof(i->last_month_production); ci++) {
+ i->last_month_production[ci] = i->production_rate[ci] * 8;
+ }
}
if (HasBit(indspec->callback_mask, CBM_IND_DECIDE_COLOUR)) {
@@ -1727,28 +1733,56 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type,
}
if (HasBit(indspec->callback_mask, CBM_IND_INPUT_CARGO_TYPES)) {
+ /* Clear all input cargo types */
for (uint j = 0; j < lengthof(i->accepts_cargo); j++) i->accepts_cargo[j] = CT_INVALID;
- for (uint j = 0; j < lengthof(i->accepts_cargo); j++) {
+ /* Query actual types */
+ uint maxcargoes = (indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED) ? lengthof(i->accepts_cargo) : 3;
+ for (uint j = 0; j < maxcargoes; j++) {
uint16 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 (indspec->grf_prop.grffile->grf_version >= 8 && res >= 0x100) {
ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_INPUT_CARGO_TYPES, res);
break;
}
- i->accepts_cargo[j] = GetCargoTranslation(GB(res, 0, 8), indspec->grf_prop.grffile);
+ CargoID cargo = GetCargoTranslation(GB(res, 0, 8), indspec->grf_prop.grffile);
+ if (std::find(indspec->accepts_cargo, endof(indspec->accepts_cargo), cargo) == endof(indspec->accepts_cargo)) {
+ /* Cargo not in spec, error in NewGRF */
+ ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_INPUT_CARGO_TYPES, res);
+ break;
+ }
+ if (std::find(i->accepts_cargo, i->accepts_cargo + j, cargo) != i->accepts_cargo + j) {
+ /* Duplicate cargo */
+ ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_INPUT_CARGO_TYPES, res);
+ break;
+ }
+ i->accepts_cargo[j] = cargo;
}
}
if (HasBit(indspec->callback_mask, CBM_IND_OUTPUT_CARGO_TYPES)) {
+ /* Clear all output cargo types */
for (uint j = 0; j < lengthof(i->produced_cargo); j++) i->produced_cargo[j] = CT_INVALID;
- for (uint j = 0; j < lengthof(i->produced_cargo); j++) {
+ /* Query actual types */
+ uint maxcargoes = (indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED) ? lengthof(i->produced_cargo) : 2;
+ for (uint j = 0; j < maxcargoes; j++) {
uint16 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 (indspec->grf_prop.grffile->grf_version >= 8 && res >= 0x100) {
ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_OUTPUT_CARGO_TYPES, res);
break;
}
- i->produced_cargo[j] = GetCargoTranslation(GB(res, 0, 8), indspec->grf_prop.grffile);
+ CargoID cargo = GetCargoTranslation(GB(res, 0, 8), indspec->grf_prop.grffile);
+ if (std::find(indspec->produced_cargo, endof(indspec->produced_cargo), cargo) == endof(indspec->produced_cargo)) {
+ /* Cargo not in spec, error in NewGRF */
+ ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_OUTPUT_CARGO_TYPES, res);
+ break;
+ }
+ if (std::find(i->produced_cargo, i->produced_cargo + j, cargo) != i->produced_cargo + j) {
+ /* Duplicate cargo */
+ ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_OUTPUT_CARGO_TYPES, res);
+ break;
+ }
+ i->produced_cargo[j] = cargo;
}
}
@@ -1793,11 +1827,11 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type,
* @param flags of operations to conduct
* @param indspec pointer to industry specifications
* @param itspec_index the index of the itsepc to build/fund
- * @param seed random seed (possibly) used by industries
- * @param initial_random_bits The random bits the industry is going to have after construction.
+ * @param random_var8f random seed (possibly) used by industries
+ * @param random_initial_bits The random bits the industry is going to have after construction.
* @param founder Founder of the industry
* @param creation_type The circumstances the industry is created under.
- * @param [out] ip Pointer to store newly created industry.
+ * @param[out] ip Pointer to store newly created industry.
* @return Succeeded or failed command.
*
* @post \c *ip contains the newly created industry if all checks are successful and the \a flags request actual creation, else it contains \c NULL afterwards.
@@ -1961,7 +1995,7 @@ static Industry *CreateNewIndustry(TileIndex tile, IndustryType type, IndustryAv
/**
* Compute the appearance probability for an industry during map creation.
* @param it Industry type to compute.
- * @param [out] force_at_least_one Returns whether at least one instance should be forced on map creation.
+ * @param[out] force_at_least_one Returns whether at least one instance should be forced on map creation.
* @return Relative probability for the industry to appear.
*/
static uint32 GetScaledIndustryGenerationProbability(IndustryType it, bool *force_at_least_one)
@@ -1986,7 +2020,7 @@ static uint32 GetScaledIndustryGenerationProbability(IndustryType it, bool *forc
/**
* Compute the probability for constructing a new industry during game play.
* @param it Industry type to compute.
- * @param [out] min_number Minimal number of industries that should exist at the map.
+ * @param[out] min_number Minimal number of industries that should exist at the map.
* @return Relative probability for the industry to appear.
*/
static uint16 GetIndustryGamePlayProbability(IndustryType it, byte *min_number)
@@ -2194,8 +2228,9 @@ void Industry::RecomputeProductionMultipliers()
assert(!indspec->UsesSmoothEconomy());
/* Rates are rounded up, so e.g. oilrig always produces some passengers */
- this->production_rate[0] = min(CeilDiv(indspec->production_rate[0] * this->prod_level, PRODLEVEL_DEFAULT), 0xFF);
- this->production_rate[1] = min(CeilDiv(indspec->production_rate[1] * this->prod_level, PRODLEVEL_DEFAULT), 0xFF);
+ for (size_t i = 0; i < lengthof(this->production_rate); i++) {
+ this->production_rate[i] = min(CeilDiv(indspec->production_rate[i] * this->prod_level, PRODLEVEL_DEFAULT), 0xFF);
+ }
}
diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp
index 2e06983af0..98c9edda21 100644
--- a/src/industry_gui.cpp
+++ b/src/industry_gui.cpp
@@ -74,12 +74,7 @@ static void ShowIndustryCargoesWindow(IndustryType id);
/**
* Gets the string to display after the cargo name (using callback 37)
- * @param cargo the cargo for which the suffix is requested
- * - 00 - first accepted cargo type
- * - 01 - second accepted cargo type
- * - 02 - third accepted cargo type
- * - 03 - first produced cargo type
- * - 04 - second produced cargo type
+ * @param cargo the cargo for which the suffix is requested, meaning depends on presence of flag 18 in prop 1A
* @param cst the cargo suffix type (for which window is it requested). @see CargoSuffixType
* @param ind the industry (NULL if in fund window)
* @param ind_type the industry type
@@ -134,9 +129,14 @@ static void GetCargoSuffix(uint cargo, CargoSuffixType cst, const Industry *ind,
}
}
+enum CargoSuffixInOut {
+ CARGOSUFFIX_OUT = 0,
+ CARGOSUFFIX_IN = 1,
+};
+
/**
* Gets all strings to display after the cargoes of industries (using callback 37)
- * @param cb_offset The offset for the cargo used in cb37, 0 for accepted cargoes, 3 for produced cargoes
+ * @param use_input get suffixes for output cargoes or input cargoes?
* @param cst the cargo suffix type (for which window is it requested). @see CargoSuffixType
* @param ind the industry (NULL if in fund window)
* @param ind_type the industry type
@@ -145,14 +145,40 @@ static void GetCargoSuffix(uint cargo, CargoSuffixType cst, const Industry *ind,
* @param suffixes is filled with the suffixes
*/
template
-static inline void GetAllCargoSuffixes(uint cb_offset, CargoSuffixType cst, const Industry *ind, IndustryType ind_type, const IndustrySpec *indspec, const TC &cargoes, TS &suffixes)
+static inline void GetAllCargoSuffixes(CargoSuffixInOut use_input, CargoSuffixType cst, const Industry *ind, IndustryType ind_type, const IndustrySpec *indspec, const TC &cargoes, TS &suffixes)
{
assert_compile(lengthof(cargoes) <= lengthof(suffixes));
- for (uint j = 0; j < lengthof(cargoes); j++) {
- if (cargoes[j] != CT_INVALID) {
- GetCargoSuffix(cb_offset + j, cst, ind, ind_type, indspec, suffixes[j]);
- } else {
+
+ if (indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED) {
+ /* Reworked behaviour with new many-in-many-out scheme */
+ for (uint j = 0; j < lengthof(suffixes); j++) {
+ if (cargoes[j] != CT_INVALID) {
+ byte local_id = indspec->grf_prop.grffile->cargo_map[cargoes[j]]; // should we check the value for valid?
+ uint cargotype = local_id << 16 | use_input;
+ GetCargoSuffix(cargotype, cst, ind, ind_type, indspec, suffixes[j]);
+ } else {
+ suffixes[j].text[0] = '\0';
+ suffixes[j].display = CSD_CARGO;
+ }
+ }
+ } else {
+ /* Compatible behaviour with old 3-in-2-out scheme */
+ for (uint j = 0; j < lengthof(suffixes); j++) {
suffixes[j].text[0] = '\0';
+ suffixes[j].display = CSD_CARGO;
+ }
+ switch (use_input) {
+ case CARGOSUFFIX_OUT:
+ if (cargoes[0] != CT_INVALID) GetCargoSuffix(3, cst, ind, ind_type, indspec, suffixes[0]);
+ if (cargoes[1] != CT_INVALID) GetCargoSuffix(4, cst, ind, ind_type, indspec, suffixes[1]);
+ break;
+ case CARGOSUFFIX_IN:
+ if (cargoes[0] != CT_INVALID) GetCargoSuffix(0, cst, ind, ind_type, indspec, suffixes[0]);
+ if (cargoes[1] != CT_INVALID) GetCargoSuffix(1, cst, ind, ind_type, indspec, suffixes[1]);
+ if (cargoes[2] != CT_INVALID) GetCargoSuffix(2, cst, ind, ind_type, indspec, suffixes[2]);
+ break;
+ default:
+ NOT_REACHED();
}
}
}
@@ -358,8 +384,8 @@ public:
const IndustrySpec *indsp = GetIndustrySpec(this->index[i]);
- CargoSuffix cargo_suffix[3];
- GetAllCargoSuffixes(0, CST_FUND, NULL, this->index[i], indsp, indsp->accepts_cargo, cargo_suffix);
+ CargoSuffix cargo_suffix[lengthof(indsp->accepts_cargo)];
+ GetAllCargoSuffixes(CARGOSUFFIX_IN, CST_FUND, NULL, this->index[i], indsp, indsp->accepts_cargo, cargo_suffix);
StringID str = STR_INDUSTRY_VIEW_REQUIRES_CARGO;
byte p = 0;
SetDParam(0, STR_JUST_NOTHING);
@@ -373,7 +399,7 @@ public:
d = maxdim(d, GetStringBoundingBox(str));
/* Draw the produced cargoes, if any. Otherwise, will print "Nothing". */
- GetAllCargoSuffixes(3, CST_FUND, NULL, this->index[i], indsp, indsp->produced_cargo, cargo_suffix);
+ GetAllCargoSuffixes(CARGOSUFFIX_OUT, CST_FUND, NULL, this->index[i], indsp, indsp->produced_cargo, cargo_suffix);
str = STR_INDUSTRY_VIEW_PRODUCES_CARGO;
p = 0;
SetDParam(0, STR_JUST_NOTHING);
@@ -477,8 +503,8 @@ public:
}
/* Draw the accepted cargoes, if any. Otherwise, will print "Nothing". */
- CargoSuffix cargo_suffix[3];
- GetAllCargoSuffixes(0, CST_FUND, NULL, this->selected_type, indsp, indsp->accepts_cargo, cargo_suffix);
+ CargoSuffix cargo_suffix[lengthof(indsp->accepts_cargo)];
+ GetAllCargoSuffixes(CARGOSUFFIX_IN, CST_FUND, NULL, this->selected_type, indsp, indsp->accepts_cargo, cargo_suffix);
StringID str = STR_INDUSTRY_VIEW_REQUIRES_CARGO;
byte p = 0;
SetDParam(0, STR_JUST_NOTHING);
@@ -493,7 +519,7 @@ public:
y += FONT_HEIGHT_NORMAL;
/* Draw the produced cargoes, if any. Otherwise, will print "Nothing". */
- GetAllCargoSuffixes(3, CST_FUND, NULL, this->selected_type, indsp, indsp->produced_cargo, cargo_suffix);
+ GetAllCargoSuffixes(CARGOSUFFIX_OUT, CST_FUND, NULL, this->selected_type, indsp, indsp->produced_cargo, cargo_suffix);
str = STR_INDUSTRY_VIEW_PRODUCES_CARGO;
p = 0;
SetDParam(0, STR_JUST_NOTHING);
@@ -508,7 +534,6 @@ public:
y += FONT_HEIGHT_NORMAL;
/* Get the additional purchase info text, if it has not already been queried. */
- str = STR_NULL;
if (HasBit(indsp->callback_mask, CBM_IND_FUND_MORE_TEXT)) {
uint16 callback_res = GetIndustryCallback(CBID_INDUSTRY_FUND_MORE_TEXT, 0, 0, NULL, this->selected_type, INVALID_TILE);
if (callback_res != CALLBACK_FAILED && callback_res != 0x400) {
@@ -684,8 +709,15 @@ static void UpdateIndustryProduction(Industry *i);
static inline bool IsProductionAlterable(const Industry *i)
{
const IndustrySpec *is = GetIndustrySpec(i->type);
+ bool has_prod = false;
+ for (size_t j = 0; j < lengthof(is->production_rate); j++) {
+ if (is->production_rate[j] != 0) {
+ has_prod = true;
+ break;
+ }
+ }
return ((_game_mode == GM_EDITOR || _cheats.setup_prod.value) &&
- (is->production_rate[0] != 0 || is->production_rate[1] != 0 || is->IsRawIndustry()) &&
+ (has_prod || is->IsRawIndustry()) &&
!_networking);
}
@@ -764,8 +796,8 @@ public:
y += 2 * FONT_HEIGHT_NORMAL;
}
- CargoSuffix cargo_suffix[3];
- GetAllCargoSuffixes(0, CST_VIEW, i, i->type, ind, i->accepts_cargo, cargo_suffix);
+ CargoSuffix cargo_suffix[lengthof(i->accepts_cargo)];
+ GetAllCargoSuffixes(CARGOSUFFIX_IN, CST_VIEW, i, i->type, ind, i->accepts_cargo, cargo_suffix);
bool stockpiling = HasBit(ind->callback_mask, CBM_IND_PRODUCTION_CARGO_ARRIVAL) || HasBit(ind->callback_mask, CBM_IND_PRODUCTION_256_TICKS);
uint left_side = left + WD_FRAMERECT_LEFT * 4; // Indent accepted cargoes.
@@ -804,7 +836,7 @@ public:
y += FONT_HEIGHT_NORMAL;
}
- GetAllCargoSuffixes(3, CST_VIEW, i, i->type, ind, i->produced_cargo, cargo_suffix);
+ GetAllCargoSuffixes(CARGOSUFFIX_OUT, CST_VIEW, i, i->type, ind, i->produced_cargo, cargo_suffix);
first = true;
for (byte j = 0; j < lengthof(i->produced_cargo); j++) {
if (i->produced_cargo[j] == CT_INVALID) continue;
@@ -1256,7 +1288,7 @@ protected:
SetDParam(p++, i->index);
static CargoSuffix cargo_suffix[lengthof(i->produced_cargo)];
- GetAllCargoSuffixes(3, CST_DIR, i, i->type, indsp, i->produced_cargo, cargo_suffix);
+ GetAllCargoSuffixes(CARGOSUFFIX_OUT, CST_DIR, i, i->type, indsp, i->produced_cargo, cargo_suffix);
/* Industry productions */
for (byte j = 0; j < lengthof(i->produced_cargo); j++) {
@@ -1515,7 +1547,7 @@ enum CargoesFieldType {
CFT_HEADER, ///< Header text.
};
-static const uint MAX_CARGOES = 3; ///< Maximum number of cargoes carried in a #CFT_CARGO field in #CargoesField.
+static const uint MAX_CARGOES = 16; ///< Maximum number of cargoes carried in a #CFT_CARGO field in #CargoesField.
/** Data about a single field in the #IndustryCargoesWindow panel. */
struct CargoesField {
@@ -1523,7 +1555,6 @@ struct CargoesField {
static const int HOR_CARGO_BORDER_SPACE;
static const int CARGO_STUB_WIDTH;
static const int HOR_CARGO_WIDTH, HOR_CARGO_SPACE;
- static const int CARGO_FIELD_WIDTH;
static const int VERT_CARGO_SPACE, VERT_CARGO_EDGE;
static const int BLOB_DISTANCE, BLOB_WIDTH, BLOB_HEIGHT;
@@ -1531,7 +1562,9 @@ struct CargoesField {
static const int CARGO_LINE_COLOUR;
static int small_height, normal_height;
+ static int cargo_field_width;
static int industry_width;
+ static uint max_cargoes;
CargoesFieldType type; ///< Type of field.
union {
@@ -1580,7 +1613,7 @@ struct CargoesField {
/**
* Connect a cargo from an industry to the #CFT_CARGO column.
* @param cargo Cargo to connect.
- * @param produced Cargo is produced (if \c false, cargo is assumed to be accepted).
+ * @param producer Cargo is produced (if \c false, cargo is assumed to be accepted).
* @return Horizontal connection index, or \c -1 if not accepted at all.
*/
int ConnectCargo(CargoID cargo, bool producer)
@@ -1684,20 +1717,19 @@ struct CargoesField {
int GetCargoBase(int xpos) const
{
assert(this->type == CFT_CARGO);
+ int n = this->u.cargo.num_cargoes;
- switch (this->u.cargo.num_cargoes) {
- case 0: return xpos + CARGO_FIELD_WIDTH / 2;
- case 1: return xpos + CARGO_FIELD_WIDTH / 2 - HOR_CARGO_WIDTH / 2;
- case 2: return xpos + CARGO_FIELD_WIDTH / 2 - HOR_CARGO_WIDTH - HOR_CARGO_SPACE / 2;
- case 3: return xpos + CARGO_FIELD_WIDTH / 2 - HOR_CARGO_WIDTH - HOR_CARGO_SPACE - HOR_CARGO_WIDTH / 2;
- default: NOT_REACHED();
+ if (n % 2 == 0) {
+ return xpos + cargo_field_width / 2 - (HOR_CARGO_WIDTH + HOR_CARGO_SPACE / 2) * (n / 2);
+ } else {
+ return xpos + cargo_field_width / 2 - HOR_CARGO_WIDTH / 2 - (HOR_CARGO_WIDTH + HOR_CARGO_SPACE) * (n / 2);
}
}
/**
* Draw the field.
* @param xpos Position of the left edge.
- * @param vpos Position of the top edge.
+ * @param ypos Position of the top edge.
*/
void Draw(int xpos, int ypos) const
{
@@ -1749,7 +1781,7 @@ struct CargoesField {
other_left = this->u.industry.other_accepted;
}
ypos1 += VERT_CARGO_EDGE;
- for (uint i = 0; i < MAX_CARGOES; i++) {
+ for (uint i = 0; i < CargoesField::max_cargoes; i++) {
if (other_right[i] != INVALID_CARGO) {
const CargoSpec *csp = CargoSpec::Get(other_right[i]);
int xp = xpos + industry_width + CARGO_STUB_WIDTH;
@@ -1814,7 +1846,7 @@ struct CargoesField {
DrawHorConnection(lf + dx - 1, lf + HOR_CARGO_SPACE - 1, ypos, csp);
dx = 1;
}
- DrawHorConnection(cargo_base + col * HOR_CARGO_SPACE + (col + 1) * HOR_CARGO_WIDTH - 1 + dx, xpos + CARGO_FIELD_WIDTH - 1, ypos, csp);
+ DrawHorConnection(cargo_base + col * HOR_CARGO_SPACE + (col + 1) * HOR_CARGO_WIDTH - 1 + dx, xpos + CargoesField::cargo_field_width - 1, ypos, csp);
}
ypos += FONT_HEIGHT_NORMAL + VERT_CARGO_SPACE;
}
@@ -1936,9 +1968,11 @@ private:
assert_compile(MAX_CARGOES >= cpp_lengthof(IndustrySpec, produced_cargo));
assert_compile(MAX_CARGOES >= cpp_lengthof(IndustrySpec, accepts_cargo));
-int CargoesField::small_height; ///< Height of the header row.
-int CargoesField::normal_height; ///< Height of the non-header rows.
-int CargoesField::industry_width; ///< Width of an industry field.
+int CargoesField::small_height; ///< Height of the header row.
+int CargoesField::normal_height; ///< Height of the non-header rows.
+int CargoesField::industry_width; ///< Width of an industry field.
+int CargoesField::cargo_field_width; ///< Width of a cargo field.
+uint CargoesField::max_cargoes; ///< Largest number of cargoes actually on any industry.
const int CargoesField::VERT_INTER_INDUSTRY_SPACE = 6; ///< Amount of space between two industries in a column.
const int CargoesField::HOR_CARGO_BORDER_SPACE = 15; ///< Amount of space between the left/right edge of a #CFT_CARGO field, and the left/right most vertical cargo.
@@ -1952,9 +1986,6 @@ const int CargoesField::BLOB_DISTANCE = 5; ///< Distance of the industry legend
const int CargoesField::BLOB_WIDTH = 12; ///< Width of the industry legend colour, including border.
const int CargoesField::BLOB_HEIGHT = 9; ///< Height of the industry legend colour, including border
-/** Width of a #CFT_CARGO field. */
-const int CargoesField::CARGO_FIELD_WIDTH = HOR_CARGO_BORDER_SPACE * 2 + HOR_CARGO_WIDTH * MAX_CARGOES + HOR_CARGO_SPACE * (MAX_CARGOES - 1);
-
const int CargoesField::INDUSTRY_LINE_COLOUR = PC_YELLOW; ///< Line colour of the industry type box.
const int CargoesField::CARGO_LINE_COLOUR = PC_YELLOW; ///< Line colour around the cargo.
@@ -1979,13 +2010,14 @@ struct CargoesRow {
int other_count = 0;
const IndustrySpec *indsp = GetIndustrySpec(ind_fld->u.industry.ind_type);
- for (uint i = 0; i < lengthof(indsp->produced_cargo); i++) {
+ assert(CargoesField::max_cargoes <= lengthof(indsp->produced_cargo));
+ for (uint i = 0; i < CargoesField::max_cargoes; i++) {
int col = cargo_fld->ConnectCargo(indsp->produced_cargo[i], true);
if (col < 0) others[other_count++] = indsp->produced_cargo[i];
}
/* Allocate other cargoes in the empty holes of the horizontal cargo connections. */
- for (uint i = 0; i < MAX_CARGOES && other_count > 0; i++) {
+ for (uint i = 0; i < CargoesField::max_cargoes && other_count > 0; i++) {
if (cargo_fld->u.cargo.supp_cargoes[i] == INVALID_CARGO) ind_fld->u.industry.other_produced[i] = others[--other_count];
}
} else {
@@ -2036,13 +2068,14 @@ struct CargoesRow {
int other_count = 0;
const IndustrySpec *indsp = GetIndustrySpec(ind_fld->u.industry.ind_type);
- for (uint i = 0; i < lengthof(indsp->accepts_cargo); i++) {
+ assert(CargoesField::max_cargoes <= lengthof(indsp->accepts_cargo));
+ for (uint i = 0; i < CargoesField::max_cargoes; i++) {
int col = cargo_fld->ConnectCargo(indsp->accepts_cargo[i], false);
if (col < 0) others[other_count++] = indsp->accepts_cargo[i];
}
/* Allocate other cargoes in the empty holes of the horizontal cargo connections. */
- for (uint i = 0; i < MAX_CARGOES && other_count > 0; i++) {
+ for (uint i = 0; i < CargoesField::max_cargoes && other_count > 0; i++) {
if (cargo_fld->u.cargo.cust_cargoes[i] == INVALID_CARGO) ind_fld->u.industry.other_accepted[i] = others[--other_count];
}
} else {
@@ -2125,10 +2158,13 @@ struct IndustryCargoesWindow : public Window {
/* Decide about the size of the box holding the text of an industry type. */
this->ind_textsize.width = 0;
this->ind_textsize.height = 0;
+ CargoesField::max_cargoes = 0;
for (IndustryType it = 0; it < NUM_INDUSTRYTYPES; it++) {
const IndustrySpec *indsp = GetIndustrySpec(it);
if (!indsp->enabled) continue;
this->ind_textsize = maxdim(this->ind_textsize, GetStringBoundingBox(indsp->name));
+ CargoesField::max_cargoes = max(CargoesField::max_cargoes, std::count_if(indsp->accepts_cargo, endof(indsp->accepts_cargo), IsCargoIDValid));
+ CargoesField::max_cargoes = max(CargoesField::max_cargoes, std::count_if(indsp->produced_cargo, endof(indsp->produced_cargo), IsCargoIDValid));
}
d.width = max(d.width, this->ind_textsize.width);
d.height = this->ind_textsize.height;
@@ -2147,18 +2183,21 @@ struct IndustryCargoesWindow : public Window {
d.width += 2 * HOR_TEXT_PADDING;
/* Ensure the height is enough for the industry type text, for the horizontal connections, and for the cargo labels. */
- uint min_ind_height = CargoesField::VERT_CARGO_EDGE * 2 + MAX_CARGOES * FONT_HEIGHT_NORMAL + (MAX_CARGOES - 1) * CargoesField::VERT_CARGO_SPACE;
+ uint min_ind_height = CargoesField::VERT_CARGO_EDGE * 2 + CargoesField::max_cargoes * FONT_HEIGHT_NORMAL + (CargoesField::max_cargoes - 1) * CargoesField::VERT_CARGO_SPACE;
d.height = max(d.height + 2 * VERT_TEXT_PADDING, min_ind_height);
CargoesField::industry_width = d.width;
CargoesField::normal_height = d.height + CargoesField::VERT_INTER_INDUSTRY_SPACE;
+
+ /* Width of a #CFT_CARGO field. */
+ CargoesField::cargo_field_width = CargoesField::HOR_CARGO_BORDER_SPACE * 2 + CargoesField::HOR_CARGO_WIDTH * CargoesField::max_cargoes + CargoesField::HOR_CARGO_SPACE * (CargoesField::max_cargoes - 1);
}
virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
{
switch (widget) {
case WID_IC_PANEL:
- size->width = WD_FRAMETEXT_LEFT + CargoesField::industry_width * 3 + CargoesField::CARGO_FIELD_WIDTH * 2 + WD_FRAMETEXT_RIGHT;
+ size->width = WD_FRAMETEXT_LEFT + CargoesField::industry_width * 3 + CargoesField::cargo_field_width * 2 + WD_FRAMETEXT_RIGHT;
break;
case WID_IC_IND_DROPDOWN:
@@ -2519,7 +2558,7 @@ struct IndustryCargoesWindow : public Window {
_cur_dpi = &tmp_dpi;
int left_pos = WD_FRAMERECT_LEFT;
- if (this->ind_cargo >= NUM_INDUSTRYTYPES) left_pos += (CargoesField::industry_width + CargoesField::CARGO_FIELD_WIDTH) / 2;
+ if (this->ind_cargo >= NUM_INDUSTRYTYPES) left_pos += (CargoesField::industry_width + CargoesField::cargo_field_width) / 2;
int last_column = (this->ind_cargo < NUM_INDUSTRYTYPES) ? 4 : 2;
const NWidgetBase *nwp = this->GetWidget(WID_IC_PANEL);
@@ -2538,7 +2577,7 @@ struct IndustryCargoesWindow : public Window {
}
while (col >= 0 && col <= last_column) {
this->fields[i].columns[col].Draw(xpos, vpos);
- xpos += (col & 1) ? CargoesField::CARGO_FIELD_WIDTH : CargoesField::industry_width;
+ xpos += (col & 1) ? CargoesField::cargo_field_width : CargoesField::industry_width;
col += dir;
}
}
@@ -2570,11 +2609,11 @@ struct IndustryCargoesWindow : public Window {
vpos = pt.y - vpos - row * CargoesField::normal_height; // Position in the row + 1 field
row++; // rebase row to match index of this->fields.
- int xpos = 2 * WD_FRAMERECT_LEFT + ((this->ind_cargo < NUM_INDUSTRYTYPES) ? 0 : (CargoesField::industry_width + CargoesField::CARGO_FIELD_WIDTH) / 2);
+ int xpos = 2 * WD_FRAMERECT_LEFT + ((this->ind_cargo < NUM_INDUSTRYTYPES) ? 0 : (CargoesField::industry_width + CargoesField::cargo_field_width) / 2);
if (pt.x < xpos) return false;
int column;
for (column = 0; column <= 5; column++) {
- int width = (column & 1) ? CargoesField::CARGO_FIELD_WIDTH : CargoesField::industry_width;
+ int width = (column & 1) ? CargoesField::cargo_field_width : CargoesField::industry_width;
if (pt.x < xpos + width) break;
xpos += width;
}
@@ -2587,7 +2626,7 @@ struct IndustryCargoesWindow : public Window {
xy->y = vpos;
if (_current_text_dir == TD_RTL) {
fieldxy->x = num_columns - column;
- xy->x = ((column & 1) ? CargoesField::CARGO_FIELD_WIDTH : CargoesField::industry_width) - xpos;
+ xy->x = ((column & 1) ? CargoesField::cargo_field_width : CargoesField::industry_width) - xpos;
} else {
fieldxy->x = column;
xy->x = xpos;
diff --git a/src/industry_type.h b/src/industry_type.h
index 6234f7b114..9a8a469017 100644
--- a/src/industry_type.h
+++ b/src/industry_type.h
@@ -37,6 +37,10 @@ static const IndustryGfx INVALID_INDUSTRYTILE = NUM_INDUSTRYTILES; ///< one a
static const int INDUSTRY_COMPLETED = 3; ///< final stage of industry construction.
+static const int INDUSTRY_NUM_INPUTS = 16; ///< Number of cargo types an industry can accept
+static const int INDUSTRY_NUM_OUTPUTS = 16; ///< Number of cargo types an industry can produce
+
+
void CheckIndustries();
#endif /* INDUSTRY_TYPE_H */
diff --git a/src/industrytype.h b/src/industrytype.h
index 03b6c79736..cd451fa777 100644
--- a/src/industrytype.h
+++ b/src/industrytype.h
@@ -80,6 +80,7 @@ enum IndustryBehaviour {
INDUSTRYBEH_PRODCALLBACK_RANDOM = 1 << 15, ///< Production callback needs random bits in var 10
INDUSTRYBEH_NOBUILT_MAPCREATION = 1 << 16, ///< Do not force one instance of this type to appear on map generation
INDUSTRYBEH_CANCLOSE_LASTINSTANCE = 1 << 17, ///< Allow closing down the last instance of this type
+ INDUSTRYBEH_CARGOTYPES_UNLIMITED = 1 << 18, ///< Allow produced/accepted cargoes callbacks to supply more than 2 and 3 types
};
DECLARE_ENUM_AS_BIT_SET(IndustryBehaviour)
@@ -87,6 +88,7 @@ DECLARE_ENUM_AS_BIT_SET(IndustryBehaviour)
enum IndustryTileSpecialFlags {
INDTILE_SPECIAL_NONE = 0,
INDTILE_SPECIAL_NEXTFRAME_RANDOMBITS = 1 << 0, ///< Callback 0x26 needs random bits
+ INDTILE_SPECIAL_ACCEPTS_ALL_CARGO = 1 << 1, ///< Tile always accepts all cargoes the associated industry accepts
};
DECLARE_ENUM_AS_BIT_SET(IndustryTileSpecialFlags)
@@ -99,41 +101,41 @@ struct IndustryTileTable {
* Defines the data structure for constructing industry.
*/
struct IndustrySpec {
- const IndustryTileTable * const *table;///< List of the tiles composing the industry
- byte num_table; ///< Number of elements in the table
- uint8 cost_multiplier; ///< Base construction cost multiplier.
- uint32 removal_cost_multiplier; ///< Base removal cost multiplier.
- uint32 prospecting_chance; ///< Chance prospecting succeeds
- 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[2];
- byte production_rate[2];
+ const IndustryTileTable * const *table; ///< List of the tiles composing the industry
+ byte num_table; ///< Number of elements in the table
+ uint8 cost_multiplier; ///< Base construction cost multiplier.
+ uint32 removal_cost_multiplier; ///< Base removal cost multiplier.
+ uint32 prospecting_chance; ///< Chance prospecting succeeds
+ 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];
+ byte production_rate[INDUSTRY_NUM_OUTPUTS];
/**
* minimum amount of cargo transported to the stations.
* If the waiting cargo is less than this number, no cargo is moved to it.
*/
byte minimal_cargo;
- CargoID accepts_cargo[3]; ///< 3 accepted cargoes.
- uint16 input_cargo_multiplier[3][2]; ///< 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
- IndustryBehaviour behaviour; ///< How this industry will behave, and how others entities can use it
- byte map_colour; ///< colour used for the small map
- StringID name; ///< Displayed name of the industry
- StringID new_industry_text; ///< Message appearing when the industry is built
- StringID closure_text; ///< Message appearing when the industry closes
- StringID production_up_text; ///< Message appearing when the industry's production is increasing
- StringID production_down_text; ///< Message appearing when the industry's production is decreasing
- StringID station_name; ///< Default name for nearby station
- byte appear_ingame[NUM_LANDSCAPE]; ///< Probability of appearance in game
- byte appear_creation[NUM_LANDSCAPE]; ///< Probability of appearance during map creation
- uint8 number_of_sounds; ///< Number of sounds available in the sounds array
- const uint8 *random_sounds; ///< array of random sounds.
+ CargoID accepts_cargo[INDUSTRY_NUM_INPUTS]; ///< 16 accepted cargoes.
+ uint16 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
+ IndustryBehaviour behaviour; ///< How this industry will behave, and how others entities can use it
+ byte map_colour; ///< colour used for the small map
+ StringID name; ///< Displayed name of the industry
+ StringID new_industry_text; ///< Message appearing when the industry is built
+ StringID closure_text; ///< Message appearing when the industry closes
+ StringID production_up_text; ///< Message appearing when the industry's production is increasing
+ StringID production_down_text; ///< Message appearing when the industry's production is decreasing
+ StringID station_name; ///< Default name for nearby station
+ byte appear_ingame[NUM_LANDSCAPE]; ///< Probability of appearance in game
+ byte appear_creation[NUM_LANDSCAPE]; ///< Probability of appearance during map creation
+ uint8 number_of_sounds; ///< Number of sounds available in the sounds array
+ const uint8 *random_sounds; ///< array of random sounds.
/* Newgrf data */
- uint16 callback_mask; ///< Bitmask of industry callbacks that have to be called
- uint8 cleanup_flag; ///< flags indicating which data should be freed upon cleaning up
- bool enabled; ///< entity still available (by default true).newgrf can disable it, though
- GRFFileProps grf_prop; ///< properties related to the grf file
+ uint16 callback_mask; ///< Bitmask of industry callbacks that have to be called
+ uint8 cleanup_flag; ///< flags indicating which data should be freed upon cleaning up
+ bool enabled; ///< entity still available (by default true).newgrf can disable it, though
+ GRFFileProps grf_prop; ///< properties related to the grf file
bool IsRawIndustry() const;
bool IsProcessingIndustry() const;
@@ -144,10 +146,11 @@ struct IndustrySpec {
/**
* Defines the data structure of each individual tile of an industry.
+ * @note A tile can at most accept 3 types of cargo, even if an industry as a whole can accept more types.
*/
struct IndustryTileSpec {
- CargoID accepts_cargo[3]; ///< Cargo accepted by this tile
- uint8 acceptance[3]; ///< Level of acceptance per cargo type
+ CargoID accepts_cargo[INDUSTRY_NUM_INPUTS]; ///< Cargo accepted by this tile
+ int8 acceptance[INDUSTRY_NUM_INPUTS]; ///< 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
byte anim_next; ///< Next frame in an animation
diff --git a/src/ini.cpp b/src/ini.cpp
index 905ebfacf8..6767d8525d 100644
--- a/src/ini.cpp
+++ b/src/ini.cpp
@@ -19,7 +19,7 @@
# include
#endif
-#ifdef WIN32
+#ifdef _WIN32
# include
# include
# include "core/mem_func.hpp"
@@ -87,7 +87,7 @@ bool IniFile::SaveToDisk(const char *filename)
fclose(f);
#endif
-#if defined(WIN32) || defined(WIN64)
+#if defined(_WIN32)
/* _tcsncpy = strcpy is TCHAR is char, but isn't when TCHAR is wchar. */
#undef strncpy
/* Allocate space for one more \0 character. */
diff --git a/src/ini_type.h b/src/ini_type.h
index ce383b959c..9bd47fd4e5 100644
--- a/src/ini_type.h
+++ b/src/ini_type.h
@@ -70,7 +70,7 @@ struct IniLoadFile {
* Open the INI file.
* @param filename Name of the INI file.
* @param subdir The subdir to load the file from.
- * @param size [out] Size of the opened file.
+ * @param[out] size Size of the opened file.
* @return File handle of the opened file, or \c NULL.
*/
virtual FILE *OpenFile(const char *filename, Subdirectory subdir, size_t *size) = 0;
diff --git a/src/landscape.cpp b/src/landscape.cpp
index a29c97b9d7..18f27807d7 100644
--- a/src/landscape.cpp
+++ b/src/landscape.cpp
@@ -32,6 +32,7 @@
#include "company_func.h"
#include "pathfinder/npf/aystar.h"
#include "saveload/saveload.h"
+#include "framerate_type.h"
#include
#include
@@ -720,6 +721,8 @@ TileIndex _cur_tileloop_tile;
*/
void RunTileLoop()
{
+ PerformanceAccumulator framerate(PFE_GL_LANDSCAPE);
+
/* The pseudorandom sequence of tiles is generated using a Galois linear feedback
* shift register (LFSR). This allows a deterministic pseudorandom ordering, but
* still with minimal state and fast iteration. */
@@ -1303,10 +1306,14 @@ void OnTick_LinkGraph();
void CallLandscapeTick()
{
- OnTick_Town();
- OnTick_Trees();
- OnTick_Station();
- OnTick_Industry();
+ {
+ PerformanceAccumulator framerate(PFE_GL_LANDSCAPE);
+
+ OnTick_Town();
+ OnTick_Trees();
+ OnTick_Station();
+ OnTick_Industry();
+ }
OnTick_Companies();
OnTick_LinkGraph();
diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt
index bd83955062..d1e96d41d7 100644
--- a/src/lang/afrikaans.txt
+++ b/src/lang/afrikaans.txt
@@ -2683,6 +2683,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Oorspron
STR_ABOUT_VERSION :{BLACK}OpenTTD uitgawe {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 Die OpenTTD span
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Spaar Spel
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Laai Spel
@@ -4197,7 +4204,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Te veel
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Te veel treinstasie deele
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Te veel bushalte
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Te veel vragmotor stasies
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Te naby aan 'n ander stasie/laai area
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Te naby aan 'n ander werf
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Te naby aan 'n ander lughawe
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Stasie kan nie hernoem word nie...
diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt
index d8bca0dbae..8c4c06b55b 100644
--- a/src/lang/arabic_egypt.txt
+++ b/src/lang/arabic_egypt.txt
@@ -2317,6 +2317,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}الحق
STR_ABOUT_VERSION :{BLACK}النسخة المفتوحة رقم {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}النسخة المفتوحة {COPYRIGHT}2002-2018 فريق النسخة المفتوحة
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}حفظ اللعبة
STR_SAVELOAD_LOAD_CAPTION :{WHITE}فتح
@@ -3660,7 +3667,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}يوجد
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}يوجد الكثير من قطاعات محطه السكه الحديديه
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}يوجد الكثير من محطات الحافلات
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}يوجد الكثير من محطات الشاحنات
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}قريب للغايه من محطه اخرى
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}قريب للغايه من مَرسَى اخر
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}قريب للغايه من مطار اخر
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}تعذر إعاده تسميه المحطه...
diff --git a/src/lang/basque.txt b/src/lang/basque.txt
index ddb3afb60d..d5511050b1 100644
--- a/src/lang/basque.txt
+++ b/src/lang/basque.txt
@@ -869,7 +869,7 @@ STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLAC
STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Leihoa {COMMA}
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Leihora kopiatu
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK} Leiho nagusian ikusten dena leiho honetara kopiatu
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Leihotik kpiatutakoa itsatsi
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Aldatu ikuspen nagusia
STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Leiho honetan ikusten dena leiho nagusian itsasi
# Game options window
@@ -2587,6 +2587,15 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original
STR_ABOUT_VERSION :{BLACK}OpenTTD bertsioa {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 The OpenTTD team
+# Framerate display window
+############ Leave those lines in this order!!
+STR_FRAMERATE_GL_TRAINS :{WHITE} Trenen tick-ak:
+STR_FRAMERATE_GL_SHIPS :{WHITE} Itsasontzien tick-ak:
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Gordetako jokoa
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Jokoa kargatu
@@ -3002,6 +3011,7 @@ STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}
STR_STATION_VIEW_GROUP :{BLACK}Taldekatu
STR_STATION_VIEW_WAITING_STATION :Geltokia: Itxaroten
STR_STATION_VIEW_WAITING_AMOUNT :Kopurua: Itxoiten
+STR_STATION_VIEW_PLANNED_STATION :Geltokia: Antolatua
STR_STATION_VIEW_FROM :{YELLOW}{CARGO_SHORT} {STATION}-tik
STR_STATION_VIEW_VIA :{YELLOW}{CARGO_SHORT}{STATION}-tik
STR_STATION_VIEW_TO :{YELLOW}{CARGO_SHORT}{STATION}-ra
@@ -4066,7 +4076,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Geltoki
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Tren geltoki zati gehiegi
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Autobus geltoki gehiegi
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Kamioi geltoki gehiegi
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Geltoki batetik hurbilegi
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Kai batetik hurbilegi
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Aireportu batetik hurbilegi
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Ezinda geltokia berrizendatu...
diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt
index e56d431f6f..819bce4a2b 100644
--- a/src/lang/belarusian.txt
+++ b/src/lang/belarusian.txt
@@ -1196,7 +1196,7 @@ STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLAC
STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Вакно прагляду {COMMA}
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Капіяваць у вакно прагляду
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Скапіяваць бягучую пазыцыю ў вакно прагляду
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Уставіць з вакна прагляду
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}У асноўнае акно
STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Перайсьці да гэтага месца ў асноўным вакне
# Game options window
@@ -2617,6 +2617,7 @@ STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Схем
STR_LINKGRAPH_LEGEND_ALL :{BLACK}Усе
STR_LINKGRAPH_LEGEND_NONE :{BLACK}Няма
STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Выберыце кампаніі для адлюстраваньня
+STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY}
# Linkgraph legend window and linkgraph legend in smallmap
STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}нявыкарыст.
@@ -3029,6 +3030,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Арыґ
STR_ABOUT_VERSION :{BLACK}OpenTTD вэрсія {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002–2018 Каманда распрацоўнікаў OpenTTD
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Захаваць гульню
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Загрузіць гульню
@@ -3313,6 +3321,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Увяд
STR_TOWN_DIRECTORY_CAPTION :{WHITE}Гарады
STR_TOWN_DIRECTORY_NONE :{ORANGE}- Няма -
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA})
+STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Мегаполіс){BLACK} ({COMMA})
STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Сьпіс гарадоў: клiк па назьве паказвае горад у асноўным вакне. Ctrl+клiк паказвае ў дадатковым вакне.
STR_TOWN_POPULATION :{BLACK}Насельніцтва: {COMMA}
@@ -3320,6 +3329,7 @@ STR_TOWN_POPULATION :{BLACK}Насе
STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN}
STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Мэґаполіс)
STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Насельніцтва: {ORANGE}{COMMA}{BLACK} Будынкаў: {ORANGE}{COMMA}
+STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} у мінулым месяцы: {ORANGE}{COMMA}{BLACK} Макс.: {ORANGE}{COMMA}
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Груз, неабходны для росту горада:
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} патрабу{G 0 е e e ю}цца
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} патрабу{G 0 е e e ю}цца ўзімку
@@ -4578,7 +4588,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Зана
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Занадта вялікая чыгуначная станцыя
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Занадта шмат аўтобусных прыпынкаў
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Занадта шмат грузавых тэрмiналаў
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Занадта блізка да іншай станцыі
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Занадта блізка да іншай прыстані
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Занадта блізка да іншага аэрапорта
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Немагчыма перайменаваць станцыю...
@@ -4586,6 +4595,7 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... гэ
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... няправільны кірунак дарогі
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... на прахадных прыпынках нельга рабіць павароты
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... на прахадных прыпынках нельга рабіць скрыжаваньнi
+STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... дарога аднабаковая ці заблакавана
# Station destruction related errors
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Немагчыма выдаліць частку станцыi...
@@ -4837,6 +4847,8 @@ STR_BASESOUNDS_DOS_DESCRIPTION :Арыґіна
STR_BASESOUNDS_WIN_DESCRIPTION :Арыґінальны набор гукавога афармленьня з гульні Transport Tycoon Deluxe для Windows.
STR_BASESOUNDS_NONE_DESCRIPTION :"Пусты" набор гукавога афармленьня, які не зьмяшчае ніякіх гукаў.
STR_BASEMUSIC_WIN_DESCRIPTION :Арыґінальны набор музычнага афармленьня з гульні Transport Tycoon Deluxe для Windows.
+STR_BASEMUSIC_DOS_DESCRIPTION :Набор музычнага афармленьня з гульні Transport Tycoon Deluxe для DOS.
+STR_BASEMUSIC_TTO_DESCRIPTION :Набор музычнага афармлення з гульні Transport Tycoon (Original/World Editor) для DOS.
STR_BASEMUSIC_NONE_DESCRIPTION :"Пусты" набор музычнага афармлення, які не зьмяшчае ніякай музыкі.
##id 0x2000
diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt
index fe033b740c..5c943e651e 100644
--- a/src/lang/brazilian_portuguese.txt
+++ b/src/lang/brazilian_portuguese.txt
@@ -33,7 +33,7 @@ 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=f}Bens
+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
@@ -147,7 +147,7 @@ STR_ABBREV_MAIZE :{TINY_FONT}MI
STR_ABBREV_FRUIT :{TINY_FONT}FT
STR_ABBREV_DIAMONDS :{TINY_FONT}DM
STR_ABBREV_FOOD :{TINY_FONT}AL
-STR_ABBREV_PAPER :{TINY_FONT}PL
+STR_ABBREV_PAPER :{TINY_FONT}PP
STR_ABBREV_GOLD :{TINY_FONT}OU
STR_ABBREV_WATER :{TINY_FONT}AG
STR_ABBREV_WHEAT :{TINY_FONT}TG
@@ -220,7 +220,7 @@ STR_UNITS_FORCE_IMPERIAL :{COMMA}{NBSP}lb
STR_UNITS_FORCE_METRIC :{COMMA}{NBSP}kgf
STR_UNITS_FORCE_SI :{COMMA}{NBSP}kN
-STR_UNITS_HEIGHT_IMPERIAL :{COMMA}{NBSP}pés
+STR_UNITS_HEIGHT_IMPERIAL :{COMMA}{NBSP}pé{P "" s}
STR_UNITS_HEIGHT_METRIC :{COMMA}{NBSP}m
STR_UNITS_HEIGHT_SI :{COMMA}{NBSP}m
@@ -476,6 +476,7 @@ STR_ABOUT_MENU_SCREENSHOT :Captura de tela
STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Ampliado em captura de tela
STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Captura de tela em ampliação padrão
STR_ABOUT_MENU_GIANT_SCREENSHOT :Captura de tela do mapa inteiro
+STR_ABOUT_MENU_SHOW_FRAMERATE :Exibir 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 limítrofes
@@ -651,6 +652,7 @@ STR_MUSIC_RULER_MARKER :{TINY_FONT}{BLA
STR_MUSIC_TRACK_NONE :{TINY_FONT}{DKGREEN}--
STR_MUSIC_TRACK_DIGIT :{TINY_FONT}{DKGREEN}{ZEROFILL_NUM}
STR_MUSIC_TITLE_NONE :{TINY_FONT}{DKGREEN}------
+STR_MUSIC_TITLE_NOMUSIC :{TINY_FONT}{DKGREEN}Nenhuma música disponível
STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}"
STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Faixa
STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Título
@@ -671,11 +673,14 @@ STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Alternar
STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Exibir janela de seleção de faixas de música
# Playlist window
+STR_PLAYLIST_MUSIC_SELECTION_SETNAME :{WHITE}Programação Musical - '{STRING}'
STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} '{STRING}'
STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Índice de faixas
STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Programa - '{STRING}'
STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Limpar
+STR_PLAYLIST_CHANGE_SET :{BLACK}Alterar set
STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Limpar programa atual (apenas Personalizado 1 ou Personalizado 2)
+STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Altera a seleção de músicas para outro set instalado
STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Clique na faixa de música para a adicionar ao programa atual (apenas Personalizado 1 ou Personalizado 2)
STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Clique na faixa de música para remover do programa atual (apenas Personalizado 1 ou Personalizado 2)
@@ -811,6 +816,7 @@ STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLAC
STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDENT_NAME}{}(Gerente)
STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}{STRING} patrocinou a construção da nova cidade {TOWN}!
+STR_NEWS_NEW_TOWN_UNSPONSORED :{BLACK}{BIG_FONT}Uma nova cidade, {TOWN}, foi construída!
STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLACK}Nov{G o a} {STRING} em construção próximo a {TOWN}!
STR_NEWS_INDUSTRY_PLANTED :{BIG_FONT}{BLACK}Nov{G o a} {STRING} sendo plantada próximo a {TOWN}!
@@ -878,10 +884,10 @@ STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLAC
# Extra view window
STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Janela {COMMA}
-STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Copiar para janela
+STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Alterar visualização
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Copiar o local da tela principal para esta janela
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Colar da janela
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Colar a localização desta janela para a tela principal
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Colar da visualização principal
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Colar a localização desta janela para a visualização principal
# Game options window
STR_GAME_OPTIONS_CAPTION :{WHITE}Opções do Jogo
@@ -923,6 +929,7 @@ STR_GAME_OPTIONS_CURRENCY_ZAR :Rand Sul-Africa
STR_GAME_OPTIONS_CURRENCY_CUSTOM :Personalizado...
STR_GAME_OPTIONS_CURRENCY_GEL :Lari da Georgia
STR_GAME_OPTIONS_CURRENCY_IRR :Rial Iraniano
+STR_GAME_OPTIONS_CURRENCY_RUB :Novo Rublo Russo (RUB)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Automóveis
@@ -1335,8 +1342,14 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Cor do terreno
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Verde
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Verde escuro
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violeta
+STR_CONFIG_SETTING_SCROLLMODE :Comportamento de rolamento da janela: {STRING}
+STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Comportamento ao rolar o mapa
+STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Mover vista com BDM, posição do mouse travada
+STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Mover mapa com BDM, posição do mouse travada
+STR_CONFIG_SETTING_SCROLLMODE_RMB :Mover mapa com BDM
+STR_CONFIG_SETTING_SCROLLMODE_LMB :Move o mapa com BEM
STR_CONFIG_SETTING_SMOOTH_SCROLLING :Suavizar rolamento da janela: {STRING}
-STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Controla como a janela principal rola para uma posição específica quando clicado no minimapa ou após localizar um objeto. Ativado torna o rolamento suave. Desativado torna o rolamento instanâneo
+STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Controla como a janela principal rola para uma posição específica quando clicado no minimapa ou após localizar um objeto. Ativado torna o rolamento suave. Desativado torna o rolamento instantâneo
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}
@@ -2279,6 +2292,7 @@ STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Legenda
STR_LINKGRAPH_LEGEND_ALL :{BLACK}Todas
STR_LINKGRAPH_LEGEND_NONE :{BLACK}Nenhuma
STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Selecione companhias a serem exibidas
+STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY}
# Linkgraph legend window and linkgraph legend in smallmap
STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}não utilizado
@@ -2687,6 +2701,52 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyrigh
STR_ABOUT_VERSION :{BLACK}OpenTTD versão {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 A equipe do OpenTTD
+# Framerate display window
+STR_FRAMERATE_CAPTION :{WHITE}Taxa de quadros
+STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} ({DECIMAL}x)
+STR_FRAMERATE_RATE_GAMELOOP :{WHITE}Taxa de simulação: {STRING}
+STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP :{BLACK}Número de tiques simulados por segundo
+STR_FRAMERATE_RATE_BLITTER :{WHITE}Taxa de quadros: {STRING}
+STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}Número de quadros renderizados por segundo.
+STR_FRAMERATE_SPEED_FACTOR :{WHITE}Fator de velocidade do jogo atual: {DECIMAL}x
+STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Quão rápido o jogo está sendo executado, comparado com a velocidade esperada na simulação normal
+STR_FRAMERATE_CURRENT :{WHITE}Atual
+STR_FRAMERATE_AVERAGE :{WHITE}Médio
+STR_FRAMERATE_DATA_POINTS :{WHITE}Dados baseados em {COMMA} medidas
+STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL}{WHITE} ms
+STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL}{WHITE} ms
+STR_FRAMERATE_MS_BAD :{RED}{DECIMAL}{WHITE} ms
+STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL}{WHITE} quadros/s
+STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL}{WHITE} quadros/s
+STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL}{WHITE} quadros/s
+STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA} ms
+STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} s
+############ Leave those lines in this order!!
+STR_FRAMERATE_GL_ECONOMY :{WHITE} Manuseio de carga:
+STR_FRAMERATE_GL_TRAINS :{WHITE} Tiques de trem:
+STR_FRAMERATE_GL_ROADVEHS :{WHITE} Tiques de automóveis:
+STR_FRAMERATE_GL_SHIPS :{WHITE} Tiques de embarcação:
+STR_FRAMERATE_GL_AIRCRAFT :{WHITE} Tiques de aeronave:
+STR_FRAMERATE_GL_LANDSCAPE :{WHITE} Tiques do mundo:
+STR_FRAMERATE_DRAWING :{WHITE}Renderizações de gráficos:
+STR_FRAMERATE_DRAWING_VIEWPORTS :{WHITE} Visualizações do mundo:
+STR_FRAMERATE_VIDEO :{WHITE}Saída de vídeo:
+STR_FRAMERATE_SOUND :{WHITE}Mixagem de áudio:
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+STR_FRAMETIME_CAPTION_GL_ECONOMY :Manuseio de carga
+STR_FRAMETIME_CAPTION_GL_TRAINS :Tiques de trem
+STR_FRAMETIME_CAPTION_GL_ROADVEHS :Tiques de automóveis
+STR_FRAMETIME_CAPTION_GL_SHIPS :Tiques de embarcação
+STR_FRAMETIME_CAPTION_GL_AIRCRAFT :Tiques de aeronave:
+STR_FRAMETIME_CAPTION_GL_LANDSCAPE :Tiques do mundo
+STR_FRAMETIME_CAPTION_DRAWING :Renderizações de gráficos
+STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Renderização da janela principal
+STR_FRAMETIME_CAPTION_VIDEO :Saída de vídeo
+STR_FRAMETIME_CAPTION_SOUND :Mixagem de áudio
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Salvar Jogo
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Abrir Jogo
@@ -2971,6 +3031,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Coloque
STR_TOWN_DIRECTORY_CAPTION :{WHITE}Cidades
STR_TOWN_DIRECTORY_NONE :{ORANGE}- Nenhum -
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA})
+STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Cidade){BLACK} ({COMMA})
STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Nomes das cidades - clique no nome para centralizar a visualização principal na cidade. Ctrl+Clique abre uma nova janela na localização da cidade
STR_TOWN_POPULATION :{BLACK}População mundial: {COMMA}
@@ -2978,6 +3039,7 @@ 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_FOR_TOWNGROWTH :{BLACK}Carga necessária para prover o crescimento:
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
@@ -4216,7 +4278,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Estaçõ
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}A estação já tem muitas partes
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Estações de ônibus demais
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Áreas de carga demais
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Muito perto de outra estação/local de carga
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Muito perto de outra doca
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Muito perto de outro aeroporto
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Impossível renomear a estação...
@@ -4224,6 +4285,7 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... é u
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... rua na direção errada
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... paradas "drive-thru" não podem ter esquinas
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... paradas "drive-thru" não podem ter junções
+STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... rua é mão única ou está bloqueada
# Station destruction related errors
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Impossível remover parte da estação...
@@ -4292,7 +4354,7 @@ STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION :{WHITE}Impossí
STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Remova os semáforos antes
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Tipo de linha não apropriado
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Remova a ferrovia antes
-STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Rua é mão única ou está bloqueado
+STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Rua é mão única ou está bloqueada
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Cruzamentos de nível não são permitidos para esse tipo de trilho
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Impossível construir sinais aqui...
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Impossível construir ferrovia aqui...
@@ -4475,6 +4537,8 @@ STR_BASESOUNDS_DOS_DESCRIPTION :Sons Originais
STR_BASESOUNDS_WIN_DESCRIPTION :Sons Originais do Transport Tycoon Deluxe, Edição Windows.
STR_BASESOUNDS_NONE_DESCRIPTION :Um pacote de sons sem sons.
STR_BASEMUSIC_WIN_DESCRIPTION :Música Original do Transport Tycoon Deluxe, Edição Windows
+STR_BASEMUSIC_DOS_DESCRIPTION :Música Original do Transport Tycoon Deluxe DOS.
+STR_BASEMUSIC_TTO_DESCRIPTION :Música Original do Transport Tycoon DOS
STR_BASEMUSIC_NONE_DESCRIPTION :Um pacote de músicas sem músicas.
##id 0x2000
diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt
index e06bf04da8..d085371987 100644
--- a/src/lang/bulgarian.txt
+++ b/src/lang/bulgarian.txt
@@ -2628,6 +2628,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Авто
STR_ABOUT_VERSION :{BLACK}OpenTTD версия {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 The OpenTTD team
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Запази играта
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Отваряне на игра
@@ -4126,7 +4133,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Твър
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Твърде много части на гара
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Твърде много автобусни спирки
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Твърде много гари за камиони
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Твърде близо до друга гара/товарна платформа
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Прекалено близо до друг док
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Прекалено близо до друго летище
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Станцията не може да бъде преименувана...
diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt
index c9aba3b216..cc641141af 100644
--- a/src/lang/catalan.txt
+++ b/src/lang/catalan.txt
@@ -476,6 +476,7 @@ STR_ABOUT_MENU_SCREENSHOT :Captura de pant
STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Captura de pantalla amb el zoom màxim
STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Captura de pantalla amb el zoom predeterminat
STR_ABOUT_MENU_GIANT_SCREENSHOT :Captura de pantalla de tot el mapa
+STR_ABOUT_MENU_SHOW_FRAMERATE :Mostra els fotogrames per segon
STR_ABOUT_MENU_ABOUT_OPENTTD :Quant a l'OpenTTD
STR_ABOUT_MENU_SPRITE_ALIGNER :Alineador de sprites
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Commuta les caixes delimitadores
@@ -651,6 +652,7 @@ STR_MUSIC_RULER_MARKER :{TINY_FONT}{BLA
STR_MUSIC_TRACK_NONE :{TINY_FONT}{DKGREEN}--
STR_MUSIC_TRACK_DIGIT :{TINY_FONT}{DKGREEN}{ZEROFILL_NUM}
STR_MUSIC_TITLE_NONE :{TINY_FONT}{DKGREEN}------
+STR_MUSIC_TITLE_NOMUSIC :{TINY_FONT}{DKGREEN}No hi ha peces musicals disponibles
STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}«{STRING}»
STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Pista
STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Títol
@@ -671,11 +673,14 @@ STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Habilita
STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Mostra la finestra de selecció de pistes
# Playlist window
+STR_PLAYLIST_MUSIC_SELECTION_SETNAME :{WHITE}Programació de pistes - «{STRING}»
STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} «{STRING}»
STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Índex de pistes
STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Llista «{STRING}»
STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Esborra
+STR_PLAYLIST_CHANGE_SET :{BLACK}Canvia conjunt
STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Esborra la llista actual (només les llistes personalitzables)
+STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Canvia la selecció musical a un altre conjunt instal·lat.
STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Clica la pista de música per afegir-la a la llista actual (només en les llistes personalitzables)
STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Clica la pista de música per treure-la de la llista actual (només en llistes personalitzables)
@@ -878,10 +883,10 @@ STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLAC
# Extra view window
STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Vista {COMMA}
-STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Copia a la vista
+STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Canvia la vista extra
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Mou aquesta vista on està la vista principal
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Vés a la vista
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Mou la vista principal on està aquesta vista
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Canvia vista principal
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Copia el lloc d'aquesta vista extra a la vista principal.
# Game options window
STR_GAME_OPTIONS_CAPTION :{WHITE}Opcions de la partida
@@ -1335,6 +1340,12 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Color del terre
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Verd
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Verd fosc
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violat
+STR_CONFIG_SETTING_SCROLLMODE :Desplaçament del mapa: {STRING}
+STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Comportament quan es desplaça el mapa.
+STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Mou la vista amb el botó dret del ratolí amb la posició del ratolí fixada
+STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Mou el mapa amb el botó dret del ratolí amb la posició del ratolí fixada
+STR_CONFIG_SETTING_SCROLLMODE_RMB :Mou el mapa amb el botó dret del ratolí
+STR_CONFIG_SETTING_SCROLLMODE_LMB :Mou el mapa amb el botó esquerre del ratolí
STR_CONFIG_SETTING_SMOOTH_SCROLLING :Desplaçament suau de la vista: {STRING}
STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Controla com la vista principal es desplaça a una posició específica quan es clica al mapa petit o quan s'envia una ordre de desplaçar-se a un objecte específic al mapa. Si està activat, la vista es desplaça suaument; si està desactivat, salta directament al punt assenyalat
STR_CONFIG_SETTING_MEASURE_TOOLTIP :Mostra un cartell de mesura quan estiguis utilitzant vàries eines de construcció: {STRING}
@@ -2279,6 +2290,7 @@ STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Llegenda
STR_LINKGRAPH_LEGEND_ALL :{BLACK}Tot
STR_LINKGRAPH_LEGEND_NONE :{BLACK}Cap
STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Selecciona les companyies que seran mostrades
+STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY}
# Linkgraph legend window and linkgraph legend in smallmap
STR_LINKGRAPH_LEGEND_UNUSED :{G=Masculin}{TINY_FONT}{BLACK}no utilitzat
@@ -2687,6 +2699,56 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyrigh
STR_ABOUT_VERSION :{BLACK}Versió {REV} de l'OpenTTD
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 L'equip de l'OpenTTD
+# Framerate display window
+STR_FRAMERATE_CAPTION :{WHITE}Fotogrames per segon
+STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} (x{DECIMAL})
+STR_FRAMERATE_RATE_GAMELOOP :{WHITE}Velocitat de simulació: {STRING}
+STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP :{BLACK}Nombre de tics del joc per segon.
+STR_FRAMERATE_RATE_BLITTER :{WHITE}Fotogrames per segon: {STRING}
+STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}Nombre de fotogrames renderitzats per segon.
+STR_FRAMERATE_SPEED_FACTOR :{WHITE}Factor de velocitat actual: x{DECIMAL}
+STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Quant ràpid va la partida actual, comparant-ho amb l'estimació de la velocitat normal.
+STR_FRAMERATE_CURRENT :{WHITE}Actual
+STR_FRAMERATE_AVERAGE :{WHITE}Mitjana
+STR_FRAMERATE_DATA_POINTS :{WHITE}Dades basades en {COMMA} mesures.
+STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL}{WHITE}{NBSP}ms
+STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL}{WHITE}{NBSP}ms
+STR_FRAMERATE_MS_BAD :{RED}{DECIMAL}{WHITE}{NBSP}ms
+STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL}{WHITE}{NBSP}fps
+STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL}{WHITE}{NBSP}fps
+STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL}{WHITE}{NBSP}fps
+STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA}{NBSP}ms
+STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA}{NBSP}s
+############ Leave those lines in this order!!
+STR_FRAMERATE_GAMELOOP :{WHITE}Total del bucle:
+STR_FRAMERATE_GL_ECONOMY :{WHITE} Tractament de la càrrega:
+STR_FRAMERATE_GL_TRAINS :{WHITE} Tics de tren:
+STR_FRAMERATE_GL_ROADVEHS :{WHITE} Tics de vehicles de carretera:
+STR_FRAMERATE_GL_SHIPS :{WHITE} Tics de vaixell:
+STR_FRAMERATE_GL_AIRCRAFT :{WHITE} Tics d'aeronau:
+STR_FRAMERATE_GL_LANDSCAPE :{WHITE} Tics del mapa:
+STR_FRAMERATE_GL_LINKGRAPH :{WHITE} Retard del graf de distribució:
+STR_FRAMERATE_DRAWING :{WHITE}Renderitzat de gràfics:
+STR_FRAMERATE_DRAWING_VIEWPORTS :{WHITE} Vistes del mapa:
+STR_FRAMERATE_VIDEO :{WHITE}Sortida de vídeo:
+STR_FRAMERATE_SOUND :{WHITE}Mescla de so:
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+STR_FRAMETIME_CAPTION_GAMELOOP :Bucle
+STR_FRAMETIME_CAPTION_GL_ECONOMY :Tractament de la càrrega
+STR_FRAMETIME_CAPTION_GL_TRAINS :Tics de tren
+STR_FRAMETIME_CAPTION_GL_ROADVEHS :Tics de vehicle de carretera
+STR_FRAMETIME_CAPTION_GL_SHIPS :Tics de vaixell
+STR_FRAMETIME_CAPTION_GL_AIRCRAFT :Tics d'aeronau
+STR_FRAMETIME_CAPTION_GL_LANDSCAPE :Tics del mapa
+STR_FRAMETIME_CAPTION_GL_LINKGRAPH :Retard del graf de distribució
+STR_FRAMETIME_CAPTION_DRAWING :Renderitzat de gràfics
+STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Renderitzat de la vista del mapa
+STR_FRAMETIME_CAPTION_VIDEO :Sortida de vídeo
+STR_FRAMETIME_CAPTION_SOUND :Mescla de so
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Desa la Partida
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Carrega una Partida
@@ -2971,6 +3033,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Posa un
STR_TOWN_DIRECTORY_CAPTION :{WHITE}Poblacions
STR_TOWN_DIRECTORY_NONE :{ORANGE}- Cap -
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA})
+STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA} -{YELLOW} ciutat{BLACK})
STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Noms de Població - clica al nom per centrar la vista principal a la població. Ctrl+Clic obre una nova vista al lloc de la població
STR_TOWN_POPULATION :{BLACK}Població mundial: {COMMA}
@@ -2978,6 +3041,7 @@ STR_TOWN_POPULATION :{BLACK}Poblaci
STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN}
STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Ciutat)
STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Població: {ORANGE}{COMMA}{BLACK} Cases: {ORANGE}{COMMA}
+STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} l'últim mes: {ORANGE}{COMMA}{BLACK} (màx. {ORANGE}{COMMA}{BLACK})
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Càrrega requerida per tal que la població creixi:
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} requerides
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} requerit a l'hivern
@@ -4216,7 +4280,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Massa es
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Hi ha massa parts d'estacions de tren
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Massa parades d'autobús
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Masses estacions de càrrega
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Massa prop d'una altra estació/àrea de càrrega
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Massa prop d'un altre moll
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Massa prop d'un altre aeroport
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}No es pot canviar el nom de l'estació...
@@ -4224,6 +4287,7 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... aque
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... sentit de la carretera en la direcció incorrecta
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... les estacions d'autobús de pas no poden tenir cantonades
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... les estacions d'autobús de pas no poden tenir interseccions
+STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... la carretera és d'un sol sentit o està blocada.
# Station destruction related errors
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}No es pot treure part de la estació...
@@ -4475,6 +4539,8 @@ STR_BASESOUNDS_DOS_DESCRIPTION :Sons originals
STR_BASESOUNDS_WIN_DESCRIPTION :Sons originals del Transport Tycoon Deluxe pel Windows.
STR_BASESOUNDS_NONE_DESCRIPTION :Una llista de sons buida.
STR_BASEMUSIC_WIN_DESCRIPTION :Música original del Transport Tycoon Deluxe pel Windows.
+STR_BASEMUSIC_DOS_DESCRIPTION :Música original del Transport Tycoon Deluxe pel DOS.
+STR_BASEMUSIC_TTO_DESCRIPTION :Música original del Transport Tycoon Deluxe (original/editor d'escenaris) pel DOS.
STR_BASEMUSIC_NONE_DESCRIPTION :Una llista de música sense cap peça.
##id 0x2000
diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt
index 10f6ca94f4..fc7a6a53bb 100644
--- a/src/lang/croatian.txt
+++ b/src/lang/croatian.txt
@@ -571,6 +571,7 @@ STR_ABOUT_MENU_SCREENSHOT :Slika zaslona
STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Zumirano do kraja na slici zaslona
STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Standardno zumiranje slike zaslona
STR_ABOUT_MENU_GIANT_SCREENSHOT :Slika zaslona cijele karte
+STR_ABOUT_MENU_SHOW_FRAMERATE :Prikaži broj sličica u sekundi
STR_ABOUT_MENU_ABOUT_OPENTTD :O 'OpenTTD'
STR_ABOUT_MENU_SPRITE_ALIGNER :Poravnanje spritea
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Odaberi granične okvire
@@ -910,6 +911,7 @@ STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLAC
STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDENT_NAME}{}(Direktor)
STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}Tvrtka {STRING} sponzorira izgradnju novoga grada {TOWN}!
+STR_NEWS_NEW_TOWN_UNSPONSORED :{BLACK}{BIG_FONT}Sagrađen je novi grad {TOWN}!
STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLACK}Započela je izgradnja nove {STRING.gen} u blizini grada {TOWN}a!
STR_NEWS_INDUSTRY_PLANTED :{BIG_FONT}{BLACK}Nova {STRING} trenutno se sadi blizu grada {TOWN}a!
@@ -1022,6 +1024,7 @@ STR_GAME_OPTIONS_CURRENCY_ZAR :Južnoafrički
STR_GAME_OPTIONS_CURRENCY_CUSTOM :Proizvoljno...
STR_GAME_OPTIONS_CURRENCY_GEL :Gruzijski Lari (GEL)
STR_GAME_OPTIONS_CURRENCY_IRR :Iranski Rial (IRR)
+STR_GAME_OPTIONS_CURRENCY_RUB :Nove ruske rublje (RUB)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Cestovna vozila
@@ -2793,6 +2796,56 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Izvorno
STR_ABOUT_VERSION :{BLACK}OpenTTD verzija {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD tim
+# Framerate display window
+STR_FRAMERATE_CAPTION :{WHITE}Broj sličica
+STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} ({DECIMAL}x)
+STR_FRAMERATE_RATE_GAMELOOP :{BLACK}Stopa simulacije: {STRING}
+STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP :{BLACK}Broj otkucaja igre simuliranih u sekundi.
+STR_FRAMERATE_RATE_BLITTER :{BLACK}Broj sličica u sekundi: {STRING}
+STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}Broj sličica videa prikayanih u sekundi.
+STR_FRAMERATE_SPEED_FACTOR :{BLACK}Trenutni faktor brzine igre: {DECIMAL}x
+STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Koliko brzo se igra izvodi trenutno u usporedbi sa očekivanom brzinom u uobičajenoj simulaciji.
+STR_FRAMERATE_CURRENT :{WHITE}Trenutno
+STR_FRAMERATE_AVERAGE :{WHITE}Prosječno
+STR_FRAMERATE_DATA_POINTS :{BLACK}Podaci bazirani na {COMMA} mjerama
+STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL} ms
+STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL} ms
+STR_FRAMERATE_MS_BAD :{RED}{DECIMAL} ms
+STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL} sličica/s
+STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL} sličica/s
+STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL} sličica/s
+STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA} ms
+STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} s
+############ Leave those lines in this order!!
+STR_FRAMERATE_GAMELOOP :{BLACK}Zbroj petlji igre:
+STR_FRAMERATE_GL_ECONOMY :{BLACK} Korištenje tereta:
+STR_FRAMERATE_GL_TRAINS :{BLACK} Otkucaji vlakova:
+STR_FRAMERATE_GL_ROADVEHS :{BLACK} Otkucaji cestovnih vozila:
+STR_FRAMERATE_GL_SHIPS :{BLACK} Otkucaji brodova:
+STR_FRAMERATE_GL_AIRCRAFT :{BLACK} Otkucaji aviona:
+STR_FRAMERATE_GL_LANDSCAPE :{BLACK} Otkucaji svijeta:
+STR_FRAMERATE_GL_LINKGRAPH :{BLACK} Odmak linka grafikona:
+STR_FRAMERATE_DRAWING :{BLACK}Prikaz grafike:
+STR_FRAMERATE_DRAWING_VIEWPORTS :{BLACK} Prikazi svijeta:
+STR_FRAMERATE_VIDEO :{BLACK}Video izlaz:
+STR_FRAMERATE_SOUND :{BLACK}Miksanje zvukova:
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+STR_FRAMETIME_CAPTION_GAMELOOP :Petlja igre
+STR_FRAMETIME_CAPTION_GL_ECONOMY :Korištenje tereta
+STR_FRAMETIME_CAPTION_GL_TRAINS :Otkucaji vlakova
+STR_FRAMETIME_CAPTION_GL_ROADVEHS :Otkucaji cestovnih vozila
+STR_FRAMETIME_CAPTION_GL_SHIPS :Otkucaji brodova
+STR_FRAMETIME_CAPTION_GL_AIRCRAFT :Otkucaji aviona
+STR_FRAMETIME_CAPTION_GL_LANDSCAPE :Otkucaji svijeta
+STR_FRAMETIME_CAPTION_GL_LINKGRAPH :Odmak linka grafikona
+STR_FRAMETIME_CAPTION_DRAWING :Prikaz grafike
+STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Prikazi svijeta
+STR_FRAMETIME_CAPTION_VIDEO :Video izlaz
+STR_FRAMETIME_CAPTION_SOUND :Miksanje zvukova
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Spremi igru
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Učitaj igru
@@ -2815,6 +2868,7 @@ STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Detalji
STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Nema dostupnih informacija.
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING}
STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: {WHITE}{STRING}
+STR_SAVELOAD_FILTER_TITLE :{BLACK}Filtriraj niz:
STR_SAVELOAD_OSKTITLE :{BLACK}Upiši ime za spremanje igre
@@ -3013,6 +3067,8 @@ STR_NEWGRF_ERROR_READ_BOUNDS :Pročitaj nakon
STR_NEWGRF_ERROR_GRM_FAILED :Zatraženi GRF resursi nisu dostupni (sprite {3:NUM})
STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} je isključen od strane {STRING}
STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Pogrešan/nepoznat format raspored sprite-a (sprite {3:NUM})
+STR_NEWGRF_ERROR_LIST_PROPERTY_TOO_LONG :Previše elemenata na listi postavki varijabli (sprite {3:NUM}, postavka {4:HEX})
+STR_NEWGRF_ERROR_INDPROD_CALLBACK :Pogrešna callback funkcija za industrijsku proizvodnju (sprite {3:NUM}, "{1:STRING}")
# NewGRF related 'general' warnings
STR_NEWGRF_POPUP_CAUTION_CAPTION :{WHITE}Oprez!
@@ -4324,7 +4380,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Previše
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Previše dijelova željezničke postaje
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Previše autobusnih postaja
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Previše kamionskih postaja
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Preblizu drugoj postaji/terminalu
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Preblizu drugom pristaništu
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Preblizu drugoj zračnoj luci
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Nije moguće preimenovati postaju...
diff --git a/src/lang/czech.txt b/src/lang/czech.txt
index 901aa6c280..5512bc616d 100644
--- a/src/lang/czech.txt
+++ b/src/lang/czech.txt
@@ -550,6 +550,7 @@ STR_ABOUT_MENU_SCREENSHOT :Screenshot
STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Screenshot v plném přiblížení
STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Screenshot ve výchozím přiblížení
STR_ABOUT_MENU_GIANT_SCREENSHOT :Screenshot celé mapy
+STR_ABOUT_MENU_SHOW_FRAMERATE :Zobrazit počet snímků za sekundu
STR_ABOUT_MENU_ABOUT_OPENTTD :O 'OpenTTD'
STR_ABOUT_MENU_SPRITE_ALIGNER :Zarovnávání spritů
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Přepnout ohraničení
@@ -737,6 +738,7 @@ STR_MUSIC_RULER_MARKER :{TINY_FONT}{BLA
STR_MUSIC_TRACK_NONE :{TINY_FONT}{DKGREEN}--
STR_MUSIC_TRACK_DIGIT :{TINY_FONT}{DKGREEN}{ZEROFILL_NUM}
STR_MUSIC_TITLE_NONE :{TINY_FONT}{DKGREEN}------
+STR_MUSIC_TITLE_NOMUSIC :{TINY_FONT}{DKGREEN}Hudba nedostupná
STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}"
STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Skladba
STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Název
@@ -762,6 +764,7 @@ STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLA
STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Program - '{STRING}'
STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Vymazat
STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Vyprázdnit současný program (jen u Voleb 1 a 2)
+STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Změnit výběr hudby na jinou nainstalovanou sadu.
STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Skladba se přidá do zvoleného programu (Volba 1 nebo 2) klepnutím na její název
STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Hudební stopu odstraníš ze současného programu (pouze u vlastního) kliknutím na ni
@@ -897,6 +900,7 @@ STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLAC
STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDENT_NAME}{}(Prezident)
STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}Společnost {STRING} zaplatila výstavbu nového města {TOWN}!
+STR_NEWS_NEW_TOWN_UNSPONSORED :{BLACK}{BIG_FONT}Nové město {TOWN} bylo vystavěno!
STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLACK}Nov{G ý á é í é é á} {STRING.small} se staví poblíž města {TOWN}!
STR_NEWS_INDUSTRY_PLANTED :{BIG_FONT}{BLACK}Nov{G ý á é í é é á} {STRING.small} se vysazuj{G 0 e e e í í í í} poblíž města {TOWN}!
@@ -966,7 +970,7 @@ STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLAC
STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Pohled {COMMA}
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Nastavit jako pohled
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Nastavit současné zorné pole jako pohled
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Přejít na pohled
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Změnit hlavní pohled
STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Nastavit pohled do zorného pole
# Game options window
@@ -1009,6 +1013,7 @@ STR_GAME_OPTIONS_CURRENCY_ZAR :Jihoafrický ra
STR_GAME_OPTIONS_CURRENCY_CUSTOM :Vlastní...
STR_GAME_OPTIONS_CURRENCY_GEL :Georgijské Lari (GEL)
STR_GAME_OPTIONS_CURRENCY_IRR :Íránský Riál (IRR)
+STR_GAME_OPTIONS_CURRENCY_RUB :Ruský rubl (RUB)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Silniční vozidla jezdí
@@ -2365,6 +2370,7 @@ STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Legenda
STR_LINKGRAPH_LEGEND_ALL :{BLACK}Všechny
STR_LINKGRAPH_LEGEND_NONE :{BLACK}Žádný
STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Vybrat firmy, které mají být zobrazeny
+STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY}
# Linkgraph legend window and linkgraph legend in smallmap
STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}nepoužívaný
@@ -2779,6 +2785,28 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Původn
STR_ABOUT_VERSION :{BLACK}OpenTTD verze {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 Tým OpenTTD
+# Framerate display window
+STR_FRAMERATE_CAPTION :{WHITE}Počet snímků za sekundu
+STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}Počet snímků videa vykreslovaných za sekundu.
+STR_FRAMERATE_SPEED_FACTOR :{WHITE}Aktuální činitel rychlosti hry: {DECIMAL}x
+STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Rychlost, kterou hra právě běží, v porovnání s očekávanou rychlostí při běžné rychlosti simulace.
+STR_FRAMERATE_AVERAGE :{WHITE}Průměr
+STR_FRAMERATE_MS_BAD :{RED}{DECIMAL}{WHITE} ms
+STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL}{WHITE} sním{P "ek" "ky" "ků"}/s
+STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL}{WHITE} sním{P "ek" "ky" "ků"}/s
+STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA} ms
+STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} s
+############ Leave those lines in this order!!
+STR_FRAMERATE_GL_ECONOMY :{WHITE} Manipulace s nákladem:
+STR_FRAMERATE_DRAWING :{WHITE}Vykreslování grafiky:
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+STR_FRAMETIME_CAPTION_GL_ECONOMY :Manipulace s nákladem
+STR_FRAMETIME_CAPTION_DRAWING :Vykreslování grafiky
+STR_FRAMETIME_CAPTION_SOUND :Míchání zvuků
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Uložit hru
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Otevřít hru
@@ -3063,6 +3091,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Zadej n
STR_TOWN_DIRECTORY_CAPTION :{WHITE}Města
STR_TOWN_DIRECTORY_NONE :{ORANGE}- Nic -
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA})
+STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (velkoměsto){BLACK} ({COMMA})
STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Jména měst - pohled na město zaměříš kliknutím na jeho jméno. Při stisknutém Ctrl otevřeš nový pohled
STR_TOWN_POPULATION :{BLACK}Populace světa: {COMMA}
@@ -3070,6 +3099,7 @@ STR_TOWN_POPULATION :{BLACK}Populace
STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN}
STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (velkoměsto)
STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Populace: {ORANGE}{COMMA}{BLACK} Domů: {ORANGE}{COMMA}
+STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} minulý měsíc: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA}
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Množství doručeného nákladu potřebného pro rozvoj města:
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{RED}Je potřeba {ORANGE}{STRING}
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} vyžadováno v zimě
@@ -4311,7 +4341,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Příli
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Příliš mnoho staničních částí
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Příliš mnoho autobusových zastávek
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Příliš mnoho zastávek nákladních automobilů
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Příliš blízko k jinému nádraží nebo nákladové rampě
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Příliš blízko k jinému doku
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Příliš blízko k jinému letišti
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Nelze přejmenovat stanici...
@@ -4319,6 +4348,7 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... tato
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... silnice je otočena jiným směrem
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... průjezdné zastávky nemohou být v zatáčce
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... průjezdné zastávky nemohou být na křižovatce
+STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... silnice je jednosměrná nebo uzavřená.
# Station destruction related errors
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Nelze odstranit část stanice...
@@ -4577,6 +4607,8 @@ STR_BASESOUNDS_DOS_DESCRIPTION :Původní sada
STR_BASESOUNDS_WIN_DESCRIPTION :Původní sada zvuků Transport Tycoon Deluxe (verze pro Windows).
STR_BASESOUNDS_NONE_DESCRIPTION :Prázdná sada zvuků.
STR_BASEMUSIC_WIN_DESCRIPTION :Původní hudba Transport Tycoon Deluxe (verze pro Windows).
+STR_BASEMUSIC_DOS_DESCRIPTION :Původní hudba Transport Tycoon Deluxe (verze pro DOS).
+STR_BASEMUSIC_TTO_DESCRIPTION :Původní hudba Transport Tycoon (verze pro DOS).
STR_BASEMUSIC_NONE_DESCRIPTION :Prázná hudební sada.
##id 0x2000
diff --git a/src/lang/danish.txt b/src/lang/danish.txt
index 9dcc55c1f8..813a496d15 100644
--- a/src/lang/danish.txt
+++ b/src/lang/danish.txt
@@ -650,6 +650,7 @@ STR_MUSIC_RULER_MARKER :{TINY_FONT}{BLA
STR_MUSIC_TRACK_NONE :{TINY_FONT}{DKGREEN}--
STR_MUSIC_TRACK_DIGIT :{TINY_FONT}{DKGREEN}{ZEROFILL_NUM}
STR_MUSIC_TITLE_NONE :{TINY_FONT}{DKGREEN}------
+STR_MUSIC_TITLE_NOMUSIC :{TINY_FONT}{DKGREEN}Ingen musik tilgængelig
STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}"
STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Nummer
STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Titel
@@ -675,6 +676,7 @@ STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLA
STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Program - '{STRING}'
STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Ryd
STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Ryd det valgte program (Gælder kun Custom1/Custom2)
+STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Ændre musik listen til et anden installeret sæt
STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klik på et musiknummer for at tilføje det til programlisten (kun for Custom1/Custom2)
STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klik på et musiknummer for at fjerne det fra programlisten (kun for Custom1/Custom2)
@@ -1334,6 +1336,10 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Land farve brug
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Grøn
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Mørkegrøn
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violet
+STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Bevæg syns vinduet med højre mussetast, musse position låst
+STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Bevæg kortet med højre mussetast, musse position låst
+STR_CONFIG_SETTING_SCROLLMODE_RMB :Bevæg kortet med højre musseknap
+STR_CONFIG_SETTING_SCROLLMODE_LMB :Bevæg kortet med venstre musseknap
STR_CONFIG_SETTING_SMOOTH_SCROLLING :Jævn scrolling af udsnit: {STRING}
STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Kontroller hvordan de vigtigste visning ruller til en bestemt position, når du klikker på det lille kort eller når de udsteder en kommando til at rulle til en bestemt genstand på kortet. Hvis aktiveret, ruller udsigtspunktet jævnt, hvis deaktiveret springer den direkte til det valgte punkt
STR_CONFIG_SETTING_MEASURE_TOOLTIP :Vis måleværktøjstip ved brug af div. bygge-værktøjer: {STRING}
@@ -2686,6 +2692,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original
STR_ABOUT_VERSION :{BLACK}OpenTTD version {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD teamet
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Gem spil
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Hent spil
@@ -4215,7 +4228,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}For mang
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Banegården er i for mange dele
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}For mange busterminaler
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}For mange fragtcentraler
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}For tæt på en anden station/fragtcentral
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}For tæt på en anden havn
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}For tæt på en anden lufthavn
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Kan ikke omdøbe stationen...
@@ -4223,6 +4235,7 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... denn
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... vejen peger i den forkerte retning
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... drive-through stops kan ikke have hjørner
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... drive-through stops kan ikke have kryds
+STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}vejen er ensrettet eller blokeret
# Station destruction related errors
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Kan ikke fjerne en del af en station...
diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt
index 764a0fc106..4598851f64 100644
--- a/src/lang/dutch.txt
+++ b/src/lang/dutch.txt
@@ -98,7 +98,7 @@ STR_QUANTITY_NOTHING :
STR_QUANTITY_PASSENGERS :{COMMA}{NBSP}passagier{P "" s}
STR_QUANTITY_COAL :{WEIGHT_LONG} kolen
STR_QUANTITY_MAIL :{COMMA}{NBSP}zak{P "" ken} post
-STR_QUANTITY_OIL :{VOLUME_LONG} Vaten Olie
+STR_QUANTITY_OIL :{VOLUME_LONG} Vaten olie
STR_QUANTITY_LIVESTOCK :{COMMA}{NBSP}stuk{P "" s} vee
STR_QUANTITY_GOODS :{COMMA}{NBSP}krat{P "" ten} goederen
STR_QUANTITY_GRAIN :{WEIGHT_LONG} graan
@@ -107,7 +107,7 @@ STR_QUANTITY_IRON_ORE :{WEIGHT_LONG} i
STR_QUANTITY_STEEL :{WEIGHT_LONG} staal
STR_QUANTITY_VALUABLES :{COMMA}{NBSP}zak{P "" ken} kostbaarheden
STR_QUANTITY_COPPER_ORE :{WEIGHT_LONG} kopererts
-STR_QUANTITY_MAIZE :{WEIGHT_LONG} mais
+STR_QUANTITY_MAIZE :{WEIGHT_LONG} maïs
STR_QUANTITY_FRUIT :{WEIGHT_LONG} fruit
STR_QUANTITY_DIAMONDS :{COMMA}{NBSP}zak{P "" ken} diamanten
STR_QUANTITY_FOOD :{WEIGHT_LONG} voedsel
@@ -224,7 +224,7 @@ STR_UNITS_HEIGHT_METRIC :{COMMA}{NBSP}m
STR_UNITS_HEIGHT_SI :{COMMA}{NBSP}m
# Common window strings
-STR_LIST_FILTER_TITLE :{BLACK}Filter tekst:
+STR_LIST_FILTER_TITLE :{BLACK}Filtertekst:
STR_LIST_FILTER_OSKTITLE :{BLACK}Voer filtertekst in
STR_LIST_FILTER_TOOLTIP :{BLACK}Geef een woord waarop gefilterd kan worden in de lijst
@@ -239,7 +239,7 @@ STR_BUTTON_RENAME :{BLACK}Hernoem
STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Sluit venster
STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Vensternaam - sleep om venster te verplaatsen
STR_TOOLTIP_SHADE :{BLACK}Klap venster in - toon alleen de titelbalk
-STR_TOOLTIP_DEBUG :{BLACK}Toon NewGRF debug informatie
+STR_TOOLTIP_DEBUG :{BLACK}Toon NewGRF-debuginformatie
STR_TOOLTIP_DEFSIZE :{BLACK}wijzig venster naar standaardgrootte. Ctrl+Klik om de huidige grootte als standaard op te slaan
STR_TOOLTIP_STICKY :{BLACK}Markeer dit venster als niet-sluitbaar door de 'Sluit alle vensters'-knop. Ctrl+Klik om status als default op te slaan
STR_TOOLTIP_RESIZE :{BLACK}Klik en sleep om de grootte van dit venster te veranderen
@@ -324,10 +324,10 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Toon lij
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Toon financiële informatie over het bedrijf
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Toon algemene informatie over het bedrijf
STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Toon verhaallijn
-STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Geven doellijst
+STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Geef doellijst weer
STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Toon grafieken
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Toon bedrijfscompetitietabel
-STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Betaal de bouw van nieuwe industrie of toon lijst van alle industrieën
+STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Financier de bouw van nieuwe industrie of toon lijst van alle industrieën
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Toon lijst met treinen van het bedrijf. Ctrl+klik schakelt tussen lijst van groepen/voertuigen
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Toon lijst met wegvoertuigen van het bedrijf. Ctrl+klik schakelt tussen lijst van groepen/voertuigen
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Toon lijst met schepen van het bedrijf. Ctrl+klik schakelt tussen lijst van groepen/voertuigen
@@ -340,8 +340,8 @@ STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Bouw hav
STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Bouw vliegvelden
STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Open de landschapsbalk om land te verhogen/verlagen, bomen te planten, etc.
STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Toon geluid/muziekscherm
-STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Toon laatste (nieuws)bericht, toon berichtinstellingen
-STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Landinformatie, console, script-debug, screenshots, over OpenTTD
+STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Toon laatst (nieuws)bericht, toon berichtinstellingen
+STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Landinformatie, console, scriptdebug, screenshots, over OpenTTD
STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR :{BLACK}Verwissel knoppenbalk
# Extra tooltips for the scenario editor toolbar
@@ -354,7 +354,7 @@ STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE :{BLACK}Klik om
STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Toon kaart, stedenlijst
STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Landschapsontwikkeling
STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Stadsontwikkeling
-STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Industrie-ontwikkeling
+STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Industrieontwikkeling
STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Wegenbouw
STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Plant bomen. Shift schakelt tussen bouwen/inschatting van de kosten
STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Plaats bord
@@ -365,7 +365,7 @@ STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO :Scenario opslaa
STR_SCENEDIT_FILE_MENU_LOAD_SCENARIO :Scenario openen
STR_SCENEDIT_FILE_MENU_SAVE_HEIGHTMAP :Hoogtekaart opslaan
STR_SCENEDIT_FILE_MENU_LOAD_HEIGHTMAP :Laad hoogtekaart
-STR_SCENEDIT_FILE_MENU_QUIT_EDITOR :Sluit scenario editor
+STR_SCENEDIT_FILE_MENU_QUIT_EDITOR :Sluit scenario-editor
STR_SCENEDIT_FILE_MENU_SEPARATOR :
STR_SCENEDIT_FILE_MENU_QUIT :Afsluiten
############ range for SE file menu starts
@@ -373,14 +373,14 @@ STR_SCENEDIT_FILE_MENU_QUIT :Afsluiten
############ range for settings menu starts
STR_SETTINGS_MENU_GAME_OPTIONS :Spelopties
STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Instellingen
-STR_SETTINGS_MENU_SCRIPT_SETTINGS :AI/Game script instellingen
-STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF instellingen
+STR_SETTINGS_MENU_SCRIPT_SETTINGS :AI/Spelscriptinstellingen
+STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF-instellingen
STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Doorzichtigheidsopties
STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Toon plaatsnamen
STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED :Toon stationsnamen
STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED :Toon controlepostnamen
STR_SETTINGS_MENU_SIGNS_DISPLAYED :Toon borden
-STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS :Toon tegenstander's borden en namen
+STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS :Toon borden en namen van tegenstanders
STR_SETTINGS_MENU_FULL_ANIMATION :Alle animaties
STR_SETTINGS_MENU_FULL_DETAIL :Alle details
STR_SETTINGS_MENU_TRANSPARENT_BUILDINGS :Transparante gebouwen
@@ -398,7 +398,7 @@ STR_FILE_MENU_EXIT :Afsluiten
# map menu
STR_MAP_MENU_MAP_OF_WORLD :Kaart
STR_MAP_MENU_EXTRA_VIEW_PORT :Extra kijkvenster
-STR_MAP_MENU_LINGRAPH_LEGEND :Vracht Stroom Legenda
+STR_MAP_MENU_LINGRAPH_LEGEND :Vrachtstroomlegende
STR_MAP_MENU_SIGN_LIST :Bordenlijst
############ range for town menu starts
@@ -422,7 +422,7 @@ STR_GRAPH_MENU_CARGO_PAYMENT_RATES :Vrachtprijzen
############ range for company league menu starts
STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE :Bedrijfscompetitietabel
STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING :Gedetailleerde prestatiescore
-STR_GRAPH_MENU_HIGHSCORE :Score tabel
+STR_GRAPH_MENU_HIGHSCORE :Scoretabel
############ range ends here
############ range for industry menu starts
@@ -434,13 +434,13 @@ STR_INDUSTRY_MENU_FUND_NEW_INDUSTRY :Betaal nieuwe i
############ range for railway construction menu starts
STR_RAIL_MENU_RAILROAD_CONSTRUCTION :Bouw spoorwegen
STR_RAIL_MENU_ELRAIL_CONSTRUCTION :Bouw geëlektrificeerde spoorwegen
-STR_RAIL_MENU_MONORAIL_CONSTRUCTION :Bouw monorail-spoorwegen
-STR_RAIL_MENU_MAGLEV_CONSTRUCTION :Bouw magneetzweeftrein-spoorwegen
+STR_RAIL_MENU_MONORAIL_CONSTRUCTION :Bouw monorailspoorwegen
+STR_RAIL_MENU_MAGLEV_CONSTRUCTION :Bouw magneetzweeftreinspoorwegen
############ range ends here
############ range for road construction menu starts
STR_ROAD_MENU_ROAD_CONSTRUCTION :Bouw wegen
-STR_ROAD_MENU_TRAM_CONSTRUCTION :Bouw tramwegen
+STR_ROAD_MENU_TRAM_CONSTRUCTION :Bouw tramsporen
############ range ends here
############ range for waterways construction menu starts
@@ -462,7 +462,7 @@ STR_TOOLBAR_SOUND_MUSIC :Geluid/muziek
############ range ends here
############ range for message menu starts
-STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT :Laatste (nieuws)bericht
+STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT :Laatst (nieuws)bericht
STR_NEWS_MENU_MESSAGE_HISTORY_MENU :Berichtengeschiedenis
############ range ends here
@@ -475,6 +475,7 @@ STR_ABOUT_MENU_SCREENSHOT :Screenshot
STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Ingezoomd screenshot
STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Screenshot met standaard zoom
STR_ABOUT_MENU_GIANT_SCREENSHOT :Screenshot van hele kaart
+STR_ABOUT_MENU_SHOW_FRAMERATE :Toon frame rate
STR_ABOUT_MENU_ABOUT_OPENTTD :Over 'OpenTTD'
STR_ABOUT_MENU_SPRITE_ALIGNER :Sprite-uitlijner
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Schakel selectiekaders
@@ -632,10 +633,10 @@ STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Het aant
STR_PERFORMANCE_DETAIL_CARGO_TOOLTIP :{BLACK}Aantal soorten vracht die in het laatste kwartaal zijn afgeleverd
STR_PERFORMANCE_DETAIL_MONEY_TOOLTIP :{BLACK}Hoeveelheid geld op de bank
STR_PERFORMANCE_DETAIL_LOAN_TOOLTIP :{BLACK}De hoeveelheid geld die dit bedrijf leent
-STR_PERFORMANCE_DETAIL_TOTAL_TOOLTIP :{BLACK}Totaal aantal punten uit de mogelijke punten
+STR_PERFORMANCE_DETAIL_TOTAL_TOOLTIP :{BLACK}Totaal aantal punten van de mogelijke punten
# Music window
-STR_MUSIC_JAZZ_JUKEBOX_CAPTION :{WHITE}Jazz-jukebox
+STR_MUSIC_JAZZ_JUKEBOX_CAPTION :{WHITE}Jazzjukebox
STR_MUSIC_PLAYLIST_ALL :{TINY_FONT}{BLACK}Alle
STR_MUSIC_PLAYLIST_OLD_STYLE :{TINY_FONT}{BLACK}Oude Stijl
STR_MUSIC_PLAYLIST_NEW_STYLE :{TINY_FONT}{BLACK}Nieuwe Stijl
@@ -650,6 +651,7 @@ STR_MUSIC_RULER_MARKER :{TINY_FONT}{BLA
STR_MUSIC_TRACK_NONE :{TINY_FONT}{DKGREEN}--
STR_MUSIC_TRACK_DIGIT :{TINY_FONT}{DKGREEN}{ZEROFILL_NUM}
STR_MUSIC_TITLE_NONE :{TINY_FONT}{DKGREEN}------
+STR_MUSIC_TITLE_NOMUSIC :{TINY_FONT}{DKGREEN}Geen muziek beschikbaar
STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}"
STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Nummer
STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Titel
@@ -663,18 +665,21 @@ STR_MUSIC_TOOLTIP_DRAG_SLIDERS_TO_SET_MUSIC :{BLACK}Gebruik
STR_MUSIC_TOOLTIP_SELECT_ALL_TRACKS_PROGRAM :{BLACK}Selecteer 'alle nummers'-programma
STR_MUSIC_TOOLTIP_SELECT_OLD_STYLE_MUSIC :{BLACK}Selecteer 'oude stijl-muziek'-programma
STR_MUSIC_TOOLTIP_SELECT_NEW_STYLE_MUSIC :{BLACK}Selecteer 'nieuwe stijl-muziek'-programma
-STR_MUSIC_TOOLTIP_SELECT_EZY_STREET_STYLE :{BLACK}Kies 'Ezy Street-stijl-muziek'-programma
+STR_MUSIC_TOOLTIP_SELECT_EZY_STREET_STYLE :{BLACK}Kies 'Ezy Street stylemuziek'-programma
STR_MUSIC_TOOLTIP_SELECT_CUSTOM_1_USER_DEFINED :{BLACK}Selecteer 'Aangepast1'-programma
STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Selecteer 'Aangepast2'-programma
STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Programmashuffle aan/uit
STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Toon nummerkeuzescherm
# Playlist window
+STR_PLAYLIST_MUSIC_SELECTION_SETNAME :{WHITE}Muziekprogramma - '{STRING}'
STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}"
STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Nummerindex
STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Programma - '{STRING}'
STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Maak leeg
+STR_PLAYLIST_CHANGE_SET :{BLACK}Verander set
STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Maak huidig programma leeg (alleen Aangepast1 en Aangepast2)
+STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Verander muziekselectie naar een andere geïnstalleerde set
STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klik op het nummer om deze aan het programma toe te voegen (alleen Aangepast1 en Aangepast2)
STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klik op het nummer om deze uit het programma te verwijderen (alleen Aangepast1 en Aangepast2)
@@ -702,14 +707,14 @@ STR_SMALLMAP_TYPE_VEHICLES :Voertuigen
STR_SMALLMAP_TYPE_INDUSTRIES :Industrieën
STR_SMALLMAP_TYPE_ROUTEMAP :Vrachtstroom
STR_SMALLMAP_TYPE_ROUTES :Routes
-STR_SMALLMAP_TYPE_VEGETATION :Begroeiïng
+STR_SMALLMAP_TYPE_VEGETATION :Begroeiing
STR_SMALLMAP_TYPE_OWNERS :Eigenaren
STR_SMALLMAP_TOOLTIP_SHOW_LAND_CONTOURS_ON_MAP :{BLACK}Toon landcontouren op de kaart
STR_SMALLMAP_TOOLTIP_SHOW_VEHICLES_ON_MAP :{BLACK}Toon voertuigen op de kaart
STR_SMALLMAP_TOOLTIP_SHOW_INDUSTRIES_ON_MAP :{BLACK}Toon industrieën op de kaart
STR_SMALLMAP_TOOLTIP_SHOW_LINK_STATS_ON_MAP :{BLACK}Toon vrachtstroom op de kaart
STR_SMALLMAP_TOOLTIP_SHOW_TRANSPORT_ROUTES_ON :{BLACK}Toon transportroutes op de kaart
-STR_SMALLMAP_TOOLTIP_SHOW_VEGETATION_ON_MAP :{BLACK}Toon begroeiïng op de kaart
+STR_SMALLMAP_TOOLTIP_SHOW_VEGETATION_ON_MAP :{BLACK}Toon begroeiing op de kaart
STR_SMALLMAP_TOOLTIP_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Toon landeigenaren op de kaart
STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Klik op een industriesoort om deze weer te geven. Ctrl+klik verbergt alle andere industriesoorten behalve de geselecteerde. Nogmaals Ctrl+klik geeft opnieuw alle industriesoorten weer.
STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Klik op een bedrijf om de bedrijfseigendommen weer te geven. Ctrl+klik verbergt alle andere bedrijven behalve de geselecteerde. Nogmaals Ctrl+klik geeft opnieuw alle bedrijven weer.
@@ -734,7 +739,7 @@ STR_SMALLMAP_LEGENDA_DOCK :{TINY_FONT}{BLA
STR_SMALLMAP_LEGENDA_ROUGH_LAND :{TINY_FONT}{BLACK}Ruw land
STR_SMALLMAP_LEGENDA_GRASS_LAND :{TINY_FONT}{BLACK}Grasland
STR_SMALLMAP_LEGENDA_BARE_LAND :{TINY_FONT}{BLACK}Braakliggend land
-STR_SMALLMAP_LEGENDA_FIELDS :{TINY_FONT}{BLACK}Velden
+STR_SMALLMAP_LEGENDA_FIELDS :{TINY_FONT}{BLACK}Akkers
STR_SMALLMAP_LEGENDA_TREES :{TINY_FONT}{BLACK}Bomen
STR_SMALLMAP_LEGENDA_ROCKS :{TINY_FONT}{BLACK}Rotsen
STR_SMALLMAP_LEGENDA_WATER :{TINY_FONT}{BLACK}Water
@@ -762,7 +767,7 @@ STR_SMALLMAP_TOOLTIP_DISABLE_ALL_CARGOS :{BLACK}Toon gee
STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Toon alle vrachtsoorten op de kaart
# Status bar messages
-STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Toon laatste (nieuws)bericht
+STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Toon laatst (nieuws)bericht
STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - -
STR_STATUSBAR_PAUSED :{YELLOW}* * GEPAUZEERD * *
STR_STATUSBAR_AUTOSAVE :{RED}AUTOMATISCH OPSLAAN
@@ -841,7 +846,7 @@ STR_NEWS_VEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}{VEHICLE
STR_NEWS_VEHICLE_HAS_VOID_ORDER :{WHITE}{VEHICLE} heeft een lege order
STR_NEWS_VEHICLE_HAS_DUPLICATE_ENTRY :{WHITE}{VEHICLE} heeft dubbele orders
STR_NEWS_VEHICLE_HAS_INVALID_ENTRY :{WHITE}{VEHICLE} heeft een ongeldig station in de orders
-STR_NEWS_PLANE_USES_TOO_SHORT_RUNWAY :{WHITE}{VEHICLE} heeft in de opdrachten een luchthaven waarvan de start-en landingsbaan is te kort
+STR_NEWS_PLANE_USES_TOO_SHORT_RUNWAY :{WHITE}{VEHICLE} heeft in de opdrachten een luchthaven waarvan de start-en landingsbaan te kort is
STR_NEWS_VEHICLE_IS_GETTING_OLD :{WHITE}{VEHICLE} is oud aan het worden
STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE} is erg oud aan het worden
@@ -871,16 +876,16 @@ STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLAC
STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Subsidie uitgereikt aan {STRING}!{}{}{STRING}route van {STRING} naar {STRING} krijgt volgend jaar driedubbel betaald!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Subsidie uitgereikt aan {STRING}!{}{}{STRING}route van {STRING} naar {STRING} krijgt volgend jaar vierdubbel betaald!
-STR_NEWS_ROAD_REBUILDING :{BIG_FONT}{BLACK}Verkeerschaos in {TOWN}!{}{}Wegreparatie betaald door {STRING} zorgt voor 6 maanden van irritatie bij weggebruikers!
-STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Transport monopoly!
-STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLACK}Lokale overheid van {TOWN} tekend contract met {STRING} voor een jaar exclusieve transportrechten!
+STR_NEWS_ROAD_REBUILDING :{BIG_FONT}{BLACK}Verkeerschaos in {TOWN}!{}{}Wegherstelling betaald door {STRING} zorgt voor 6 maanden van miserie bij weggebruikers!
+STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Transportmonopolie!
+STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLACK}Lokale overheid van {TOWN} tekent contract met {STRING} voor een jaar exclusieve transportrechten!
# Extra view window
STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Kijkvenster {COMMA}
-STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Kopieer naar kijkvenster
+STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Verander kijkvenster
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Kopieer de locatie van het algemene scherm naar dit kijkvenster
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Plak van kijkvenster
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Plak de locatie van dit kijkvenster naar het algemene scherm
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Verander algemeen scherm
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Kopieer de locatie van dit kijkvenster naar het algemene scherm
# Game options window
STR_GAME_OPTIONS_CAPTION :{WHITE}Spelopties
@@ -922,6 +927,7 @@ STR_GAME_OPTIONS_CURRENCY_ZAR :Zuid-Afrikaanse
STR_GAME_OPTIONS_CURRENCY_CUSTOM :Aangepast...
STR_GAME_OPTIONS_CURRENCY_GEL :Georgische Lari (GEL)
STR_GAME_OPTIONS_CURRENCY_IRR :Iraanse Rial (IRR)
+STR_GAME_OPTIONS_CURRENCY_RUB :Nieuwe Russische Roebel (RUB)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Wegvoertuigen
@@ -1334,8 +1340,14 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Kleur van het t
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Groen
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Donker groen
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violet
+STR_CONFIG_SETTING_SCROLLMODE :Bekijk scrollgedrag: {STRING}
+STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Gedrag tijdens het scrollen van de kaart
+STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Verplaats kijkvenster met RMB, muispositie staat vast
+STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Verplaats kaart met RMB, muispositie staat vast
+STR_CONFIG_SETTING_SCROLLMODE_RMB :Verplaats kaart met RMB
+STR_CONFIG_SETTING_SCROLLMODE_LMB :Verplaats kaart met LMB
STR_CONFIG_SETTING_SMOOTH_SCROLLING :Vloeiend scrollen kijkvenster: {STRING}
-STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Bepalen hoe de hoofdweergave schuift naar een specifieke positie bij het klikken op de minikaart of bij de afgifte van een opdracht om naar een specifiek object op de kaart. Indien ingeschakeld, de viewport scrollt soepel, als deze uitgeschakeld gaat u rechtstreeks naar de beoogde plek
+STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Bepalen hoe de hoofdweergave naar een specifieke positie schuift bij het klikken op de minikaart of bij het uitvoeren van een commando om naar een specifiek object op de kaart te scrollen. Indien ingeschakeld, dan scrollt het kijkvenster soepel, als deze uitgeschakeld gaat u rechtstreeks naar de beoogde plek
STR_CONFIG_SETTING_MEASURE_TOOLTIP :Toon dimensie-informatie bij het gebruik van diverse bouwgereedschappen: {STRING}
STR_CONFIG_SETTING_MEASURE_TOOLTIP_HELPTEXT :Geef tegelafstanden en hoogteverschillen weer bij het slepen tijdens het bouwen
STR_CONFIG_SETTING_LIVERIES :Laat alle voertuigkleuren zien: {STRING}
@@ -1503,7 +1515,7 @@ STR_CONFIG_SETTING_NEWS_CHANGES_ACCEPTANCE_HELPTEXT :Toon een berich
STR_CONFIG_SETTING_NEWS_SUBSIDIES :Subsidies: {STRING}
STR_CONFIG_SETTING_NEWS_SUBSIDIES_HELPTEXT :Toon een krant over subsidie gerelateerde gebeurtenissen
STR_CONFIG_SETTING_NEWS_GENERAL_INFORMATION :Algemene informatie: {STRING}
-STR_CONFIG_SETTING_NEWS_GENERAL_INFORMATION_HELPTEXT :Weergave krant over algemene gebeurtenissen, zoals de aankoop van exclusieve rechten of financiering van weg-reconstructie
+STR_CONFIG_SETTING_NEWS_GENERAL_INFORMATION_HELPTEXT :Geef krant weer over algemene gebeurtenissen, zoals de aankoop van exclusieve rechten of financiering van wegherstelling
STR_CONFIG_SETTING_NEWS_MESSAGES_OFF :Uit
STR_CONFIG_SETTING_NEWS_MESSAGES_SUMMARY :Samengevat
@@ -1511,7 +1523,7 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Volledig
STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Kleurenfoto's komen in: {STRING}
STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Jaar dat de krant aankondigt in kleur te gaan afdrukken. Voor dit jaar wordt zwart-wit gebruikt
-STR_CONFIG_SETTING_STARTING_YEAR :Beginjaar: {STRING}
+STR_CONFIG_SETTING_STARTING_YEAR :Startjaar: {STRING}
STR_CONFIG_SETTING_SMOOTH_ECONOMY :Vloeiende economie inschakelen (meer, kleinere veranderingen): {STRING}
STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Wanneer ingeschakeld, industrie produktie verandert vaker en in kleinere stappen. Deze instelling heeft meestal geen effect, als de industrie soorten worden geleverd door een NewGRF
STR_CONFIG_SETTING_ALLOW_SHARES :Sta het kopen van aandelen van andere bedrijven toe: {STRING}
@@ -1729,7 +1741,7 @@ STR_INTRO_SCENARIO_EDITOR :{BLACK}Scenario
STR_INTRO_MULTIPLAYER :{BLACK}Multiplayer
STR_INTRO_GAME_OPTIONS :{BLACK}Spelopties
-STR_INTRO_HIGHSCORE :{BLACK}Score tabel
+STR_INTRO_HIGHSCORE :{BLACK}Scoretabel
STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Instellingen
STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF-instellingen
STR_INTRO_ONLINE_CONTENT :{BLACK}Online inhoud zoeken
@@ -1741,7 +1753,7 @@ STR_INTRO_TOOLTIP_LOAD_GAME :{BLACK}Laad een
STR_INTRO_TOOLTIP_PLAY_HEIGHTMAP :{BLACK}Start een nieuw spel, gebruik een hoogtekaart als landschap
STR_INTRO_TOOLTIP_PLAY_SCENARIO :{BLACK}Start een nieuw spel, gebaseerd op een scenario
STR_INTRO_TOOLTIP_SCENARIO_EDITOR :{BLACK}Maak een eigen spelwereld/scenario
-STR_INTRO_TOOLTIP_MULTIPLAYER :{BLACK}Start een multiplayer spel
+STR_INTRO_TOOLTIP_MULTIPLAYER :{BLACK}Start een multiplayerspel
STR_INTRO_TOOLTIP_TEMPERATE :{BLACK}Kies gematigd klimaat
STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Kies subarctisch klimaat
@@ -1749,7 +1761,7 @@ STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Kies sub
STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Kies speelgoedlandschap
STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Toon spelopties
-STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Toon score tabel
+STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Toon scoretabel
STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Scherminstellingen
STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Toon NewGRF-instellingen
STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Zoeken naar nieuwe en aangepaste inhoud om te downloaden
@@ -1809,7 +1821,7 @@ STR_LIVERY_TRAIN_TOOLTIP :{BLACK}Toon kle
STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Toon kleurenschema's voor wegvoertuigen
STR_LIVERY_SHIP_TOOLTIP :{BLACK}Toon kleurenschema's voor schepen
STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Toon kleurenschema's voor vliegtuigen
-STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Kies de hoofdkleur voor het geselecteerde schema. Ctrl+klik deze kleu bij alle schema's gebruiken
+STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Kies de hoofdkleur voor het geselecteerde schema. Ctrl+klik zal deze kleur instellen voor elk schema
STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Kies de tweede kleur voor het geselecteerde schema. Ctrl+klik om deze kleur in alle schema's te gebruiken
STR_LIVERY_PANEL_TOOLTIP :{BLACK}Kies een kleurenschema om te wijzigen, of meerdere schema's met Ctrl+klik. Vink de keuzevakjes aan/uit om het gebruik van het schema aan/uit te zetten
@@ -1817,8 +1829,8 @@ STR_LIVERY_DEFAULT :Standaard kleur
STR_LIVERY_STEAM :Stoomlocomotief
STR_LIVERY_DIESEL :Diesellocomotief
STR_LIVERY_ELECTRIC :Elektrische locomotief
-STR_LIVERY_MONORAIL :Monorail-locomotief
-STR_LIVERY_MAGLEV :Zweeftrein-locomotief
+STR_LIVERY_MONORAIL :Monoraillocomotief
+STR_LIVERY_MAGLEV :Zweeftreinlocomotief
STR_LIVERY_DMU :Dieseltreinstel
STR_LIVERY_EMU :Elektrisch treinstel
STR_LIVERY_PASSENGER_WAGON_STEAM :Passagierswagon (Stoom)
@@ -1898,7 +1910,7 @@ STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Verander
# Network server list
STR_NETWORK_SERVER_LIST_CAPTION :{WHITE}Multiplayer
STR_NETWORK_SERVER_LIST_ADVERTISED :{BLACK}Openbaar
-STR_NETWORK_SERVER_LIST_ADVERTISED_TOOLTIP :{BLACK}Kies tussen een openbaar (internet) en een niet openbaar (Local Area Network, LAN) spel
+STR_NETWORK_SERVER_LIST_ADVERTISED_TOOLTIP :{BLACK}Kies tussen een openbaar (internet) en een niet-openbaar (Local Area Network, LAN) spel
STR_NETWORK_SERVER_LIST_ADVERTISED_NO :Nee
STR_NETWORK_SERVER_LIST_ADVERTISED_YES :Ja
STR_NETWORK_SERVER_LIST_PLAYER_NAME :{BLACK}Spelersnaam:
@@ -1952,10 +1964,10 @@ STR_NETWORK_SERVER_LIST_PLAYER_NAME_OSKTITLE :{BLACK}Vul je n
STR_NETWORK_SERVER_LIST_ENTER_IP :{BLACK}Voer het IP-adres van de server in
# Start new multiplayer server
-STR_NETWORK_START_SERVER_CAPTION :{WHITE}Start nieuw multiplayer spel
+STR_NETWORK_START_SERVER_CAPTION :{WHITE}Start nieuw multiplayerspel
STR_NETWORK_START_SERVER_NEW_GAME_NAME :{BLACK}Spelnaam:
-STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}De spelnaam wordt weergegeven aan andere spelers in het multiplayer-spelselectie menu
+STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}De spelnaam wordt weergegeven aan andere spelers in het multiplayerspelselectiemenu
STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Kies wachtwoord
STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Bescherm je spel met een wachtwoord als je niet wilt dat deze algemeen toegankelijk is
@@ -1973,7 +1985,7 @@ STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Beperk d
STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Gesproken taal:
STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Andere spelers zullen weten welke taal er wordt gesproken op de server
-STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Geef de naam van het netwerk spel
+STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Geef de naam van het netwerkspel
# Network game languages
############ Leave those lines in this order!!
@@ -2009,7 +2021,7 @@ STR_NETWORK_LANG_UKRAINIAN :Oekraïens
STR_NETWORK_LANG_AFRIKAANS :Afrikaans
STR_NETWORK_LANG_CROATIAN :Kroatisch
STR_NETWORK_LANG_CATALAN :Catalaans
-STR_NETWORK_LANG_ESTONIAN :Ests
+STR_NETWORK_LANG_ESTONIAN :Estisch
STR_NETWORK_LANG_GALICIAN :Galiciaans
STR_NETWORK_LANG_GREEK :Grieks
STR_NETWORK_LANG_LATVIAN :Lets
@@ -2023,7 +2035,7 @@ STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Een lijs
STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}BEDRIJFSINFORMATIE
STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Bedrijfsnaam: {WHITE}{STRING}
-STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Begonnen in: {WHITE}{NUM}
+STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Gestart in: {WHITE}{NUM}
STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Bedrijfswaarde: {WHITE}{CURRENCY_LONG}
STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Huidige kas: {WHITE}{CURRENCY_LONG}
STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Inkomen vorig jaar: {WHITE}{CURRENCY_LONG}
@@ -2047,8 +2059,8 @@ STR_NETWORK_CONNECTING_CAPTION :{WHITE}Verbinde
STR_NETWORK_CONNECTING_1 :{BLACK}(1/6) Verbinden...
STR_NETWORK_CONNECTING_2 :{BLACK}(2/6) Inloggen...
STR_NETWORK_CONNECTING_3 :{BLACK}(3/6) Wachten...
-STR_NETWORK_CONNECTING_4 :{BLACK}(4/6) Downloaden kaart...
-STR_NETWORK_CONNECTING_5 :{BLACK}(5/6) Verwerken gegevens...
+STR_NETWORK_CONNECTING_4 :{BLACK}(4/6) Kaart downloaden...
+STR_NETWORK_CONNECTING_5 :{BLACK}(5/6) Gegevens verwerken...
STR_NETWORK_CONNECTING_6 :{BLACK}(6/6) Registreren...
STR_NETWORK_CONNECTING_SPECIAL_1 :{BLACK}Spelinformatie ophalen...
@@ -2108,20 +2120,20 @@ STR_NETWORK_CHAT_TO_COMPANY :[Team] Aan {STR
STR_NETWORK_CHAT_CLIENT :[Privé] {STRING}: {WHITE}{STRING}
STR_NETWORK_CHAT_TO_CLIENT :[Privé] Aan {STRING}: {WHITE}{STRING}
STR_NETWORK_CHAT_ALL :[Iedereen] {STRING}: {WHITE}{STRING}
-STR_NETWORK_CHAT_OSKTITLE :{BLACK}Geef de tekst voor de netwerk-chat
+STR_NETWORK_CHAT_OSKTITLE :{BLACK}Geef tekst voor netwerkchat
# Network messages
STR_NETWORK_ERROR_NOTAVAILABLE :{WHITE}Geen netwerkapparaten gevonden of gecompileerd zonder ENABLE_NETWORK
STR_NETWORK_ERROR_NOSERVER :{WHITE}Kon geen enkel netwerkspel vinden
STR_NETWORK_ERROR_NOCONNECTION :{WHITE}De server beantwoordde het verzoek niet
-STR_NETWORK_ERROR_NEWGRF_MISMATCH :{WHITE}Kan geen verbinding maken, je hebt niet dezelfde NewGRF bestanden als de server
+STR_NETWORK_ERROR_NEWGRF_MISMATCH :{WHITE}Kan geen verbinding maken, je hebt niet dezelfde NewGRF-bestanden als de server
STR_NETWORK_ERROR_DESYNC :{WHITE}Synchronisatie van netwerkspel mislukt
STR_NETWORK_ERROR_LOSTCONNECTION :{WHITE}Verbinding met netwerkspel kwijt
STR_NETWORK_ERROR_SAVEGAMEERROR :{WHITE}Kon opgeslagen spel niet laden
STR_NETWORK_ERROR_SERVER_START :{WHITE}Kan server niet starten
STR_NETWORK_ERROR_CLIENT_START :{WHITE}Kan geen verbinding maken
STR_NETWORK_ERROR_TIMEOUT :{WHITE}Verbinding #{NUM} duurde te lang
-STR_NETWORK_ERROR_SERVER_ERROR :{WHITE}Er is een protocolfout gemaakt en onze verbinding is gesloten
+STR_NETWORK_ERROR_SERVER_ERROR :{WHITE}Er is een protocolfout gedetecteerd en de verbinding werd gesloten
STR_NETWORK_ERROR_WRONG_REVISION :{WHITE}De revisie van deze client komt niet overeen met de revisie van de server
STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Ongeldig wachtwoord
STR_NETWORK_ERROR_SERVER_FULL :{WHITE}De server is vol
@@ -2130,9 +2142,9 @@ STR_NETWORK_ERROR_KICKED :{WHITE}Je bent
STR_NETWORK_ERROR_CHEATER :{WHITE}Valsspelen is niet toegestaan op deze server
STR_NETWORK_ERROR_TOO_MANY_COMMANDS :{WHITE}Je stuurde te veel commando's naar de server
STR_NETWORK_ERROR_TIMEOUT_PASSWORD :{WHITE}Het invoeren van het wachtwoord duurde te lang
-STR_NETWORK_ERROR_TIMEOUT_COMPUTER :{WHITE}Het duurde jouw computer te lang totdat uw computer zich aanmeldde
-STR_NETWORK_ERROR_TIMEOUT_MAP :{WHITE}Het duurde jouw computer te lang om de kaart te downloaden
-STR_NETWORK_ERROR_TIMEOUT_JOIN :{WHITE}Het duurde jouw computer te lang om met de server te verbinden
+STR_NETWORK_ERROR_TIMEOUT_COMPUTER :{WHITE}Uw computer is te traag om de server bij te houden
+STR_NETWORK_ERROR_TIMEOUT_MAP :{WHITE}Uw computer deed er te lang over om de kaart te downloaden
+STR_NETWORK_ERROR_TIMEOUT_JOIN :{WHITE}Uw computer deed er te lang over om met de server te verbinden
############ Leave those lines in this order!!
STR_NETWORK_ERROR_CLIENT_GENERAL :algemene fout
@@ -2152,7 +2164,7 @@ STR_NETWORK_ERROR_CLIENT_CHEATER :probeerde vals
STR_NETWORK_ERROR_CLIENT_SERVER_FULL :server is vol
STR_NETWORK_ERROR_CLIENT_TOO_MANY_COMMANDS :stuurde te veel commando's
STR_NETWORK_ERROR_CLIENT_TIMEOUT_PASSWORD :wachtwoord niet op tijd ontvangen
-STR_NETWORK_ERROR_CLIENT_TIMEOUT_COMPUTER :algemene timeout
+STR_NETWORK_ERROR_CLIENT_TIMEOUT_COMPUTER :algemene time-out
STR_NETWORK_ERROR_CLIENT_TIMEOUT_MAP :downloaden van de kaart duurde te lang
STR_NETWORK_ERROR_CLIENT_TIMEOUT_JOIN :verwerken van de kaart duurde te lang
############ End of leave-in-this-order
@@ -2167,12 +2179,12 @@ STR_NETWORK_SERVER_MESSAGE_GAME_PAUSED :Spel gepauzeerd
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_1 :Spel nog steeds gepauzeerd ({STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_2 :Spel nog steeds gepauzeerd ({STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_3 :Spel nog steeds gepauzeerd ({STRING}, {STRING}, {STRING})
-STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_4 :Spel is nog steeds gepauzeerd ({STRING}, {STRING}, {STRING}, {STRING})
+STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_4 :Spel nog steeds gepauzeerd ({STRING}, {STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED :Spel vervolgd ({STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :aantal spelers
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :spelers maken verbinding
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :handmatig
-STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :spel script
+STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :spelscript
############ End of leave-in-this-order
STR_NETWORK_MESSAGE_CLIENT_LEAVING :vertrekt
STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} heeft zich bij het spel gevoegd
@@ -2184,8 +2196,8 @@ STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} he
STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} heeft zijn/haar naam gewijzigd naar {STRING}
STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} gaf je bedrijf {2:CURRENCY_LONG}
STR_NETWORK_MESSAGE_GAVE_MONEY_AWAY :*** Je gaf {2:CURRENCY_LONG} aan {1:STRING}
-STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}De server heeft de sessie gestopt
-STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}De server wordt opnieuw gestart...{}Wacht aub...
+STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}De server heeft de sessie gesloten
+STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}De server wordt opnieuw gestart...{}Wacht alstublieft...
# Content downloading window
STR_CONTENT_TITLE :{WHITE}Download extra content
@@ -2256,7 +2268,7 @@ STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_FILE_NOT_WRITABLE :{WHITE}... best
STR_CONTENT_ERROR_COULD_NOT_EXTRACT :{WHITE}Kon gedownload bestand niet uitpakken
STR_MISSING_GRAPHICS_SET_CAPTION :{WHITE}Ontbrekende graphics
-STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD heeft graphics nodig om te kunnen werken, maar er konden er geen gevonden worden. Wilt u toestaan dat OpenTTD graphics downloadt en installeert?
+STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD heeft graphics nodig om te kunnen werken, maar er konden er geen gevonden worden. Staat u toe dat OpenTTD deze graphics downloadt en installeert?
STR_MISSING_GRAPHICS_YES_DOWNLOAD :{BLACK}Ja, download de graphics
STR_MISSING_GRAPHICS_NO_QUIT :{BLACK}Nee, OpenTTD afsluiten
@@ -2274,10 +2286,11 @@ STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Schakel
STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Maak objecten onzichtbaar in plaats van transparant
# Linkgraph legend window
-STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Vracht Stroom Legenda
+STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Vrachtstroomlegende
STR_LINKGRAPH_LEGEND_ALL :{BLACK}Alle
STR_LINKGRAPH_LEGEND_NONE :{BLACK}Geen
STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Selecteer weer te geven bedrijven
+STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY}
# Linkgraph legend window and linkgraph legend in smallmap
STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}ongebruikt
@@ -2303,8 +2316,8 @@ STR_JOIN_WAYPOINT_CREATE_SPLITTED_WAYPOINT :{YELLOW}Bouw ee
# Rail construction toolbar
STR_RAIL_TOOLBAR_RAILROAD_CONSTRUCTION_CAPTION :Bouw spoorwegen
STR_RAIL_TOOLBAR_ELRAIL_CONSTRUCTION_CAPTION :Bouw geëlektrificeerde spoorwegen
-STR_RAIL_TOOLBAR_MONORAIL_CONSTRUCTION_CAPTION :Bouw monorail-spoorwegen
-STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Bouw magneetzweeftrein-spoorwegen
+STR_RAIL_TOOLBAR_MONORAIL_CONSTRUCTION_CAPTION :Bouw monorailspoorwegen
+STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Bouw magneetzweeftreinspoorwegen
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Plaats spoor. Ctrl schakelt tussen bouwen/verwijderen van het spoor. Shift schakelt tussen bouwen/inschatting van de kosten
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Bouw spoor met de Autorail-methode. Ctrl schakelt tussen bouwen/verwijderen van het spoor. Shift schakelt tussen bouwen/inschatting van de kosten
@@ -2318,7 +2331,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Kies tus
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Verander spoortype. Shift schakelt tussen bouwen/inschatting van de kosten
STR_RAIL_NAME_RAILROAD :Spoorweg
-STR_RAIL_NAME_ELRAIL :Spoorweg met bovenleiding
+STR_RAIL_NAME_ELRAIL :Geëlektrificeerde spoorweg
STR_RAIL_NAME_MONORAIL :Monorail
STR_RAIL_NAME_MAGLEV :Zweeftrein
@@ -2355,9 +2368,9 @@ STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Uitgangs
STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TOOLTIP :{BLACK}Combinatiesein (armsein){}Het combinatiesein gedraagt zich als zowel ingangs- als uitgangssein. Zo kun je grote netwerken van beginseinen maken
STR_BUILD_SIGNAL_SEMAPHORE_PBS_TOOLTIP :{BLACK}Routesein (armsein){}Een routesein laat meer dan één trein tegelijk in een seinblok toe als de trein een route kan reserveren naar een veilige stopplaats. Routeseinen kunnen van achteren worden gepasseerd
STR_BUILD_SIGNAL_SEMAPHORE_PBS_OWAY_TOOLTIP :{BLACK}Eenrichtingsrouteseinen (armsein){}Een routesein laat meer dan één trein tegelijk in een seinblok toe als de trein een route kan reserveren naar een veilige stopplaats. Eenrichtingsrouteseinen kunnen niet van achteren worden gepasseerd
-STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP :{BLACK}Standaard sein (elektrisch){}Seinen zijn nodig om te voorkomen dat treinen botsen bij netwerken met meer dan één trein
+STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP :{BLACK}Standaardsein (elektrisch){}Seinen zijn nodig om te voorkomen dat treinen botsen bij netwerken met meer dan één trein
STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP :{BLACK}Ingangssein (elektrisch){}Groen als er meer dan één groen uitgangssein is in de volgende sectie. Anders is deze rood
-STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Uitgangssein (elektrisch){}Gedraagt zich hetzelfde als een standaard sein, maar is nodig om ingangs- & combinatie-seinen aan te sturen
+STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Uitgangssein (elektrisch){}Gedraagt zich hetzelfde als een standaardsein, maar is nodig om ingangs- & combinatie-seinen aan te sturen
STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Combinatiesein (elektrisch){}Het combinatiesein gedraagt zich als zowel ingangs- als uitgangssein. Zo kun je grote netwerken van beginseinen maken
STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Routeseinen (elektrisch){}Een routesein laat meer dan één trein tegelijk op een seinblok toe als de trein een route kan reserveren naar een veilige stopplaats. Routeseinen kunnen van achteren worden gepasseerd
STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Eenrichtingsrouteseinen (elektrisch){}Een routesein laat meer dan één trein tegelijk op een seinblok toe als de trein een route kan reserveren naar een veilige stopplaats. Eenrichtingsrouteseinen kunnen niet van achteren worden gepasseerd
@@ -2368,13 +2381,13 @@ STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Vergroot
# Bridge selection window
STR_SELECT_RAIL_BRIDGE_CAPTION :{WHITE}Kies type spoorbrug
-STR_SELECT_ROAD_BRIDGE_CAPTION :{WHITE}Kies type brug
+STR_SELECT_ROAD_BRIDGE_CAPTION :{WHITE}Kies type wegbrug
STR_SELECT_BRIDGE_SELECTION_TOOLTIP :{BLACK}Brugkeuze - klik op de gewenste brug om die te bouwen
STR_SELECT_BRIDGE_INFO :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY_LONG}
STR_SELECT_BRIDGE_SCENEDIT_INFO :{GOLD}{STRING},{} {VELOCITY}
STR_BRIDGE_NAME_SUSPENSION_STEEL :Hangend, Staal
STR_BRIDGE_NAME_GIRDER_STEEL :Koker, Staal
-STR_BRIDGE_NAME_CANTILEVER_STEEL :Cantilever, Staal
+STR_BRIDGE_NAME_CANTILEVER_STEEL :Vrijdragend, Staal
STR_BRIDGE_NAME_SUSPENSION_CONCRETE :Hangend, Beton
STR_BRIDGE_NAME_WOODEN :Hout
STR_BRIDGE_NAME_CONCRETE :Beton
@@ -2384,24 +2397,24 @@ STR_BRIDGE_TUBULAR_SILICON :Buis, Silicium
# Road construction toolbar
STR_ROAD_TOOLBAR_ROAD_CONSTRUCTION_CAPTION :{WHITE}Bouw wegen
-STR_ROAD_TOOLBAR_TRAM_CONSTRUCTION_CAPTION :{WHITE}Bouw tramwegen
+STR_ROAD_TOOLBAR_TRAM_CONSTRUCTION_CAPTION :{WHITE}Bouw tramsporen
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Bouw weg. Ctrl schakelt tussen bouwen/verwijderen van de weg. Shift schakelt tussen bouwen/inschatting van de kosten
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Bouw tramrails. Ctrl schakelt tussen bouwen/verwijderen van tramrails. Shift schakelt tussen bouwen/inschatting van de kosten
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Bouw tramsporen. Ctrl schakelt tussen bouwen/verwijderen van tramsporen. Shift schakelt tussen bouwen/inschatting van de kosten
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Bouw weg met de Autoroad-methode. Ctrl schakelt tussen bouwen/verwijderen van de weg. Shift schakelt tussen bouwen/inschatting van de kosten
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Bouw tramrails met de Autotram-methode. Ctrl schakelt tussen bouwen/verwijderen van tramrails. Shift schakelt tussen bouwen/inschatting van de kosten
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Bouw tramsporen met de Autotram-methode. Ctrl schakelt tussen bouwen/verwijderen van tramrails. Shift schakelt tussen bouwen/inschatting van de kosten
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Bouw garage (voor het kopen en onderhouden van wegvoertuigen). Shift schakelt tussen bouwen/inschatting van de kosten
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Bouw tramdepot (voor het kopen en onderhouden van trams). Shift schakelt tussen bouwen/inschatting van de kosten
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Bouw bushalte. Houd Ctrl ingedrukt om samen te voegen met ander station. Shift schakelt tussen bouwen/inschatting van de kosten
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Bouw passagiertramhalte. Houd Ctrl ingedrukt om samen te voegen met ander station. Shift schakelt tussen bouwen/inschatting van de kosten
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Bouw passagierstramhalte. Houd Ctrl ingedrukt om samen te voegen met ander station. Shift schakelt tussen bouwen/inschatting van de kosten
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Bouw vrachtwagenlaadhal. Houd Ctrl ingedrukt om samen te voegen met ander station. Shift schakelt tussen bouwen/inschatting van de kosten
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Bouw vrachttramhalte. Houd Ctrl ingedrukt om samen te voegen met ander station. Shift schakelt tussen bouwen/inschatting van de kosten
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Activeer/Deactiveer eenrichtingsverkeer
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Bouw viaduct. Shift schakelt tussen bouwen/inschatting van de kosten
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Bouw brug voor tramrails. Shift schakelt tussen bouwen/inschatting van de kosten
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Bouw wegbrug. Shift schakelt tussen bouwen/inschatting van de kosten
+STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Bouw brug voor tramsporen. Shift schakelt tussen bouwen/inschatting van de kosten
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Bouw wegtunnel. Shift schakelt tussen bouwen/inschatting van de kosten
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Bouw tramtunnel. Shift schakelt tussen bouwen/inschatting van de kosten
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Kies tussen bouwen en verwijderen bij wegenbouw
-STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Kies tussen bouwen en verwijderen bij tramrailaanleg
+STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Kies tussen bouwen en verwijderen bij tramspooraanleg
# Road depot construction window
STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION :{WHITE}Richting van garage
@@ -2445,12 +2458,12 @@ STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP :{BLACK}Bouw vli
# Airport construction window
STR_STATION_BUILD_AIRPORT_CAPTION :{WHITE}Keuze van vliegveld
STR_STATION_BUILD_AIRPORT_TOOLTIP :{BLACK}Kies grootte en type van vliegveld
-STR_STATION_BUILD_AIRPORT_CLASS_LABEL :{BLACK}Vliegveld klasse
+STR_STATION_BUILD_AIRPORT_CLASS_LABEL :{BLACK}Vliegveldklasse
STR_STATION_BUILD_AIRPORT_LAYOUT_NAME :{BLACK}Layout {NUM}
STR_AIRPORT_SMALL :Klein
STR_AIRPORT_CITY :Stad
-STR_AIRPORT_METRO :Hoofdstedelijk
+STR_AIRPORT_METRO :Grootstedelijk
STR_AIRPORT_INTERNATIONAL :Internationaal vliegveld
STR_AIRPORT_COMMUTER :Pendel
STR_AIRPORT_INTERCONTINENTAL :Intercontinentaal
@@ -2480,11 +2493,11 @@ STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Bekijk h
STR_OBJECT_BUILD_SIZE :{BLACK}Grootte: {GOLD}{NUM} x {NUM} tegels
STR_OBJECT_CLASS_LTHS :Vuurtorens
-STR_OBJECT_CLASS_TRNS :Zender
+STR_OBJECT_CLASS_TRNS :Zendmasten
# Tree planting window (last two for SE only)
STR_PLANT_TREE_CAPTION :{WHITE}Bomen
-STR_PLANT_TREE_TOOLTIP :{BLACK}Kies een soort boom om te planten. Als de tegel al bomen bevat zullen er meer bomen van verschillende types bij komen, onafhankelijk van het geselecteerde type.
+STR_PLANT_TREE_TOOLTIP :{BLACK}Kies een soort boom om te planten. Als de tegel al bomen bevat, zullen er meer bomen van verschillende types bijkomen, onafhankelijk van het geselecteerde type.
STR_TREES_RANDOM_TYPE :{BLACK}Willekeurige soorten bomen
STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Plant bomen van willekeurige soort. Shift+klik wisselt tussen bouwen/toont verwachte kosten
STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Willekeurige bomen
@@ -2572,21 +2585,21 @@ STR_LAND_AREA_INFORMATION_OWNER_N_A :Geen
STR_LAND_AREA_INFORMATION_OWNER :{BLACK}Eigenaar: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_ROAD_OWNER :{BLACK}Eigenaar van weg: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Eigenaar van tramrails: {LTBLUE}{STRING}
-STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Spoorweg eigenaar: {LTBLUE}{STRING}
+STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Eigenaar van spoorweg: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Gemeente: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Geen
STR_LAND_AREA_INFORMATION_LANDINFO_COORDS :{BLACK}Coördinaten: {LTBLUE}{NUM} x {NUM} x {NUM} ({STRING})
STR_LAND_AREA_INFORMATION_BUILD_DATE :{BLACK}Bouwjaar: {LTBLUE}{DATE_LONG}
STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Stationsklasse: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Stationstype: {LTBLUE}{STRING}
-STR_LAND_AREA_INFORMATION_AIRPORT_CLASS :{BLACK}Vliegveld klasse: {LTBLUE}{STRING}
-STR_LAND_AREA_INFORMATION_AIRPORT_NAME :{BLACK}Vliegveld naam: {LTBLUE}{STRING}
-STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Vliegveld tegel naam: {LTBLUE}{STRING}
+STR_LAND_AREA_INFORMATION_AIRPORT_CLASS :{BLACK}Vliegveldklasse: {LTBLUE}{STRING}
+STR_LAND_AREA_INFORMATION_AIRPORT_NAME :{BLACK}Vliegveldnaam: {LTBLUE}{STRING}
+STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Vliegveldtegelnaam: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Geaccepteerde vracht: {LTBLUE}
STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING})
-STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Rail type: {LTBLUE}{STRING}
-STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Spoor snelheidslimiet: {LTBLUE}{VELOCITY}
+STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Spoortype: {LTBLUE}{STRING}
+STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Spoorsnelheidslimiet: {LTBLUE}{VELOCITY}
STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Snelheidslimiet weg: {LTBLUE}{VELOCITY}
# Description of land area of different tiles
@@ -2598,35 +2611,35 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Akkers
STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Sneeuw
STR_LAI_CLEAR_DESCRIPTION_DESERT :Woestijn
-STR_LAI_RAIL_DESCRIPTION_TRACK :Spoorweg spoor
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Spoorweg spoor met blokseinen
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Spoorweg spoor met voorseinen
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Spoorweg spoor met exitseinen
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Spoorweg spoor met combo-seinen
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Spoorweg spoor met routeseinen
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Spoorweg spoor met eenrichtingsseinen
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Spoorweg spoor met blok en voorseinen
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Spoorweg spoor met blok en exitseinen
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Spoorweg spoor met blok en combo-seinen
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Spoorweg spoor met blok en routeseinen
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Spoorweg spoor met blok en eenrichtingsseinen
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Spoorweg spoor met voor- en exitseinen
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Spoorweg spoor met voor- en combo-seinen
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Spoorweg spoor met voor- en routeseinen
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Spoorweg spoor met voor- en eenrichtingsseinen
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Spoorweg spoor met exit- en combo-seinen
+STR_LAI_RAIL_DESCRIPTION_TRACK :Spoor
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Spoor met blokseinen
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Spoor met voorseinen
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Spoor met uitgangsseinen
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Spoor met combinatieseinen
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Spoor met routeseinen
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Spoor met eenrichtingsseinen
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Spoor met blok- en voorseinen
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Spoor met blok- en uitgangsseinen
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Spoor met blok- en combinatieseinen
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Spoor met blok- en routeseinen
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Spoor met blok- en eenrichtingsseinen
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Spoor met voor- en uitgangsseinen
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Spoor met voor- en combinatieseinen
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Spoor met voor- en routeseinen
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Spoor met voor- en eenrichtingsseinen
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Spoor met uitgangs- en combinatieseinen
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Spoorweg spoor met exit- en routeseinen
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Spoorweg spoor met exit- en eenrichtingsseinen
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Spoorweg spoor met combo- en routeseinen
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Spoorweg Spoor met combo- en eenrichtingssein
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Spoorweg spoor met route en eenrichtingssein
-STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Spoorweg trein depot
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Spoor met uitgangs- en eenrichtingsseinen
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Spoor met combinatie- en routeseinen
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Spoor met combinatie- en eenrichtingsseinen
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Spoor met route- en eenrichtingsseinen
+STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Spoorwegtreindepot
STR_LAI_ROAD_DESCRIPTION_ROAD :Weg
STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Weg met straatlantaarns
STR_LAI_ROAD_DESCRIPTION_TREE_LINED_ROAD :Weg met bomenrij
STR_LAI_ROAD_DESCRIPTION_ROAD_VEHICLE_DEPOT :Garage
-STR_LAI_ROAD_DESCRIPTION_ROAD_RAIL_LEVEL_CROSSING :Gelijkvloerse overweg
+STR_LAI_ROAD_DESCRIPTION_ROAD_RAIL_LEVEL_CROSSING :Gelijkvloerse kruising met weg/spoor
STR_LAI_ROAD_DESCRIPTION_TRAMWAY :Tramrails
# Houses come directly from their building names
@@ -2657,21 +2670,21 @@ STR_LAI_WATER_DESCRIPTION_SHIP_DEPOT :Dok
STR_LAI_TUNNEL_DESCRIPTION_RAILROAD :Spoortunnel
STR_LAI_TUNNEL_DESCRIPTION_ROAD :Wegtunnel
-STR_LAI_BRIDGE_DESCRIPTION_RAIL_SUSPENSION_STEEL :Stalen hangbrug (spoor)
-STR_LAI_BRIDGE_DESCRIPTION_RAIL_GIRDER_STEEL :Stalen kokerbrug (spoor)
-STR_LAI_BRIDGE_DESCRIPTION_RAIL_CANTILEVER_STEEL :Stalen cantileverbrug (spoor)
-STR_LAI_BRIDGE_DESCRIPTION_RAIL_SUSPENSION_CONCRETE :Hangbrug van gewapend beton (spoor)
-STR_LAI_BRIDGE_DESCRIPTION_RAIL_WOODEN :Houten brug (spoor)
-STR_LAI_BRIDGE_DESCRIPTION_RAIL_CONCRETE :Betonnen brug (spoor)
-STR_LAI_BRIDGE_DESCRIPTION_RAIL_TUBULAR_STEEL :Buisvormige brug (spoor)
+STR_LAI_BRIDGE_DESCRIPTION_RAIL_SUSPENSION_STEEL :Stalen hangende spoorbrug
+STR_LAI_BRIDGE_DESCRIPTION_RAIL_GIRDER_STEEL :Spoorbrug met stalen koker
+STR_LAI_BRIDGE_DESCRIPTION_RAIL_CANTILEVER_STEEL :Stalen vrijdragende spoorbrug
+STR_LAI_BRIDGE_DESCRIPTION_RAIL_SUSPENSION_CONCRETE :Hangende spoorbrug van gewapend beton
+STR_LAI_BRIDGE_DESCRIPTION_RAIL_WOODEN :Houten spoorbrug
+STR_LAI_BRIDGE_DESCRIPTION_RAIL_CONCRETE :Betonnen spoorbrug
+STR_LAI_BRIDGE_DESCRIPTION_RAIL_TUBULAR_STEEL :Buisvormige spoorbrug
-STR_LAI_BRIDGE_DESCRIPTION_ROAD_SUSPENSION_STEEL :Stalen hangbrug (weg)
-STR_LAI_BRIDGE_DESCRIPTION_ROAD_GIRDER_STEEL :Stalen kokerbrug (weg)
-STR_LAI_BRIDGE_DESCRIPTION_ROAD_CANTILEVER_STEEL :Stalen cantileverbrug (weg)
-STR_LAI_BRIDGE_DESCRIPTION_ROAD_SUSPENSION_CONCRETE :Hangbrug van gewapend beton (weg)
-STR_LAI_BRIDGE_DESCRIPTION_ROAD_WOODEN :Houten brug (weg)
-STR_LAI_BRIDGE_DESCRIPTION_ROAD_CONCRETE :Betonnen brug (weg)
-STR_LAI_BRIDGE_DESCRIPTION_ROAD_TUBULAR_STEEL :Buisvormige brug (weg)
+STR_LAI_BRIDGE_DESCRIPTION_ROAD_SUSPENSION_STEEL :Stalen hangende wegbrug
+STR_LAI_BRIDGE_DESCRIPTION_ROAD_GIRDER_STEEL :Wegbrug met stalen koker
+STR_LAI_BRIDGE_DESCRIPTION_ROAD_CANTILEVER_STEEL :Stalen vrijdragende wegbrug
+STR_LAI_BRIDGE_DESCRIPTION_ROAD_SUSPENSION_CONCRETE :Hangende wegbrug van gewapend beton
+STR_LAI_BRIDGE_DESCRIPTION_ROAD_WOODEN :Houten wegbrug
+STR_LAI_BRIDGE_DESCRIPTION_ROAD_CONCRETE :Betonnen wegbrug
+STR_LAI_BRIDGE_DESCRIPTION_ROAD_TUBULAR_STEEL :Buisvormige wegbrug
STR_LAI_BRIDGE_DESCRIPTION_AQUEDUCT :Aquaduct
@@ -2683,9 +2696,59 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Terrein in bedr
# About OpenTTD window
STR_ABOUT_OPENTTD :{WHITE}Over OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Originele copyright {COPYRIGHT} 1995 Chris Sawyer, alle rechten voorbehouden
-STR_ABOUT_VERSION :{BLACK}OpenTTD versie {REV}
+STR_ABOUT_VERSION :{BLACK}OpenTTD-versie {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 Het OpenTTD-team
+# Framerate display window
+STR_FRAMERATE_CAPTION :{WHITE}Frame rate
+STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} ({DECIMAL}x)
+STR_FRAMERATE_RATE_GAMELOOP :{WHITE}Simulatiesnelheid: {STRING}
+STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP :{BLACK}Aantal gesimuleerde gameticks per seconde.
+STR_FRAMERATE_RATE_BLITTER :{WHITE}Graphics frame rate: {STRING}
+STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}Aantal videoframes die weergegeven worden per seconde.
+STR_FRAMERATE_SPEED_FACTOR :{WHITE}Huidige spelsnelheidsfactor: {DECIMAL}x
+STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Hoe snel het spel momenteel draait, vergeleken met de verwachte snelheid bij een normale simulatiesnelheid.
+STR_FRAMERATE_CURRENT :{WHITE}Huidig
+STR_FRAMERATE_AVERAGE :{WHITE}Gemiddelde
+STR_FRAMERATE_DATA_POINTS :{WHITE}Gegevens gebaseerd op {COMMA} metingen
+STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL}{WHITE} ms
+STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL}{WHITE} ms
+STR_FRAMERATE_MS_BAD :{RED}{DECIMAL}{WHITE} ms
+STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL}{WHITE} frames/s
+STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL}{WHITE} frames/s
+STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL}{WHITE} frames/s
+STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA} ms
+STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} s
+############ Leave those lines in this order!!
+STR_FRAMERATE_GAMELOOP :{WHITE}Gamelooptotaal:
+STR_FRAMERATE_GL_ECONOMY :{WHITE} Cargoafhandeling:
+STR_FRAMERATE_GL_TRAINS :{WHITE} Treinticks:
+STR_FRAMERATE_GL_ROADVEHS :{WHITE} Wegvoertuigticks:
+STR_FRAMERATE_GL_SHIPS :{WHITE} Schipticks:
+STR_FRAMERATE_GL_AIRCRAFT :{WHITE} Vliegtuigticks:
+STR_FRAMERATE_GL_LANDSCAPE :{WHITE} Wereldticks:
+STR_FRAMERATE_GL_LINKGRAPH :{WHITE} Link grafiekvertraging:
+STR_FRAMERATE_DRAWING :{WHITE}Graphics weergeven:
+STR_FRAMERATE_DRAWING_VIEWPORTS :{WHITE} Wereldkijkvensters:
+STR_FRAMERATE_VIDEO :{WHITE}Video-output:
+STR_FRAMERATE_SOUND :{WHITE}Geluid mixen:
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+STR_FRAMETIME_CAPTION_GAMELOOP :Gameloop
+STR_FRAMETIME_CAPTION_GL_ECONOMY :Cargoafhandeling
+STR_FRAMETIME_CAPTION_GL_TRAINS :Treinticks
+STR_FRAMETIME_CAPTION_GL_ROADVEHS :Wegvoertuigticks
+STR_FRAMETIME_CAPTION_GL_SHIPS :Schipticks
+STR_FRAMETIME_CAPTION_GL_AIRCRAFT :Vliegtuigticks
+STR_FRAMETIME_CAPTION_GL_LANDSCAPE :Wereldticks
+STR_FRAMETIME_CAPTION_GL_LINKGRAPH :Link grafiekvertraging
+STR_FRAMETIME_CAPTION_DRAWING :Graphics weergeven
+STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Wereldkijkvenster weergeven
+STR_FRAMETIME_CAPTION_VIDEO :Video-output
+STR_FRAMETIME_CAPTION_SOUND :Geluid mixen
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Spel Opslaan
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Spel Laden
@@ -2703,7 +2766,7 @@ STR_SAVELOAD_SAVE_BUTTON :{BLACK}Opslaan
STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}Sla het huidige spel op onder de gekozen naam
STR_SAVELOAD_LOAD_BUTTON :{BLACK}Laad
STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}Laad het geselecteerde spel
-STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP :{BLACK}Laad de geselecteerd hoogtekaart
+STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP :{BLACK}Laad de geselecteerde hoogtekaart
STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Spel details
STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Geen informatie beschikbaar
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING}
@@ -2723,8 +2786,8 @@ STR_MAPGEN_MAX_HEIGHTLEVEL :{BLACK}Maximum
STR_MAPGEN_MAX_HEIGHTLEVEL_UP :{BLACK}Verhoog de maximum hoogte van bergen op de kaart met één
STR_MAPGEN_MAX_HEIGHTLEVEL_DOWN :{BLACK}Verklein de maximum hoogte van bergen op de kaart met één
STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Hoogte van sneeuwgrens:
-STR_MAPGEN_SNOW_LINE_UP :{BLACK}Verschuif de sneeuwgrens één omhoog
-STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Verschuif de sneeuwgrens één omlaag
+STR_MAPGEN_SNOW_LINE_UP :{BLACK}Verhoog de sneeuwgrens met één
+STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Verlaag de sneeuwgrens met één
STR_MAPGEN_LAND_GENERATOR :{BLACK}Landgenerator:
STR_MAPGEN_TREE_PLACER :{BLACK}Bosalgoritme:
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terreintype:
@@ -2753,7 +2816,7 @@ STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x
STR_MAPGEN_MAX_HEIGHTLEVEL_QUERY_CAPT :{WHITE}Wijzig maximum kaarthoogte
STR_MAPGEN_SNOW_LINE_QUERY_CAPT :{WHITE}Verander hoogte van sneeuwgrens
-STR_MAPGEN_START_DATE_QUERY_CAPT :{WHITE}Verander beginjaar
+STR_MAPGEN_START_DATE_QUERY_CAPT :{WHITE}Verander startjaar
# SE Map generation
STR_SE_MAPGEN_CAPTION :{WHITE}Scenariotype
@@ -2761,8 +2824,8 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Vlak lan
STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Genereer een vlakke kaart
STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Willekeurig land
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Hoogte van vlak land:
-STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Maak de hoogte van vlak land één lager
-STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Maak de hoogte van vlak land één hoger
+STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Verlaag de hoogte van vlak land met één
+STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Verhoog de hoogte van vlak land met één
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_QUERY_CAPT :{WHITE}Verander hoogte van vlak land
@@ -2785,11 +2848,11 @@ STR_GENERATION_PREPARING_GAME :{BLACK}Voorbere
# NewGRF settings
STR_NEWGRF_SETTINGS_CAPTION :{WHITE}NewGRF-instellingen
-STR_NEWGRF_SETTINGS_INFO_TITLE :{WHITE}Gedetaileerde NewGRF informatie
-STR_NEWGRF_SETTINGS_ACTIVE_LIST :{WHITE}Actieve NewGRF bestanden
-STR_NEWGRF_SETTINGS_INACTIVE_LIST :{WHITE}Inactieve NewGRF bestanden
+STR_NEWGRF_SETTINGS_INFO_TITLE :{WHITE}Gedetaileerde NewGRF-informatie
+STR_NEWGRF_SETTINGS_ACTIVE_LIST :{WHITE}Actieve NewGRF-bestanden
+STR_NEWGRF_SETTINGS_INACTIVE_LIST :{WHITE}Inactieve NewGRF-bestanden
STR_NEWGRF_SETTINGS_SELECT_PRESET :{ORANGE}Kies voorkeur:
-STR_NEWGRF_FILTER_TITLE :{ORANGE}Filter tekst:
+STR_NEWGRF_FILTER_TITLE :{ORANGE}Filtertekst:
STR_NEWGRF_SETTINGS_PRESET_LIST_TOOLTIP :{BLACK}Laad de geselecteerde voorkeursinstelling
STR_NEWGRF_SETTINGS_PRESET_SAVE :{BLACK}Bewaar voorkeursinstelling
STR_NEWGRF_SETTINGS_PRESET_SAVE_TOOLTIP :{BLACK}Bewaar de huidige lijst als voorkeursinstelling
@@ -2836,17 +2899,17 @@ STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}Niet compa
STR_SAVE_PRESET_CAPTION :{WHITE}Preset opslaan
STR_SAVE_PRESET_LIST_TOOLTIP :{BLACK}Lijst met beschikbare presets, Kies er één om deze te kopiëren naar de opslagnaam hieronder
STR_SAVE_PRESET_TITLE :{BLACK}Voer een naam in voor de preset
-STR_SAVE_PRESET_EDITBOX_TOOLTIP :{BLACK}Nu gekozen naam voor de preset opslag
+STR_SAVE_PRESET_EDITBOX_TOOLTIP :{BLACK}Huidig gekozen naam voor de preset om op te slaan
STR_SAVE_PRESET_CANCEL :{BLACK}Annuleren
STR_SAVE_PRESET_CANCEL_TOOLTIP :{BLACK}Preset niet wijzigen
STR_SAVE_PRESET_SAVE :{BLACK}Opslaan
-STR_SAVE_PRESET_SAVE_TOOLTIP :{BLACK}Sla de huidige preset op naar de nu gekozen naam
+STR_SAVE_PRESET_SAVE_TOOLTIP :{BLACK}Sla de huidige preset op naar de huidig gekozen naam
# NewGRF parameters window
-STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}NewGRF parameters wijzigen
+STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}NewGRF-parameters wijzigen
STR_NEWGRF_PARAMETERS_CLOSE :{BLACK}Sluiten
STR_NEWGRF_PARAMETERS_RESET :{BLACK}Reset
-STR_NEWGRF_PARAMETERS_RESET_TOOLTIP :{BLACK}Zet alle parameters naar de standaard waarde
+STR_NEWGRF_PARAMETERS_RESET_TOOLTIP :{BLACK}Zet alle parameters naar de standaardwaarde
STR_NEWGRF_PARAMETERS_DEFAULT_NAME :Parameter {NUM}
STR_NEWGRF_PARAMETERS_SETTING :{STRING}: {ORANGE}{STRING}
STR_NEWGRF_PARAMETERS_NUM_PARAM :{LTBLUE}Aantal parameters: {ORANGE}{NUM}
@@ -2858,7 +2921,7 @@ STR_NEWGRF_INSPECT_PARENT_TOOLTIP :{BLACK}Inspecte
STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT :{STRING} bij {HEX}
STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_OBJECT :Object
-STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_RAIL_TYPE :Spoor type
+STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_RAIL_TYPE :Spoortype
STR_NEWGRF_INSPECT_QUERY_CAPTION :{WHITE}NewGRF variable 60+x parameter (hexadecimaal)
@@ -2893,19 +2956,19 @@ STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} is o
STR_NEWGRF_ERROR_INVALID_PARAMETER :Ongeldige parameter voor {1:STRING}: parameter {STRING} ({NUM})
STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} moet geladen zijn voor {STRING}
STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} moet geladen zijn na {STRING}
-STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} heeft OpenTTD versie {STRING} of beter nodig
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} heeft OpenTTD-versie {STRING} of beter nodig
STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :het GRF-bestand die het probeert te vertalen
STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Er zijn te veel NewGRFs geladen
STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Laden van {1:STRING} als statische NewGRF met {STRING} kan desynchronisatiefouten (desyncs) veroorzaken
STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Onverwachte sprite (sprite {3:NUM})
-STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Onbekende Actie 0 eigenschap {4:HEX} (sprite {3:NUM})
+STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Onbekende Action 0-eigenschap {4:HEX} (sprite {3:NUM})
STR_NEWGRF_ERROR_INVALID_ID :Poging om ongeldig ID te gebruiken (sprite {3:NUM})
STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} bevat een ongeldige afbeelding. Alle ongeldige afbeeldingen worden getoond als een rood vraagteken (?)
-STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Bevat meerdere acties 8 (sprite {3:NUM})
+STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Bevat meerdere Action 8-invoer (sprite {3:NUM})
STR_NEWGRF_ERROR_READ_BOUNDS :Voorbij het einde van pseudo-sprite gelezen (sprite {3:NUM})
-STR_NEWGRF_ERROR_GRM_FAILED :Gevraagde GRF middelen niet beschikbaar (sprite {3:NUM})
+STR_NEWGRF_ERROR_GRM_FAILED :Gevraagde GRF-middelen niet beschikbaar (sprite {3:NUM})
STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} is uitgeschakeld door {STRING}
-STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Ongeldig/onbekend sprite lay-out-formaat (sprite {3:NUM})
+STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Ongeldig/onbekend spritelay-outformaat (sprite {3:NUM})
# NewGRF related 'general' warnings
STR_NEWGRF_POPUP_CAUTION_CAPTION :{WHITE}Waarschuwing!
@@ -2913,7 +2976,7 @@ STR_NEWGRF_CONFIRMATION_TEXT :{YELLOW}Je staa
STR_NEWGRF_DUPLICATE_GRFID :{WHITE}Kan bestand niet toevoegen: identieke GRF-ID
STR_NEWGRF_COMPATIBLE_LOADED :{ORANGE}Bijbehorend bestand niet gevonden (compatibele GRF geladen)
-STR_NEWGRF_TOO_MANY_NEWGRFS :{WHITE}Kan bestand niet toevoegen: NewGRF bestandslimiet bereikt
+STR_NEWGRF_TOO_MANY_NEWGRFS :{WHITE}Kan bestand niet toevoegen: NewGRF-bestandslimiet bereikt
STR_NEWGRF_COMPATIBLE_LOAD_WARNING :{WHITE}Compatibele GRF(s) geladen voor ontbrekende bestanden
STR_NEWGRF_DISABLED_WARNING :{WHITE}Missend(e) GRF-bestand(en) zijn uitgeschakeld
@@ -2929,13 +2992,13 @@ STR_NEWGRF_LIST_MISSING :{RED}Ontbrekend
# NewGRF 'it's broken' warnings
STR_NEWGRF_BROKEN :{WHITE}Gedrag van NewGRF '{0:STRING}' zal waarschijnlijk desynchronisatiefouten (desyncs) en/of crashes veroorzaken
STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}Wagon '{1:ENGINE}' gewijzigde status van aandrijfeenheid wanneer niet in een depot
-STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}Het verandert de lengte van voertuig '{1:ENGINE}' terwijl het niet in een depot is
+STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}Het veranderde de lengte van voertuig '{1:ENGINE}' wanneer het niet in een depot is
STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Het wijzigde voertuigcapaciteit voor '{1:ENGINE}' wanneer niet in een depot of ombouwen
STR_BROKEN_VEHICLE_LENGTH :{WHITE}Trein '{VEHICLE}' behorend bij '{COMPANY}' heeft een ongeldige lengte. Het is waarschijnlijk veroorzaakt door problemen met NewGRF's. Het spel kan desynchroniseren of vastlopen
STR_NEWGRF_BUGGY :{WHITE}NewGRF '{0:STRING}' geeft onjuiste informatie
-STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Vracht-/ombouwinformatie voor '{1:ENGINE}' wijkt af van aanschaflijst na het bouwen. Dit kan resulteren in problemen bij ombouwen door automatisch vernieuwen/vervangen
-STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' heeft een eindeloze loop veroorzaakt in de productie-callback
+STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Vracht- of ombouwinformatie voor '{1:ENGINE}' wijkt af van aanschaflijst na het bouwen. Dit kan resulteren in problemen bij ombouwen door automatisch vernieuwen/vervangen
+STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' heeft een eindeloze loop veroorzaakt in de productiecallback
STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Callback {1:HEX} gaf onbekend/ongeldig resultaat {2:HEX}
# 'User removed essential NewGRFs'-placeholders for stuff without specs
@@ -2951,13 +3014,13 @@ STR_INVALID_VEHICLE :
-STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Spel was opgeslagen in een versie zonder tram-ondersteuning. Alle trams zijn verwijderd
+STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Spel was opgeslagen in een versie zonder tramondersteuning. Alle trams zijn verwijderd
# Map generation messages
STR_ERROR_COULD_NOT_CREATE_TOWN :{WHITE}Kaartmaken afgebroken...{}... geen geschikte dorpslocaties
@@ -4099,13 +4164,13 @@ STR_WARNING_HEIGHTMAP_SCALE_CAPTION :{WHITE}Schaalwa
STR_WARNING_HEIGHTMAP_SCALE_MESSAGE :{YELLOW}Het aanpassen van de grootte van een bronkaart is niet aan te bevelen. Toch doorgaan?
# Soundset messages
-STR_WARNING_FALLBACK_SOUNDSET :{WHITE}Alleen backup geluid is gevonden. Als je geluid wilt, installeer dan een geluiddsset via het downloadsysteem
+STR_WARNING_FALLBACK_SOUNDSET :{WHITE}Alleen back-upgeluid is gevonden. Als u geluid wilt, installeer dan een geluiddsset via het downloadsysteem
# Screenshot related messages
STR_WARNING_SCREENSHOT_SIZE_CAPTION :{WHITE}Grote schermafdruk
STR_WARNING_SCREENSHOT_SIZE_MESSAGE :{YELLOW}De schermafdruk heeft een resolutie van {COMMA} x {COMMA} pixels. De schermafdruk maken kan even duren. Verder gaan?
-STR_MESSAGE_SCREENSHOT_SUCCESSFULLY :{WHITE}Schermprint succesvol opgeslagen als '{STRING}'
+STR_MESSAGE_SCREENSHOT_SUCCESSFULLY :{WHITE}Schermafbeelding succesvol opgeslagen als '{STRING}'
STR_ERROR_SCREENSHOT_FAILED :{WHITE}Schermprint mislukt!
# Error message titles
@@ -4215,7 +4280,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Te veel
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Te veel treinstationsdelen
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Te veel bushaltes
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Te veel vrachtwagenlaadstations
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Te dicht bij een ander (laad)station
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Te dicht bij een andere haven
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Te dicht bij een ander vliegveld
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Kan stationsnaam niet veranderen...
@@ -4223,6 +4287,7 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... deze
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... weg is in de verkeerde richting
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... doorrij haltes kunnen geen bochten hebben
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... doorrij haltes kunnen geen kruisingen hebben
+STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... weg is eenrichtingsverkeer of geblokkeerd
# Station destruction related errors
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Kan deel van station niet weghalen...
@@ -4301,7 +4366,7 @@ STR_ERROR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE :{WHITE}Kan sein
STR_ERROR_THERE_IS_NO_RAILROAD_TRACK :{WHITE}...er is hier geen spoorlijn
STR_ERROR_THERE_ARE_NO_SIGNALS :{WHITE}...er zijn geen seinen
-STR_ERROR_CAN_T_CONVERT_RAIL :{WHITE}Kan railtype hier niet veranderen...
+STR_ERROR_CAN_T_CONVERT_RAIL :{WHITE}Kan spoortype hier niet veranderen...
# Road construction errors
STR_ERROR_MUST_REMOVE_ROAD_FIRST :{WHITE}Moet weg eerst weghalen
@@ -4474,6 +4539,8 @@ STR_BASESOUNDS_DOS_DESCRIPTION :Originele gelui
STR_BASESOUNDS_WIN_DESCRIPTION :Originele geluiden van de Transport Tycoon Deluxe Windows-versie.
STR_BASESOUNDS_NONE_DESCRIPTION :Een geluidset zonder geluid.
STR_BASEMUSIC_WIN_DESCRIPTION :Originele muziek van de Transport Tycoon Deluxe Windows-versie.
+STR_BASEMUSIC_DOS_DESCRIPTION :Originele Transport Tycoon Deluxe DOS-editiemuziek.
+STR_BASEMUSIC_TTO_DESCRIPTION :Originele Transport Tycoon (Original/World Editor) DOS-editiemuziek.
STR_BASEMUSIC_NONE_DESCRIPTION :Een muziekset zonder muziek.
##id 0x2000
@@ -4488,7 +4555,7 @@ STR_TOWN_BUILDING_NAME_HOTEL_1 :Hotel
STR_TOWN_BUILDING_NAME_STATUE_1 :Standbeeld
STR_TOWN_BUILDING_NAME_FOUNTAIN_1 :Fontein
STR_TOWN_BUILDING_NAME_PARK_1 :Park
-STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_2 :Kantorenblok
+STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_2 :Kantoorgebouw
STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1 :Winkels en kantoren
STR_TOWN_BUILDING_NAME_MODERN_OFFICE_BUILDING_1 :Modern kantoorgebouw
STR_TOWN_BUILDING_NAME_WAREHOUSE_1 :Warenhuis
@@ -4509,7 +4576,7 @@ STR_TOWN_BUILDING_NAME_CINEMA_1 :Bioscoop
STR_TOWN_BUILDING_NAME_SHOPPING_MALL_1 :Winkelcentrum
STR_TOWN_BUILDING_NAME_IGLOO_1 :Iglo
STR_TOWN_BUILDING_NAME_TEPEES_1 :Tepees
-STR_TOWN_BUILDING_NAME_TEAPOT_HOUSE_1 :Theepothuis
+STR_TOWN_BUILDING_NAME_TEAPOT_HOUSE_1 :Theehuis
STR_TOWN_BUILDING_NAME_PIGGY_BANK_1 :Spaarvarken
##id 0x4800
@@ -4572,13 +4639,13 @@ STR_SV_STNAME_TRANSFER :{STRING} Transf
STR_SV_STNAME_HALT :{STRING} Halte
STR_SV_STNAME_VALLEY :{STRING} Vallei
STR_SV_STNAME_HEIGHTS :{STRING} Hoogte
-STR_SV_STNAME_WOODS :{STRING} Bossen
+STR_SV_STNAME_WOODS :{STRING} Woud
STR_SV_STNAME_LAKESIDE :{STRING} Meerkant
STR_SV_STNAME_EXCHANGE :{STRING} Uitwisseling
STR_SV_STNAME_AIRPORT :{STRING} Vliegveld
STR_SV_STNAME_OILFIELD :{STRING} Olieveld
STR_SV_STNAME_MINES :{STRING} Mijnen
-STR_SV_STNAME_DOCKS :{STRING} Haven
+STR_SV_STNAME_DOCKS :{STRING} Dokken
STR_SV_STNAME_BUOY :{STRING}
STR_SV_STNAME_WAYPOINT :{STRING}
##id 0x6020
diff --git a/src/lang/english.txt b/src/lang/english.txt
index 5344ef7d41..cb4e685c46 100644
--- a/src/lang/english.txt
+++ b/src/lang/english.txt
@@ -475,6 +475,7 @@ STR_ABOUT_MENU_SCREENSHOT :Screenshot
STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Fully zoomed in screenshot
STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Default zoom screenshot
STR_ABOUT_MENU_GIANT_SCREENSHOT :Whole map screenshot
+STR_ABOUT_MENU_SHOW_FRAMERATE :Show frame rate
STR_ABOUT_MENU_ABOUT_OPENTTD :About 'OpenTTD'
STR_ABOUT_MENU_SPRITE_ALIGNER :Sprite aligner
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Toggle bounding boxes
@@ -814,6 +815,7 @@ STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLAC
STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDENT_NAME}{}(Manager)
STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}{RAW_STRING} sponsored construction of new town {TOWN}!
+STR_NEWS_NEW_TOWN_UNSPONSORED :{BLACK}{BIG_FONT}A new town called {TOWN} has been constructed!
STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLACK}New {STRING} under construction near {TOWN}!
STR_NEWS_INDUSTRY_PLANTED :{BIG_FONT}{BLACK}New {STRING} being planted near {TOWN}!
@@ -926,6 +928,7 @@ STR_GAME_OPTIONS_CURRENCY_ZAR :South African R
STR_GAME_OPTIONS_CURRENCY_CUSTOM :Custom...
STR_GAME_OPTIONS_CURRENCY_GEL :Georgian Lari (GEL)
STR_GAME_OPTIONS_CURRENCY_IRR :Iranian Rial (IRR)
+STR_GAME_OPTIONS_CURRENCY_RUB :New Russian Ruble (RUB)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Road vehicles
@@ -2697,6 +2700,56 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original
STR_ABOUT_VERSION :{BLACK}OpenTTD version {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 The OpenTTD team
+# Framerate display window
+STR_FRAMERATE_CAPTION :{WHITE}Frame rate
+STR_FRAMERATE_CAPTION_SMALL :{STRING2}{WHITE} ({DECIMAL}x)
+STR_FRAMERATE_RATE_GAMELOOP :{BLACK}Simulation rate: {STRING2}
+STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP :{BLACK}Number of game ticks simulated per second.
+STR_FRAMERATE_RATE_BLITTER :{BLACK}Graphics frame rate: {STRING2}
+STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}Number of video frames rendered per second.
+STR_FRAMERATE_SPEED_FACTOR :{BLACK}Current game speed factor: {DECIMAL}x
+STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}How fast the game is currently running, compared to the expected speed at normal simulation rate.
+STR_FRAMERATE_CURRENT :{WHITE}Current
+STR_FRAMERATE_AVERAGE :{WHITE}Average
+STR_FRAMERATE_DATA_POINTS :{BLACK}Data based on {COMMA} measurements
+STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL} ms
+STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL} ms
+STR_FRAMERATE_MS_BAD :{RED}{DECIMAL} ms
+STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL} frames/s
+STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL} frames/s
+STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL} frames/s
+STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA} ms
+STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} s
+############ Leave those lines in this order!!
+STR_FRAMERATE_GAMELOOP :{BLACK}Game loop total:
+STR_FRAMERATE_GL_ECONOMY :{BLACK} Cargo handling:
+STR_FRAMERATE_GL_TRAINS :{BLACK} Train ticks:
+STR_FRAMERATE_GL_ROADVEHS :{BLACK} Road vehicle ticks:
+STR_FRAMERATE_GL_SHIPS :{BLACK} Ship ticks:
+STR_FRAMERATE_GL_AIRCRAFT :{BLACK} Aircraft ticks:
+STR_FRAMERATE_GL_LANDSCAPE :{BLACK} World ticks:
+STR_FRAMERATE_GL_LINKGRAPH :{BLACK} Link graph delay:
+STR_FRAMERATE_DRAWING :{BLACK}Graphics rendering:
+STR_FRAMERATE_DRAWING_VIEWPORTS :{BLACK} World viewports:
+STR_FRAMERATE_VIDEO :{BLACK}Video output:
+STR_FRAMERATE_SOUND :{BLACK}Sound mixing:
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+STR_FRAMETIME_CAPTION_GAMELOOP :Game loop
+STR_FRAMETIME_CAPTION_GL_ECONOMY :Cargo handling
+STR_FRAMETIME_CAPTION_GL_TRAINS :Train ticks
+STR_FRAMETIME_CAPTION_GL_ROADVEHS :Road vehicle ticks
+STR_FRAMETIME_CAPTION_GL_SHIPS :Ship ticks
+STR_FRAMETIME_CAPTION_GL_AIRCRAFT :Aircraft ticks
+STR_FRAMETIME_CAPTION_GL_LANDSCAPE :World ticks
+STR_FRAMETIME_CAPTION_GL_LINKGRAPH :Link graph delay
+STR_FRAMETIME_CAPTION_DRAWING :Graphics rendering
+STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :World viewport rendering
+STR_FRAMETIME_CAPTION_VIDEO :Video output
+STR_FRAMETIME_CAPTION_SOUND :Sound mixing
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Save Game
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Load Game
@@ -2719,6 +2772,7 @@ STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Game Det
STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}No information available
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING1}
STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: {WHITE}{STRING}
+STR_SAVELOAD_FILTER_TITLE :{BLACK}Filter string:
STR_SAVELOAD_OSKTITLE :{BLACK}Enter a name for the savegame
@@ -2917,6 +2971,8 @@ STR_NEWGRF_ERROR_READ_BOUNDS :Read past end o
STR_NEWGRF_ERROR_GRM_FAILED :Requested GRF resources not available (sprite {3:NUM})
STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:RAW_STRING} was disabled by {2:RAW_STRING}
STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Invalid/unknown sprite layout format (sprite {3:NUM})
+STR_NEWGRF_ERROR_LIST_PROPERTY_TOO_LONG :Too many elements in property value list (sprite {3:NUM}, property {4:HEX})
+STR_NEWGRF_ERROR_INDPROD_CALLBACK :Invalid industry production callback (sprite {3:NUM}, "{1:RAW_STRING}")
# NewGRF related 'general' warnings
STR_NEWGRF_POPUP_CAUTION_CAPTION :{WHITE}Caution!
@@ -3803,6 +3859,7 @@ STR_ORDER_CONDITIONAL_AGE :Age (years)
STR_ORDER_CONDITIONAL_REQUIRES_SERVICE :Requires service
STR_ORDER_CONDITIONAL_UNCONDITIONALLY :Always
STR_ORDER_CONDITIONAL_REMAINING_LIFETIME :Remaining lifetime (years)
+STR_ORDER_CONDITIONAL_MAX_RELIABILITY :Maximum reliability
STR_ORDER_CONDITIONAL_COMPARATOR_TOOLTIP :{BLACK}How to compare the vehicle data to the given value
STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS :is equal to
@@ -4228,7 +4285,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Too many
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Too many railway station parts
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Too many bus stops
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Too many lorry stations
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Too close to another station/loading area
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Too close to another dock
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Too close to another airport
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Can't rename station...
diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt
index 20e4a4cf44..8e001d956a 100644
--- a/src/lang/english_AU.txt
+++ b/src/lang/english_AU.txt
@@ -2657,6 +2657,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original
STR_ABOUT_VERSION :{BLACK}OpenTTD version {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 The OpenTTD team
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Save Game
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Load Game
@@ -4146,7 +4153,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Too many
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Too many railway station parts
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Too many bus stops
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Too many Truck stations
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Too close to another station/loading area
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Too close to another dock
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Too close to another airport
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Can't rename station...
diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt
index 3d12c65077..b93ecb6836 100644
--- a/src/lang/english_US.txt
+++ b/src/lang/english_US.txt
@@ -650,6 +650,7 @@ STR_MUSIC_RULER_MARKER :{TINY_FONT}{BLA
STR_MUSIC_TRACK_NONE :{TINY_FONT}{DKGREEN}--
STR_MUSIC_TRACK_DIGIT :{TINY_FONT}{DKGREEN}{ZEROFILL_NUM}
STR_MUSIC_TITLE_NONE :{TINY_FONT}{DKGREEN}------
+STR_MUSIC_TITLE_NOMUSIC :{TINY_FONT}{DKGREEN}No music available
STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}"
STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Track
STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Title
@@ -670,11 +671,14 @@ STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Toggle p
STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Show music track selection window
# Playlist window
+STR_PLAYLIST_MUSIC_SELECTION_SETNAME :{WHITE}Music Program - '{STRING}'
STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}"
STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Track Index
STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Program - '{STRING}'
STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Clear
+STR_PLAYLIST_CHANGE_SET :{BLACK}Change set
STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Clear current program (Custom1 or Custom2 only)
+STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Change music selection to another installed set
STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Click on music track to add to current program (Custom1 or Custom2 only)
STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Click on music track to remove it from current program (Custom1 or Custom2 only)
@@ -877,10 +881,10 @@ STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLAC
# Extra view window
STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Viewport {COMMA}
-STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Copy to viewport
+STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Change viewport
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Copy the location of the main view to this viewport
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Paste from viewport
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Paste the location of this viewport to the main view
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Change main view
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Copy the location of this viewport to the main view
# Game options window
STR_GAME_OPTIONS_CAPTION :{WHITE}Game Options
@@ -1334,6 +1338,12 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Color of the te
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Green
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Dark green
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Purple
+STR_CONFIG_SETTING_SCROLLMODE :Viewport scroll behaviour: {STRING}
+STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Behavior when scrolling the map
+STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Move viewport with RMB, mouse position locked
+STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Move map with RMB, mouse position locked
+STR_CONFIG_SETTING_SCROLLMODE_RMB :Move map with RMB
+STR_CONFIG_SETTING_SCROLLMODE_LMB :Move map with LMB
STR_CONFIG_SETTING_SMOOTH_SCROLLING :Smooth viewport scrolling: {STRING}
STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Control how the main view scrolls to a specific position when clicking on the smallmap or when issuing a command to scroll to a specific object on the map. If enabled, the viewport scrolls smoothly, if disabled it jumps directly to the targeted spot
STR_CONFIG_SETTING_MEASURE_TOOLTIP :Show a measurement tooltip when using various build-tools: {STRING}
@@ -2278,6 +2288,7 @@ STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Cargo Fl
STR_LINKGRAPH_LEGEND_ALL :{BLACK}All
STR_LINKGRAPH_LEGEND_NONE :{BLACK}None
STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Select companies to be displayed
+STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY}
# Linkgraph legend window and linkgraph legend in smallmap
STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}unused
@@ -2686,6 +2697,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original
STR_ABOUT_VERSION :{BLACK}OpenTTD version {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 The OpenTTD team
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Save Game
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Load Game
@@ -2970,6 +2988,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Enter a
STR_TOWN_DIRECTORY_CAPTION :{WHITE}Towns
STR_TOWN_DIRECTORY_NONE :{ORANGE}- None -
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA})
+STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (City){BLACK} ({COMMA})
STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Town names - click on name to center main view on town. Ctrl+Click opens a new viewport on town location
STR_TOWN_POPULATION :{BLACK}World population: {COMMA}
@@ -2977,6 +2996,7 @@ STR_TOWN_POPULATION :{BLACK}World po
STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN}
STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (City)
STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Population: {ORANGE}{COMMA}{BLACK} Houses: {ORANGE}{COMMA}
+STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} last month: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA}
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Cargo needed for town growth:
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} required
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} required in winter
@@ -4215,7 +4235,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Too many
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Too many railroad station parts
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Too many bus stops
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Too many truck stations
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Too close to another station/loading area
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Too close to another dock
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Too close to another airport
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Can't rename station...
@@ -4223,6 +4242,7 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... this
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... road facing in the wrong direction
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... drive through stops can't have corners
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... drive through stops can't have junctions
+STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... road is one way or blocked
# Station destruction related errors
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Can't remove part of station...
@@ -4474,6 +4494,8 @@ STR_BASESOUNDS_DOS_DESCRIPTION :Original Transp
STR_BASESOUNDS_WIN_DESCRIPTION :Original Transport Tycoon Deluxe Windows edition sounds.
STR_BASESOUNDS_NONE_DESCRIPTION :A sound pack without any sounds.
STR_BASEMUSIC_WIN_DESCRIPTION :Original Transport Tycoon Deluxe Windows edition music.
+STR_BASEMUSIC_DOS_DESCRIPTION :Original Transport Tycoon Deluxe DOS edition music.
+STR_BASEMUSIC_TTO_DESCRIPTION :Original Transport Tycoon (Original/World Editor) DOS edition music.
STR_BASEMUSIC_NONE_DESCRIPTION :A music pack without actual music.
##id 0x2000
diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt
index f63f762019..49149b638f 100644
--- a/src/lang/esperanto.txt
+++ b/src/lang/esperanto.txt
@@ -2262,6 +2262,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Origina
STR_ABOUT_VERSION :{BLACK}OpenTTD-versio {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 La teamo de OpenTTD
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Konservu Ludon
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Ŝarĝu Ludon
@@ -3572,7 +3579,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Tro da s
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Tro da partoj de stacidomo
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Tro da bushaltejoj
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Tro da ŝarĝaŭtaj stacioj
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Tro proksime al alia stacioj/ŝarĝejoj
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Tro proksime al alia haveno
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Tro proksime al alia flughaveno
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Ne povas alinomi stacion...
diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt
index dd1e7effa8..771994978b 100644
--- a/src/lang/estonian.txt
+++ b/src/lang/estonian.txt
@@ -2740,6 +2740,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Algne au
STR_ABOUT_VERSION :{BLACK}OpenTTD osa {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 OpenTTD meeskond
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Mängu salvestamine
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Mängu jätkamine
@@ -4254,7 +4261,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Liiga pa
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Liiga palju raudteejaama osasid
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Liiga palju bussipeatusi
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Liiga palju laadimisplatvorme
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Mõnele teisele jaamale liiga lähedal
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Liiga lähedal teisele dokile
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Liiga lähedal teisele lennuväljale
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Jaama nime ei saa vahetada...
diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt
index 9a17e2387b..ae2729c216 100644
--- a/src/lang/faroese.txt
+++ b/src/lang/faroese.txt
@@ -2422,6 +2422,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Upprunal
STR_ABOUT_VERSION :{BLACK}OpenTTD útgáva {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD toymi
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Goym spæl
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Heinta spæl
@@ -3716,7 +3723,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Ov nógv
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Ov nógvir tok støð deilir
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Ov nógvir buss steðgir
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Ov nógvar lastbila støðir
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Ov tætt við eina aðra støð/lessi øki
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Ov tætt við eina aðra havn
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Ov tætt við eina aðra floghavn
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Kann ikki navngeva støð...
diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt
index 39451916e3..e7f5d9d651 100644
--- a/src/lang/finnish.txt
+++ b/src/lang/finnish.txt
@@ -246,7 +246,7 @@ STR_TOOLTIP_RESIZE :{BLACK}Napsauta
STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Suurenna/pienennä ikkuna
STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST :{BLACK}Vierityspalkki - luettelon vieritys ylös/alas
STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Vierityspalkki - luettelon vieritys vasemmalle/oikealle.
-STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Tuhoa rakennuksia jne. ruudulta. Ctrl valitsee alueen vinottain. Shift vaihtaa tuhoamistilan ja kustannearvion välillä
+STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Tuhoa rakennuksia jne. ruudulta. Ctrl valitsee alueen vinottain. Shift vaihtaa tuhoamistilan ja kustannusarvion välillä
# Show engines button
STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN :{BLACK}Näytä piilotetut
@@ -350,15 +350,15 @@ STR_SCENEDIT_TOOLBAR_OPENTTD :{YELLOW}OpenTTD
STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR :{YELLOW}Skenaariomuokkain
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}Klikkaa asettaaksesi aloitusvuoden
+STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE :{BLACK}Aseta aloitusvuosi napsauttamalla
STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Näytä kartta, kaupunkihakemisto
STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Maaston luonti
STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Kaupunkien luonti
STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Teollisuuden luonti
STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Tienrakennus
-STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Istuta puita. Shift vaihtaa istutustilan ja kustannearvion välillä
+STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Istuta puita. Shift vaihtaa istutustilan ja kustannusarvion välillä
STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Sijoita kyltti
-STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Sijoita objekti. Shift vaihtaa rakennustilan ja kustannearvion välillä
+STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Sijoita objekti. Shift vaihtaa rakennustilan ja kustannusarvion välillä
############ range for SE file menu starts
STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO :Tallenna skenaario
@@ -475,7 +475,8 @@ STR_ABOUT_MENU_SCREENSHOT :Kuvakaappaus
STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Täysin lähennetty kuvakaappaus
STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Kuvakaappaus oletuslähennystasolla
STR_ABOUT_MENU_GIANT_SCREENSHOT :Koko kartan kuvakaappaus
-STR_ABOUT_MENU_ABOUT_OPENTTD :Tietoja 'OpenTTD':stä
+STR_ABOUT_MENU_SHOW_FRAMERATE :Näytä kuvataajuus
+STR_ABOUT_MENU_ABOUT_OPENTTD :Tietoja OpenTTD:stä
STR_ABOUT_MENU_SPRITE_ALIGNER :Sprite-kohdistaja
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Reunat päälle/pois
STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Likaisten ruutujen värjäys päälle/pois
@@ -534,15 +535,15 @@ STR_DAY_NUMBER_31ST :31.
############ range for days ends
############ range for months starts
-STR_MONTH_ABBREV_JAN :01.
-STR_MONTH_ABBREV_FEB :02.
-STR_MONTH_ABBREV_MAR :03.
-STR_MONTH_ABBREV_APR :04.
-STR_MONTH_ABBREV_MAY :05.
-STR_MONTH_ABBREV_JUN :06.
-STR_MONTH_ABBREV_JUL :07.
-STR_MONTH_ABBREV_AUG :08.
-STR_MONTH_ABBREV_SEP :09.
+STR_MONTH_ABBREV_JAN :{NBSP}1.
+STR_MONTH_ABBREV_FEB :{NBSP}2.
+STR_MONTH_ABBREV_MAR :{NBSP}3.
+STR_MONTH_ABBREV_APR :{NBSP}4.
+STR_MONTH_ABBREV_MAY :{NBSP}5.
+STR_MONTH_ABBREV_JUN :{NBSP}6.
+STR_MONTH_ABBREV_JUL :{NBSP}7.
+STR_MONTH_ABBREV_AUG :{NBSP}8.
+STR_MONTH_ABBREV_SEP :{NBSP}9.
STR_MONTH_ABBREV_OCT :10.
STR_MONTH_ABBREV_NOV :11.
STR_MONTH_ABBREV_DEC :12.
@@ -650,6 +651,7 @@ STR_MUSIC_RULER_MARKER :{TINY_FONT}{BLA
STR_MUSIC_TRACK_NONE :{TINY_FONT}{DKGREEN}--
STR_MUSIC_TRACK_DIGIT :{TINY_FONT}{DKGREEN}{ZEROFILL_NUM}
STR_MUSIC_TITLE_NONE :{TINY_FONT}{DKGREEN}------
+STR_MUSIC_TITLE_NOMUSIC :{TINY_FONT}{DKGREEN}Musiikkia ei ole saatavilla
STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}"
STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Raita
STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Nimi
@@ -670,13 +672,14 @@ STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Sekoitta
STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Näytä musiikkiraitojen valintaikkuna
# Playlist window
+STR_PLAYLIST_MUSIC_SELECTION_SETNAME :{WHITE}Soittolista - '{STRING}'
STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}"
STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Raita
STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Soittolista - '{STRING}'
STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Tyhjennä
STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Tyhjennä nykyinen soittolista (vain Oma1 tai Oma2)
STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Valitse musiikkiraita lisätäksesi sen nykyiseen soittolistaan (vain Oma1 tai Oma2).
-STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klikkaa raitaa poistaaksesi se nykyisestä ohjelmasta (ainoastaan Custom1 tai Custom2)
+STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Poista musiikkiraita nykyseiltä soittolistalta napsauttamalla (ainoastaan Custom1 tai Custom2)
# Highscore window
STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Parhaat yhtiöt, jotka saavuttivat vuoden {NUM}
@@ -711,9 +714,9 @@ STR_SMALLMAP_TOOLTIP_SHOW_LINK_STATS_ON_MAP :{BLACK}Näytä
STR_SMALLMAP_TOOLTIP_SHOW_TRANSPORT_ROUTES_ON :{BLACK}Näytä kuljetusreitit kartalla.
STR_SMALLMAP_TOOLTIP_SHOW_VEGETATION_ON_MAP :{BLACK}Näytä kasvillisuus kartalla.
STR_SMALLMAP_TOOLTIP_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Näytä maanomistajat kartalla.
-STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Klikkaa teollisuustyyppiä näyttääksesi sen. Ctrl+Klik näyttää valitun tyypin. Ctrl+Klik uudestaan näyttää kaikki teollisuustyypit
-STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Klikkaa yhtiötä näyttääksesi sen omaisuuden. Ctrl+Klik näyttää ainoastaan valitun yhtiön. Ctrl+Klik uudestaan näyttää kaikki yhtiöt
-STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Klikkaa rahtia näyttääksesi tai piilottaaksesi sen. Ctrl+Klik piilottaa kaikki paitsi valitun rahdin. Ctrl+Klik uudelleen palauttaa kaikki rahdit näkyviin
+STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Napsauta teollisuustyyppiä näyttääksesi sen. Ctrl+Klik näyttää valitun tyypin. Ctrl+Klik uudestaan näyttää kaikki teollisuustyypit
+STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Napsauta yhtiötä näyttääksesi sen omaisuuden. Ctrl+Klik näyttää ainoastaan valitun yhtiön. Ctrl+Klik uudestaan näyttää kaikki yhtiöt
+STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Napsauta rahtia näyttääksesi tai piilottaaksesi sen. Ctrl+Klik piilottaa kaikki paitsi valitun rahdin. Ctrl+Klik uudelleen palauttaa kaikki rahdit näkyviin
STR_SMALLMAP_LEGENDA_ROADS :{TINY_FONT}{BLACK}Tiet
STR_SMALLMAP_LEGENDA_RAILROADS :{TINY_FONT}{BLACK}Rautatiet
@@ -777,12 +780,12 @@ STR_NEWS_MESSAGE_CAPTION :{WHITE}Viesti
STR_NEWS_CUSTOM_ITEM :{BIG_FONT}{BLACK}{STRING}
STR_NEWS_FIRST_TRAIN_ARRIVAL :{BIG_FONT}{BLACK}Kaupunkilaiset juhlivat . . .{}Ensimmäinen juna saapuu asemalle {STATION}!
-STR_NEWS_FIRST_BUS_ARRIVAL :{BIG_FONT}{BLACK}Kaupunkilaiset juhlivat . . .{}Ensimmäinen linja-auto saapuu asemalle {STATION}!
-STR_NEWS_FIRST_TRUCK_ARRIVAL :{BIG_FONT}{BLACK}Kaupunkilaiset juhlivat . . .{}Ensimmäinen kuorma-auto saapuu asemalle {STATION}!
-STR_NEWS_FIRST_PASSENGER_TRAM_ARRIVAL :{BIG_FONT}{BLACK}Kaupunkilaiset juhlivat . . .{}Ensimmäinen raitiovaunu saapuu asemalle {STATION}!
-STR_NEWS_FIRST_CARGO_TRAM_ARRIVAL :{BIG_FONT}{BLACK}Kaupunkilaiset juhlivat . . .{}Ensimmäinen rahtiraitiovaunu saapuu asemalle {STATION}!
-STR_NEWS_FIRST_SHIP_ARRIVAL :{BIG_FONT}{BLACK}Kaupunkilaiset juhlivat . . .{}Ensimmäinen laiva saapuu asemalle {STATION}!
-STR_NEWS_FIRST_AIRCRAFT_ARRIVAL :{BIG_FONT}{BLACK}Kaupunkilaiset juhlivat . . .{}Ensimmäinen lentokone saapuu asemalle {STATION}!
+STR_NEWS_FIRST_BUS_ARRIVAL :{BIG_FONT}{BLACK}Kaupunkilaiset juhlivat . . .{}{STATION} vastaanottaa ensimmäisen linja-auton!
+STR_NEWS_FIRST_TRUCK_ARRIVAL :{BIG_FONT}{BLACK}Kaupunkilaiset juhlivat . . .{}{STATION} vastaanottaa ensimmäisen kuorma-auton!
+STR_NEWS_FIRST_PASSENGER_TRAM_ARRIVAL :{BIG_FONT}{BLACK}Kaupunkilaiset juhlivat . . .{}{STATION} vastaanottaa ensimmäisen raitiovaunun!
+STR_NEWS_FIRST_CARGO_TRAM_ARRIVAL :{BIG_FONT}{BLACK}Kaupunkilaiset juhlivat . . .{}{STATION} vastaanottaa ensimmäisen rahtiraitiovaunun!
+STR_NEWS_FIRST_SHIP_ARRIVAL :{BIG_FONT}{BLACK}Kaupunkilaiset juhlivat . . .{}{STATION} vastaanottaa ensimmäisen laivan!
+STR_NEWS_FIRST_AIRCRAFT_ARRIVAL :{BIG_FONT}{BLACK}Kaupunkilaiset juhlivat . . .{}{STATION} vastaanottaa ensimmäisen lentokoneen!
STR_NEWS_TRAIN_CRASH :{BIG_FONT}{BLACK}Junaonnettomuus!{}{COMMA} kuolee törmäyksen jälkeisessä tulipallossa.
STR_NEWS_ROAD_VEHICLE_CRASH_DRIVER :{BIG_FONT}{BLACK}Tasoristeysturma!{}Kuljettaja kuolee junan ja auton törmäyksen jälkeisessä tulipallossa
@@ -806,10 +809,11 @@ STR_NEWS_COMPANY_BANKRUPT_TITLE :{BIG_FONT}{BLAC
STR_NEWS_COMPANY_BANKRUPT_DESCRIPTION :{BIG_FONT}{BLACK}{STRING} on suljettu velkojien toimesta ja kaikki omaisuus on myyty pois!
STR_NEWS_COMPANY_LAUNCH_TITLE :{BIG_FONT}{BLACK}Uusi kuljetusyhtiö perustettu!
STR_NEWS_COMPANY_LAUNCH_DESCRIPTION :{BIG_FONT}{BLACK}{STRING} aloittaa rakentamisen kaupungin {TOWN} lähistölle!
-STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLACK}Yhtiön {STRING} on ottanut haltuun {STRING}!
+STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLACK}{1:STRING} on ottanut haltuunsa yhtiön {0:STRING}!
STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDENT_NAME}{}(pääjohtaja)
STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}{STRING} rahoitti uuden kaupungin, {TOWN}, rakentamista!
+STR_NEWS_NEW_TOWN_UNSPONSORED :{BLACK}{BIG_FONT}Uusi kaupunki {TOWN} rakennettu!
STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLACK}Uusi {STRING} rakennetaan kaupungin {TOWN} lähistölle!
STR_NEWS_INDUSTRY_PLANTED :{BIG_FONT}{BLACK}Uusi {STRING} istutetaan kaupungin {TOWN} lähistölle!
@@ -831,9 +835,9 @@ STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL :{BIG_FONT}{BLAC
STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_FARM :{BIG_FONT}{BLACK}{INDUSTRY}: hyönteisparvet aiheuttavat tuhoa!{}Tuotanto vähenee 50{NBSP}%:lla.
STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_SMOOTH :{BIG_FONT}{BLACK}{1:INDUSTRY} tuottaa {0:STRING} {2:COMMA}{NBSP}% entistä vähemmän!
-STR_NEWS_TRAIN_IS_WAITING :{WHITE}{VEHICLE} odottaa varikolla
+STR_NEWS_TRAIN_IS_WAITING :{WHITE}{VEHICLE} odottaa veturitallilla
STR_NEWS_ROAD_VEHICLE_IS_WAITING :{WHITE}{VEHICLE} odottaa varikolla
-STR_NEWS_SHIP_IS_WAITING :{WHITE}{VEHICLE} odottaa varikolla
+STR_NEWS_SHIP_IS_WAITING :{WHITE}{VEHICLE} odottaa telakalla
STR_NEWS_AIRCRAFT_IS_WAITING :{WHITE}{VEHICLE} odottaa lentokonehallissa
# Order review system / warnings
@@ -865,7 +869,7 @@ STR_NEWS_STATION_NOW_ACCEPTS_CARGO_AND_CARGO :{WHITE}{STATION
STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Tuki päättynyt:{}{}{STRING} väli {STRING} - {STRING} ei ole enää tuettu
STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Tuki vedetty pois:{}{}{STRING} kuljetuspalvelu välille {STRING}-{STRING} ei ole enää tuettu
-STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Tuki tarjottu:{}{}Ensimmäinen {STRING}kuljetus välillä {STRING} - {STRING} saa vuoden mittaisen tuen paikallisviranomaisilta!
+STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Tuki tarjottu:{}{}Ensimmäinen {STRING}kuljetus välillä {STRING} – {STRING} saa vuoden mittaisen tuen paikallisviranomaisilta!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}Tuki myönnetty yhtiölle {STRING}!{}{}{STRING}kuljetus välillä {STRING}-{STRING} tuottaa 50{NBSP}% enemmän seuraavan vuoden ajan!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}Tuki myönnetty yhtiölle {STRING}!{}{}{STRING}kuljetus välillä {STRING}-{STRING} tuottaa tuplaten seuraavan vuoden ajan!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Tuki myönnetty yhtiölle {STRING}!{}{}{STRING}kuljetus välillä {STRING}-{STRING} tuottaa kolminkertaisesti seuraavan vuoden ajan!
@@ -873,7 +877,7 @@ STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLAC
STR_NEWS_ROAD_REBUILDING :{BIG_FONT}{BLACK}{TOWN}: liikennekaaos!{}{}{STRING} rahoittaa katujen kunnostuksen; autoilijoille odotettavissa kuusi kuukautta kurjuutta!
STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Kuljetusmonopoli!
-STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLACK}Kaupungin {TOWN} paikallisviranomaiset allekirjoittavat sopimuksen yhtiön {STRING} kanssa vuoden pituisesta kuljetusyksinoikeudesta!
+STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLACK}{TOWN} ja {STRING} allekirjoittavat sopimuksen vuoden pituisesta kuljetusyksinoikeudesta!
# Extra view window
STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Näkymä {COMMA}
@@ -892,10 +896,10 @@ STR_GAME_OPTIONS_CURRENCY_GBP :Englannin punta
STR_GAME_OPTIONS_CURRENCY_USD :Yhdysvaltain dollari (USD)
STR_GAME_OPTIONS_CURRENCY_EUR :Euro (EUR)
STR_GAME_OPTIONS_CURRENCY_JPY :Japanin jeni (JPY)
-STR_GAME_OPTIONS_CURRENCY_ATS :Itävallan shillinki (ATS)
+STR_GAME_OPTIONS_CURRENCY_ATS :Itävallan šillinki (ATS)
STR_GAME_OPTIONS_CURRENCY_BEF :Belgian frangi (BEF)
STR_GAME_OPTIONS_CURRENCY_CHF :Sveitsin frangi (CHF)
-STR_GAME_OPTIONS_CURRENCY_CZK :Tsekin koruna (CZK)
+STR_GAME_OPTIONS_CURRENCY_CZK :Tšekin koruna (CZK)
STR_GAME_OPTIONS_CURRENCY_DEM :Saksan markka (DEM)
STR_GAME_OPTIONS_CURRENCY_DKK :Tanskan kruunu (DKK)
STR_GAME_OPTIONS_CURRENCY_ESP :Espanjan peseta (ESP)
@@ -909,7 +913,7 @@ STR_GAME_OPTIONS_CURRENCY_NLG :Hollannin gulde
STR_GAME_OPTIONS_CURRENCY_NOK :Norjan kruunu (NOK)
STR_GAME_OPTIONS_CURRENCY_PLN :Puolan złoty (PLN)
STR_GAME_OPTIONS_CURRENCY_RON :Romanian leu (RON)
-STR_GAME_OPTIONS_CURRENCY_RUR :Venjän rupla (RUR)
+STR_GAME_OPTIONS_CURRENCY_RUR :Venäjän rupla (RUR)
STR_GAME_OPTIONS_CURRENCY_SIT :Slovenian tolari (SIT)
STR_GAME_OPTIONS_CURRENCY_SEK :Ruotsin kruunu (SEK)
STR_GAME_OPTIONS_CURRENCY_TRY :Turkin liira (TRY)
@@ -922,12 +926,13 @@ STR_GAME_OPTIONS_CURRENCY_ZAR :Etelä-Afrikan
STR_GAME_OPTIONS_CURRENCY_CUSTOM :Oma...
STR_GAME_OPTIONS_CURRENCY_GEL :Georgian lari (GEL)
STR_GAME_OPTIONS_CURRENCY_IRR :Iranin rial (IRR)
+STR_GAME_OPTIONS_CURRENCY_RUB :Uusi Venäjän rupla (RUB)
############ end of currency region
-STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Ajoneuvot
+STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Kulkuneuvot
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Valitse kummalla puolella tietä ajetaan.
-STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Vasemmalla kaistalla
-STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Oikealla kaistalla
+STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Vasemmanpuolinen liikenne
+STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Oikeanpuolinen liikenne
STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Kaupunkien nimet
STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Valitse kaupunkien nimien tyyli.
@@ -948,7 +953,7 @@ STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norjalainen
STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Unkarilainen
STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Itävaltalainen
STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Romanialainen
-STR_GAME_OPTIONS_TOWN_NAME_CZECH :Tsekkiläinen
+STR_GAME_OPTIONS_TOWN_NAME_CZECH :Tšekkiläinen
STR_GAME_OPTIONS_TOWN_NAME_SWISS :Sveitsiläinen
STR_GAME_OPTIONS_TOWN_NAME_DANISH :Tanskalainen
STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turkkilainen
@@ -1093,11 +1098,11 @@ STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Sulje ka
STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(selitystä ei saatavilla)
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Oletusarvo: {ORANGE}{STRING}
STR_CONFIG_SETTING_TYPE :{LTBLUE}Asetuksen tyyppi: {ORANGE}{STRING}
-STR_CONFIG_SETTING_TYPE_CLIENT :Yleinen asetus (ei tallenneta tallenteisiin; vaikuttaa kaikkiin peleihin)
+STR_CONFIG_SETTING_TYPE_CLIENT :Yleinen asetus (ei tallenneta tallennuksiin; vaikuttaa kaikkiin peleihin)
STR_CONFIG_SETTING_TYPE_GAME_MENU :Pelin asetus (tallennetaan tallenteisiin; vaikuttaa vain uusiin peleihin)
STR_CONFIG_SETTING_TYPE_GAME_INGAME :Pelin asetus (tallennetaan tallenteeseen; vaikuttaa vain nykyiseen peliin)
STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Yhtiön asetus (tallennetaan tallenteisiin; vaikuttaa vain uusiin peleihin)
-STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Yhtiön asetus (tallennetaan tallenteeseen; vaikuttaa vain nykyiseen yhtiöön)
+STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Yhtiön asetus (tallennetaan tallennukseen; vaikuttaa vain nykyiseen yhtiöön)
STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK}Kategoria:
STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}Tyyppi:
@@ -1277,9 +1282,9 @@ STR_CONFIG_SETTING_ERRMSG_DURATION :Virheilmoituste
STR_CONFIG_SETTING_ERRMSG_DURATION_HELPTEXT :Aika virheilmoitusten näyttämiseen punaisessa ikkunassa. Huomaa, että jotkut (kriittiset) virheilmoitukset eivät sulkeudu automaattisesti tämän ajan jälkeen, vaan ne on suljettava käsin
STR_CONFIG_SETTING_ERRMSG_DURATION_VALUE :{COMMA} sekunti{P 0 "" a}
STR_CONFIG_SETTING_HOVER_DELAY :Näytä työkaluvihjeet: {STRING}
-STR_CONFIG_SETTING_HOVER_DELAY_HELPTEXT :Viive ennen työkaluvihjeen näyttämistä, kun hiiren kursoria pidetään käyttöliittymäelementin päällä. Vaihtoehtoisesti työkaluvihjeen saa myös näkymiin painamalla hiiren oikeaa näppäintä jos arvoksi on määritetty 0.
+STR_CONFIG_SETTING_HOVER_DELAY_HELPTEXT :Viive ennen työkaluvihjeen näyttämistä, kun hiiren kursoria pidetään käyttöliittymäelementin päällä. Vaihtoehtoisesti työkaluvihjeen saa myös näkymiin painamalla hiiren oikeata painiketta, kun arvoksi on määritetty 0.
STR_CONFIG_SETTING_HOVER_DELAY_VALUE :Pidä hiirtä päällä {COMMA} millisekunti{P 0 "" a}
-STR_CONFIG_SETTING_HOVER_DELAY_DISABLED :Hiiren oikea näppäin
+STR_CONFIG_SETTING_HOVER_DELAY_DISABLED :Hiiren oikea painike
STR_CONFIG_SETTING_POPULATION_IN_LABEL :Näytä kaupungin asukasluku kaupungin nimessä: {STRING}
STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Näytä kaupunkien asukasluku kartalla
STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Viivojen paksuus kuvaajissa: {STRING}
@@ -1334,6 +1339,12 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Maaston väri k
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Vihreä
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Tummanvihreä
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violetti
+STR_CONFIG_SETTING_SCROLLMODE :Näkymän vieritystapa: {STRING}
+STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Toiminta karttaa vieritettäessä
+STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Siirrä näkymää hiiren oikealla painikkeella, hiiren sijainti lukiten
+STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Siirrä karttaa hiiren oikealla painikkeella, hiiren sijainti lukiten
+STR_CONFIG_SETTING_SCROLLMODE_RMB :Siirrä karttaa hiiren oikealla painikkeella
+STR_CONFIG_SETTING_SCROLLMODE_LMB :Siirrä karttaa hiiren vasemmalla painikkeella
STR_CONFIG_SETTING_SMOOTH_SCROLLING :Näkymän tasainen vieritys: {STRING}
STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Hallitse miten päänäkymä siirtyy valittuun paikkaan karttaa klikattaessa tai käytettäessä komentoa joka muuttaa näkymän sijaintia. Mikäli käytössä, päänäkymä siirtyy uuteen sijaintiin pehmeäesti, muutoin se hyppää suoraan valittuun sijaintiin
STR_CONFIG_SETTING_MEASURE_TOOLTIP :Näytä mittauksen työkaluvihje, kun käytetään rakennustyökaluja: {STRING}
@@ -1355,12 +1366,12 @@ STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER_HELPTEXT :Määritä hiir
STR_CONFIG_SETTING_OSK_ACTIVATION :Virtuaalinäppäimistö: {STRING}
STR_CONFIG_SETTING_OSK_ACTIVATION_HELPTEXT :Valitse tapa, jolla virtuaalinäppäimistö avataan syötettäessä tekstiä kun käytössä on ainoastaan osoitinlaite. Tämä on tarkoitettu pienille laitteille, joissa ei ole fyysistä näppäimistöä
STR_CONFIG_SETTING_OSK_ACTIVATION_DISABLED :Pois käytöstä
-STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Tuplaklikkaus
-STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Yksi klikkaus (kun kohdistettuna)
-STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Yksi klikkaus (välittömästi)
+STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Kaksoisnapsautus
+STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Yksi napsautus (kun kohdistettuna)
+STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Yksi napsautus (välitön)
STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Oikean painikkeen emulointi: {STRING}
-STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Määritä kuinka hiiren oikean näppäimen painalluksia emuloidaan
+STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Valitse, miten hiiren oikean painikkeen painalluksia emuloidaan
STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command
STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Klik
STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Pois
@@ -1379,9 +1390,9 @@ STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_ISO :ISO (2008-12-31
STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME :Uusi peli alkaa pysäytettynä: {STRING}
STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME_HELPTEXT :Mikäli käytössä, peli pysäytetään automaattisesti uuden pelin alussa, mahdollistaen esimerkiksi kartan tarkemman tutkimisen
-STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL :Pelin ollessa pysäytetty, salli: {STRING}
+STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL :Salli pelin ollessa pysäytettynä: {STRING}
STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_HELPTEXT :Valitse käytössä olevat toiminnot pelin ollessa pysäytettynä
-STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_NO_ACTIONS :Ei mitkään toiminnot
+STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_NO_ACTIONS :Ei mitään toimintoja
STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_CONSTRUCTION :Kaikki ei-rakennustoiminnot
STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_LANDSCAPING :Kaikki paitsi maastonmuokkaustoiminnot
STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_ACTIONS :Kaikki toiminnot
@@ -1389,8 +1400,8 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS :Käytä ryhmiä
STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Salli kehittyneiden kulkuneuvolistojen käyttö kulkuneuvojen ryhmittelyssä
STR_CONFIG_SETTING_LOADING_INDICATORS :Lastausilmaisimet: {STRING}
STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Määritä näytetäänkö lastausilmaisimet kulkuneuvojen yläpuolella lastatessa ja purettaessa rahtia
-STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Näytä aikataulu tickseissä päivien sijaan: {STRING}
-STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Näytä aikataulun ajat päivien sijasta tickeinä
+STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Näytä aikataulu askelina päivien sijaan: {STRING}
+STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Näytä aikataulun ajat päivien sijasta askelina
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Näytä saapuminen ja lähtö aikatauluissa: {STRING}
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Näytä odotetut saapumis- ja lähtemisajat aikatauluissa
STR_CONFIG_SETTING_QUICKGOTO :Nopea kulkuneuvon käskyjen luominen: {STRING}
@@ -1415,8 +1426,8 @@ STR_CONFIG_SETTING_SOUND_NEW_YEAR :Vuoden loppu: {
STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :Toista ääni vuoden lopussa verrattaessa yhtiön tulosta edelliseen vuoteen
STR_CONFIG_SETTING_SOUND_CONFIRM :Rakentaminen: {STRING}
STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT :Toista ääni onnistuneen rakennus- tai muun toiminnon jälkeen
-STR_CONFIG_SETTING_SOUND_CLICK :Painikkeiden klikkaus: {STRING}
-STR_CONFIG_SETTING_SOUND_CLICK_HELPTEXT :Piippaa klikattaessa painikkeita
+STR_CONFIG_SETTING_SOUND_CLICK :Painikkeiden napsautus: {STRING}
+STR_CONFIG_SETTING_SOUND_CLICK_HELPTEXT :Piippaa painikkeita napsauttaessa
STR_CONFIG_SETTING_SOUND_DISASTER :Vahingot/onnettomuudet: {STRING}
STR_CONFIG_SETTING_SOUND_DISASTER_HELPTEXT :Toista vahinkojen ja onnettomuuksien äänet
STR_CONFIG_SETTING_SOUND_VEHICLE :Ajoneuvot: {STRING}
@@ -1542,8 +1553,8 @@ STR_CONFIG_SETTING_TOWN_LAYOUT :Uusissa kaupung
STR_CONFIG_SETTING_TOWN_LAYOUT_HELPTEXT :Kaupunkien käyttämä tieverkon kaava
STR_CONFIG_SETTING_TOWN_LAYOUT_DEFAULT :Alkuperäinen
STR_CONFIG_SETTING_TOWN_LAYOUT_BETTER_ROADS :Parempia teitä
-STR_CONFIG_SETTING_TOWN_LAYOUT_2X2_GRID :2x2-ruudukko
-STR_CONFIG_SETTING_TOWN_LAYOUT_3X3_GRID :3x3-ruudukko
+STR_CONFIG_SETTING_TOWN_LAYOUT_2X2_GRID :2×2-ruudukko
+STR_CONFIG_SETTING_TOWN_LAYOUT_3X3_GRID :3×3-ruudukko
STR_CONFIG_SETTING_TOWN_LAYOUT_RANDOM :Satunnainen
STR_CONFIG_SETTING_ALLOW_TOWN_ROADS :Kaupungit saavat rakentaa teitä: {STRING}
STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Salli kaupunkien rakentaa teitä kasvaessaan. Mikäli pois käytöstä, kaupungit eivät voi rakentaa teitä itse
@@ -1564,9 +1575,9 @@ STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_RAINFOREST :Vain sademetsii
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_ALL :Kaikkialle
STR_CONFIG_SETTING_TOOLBAR_POS :Päätyökalupalkin sijainti: {STRING}
-STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Ruudun yläreunassa olevan työkalupalkin sijainti leveyssuunnassa
+STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Ruudun yläreunassa olevan työkalupalkin sijainti vaakasuunnassa
STR_CONFIG_SETTING_STATUSBAR_POS :Tilarivin sijainti: {STRING}
-STR_CONFIG_SETTING_STATUSBAR_POS_HELPTEXT :Ruudun alareunassa olevan tilapalkin sijanti leveyssuunnassa
+STR_CONFIG_SETTING_STATUSBAR_POS_HELPTEXT :Ruudun alareunassa olevan tilapalkin sijanti vaakasuunnassa
STR_CONFIG_SETTING_SNAP_RADIUS :Ikkunoiden kiinnittymisetäisyys: {STRING}
STR_CONFIG_SETTING_SNAP_RADIUS_HELPTEXT :Ikkunoiden välinen etäisyys ennen niiden kohdistamista toistensa kanssa
STR_CONFIG_SETTING_SNAP_RADIUS_VALUE :{COMMA} pikseli{P 0 "" ä}
@@ -1593,7 +1604,7 @@ STR_CONFIG_SETTING_TOWN_GROWTH_NORMAL :Tavallinen
STR_CONFIG_SETTING_TOWN_GROWTH_FAST :Nopea
STR_CONFIG_SETTING_TOWN_GROWTH_VERY_FAST :Erittäin nopea
STR_CONFIG_SETTING_LARGER_TOWNS :Suurkaupunkien osuus: {STRING}
-STR_CONFIG_SETTING_LARGER_TOWNS_HELPTEXT :Suurkaupungiksi muuttuvien kaupunkien määrä, eli kaupungit jotka ovat suurempia ja kasvavat nopeammin
+STR_CONFIG_SETTING_LARGER_TOWNS_HELPTEXT :Suurkaupungiksi muuttuvien kaupunkien määrä, eli suurempana aloittavat ja nopeammin kasvavat kaupungit
STR_CONFIG_SETTING_LARGER_TOWNS_VALUE :1 / {COMMA}
STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Ei yhtään
STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Kasvukerroin alussa: {STRING}
@@ -1778,7 +1789,7 @@ STR_OSNAME_OS2 :OS/2
STR_OSNAME_SUNOS :SunOS
# Abandon game
-STR_ABANDON_GAME_CAPTION :{WHITE}Lopeta peli
+STR_ABANDON_GAME_CAPTION :{WHITE}Pelin lopetus
STR_ABANDON_GAME_QUERY :{YELLOW}Lopetetaanko peli?
STR_ABANDON_SCENARIO_QUERY :{YELLOW}Lopetetaanko skenaario?
@@ -1981,7 +1992,7 @@ STR_NETWORK_LANG_ANY :mikä tahansa
STR_NETWORK_LANG_ENGLISH :englanti
STR_NETWORK_LANG_GERMAN :saksa
STR_NETWORK_LANG_FRENCH :ranska
-STR_NETWORK_LANG_BRAZILIAN :brasilia
+STR_NETWORK_LANG_BRAZILIAN :brasilianportugali
STR_NETWORK_LANG_BULGARIAN :bulgaria
STR_NETWORK_LANG_CHINESE :kiina
STR_NETWORK_LANG_CZECH :tšekki
@@ -2008,7 +2019,7 @@ STR_NETWORK_LANG_TURKISH :turkki
STR_NETWORK_LANG_UKRAINIAN :ukraina
STR_NETWORK_LANG_AFRIKAANS :afrikaans
STR_NETWORK_LANG_CROATIAN :kroatia
-STR_NETWORK_LANG_CATALAN :katalan
+STR_NETWORK_LANG_CATALAN :katalaani
STR_NETWORK_LANG_ESTONIAN :viro
STR_NETWORK_LANG_GALICIAN :galego
STR_NETWORK_LANG_GREEK :kreikka
@@ -2183,7 +2194,7 @@ STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} on
STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} on poistunut pelistä ({2:STRING})
STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} on muuttanut nimekseen {STRING}
STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} antoi yhtiöllesi {2:CURRENCY_LONG}
-STR_NETWORK_MESSAGE_GAVE_MONEY_AWAY :*** Annoit henkilölle {1:STRING} {2:CURRENCY_LONG}
+STR_NETWORK_MESSAGE_GAVE_MONEY_AWAY :*** Annoit yhtiölle {1:STRING} {2:CURRENCY_LONG}
STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Palvelin sulki istunnon
STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Palvelin käynnistyy uudelleen...{}Odota, ole hyvä...
@@ -2193,7 +2204,7 @@ STR_CONTENT_TYPE_CAPTION :{BLACK}Tyyppi
STR_CONTENT_TYPE_CAPTION_TOOLTIP :{BLACK}Sisällön tyyppi
STR_CONTENT_NAME_CAPTION :{BLACK}Nimi
STR_CONTENT_NAME_CAPTION_TOOLTIP :{BLACK}Sisällön nimi
-STR_CONTENT_MATRIX_TOOLTIP :{BLACK}Klikkaa kohtaa nähdäkesi lisätiedot{}Klikkaa valintaruutua valitaksesi sen ladattavaksi
+STR_CONTENT_MATRIX_TOOLTIP :{BLACK}Katso lisätiedot napsauttamalla riviä{}Valitse ladattavaksi valintaruutua napsauttamalla
STR_CONTENT_SELECT_ALL_CAPTION :{BLACK}Valitse kaikki
STR_CONTENT_SELECT_ALL_CAPTION_TOOLTIP :{BLACK}Merkitse kaikki sisältö ladattavaksi
STR_CONTENT_SELECT_UPDATES_CAPTION :{BLACK}Valitse päivitykset
@@ -2278,6 +2289,7 @@ STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Rahtivir
STR_LINKGRAPH_LEGEND_ALL :{BLACK}Kaikki
STR_LINKGRAPH_LEGEND_NONE :{BLACK}Ei mitään
STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Valitse näytettävät yhtiöt
+STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY}
# Linkgraph legend window and linkgraph legend in smallmap
STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}käyttämätön
@@ -2306,16 +2318,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 kustannearvion välillä
-STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Rakenna rautatiet käyttäen Autorail-tilaa. Ctrl vaihtaa rakennus/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannearvion välillä
-STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Rakenna veturitalli (junien ostamista ja huoltoa varten). Shift vaihtaa rakennustilan ja kustannearvion välillä
-STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Muunna raide reittipisteeksi. Ctrl liittää reittipisteet. Shift vaihtaa muuntotilan ja kustannearvion välillä
-STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Rakenna rautatieasema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannearvion välillä
-STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Rakenna opastimia. Ctrl vaihtaa joko siipiopastimet tai valo-opastimet{}Vetäminen rakentaa opastimia suoralle rautatielle. Ctrl rakentaa opastimia seuraavaan risteykseen saakka{}Ctrl+Click avaa opastimenvalintaikkunan. Shift vaihtaa rakennustilan ja kustannearvion välillä
-STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Rakenna rautatiesilta. Shift vaihtaa rakennustilan ja kustannearvion välillä
-STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Rakenna rautatietunneli. Shift vaihtaa rakennustilan ja kustannearvion välillä
+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}Muunna raide reittipisteeksi. Ctrl liittää reittipisteet. Shift vaihtaa muuntotilan 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 opastimia. Ctrl vaihtaa joko siipiopastimet tai valo-opastimet{}Vetäminen rakentaa opastimia suoralle rautatielle. Ctrl rakentaa opastimia seuraavaan risteykseen saakka{}Ctrl+Click avaa opastimenvalintaikkunan. Shift vaihtaa rakennustilan ja kustannusarvion välillä
+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 kustannearvion välillä
+STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Muunna/päivitä raidetyyppi. Shift vaihtaa muuntotilan ja kustannusarvion välillä
STR_RAIL_NAME_RAILROAD :Rautatie
STR_RAIL_NAME_ELRAIL :Sähköistetty rautatie
@@ -2361,7 +2373,7 @@ STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Poistumi
STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Yhdistelmäopastin (valo-opastin){}Yhdistelmäopastin toimii yhtä aikaa tulo- ja poistumisopastimena. Tämän avulla on mahdollista luoda suuria "opastinpuita"
STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Reittiopastin (valo-opastin){}Reittiopastin varmistaa junille turvallisen reitin ja siten mahdollistaa useampien junien yhtäaikaisen liikenteen moniraiteisissa risteyksissä. Tavalliset reittiopastimet voi ohittaa takakautta
STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Yksisuuntainen reittiopastin (valo-opastin){}Reittiopastin varmistaa junille turvallisen reitin ja siten mahdollistaa useampien junien yhtäaikaisen liikenteen moniraiteisissa risteyksissä. Yksisuuntaisia opastimia ei voi ohittaa takakautta
-STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Opastinten muuntaminen{}Kun tämä on valittu, olemassaolevan opastimen klikkaaminen muuntaa siitä valituntyyppisen ja -muotoisen. Ctrl+Klik vaihtaa nykyistä opastimen muotoa. Shift+Klik näyttää muuntamisen kustannearvion
+STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Opastinten muuntaminen{}Kun tämä on valittu, olemassaolevan opastimen napsauttaminen muuntaa siitä valituntyyppisen ja -muotoisen. Ctrl+Klik vaihtaa nykyistä opastimen muotoa. Shift+Klik näyttää muuntamisen kustannusarvion
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}Opastimien väli vetämällä lisättäessä
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}Pienennä opastimien väliä vetämällä lisättäessä
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Suurenna opastimien väliä vetämällä lisättäessä
@@ -2385,29 +2397,29 @@ 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 kustannearvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Rakenna raitiotietä. Ctrl vaihtaa rakennus/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannearvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Rakenna tieosuus käyttäen Autoroad-tilaa. Ctrl vaihtaa rakennus/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannearvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Rakenna raitiotieosuus käyttäen Autotram-tilaa. Ctrl vaihtaa rakennus/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannearvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Rakenna autovarikko (ajoneuvojen ostamista ja huoltoa varten). Shift vaihtaa rakennustilan ja kustannearvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Rakenna raitiotievarikko (vaunujen ostamiseen ja korjaamiseen). Shift vaihtaa rakennustilan ja kustannearvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Rakenna linja-autoasema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannearvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Rakenna matkustaja-asema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannearvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Rakenna lastauslaituri. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannearvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Rakenna rahtiasema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannearvion välillä
+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_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 liittää asemat. 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_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 kustannearvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Rakenna raitiotiesilta. Shift vaihtaa rakennustilan ja kustannearvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Rakenna maantietunneli. Shift vaihtaa rakennustilan ja kustannearvion välillä
-STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Rakenna raitiotietunneli. Shift vaihtaa rakennustilan ja kustannearvion välillä
+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_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ä
# Road depot construction window
STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION :{WHITE}Autovarikon suunta
STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP :{BLACK}Valitse autovarikon suunta.
-STR_BUILD_DEPOT_TRAM_ORIENTATION_CAPTION :{WHITE}Varikon suunta
-STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP :{BLACK}Valitse varikon suunta
+STR_BUILD_DEPOT_TRAM_ORIENTATION_CAPTION :{WHITE}Raitiotievarikon suunta
+STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP :{BLACK}Valitse raitiotievarikon suunta
# Road vehicle station construction window
STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Linja-autoaseman suunta
@@ -2422,12 +2434,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 kustannearvion välillä
-STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Rakenna sulku. Shift vaihtaa rakennustilan ja kustannearvion välillä
-STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Rakenna telakka (laivojen ostamista ja huoltamista varten). Shift vaihtaa rakennustilan ja kustannearvion välillä
-STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Rakenna satama. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannearvion välillä
-STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Sijoita poiju: voidaan käyttää reittipisteenä. Shift vaihtaa rakennustilan ja kustannearvion välillä
-STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Rakenna akvedukti. Shift vaihtaa rakennustilan ja kustannearvion välillä
+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_CREATE_LAKE_TOOLTIP :{BLACK}Määrittele vesialue.{}Tee kanava, paitsi jos Ctrl on painettuna merenpinnalla. Tällöin meri laajenee ympäristöön.
STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Sijoita jokia
@@ -2440,7 +2452,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 kustannearvion välillä
+STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP :{BLACK}Rakenna lentokenttä. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä
# Airport construction window
STR_STATION_BUILD_AIRPORT_CAPTION :{WHITE}Lentokentän valinta
@@ -2467,17 +2479,17 @@ 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 kustannearvion 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 kustannearvion välillä
-STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Tasoita maata ensimmäisen valitun kulman korkeudelle. Ctrl valitsee alueen vinottain. Shift vaihtaa muokkaustilan ja kustannearvion välillä
-STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Osta maata tulevaa käyttöä varten. Shift vaihtaa ostotilan ja kustannearvion välillä
+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. Shift vaihtaa ostotilan ja kustannusarvion välillä
# Object construction window
STR_OBJECT_BUILD_CAPTION :{WHITE}Objektin valinta
-STR_OBJECT_BUILD_TOOLTIP :{BLACK}Valitse rakennettava objekti. Shift vaihtaa rakennustilan ja kustannearvion välillä
+STR_OBJECT_BUILD_TOOLTIP :{BLACK}Valitse rakennettava objekti. Shift vaihtaa rakennustilan ja kustannusarvion välillä
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} x {NUM} ruutua
+STR_OBJECT_BUILD_SIZE :{BLACK}Koko: {GOLD}{NUM} × {NUM} ruutua
STR_OBJECT_CLASS_LTHS :Majakat
STR_OBJECT_CLASS_TRNS :Lähettimet
@@ -2486,7 +2498,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}Aseta sattumanvaraisia puita. Shift vaihtaa istutustilan ja kustannearvion välillä
+STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Aseta sattumanvaraisia puita. Shift vaihtaa istutustilan ja kustannusarvion välillä
STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Satunnaisia puita.
STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Istuta puita satunnaisesti maastoon
@@ -2507,7 +2519,7 @@ STR_RESET_LANDSCAPE_CONFIRMATION_TEXT :{WHITE}Haluatko
# Town generation window (SE)
STR_FOUND_TOWN_CAPTION :{WHITE}Luo kaupunkeja
STR_FOUND_TOWN_NEW_TOWN_BUTTON :{BLACK}Uusi kaupunki
-STR_FOUND_TOWN_NEW_TOWN_TOOLTIP :{BLACK}Perusta uusi kaupunki. Shift+Klik näyttää vain kustannearvion
+STR_FOUND_TOWN_NEW_TOWN_TOOLTIP :{BLACK}Perusta uusi kaupunki. Shift+Klik näyttää vain kustannusarvion
STR_FOUND_TOWN_RANDOM_TOWN_BUTTON :{BLACK}Satunnainen kaupunki
STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP :{BLACK}Perusta kaupunki satunnaiseen paikkaan
STR_FOUND_TOWN_MANY_RANDOM_TOWNS :{BLACK}Monta satunnaista kaupunkia
@@ -2515,7 +2527,7 @@ STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP :{BLACK}Peitä k
STR_FOUND_TOWN_NAME_TITLE :{YELLOW}Kaupungin nimi:
STR_FOUND_TOWN_NAME_EDITOR_TITLE :{BLACK}Syötä kaupungin nimi
-STR_FOUND_TOWN_NAME_EDITOR_HELP :{BLACK}Klikkaa syöttääksesi kaupungin nimen
+STR_FOUND_TOWN_NAME_EDITOR_HELP :{BLACK}Syötä kaupungin nimi napsauttamalla
STR_FOUND_TOWN_NAME_RANDOM_BUTTON :{BLACK}Satunnainen nimi
STR_FOUND_TOWN_NAME_RANDOM_TOOLTIP :{BLACK}Arvo uusi satunnainen nimi
@@ -2532,8 +2544,8 @@ STR_FOUND_TOWN_ROAD_LAYOUT :{YELLOW}Kaupung
STR_FOUND_TOWN_SELECT_TOWN_ROAD_LAYOUT :{BLACK}Valitse tiekaava tälle kaupungille
STR_FOUND_TOWN_SELECT_LAYOUT_ORIGINAL :{BLACK}Alkuperäinen
STR_FOUND_TOWN_SELECT_LAYOUT_BETTER_ROADS :{BLACK}Parempia teitä
-STR_FOUND_TOWN_SELECT_LAYOUT_2X2_GRID :{BLACK}2x2-ruudukko
-STR_FOUND_TOWN_SELECT_LAYOUT_3X3_GRID :{BLACK}3x3-ruudukko
+STR_FOUND_TOWN_SELECT_LAYOUT_2X2_GRID :{BLACK}2×2-ruudukko
+STR_FOUND_TOWN_SELECT_LAYOUT_3X3_GRID :{BLACK}3×3-ruudukko
STR_FOUND_TOWN_SELECT_LAYOUT_RANDOM :{BLACK}Sattumanvarainen
# Fund new industry window
@@ -2552,8 +2564,8 @@ STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Teollisu
STR_INDUSTRY_CARGOES_PRODUCERS :{WHITE}Tuottavia teollisuuksia
STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Hyväksyviä teollisuuksia
STR_INDUSTRY_CARGOES_HOUSES :{WHITE}Taloja
-STR_INDUSTRY_CARGOES_INDUSTRY_TOOLTIP :{BLACK}Klikkaa teollisuutta nähdäksesi sen tuottajat ja kuluttajat
-STR_INDUSTRY_CARGOES_CARGO_TOOLTIP :{BLACK}{STRING}{}Klikkaa rahtia nähdäksesi sen tuottajat ja kuluttajat
+STR_INDUSTRY_CARGOES_INDUSTRY_TOOLTIP :{BLACK}Napsauta teollisuutta nähdäksesi sen tuottajat ja kuluttajat
+STR_INDUSTRY_CARGOES_CARGO_TOOLTIP :{BLACK}{STRING}{}Napsauta rahtia nähdäksesi sen tuottajat ja kuluttajat
STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Näytä ketju
STR_INDUSTRY_DISPLAY_CHAIN_TOOLTIP :{BLACK}Näytä rahdin tuottajat ja hyväksyvät teollisuudet
STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP :{BLACK}Yhdistä karttaan
@@ -2686,6 +2698,36 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Alkuper
STR_ABOUT_VERSION :{BLACK}OpenTTD-versio {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 The OpenTTD team
+# Framerate display window
+STR_FRAMERATE_CAPTION :{WHITE}Kuvataajuus
+STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} ({DECIMAL}×)
+STR_FRAMERATE_RATE_GAMELOOP :{WHITE}Simulaationopeus: {STRING}
+STR_FRAMERATE_RATE_BLITTER :{WHITE}Grafiikan kuvataajuus: {STRING}
+STR_FRAMERATE_SPEED_FACTOR :{WHITE}Pelin nykyinen nopeuskerroin: {DECIMAL}×
+STR_FRAMERATE_CURRENT :{WHITE}Nykyinen
+STR_FRAMERATE_DATA_POINTS :{BLACK}Data perustuu {COMMA} mittaukseen
+STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL}{WHITE} ms
+STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL}{WHITE} ms
+STR_FRAMERATE_MS_BAD :{RED}{DECIMAL}{WHITE} ms
+STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL}{WHITE} kuvaa/s
+STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL}{WHITE} kuvaa/s
+STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL}{WHITE} kuvaa/s
+STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA} ms
+STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} s
+############ Leave those lines in this order!!
+STR_FRAMERATE_GL_ROADVEHS :{BLACK} Ajoneuvoaskeleet:
+STR_FRAMERATE_GL_SHIPS :{BLACK} Laiva-askeleet:
+STR_FRAMERATE_GL_LANDSCAPE :{BLACK} Maailma-askeleet:
+STR_FRAMERATE_DRAWING_VIEWPORTS :{BLACK} Maailmanäkymät:
+STR_FRAMERATE_VIDEO :{WHITE}Videolähtö:
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+STR_FRAMETIME_CAPTION_GL_SHIPS :Laiva-askeleet
+STR_FRAMETIME_CAPTION_GL_AIRCRAFT :Ilma-alusaskeleet
+STR_FRAMETIME_CAPTION_VIDEO :Videolähtö
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Tallenna peli
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Lataa peli
@@ -2708,6 +2750,7 @@ STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Tietoja
STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Tietoja ei ole saatavilla
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING}
STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: {WHITE}{STRING}
+STR_SAVELOAD_FILTER_TITLE :{BLACK}Suodatinteksti:
STR_SAVELOAD_OSKTITLE :{BLACK}Syötä nimi tallennustiedostolle
@@ -2716,9 +2759,9 @@ STR_MAPGEN_WORLD_GENERATION_CAPTION :{WHITE}Maailman
STR_MAPGEN_MAPSIZE :{BLACK}Kartan koko:
STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Valitse kartan koko ruutuina. Saatavilla olevien ruutujen määrä on hieman alhaisempi
STR_MAPGEN_BY :{BLACK}×
-STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Kaupungit:
+STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Kaupunkien määrä:
STR_MAPGEN_DATE :{BLACK}Päivämäärä:
-STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Teollisuus:
+STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Teollisuuden määrä:
STR_MAPGEN_MAX_HEIGHTLEVEL :{BLACK}Suurin sallittu kartan korkeus:
STR_MAPGEN_MAX_HEIGHTLEVEL_UP :{BLACK}Kasvata suurinta sallittua vuorten korkeutta yhdellä
STR_MAPGEN_MAX_HEIGHTLEVEL_DOWN :{BLACK}Vähennä suurinta sallittua vuorten korkeutta yhdellä
@@ -2970,7 +3013,8 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Syötä
STR_TOWN_DIRECTORY_CAPTION :{WHITE}Kaupungit
STR_TOWN_DIRECTORY_NONE :{ORANGE}- Ei mitään -
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA})
-STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Kaupunkien nimet - nimen klikkaaminen keskittää päänäkymän kaupunkiin. Ctrl+Klik avaa uuden näkymäikkunan kaupungin sijaintiin
+STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (suurkaup.){BLACK} ({COMMA})
+STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Kaupunkien nimet - keskitä päänäkymä kaupunkiin napsauttamalla nimeä. Ctrl+Klik avaa uuden näkymäikkunan kaupungin sijaintiin
STR_TOWN_POPULATION :{BLACK}Maailman asukasluku: {COMMA}
# Town view window
@@ -3036,7 +3080,7 @@ STR_GOALS_SPECTATOR_NONE :{ORANGE}- Ei sa
STR_GOALS_PROGRESS :{ORANGE}{STRING}
STR_GOALS_PROGRESS_COMPLETE :{GREEN}{STRING}
STR_GOALS_COMPANY_TITLE :{BLACK}Yhtiön tavoitteet:
-STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klikkaa tavoitetta keskittääksesi päänäkymän teollisuuteen/kaupunkiin/ruutuun. Ctrl+Klik avaa uuden näkymän teollisuuden/kaupungin/ruudun sijaintiin
+STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Keskitä päänäkymä teollisuuteen/kaupunkiin/ruutuun napsauttamalla tavoitetta. Ctrl+Klik avaa uuden näkymän teollisuuden/kaupungin/ruudun sijaintiin
# Goal question window
STR_GOAL_QUESTION_CAPTION_QUESTION :Kysymys
@@ -3075,7 +3119,7 @@ STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING
STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Napsauta palvelua keskittääksesi päänäkymän teollisuuteen/kaupunkiin. Ctrl+Klik avaa uuden näkymäikkunan teollisuuden/kaupungin sijaintiin
# Story book window
-STR_STORY_BOOK_CAPTION :{WHITE}Yhtiön {COMPANY} historia
+STR_STORY_BOOK_CAPTION :{WHITE}{COMPANY}: historia
STR_STORY_BOOK_SPECTATOR_CAPTION :{WHITE}Yleinen yhtiöhistoria
STR_STORY_BOOK_TITLE :{YELLOW}{STRING}
STR_STORY_BOOK_GENERIC_PAGE_ITEM :Sivu {NUM}
@@ -3153,7 +3197,7 @@ STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Keskitä
STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Muuta aseman nimi.
STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Näytä kaikki junat, joilla on tämä asema käskyissään.
-STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Näytä kaikki autot, joilla on tämä asema käskyissään.
+STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Näytä kaikki ajoneuvot, joilla on tämä asema käskyissään.
STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Näytä kaikki lentokoneet, joilla on tämä asema käskyissään.
STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Näytä kaikki laivat, joilla on tämä asema käskyissään.
@@ -3193,10 +3237,10 @@ STR_FINANCES_POSITIVE_INCOME :{BLACK}+{CURREN
STR_FINANCES_TOTAL_CAPTION :{WHITE}Yhteensä:
STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Tilin saldo
STR_FINANCES_LOAN_TITLE :{WHITE}Laina
-STR_FINANCES_MAX_LOAN :{WHITE}Laina enimmillään: {BLACK}{CURRENCY_LONG}
+STR_FINANCES_MAX_LOAN :{WHITE}Laina enintään: {BLACK}{CURRENCY_LONG}
STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG}
-STR_FINANCES_BORROW_BUTTON :{BLACK}Ota lainaa {CURRENCY_LONG}
-STR_FINANCES_BORROW_TOOLTIP :{BLACK}Ota lisää lainaa. Ctrl+Klik lisää lainaa niin paljon kuin mahdollista
+STR_FINANCES_BORROW_BUTTON :{BLACK}Nosta lainaa {CURRENCY_LONG}
+STR_FINANCES_BORROW_TOOLTIP :{BLACK}Ota lisää lainaa. Ctrl+Klik nostaa lainaa niin paljon kuin mahdollista
STR_FINANCES_REPAY_BUTTON :{BLACK}Lyhennä lainaa {CURRENCY_LONG}
STR_FINANCES_REPAY_TOOLTIP :{BLACK}Lyhennä lainaa. Ctrl+Klik lyhentää lainaa niin paljon kuin mahdollista
STR_FINANCES_INFRASTRUCTURE_BUTTON :{BLACK}Infrastruktuuri
@@ -3227,8 +3271,8 @@ STR_COMPANY_VIEW_BUILD_HQ_BUTTON :{BLACK}Rakenna
STR_COMPANY_VIEW_BUILD_HQ_TOOLTIP :{BLACK}Rakenna yhtiön päämaja
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}Sijoita päämaja
-STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Rakenna yhtiön päärakennus muualle, kustannus 1{NBSP}% yhtiön arvosta. Shift+Klik näyttää kustannearvion sijoittamatta päärakennusta uudelleen
+STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Siirrä päämaja
+STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Rakenna yhtiön päärakennus muualle, kustannus 1{NBSP}% yhtiön arvosta. Shift+Klik näyttää kustannusarvion sijoittamatta päärakennusta uudelleen
STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}Yksityiskohdat
STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Näytä tarkka infrastruktuurin määrä
@@ -3243,7 +3287,7 @@ STR_COMPANY_VIEW_PRESIDENT_NAME_TOOLTIP :{BLACK}Muuta p
STR_COMPANY_VIEW_BUY_SHARE_BUTTON :{BLACK}Osta 25{NBSP}%:n osuus yhtiöstä
STR_COMPANY_VIEW_SELL_SHARE_BUTTON :{BLACK}Myy 25{NBSP}%:n osuus yhtiöstä
-STR_COMPANY_VIEW_BUY_SHARE_TOOLTIP :{BLACK}Osta 25{NBSP}%:n osuus tästä yhtiöstä. Shift+Klik näyttää kustannearvion ostamatta osuuksia
+STR_COMPANY_VIEW_BUY_SHARE_TOOLTIP :{BLACK}Osta 25{NBSP}%:n osuus tästä yhtiöstä. Shift+Klik näyttää kustannusarvion ostamatta osuuksia
STR_COMPANY_VIEW_SELL_SHARE_TOOLTIP :{BLACK}Myy 25{NBSP}%:n osuus tästä yhtiöstä. Shift+Klik näyttää tuottoarvion myymättä osuuksia
STR_COMPANY_VIEW_COMPANY_NAME_QUERY_CAPTION :Yhtiön nimi
@@ -3252,7 +3296,7 @@ STR_COMPANY_VIEW_PRESIDENT_S_NAME_QUERY_CAPTION :Pääjohtajan n
STR_BUY_COMPANY_MESSAGE :{WHITE}Etsimme kuljetusyhtiötä, joka ottaisi haltuunsa yhtiömme{}{}Haluatko ostaa yhtiön {COMPANY} hintaan {CURRENCY_LONG}?
# Company infrastructure window
-STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Yhtiön {COMPANY} infrastruktuuri
+STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}{COMPANY}: Infrastruktuuri
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Rautatiepalat:
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Opastimet
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Teiden palat:
@@ -3271,7 +3315,7 @@ STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Ei mi
STR_INDUSTRY_DIRECTORY_ITEM :{ORANGE}{INDUSTRY}{BLACK} ({CARGO_LONG}{STRING}){YELLOW} ({COMMA}% kuljetettu)
STR_INDUSTRY_DIRECTORY_ITEM_TWO :{ORANGE}{INDUSTRY}{BLACK} ({CARGO_LONG}{STRING}/{CARGO_LONG}{STRING}){YELLOW} ({COMMA}%/{COMMA}% kuljetettu)
STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY}
-STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Teollisuusmuotojen nimet - klikkaa nimeä kohdistaaksesi päänäkymän teollisuuslaitokseen. Ctrl+Klik avaa uuden näkymäikkunan teollisuuslaitoksen sijaintiin
+STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Teollisuusmuotojen nimet - kohdista päänäkymä teollisuuslaitokseen napsauttamalla nimeä. Ctrl+Klik avaa uuden näkymäikkunan teollisuuslaitoksen sijaintiin
# Industry view
STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY}
@@ -3297,13 +3341,13 @@ STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Tuottaa:
############ range for produces ends
STR_CONFIG_GAME_PRODUCTION :{WHITE}Muokkaa tuotantoa (8:n kerroin, 2040 asti)
-STR_CONFIG_GAME_PRODUCTION_LEVEL :{WHITE}Muuta tuotantotasoa (prosentteina, 800% asti)
+STR_CONFIG_GAME_PRODUCTION_LEVEL :{WHITE}Muuta tuotantotasoa (prosentteina, 800{NBSP}% asti)
# Vehicle lists
-STR_VEHICLE_LIST_TRAIN_CAPTION :{WHITE}{STRING} - {COMMA} junaa
-STR_VEHICLE_LIST_ROAD_VEHICLE_CAPTION :{WHITE}{STRING} - {COMMA} ajoneuvoa
-STR_VEHICLE_LIST_SHIP_CAPTION :{WHITE}{STRING} - {COMMA} laivaa
-STR_VEHICLE_LIST_AIRCRAFT_CAPTION :{WHITE}{STRING} - {COMMA} lentokonetta
+STR_VEHICLE_LIST_TRAIN_CAPTION :{WHITE}{STRING} - {COMMA} juna{P "" a}
+STR_VEHICLE_LIST_ROAD_VEHICLE_CAPTION :{WHITE}{STRING} - {COMMA} ajoneuvo{P "" a}
+STR_VEHICLE_LIST_SHIP_CAPTION :{WHITE}{STRING} - {COMMA} laiva{P "" a}
+STR_VEHICLE_LIST_AIRCRAFT_CAPTION :{WHITE}{STRING} - {COMMA} lentokone{P "" tta}
STR_VEHICLE_LIST_TRAIN_LIST_TOOLTIP :{BLACK}Junat - napsauta junaa saadaksesi tietoja.
STR_VEHICLE_LIST_ROAD_VEHICLE_TOOLTIP :{BLACK}Ajoneuvot - napsauta ajoneuvoa saadaksesi tietoja.
@@ -3328,23 +3372,23 @@ STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Lähetä variko
STR_VEHICLE_LIST_SEND_SHIP_TO_DEPOT :Lähetä telakalle
STR_VEHICLE_LIST_SEND_AIRCRAFT_TO_HANGAR :Lähetä varikolle
-STR_VEHICLE_LIST_MASS_STOP_LIST_TOOLTIP :{BLACK}Pysäytä kaikki listalla olevat kulkuneuvot klikkaamalla
-STR_VEHICLE_LIST_MASS_START_LIST_TOOLTIP :{BLACK}Käynnistä kaikki listalla olevat ajoneuvot klikkaamalla
+STR_VEHICLE_LIST_MASS_STOP_LIST_TOOLTIP :{BLACK}Pysäytä kaikki listalla olevat kulkuneuvot napsauttamalla
+STR_VEHICLE_LIST_MASS_START_LIST_TOOLTIP :{BLACK}Käynnistä kaikki listalla olevat ajoneuvot napsauttamalla
STR_VEHICLE_LIST_SHARED_ORDERS_LIST_CAPTION :{WHITE}{COMMA} ajoneuvon jaetut käskyt
# Group window
STR_GROUP_ALL_TRAINS :Kaikki junat
-STR_GROUP_ALL_ROAD_VEHICLES :Kaikki autot
+STR_GROUP_ALL_ROAD_VEHICLES :Kaikki ajoneuvot
STR_GROUP_ALL_SHIPS :Kaikki laivat
STR_GROUP_ALL_AIRCRAFTS :Kaikki lentoalukset
STR_GROUP_DEFAULT_TRAINS :Muut junat
-STR_GROUP_DEFAULT_ROAD_VEHICLES :Muut autot
+STR_GROUP_DEFAULT_ROAD_VEHICLES :Muut ajoneuvot
STR_GROUP_DEFAULT_SHIPS :Muut laivat
STR_GROUP_DEFAULT_AIRCRAFTS :Muut lentokoneet
-STR_GROUPS_CLICK_ON_GROUP_FOR_TOOLTIP :{BLACK}Ryhmät - klikkaa ryhmää nähdäksesi kaikki kulkuneuvot tässä ryhmässä. Järjestä ryhmiä vetämällä ja pudottamalla.
+STR_GROUPS_CLICK_ON_GROUP_FOR_TOOLTIP :{BLACK}Ryhmät - napsauta ryhmää nähdäksesi kaikki kulkuneuvot tässä ryhmässä. Järjestä ryhmiä vetämällä ja pudottamalla.
STR_GROUP_CREATE_TOOLTIP :{BLACK}Luo ryhmä
STR_GROUP_DELETE_TOOLTIP :{BLACK}Poista valittu ryhmä
STR_GROUP_RENAME_TOOLTIP :{BLACK}Nimeä valittu ryhmä
@@ -3360,6 +3404,7 @@ STR_GROUP_RENAME_CAPTION :{BLACK}Nimeä r
STR_GROUP_PROFIT_THIS_YEAR :Tuotto tänä vuonna:
STR_GROUP_PROFIT_LAST_YEAR :Tuotto viime vuonna:
+STR_GROUP_OCCUPANCY :Nykyinen käyttö:
STR_GROUP_OCCUPANCY_VALUE :{NUM} %
# Build vehicle window
@@ -3405,10 +3450,10 @@ STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_BUTTON :{BLACK}Osta ajo
STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Osta laiva
STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Osta lentokone
-STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu yksikkö. Shift+Klik näyttää kustannearvion ostamatta kopiota
-STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu ajoneuvo.. Shift+Klik näyttää kustannearvion ostamatta kopiota
-STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu laiva. Shift+Klik näyttää kustannearvion ostamatta kopiota
-STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Osta korostettu lentokone. Shift+Klik näyttää kustannearvion ostamatta kopiota
+STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu yksikkö. Shift+Klik näyttää kustannusarvion ostamatta
+STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu ajoneuvo. Shift+Klik näyttää kustannusarvion ostamatta
+STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu laiva. Shift+Klik näyttää kustannusarvion ostamatta
+STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Osta korostettu lentokone. Shift+Klik näyttää kustannusarvion ostamatta
STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Nimeä
STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_BUTTON :{BLACK}Nimeä
@@ -3451,10 +3496,10 @@ STR_DEPOT_VEHICLE_TOOLTIP :{BLACK}{ENGINE}
STR_DEPOT_VEHICLE_TOOLTIP_CHAIN :{BLACK}{NUM} kulkuneuvo{P "" a}{STRING}
STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG} ({CARGO_SHORT})
-STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Junat - vedä kulkuneuvoa vasemmalla hiiren painikkella lisätäksesi/poistaaksesi junasta, oikealla näppäimellä lisätietoja, Pidä pohjassa Ctrl-näppäintä toteuttaaksesi molemmat toiminnot seuraavaan ketjuun
-STR_DEPOT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Ajoneuvot - napsauta ajoneuvoa oikealla hiiren näppäimellä saadaksesi tietoja.
-STR_DEPOT_SHIP_LIST_TOOLTIP :{BLACK}Laivat - napsauta laivaa oikealla hiiren näppäimellä saadaksesi tietoja.
-STR_DEPOT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lentokoneet - napsauta lentokonetta oikealla hiiren näppäimellä saadaksesi tietoja.
+STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Junat - vedä kulkuneuvoa vasemmalla hiiren painikkella lisätäksesi/poistaaksesi junasta, oikealla painikkeella lisätietoja. Pidä pohjassa Ctrl-näppäintä toteuttaaksesi molemmat toiminnot seuraavaan ketjuun
+STR_DEPOT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Ajoneuvot - napsauta ajoneuvoa oikealla hiiren painikkeella saadaksesi tietoja.
+STR_DEPOT_SHIP_LIST_TOOLTIP :{BLACK}Laivat - napsauta laivaa oikealla hiiren painikkeella saadaksesi tietoja.
+STR_DEPOT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lentokoneet - napsauta lentokonetta oikealla hiiren painikkeella saadaksesi tietoja.
STR_DEPOT_TRAIN_SELL_TOOLTIP :{BLACK}Vedä yksikkö tähän myydäksesi sen.
STR_DEPOT_ROAD_VEHICLE_SELL_TOOLTIP :{BLACK}Vedä ajoneuvo tähän myydäksesi sen.
@@ -3463,12 +3508,12 @@ STR_DEPOT_AIRCRAFT_SELL_TOOLTIP :{BLACK}Vedä le
STR_DEPOT_DRAG_WHOLE_TRAIN_TO_SELL_TOOLTIP :{BLACK}Vedä junan veturi tähän myydäksesi koko junan.
-STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TOOLTIP :{BLACK}Myy kaikki varikolla olevat junat
+STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TOOLTIP :{BLACK}Myy kaikki veturitallilla olevat junat
STR_DEPOT_SELL_ALL_BUTTON_ROAD_VEHICLE_TOOLTIP :{BLACK}Myy kaikki varikolla olevat ajoneuvot
STR_DEPOT_SELL_ALL_BUTTON_SHIP_TOOLTIP :{BLACK}Myy kaikki telakalla olevat laivat
STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TOOLTIP :{BLACK}Myy kaikki hallissa olevat ilma-alukset
-STR_DEPOT_AUTOREPLACE_TRAIN_TOOLTIP :{BLACK}Korvaa kaikki varikolla olevat junat automaattisesti
+STR_DEPOT_AUTOREPLACE_TRAIN_TOOLTIP :{BLACK}Korvaa kaikki veturitallilla olevat junat automaattisesti
STR_DEPOT_AUTOREPLACE_ROAD_VEHICLE_TOOLTIP :{BLACK}Korvaa kaikki varikolla olevat ajoneuvot automaattisesti
STR_DEPOT_AUTOREPLACE_SHIP_TOOLTIP :{BLACK}Korvaa kaikki telakalla olevat laivat automaattisesti
STR_DEPOT_AUTOREPLACE_AIRCRAFT_TOOLTIP :{BLACK}Korvaa kaikki hallissa olevat lento-alukset automaattisesti
@@ -3488,10 +3533,10 @@ STR_DEPOT_CLONE_ROAD_VEHICLE :{BLACK}Kloonaa
STR_DEPOT_CLONE_SHIP :{BLACK}Kloonaa laiva
STR_DEPOT_CLONE_AIRCRAFT :{BLACK}Kloonaa lentokone
-STR_DEPOT_CLONE_TRAIN_DEPOT_INFO :{BLACK}Tämä ostaa kopion junasta ja kaikista sen vaunuista. Paina tätä nappia ja sen jälkeen junaa varikon sisä- tai ulkopuolella. Ctrl+Klik jakaa komennot. Shift+Klik näyttää kustannearvion ostamatta kopiota
-STR_DEPOT_CLONE_ROAD_VEHICLE_DEPOT_INFO :{BLACK}Tämä ostaa kopion ajoneuvosta. Paina tätä nappia ja sen jälkeen ajoneuvoa varikon sisä- tai ulkopuolella. Ctrl+Klik jakaa komennot. Shift+Klik näyttää kustannearvion ostamatta kopiota
-STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Tämä ostaa kopion laivasta. Paina tätä nappia ja sen jälkeen laivaa telakan sisä- tai ulkopuolella. Ctrl+Klik jakaa komennot. Shift+Klik näyttää kustannearvion ostamatta kopiota
-STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Tämä ostaa kopion lentokoneesta. Paina tätä nappia ja sen jälkeen lentokonetta lentokonehallin sisä- tai ulkopuolella. Ctrl+Klik jakaa komennot. Shift+Klik näyttää kustannearvion ostamatta kopiota
+STR_DEPOT_CLONE_TRAIN_DEPOT_INFO :{BLACK}Tämä ostaa kopion junasta ja kaikista sen vaunuista. Napsauta tätä painiketta ja sen jälkeen junaa varikon sisä- tai ulkopuolella. Ctrl+Klik jakaa komennot. Shift+Klik 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+Klik jakaa komennot. Shift+Klik 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+Klik jakaa komennot. Shift+Klik 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+Klik jakaa komennot. Shift+Klik näyttää kustannusarvion ostamatta kopiota
STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Keskitä näkymä veturitallin sijaintiin. Ctrl+Klik avaa uuden näkymäikkunan veturitallin sijaintiin
STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä varikon sijaintiin. Ctrl+Klik avaa uuden näkymäikkunan varikon sijaintiin
@@ -3503,15 +3548,15 @@ STR_DEPOT_VEHICLE_ORDER_LIST_ROAD_VEHICLE_TOOLTIP :{BLACK}Näytä
STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TOOLTIP :{BLACK}Näytä tässä terminaalissa olevien laivojen käskyt
STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TOOLTIP :{BLACK}Näytä tämän lentokentän ilma-alusten käskyistä hallista riippumatta
-STR_DEPOT_MASS_STOP_DEPOT_TRAIN_TOOLTIP :{BLACK}Pysäytä kaikki varikolla olevat junat klikkaamalla
-STR_DEPOT_MASS_STOP_DEPOT_ROAD_VEHICLE_TOOLTIP :{BLACK}Pysäytä kaikki varikolla olevat ajoneuvot klikkaamalla
-STR_DEPOT_MASS_STOP_DEPOT_SHIP_TOOLTIP :{BLACK}Pysäytä kaikki telakalla olevat laivat klikkaamalla
-STR_DEPOT_MASS_STOP_HANGAR_TOOLTIP :{BLACK}Pysäytä kaikki hallissa olevat ilma-alukset klikkaamalla
+STR_DEPOT_MASS_STOP_DEPOT_TRAIN_TOOLTIP :{BLACK}Pysäytä kaikki veturitallilla olevat junat napsauttamalla
+STR_DEPOT_MASS_STOP_DEPOT_ROAD_VEHICLE_TOOLTIP :{BLACK}Pysäytä kaikki varikolla olevat ajoneuvot napsauttamalla
+STR_DEPOT_MASS_STOP_DEPOT_SHIP_TOOLTIP :{BLACK}Pysäytä kaikki telakalla olevat laivat napsauttamalla
+STR_DEPOT_MASS_STOP_HANGAR_TOOLTIP :{BLACK}Pysäytä kaikki hallissa olevat ilma-alukset napsauttamalla
-STR_DEPOT_MASS_START_DEPOT_TRAIN_TOOLTIP :{BLACK}Käynnistä kaikki varikolla olevat junat klikkaamalla
-STR_DEPOT_MASS_START_DEPOT_ROAD_VEHICLE_TOOLTIP :{BLACK}Käynnistä kaikki varikolla olevat ajoneuvot klikkaamalla
-STR_DEPOT_MASS_START_DEPOT_SHIP_TOOLTIP :{BLACK}Käynnistä kaikki telakalla olevat laivat klikkaamalla
-STR_DEPOT_MASS_START_HANGAR_TOOLTIP :{BLACK}Käynnistä kaikki hallissa olevat ilma-alukset klikkaamalla
+STR_DEPOT_MASS_START_DEPOT_TRAIN_TOOLTIP :{BLACK}Käynnistä kaikki veturitallilla olevat junat napsauttamalla
+STR_DEPOT_MASS_START_DEPOT_ROAD_VEHICLE_TOOLTIP :{BLACK}Käynnistä kaikki varikolla olevat ajoneuvot napsauttamalla
+STR_DEPOT_MASS_START_DEPOT_SHIP_TOOLTIP :{BLACK}Käynnistä kaikki telakalla olevat laivat napsauttamalla
+STR_DEPOT_MASS_START_HANGAR_TOOLTIP :{BLACK}Käynnistä kaikki hallissa olevat ilma-alukset napsauttamalla
STR_DEPOT_SELL_CONFIRMATION_TEXT :{YELLOW}Olet myymässä kaikki varikon ajoneuvot. Oletko varma?
@@ -3586,10 +3631,10 @@ STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}Lähetä
STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Lähetä laiva telakalle. Ctrl+Klik suorittaa vain huollon
STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}Lähetä lentokone lentokonehalliin. Ctrl+Klik suorittaa vain huollon
-STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}Tämä ostaa kopion junasta ja kaikista sen vaunuista. Ctrl+Klik jakaa komennot. Shift+Klik näyttää kustannearvion ostamatta kopiota
-STR_VEHICLE_VIEW_CLONE_ROAD_VEHICLE_INFO :{BLACK}Tämä ostaa kopion ajoneuvosta. Ctrl+Klik jakaa komennot. Shift+Klik näyttää kustannearvion ostamatta kopiota
-STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}Tämä ostaa kopion laivasta. Ctrl+Klik jakaa komennot. Shift+Klik näyttää kustannearvion ostamatta kopiota
-STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Tämä ostaa kopion lentokoneesta. Ctrl+Klik jakaa komennot. Shift+Klik näyttää kustannearvion ostamatta kopiota
+STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}Tämä ostaa kopion junasta vaunuineen. Ctrl+Klik jakaa komennot. Shift+Klik näyttää kustannusarvion ostamatta kopiota
+STR_VEHICLE_VIEW_CLONE_ROAD_VEHICLE_INFO :{BLACK}Tämä ostaa kopion ajoneuvosta. Ctrl+Klik jakaa komennot. Shift+Klik näyttää kustannusarvion ostamatta kopiota
+STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}Tämä ostaa kopion laivasta. Ctrl+Klik jakaa komennot. Shift+Klik näyttää kustannusarvion ostamatta kopiota
+STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Tämä ostaa kopion lentokoneesta. Ctrl+Klik jakaa komennot. Shift+Klik näyttää kustannusarvion ostamatta kopiota
STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}Anna junalle lupa ohittaa punainen opastin.
@@ -3715,7 +3760,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äminen sallii useamman kulkuneuvon valinnan. Tyhjän alueen klikkaus valitsee koko kulkuneuvon. Ctrl+Klik valitsee kulkuneuvon ja sitä seuraavan ketjun
+STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Valitse sovitettavat kulkuneuvot. Hiirellä vetäminen sallii useamman kulkuneuvon valinnan. Tyhjän alueen napsautus valitsee koko kulkuneuvon. Ctrl+Klik valitsee kulkuneuvon ja sitä seuraavan ketjun
STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Valitse junan rahtityyppi
STR_REFIT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Valitse ajoneuvolla ajettava rahti
@@ -3745,7 +3790,7 @@ STR_ORDERS_END_OF_ORDERS :- - Käskyjen l
STR_ORDERS_END_OF_SHARED_ORDERS :- - Jaettujen käskyjen loppu - -
# Order bottom buttons
-STR_ORDER_NON_STOP :{BLACK}Nonstop
+STR_ORDER_NON_STOP :{BLACK}Välipysähdyksetön
STR_ORDER_GO_TO :Mene
STR_ORDER_GO_NON_STOP_TO :Mene pysähtymättä
STR_ORDER_GO_VIA :Mene kautta
@@ -3817,7 +3862,7 @@ STR_ORDER_GO_TO_NEAREST_DEPOT :Mene lähimmäl
STR_ORDER_GO_TO_NEAREST_HANGAR :Mene lähimmälle varikolle
STR_ORDER_CONDITIONAL :Ehdollinen hyppykäsky
STR_ORDER_SHARE :Jaa käskyt
-STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Lisää uusi käsky ennen valittua, tai lisää listan viimeiseksi. Ctrl tekee asemakäskyistä 'lastaa täyteen kaikki rahti', reittipistekäskyistä 'non-stop' ja veturitallikäskyistä 'huolto'. 'Jaa käskyt' jakaa käskyt valitun kulkuneuvon kanssa. Kulkuneuvon klikkaaminen kopioi käskyt siitä kulkuneuvosta. Varikkokäsky poistaa käytöstä automaattisen huollon
+STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Lisää uusi käsky ennen valittua, tai lisää listan viimeiseksi. Ctrl tekee asemakäskyistä 'lastaa täyteen kaikki rahti', reittipistekäskyistä 'non-stop' ja veturitallikäskyistä 'huolto'. 'Jaa käskyt' jakaa käskyt valitun kulkuneuvon kanssa. Kulkuneuvon napsauttaminen kopioi käskyt kyseisestä kulkuneuvosta. Varikkokäsky poistaa käytöstä automaattisen huollon
STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Näytä kaikki ajoneuvot, jotka jakavat nämä käskyt
@@ -3826,11 +3871,11 @@ STR_ORDER_GO_TO_WAYPOINT :Kierrä reittip
STR_ORDER_GO_NON_STOP_TO_WAYPOINT :Mene pysäht. pisteen {WAYPOINT} kautta
STR_ORDER_SERVICE_AT :Huolto
-STR_ORDER_SERVICE_NON_STOP_AT :Nonstop-huolto
+STR_ORDER_SERVICE_NON_STOP_AT :Huolto pysäytyksettä
STR_ORDER_NEAREST_DEPOT :lähin
STR_ORDER_NEAREST_HANGAR :lähin varikko
-STR_ORDER_TRAIN_DEPOT :Junavarikko
+STR_ORDER_TRAIN_DEPOT :Veturitalli
STR_ORDER_ROAD_VEHICLE_DEPOT :Varikko
STR_ORDER_SHIP_DEPOT :Telakka
STR_ORDER_GO_TO_NEAREST_DEPOT_FORMAT :{STRING} {STRING} {STRING}
@@ -3892,7 +3937,7 @@ STR_TIMETABLE_TITLE :{WHITE}{VEHICLE
STR_TIMETABLE_ORDER_VIEW :{BLACK}Käskyt
STR_TIMETABLE_ORDER_VIEW_TOOLTIP :{BLACK}Vaihda käskynäkymään
-STR_TIMETABLE_TOOLTIP :{BLACK}Aikataulu - klikkaa käskyä valitaksesi sen
+STR_TIMETABLE_TOOLTIP :{BLACK}Aikataulu - valitse käsky sitä napsauttamalla
STR_TIMETABLE_NO_TRAVEL :Ei kulkua
STR_TIMETABLE_NOT_TIMETABLEABLE :Kulje (automaattinen; aikataulu seuraavan manuaalisen käskyn mukaisesti)
@@ -3907,7 +3952,7 @@ STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(matkusta {STRI
STR_TIMETABLE_STAY_FOR :ja odota {STRING}
STR_TIMETABLE_AND_TRAVEL_FOR :ja kulje {STRING}
STR_TIMETABLE_DAYS :{COMMA}{NBSP}päivä{P "" ä}
-STR_TIMETABLE_TICKS :{COMMA}{NBSP}tick{P "" iä}
+STR_TIMETABLE_TICKS :{COMMA}{NBSP}askel{P "" ta}
STR_TIMETABLE_TOTAL_TIME :{BLACK}Aikataulun kesto on {STRING}
STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Aikataulun kesto on vähintään {STRING}
@@ -4214,7 +4259,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Liian mo
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Rautatieasema on jakautunut liian moneen osaan
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Liian monta linja-autopysäkkiä.
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Liian monta lastauslaituria.
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Liian lähellä toista asemaa tai lastausaluetta.
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Liian lähellä toista satamaa.
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Liian lähellä toista lentokenttää.
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Asemaa ei voi nimetä uudelleen.
@@ -4222,6 +4266,7 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... kaup
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... tie on väärin päin
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... läpiajettavissa pysäkeissä ei voi olla mutkia
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... läpiajettavissa pysäkeissä ei voi olla risteyksiä
+STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... tie on yksisuuntainen tai suljettu
# Station destruction related errors
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Aseman osaa ei voi poistaa...
@@ -4250,7 +4295,7 @@ STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Poijua e
STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Reittipisteen nimeä ei voi muuttaa...
STR_ERROR_CAN_T_REMOVE_TRAIN_WAYPOINT :{WHITE}Junien reittipistettä ei voi poistaa...
-STR_ERROR_MUST_REMOVE_RAILWAYPOINT_FIRST :{WHITE}Junaradan reittipiste täytyy poistaa ensin
+STR_ERROR_MUST_REMOVE_RAILWAYPOINT_FIRST :{WHITE}Rautatien reittipiste täytyy poistaa ensin
STR_ERROR_BUOY_IN_THE_WAY :{WHITE}... poiju on tiellä
STR_ERROR_BUOY_IS_IN_USE :{WHITE}... poiju on toisen yhtiön käytössä!
@@ -4263,7 +4308,7 @@ STR_ERROR_CAN_T_BUILD_SHIP_DEPOT :{WHITE}Telakkaa
STR_ERROR_CAN_T_RENAME_DEPOT :{WHITE}Varikon nimeä ei voi vaihtaa...
STR_ERROR_TRAIN_MUST_BE_STOPPED_INSIDE_DEPOT :{WHITE}... täytyy olla pysähdyksissä veturitallin sisällä
-STR_ERROR_ROAD_VEHICLE_MUST_BE_STOPPED_INSIDE_DEPOT :{WHITE}... täytyy olla pysähtyneenä varikolla
+STR_ERROR_ROAD_VEHICLE_MUST_BE_STOPPED_INSIDE_DEPOT :{WHITE}... täytyy olla pysäytettynä varikolla
STR_ERROR_SHIP_MUST_BE_STOPPED_INSIDE_DEPOT :{WHITE}... täytyy olla pysähdyksissä telakalla
STR_ERROR_AIRCRAFT_MUST_BE_STOPPED_INSIDE_HANGAR :{WHITE}... täytyy olla pysähdyksissä lentokonehallissa
@@ -4473,6 +4518,7 @@ STR_BASESOUNDS_DOS_DESCRIPTION :Alkuperäiset T
STR_BASESOUNDS_WIN_DESCRIPTION :Alkuperäiset Transport Tycoon Deluxen Windows-version äänet.
STR_BASESOUNDS_NONE_DESCRIPTION :Äänipaketti, jossa ei ole ääniä.
STR_BASEMUSIC_WIN_DESCRIPTION :Alkuperäinen Transport Tycoon Deluxen Windows-version musiikki.
+STR_BASEMUSIC_DOS_DESCRIPTION :Alkuperäinen Transport Tycoon Deluxen DOS-version musiikki.
STR_BASEMUSIC_NONE_DESCRIPTION :Musiikkipaketti, jossa ei ole musiikkia.
##id 0x2000
@@ -4846,7 +4892,7 @@ STR_VEHICLE_NAME_AIRCRAFT_PLODDYPHUT_500 :Ploddyphut 500
STR_VEHICLE_NAME_AIRCRAFT_FLASHBANG_X1 :Flashbang X1
STR_VEHICLE_NAME_AIRCRAFT_JUGGERPLANE_M1 :Juggerplane M1
STR_VEHICLE_NAME_AIRCRAFT_FLASHBANG_WIZZER :Flashbang Wizzer
-STR_VEHICLE_NAME_AIRCRAFT_TRICARIO_HELICOPTER :Tricario -helikopteri
+STR_VEHICLE_NAME_AIRCRAFT_TRICARIO_HELICOPTER :Tricario-helikopteri
STR_VEHICLE_NAME_AIRCRAFT_GURU_X2_HELICOPTER :Guru X2 -helikopteri
STR_VEHICLE_NAME_AIRCRAFT_POWERNAUT_HELICOPTER :Powernaut-helikopteri
diff --git a/src/lang/french.txt b/src/lang/french.txt
index 6a361172a9..b7729e5067 100644
--- a/src/lang/french.txt
+++ b/src/lang/french.txt
@@ -476,6 +476,7 @@ STR_ABOUT_MENU_SCREENSHOT :Copie d'écran
STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Copie d'écran au zoom maximum
STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Copie d'écran au zoom par défaut
STR_ABOUT_MENU_GIANT_SCREENSHOT :Copie d'écran de la carte entière
+STR_ABOUT_MENU_SHOW_FRAMERATE :Afficher la fréquence d'images
STR_ABOUT_MENU_ABOUT_OPENTTD :À propos d'OpenTTD
STR_ABOUT_MENU_SPRITE_ALIGNER :Alignement de sprite
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Afficher/Cacher les boites de dimensions maximum
@@ -927,6 +928,7 @@ STR_GAME_OPTIONS_CURRENCY_ZAR :Rand sud-africa
STR_GAME_OPTIONS_CURRENCY_CUSTOM :Personnalisée...
STR_GAME_OPTIONS_CURRENCY_GEL :Lari Géorgien (GEL)
STR_GAME_OPTIONS_CURRENCY_IRR :Rial Iranien (IRR)
+STR_GAME_OPTIONS_CURRENCY_RUB :Nouveau rouble russe (RUB)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Véhicules routiers
@@ -2698,6 +2700,56 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyrigh
STR_ABOUT_VERSION :{BLACK}OpenTTD version {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 L'équipe OpenTTD
+# Framerate display window
+STR_FRAMERATE_CAPTION :{WHITE}Fréquence d'images
+STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} ({DECIMAL}x)
+STR_FRAMERATE_RATE_GAMELOOP :{WHITE}Fréquence de simulation{NBSP}: {STRING}
+STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP :{BLACK}Nombre de ticks simulés par seconde.
+STR_FRAMERATE_RATE_BLITTER :{WHITE}Fréquence des graphismes{NBSP}: {STRING}
+STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}Nombre d'images rendues par seconde.
+STR_FRAMERATE_SPEED_FACTOR :{WHITE}Facteur de vitesse actuel{NBSP}: {DECIMAL}x
+STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}À quelle vitesse le jeu tourne actuellement, comparé à la vitesse attendue pour la simulation normale.
+STR_FRAMERATE_CURRENT :{WHITE}Actuel
+STR_FRAMERATE_AVERAGE :{WHITE}Moyen
+STR_FRAMERATE_DATA_POINTS :{WHITE}Données basées sur {COMMA} mesures
+STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL}{WHITE} ms
+STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL}{WHITE} ms
+STR_FRAMERATE_MS_BAD :{RED}{DECIMAL}{WHITE} ms
+STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL}{WHITE} images/s
+STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL}{WHITE} images/s
+STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL}{WHITE} images/s
+STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA} ms
+STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} s
+############ Leave those lines in this order!!
+STR_FRAMERATE_GAMELOOP :{WHITE}Total de la boucle de jeu{NBSP}:
+STR_FRAMERATE_GL_ECONOMY :{WHITE} Traitement des marchandises{NBSP}:
+STR_FRAMERATE_GL_TRAINS :{WHITE} Ticks des trains{NBSP}:
+STR_FRAMERATE_GL_ROADVEHS :{WHITE} Ticks des véhicules routiers{NBSP}:
+STR_FRAMERATE_GL_SHIPS :{WHITE} Ticks des navires{NBSP}:
+STR_FRAMERATE_GL_AIRCRAFT :{WHITE} Ticks des aéroplanes{NBSP}:
+STR_FRAMERATE_GL_LANDSCAPE :{WHITE} Ticks du monde{NBSP}:
+STR_FRAMERATE_GL_LINKGRAPH :{WHITE} Délai du flux des marchandises{NBSP}:
+STR_FRAMERATE_DRAWING :{WHITE}Rendu des graphismes{NBSP}:
+STR_FRAMERATE_DRAWING_VIEWPORTS :{WHITE} Vues{NBSP}:
+STR_FRAMERATE_VIDEO :{WHITE}Sortie vidéo{NBSP}:
+STR_FRAMERATE_SOUND :{WHITE}Mixage sonore{NBSP}:
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+STR_FRAMETIME_CAPTION_GAMELOOP :Boucle de jeu
+STR_FRAMETIME_CAPTION_GL_ECONOMY :Traitement des marchandises
+STR_FRAMETIME_CAPTION_GL_TRAINS :Ticks des trains
+STR_FRAMETIME_CAPTION_GL_ROADVEHS :Ticks des véhicules routiers
+STR_FRAMETIME_CAPTION_GL_SHIPS :Ticks des navires
+STR_FRAMETIME_CAPTION_GL_AIRCRAFT :Ticks des aéroplanes
+STR_FRAMETIME_CAPTION_GL_LANDSCAPE :Ticks du monde
+STR_FRAMETIME_CAPTION_GL_LINKGRAPH :Délai du flux des marchandises
+STR_FRAMETIME_CAPTION_DRAWING :Rendu des graphismes
+STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Rendu des vues
+STR_FRAMETIME_CAPTION_VIDEO :Sortie vidéo
+STR_FRAMETIME_CAPTION_SOUND :Mixage sonore
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Sauvegarder la partie
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Charger une partie
@@ -4229,7 +4281,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Trop de
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Trop de parties de gare
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Trop d'arrêts d'autobus
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Trop d'aires de chargement
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Trop près d'une autre gare
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Trop près d'un autre port
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Trop près d'un autre aéroport
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Impossible de renommer la gare...
diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt
index f883d377d5..139d775cd3 100644
--- a/src/lang/gaelic.txt
+++ b/src/lang/gaelic.txt
@@ -2927,6 +2927,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Còir-le
STR_ABOUT_VERSION :{BLACK}OpenTTD tionndadh {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 An sgioba OpenTTD
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Sàbhail an geama
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Luchdaich geama
@@ -4456,7 +4463,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Cus stè
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Cus pàirtean dhe stèisean-rèile
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Gus stèiseanan bus
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Tha cus ionadan-luchdaidh nan làraidh ann
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Ro fhaisg air stèisean/ionad-luchdaidh eile
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Ro fhaisg air port eile
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Ro fhaisg air port-adhair eile
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Cha ghabh ainm an stèisein atharrachadh...
diff --git a/src/lang/galician.txt b/src/lang/galician.txt
index 25c6313e56..a40620073f 100644
--- a/src/lang/galician.txt
+++ b/src/lang/galician.txt
@@ -2687,6 +2687,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyrigh
STR_ABOUT_VERSION :{BLACK}OpenTTD versión {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 O equipo de OpenTTD
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Gravar partida
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Cargar partida
@@ -4216,7 +4223,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Demasiad
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Demasiadas partes de estación de tren
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Demasiadas paradas de autobús
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Demasiadas estacións de camións
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Demasiado preto doutra estación ou área de carga
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Demasiado preto doutro peirao
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Demasiado preto doutro aeroporto
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Non se pode renomear a estación...
diff --git a/src/lang/german.txt b/src/lang/german.txt
index e91d83c282..cd117258b4 100644
--- a/src/lang/german.txt
+++ b/src/lang/german.txt
@@ -2687,6 +2687,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Transpor
STR_ABOUT_VERSION :{BLACK}OpenTTD-Version {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD-Team
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Spiel speichern
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Spiel laden
@@ -4216,7 +4223,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Zu viele
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Zu viele Bahnsteigteile
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Zu viele Bushaltestellen
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Zu viele Lkw-Ladeplätze
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Stationen liegen zu dicht beisammen
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Zu dicht an einem anderen Hafen
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Zu dicht an einem anderen Flughafen
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Station kann nicht umbenannt werden...
diff --git a/src/lang/greek.txt b/src/lang/greek.txt
index 548a7caa29..5b5cd91621 100644
--- a/src/lang/greek.txt
+++ b/src/lang/greek.txt
@@ -731,7 +731,7 @@ STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Δάνε
STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Σύνολο:
############ End of order list
STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP :{BLACK}Απαρίθμηση των οχημάτων που απέφεραν κέρδος πέρσι. Περιλαμβανομένων των επιγείων οχημάτων, τρένων, πλοίων και αεροσκαφών.
-STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Αριθμός των πρόσφατα επισκευασμένων σταθμών. Σταθμοί τραίνων, στάσεις λεωφορείων, αεροδρόμια, κ.ο.κ. προσμετρώνται ξεχωριστά, ακόμα κι αν ανήκουν στον ίδιο σταθμό.
+STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Αριθμός των πρόσφατα επισκευασμένων σταθμών. Σταθμοί τρένων, στάσεις λεωφορείων, αεροδρόμια, κ.ο.κ. προσμετρώνται ξεχωριστά, ακόμα κι αν ανήκουν στον ίδιο σταθμό.
STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP :{BLACK}Το κέρδος του οχήματος με το μικρότερο εισόδημα (μόνο οχήματα παλιότερα των 2 ετών θα λαμβάνονται υπόψην)
STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Το ποσό των χρημάτων που έγιναν σε ένα τρίμηνο με το μικρότερο κέρδος των τελευταίων 12 τριμήνων
STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Το ποσό των χρημάτων που έγιναν σε ένα τρίμηνο με το μεγαλύτερο κέρδος των τελευταίων 12 τριμήνων
@@ -778,6 +778,7 @@ STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Εναλ
STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Εμφάνιση παραθύρου επιλογής μουσικού κομματιού
# Playlist window
+STR_PLAYLIST_MUSIC_SELECTION_SETNAME :{WHITE}Πρόγραμμα μουσικής - '{STRING}'
STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} «{STRING}»
STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Λίστα σιδηροτροχιών
STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Πρόγραμμα - '{STRING}'
@@ -987,9 +988,9 @@ STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLAC
# Extra view window
STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Εμφάνιση {COMMA}
-STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Αντιγραφή στην εμφάνιση
+STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Αντιγραφή στο παράθυρο εμφάνισης
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Αντιγραφή της τοποθεσίας της κύριας προβολής σε αυτό το παράθυρο εμφάνισης
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Επικόλληση από εμφάνιση
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Επικόλληση από παράθυρο εμφάνισης
STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Επικόλληση της τοποθεσίας αυτού του παραθύρου εμφάνισης στην κύρια προβολή
# Game options window
@@ -1278,22 +1279,22 @@ STR_CONFIG_SETTING_CATCHMENT :Επιτρέπ
STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Διαφορετικοί σταθμοί και αεροδρόμια έχουν περιοχές κάλυψης διαφορετικού μεγέθους
STR_CONFIG_SETTING_EXTRADYNAMITE :Επιτρέπεται η αφαίρεση περισσότερων ιδιοκτησιών των πολέων: {STRING}
STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT :Είναι ευκολότερη η αφαίρεση υποδομών και κτιρίων που κατέχονται από την πόλη
-STR_CONFIG_SETTING_TRAIN_LENGTH :Μέγιστο μήκος τραίνων: {STRING}
-STR_CONFIG_SETTING_TRAIN_LENGTH_HELPTEXT :Ορίστε το μέγιστο μήκος των τραίνων
+STR_CONFIG_SETTING_TRAIN_LENGTH :Μέγιστο μήκος τρένων: {STRING}
+STR_CONFIG_SETTING_TRAIN_LENGTH_HELPTEXT :Ορίστε το μέγιστο μήκος των τρένων
STR_CONFIG_SETTING_TILE_LENGTH :{COMMA} τετραγωνίδι{P 0 ο α}
STR_CONFIG_SETTING_SMOKE_AMOUNT :Ποσότητα καπνού/σπινθύρων οχήματος: {STRING}
STR_CONFIG_SETTING_SMOKE_AMOUNT_HELPTEXT :Ορίστε τον όγκο του καπνού ή τον αριθμό των σπιθών που παράγονται από τα οχήματα
STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL :Μοντέλο επιτάχυνσης τρένων: {STRING}
-STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL_HELPTEXT :Επιλέξτε το μοντέλο φυσικής για την επιτάχυνση των τραίνων. Με το «αρχικό» μοντέλο οι κλίσεις επιβαρύνουν το ίδιο όλα τα οχήματα. Με το «ρεαλιστικό» μοντέλο οι κλίσεις και οι στροφές τα επιβαρύνουν ανάλογα με διάφορες ιδιότητες όπως το μήκος και το ελκτικό φορτίο
+STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL_HELPTEXT :Επιλέξτε το μοντέλο φυσικής για την επιτάχυνση των τρένων. Με το «αρχικό» μοντέλο οι κλίσεις επιβαρύνουν το ίδιο όλα τα οχήματα. Με το «ρεαλιστικό» μοντέλο οι κλίσεις και οι στροφές τα επιβαρύνουν ανάλογα με διάφορες ιδιότητες όπως το μήκος και το ελκτικό φορτίο
STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL :Μοντέλο επιτάχυνσης οχημάτων δρόμου: {STRING}
STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL_HELPTEXT :Επιλέξτε το μοντέλο φυσικής για την επιτάχυνση των οχημάτων. Με το «αρχικό» μοντέλο οι κλίσεις επιβαρύνουν το ίδιο όλα τα οχήματα. Με το «ρεαλιστικό» μοντέλο οι κλίσεις και οι στροφές τα επιβαρύνουν ανάλογα με διάφορες ιδιότητες όπως το μήκος και το ελκτικό φορτίο
-STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS :Κλίση εδάφους για τα τραίνα: {STRING}
-STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS_HELPTEXT :Η κλίση ενός κεκλιμένου τετραγωνίδιου για τα τραίνα. Μεγαλύτερες τιμές καθιστούν δυσκολότερο το ανέβασμα λόφων
+STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS :Κλίση εδάφους για τα τρένα: {STRING}
+STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS_HELPTEXT :Η κλίση ενός κεκλιμένου τετραγωνίδιου για τα τρένα. Μεγαλύτερες τιμές καθιστούν δυσκολότερο το ανέβασμα λόφων
STR_CONFIG_SETTING_PERCENTAGE :{COMMA}%
STR_CONFIG_SETTING_ROAD_VEHICLE_SLOPE_STEEPNESS :Κλίση εδάφους για τα οδικά οχήματα: {STRING}
STR_CONFIG_SETTING_ROAD_VEHICLE_SLOPE_STEEPNESS_HELPTEXT :Η κλίση ενός κεκλιμένου τετραγωνίδιου για τα οδικά οχήματα. Μεγαλύτερες τιμές καθιστούν δυσκολότερο το ανέβασμα λόφων
STR_CONFIG_SETTING_FORBID_90_DEG :Απαγόρευση στα τρένα και πλοία να κάνουν στροφές 90°: {STRING}
-STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :Στροφές 90 μοιρών προκύπτουν όταν μια οριζόντια σιδηροτροχιά ακολουθείται από μια κάθετη στο επόμενο τετραγωνίδιο, κάνοντας το τραίνο να στρίψει κατά 90 μοίρες όταν αλλάζει τετραγωνίδιο, αντί για τις συνηθισμένες 45 μοίρες σε άλλους συνδυασμούς σιδηροτροχιών. Αυτό έχει επίσης εφαρμογή στην ακτίνα στροφής των πλοίων
+STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :Στροφές 90 μοιρών προκύπτουν όταν μια οριζόντια σιδηροτροχιά ακολουθείται από μια κάθετη στο επόμενο τετραγωνίδιο, κάνοντας το τρένο να στρίψει κατά 90 μοίρες όταν αλλάζει τετραγωνίδιο, αντί για τις συνηθισμένες 45 μοίρες σε άλλους συνδυασμούς σιδηροτροχιών. Αυτό έχει επίσης εφαρμογή στην ακτίνα στροφής των πλοίων
STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS :Να επιτρέπεται η συνένωση μη παρακείμενων σταθμών: {STRING}
STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Επιτρέπεται η προσθήκη τμημάτων σε σταθμό χωρίς αυτά να αγγίζουν τα ήδη υπάρχοντα τμήματα. Χρειάζεται Ctrl+Κλικ κατά την τοποθέτηση των νέων τμημάτων
STR_CONFIG_SETTING_INFLATION :Πληθωρισμός: {STRING}
@@ -1323,7 +1324,7 @@ STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :Όταν ενε
STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Οι νέες οδηγίες είναι «χωρίς στάση» από προεπιλογή: {STRING}
STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Κανονικά, τα οχήματα σταματούν σε κάθε σταθμό που περνούν. Ενεργοποιώντας αυτήν τη ρύθμιση, δεν θα σταματούν σε κανένα σταθμό που θα βρει στη διαδρομή τους προς τον τελικό προορισμό. Σημείωστε πως αυτή η ρύθμιση ορίζει μόνο μια καθορισμένη τιμή για νέες εντολές. Ειδικές εντολές μπορούν να δοθούν για οποιαδήποτε συμπεριφορά, άσχετα από την προκαθορισμένη
STR_CONFIG_SETTING_STOP_LOCATION :Οι εντόλες νέων τρένων διορίζουν ότι σταματάνε εξ ορισμού στο {STRING} της πλατφόρμας
-STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Το προεπιλεγμένο σημείο όπου θα σταματούν τα τραίνα στην πλατφόρμα . Το «κοντινό άκρο» σημαίνει κοντά στο σημείο εισόδου, «Μέση» σημαίνει στο μέσο της πλατφόρμας και «μακρινό άκρο» σημαίνει στο άλλο άκρο από το σημείο εισόδου. Σημειώστε ότι αυτή η ρύθμιση ορίζει μόνο την προκαθορισμένη τιμή για νέες εντολές. Παρ' όλα αυτά, είναι δυνατό να δοθούν διαφορετικές εντολές για οποιαδήποτε συμπεριφορά.
+STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Το προεπιλεγμένο σημείο όπου θα σταματούν τα τρένα στην πλατφόρμα . Το «κοντινό άκρο» σημαίνει κοντά στο σημείο εισόδου, «Μέση» σημαίνει στο μέσο της πλατφόρμας και «μακρινό άκρο» σημαίνει στο άλλο άκρο από το σημείο εισόδου. Σημειώστε ότι αυτή η ρύθμιση ορίζει μόνο την προκαθορισμένη τιμή για νέες εντολές. Παρ' όλα αυτά, είναι δυνατό να δοθούν διαφορετικές εντολές για οποιαδήποτε συμπεριφορά.
STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :κοντινό άκρο
STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :στη μέση
STR_CONFIG_SETTING_STOP_LOCATION_FAR_END :μακρινό άκρο
@@ -1344,7 +1345,7 @@ STR_CONFIG_SETTING_ALLOW_FUND_ROAD_HELPTEXT :Επιτρέπ
STR_CONFIG_SETTING_ALLOW_GIVE_MONEY :Επιτρέπεται η αποστολή χρημάτων σε άλλες εταιρίες: {STRING}
STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :Επιτρέπεται η μεταφορά χρημάτων μεταξύ των εταιρειών σε παιχνίδια πολλαπλών παικτών
STR_CONFIG_SETTING_FREIGHT_TRAINS :Πολλαπλασιαστής βάρους σε φορτία για εξομοίωση βαρέων τρένων: {STRING}
-STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :Ορίζεται ο αντίκτυπος της μεταφοράς φορτίων στα τραίνα. Υψηλότερη τιμή κάνει τη μεταφορά φορτίων πιο απαιτητική για τραίνα, ιδιαίτερα στους λόφους
+STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :Ορίζεται ο αντίκτυπος της μεταφοράς φορτίων στα τρένα. Υψηλότερη τιμή κάνει τη μεταφορά φορτίων πιο απαιτητική για τρένα, ιδιαίτερα στους λόφους
STR_CONFIG_SETTING_PLANE_SPEED :Παράγοντας ταχύτητας αεροπλάνων: {STRING}
STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT :Ορίζεται η σχετική ταχύτητα των αεροπλάνων συγκριτικά με τους άλλους τύπους οχημάτων, ώστε να μειώνεται το ποσό του εισοδήματος από μεταφορές με αεροσκάφη
STR_CONFIG_SETTING_PLANE_SPEED_VALUE :1 / {COMMA}
@@ -1444,6 +1445,7 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Χρώμα εδ
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Πράσινο
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Σκούρο πράσινο
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Βιολετί
+STR_CONFIG_SETTING_SCROLLMODE :Συμπεριφορά κύλισης του παραθύρου εμφάνισης: {STRING}
STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Συμπεριφορά κατά την κύλιση του χάρτη
STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Μετακίνηση μικρού χάρτη με ΔΠΠ, θέση ποντικιού κλειδωμένη
STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Μετακίνηση χάρτη με ΔΠΠ, θέση ποντικιού κλειδωμένη
@@ -1505,7 +1507,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ενεργοπ
STR_CONFIG_SETTING_LOADING_INDICATORS :Χρήση δεικτών φόρτωσης: {STRING}
STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Επιλέξτε εάν οι δείκτες φόρτωσης εμφανίζονται πάνω από τα οχήματα που φορτώνουν ή ξεφορτώνουν
STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Εμφάνιση δρομολογίων σε στιγμές αντί για ημέρες: {STRING}
-STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Εμφάνιση χρόνων ταξιδιού στα χρονοδιαγράμματα σε χρόνο παιχνιδιού αντί σε ημέρες
+STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Εμφάνιση χρόνων ταξιδιού στα χρονοδιαγράμματα σε στιγμές αντί σε ημέρες
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Εμφάνιση αφίξεων και αναχωρήσεων στα δρομολόγια: {STRING}
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Εμφάνιση αναμενόμενης ώρας άφιξης και αναχώρησης στα χρονοδιαγράμματα
STR_CONFIG_SETTING_QUICKGOTO :Γρήγορη δημιουργία εντολών για τα οχήματα: {STRING}
@@ -1515,8 +1517,8 @@ STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Επιλογή
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :Πρώτος διαθέσιμος
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_LAST :Τελευταίος διαθέσιμος
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_MOST_USED :Περισσότερο χρησιμοποιούμενος
-STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION :Εμφάνιση δεσμέυσεων διαδρομών για γραμμές τραίνου: {STRING}
-STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT :Δίνεται ένα διαφορετικό χρώμα στις κατειλημμένες ράγες για να σας βοηθήσουν με προβλήματα όταν τα τραίνα αρνούνται να εισέλθουν σε τμήματα με βάση τροχιές
+STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION :Εμφάνιση δεσμέυσεων διαδρομών για γραμμές τρένου: {STRING}
+STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT :Δίνεται ένα διαφορετικό χρώμα στις κατειλημμένες ράγες για να σας βοηθήσουν με προβλήματα όταν τα τρένα αρνούνται να εισέλθουν σε τμήματα με βάση τροχιές
STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Διατήρηση των οικοδομικών εργαλείων ενεργών μετά από χρήση τους: {STRING}
STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT :Διατήρηση ανοικτών των εργαλείων για γέφυρες, σήραγγες, κλπ μετά από τη χρήση
STR_CONFIG_SETTING_EXPENSES_LAYOUT :Ομαδοποίηση εξόδων στο παράθυρο οικονομικών της εταιρίας: {STRING}
@@ -1542,7 +1544,7 @@ STR_CONFIG_SETTING_SOUND_AMBIENT_HELPTEXT :Παίζει τ
STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING :Απενεργοποίηση των υποδομών για τα οχήματα που δεν είναι διαθέσιμα: {STRING}
STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING_HELPTEXT :Όταν είναι ενεργοποιημένο, οι υποδομές είναι διαθέσιμες μόνο όταν υπάρχουν διαθέσιμα οχήματα, αποτρέποντας σπατάλη χρόνου και χρημάτων σε μη χρησιμοποιήσιμες υποδομές
STR_CONFIG_SETTING_MAX_TRAINS :Μέγιστος αριθμός τρένων ανά εταιρία: {STRING}
-STR_CONFIG_SETTING_MAX_TRAINS_HELPTEXT :Μέγιστος αριθμός τραίνων που μπορεί να έχει μια εταιρεία
+STR_CONFIG_SETTING_MAX_TRAINS_HELPTEXT :Μέγιστος αριθμός τρένων που μπορεί να έχει μια εταιρεία
STR_CONFIG_SETTING_MAX_ROAD_VEHICLES :Μέγιστος αριθμός οχημάτων δρόμου ανά εταιρία: {STRING}
STR_CONFIG_SETTING_MAX_ROAD_VEHICLES_HELPTEXT :Μέγιστος αριθμός οδικών οχημάτων που μπορεί να έχει μια εταιρεία
STR_CONFIG_SETTING_MAX_AIRCRAFT :Μέγιστος αριθμός αεροσκαφών ανά εταιρία: {STRING}
@@ -1551,7 +1553,7 @@ STR_CONFIG_SETTING_MAX_SHIPS :Μέγιστο
STR_CONFIG_SETTING_MAX_SHIPS_HELPTEXT :Μέγιστος αριθμός πλοίων που μπορεί να έχει μια εταιρεία
STR_CONFIG_SETTING_AI_BUILDS_TRAINS :Απενεργοποίηση τρένων για τον υπολογιστή: {STRING}
-STR_CONFIG_SETTING_AI_BUILDS_TRAINS_HELPTEXT :Ενεργοποιώντας αυτήν τη ρύθμιση κάνει αδύνατη την κατασκευή τραίνων από παίκτη του υπολογιστή
+STR_CONFIG_SETTING_AI_BUILDS_TRAINS_HELPTEXT :Ενεργοποιώντας αυτήν τη ρύθμιση κάνει αδύνατη την κατασκευή τρένων από παίκτη του υπολογιστή
STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES :Απενεργοποίηση οχημάτων υπολογιστή: {STRING}
STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES_HELPTEXT :Ενεργοποιώντας αυτήν τη ρύθμιση κάνει αδύνατη την κατασκευή οδικών οχημάτων από παίκτη του υπολογιστή
STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT :Απενεργοποίηση αεροσκαφών υπολογιστή: {STRING}
@@ -1572,8 +1574,8 @@ STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :Μέγιστο
STR_CONFIG_SETTING_SERVINT_ISPERCENT :Τα διαστήματα μεταξύ συντήρησης είναι σε ποσοστά: {STRING}
STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Επιλέξτε εάν η επισκευή των οχημάτων εξαρτάται από τον χρόνο που πέρασε από την τελευταία επισκευή ή από την μείωση της αξιοπιστίας κατά ένα συγκεκριμένο ποσοστό της μέγιστης αξιοπιστίας
-STR_CONFIG_SETTING_SERVINT_TRAINS :Προκαθορισμένο διάστημα μεταξύ επισκευών για τα τραίνα: {STRING}
-STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Ορίστε το προκαθορισμένο διάστημα μεταξύ συντηρήσεων για τα νέα οχήματα τραίνων, όταν δεν δίνεται άλλο διάστημα για το όχημα
+STR_CONFIG_SETTING_SERVINT_TRAINS :Προκαθορισμένο διάστημα μεταξύ επισκευών για τα τρένα: {STRING}
+STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Ορίστε το προκαθορισμένο διάστημα μεταξύ συντηρήσεων για τα νέα οχήματα τρένων, όταν δεν δίνεται άλλο διάστημα για το όχημα
STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}ημέρ{P 0 α ες}/%
STR_CONFIG_SETTING_SERVINT_DISABLED :Απενεργοποιημένο
STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES :Προκαθορισμένο διάστημα μεταξύ συντηρήσεων για οδικά οχήματα: {STRING}
@@ -1585,7 +1587,7 @@ STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :Ορίστε τ
STR_CONFIG_SETTING_NOSERVICE :Απενεργοποίηση επισκευών όταν οι καταρρεύσεις είναι απενεργοποιημένες: {STRING}
STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Όταν είναι ενεργοποιημένη, τα οχήματα δεν συντηρούνται όταν δεν είναι δυνατό να χαλάσουν
STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Ενεργοποίηση ορίων ταχύτητας βαγονιών: {STRING}
-STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Όταν είναι ενεργοποιημένο, χρησιμοποιούνται και τα όρια ταχύτητας των βαγονιών όταν αποφασίζεται η μέγιστη ταχύτητα ενός τραίνου
+STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Όταν είναι ενεργοποιημένο, χρησιμοποιούνται και τα όρια ταχύτητας των βαγονιών όταν αποφασίζεται η μέγιστη ταχύτητα ενός τρένου
STR_CONFIG_SETTING_DISABLE_ELRAILS :Απενεργοποίηση ηλεκτρικών σιδηροτροχιών: {STRING}
STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT :Ενεργοποιώντας αυτήν την ρύθμιση απενεργοποιείται η ανάγκη ηλεκτροδότησης των σιδηροτροχιών για να μπορέσουν σε αυτές να λειτουργήσουν οι ηλεκτρικές μηχανές
@@ -1803,13 +1805,13 @@ STR_CONFIG_SETTING_PATHFINDER_NPF :NPF
STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(Συνίσταται)
STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS :Μέθοδος δρομολόγησης για τρένα: {STRING}
-STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS_HELPTEXT :Μέθοδος διαπίστωσης διαδρομής που χρησιμοποιείται για τα τραίνα
+STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS_HELPTEXT :Μέθοδος διαπίστωσης διαδρομής που χρησιμοποιείται για τα τρένα
STR_CONFIG_SETTING_PATHFINDER_FOR_ROAD_VEHICLES :Μέθοδος δρομολόγησης για οχήματα δρόμου: {STRING}
STR_CONFIG_SETTING_PATHFINDER_FOR_ROAD_VEHICLES_HELPTEXT :Μέθοδος διαπίστωσης διαδρομής που χρησιμοποιείται για τα οδικά οχήματα
STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS :Μέθοδος δρομολόγησης για πλοία: {STRING}
STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS_HELPTEXT :Μέθοδος διαπίστωσης διαδρομής που χρησιμοποιείται για τα πλοία
STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Αυτόματη αναστροφή σε σηματοδότες: {STRING}
-STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Επιτρέπεται στα τραίνα να αντιστραφούν σε σήμα, εάν περιμένουν εκεί για πολύ ώρα
+STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Επιτρέπεται στα τρένα να αντιστραφούν σε σήμα, εάν περιμένουν εκεί για πολύ ώρα
STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Αλλαγή τιμής ρύθμισης
@@ -2393,6 +2395,7 @@ STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Υπόμ
STR_LINKGRAPH_LEGEND_ALL :{BLACK}Όλες
STR_LINKGRAPH_LEGEND_NONE :{BLACK}Καμία
STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Επιλογή εταιριών για να εμφανιστούν
+STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY}
# Linkgraph legend window and linkgraph legend in smallmap
STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}μη χρησιμοποιημένο
@@ -2801,6 +2804,37 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Αρχι
STR_ABOUT_VERSION :{BLACK}Έκδοση OpenTTD{REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 Η ομάδα του OpenTTD
+# Framerate display window
+STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP :{BLACK}Αριθμός στιγμών παιχνιδιού που προσομοιώνεται ανά δευτερόλεπτο.
+STR_FRAMERATE_SPEED_FACTOR :{WHITE}Παράγοντας ταχύτητας τρέχοντος παιχνιδιού: {DECIMAL}x
+STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Πόσο γρήγορα εκτελείται το παιχνίδι αυτήν τη στιγμή, σε σύγκριση με την αναμενόμενη ταχύτητα στον κανονικό ρυθμό εξομοίωσης.
+STR_FRAMERATE_CURRENT :{WHITE}Τρέχον
+STR_FRAMERATE_AVERAGE :{WHITE}Μέσο
+STR_FRAMERATE_DATA_POINTS :{WHITE}Τα δεδομένα βασίζονται σε μετρήσεις {COMMA}
+STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL}{WHITE} ms
+############ Leave those lines in this order!!
+STR_FRAMERATE_GL_ECONOMY :{WHITE} Διαχείριση φορτίου:
+STR_FRAMERATE_GL_TRAINS :Στιγμές τρένων:
+STR_FRAMERATE_GL_ROADVEHS :{WHITE} Στιγμές οχημάτων δρόμου:
+STR_FRAMERATE_GL_SHIPS :Στιγμές πλοίων:
+STR_FRAMERATE_GL_AIRCRAFT :Στιγμές αεροσκαφών:
+STR_FRAMERATE_GL_LANDSCAPE :Στιγμές κόσμου:
+STR_FRAMERATE_VIDEO :{WHITE}Έξοδος βίντεο:
+STR_FRAMERATE_SOUND :{WHITE}Μίξη ήχου:
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+STR_FRAMETIME_CAPTION_GL_ECONOMY :Διαχείριση φορτίου
+STR_FRAMETIME_CAPTION_GL_TRAINS :Στιγμές τρένων
+STR_FRAMETIME_CAPTION_GL_ROADVEHS :Στιγμές οχημάτων δρόμου
+STR_FRAMETIME_CAPTION_GL_SHIPS :Στιγμές πλοίων
+STR_FRAMETIME_CAPTION_GL_AIRCRAFT :Στιγμές αεροσκαφών
+STR_FRAMETIME_CAPTION_GL_LANDSCAPE :Στιγμές κόσμου
+STR_FRAMETIME_CAPTION_GL_LINKGRAPH :Καθυστέρηση γραφήματος συνδέσμου
+STR_FRAMETIME_CAPTION_VIDEO :Έξοδος βίντεο
+STR_FRAMETIME_CAPTION_SOUND :Μίξη ήχου
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Αποθήκευση Παιχνιδιού
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Φόρτωση Παιχνιδιού
@@ -3085,6 +3119,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Δώστ
STR_TOWN_DIRECTORY_CAPTION :{WHITE}Πόλεις
STR_TOWN_DIRECTORY_NONE :{ORANGE}- Τίποτα -
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA})
+STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Πόλη){BLACK} ({COMMA})
STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Ονόματα πόλεων - πατήστε στο όνομα για να κεντράρετε την εικόνα στην πόλη. Με Ctrl+Κλικ ανοίγει νέο παράθυρο προβολής στην τοποθεσία της πόλης
STR_TOWN_POPULATION :{BLACK}Παγκόσμιος πληθυσμός: {COMMA}
@@ -3293,7 +3328,7 @@ STR_FINANCES_EXPENDITURE_INCOME_TITLE :{WHITE}Έξοδ
STR_FINANCES_YEAR :{WHITE}{NUM}
STR_FINANCES_SECTION_CONSTRUCTION :{GOLD}Κατασκευές
STR_FINANCES_SECTION_NEW_VEHICLES :{GOLD}Νέα Οχήματα
-STR_FINANCES_SECTION_TRAIN_RUNNING_COSTS :{GOLD}Λειτουργικά Έξοδα Τραίνων
+STR_FINANCES_SECTION_TRAIN_RUNNING_COSTS :{GOLD}Λειτουργικά Έξοδα Τρένων
STR_FINANCES_SECTION_ROAD_VEHICLE_RUNNING_COSTS :{GOLD}Λειτουργικά Έξοδα Οχημάτων
STR_FINANCES_SECTION_AIRCRAFT_RUNNING_COSTS :{GOLD}Λειτουργικά Έξοδα Αεροσκαφών
STR_FINANCES_SECTION_SHIP_RUNNING_COSTS :{GOLD}Λειτουργικά Έξοδα Πλοίων
@@ -3605,7 +3640,7 @@ STR_DEPOT_CLONE_ROAD_VEHICLE :{BLACK}Κλων
STR_DEPOT_CLONE_SHIP :{BLACK}Κλωνοποίηση Πλοίου
STR_DEPOT_CLONE_AIRCRAFT :{BLACK}Κλωνοποίηση Αεροσκάφους
-STR_DEPOT_CLONE_TRAIN_DEPOT_INFO :{BLACK}Αυτό θα αγοράσει ένα αντίγραφο του τρένου μαζί με τα όλα τα βαγόνια. Πατήστε αυτό το κουμπί και μετά σε κάποιο τραίνο μέσα ή έξω από το αμαξοστάσιο. Με Ctrl+Κλικ θα έχει τις ίδιες εντολές. Με Shift+Κλικ εμφανίζεται το εκτιμώμενο κόστος χωρίς να γίνει η αγορά
+STR_DEPOT_CLONE_TRAIN_DEPOT_INFO :{BLACK}Αυτό θα αγοράσει ένα αντίγραφο του τρένου μαζί με τα όλα τα βαγόνια. Πατήστε αυτό το κουμπί και μετά σε κάποιο τρένο μέσα ή έξω από το αμαξοστάσιο. Με Ctrl+Κλικ θα έχει τις ίδιες εντολές. Με Shift+Κλικ εμφανίζεται το εκτιμώμενο κόστος χωρίς να γίνει η αγορά
STR_DEPOT_CLONE_ROAD_VEHICLE_DEPOT_INFO :{BLACK}Αυτό θα αγοράσει ένα αντίγραφο του οχήματος. Πατήστε αυτό το κουμπί και μετά σε κάποιο όχημα μέσα ή έξω από το αμαξοστάσιο. Με Ctrl+Κλικ θα έχει τις ίδιες εντολές. Με Shift+Κλικ εμφανίζεται το εκτιμώμενο κόστος χωρίς να γίνει η αγορά
STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Αυτό θα αγοράσει ένα αντίγραφο του πλοίου. Πατήστε αυτό το κουμπί και μετά σε κάποιο πλοίο μέσα ή έξω από το ναυπηγείο. Με Ctrl+Κλικ θα έχει τις ίδιες εντολές. Με Shift+Κλικ εμφανίζεται το εκτιμώμενο κόστος χωρίς να γίνει η αγορά
STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Αυτό θα αγοράσει ένα αντίγραφο του αεροσκάφους. Πατήστε αυτό το κουμπί και μετά σε κάποιο αεροσκάφος μέσα στο ή έξω από το υπόστεγο. Με Ctrl+Κλικ θα έχει τις ίδιες εντολές. Με Shift+Κλικ εμφανίζεται το εκτιμώμενο κόστος χωρίς να γίνει η αγορά
@@ -4337,7 +4372,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Πάρα
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Πάρα πολλά κομμάτια σιδηροδρομικού σταθμού
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Πάρα πολλές στάσεις λεωφορείου
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Πάρα πολλοί σταθμοί φορτηγών
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Πολύ κοντά σε άλλη περιοχή σταθμού/φόρτωσης
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Πολύ κοντά σε άλλη αποβάθρα
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Πολύ κοντά σε άλλο αεροδρόμιο
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Δεν μπορεί να μετονομαστεί ο σταθμός...
@@ -4550,7 +4584,7 @@ STR_ERROR_NO_VEHICLES_AVAILABLE_YET_EXPLANATION :{WHITE}Ξεκι
# Specific vehicle errors
STR_ERROR_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}Δεν μπορεί το τρένο να περάσει σήμα με κίνδυνο...
STR_ERROR_CAN_T_REVERSE_DIRECTION_TRAIN :{WHITE}Δεν αντιστρέφεται η κατεύθυνση του τρένου...
-STR_ERROR_TRAIN_START_NO_POWER :Το τραίνο δεν έχει ενέργεια
+STR_ERROR_TRAIN_START_NO_POWER :Το τρένο δεν έχει ενέργεια
STR_ERROR_CAN_T_MAKE_ROAD_VEHICLE_TURN :{WHITE}Δεν γίνεται να αλλάξει πορεία το όχημα...
diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt
index c0dc65f20e..8f15c95ef6 100644
--- a/src/lang/hebrew.txt
+++ b/src/lang/hebrew.txt
@@ -489,6 +489,7 @@ STR_ABOUT_MENU_SCREENSHOT :צילום מס
STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :צילום מסך בהגדלה מלאה
STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :ברירת מחדל של תקריב צילום מסך
STR_ABOUT_MENU_GIANT_SCREENSHOT :צילום מסך ענק
+STR_ABOUT_MENU_SHOW_FRAMERATE :הצג קצב פריימים
STR_ABOUT_MENU_ABOUT_OPENTTD :'OpenTTD'{NBSP}אודות
STR_ABOUT_MENU_SPRITE_ALIGNER :מיישר ספרייטים
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :הדלק/כבה הצגת תיבות גבול של ספרייטים
@@ -664,6 +665,7 @@ STR_MUSIC_RULER_MARKER :{TINY_FONT}{BLA
STR_MUSIC_TRACK_NONE :{TINY_FONT}{DKGREEN}--
STR_MUSIC_TRACK_DIGIT :{TINY_FONT}{DKGREEN}{ZEROFILL_NUM}
STR_MUSIC_TITLE_NONE :{TINY_FONT}{DKGREEN}------
+STR_MUSIC_TITLE_NOMUSIC :{TINY_FONT}{DKGREEN}אין מוזיקה זמינה
STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}"
STR_MUSIC_TRACK :{TINY_FONT}{BLACK}רצועה
STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}כותרת
@@ -936,6 +938,7 @@ STR_GAME_OPTIONS_CURRENCY_ZAR :(ZAR) ראנד
STR_GAME_OPTIONS_CURRENCY_CUSTOM :אחר...
STR_GAME_OPTIONS_CURRENCY_GEL :לארי גאורגי (GEL)
STR_GAME_OPTIONS_CURRENCY_IRR :ריאל איראני (IRR)
+STR_GAME_OPTIONS_CURRENCY_RUB :רובל רוסי (RUB)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}רכבי כביש
@@ -1348,6 +1351,8 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :צבע פני
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :ירוק
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :ירוק כהה
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :סגול
+STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :הזז את התצוגה עם כפתור עכבר ימני, מיקום העכבר נעול
+STR_CONFIG_SETTING_SCROLLMODE_LMB :הזז מפה עם כפתור עכבר שמאלי
STR_CONFIG_SETTING_SMOOTH_SCROLLING :{STRING} :גלילה חלקה של התצוגה המשנית
STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :שלוט כיצד התצוגה הראשית נגללת למיקום מסוים כאשר מקליקים על המפה הקטנה אן כאשר נותנים הוראה לגלול לעצם מסוים על גבי המפה. אם מאופשר, חלון התצוגה נגלל באופן חלק, אם מבוטל הוא מוקפץ ישירות אל נקודת המטרה
STR_CONFIG_SETTING_MEASURE_TOOLTIP :{STRING} :'הצג מידות בעת בניית כבישים/מסילות וכיוב
@@ -2700,6 +2705,27 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}כל ה
STR_ABOUT_VERSION :{BLACK}{REV} גירסה , OpenTTD
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 The OpenTTD team
+# Framerate display window
+STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} ({DECIMAL}x)
+STR_FRAMERATE_RATE_GAMELOOP :{WHITE}קצב סימולציה: {STRING}
+STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK} כמה מהר המשחק כרגע רץ, בהשוואה למהירות הצפוייה בקצב סימולציה רגיל.
+STR_FRAMERATE_DATA_POINTS :{WHITE}נתונים מבוססים על {COMMA} מדידות
+############ Leave those lines in this order!!
+STR_FRAMERATE_GL_ROADVEHS :{WHITE} פעימות כלי רכב:
+STR_FRAMERATE_GL_SHIPS :{WHITE} פעימות כלי שייט:
+STR_FRAMERATE_GL_LANDSCAPE :{WHITE} נקודות עולם:
+STR_FRAMERATE_DRAWING :{WHITE}עיבוד גרפיקה:
+STR_FRAMERATE_SOUND :{WHITE} ערבוב צליל:
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+STR_FRAMETIME_CAPTION_GL_TRAINS :פעימות רכבת
+STR_FRAMETIME_CAPTION_GL_LINKGRAPH :השהיית גרף קשרים
+STR_FRAMETIME_CAPTION_DRAWING :עיבוד גרפיקה
+STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :עיבוד תצוגת עולם
+STR_FRAMETIME_CAPTION_VIDEO :פלט וידאו
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}שמור משחק
STR_SAVELOAD_LOAD_CAPTION :{WHITE}טען משחק
@@ -2726,7 +2752,7 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF:
STR_SAVELOAD_OSKTITLE :{BLACK}הכנס שם לשמירה
# World generation
-STR_MAPGEN_WORLD_GENERATION_CAPTION :{WHITE}יצור עולם
+STR_MAPGEN_WORLD_GENERATION_CAPTION :{WHITE}יצירת עולם
STR_MAPGEN_MAPSIZE :{BLACK}:גודל המפה
STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}בחר את גודל המפה במשבצות. מספר המשבצות הזמינות תהיה קצת קטנה יותר.
STR_MAPGEN_BY :{BLACK}*
@@ -2984,6 +3010,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}הכנס
STR_TOWN_DIRECTORY_CAPTION :{WHITE}ערים
STR_TOWN_DIRECTORY_NONE :{ORANGE}- אין -
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA})
+STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (City){BLACK} ({COMMA})
STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}שמות ערים - לחץ על שם כדי למקד את התצוגה על העיר. Ctrl+לחיצה פותח חלונית תצוגה חדשה על מיקום העיר
STR_TOWN_POPULATION :{BLACK}אוכלוסיית העולם: {COMMA}
@@ -4229,7 +4256,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}יותר
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}התחנה מורכבת מיותר מידי חלקים
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}יותר מידי תחנות אוטובוס
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}יותר מידי תחנות משאיות
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}קרוב מידי לתחנה או איזור טעינה אחרים
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}יותר מידי קרוב למזח אחר
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}קרוב מידי לשדה תעופה אחר
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}לא ניתן לשנות שם תחנה...
@@ -4237,6 +4263,7 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... כב
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}הכביש פונה לכיוון לא נכון...
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... לתחנות "על הדרך" לא יכולות להיות פינות
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... לתחנות "על הדרך" לא יכולות להיות צמתים
+STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... הדרך חד כיוונית או חסומה
# Station destruction related errors
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}... לא ניתן לבטל חלק מהתחנה
@@ -4488,6 +4515,7 @@ STR_BASESOUNDS_DOS_DESCRIPTION :צלילי Tran
STR_BASESOUNDS_WIN_DESCRIPTION :צלילי Transport Tycoon Deluxe המקורי בגרסת Windows.
STR_BASESOUNDS_NONE_DESCRIPTION :אוסף צלילים ללא צלילים.
STR_BASEMUSIC_WIN_DESCRIPTION :מנגינות Transport Tycoon Deluxe המקורי בגרסת Windows.
+STR_BASEMUSIC_TTO_DESCRIPTION :מנגינות Transport Tycoon Deluxe (Original/World Editor) המקורי בגרסת DOS.
STR_BASEMUSIC_NONE_DESCRIPTION :אוסף מנגינות ללא מנגינות.
##id 0x2000
diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt
index 7f910eba1a..f9f2e19a2b 100644
--- a/src/lang/hungarian.txt
+++ b/src/lang/hungarian.txt
@@ -2750,6 +2750,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Eredeti
STR_ABOUT_VERSION :{BLACK}OpenTTD {REV} verzió
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 Az OpenTTD csapat
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Játék mentése
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Játék betöltése
@@ -4279,7 +4286,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Túl sok
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Túl sok vasútállomás-rész
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Túl sok buszmegálló
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Túl sok a teherautó-rakodóhely
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Túl közel van egy másik állomáshoz/rakodóhelyhez
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Túl közel van egy másik kikötőhöz
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Túl közel van egy másik repülőtérhez
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Nem nevezheted át az állomást...
diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt
index 3fe5319773..31c6ff796b 100644
--- a/src/lang/icelandic.txt
+++ b/src/lang/icelandic.txt
@@ -2531,6 +2531,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Upphafle
STR_ABOUT_VERSION :{BLACK}OpenTTD útgáfa {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 OpenTTD hópurinn
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Vista leik
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Opna leik
@@ -3959,7 +3966,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Of marga
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Of margir hlutar af lestarstöðvum
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Of margar strætisvagnastöðvar
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Of margar vörubílastöðvar
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Of nálægt annarri stöð/lestunarsvæði
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Of nálægt annarri bryggju
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Of nálægt öðrum flugvelli
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Get ekki endurnefnt stöð...
diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt
index 7c8c417005..f0d8efc7a8 100644
--- a/src/lang/indonesian.txt
+++ b/src/lang/indonesian.txt
@@ -650,6 +650,7 @@ STR_MUSIC_RULER_MARKER :{TINY_FONT}{BLA
STR_MUSIC_TRACK_NONE :{TINY_FONT}{DKGREEN}--
STR_MUSIC_TRACK_DIGIT :{TINY_FONT}{DKGREEN}{ZEROFILL_NUM}
STR_MUSIC_TITLE_NONE :{TINY_FONT}{DKGREEN}------
+STR_MUSIC_TITLE_NOMUSIC :{TINY_FONT}{DKGREEN}Tidak ada musik yang tersedia
STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}"
STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Track
STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Titel
@@ -670,10 +671,12 @@ STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Acak/Uru
STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Tampilkan jendela pemilihan judul musik
# Playlist window
+STR_PLAYLIST_MUSIC_SELECTION_SETNAME :{WHITE}Program Musik - '{STRING}'
STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}"
STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Daftar rel
STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Program - '{STRING}'
STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Kosong
+STR_PLAYLIST_CHANGE_SET :{BLACK}Gantikan set
STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Hapus program saat ini (hanya Bebas 1 atau Bebas 2)
STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klik pada musik track untuk menambah pada program sekarang (hanya Bebas 1 atau Bebas 2)
STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klik pada track musik untuk menghapusnya dari program saat ini. (Bebas 1 atau Bebas 2 saja)
@@ -810,6 +813,7 @@ STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLAC
STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDENT_NAME}{}(Pimpinan)
STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}{STRING} menjadi sponsor pembangunan kota baru {TOWN}!
+STR_NEWS_NEW_TOWN_UNSPONSORED :{BLACK}{BIG_FONT}Kota baru yang bernama {TOWN} baru dibuatkan!
STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLACK}Ada pembangunan {STRING} baru di dekat {TOWN}!
STR_NEWS_INDUSTRY_PLANTED :{BIG_FONT}{BLACK}{STRING} baru sedang ditanam di dekat {TOWN}!
@@ -895,7 +899,7 @@ STR_GAME_OPTIONS_CURRENCY_JPY :Yen Jepang (JPY
STR_GAME_OPTIONS_CURRENCY_ATS :Shilling Austria (ATS)
STR_GAME_OPTIONS_CURRENCY_BEF :Franc Belgia (BEF)
STR_GAME_OPTIONS_CURRENCY_CHF :Franc Swiss (CHF)
-STR_GAME_OPTIONS_CURRENCY_CZK :Koruna Czech (CZK)
+STR_GAME_OPTIONS_CURRENCY_CZK :Koruna Ceko (CZK)
STR_GAME_OPTIONS_CURRENCY_DEM :Deutschmark (DEM)
STR_GAME_OPTIONS_CURRENCY_DKK :Krone Denmark (DKK)
STR_GAME_OPTIONS_CURRENCY_ESP :Peseta Spanyol (ESP)
@@ -909,7 +913,7 @@ STR_GAME_OPTIONS_CURRENCY_NLG :Dutch Guilder (
STR_GAME_OPTIONS_CURRENCY_NOK :Krone Norwegia (NOK)
STR_GAME_OPTIONS_CURRENCY_PLN :Zloty Polandia (PLN)
STR_GAME_OPTIONS_CURRENCY_RON :Leu Romania (RON)
-STR_GAME_OPTIONS_CURRENCY_RUR :Rubles Rusia (RUR)
+STR_GAME_OPTIONS_CURRENCY_RUR :Rubel Rusia (RUR)
STR_GAME_OPTIONS_CURRENCY_SIT :Tolar Slovenia (SIT)
STR_GAME_OPTIONS_CURRENCY_SEK :Krona Swedia (SEK)
STR_GAME_OPTIONS_CURRENCY_TRY :Lira Turki (TRY)
@@ -922,6 +926,7 @@ STR_GAME_OPTIONS_CURRENCY_ZAR :Rand Afrika Sel
STR_GAME_OPTIONS_CURRENCY_CUSTOM :Atur sendiri...
STR_GAME_OPTIONS_CURRENCY_GEL :Lari Georgia (GEL)
STR_GAME_OPTIONS_CURRENCY_IRR :Rial Iran (IRR)
+STR_GAME_OPTIONS_CURRENCY_RUB :Rubel Rusia Baru (RUB)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Kendaraan jalan raya
@@ -938,7 +943,7 @@ STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Perancis
STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Jerman
STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Inggris (Tambahan)
STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :Amerika-Latin
-STR_GAME_OPTIONS_TOWN_NAME_SILLY :Silly
+STR_GAME_OPTIONS_TOWN_NAME_SILLY :Lucu
STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Swedia
STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Belanda
STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finlandia
@@ -948,7 +953,7 @@ STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Norwegia
STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Hungaria
STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austria
STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Romania
-STR_GAME_OPTIONS_TOWN_NAME_CZECH :Czechnya
+STR_GAME_OPTIONS_TOWN_NAME_CZECH :Ceko
STR_GAME_OPTIONS_TOWN_NAME_SWISS :Swiss
STR_GAME_OPTIONS_TOWN_NAME_DANISH :Denmark
STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turki
@@ -1334,6 +1339,10 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Warna daratan d
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Hijau
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Hijau Gelap
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violet
+STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Kelakuan waktu menggerakkan peta
+STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Gerakan viewport memakai tombol kanan tetikus, posisi tetikus terkunci
+STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Gerakan peta memakai tombol kanan tetikus, posisi tetikus terkunci
+STR_CONFIG_SETTING_SCROLLMODE_RMB :Gerakan peta memakai tombol kanan tetikus
STR_CONFIG_SETTING_SMOOTH_SCROLLING :Pergeseran pandangan viewport secara halus: {STRING}
STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Menyetel bagaimana tampilan utama menggeser posisi di peta kecil. Jika dinyalakan, peta akan bergeser secara halus. Jika dimatikan, peta langsung menuju tempat yang di klik
STR_CONFIG_SETTING_MEASURE_TOOLTIP :Tampilkan ukuran ketika menggunakan alat pembangun: {STRING}
@@ -1982,7 +1991,7 @@ STR_NETWORK_LANG_FRENCH :Perancis
STR_NETWORK_LANG_BRAZILIAN :Brazil
STR_NETWORK_LANG_BULGARIAN :Bulgaria
STR_NETWORK_LANG_CHINESE :China
-STR_NETWORK_LANG_CZECH :Czech
+STR_NETWORK_LANG_CZECH :Ceko
STR_NETWORK_LANG_DANISH :Denmark
STR_NETWORK_LANG_DUTCH :Belanda
STR_NETWORK_LANG_ESPERANTO :Esperanto
@@ -1997,7 +2006,7 @@ STR_NETWORK_LANG_NORWEGIAN :Norwegia
STR_NETWORK_LANG_POLISH :Polandia
STR_NETWORK_LANG_PORTUGUESE :Portugis
STR_NETWORK_LANG_ROMANIAN :Rumania
-STR_NETWORK_LANG_RUSSIAN :Russia
+STR_NETWORK_LANG_RUSSIAN :Rusia
STR_NETWORK_LANG_SLOVAK :Slovakia
STR_NETWORK_LANG_SLOVENIAN :Slovenia
STR_NETWORK_LANG_SPANISH :Spanyol
@@ -2276,6 +2285,7 @@ STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Legenda
STR_LINKGRAPH_LEGEND_ALL :{BLACK}Semua
STR_LINKGRAPH_LEGEND_NONE :{BLACK}Tidak ada
STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Pilih perusahaan yang akan ditampilkan
+STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY}
# Linkgraph legend window and linkgraph legend in smallmap
STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}tak terpakai
@@ -2684,6 +2694,38 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Hak Cipt
STR_ABOUT_VERSION :{BLACK}OpenTTD versi {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 Tim OpenTTD
+# Framerate display window
+STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} ({DECIMAL}x)
+STR_FRAMERATE_RATE_GAMELOOP :{WHITE}Rata simulasi: {STRING}
+STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Beberapa cepat permainan lagi berjalan, dibanding dengan kecepatan diharapkan memakai rata simulasi biasa.
+STR_FRAMERATE_CURRENT :{WHITE}Sekarang
+STR_FRAMERATE_DATA_POINTS :{WHITE}Data tergantung oleh ukuran {COMMA}
+STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL}{WHITE} ms
+STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL}{WHITE} ms
+STR_FRAMERATE_MS_BAD :{RED}{DECIMAL}{WHITE} ms
+STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA} ms
+STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} s
+############ Leave those lines in this order!!
+STR_FRAMERATE_GL_ECONOMY :{WHITE} Penanganan kargo:
+STR_FRAMERATE_GL_TRAINS :{WHITE} Titik kereta:
+STR_FRAMERATE_GL_ROADVEHS :{WHITE} Titik kendaraan:
+STR_FRAMERATE_GL_SHIPS :{WHITE} Titik kapal:
+STR_FRAMERATE_GL_AIRCRAFT :{WHITE} Titik pesawat:
+STR_FRAMERATE_GL_LANDSCAPE :{WHITE} Titik dunia:
+STR_FRAMERATE_DRAWING_VIEWPORTS :{WHITE} Viewport dunia:
+STR_FRAMERATE_SOUND :{WHITE}Mixing suara:
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+STR_FRAMETIME_CAPTION_GL_ECONOMY :Penanganan kargo
+STR_FRAMETIME_CAPTION_GL_TRAINS :Titik kereta
+STR_FRAMETIME_CAPTION_GL_ROADVEHS :Titik kendaraan
+STR_FRAMETIME_CAPTION_GL_SHIPS :Titik kapal
+STR_FRAMETIME_CAPTION_GL_AIRCRAFT :Titik pesawat
+STR_FRAMETIME_CAPTION_GL_LANDSCAPE :Titik dunia
+STR_FRAMETIME_CAPTION_SOUND :Mixing suara
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Simpan Permainan
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Buka Permainan
@@ -2971,6 +3013,7 @@ STR_TOWN_POPULATION :{BLACK}Populasi
STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN}
STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (City)
STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Populasi: {ORANGE}{COMMA}{BLACK} Rumah: {ORANGE}{COMMA}
+STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} bulan lalu: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA}
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Kargo untuk pertumbuhan kota:
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{RED} Butuh {ORANGE}{STRING}
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} dibutuhkan saat musim dingin
@@ -3281,6 +3324,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Membutuh
STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Membutuhkan: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
+STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Membutuhkan:
+STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} menunggu{STRING}
############ range for produces starts
STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Menghasilkan: {YELLOW}{STRING}{STRING}
@@ -3350,6 +3395,9 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Jual semua
STR_GROUP_RENAME_CAPTION :{BLACK}Ubah nama kelompok
STR_GROUP_PROFIT_THIS_YEAR :Keuntungan tahun ini:
+STR_GROUP_PROFIT_LAST_YEAR :Keuntungan tahun lalu:
+STR_GROUP_OCCUPANCY :Penggunaan sekarang:
+STR_GROUP_OCCUPANCY_VALUE :{NUM}%
# Build vehicle window
STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Kereta Baru
@@ -3357,7 +3405,7 @@ STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Kereta listrik
STR_BUY_VEHICLE_TRAIN_MONORAIL_CAPTION :Monorel Baru
STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :Maglev Baru
-STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Semua Kereta
+STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Kereta Baru
STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Kendaraan Baru
STR_BUY_VEHICLE_SHIP_CAPTION :Kapal Baru
STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Buat Pesawat
@@ -3382,6 +3430,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Semua jenis kar
STR_PURCHASE_INFO_ALL_BUT :Semua tapi tidak untuk {CARGO_LIST}
STR_PURCHASE_INFO_MAX_TE :{BLACK}Traksi Maks.: {GOLD}{FORCE}
STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Jangkauan: {GOLD}{COMMA} kotak
+STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Jenis pesawat: {GOLD}{STRING}
STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Daftar pilihan kereta - klik pada kereta untuk menampilkan informasi
STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Daftar pilihan kendaraan - klik pada kendaraan untuk menampilkan informasi
@@ -3516,6 +3565,10 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :lokomotif magle
STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Biaya: {CURRENCY_LONG} Berat: {WEIGHT_SHORT}{}Kecepatan: {VELOCITY} Daya: {POWER}{}Biaya ops.: {CURRENCY_LONG}/thn{}Kapasitas: {CARGO_LONG}
STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Biaya: {CURRENCY_LONG} Berat: {WEIGHT_SHORT}{}Kecepatan: {VELOCITY} Power: {POWER} Max. T.E.: {6:FORCE}{}Biaya Operasional: {4:CURRENCY_LONG}/yr{}Kapasitas: {5:CARGO_LONG}
STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Biaya: {CURRENCY_LONG} Kec. Max: {VELOCITY}{}Kapasitas: {CARGO_LONG}{}Bea Berjalan: {CURRENCY_LONG}/thn
+STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Biaya: {CURRENCY_LONG} Kec. Max.: {VELOCITY}{}Jenis pesawat: {STRING}{}Kapasitas: {CARGO_LONG}, {CARGO_LONG}{}Biaya operasi: {CURRENCY_LONG}/thn
+STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Biaya: {CURRENCY_LONG} Kec. Max.: {VELOCITY}{}Jenis pesawat: {STRING}{}Kapasitas: {CARGO_LONG}{}Biaya operasi: {CURRENCY_LONG}/thn
+STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Biaya: {CURRENCY_LONG} Kec. Max.: {VELOCITY}{}Jenis pesawat: {STRING} Jangkauan: {COMMA} ubin{}Kapasitas: {CARGO_LONG}, {CARGO_LONG}{}Biaya Operasi: {CURRENCY_LONG}/thn
+STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Biaya: {CURRENCY_LONG} Kec. Max.: {VELOCITY}{}Jenis pesawat: {STRING} Jangkauan: {COMMA} ubin{}Kapasitas: {CARGO_LONG}{}Biaya operasi: {CURRENCY_LONG}/thn
# Autoreplace window
STR_REPLACE_VEHICLES_WHITE :{WHITE}Ganti {STRING} - {STRING}
@@ -3545,6 +3598,7 @@ STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Tekan un
STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Pindah tampilan penggantian lokomitif atau gerbong
STR_REPLACE_ENGINES :Lokomotif
STR_REPLACE_WAGONS :Gerbong
+STR_REPLACE_ALL_RAILTYPE :Semua kereta
STR_REPLACE_HELP_RAILTYPE :{BLACK}Pilih jenis kereta yang anda inginkan untuk diganti
STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Menampilkan kendaraan terpilih di sisi kiri yang akan diganti, jika ada
@@ -3638,6 +3692,7 @@ STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} ta
STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Kec. Max: {LTBLUE}{VELOCITY}
STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Kecepatan Maks.: {LTBLUE}{VELOCITY} {BLACK}Jenis pesawat: {LTBLUE}{STRING}
+STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Kec. max.: {LTBLUE}{VELOCITY} {BLACK}Jenis pesawat: {LTBLUE}{STRING} {BLACK}Jangkauan: {LTBLUE}{COMMA} ubin
STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Berat: {LTBLUE}{WEIGHT_SHORT} {BLACK}Tenaga: {LTBLUE}{POWER}{BLACK} Kec. Max: {LTBLUE}{VELOCITY}
STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Berat: {LTBLUE}{WEIGHT_SHORT} {BLACK}Tenaga: {LTBLUE}{POWER}{BLACK} Kec. Max: {LTBLUE}{VELOCITY} {BLACK}Max. T.E.: {LTBLUE}{FORCE}
@@ -4196,7 +4251,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Terlalu
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Terlalu banyak bag. stasiun
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Terlalu banyak pemberhentian Bus
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Terlalu banyak terminal truk
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Terlalu dekat dengan stasiun/area bongkar muat lainnya
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Terlalu dekat dengan dok/galangan kapal lainnya
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Terlalu dekat dengan bandara lainnya
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Tidak dapat mengganti nama stasiun...
@@ -4204,6 +4258,7 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... jala
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... menghadap pada arah yang salah
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... terminal lintas-lalu tak bisa memiliki sudut
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... terminal lintas-lalu tak bisa memiliki simpangan
+STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... jalannya satu arah atau terhalang
# Station destruction related errors
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Tidak dapat menghapus bagian dari stasiun...
@@ -4272,7 +4327,7 @@ STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION :{WHITE}Kombinas
STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Sinyal harus dihancurkan dulu
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Tidak tersedia rel yang sesuai
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Harus membongkar rel terlebih dahulu
-STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Jalan satu arah atau ada yang menghalangi
+STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Jalannya satu arah atau terhalang
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Perlintasan tingkat tidak diperbolehkan pada tipe rel ini
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Tidak dapat membangun sinyal disini
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Tidak dapat membangun jalur rel disini
@@ -4455,6 +4510,8 @@ STR_BASESOUNDS_DOS_DESCRIPTION :Efek suara oris
STR_BASESOUNDS_WIN_DESCRIPTION :Efek suara orisinil Transport Tycoon Deluxe versi Windows.
STR_BASESOUNDS_NONE_DESCRIPTION :Paket efek suara tanpa suara apapun.
STR_BASEMUSIC_WIN_DESCRIPTION :Musik pengiring orisinil Transport Tycoon Deluxe versi Windows.
+STR_BASEMUSIC_DOS_DESCRIPTION :Musik orisinil Transport Tycoon Deluxe versi DOS.
+STR_BASEMUSIC_TTO_DESCRIPTION :Musik orisinil Transport Tycoon (Orisinil/Editor Dunia) versi DOS.
STR_BASEMUSIC_NONE_DESCRIPTION :Paket musik tanpa musik sungguhan.
##id 0x2000
diff --git a/src/lang/irish.txt b/src/lang/irish.txt
index 18f898313b..0ea266d541 100644
--- a/src/lang/irish.txt
+++ b/src/lang/irish.txt
@@ -2682,6 +2682,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Cóipche
STR_ABOUT_VERSION :{BLACK}OpenTTD leagan {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 An fhoireann OpenTTD
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Sábháil an Cluiche
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Lódáil Cluiche
@@ -4196,7 +4203,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}An iomar
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}An iomarca codanna stáisiún iarnróid
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}An iomarca stadanna bus
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}An iomarca stáisiúin leoraithe
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Roghearr do stáisiún/limistéar lódála eile
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Roghearr do dug eile
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Roghearr d'aerfort eile
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Ní féidir an stáisiún a athainmniú...
diff --git a/src/lang/italian.txt b/src/lang/italian.txt
index d245136f1d..53a3d342d0 100644
--- a/src/lang/italian.txt
+++ b/src/lang/italian.txt
@@ -477,6 +477,7 @@ STR_ABOUT_MENU_SCREENSHOT :Screenshot
STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Screenshot con zoom massimo
STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Screenshot con zoom predefinito
STR_ABOUT_MENU_GIANT_SCREENSHOT :Screenshot intera mappa
+STR_ABOUT_MENU_SHOW_FRAMERATE :Mostra frame rate
STR_ABOUT_MENU_ABOUT_OPENTTD :Informazioni su 'OpenTTD'
STR_ABOUT_MENU_SPRITE_ALIGNER :Strumento allineamento sprite
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Attiva/disattiva bounding box
@@ -816,6 +817,7 @@ STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLAC
STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDENT_NAME}{}(Presidente)
STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}La {STRING} finanzia la costruzione della nuova cittadina di {TOWN}!
+STR_NEWS_NEW_TOWN_UNSPONSORED :{BLACK}{BIG_FONT}È stata fondata una nuova città chiamata {TOWN}!
STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLACK}Nuov{G o o a} {STRING} in costruzione vicino a {TOWN}!
STR_NEWS_INDUSTRY_PLANTED :{BIG_FONT}{BLACK}Nuov{G 0 o o a} {STRING} piantat{G 0 o o a} vicino a {TOWN}!
@@ -885,7 +887,7 @@ STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLAC
STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Mini visuale {COMMA}
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Cambia mini visuale
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Copia la posizione della visuale principale in questa mini visuale
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Cambia visuale principale
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Cambia vis. principale
STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Copia la posizione di questa mini visuale nella visuale principale
# Game options window
@@ -928,6 +930,7 @@ STR_GAME_OPTIONS_CURRENCY_ZAR :Rand sudafrican
STR_GAME_OPTIONS_CURRENCY_CUSTOM :Personalizzata...
STR_GAME_OPTIONS_CURRENCY_GEL :Lari georgiano (GEL)
STR_GAME_OPTIONS_CURRENCY_IRR :Rial iraniano (IRR)
+STR_GAME_OPTIONS_CURRENCY_RUB :Nuovo rublo russo (RUB)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Automezzi
@@ -2727,6 +2730,56 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyrigh
STR_ABOUT_VERSION :{BLACK}OpenTTD versione {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 Il team OpenTTD
+# Framerate display window
+STR_FRAMERATE_CAPTION :{WHITE}Frame rate
+STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} ({DECIMAL}x)
+STR_FRAMERATE_RATE_GAMELOOP :{BLACK}Velocità simulazione: {STRING}
+STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP :{BLACK}Numero di cicli di simulazione della partita in un secondo
+STR_FRAMERATE_RATE_BLITTER :{BLACK}Frame rate grafica: {STRING}
+STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}Numero di fotogrammi video renderizzati in un secondo
+STR_FRAMERATE_SPEED_FACTOR :{BLACK}Fattore di velocità corrente della partita: {DECIMAL}x
+STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Prestazioni correnti della partita, confrontate con le prestazioni attese alla velocità di giorno normale.
+STR_FRAMERATE_CURRENT :{WHITE}Corrente
+STR_FRAMERATE_AVERAGE :{WHITE}Media
+STR_FRAMERATE_DATA_POINTS :{BLACK}Dati basati su {COMMA} misurazioni
+STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL} ms
+STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL} ms
+STR_FRAMERATE_MS_BAD :{RED}{DECIMAL} ms
+STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL} frame/s
+STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL} frame/s
+STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL} frame/s
+STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA} ms
+STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} s
+############ Leave those lines in this order!!
+STR_FRAMERATE_GAMELOOP :{BLACK}Totale ciclo simulazione:
+STR_FRAMERATE_GL_ECONOMY :{BLACK} Gestione carichi:
+STR_FRAMERATE_GL_TRAINS :{BLACK} Aggiornamento treni:
+STR_FRAMERATE_GL_ROADVEHS :{BLACK} Aggiornamento automezzi:
+STR_FRAMERATE_GL_SHIPS :{BLACK} Aggiornamento navi:
+STR_FRAMERATE_GL_AIRCRAFT :{BLACK} Aggiornamento aeromobili:
+STR_FRAMERATE_GL_LANDSCAPE :{BLACK} Aggiornamento mondo:
+STR_FRAMERATE_GL_LINKGRAPH :{BLACK} Ritardo grafo di distribuzione:
+STR_FRAMERATE_DRAWING :{BLACK}Renderizzazione grafica:
+STR_FRAMERATE_DRAWING_VIEWPORTS :{BLACK} Visuali mondo:
+STR_FRAMERATE_VIDEO :{BLACK}Output video:
+STR_FRAMERATE_SOUND :{BLACK}Missaggio suoni:
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+STR_FRAMETIME_CAPTION_GAMELOOP :Ciclo simulazione
+STR_FRAMETIME_CAPTION_GL_ECONOMY :Gestione carichi
+STR_FRAMETIME_CAPTION_GL_TRAINS :Aggiornamento treni
+STR_FRAMETIME_CAPTION_GL_ROADVEHS :Aggiornamento automezzi
+STR_FRAMETIME_CAPTION_GL_SHIPS :Aggiornamento navi
+STR_FRAMETIME_CAPTION_GL_AIRCRAFT :Aggiornamento aeromobili
+STR_FRAMETIME_CAPTION_GL_LANDSCAPE :Aggiornamento mondo
+STR_FRAMETIME_CAPTION_GL_LINKGRAPH :Ritardo grafo di distribuzione
+STR_FRAMETIME_CAPTION_DRAWING :Renderizzazione grafica
+STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Renderizzazione visuali mondo
+STR_FRAMETIME_CAPTION_VIDEO :Output video
+STR_FRAMETIME_CAPTION_SOUND :Missaggio suoni
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Salva partita
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Carica partita
@@ -2749,6 +2802,7 @@ STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Dettagli
STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Informazioni non disponibili
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING}
STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: {WHITE}{STRING}
+STR_SAVELOAD_FILTER_TITLE :{BLACK}Filtro:
STR_SAVELOAD_OSKTITLE :{BLACK}Inserire un nome per il salvataggio
@@ -2947,6 +3001,8 @@ STR_NEWGRF_ERROR_READ_BOUNDS :Lettura oltre l
STR_NEWGRF_ERROR_GRM_FAILED :Risorsa GRF richiesta non disponibile (sprite {3:NUM})
STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} è stato disabilitato da {STRING}
STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Formato di layout dello sprite sconosciuto o non valido (sprite {3:NUM})
+STR_NEWGRF_ERROR_LIST_PROPERTY_TOO_LONG :Troppi elementi nella lista valori di una proprietà (sprite {3:NUM}, proprietà {4:HEX})
+STR_NEWGRF_ERROR_INDPROD_CALLBACK :Callback di produzione industria non valido (sprite {3:NUM}, "{1:STRING}")
# NewGRF related 'general' warnings
STR_NEWGRF_POPUP_CAUTION_CAPTION :{WHITE}Attenzione!
@@ -4258,7 +4314,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Troppe s
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Stazione composta da troppe parti
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Troppe stazioni degli autobus
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Troppe aree di carico per camion
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Troppo vicino ad un'altra stazione/area di carico
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Troppo vicino ad un altro molo
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Troppo vicino ad un altro aeroporto
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Impossibile rinominare la stazione...
diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt
index c9fd7a2c3f..c1b2fb1e75 100644
--- a/src/lang/japanese.txt
+++ b/src/lang/japanese.txt
@@ -2683,6 +2683,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}オリ
STR_ABOUT_VERSION :{BLACK}OpenTTD バージョン {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 The OpenTTD team
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}ゲームを保存
STR_SAVELOAD_LOAD_CAPTION :{WHITE}ゲームを開く
@@ -4199,7 +4206,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}停留
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}駅の部分が多すぎます
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}バス停が多すぎます
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}荷役所が多すぎます
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}他の停留施設に近すぎます
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}他の埠頭に近すぎます
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}他の空港に近すぎます
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}駅名を変更できません
diff --git a/src/lang/korean.txt b/src/lang/korean.txt
index b8d8cf1c4c..ea66904cd8 100644
--- a/src/lang/korean.txt
+++ b/src/lang/korean.txt
@@ -476,6 +476,7 @@ STR_ABOUT_MENU_SCREENSHOT :스크린샷
STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :스크린샷 찍기 (지금 보고 있는 영역)
STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :스크린샷 찍기 (창을 제외한 게임 화면만)
STR_ABOUT_MENU_GIANT_SCREENSHOT :스크린샷 찍기 (지도 전체)
+STR_ABOUT_MENU_SHOW_FRAMERATE :프레임레이트 보기
STR_ABOUT_MENU_ABOUT_OPENTTD :'OpenTTD'에 대해서
STR_ABOUT_MENU_SPRITE_ALIGNER :스프라이트 정렬도구
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :박스 경계선 보기 전환
@@ -815,6 +816,7 @@ STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLAC
STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDENT_NAME}{}(사장)
STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}{STRING}은(는) 새로운 도시 {TOWN}을(를) 건설했습니다!
+STR_NEWS_NEW_TOWN_UNSPONSORED :{BLACK}{BIG_FONT}{TOWN} - 새 도시가 생겼습니다!
STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLACK}{1:TOWN} 근처에 새로운 {0:STRING}{G 0 "이" "가"} 건설되고 있습니다!
STR_NEWS_INDUSTRY_PLANTED :{BIG_FONT}{BLACK}새 {STRING}{G 0 "이" "가"} {TOWN} 근처에서 자라나고 있습니다!
@@ -882,7 +884,7 @@ STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLAC
# Extra view window
STR_EXTRA_VIEW_PORT_TITLE :{WHITE}외부 화면 {COMMA}
-STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}외부 화면에 복사
+STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}외부 화면으로 복사
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}현재 장소를 외부 화면에 복사합니다.
STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}이 장소로 이동
STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}외부 화면에 저장된 장소로 이동합니다.
@@ -927,6 +929,7 @@ STR_GAME_OPTIONS_CURRENCY_ZAR :남아프리카
STR_GAME_OPTIONS_CURRENCY_CUSTOM :사용자 설정...
STR_GAME_OPTIONS_CURRENCY_GEL :그루지야 라리 (GEL)
STR_GAME_OPTIONS_CURRENCY_IRR :이란 리알 (IRR)
+STR_GAME_OPTIONS_CURRENCY_RUB :신 러시아 루블 (RUB)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}차량 통행 방식
@@ -1004,7 +1007,7 @@ STR_GAME_OPTIONS_BASE_MUSIC_STATUS :{RED}{NUM}개
STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}기본 배경 음악 세트에 대한 추가 정보를 봅니다.
STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}지원되는 해상도 목록을 불러오는데 실패하였습니다.
-STR_ERROR_FULLSCREEN_FAILED :{WHITE}풀스크린 모드 실패
+STR_ERROR_FULLSCREEN_FAILED :{WHITE}전체화면 모드 실패
# Custom currency window
@@ -1266,7 +1269,7 @@ STR_CONFIG_SETTING_ORDER_REVIEW_HELPTEXT :이 설정을
STR_CONFIG_SETTING_ORDER_REVIEW_OFF :검사하지 않음
STR_CONFIG_SETTING_ORDER_REVIEW_EXDEPOT :정지한 차량을 제외하고 검사
STR_CONFIG_SETTING_ORDER_REVIEW_ON :모든 차량을 검사
-STR_CONFIG_SETTING_WARN_INCOME_LESS :차량의 수입이 적자일때 경고하기: {STRING}
+STR_CONFIG_SETTING_WARN_INCOME_LESS :차량의 수입이 적자일 때 경고하기: {STRING}
STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :이 설정을 켜면, 지난 해에 수익이 없는 차량이 있으면 뉴스 메시지로 알려줍니다.
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :옛날 차량을 사라지지 않고 계속 만들 수 있게 함: {STRING}
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :이 설정을 켜면, 오래된 차량 모델을 포함하여 모든 차량 모델을 도입 이후에 계속 사용할 수 있게 됩니다.
@@ -2289,6 +2292,7 @@ STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}화물
STR_LINKGRAPH_LEGEND_ALL :{BLACK}모두
STR_LINKGRAPH_LEGEND_NONE :{BLACK}없음
STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}표시할 회사를 선택하십시오
+STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY}
# Linkgraph legend window and linkgraph legend in smallmap
STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}이용 없음
@@ -2697,6 +2701,56 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original
STR_ABOUT_VERSION :{BLACK}OpenTTD 버전 {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD 개발팀
+# Framerate display window
+STR_FRAMERATE_CAPTION :{WHITE}프레임레이트
+STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} ({DECIMAL}x)
+STR_FRAMERATE_RATE_GAMELOOP :{BLACK}시뮬레이션 비율: {STRING}
+STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP :{BLACK}1초에 시뮬레이션하는 게임 틱 수입니다.
+STR_FRAMERATE_RATE_BLITTER :{BLACK}그래픽 프레임레이트: {STRING}
+STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}1초에 표현하는 비디오 프레임 수입니다.
+STR_FRAMERATE_SPEED_FACTOR :{BLACK}현재 게임 속력 계수: {DECIMAL}x
+STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}현재 게임이 일반적인 시뮬레이션 비율 속도에 비해 얼마나 빠르게 구동되고 있는지를 보여줍니다.
+STR_FRAMERATE_CURRENT :{WHITE}현재
+STR_FRAMERATE_AVERAGE :{WHITE}평균
+STR_FRAMERATE_DATA_POINTS :{BLACK}{COMMA}개의 값을 기반으로 측정한 데이터
+STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL}{BLACK} ms
+STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL} ms
+STR_FRAMERATE_MS_BAD :{RED}{DECIMAL} ms
+STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL} 프레임/초
+STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL} 프레임/초
+STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL} 프레임/초
+STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA} ms
+STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA}초
+############ Leave those lines in this order!!
+STR_FRAMERATE_GAMELOOP :{BLACK}총 게임 루프:
+STR_FRAMERATE_GL_ECONOMY :{BLACK} 화물 처리:
+STR_FRAMERATE_GL_TRAINS :{BLACK} 열차 틱:
+STR_FRAMERATE_GL_ROADVEHS :{BLACK} 자동차 틱:
+STR_FRAMERATE_GL_SHIPS :{BLACK} 선박 틱:
+STR_FRAMERATE_GL_AIRCRAFT :{BLACK} 항공기 틱:
+STR_FRAMERATE_GL_LANDSCAPE :{BLACK} 세계 틱:
+STR_FRAMERATE_GL_LINKGRAPH :{BLACK} 연결 그래프 지연:
+STR_FRAMERATE_DRAWING :{BLACK}그래픽 렌더링:
+STR_FRAMERATE_DRAWING_VIEWPORTS :{BLACK} 세계 화면:
+STR_FRAMERATE_VIDEO :{BLACK}비디오 출력:
+STR_FRAMERATE_SOUND :{BLACK}사운드 합성:
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+STR_FRAMETIME_CAPTION_GAMELOOP :게임 루프
+STR_FRAMETIME_CAPTION_GL_ECONOMY :화물 처리
+STR_FRAMETIME_CAPTION_GL_TRAINS :열차 틱
+STR_FRAMETIME_CAPTION_GL_ROADVEHS :자동차 틱
+STR_FRAMETIME_CAPTION_GL_SHIPS :선박 틱
+STR_FRAMETIME_CAPTION_GL_AIRCRAFT :항공기 틱
+STR_FRAMETIME_CAPTION_GL_LANDSCAPE :세계 틱
+STR_FRAMETIME_CAPTION_GL_LINKGRAPH :연결 그래프 지연
+STR_FRAMETIME_CAPTION_DRAWING :그래픽 렌더링
+STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :세계 화면 렌더링
+STR_FRAMETIME_CAPTION_VIDEO :비디오 출력
+STR_FRAMETIME_CAPTION_SOUND :사운드 합성
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}게임 저장
STR_SAVELOAD_LOAD_CAPTION :{WHITE}게임 불러오기
@@ -2719,6 +2773,7 @@ STR_SAVELOAD_DETAIL_CAPTION :{BLACK}게임
STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}사용 가능한 정보 없음.
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING}
STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: {WHITE}{STRING}
+STR_SAVELOAD_FILTER_TITLE :{BLACK}검색할 문자열:
STR_SAVELOAD_OSKTITLE :{BLACK}게임을 저장할 파일명을 입력하세요
@@ -2917,6 +2972,8 @@ STR_NEWGRF_ERROR_READ_BOUNDS :유사 스프
STR_NEWGRF_ERROR_GRM_FAILED :요청한 GRF 자원을 사용할 수 없음 (스프라이트 {3:NUM})
STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING}(은)는 {STRING} 때문에 사용할 수 없습니다
STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :유효하지 않은/알 수 없는 스프라이트 구조 유형 (스프라이트 {3:NUM})
+STR_NEWGRF_ERROR_LIST_PROPERTY_TOO_LONG :속성값 목록에 너무 많은 요소가 있음 (스프라이트 {3:NUM}, 속성 {4:HEX})
+STR_NEWGRF_ERROR_INDPROD_CALLBACK :유효하지 않은 산업 생산 콜백 (스프라이트 {3:NUM}, "{1:STRING}")
# NewGRF related 'general' warnings
STR_NEWGRF_POPUP_CAUTION_CAPTION :{WHITE}경고!
@@ -2981,6 +3038,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}팻말
STR_TOWN_DIRECTORY_CAPTION :{WHITE}도시 목록
STR_TOWN_DIRECTORY_NONE :{ORANGE}(없음)
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA})
+STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (대도시){BLACK} ({COMMA})
STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}도시 이름 - 이 도시로 시점을 변경하려면 클릭하세요. CTRL+클릭하면 이 도시 위치를 기준으로 새로운 외부 화면을 엽니다.
STR_TOWN_POPULATION :{BLACK}총 인구 수: {COMMA}
@@ -4227,7 +4285,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}역이
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}철도역 조각이 너무 많습니다
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}버스 정류장이 너무 많습니다
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}트럭 적하장이 너무 많습니다
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}다른 역과 너무 가깝습니다!
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}다른 항구와 너무 가깝습니다!
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}다른 공항과 너무 가깝습니다!
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}역 이름을 바꿀 수 없습니다...
diff --git a/src/lang/latin.txt b/src/lang/latin.txt
index 59f41144e8..9fa9f87293 100644
--- a/src/lang/latin.txt
+++ b/src/lang/latin.txt
@@ -838,6 +838,7 @@ STR_MUSIC_RULER_MARKER :{TINY_FONT}{BLA
STR_MUSIC_TRACK_NONE :{TINY_FONT}{DKGREEN}--
STR_MUSIC_TRACK_DIGIT :{TINY_FONT}{DKGREEN}{ZEROFILL_NUM}
STR_MUSIC_TITLE_NONE :{TINY_FONT}{DKGREEN}------
+STR_MUSIC_TITLE_NOMUSIC :{TINY_FONT}{DKGREEN}Nulla musica parata
STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}"
STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Carmen
STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Titulus
@@ -858,11 +859,14 @@ STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Incipere
STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Monstrare fenestram electionis carminum
# Playlist window
+STR_PLAYLIST_MUSIC_SELECTION_SETNAME :{WHITE}Compositio Musicae - '{STRING}'
STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}"
STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Index Carminum
STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Compositio - '{STRING}'
STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Vacuefacere
+STR_PLAYLIST_CHANGE_SET :{BLACK}Mutare gregem
STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Vacuefacere compositionem (modo Propriam I aut Propriam II)
+STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Mutare gregem musicam
STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Preme in carmen ut compositioni addantur (modo Propriae I aut Propriae II)
STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Preme in carmen ut ex compositione removeatur (modo Propria I aut Propria II)
@@ -1065,10 +1069,10 @@ STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLAC
# Extra view window
STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Fenestra conspectus {COMMA}
-STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Transcribere ad fenestram conspectus
+STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Mutare conspectum
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Transcribere locum primarium ad hanc fenestram conspectus
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Glutinare ex fenestra conspectus
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Glutinare locum ex hac fenestra ad conspectum primarium
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Mutare conspectum primum
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Transcribere locum ex hac fenestra ad conspectum primarium
# Game options window
STR_GAME_OPTIONS_CAPTION :{WHITE}Ludi optiones
@@ -1522,7 +1526,13 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Color terrae in
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Viridis
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Viridis Obscurus
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Purpureus
-STR_CONFIG_SETTING_SMOOTH_SCROLLING :Vagari conspectum leniter: {STRING}
+STR_CONFIG_SETTING_SCROLLMODE :Modus conspectum movendi: {STRING}
+STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Quomodo tabula geographica vagatur
+STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Conspectus movetur globulo dextro, loco muris fixo
+STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Tabula movetur globulo dextro, loco muris fixo
+STR_CONFIG_SETTING_SCROLLMODE_RMB :Tabula movetur globulo muris dextro
+STR_CONFIG_SETTING_SCROLLMODE_LMB :Tabula movetur globulo muris sinistro
+STR_CONFIG_SETTING_SMOOTH_SCROLLING :Movere conspectum leniter: {STRING}
STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Quomodo conspectus vagatur ad quemdam locum globulo sinistro in tabula premendi aut cum iubetur vagari ad quamdam rem in tabula. Electa, conspectus leniter vagatur. Neglecta, statim salit ad locum
STR_CONFIG_SETTING_MEASURE_TOOLTIP :Ostendere nuntium adiuvans apud varia ferramenta construendi: {STRING}
STR_CONFIG_SETTING_MEASURE_TOOLTIP_HELPTEXT :Ostendere spatium atque altitudinem inter tegulas dum mus trahitur in construendo
@@ -2476,6 +2486,7 @@ STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Formula
STR_LINKGRAPH_LEGEND_ALL :{BLACK}Omnia
STR_LINKGRAPH_LEGEND_NONE :{BLACK}Nulla
STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Eligere societates monstrandas
+STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY}
# Linkgraph legend window and linkgraph legend in smallmap
STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}non usus
@@ -2888,6 +2899,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Privileg
STR_ABOUT_VERSION :{BLACK}OpenTTD editio {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} MMII-MMXVII Manus OpenTTD
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Servare Ludum
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Legere Ludum
@@ -3172,6 +3190,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Inscribe
STR_TOWN_DIRECTORY_CAPTION :{WHITE}Oppida
STR_TOWN_DIRECTORY_NONE :{ORANGE}- Nulla -
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA})
+STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Urbs){BLACK} ({COMMA})
STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Nomina oppidorum - preme in nomen ut conspectus supra oppidum locetur. Ctrl+Preme ut novam fenestram conspectus supra oppidum aperiatur
STR_TOWN_POPULATION :{BLACK}Incolae mundi: {COMMA}
@@ -4419,7 +4438,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Nimis st
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Nimis partes stationum ferriviariarum adsunt
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Nimis stationes laophoricae adsunt
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Nimis stationes autoplaustricae adsunt
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Nimis prope aliam stationem
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Nimis prope aliud navale
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Nimis prope alium aeroportum
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Non licet stationem renominare...
@@ -4427,6 +4445,7 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... via
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... viae directio non convenit
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... stationi perviae non licet esse curva
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... stationi perviae non licet compita habere
+STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... via est monodromus vel obstructa
# Station destruction related errors
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Non licet partem stationis removere...
@@ -4678,6 +4697,8 @@ STR_BASESOUNDS_DOS_DESCRIPTION :Soni ex edition
STR_BASESOUNDS_WIN_DESCRIPTION :Soni ex editione originale Transport Tycoon Deluxe Windows.
STR_BASESOUNDS_NONE_DESCRIPTION :Sarcina sonorum sine ullis sonis.
STR_BASEMUSIC_WIN_DESCRIPTION :Musica ex editione originale Transport Tycoon Deluxe Windows.
+STR_BASEMUSIC_DOS_DESCRIPTION :Musica ex editione originale Transport Tycoon Deluxe DOS.
+STR_BASEMUSIC_TTO_DESCRIPTION :Musica ex editione originale Transport Tycoon (Originale/World Editor) DOS.
STR_BASEMUSIC_NONE_DESCRIPTION :Sarcina musicae sine ulla musica.
##id 0x2000
diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt
index 134bd05746..4f723b5a88 100644
--- a/src/lang/latvian.txt
+++ b/src/lang/latvian.txt
@@ -475,6 +475,7 @@ STR_ABOUT_MENU_SCREENSHOT :Ekrānuzņēmum
STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Pilnībā pietuvināts ekrānuzņēmums
STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Noklusējuma mēroga ekrānuzņēmums
STR_ABOUT_MENU_GIANT_SCREENSHOT :Visas kartes ekrānuzņēmums
+STR_ABOUT_MENU_SHOW_FRAMERATE :Rādīt kadru ātrumu
STR_ABOUT_MENU_ABOUT_OPENTTD :Par 'OpenTTD'
STR_ABOUT_MENU_SPRITE_ALIGNER :Gariņu līdzinātājs
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Pārslēgt saistītās kastes
@@ -1273,6 +1274,7 @@ STR_CONFIG_SETTING_LANDSCAPE :Ainava: {STRING
STR_CONFIG_SETTING_LAND_GENERATOR :Zemes radītājs: {STRING}
STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Sākotnējais
STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis
+STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(Tikai TerraGenesis) Ainavas kalnainība
STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Maksimālais attālums no kartes malas naftas pārstrādes rūpnīcām: {STRING}
STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Naftas pārstrādes rūpnīcas ir būvējamas tikai kartes malu tuvumā, salu kartēm tas ir pie krasta
STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Sniega līnijas augstums: {STRING}
@@ -1561,6 +1563,7 @@ STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Lielpilsētu vi
STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :manuāli
STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :asimetriska
STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :simetriska
+STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"nesimetriski" nozīmē, ka patvaļīgu kravas daudzumu var nosūtīt abos virzienos."manuāli" nozīmē, ka šīm kravām netiks veikta automātiska izplatīšana.
STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Sadales precizitāte: {STRING}
STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Uzstādod šo mazāk par 100% liks simetriskajai sadalei izturēties vairāk kā asimetriskajai. Mazāk kravas ar varu tiks sūtīts atpakaļ ja noteikts daudzums tiks sūtīts uz piestātni. Ja jūs uzstādīsiet to uz 0% simetriskā sadale izturēsies tā pat kā asimetriskā.
@@ -2625,6 +2628,16 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Oriģin
STR_ABOUT_VERSION :{BLACK}OpenTTD versija {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD darba grupa
+# Framerate display window
+STR_FRAMERATE_SPEED_FACTOR :{WHITE}pašreizējās spēles ātruma pakāpe: {DECIMAL}x
+STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Cik ātri spēle šobrīd iet salīdzinot ar standarta ātrumu.
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+STR_FRAMETIME_CAPTION_VIDEO :{WHITE}video izeja
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Saglabāt spēli
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Ielādēt spēli
@@ -2775,6 +2788,7 @@ STR_SAVE_PRESET_EDITBOX_TOOLTIP :{BLACK}Pašlaik
STR_SAVE_PRESET_CANCEL :{BLACK}Atcelt
STR_SAVE_PRESET_CANCEL_TOOLTIP :{BLACK}Nemainīt iepriekšiestatījumu
STR_SAVE_PRESET_SAVE :{BLACK}Saglabāt
+STR_SAVE_PRESET_SAVE_TOOLTIP :{BLACK}pašreizējos iestatījumus saglābāt kā sākontnējos iestatījumus
# NewGRF parameters window
STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}Mainīt NewGRF parametrus
@@ -3212,6 +3226,7 @@ STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Iepriek
STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} (aizvests {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}%
+STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}Nozare ir paziņojusi par nenovēršamu slēgšanu!
############ range for requires starts
STR_INDUSTRY_VIEW_REQUIRES_CARGO :{BLACK}Nepieciešams: {YELLOW}{STRING}{STRING}
@@ -3286,6 +3301,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Novākt visus t
STR_GROUP_RENAME_CAPTION :{BLACK}Pārdēvēt grupu
+STR_GROUP_PROFIT_THIS_YEAR :Ienākumi šajā gadā:
# Build vehicle window
STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Jauni dzelzceļa transportlīdzekļi
@@ -4051,6 +4067,7 @@ STR_ERROR_EXCAVATION_WOULD_DAMAGE :{WHITE}Rakšana
STR_ERROR_ALREADY_AT_SEA_LEVEL :{WHITE}... jau ir jūras līmenī
STR_ERROR_TOO_HIGH :{WHITE}... pārāk augstu
STR_ERROR_ALREADY_LEVELLED :{WHITE}... jau ir līdzens
+STR_ERROR_BRIDGE_TOO_HIGH_AFTER_LOWER_LAND :{WHITE}Tilta otrs gals ir pārāk augstu.
# Company related errors
STR_ERROR_CAN_T_CHANGE_COMPANY_NAME :{WHITE}Uzņēmuma nosaukumu nevar mainīt...
@@ -4117,7 +4134,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Pārāk
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Pārāk daudz dzelzceļa stacijas daļu
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Pārāk daudz autobusu pieturvietu
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Pārāk daudz kravas automobiļu staciju
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Pārāk tuvu citai stacijai/iekraušanas zonai
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Pārāk tuvu citai piestātnei
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Pārāk tuvu citai lidostai
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Nevar pārdēvēt staciju...
@@ -4265,6 +4281,7 @@ STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... tā
STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Nevar izveidot grupu...
STR_ERROR_GROUP_CAN_T_DELETE :{WHITE}Nevar izdzēst šo grupu...
STR_ERROR_GROUP_CAN_T_RENAME :{WHITE}Nevar pārdēvēt grupu...
+STR_ERROR_GROUP_CAN_T_SET_PARENT :nevar iestatīt vecāku grupu...
STR_ERROR_GROUP_CAN_T_REMOVE_ALL_VEHICLES :{WHITE}Nevar noņemt no šīs grupas visus transportlīdzekļus...
STR_ERROR_GROUP_CAN_T_ADD_VEHICLE :{WHITE}Nevar pievienot transportlīdzekļus šai grupai...
STR_ERROR_GROUP_CAN_T_ADD_SHARED_VEHICLE :{WHITE}Nevar pievienot koplietojamos transportlīdzekļus šai grupai...
diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt
index fb1fe0b4d9..163c90c70d 100644
--- a/src/lang/lithuanian.txt
+++ b/src/lang/lithuanian.txt
@@ -2901,6 +2901,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Pradinė
STR_ABOUT_VERSION :{BLACK}OpenTTD versija {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 OpenTTD komanda
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Išsaugoti žaidimą
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Įkelti žaidimą
@@ -4471,7 +4478,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Per daug
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Perdaug traukinių stoties dalių
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Per daug autobusų stotelių
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Per daug sunkvežimių pakrovimo aikstelių
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Per arti kitos stotelės
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Per arti kitos prieplaukos
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Per arti kito oro uosto
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Stotelės pervardinti negalima...
diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt
index 324bacc924..60ffaf64a3 100644
--- a/src/lang/luxembourgish.txt
+++ b/src/lang/luxembourgish.txt
@@ -2686,6 +2686,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original
STR_ABOUT_VERSION :{BLACK}OpenTTD Versioun {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 D'OpenTTD team
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Spill späicheren
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Spill lueden
@@ -4215,7 +4222,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Ze vill
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Ze vill Garesdeeler
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Ze vill Busarrêten
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Ze vill Camionsgaren
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Ze noo un enger aanerer Gare/Luedstatioun
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Ze noo un engem aanerem Hafen
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Ze noo un engem aaneren Fluchhafen
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Kann d'Statioun net ëmbenennen...
diff --git a/src/lang/malay.txt b/src/lang/malay.txt
index 1bcb8156f0..e5ba9a2dc0 100644
--- a/src/lang/malay.txt
+++ b/src/lang/malay.txt
@@ -215,6 +215,7 @@ STR_UNITS_VOLUME_LONG_SI :{COMMA} m³
STR_UNITS_FORCE_SI :{COMMA} kN
STR_UNITS_HEIGHT_IMPERIAL :{COMMA} ka
+STR_UNITS_HEIGHT_METRIC :{COMMA}{NBSP}m
STR_UNITS_HEIGHT_SI :{COMMA} m
# Common window strings
@@ -241,6 +242,7 @@ STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Bar Skro
STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Musnahkan bangunan dll. dari dataran tanah. Ctrl memilih kawasan menyerong. Shift bangunan/tunjukkan anggaran kos.
# Show engines button
+STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT :{BLACK}Tunjukkan perkara yang tersembunyi
STR_SHOW_HIDDEN_ENGINES_VEHICLE_SHIP_TOOLTIP :{BLACK}Dengan membenarkan pilihan ini, kapal tersembunyi turut ditunjukkan
@@ -453,7 +455,7 @@ STR_ABOUT_MENU_TOGGLE_CONSOLE :Papar atau pada
STR_ABOUT_MENU_AI_DEBUG :Al/Skrip pepijat permainan
STR_ABOUT_MENU_SCREENSHOT :Tangkapan skrin (Ctrl+S)
STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Zum sepenuhnya di pembidik skrin
-STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Tangkapan skrin dizoom asal
+STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Tangkapan skrin di zum asal
STR_ABOUT_MENU_GIANT_SCREENSHOT :Tangkap gambar skrin besar (Ctrl+G)
STR_ABOUT_MENU_ABOUT_OPENTTD :Tentang 'OpenTTD'
STR_ABOUT_MENU_SPRITE_ALIGNER :Penjajar peperi
@@ -610,7 +612,7 @@ STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Jumlah w
STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Jumlah wang keuntungan dalam suku tahun dengan keuntungan tertinggi dalam 12 suku tahun yang lepas
STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Unit-unit kargo yang dihantar dalam 4 suku tahun yang lepas
STR_PERFORMANCE_DETAIL_CARGO_TOOLTIP :{BLACK}Jumlah jenis kargo yang dihantar dalam suku tahun yang lepas
-STR_PERFORMANCE_DETAIL_MONEY_TOOLTIP :{BLACK}Jumlah wang syarikat ini mempunyai dalam bank
+STR_PERFORMANCE_DETAIL_MONEY_TOOLTIP :{BLACK}Jumlah wang syarikat di dalam bank
STR_PERFORMANCE_DETAIL_LOAN_TOOLTIP :{BLACK}Jumlah wang syarikat ini yang telah dipinjam
STR_PERFORMANCE_DETAIL_TOTAL_TOOLTIP :{BLACK}Jumlah markah daripada markah yang boleh diperolehi
@@ -734,6 +736,7 @@ STR_SMALLMAP_TOOLTIP_ENABLE_ALL_INDUSTRIES :{BLACK}Paparkan
STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Papar atau padamkan heightmap
STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}Paparkan hartanah tanpa syarikat pada peta
STR_SMALLMAP_TOOLTIP_ENABLE_ALL_COMPANIES :{BLACK}Paparkan seluruh maklumat hartanah syarikat pada peta
+STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Tunjukkan semua kargo di atas peta
# Status bar messages
STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Tunjukkan mesej atau laporan berita terakhir
@@ -850,10 +853,10 @@ STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT} {BLA
# Extra view window
STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Tetingkap Pemandangan {COMMA}
-STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Salin ke tetingkap pemandangan
+STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Ubah tetingkap paparan
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Salin lokasi pemandangan global kepada tetingkap pemandangan ini
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Tampal daripada tetingkap pemandangan
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Salin lokasi tetingkap pemandangan ini kepada pemandangan utama
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Ubah paparan utama
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Salin lokasi tetingkap paparan ini ke paparan utama
# Game options window
STR_GAME_OPTIONS_CAPTION :{WHITE}Pilihan Permainan
@@ -1215,6 +1218,7 @@ STR_CONFIG_SETTING_ORDER_REVIEW_ON :Semua kenderaan
STR_CONFIG_SETTING_WARN_INCOME_LESS :Beri amaran jika pendapatan kenderaan adalah negatif: {STRING}
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Kenderaan tidak akan tamat tempohnya: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Gunakan pembaharuan automatik apabila kenderaan usang : {STRING}
+STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_AFTER :{COMMA} bulan{P 0 "" s} selepas
STR_CONFIG_SETTING_AUTORENEW_MONEY :Wang minimum yang diperlukan untuk pembaharuan automatik: {STRING}
STR_CONFIG_SETTING_ERRMSG_DURATION :Jangkamasa mesej ralat: {STRING}
STR_CONFIG_SETTING_POPULATION_IN_LABEL :Tunjukkan jumlah penduduk dalam label nama bandar: {STRING}
@@ -1262,6 +1266,7 @@ STR_CONFIG_SETTING_SCROLLWHEEL_ZOOM :Membesarkan pet
STR_CONFIG_SETTING_SCROLLWHEEL_SCROLL :Skrol peta
STR_CONFIG_SETTING_SCROLLWHEEL_OFF :Matikan
STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER :Kelajuan roda skrol pada peta: {STRING}
+STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER_HELPTEXT :Kawal kesensitifan skrol roda tetikus
STR_CONFIG_SETTING_OSK_ACTIVATION :Papan kekunci di skrin: {STRING}
STR_CONFIG_SETTING_OSK_ACTIVATION_HELPTEXT :Pilih kaedah untuk membuka papan kekunci pada skrin untuk memasukkan teks ke dalam kotak edit hanya menggunakan petunjuk peranti. Ini bertujuan untuk peranti kecil yang tiada papan kekunci sebenar
STR_CONFIG_SETTING_OSK_ACTIVATION_DISABLED :Dinyah-upayakan
@@ -1293,6 +1298,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS :Gunakan senarai
STR_CONFIG_SETTING_LOADING_INDICATORS :Gunakan penunjuk muatan: {STRING}
STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Tunjukkan jadual menggunakan tanda rait dan bukan hari: {STRING}
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Tunjukkan ketibaan dan pelepasan dalam jadual: {STRING}
+STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Tunjukkan jangkaan waktu ketibaan dan pelepasan dalam jadual
STR_CONFIG_SETTING_QUICKGOTO :Pewujudan pantas arahan kenderaan: {STRING}
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE :Landasan keretapi lazim (apabila memulakan permainan baru/buka permainan: {STRING}
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :Yang tersedia terawal
@@ -1300,6 +1306,7 @@ STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_LAST :Yang tersedia s
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_MOST_USED :Yang selalu digunakan
STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION :Tunjukkan landasan yang ditempah: {STRING}
STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Alat binaan tetap aktif selepas digunakan: {STRING}
+STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT :Simpan alat pembinaan untuk jambatan, terowong, dll. buka selepas guna
STR_CONFIG_SETTING_EXPENSES_LAYOUT :Perbelanjaan kumpulan dalam tetingkap kewangan syarikat: {STRING}
STR_CONFIG_SETTING_SOUND_CONFIRM :Pembinaan: {STRING}
@@ -1307,6 +1314,7 @@ STR_CONFIG_SETTING_SOUND_CONFIRM :Pembinaan: {STR
STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING :Nyahaktif infrastruktur bangunan apabila tiada kenderaan yang sesuai: {STRING}
STR_CONFIG_SETTING_MAX_TRAINS :Amaun maksimum kereta api setiap syarikat: {STRING}
STR_CONFIG_SETTING_MAX_ROAD_VEHICLES :Amaun maksimum kenderaan jalanraya setiap syarikat: {STRING}
+STR_CONFIG_SETTING_MAX_ROAD_VEHICLES_HELPTEXT :Jumlah maksimum kenderaan darat sesebuah syarikat
STR_CONFIG_SETTING_MAX_AIRCRAFT :Amaun maksimum pesawat setiap syarikat: {STRING}
STR_CONFIG_SETTING_MAX_SHIPS :Amaun maksimum kapal setiap syarikat: {STRING}
@@ -1327,7 +1335,10 @@ STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :#opcodes sebelu
STR_CONFIG_SETTING_SERVINT_ISPERCENT :Tempoh waktu servis dalam peratusan: {STRING}
STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Pilih sama ada selenggara kenderaan dimulakan sejak tempoh masa dari servis terakhir atau apabila peratusan kebolehupayaan kenderaan berkurang kepada peratusan tertentu.
+STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}hari{P 0 "" s}/%
STR_CONFIG_SETTING_SERVINT_DISABLED :Dilumpuhkan
+STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :Tetapkan selang masa servis untuk pesawat baru kepada tetapan asal jika tiada selang masa servis yang jelas ditetapkan untuk pesawat tersebut
+STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :Tetapkan selang masa servis untuk kapal baru kepada tetapan asal jika tiada selang masa servis yang jelas ditetapkan untuk kapal tersebut
STR_CONFIG_SETTING_NOSERVICE :Servis tidak diperlukan apabila kerosakan kenderaan ditetapkan kepada tiada: {STRING}
STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Benarkan had kelajuan untuk gerabak: {STRING}
STR_CONFIG_SETTING_DISABLE_ELRAILS :Tiada landasan elektrik: {STRING}
@@ -1339,13 +1350,16 @@ STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Maklumat syarik
STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Paparkan surat khabar mengenai pembukaan syarikat baru, atau apabila syarikat dalam risiko untuk muflis
STR_CONFIG_SETTING_NEWS_INDUSTRY_OPEN :Pembukaan industri: {STRING}
STR_CONFIG_SETTING_NEWS_INDUSTRY_CLOSE :Penutupan industri: {STRING}
+STR_CONFIG_SETTING_NEWS_INDUSTRY_CLOSE_HELPTEXT :Paparkan keratan akhbar apabila ada industri yang ditutup
STR_CONFIG_SETTING_NEWS_ECONOMY_CHANGES :Perubahan ekonomi: {STRING}
STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY :Perubahan pengeluaran industri-industri yang diservis oleh syarikat: {STRING}
STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER :Perubahan pengeluaran industri-industri yang diservis oleh pesaing: {STRING}
+STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER_HELPTEXT :Paparkan keratan akhbar apabila berlaku perubahan tahap pengeluaran industri yang diservis oleh pesaing
STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED :Pengubaran pengeluaran industri lain: {STRING}
STR_CONFIG_SETTING_NEWS_ADVICE :Nasihat / maklumat tentang kenderaan syarikat: {STRING}
STR_CONFIG_SETTING_NEWS_NEW_VEHICLES :Kenderaan baru: {STRING}
STR_CONFIG_SETTING_NEWS_CHANGES_ACCEPTANCE :Penukaran pada penerimaan kargo: {STRING}
+STR_CONFIG_SETTING_NEWS_CHANGES_ACCEPTANCE_HELPTEXT :Tunjukkan mesej berkenaan perubahan kebolehterimaan sesetengah kargo di stesen terlibat
STR_CONFIG_SETTING_NEWS_SUBSIDIES :Subsidi: {STRING}
STR_CONFIG_SETTING_NEWS_GENERAL_INFORMATION :Maklumat umum: {STRING}
@@ -1406,17 +1420,25 @@ STR_CONFIG_SETTING_TOWN_GROWTH_NORMAL :Biasa
STR_CONFIG_SETTING_TOWN_GROWTH_FAST :Pantas
STR_CONFIG_SETTING_TOWN_GROWTH_VERY_FAST :Sangat pantas
STR_CONFIG_SETTING_LARGER_TOWNS_VALUE :1 dalam {COMMA}
+STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Tiada
STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Pengganda awal saiz bandar: {STRING}
+STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_IMPERIAL :Sistem Imperial (kuasa kuda/hp)
+STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_METRIC :Sistem metrik (kuasa kuda/hp)
+STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_SI :Unit SI (kW)
+
+
+STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_SI :Unit SI (m³)
-
-
+STR_CONFIG_SETTING_SOUND :{ORANGE}Bunyi
STR_CONFIG_SETTING_INTERFACE :{ORANGE}Antaramuka (Interface)
STR_CONFIG_SETTING_INTERFACE_CONSTRUCTION :{ORANGE}Pembinaan
+STR_CONFIG_SETTING_ADVISORS :{ORANGE}Berita / Penasihat
+STR_CONFIG_SETTING_COMPANY :{ORANGE}Syarikat
STR_CONFIG_SETTING_VEHICLES :{ORANGE}Kenderaan
STR_CONFIG_SETTING_VEHICLES_ROUTING :{ORANGE}Laluan
STR_CONFIG_SETTING_ACCIDENTS :{ORANGE}Kecelakaan / Kemalangan
@@ -1497,7 +1519,7 @@ STR_INTRO_TRANSLATION :{BLACK}Terjemah
# Quit window
STR_QUIT_CAPTION :{WHITE}Keluar
-STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD :{YELLOW}Pastikah anda untuk keluar dari OpenTTD dan kembali ke {STRING}?
+STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD :{YELLOW}Adakah anda pasti untuk keluar dari OpenTTD dan kembali ke {STRING}?
STR_QUIT_YES :{BLACK}Ya
STR_QUIT_NO :{BLACK}Tidak
@@ -1515,8 +1537,8 @@ STR_OSNAME_SUNOS :SunOS
# Abandon game
STR_ABANDON_GAME_CAPTION :{WHITE}Tinggalkan Permainan
-STR_ABANDON_GAME_QUERY :{YELLOW}Pastikah anda mahu keluar permainan ini?
-STR_ABANDON_SCENARIO_QUERY :{YELLOW}Pastikah anda untuk keluar senario ini?
+STR_ABANDON_GAME_QUERY :{YELLOW}Pastikah anda mahu keluar dari permainan ini?
+STR_ABANDON_SCENARIO_QUERY :{YELLOW}Pastikah anda untuk keluar dari senario ini?
# Cheat window
STR_CHEATS :{WHITE}Penipuan (Cheats)
@@ -1691,6 +1713,7 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}Nama per
STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Tetapkan kata laluan
STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Lindungi permainan anda dengan kata laluan jika anda tidak mahu ianya diakses awam
+STR_NETWORK_START_SERVER_UNADVERTISED :Tidak
STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} pelanggan
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Amaun maksimum pemain:
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Tentukan bilangan klien maks. Tidak perlu semua slot diisi
@@ -1768,7 +1791,7 @@ STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Mulakan
STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Saksikan permainan
STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Saksikan permainan sebagai seorang penyaksi
STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Sertai syarikat
-STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Bantu mengurus syarikat ini
+STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Bantu uruskan syarikat ini
# Network connecting window
STR_NETWORK_CONNECTING_CAPTION :{WHITE}Menyambung...
@@ -1929,6 +1952,7 @@ STR_CONTENT_SELECT_UPDATES_CAPTION :{BLACK}Pilih pe
STR_CONTENT_SELECT_UPDATES_CAPTION_TOOLTIP :{BLACK}Tandakan semua kandungan sedia ada yang telah ditingkatkan untuk dimuat turun
STR_CONTENT_UNSELECT_ALL_CAPTION :{BLACK}Nyahpilihkan semua
STR_CONTENT_UNSELECT_ALL_CAPTION_TOOLTIP :{BLACK}Tandakan semua kandungan supaya jangan dimuat turun
+STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}Anda sedang meninggalkan OpenTTD!
STR_CONTENT_FILTER_TITLE :{BLACK}Saringan tag/nama:
STR_CONTENT_OPEN_URL :{BLACK}Lawati halaman
STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Lawati halaman untuk kandungan ini
@@ -1981,7 +2005,7 @@ STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_FILE_NOT_WRITABLE :{WHITE}... fail
STR_CONTENT_ERROR_COULD_NOT_EXTRACT :{WHITE}Tidak dapat menyahmampat fail yang dimuat turun
STR_MISSING_GRAPHICS_SET_CAPTION :{WHITE}Grafik hilang
-STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD memerlukan grafik berfungsi tetapi tiada diperolehi. Adakah anda membenarkan OpenTTD untuk memuat turun dan memasang-grafik?
+STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD memerlukan grafik berfungsi tetapi tiada grafik diperolehi. Adakah anda benarkan OpenTTD untuk memuat turun dan memasang grafik?
STR_MISSING_GRAPHICS_YES_DOWNLOAD :{BLACK}Ya, muat turun grafik
STR_MISSING_GRAPHICS_NO_QUIT :{BLACK}Tidak, keluar dari OpenTTD
@@ -2304,6 +2328,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Nama pet
STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Kargo yang diterima: {LTBLUE}
STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING})
+STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Jenis landasan: {LTBLUE}{STRING}
STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Had kelajuan landasan: {LTBLUE}{VELOCITY}
# Description of land area of different tiles
@@ -2316,28 +2341,28 @@ STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Tanah diliputi
STR_LAI_CLEAR_DESCRIPTION_DESERT :Padang pasir
STR_LAI_RAIL_DESCRIPTION_TRACK :Landasan keretapi
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Keretapi landasan dengan isyarat sekatan
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Keretapi landasan dengan pra-isyarat
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Landasan kereta api dengan isyarat sekatan
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Landasan kereta api dengan pra-isyarat
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Landasan keretapi dengan isyarat keluar
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Landasan keretapi dengan isyarat kombo
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Keretapi landasan dengan isyarat laluan
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Landasan kereta api dengan isyarat laluan
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Landasan keretapi dengan isyarat satu hala
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Keretapi landasan dengan isyarat sekatan dan pra-isyarat
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Landasan kereta api dengan isyarat sekatan dan pra-isyarat
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Landasan keretapi dengan isyarat sekatan dan keluar
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Landasan keretapi dengan isyarat sekatan dan kombo
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Keretapi landasan dengan isyarat sekatan dan laluan
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Landasan kereta api dengan isyarat sekatan dan laluan
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Landasan keretapi dengan isyarat sekatan dan satu hala
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Keretapi landasan dengan isyarat pra- dan keluar
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Keretapi landasan dengan isyarat pra- dan kombo
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Keretapi landasan dengan isyarat pra- dan laluan
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Keretapi landasan dengan isyarat pra- dan satu hala
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Landasan kereta api dengan pra-isyarat dan isyarat keluar
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Landasan kereta api dengan pra-isyarat dan isyarat kombo
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Landasan kereta api dengan pra-isyarat dan isyarat laluan
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Landasan kereta api dengan pra-isyarat dan isyarat laluan satu hala
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Landasan keretapi dengan isyarat keluar dan kombo.
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Landasan keretapi dengan isyarat keluar dan laluan
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Landasan keretapi dengan isyarat keluar dan satu hala
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Landasan keretapi dengan isyarat kombo dan signal laluan
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Landasan keretapi dengan isyarat kombo dan satu hala
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Keretapi landasan dengan isyarat laluan dan satu hala
-STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Keretapi depoh keretapi
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Landasan kereta api dengan isyarat laluan dan isyarat laluan satu hala
+STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Depoh penyelenggaraan kereta api
STR_LAI_ROAD_DESCRIPTION_ROAD :Jalanraya
STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Jalan raya berlampu
@@ -2403,6 +2428,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Hakcipta
STR_ABOUT_VERSION :{BLACK}OpenTTD versi {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 The OpenTTD team
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Simpankan Permainan
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Buka Permainan
@@ -2550,6 +2582,7 @@ STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}Tidak sera
# NewGRF save preset window
STR_SAVE_PRESET_CAPTION :{WHITE}Simpan pratetapan
STR_SAVE_PRESET_TITLE :{BLACK}Masukkan nama untuk pratetapan
+STR_SAVE_PRESET_CANCEL :{BLACK}Batal
STR_SAVE_PRESET_SAVE :{BLACK}Simpan
# NewGRF parameters window
@@ -2581,7 +2614,7 @@ STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Pergi ke
STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Peperi sebelumnya
STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Teruskan ke peperi dahulu yang biasa, melangkau sebarang peperi pseudo/warna kembali/fon dan memusing balik semula
STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Perwakilan peperi yang terpilih. Penjajaran tidak diendahkan apabila sedang melukiskan peperi.
-STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Alih peperi, mengubahkan ofset X dan Y
+STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Alihkan "sprite" ke lokasi lain lantas mengubah ofset X dan Y. "Ctrl+Click" untuk ubah lokasi "sprite" lapan unit pada satu-satu masa
STR_SPRITE_ALIGNER_PICKER_BUTTON :{BLACK}Pilih peperi
STR_SPRITE_ALIGNER_PICKER_TOOLTIP :{BLACK}Pilih peperi di mana-mana sahaja dari skrin
@@ -2775,6 +2808,7 @@ STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klik di
# Story book window
STR_STORY_BOOK_TITLE :{YELLOW}{STRING}
+STR_STORY_BOOK_NEXT_PAGE :{BLACK}Seterusnya
# Station list window
STR_STATION_LIST_TOOLTIP :{BLACK}Nama stesen - klik pada nama untuk memusatkan pemandangan ke stesen. Ctrl+Klik membuka tetingkap pemandangan di lokasi stesen
@@ -2801,6 +2835,10 @@ STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Penarafa
STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Tunjukkan penarafan stesen
STR_STATION_VIEW_SUPPLY_RATINGS_TITLE :{BLACK}Bekalan bulanan dan penarafan tempatan:
+STR_STATION_VIEW_PLANNED_AMOUNT :Jumlah: Telah dirancang
+STR_STATION_VIEW_VIA :{YELLOW}{CARGO_SHORT} melalui {STATION}
+STR_STATION_VIEW_TO :{YELLOW}{CARGO_SHORT} ke {STATION}
+STR_STATION_VIEW_VIA_HERE :{GREEN}{CARGO_SHORT} sedang berhenti di stesen ini
############ range for rating starts
@@ -2818,12 +2856,13 @@ STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Pusatkan
STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Tukarkan nama stesen
STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Tunjukkan semua keretapi yang mengandungi stesen ini dalam jadual mereka
-STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Tunjukkan semua kenderaan jalanraya yang mengandungi stesen ini dalam jadual mereka
+STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Tunjukkan semua kenderaan darat yang mempunyai stesen ini di dalam jadual mereka
STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Tunjukkan semua pesawat yang mengandungi lapangan terbang ini dalam jadual mereka
STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Tunjukkan semua kapal yang mengandungi stesen ini dalam jadual mereka
STR_STATION_VIEW_RENAME_STATION_CAPTION :Namakan semula stesen/ruang punggahan
+STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Halang pesawat daripada mendarat di lapangan terbang ini
# Waypoint/buoy view window
STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT}
@@ -3005,11 +3044,11 @@ STR_GROUP_DEFAULT_ROAD_VEHICLES :Kenderaan jalan
STR_GROUP_DEFAULT_SHIPS :Kapal yang belum berkumpulan
STR_GROUP_DEFAULT_AIRCRAFTS :Pesawat yang belum berkumpulan
-STR_GROUPS_CLICK_ON_GROUP_FOR_TOOLTIP :{BLACK}Kumpulan - klik sebuah kumpulan untuk menaraikan semua kenderaan di dalam kumpulan
+STR_GROUPS_CLICK_ON_GROUP_FOR_TOOLTIP :{BLACK}Kumpulan - klik sebuah kumpulan untuk menyenaraikan semua kenderaan di dalam kumpulan tersebut. Tarik dan lepaskan kumpulan untuk menyusun kumpulan mengikut heirarki
STR_GROUP_CREATE_TOOLTIP :{BLACK}Klik untuk mewujudkan kumpulan
STR_GROUP_DELETE_TOOLTIP :{BLACK}Padamkan kumpulan yang telah dipilih
STR_GROUP_RENAME_TOOLTIP :{BLACK}Tukar nama kumpulan yang terpilih
-STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Klik untuk menghalang daripada kumpulan ini digantikan secara automatik
+STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Klik untuk menghalang kumpulan ini daripada digantikan secara automatik
STR_GROUP_ADD_SHARED_VEHICLE :Tambah kenderaan berkongsi
@@ -3297,6 +3336,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} tahun (
STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} tahun ({COMMA})
STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Kelajuan Maks.: {LTBLUE}{VELOCITY}
+STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Kelajuan maksima: {LTBLUE}{VELOCITY} {BLACK}Jenis pesawat: {LTBLUE}{STRING}
+STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Kelajuan maksima: {LTBLUE}{VELOCITY} {BLACK}Jenis pesawat: {LTBLUE}{STRING} {BLACK}Lingkungan: {LTBLUE}{COMMA} petak
STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Berat: {LTBLUE}{WEIGHT_SHORT} {BLACK}Kuasa: {LTBLUE}{POWER}{BLACK} Kelajuan Maks.: {LTBLUE}{VELOCITY}
STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Berat: {LTBLUE}{WEIGHT_SHORT} {BLACK}Kuasa: {LTBLUE}{POWER}{BLACK} Max. speed: {LTBLUE}{VELOCITY} {BLACK}T.E. Maks.: {LTBLUE}{FORCE}
@@ -3316,6 +3357,7 @@ STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Tempoh P
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}Tambah 10 tempoh penyenggelaraan. Ctrl+Klik untuk tambah 5 tempoh penyenggelaraan
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}Kurangkan 10 tempoh penyenggelaraan. Ctrl+Klik untuk kurangkan 5 tempoh penyenggelaraan
+STR_VEHICLE_DETAILS_DAYS :Hari
STR_VEHICLE_DETAILS_PERCENT :Peratusan
STR_QUERY_RENAME_TRAIN_CAPTION :{WHITE}Nama keretapi
@@ -3455,7 +3497,7 @@ STR_ORDER_GO_TO_NEAREST_DEPOT :Pergi ke depoh
STR_ORDER_GO_TO_NEAREST_HANGAR :Pergi ke hangar paling hampir
STR_ORDER_CONDITIONAL :Lompatan arahan bersyarat
STR_ORDER_SHARE :Kongsi arahan
-STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Masukkan arahan baru ke atas arahan yang terpilih. Ctrl membuatkan arahan stesen 'muatan penuh sebarang kargo', arahan halutuju 'tanpa henti', dan arahn depoh 'penyenggelaraan'. 'Arahan berkongsi' atau Ctrl membenarkan kenderaan ini berkongsi arahan dengan kenderaan terpilih
+STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Masukkan arahan baru ke dalam susunan senarai yang terpilih, atau tambah pada penghujung senarai. "Ctrl" mengubah arahan stesen kepada 'muatan penuh untuk apa-apa kargo', arahan halutuju 'tanpa henti', dan arahan depoh 'penyenggelaraan'. 'Arahan berkongsi' atau "Ctrl" membenarkan kenderaan ini berkongsi arahan dengan kenderaan terpilih
STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Tunjukkan semua kenderaan yang berkongsi jadual yang sama
@@ -3836,7 +3878,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Terlampa
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Terlampau banyak bahagian-bahagian stesen keretapi
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Terlampau banyak stesen bas
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Terlampau banyak ruang punggah lori
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Terlalu hampir dengan stesen/kawasan muatan lain
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Terlalu hampir dengan pelabuhan lain
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Terlalu hampir dengan lapangan terbang lain
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Nama stesen tidak dapat ditukar...
@@ -4072,7 +4113,7 @@ STR_ERROR_AIRCRAFT_NOT_ENOUGH_RANGE :{WHITE}... pesa
# Timetable related errors
STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Kenderaan tidak boleh dijadualkan...
STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Kenderaan hanya boleh menunggu di stesen
-STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Kenderaan ini tidak akan berhenti di stesen ini
+STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Kenderaan ini tidak akan berhenti di stesen berikut
# Sign related errors
STR_ERROR_TOO_MANY_SIGNS :{WHITE}... papan tanda terlalu banyak
@@ -4085,8 +4126,12 @@ STR_DESKTOP_SHORTCUT_COMMENT :Sebuah permaina
# Translatable descriptions in media/baseset/*.ob* files
STR_BASEGRAPHICS_DOS_DESCRIPTION :Grafik asal Transport Tycoon Deluxe DOS edition.
+STR_BASEGRAPHICS_DOS_DE_DESCRIPTION :Grafik asal Transport Tycoon DOS (German) edition
STR_BASEGRAPHICS_WIN_DESCRIPTION :Grafik asal Transport Tycoon Deluxe edisi Windows.
+STR_BASESOUNDS_WIN_DESCRIPTION :Bunyi asal Transport Tycoon Deluxe edisi Windows
+STR_BASESOUNDS_NONE_DESCRIPTION :Sebuah pek suara tanpa apa-apa suara
STR_BASEMUSIC_WIN_DESCRIPTION :Muzik asal Transport Tycoon Deluxe edisi Windows.
+STR_BASEMUSIC_DOS_DESCRIPTION :Muzik asal Transport Tycoon Deluxe edisi DOS
STR_BASEMUSIC_NONE_DESCRIPTION :Pek muzik tanpa muzik sebenar.
##id 0x2000
diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt
index 052fb8bf22..65c4e10c7f 100644
--- a/src/lang/norwegian_bokmal.txt
+++ b/src/lang/norwegian_bokmal.txt
@@ -2690,6 +2690,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Opprinne
STR_ABOUT_VERSION :{BLACK}OpenTTD versjon {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD-teamet
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Lagre spill
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Last inn spill
@@ -4220,7 +4227,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}For mang
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}For mange enkeltdeler på jernbanestasjonen
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}For mange bussholdeplasser
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}For mange lasteterminaler
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}For nærme en annen stasjon/lasteterminal
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}For nærme enn annen havn
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}For nærme en annen flyplass
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Kan ikke endre stasjonens navn...
diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt
index 4495271900..93db95f84b 100644
--- a/src/lang/norwegian_nynorsk.txt
+++ b/src/lang/norwegian_nynorsk.txt
@@ -2605,6 +2605,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Opphavel
STR_ABOUT_VERSION :{BLACK}OpenTTD versjon {REV}. Oversett til nynorsk av Thor Morten Skogrand med fleire.
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD-teamet
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Lagre spel
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Last inn spel
@@ -4112,7 +4119,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}For mang
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}For mange togstasjon-delar
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}For mange busshaldeplassar
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}For mange lasteterminalar
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}For nær ein annan jernbanestasjon/lasteterminal
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}For nær ei anna hamn
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}For nær ein annan flyplass
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Kan ikkje endre namnet på stasjonen...
diff --git a/src/lang/polish.txt b/src/lang/polish.txt
index 36ad07d926..965c08cb42 100644
--- a/src/lang/polish.txt
+++ b/src/lang/polish.txt
@@ -3071,6 +3071,20 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Prawa Au
STR_ABOUT_VERSION :{BLACK}OpenTTD wersja {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 Zespół OpenTTD
+# Framerate display window
+STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}Liczba renderowanych klatek wideo na sekundę.
+STR_FRAMERATE_CURRENT :{WHITE}Obecny
+############ Leave those lines in this order!!
+STR_FRAMERATE_GL_LINKGRAPH :{WHITE} Opóźnienie wykresu połączeń:
+STR_FRAMERATE_VIDEO :{WHITE}Wyjście video:
+STR_FRAMERATE_SOUND :{WHITE}Miksowanie dźwięku:
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+STR_FRAMETIME_CAPTION_VIDEO :Wyjście wideo
+STR_FRAMETIME_CAPTION_SOUND :Miksowanie dźwięku
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Zapisz grę
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Wczytaj grę
@@ -4607,7 +4621,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Za duzo
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Za dużo części stacji kolejowej
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Zbyt wiele przystanków autobusowych
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Zbyt wiele stacji załadunku ciężarówek
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Zbyt blisko innej stacji/strefy załadunku
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Zbyt blisko innego portu
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Zbyt blisko innego lotniska
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Nie można zmienić nazwy stacji...
@@ -4867,6 +4880,8 @@ STR_BASESOUNDS_DOS_DESCRIPTION :Oryginalna edyc
STR_BASESOUNDS_WIN_DESCRIPTION :Oryginalna edycja dźwięków dla Transport Tycoon Deluxe Windows.
STR_BASESOUNDS_NONE_DESCRIPTION :Zestaw dźwięków nie zawierający żadnych dźwięków.
STR_BASEMUSIC_WIN_DESCRIPTION :Oryginalna edycja utworów muzycznych w Transport Tycoon Deluxe Windows.
+STR_BASEMUSIC_DOS_DESCRIPTION :Oryginalna edycja utworów muzycznych dla Transport Tycoon Deluxe DOS.
+STR_BASEMUSIC_TTO_DESCRIPTION :Oryginalna edycja utworów muzycznych dla Transport Tycoon DOS.
STR_BASEMUSIC_NONE_DESCRIPTION :Zestaw utworów muzycznych nie zawierający żadnej muzyki.
##id 0x2000
diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt
index 82662903f8..d9c00b1101 100644
--- a/src/lang/portuguese.txt
+++ b/src/lang/portuguese.txt
@@ -1833,8 +1833,8 @@ STR_LIVERY_TRUCK :Veículo de Mer
STR_LIVERY_PASSENGER_SHIP :Barco de Passageiros
STR_LIVERY_FREIGHT_SHIP :Barco Cargueiro
STR_LIVERY_HELICOPTER :Helicóptero
-STR_LIVERY_SMALL_PLANE :Aeronave de Pequenas Dimensões
-STR_LIVERY_LARGE_PLANE :Aeronave de Grandes Dimensões
+STR_LIVERY_SMALL_PLANE :Avião de Pequenas Dimensões
+STR_LIVERY_LARGE_PLANE :Avião de Grandes Dimensões
STR_LIVERY_PASSENGER_TRAM :Eléctrico de Passageiros
STR_LIVERY_FREIGHT_TRAM :Eléctrico de Mercadorias
@@ -2687,6 +2687,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Direitos
STR_ABOUT_VERSION :{BLACK}OpenTTD versão {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 A equipa do OpenTTD
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Guardar Jogo
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Abrir Jogo
@@ -4216,7 +4223,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Demasiad
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Demasiadas partes na estação ferroviária
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Demasiadas paragens de autocarro
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Demasiadas estações de carga
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Muito junto de uma estação/local de carga
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Muito perto de outra doca
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Demasiado perto de outro aeroporto
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Não pode alterar o nome da estação...
diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt
index 0871b75ae4..6b891bb7e8 100644
--- a/src/lang/romanian.txt
+++ b/src/lang/romanian.txt
@@ -2647,6 +2647,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyrigh
STR_ABOUT_VERSION :{BLACK}OpenTTD versiunea {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 Echipa OpenTTD
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Salvează joc
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Încarcă joc
@@ -4150,7 +4157,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Prea mul
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Staţia are prea multe componente
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Prea multe staţii de autobuz
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Prea multe staţii de camion
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Prea aproape de altă staţie
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Prea aproape de alt port
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Prea aproape de un alt aeroport
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Nu se poate redenumi staţia...
diff --git a/src/lang/russian.txt b/src/lang/russian.txt
index b8c8037e64..22eaeb0782 100644
--- a/src/lang/russian.txt
+++ b/src/lang/russian.txt
@@ -601,6 +601,7 @@ STR_ABOUT_MENU_SCREENSHOT :Снимок э
STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Снимок экрана в макс. приближении
STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Снимок экрана в обычном масштабе
STR_ABOUT_MENU_GIANT_SCREENSHOT :Снимок всей карты
+STR_ABOUT_MENU_SHOW_FRAMERATE :Показать кол-во кадров/с
STR_ABOUT_MENU_ABOUT_OPENTTD :Об игре
STR_ABOUT_MENU_SPRITE_ALIGNER :Выравнивание спрайтов
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Переключить ограничивающие рамки
@@ -959,6 +960,7 @@ STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLAC
STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDENT_NAME}{}(Директор)
STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}Компания «{STRING}» профинансировала основание города {TOWN}!
+STR_NEWS_NEW_TOWN_UNSPONSORED :{BLACK}{BIG_FONT}Основан новый город - {TOWN}!
STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLACK}Новое предприятие! {STRING} стро{G 0 и и и я}тся возле г.{NBSP}{TOWN}!
STR_NEWS_INDUSTRY_PLANTED :{BIG_FONT}{BLACK}Новое предприятие! {STRING} заложен{G 0 "" а о ы} возле г.{NBSP}{TOWN}!
@@ -1026,9 +1028,9 @@ STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLAC
# Extra view window
STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Окно просмотра {COMMA}
-STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Скопировать в окно
-STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Скопировать текущую позицию в окно просмотра
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Вставить из окна
+STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Из основного окна
+STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Показать то, что отображается в основном окне
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}В основное окно
STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Показать в основном окне
# Game options window
@@ -1071,15 +1073,16 @@ STR_GAME_OPTIONS_CURRENCY_ZAR :Южноафр
STR_GAME_OPTIONS_CURRENCY_CUSTOM :Своя...
STR_GAME_OPTIONS_CURRENCY_GEL :Грузинский лари (GEL)
STR_GAME_OPTIONS_CURRENCY_IRR :Иранский риал (IRR)
+STR_GAME_OPTIONS_CURRENCY_RUB :Российский новый рубль (RUR)
############ end of currency region
-STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Направление движения
-STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}По какой стороне дороги ездит автотранспорт
-STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :левостороннее
-STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :правостороннее
+STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Движение автомобилей
+STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Сторона дороги, по которой ездит автотранспорт
+STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Левостороннее
+STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Правостороннее
STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Названия городов
-STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}На каком языке будут названы населённые пункты
+STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Язык, который будет использоваться для выбора названий населённых пунктов
############ start of townname region
STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Английские
@@ -1174,7 +1177,7 @@ STR_CURRENCY_DECREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Пере
STR_CURRENCY_INCREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Перейти на евро позже
STR_CURRENCY_PREVIEW :{LTBLUE}Образец: {ORANGE}{CURRENCY_LONG}
-STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 англ. фунтов (£) в вашей валюте
+STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10{NBSP}000 фунтов стерлингов (£) в вашей валюте
STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Изменить параметр валюты
STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Максимальное количество конкурентов: {ORANGE}{COMMA}
@@ -1258,7 +1261,7 @@ STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}Тип:
STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}Отображать в списке только настройки, соответствующие выбранной категории
STR_CONFIG_SETTING_RESTRICT_BASIC :Основные настройки (только самые важные)
STR_CONFIG_SETTING_RESTRICT_ADVANCED :Расширенные настройки (практически все)
-STR_CONFIG_SETTING_RESTRICT_ALL :Специальные настройки (все, включая самые непонятные)
+STR_CONFIG_SETTING_RESTRICT_ALL :Все настройки (включая самые непонятные)
STR_CONFIG_SETTING_RESTRICT_CHANGED_AGAINST_DEFAULT :Настройки со значениями, отличающимися от значений по умолчанию
STR_CONFIG_SETTING_RESTRICT_CHANGED_AGAINST_NEW :Настройки со значениями, отличающимися от настроек новой игры
@@ -1781,7 +1784,7 @@ STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Чем выше
STR_CONFIG_SETTING_DEMAND_DISTANCE :Зависимость спроса от расстояния: {STRING}
STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Если это значение больше 0, то количество груза, отправляемого с одной станции на другую, будет зависеть от расстояния между станциями. Чем выше это значение, тем больше груза будет отправляться к ближним станциям и меньше{NBSP}- к дальним.
STR_CONFIG_SETTING_DEMAND_SIZE :Количество возвращаемого груза при симметричном распределении: {STRING}
-STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Установка этого значения ниже 100% заставит распределение быть менее «симметричным»: количество возвращаемого груза сможет быть меньше, чем количество отправленного. Установка в 0% сделает распределение полностью несимметричным.
+STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Установка этого значения ниже 100% заставит распределение быть менее «симметричным»: количество возвращаемого груза сможет быть меньше, чем количество отправленного. Установка в 0% сделает распределение полностью асимметричным.
STR_CONFIG_SETTING_SHORT_PATH_SATURATION :Предел загрузки коротких маршрутов перед использованием вместительных: {STRING}
STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :При наличии нескольких маршрутов между станциями алгоритм распределения грузов будет использовать кратчайший маршрут до его загрузки, потом следующий по длине и т.{NBSP}д. При избытке груза маршруты будут перегружаться начиная с самых производительных. Загрузка рассчитывается исходя из оценки пропускной способности (которая может быть неточной) и интенсивности использования. Эта настройка определяет, насколько загружать маршрут перед тем, как начать использовать следующий. Установите значение ниже 100% для того, чтобы избежать задержки груза, если пропускная способность маршрута будет переоценена алгоритмом.
@@ -2456,6 +2459,7 @@ STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Схем
STR_LINKGRAPH_LEGEND_ALL :{BLACK}Все
STR_LINKGRAPH_LEGEND_NONE :{BLACK}Нет
STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Выберите компании для отображения
+STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY}
# Linkgraph legend window and linkgraph legend in smallmap
STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}неиспольз.
@@ -2876,6 +2880,28 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Ориг
STR_ABOUT_VERSION :{BLACK}OpenTTD версия {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 Команда разработчиков OpenTTD
+# Framerate display window
+STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} ({DECIMAL}x)
+STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP :{BLACK}Кол-во игровых циклов, рассчитываемых в секунду.
+STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}Кол-во отображаемых кадров в секунду.
+STR_FRAMERATE_DATA_POINTS :{BLACK}Данные по {COMMA} измерени{P ю ям ям}
+STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL} мс
+STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL} мс
+STR_FRAMERATE_MS_BAD :{RED}{DECIMAL} мс
+STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL} кадр{P "" а ов}/с
+STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL} кадр{P "" а ов}/с
+STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL} кадр{P "" а ов}/с
+STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA} мс
+STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} с
+############ Leave those lines in this order!!
+STR_FRAMERATE_GL_LINKGRAPH :{BLACK} Задержка графа распределения:
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+STR_FRAMETIME_CAPTION_GL_LINKGRAPH :Задержка графа распределения
+STR_FRAMETIME_CAPTION_DRAWING :Отрисовка графики
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Сохранить игру
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Загрузить игру
@@ -3160,7 +3186,8 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Введ
STR_TOWN_DIRECTORY_CAPTION :{WHITE}Города
STR_TOWN_DIRECTORY_NONE :{ORANGE}- Нет -
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA})
-STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Список городов - щелчок по названию показывает город в основном окне. Ctrl+щелчок показывает в дополнительном окне.
+STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Мегаполис){BLACK} ({COMMA})
+STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Список городов. Щелчок по названию показывает город в основном окне. Ctrl+щелчок показывает в дополнительном окне.
STR_TOWN_POPULATION :{BLACK}Население: {COMMA}
# Town view window
@@ -4416,7 +4443,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Слиш
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Слишком большая ж/д станция
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Слишком много автобусных остановок
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Слишком много грузовых терминалов
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Слишком близко к другой станции
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Слишком близко к другой пристани
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Слишком близко к другому аэропорту
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Невозможно переименовать станцию...
diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt
index 19973dbb98..d253ac97ed 100644
--- a/src/lang/serbian.txt
+++ b/src/lang/serbian.txt
@@ -838,6 +838,7 @@ STR_MUSIC_RULER_MARKER :{TINY_FONT}{BLA
STR_MUSIC_TRACK_NONE :{TINY_FONT}{DKGREEN}--
STR_MUSIC_TRACK_DIGIT :{TINY_FONT}{DKGREEN}{ZEROFILL_NUM}
STR_MUSIC_TITLE_NONE :{TINY_FONT}{DKGREEN}------
+STR_MUSIC_TITLE_NOMUSIC :{TINY_FONT} {DKGREEN} Nije dostupna muzika
STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}"
STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Numera
STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Naziv
@@ -858,11 +859,14 @@ STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Uključi
STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Prikaži prozor za izbor muzičkih numera
# Playlist window
+STR_PLAYLIST_MUSIC_SELECTION_SETNAME :{WHITE} Muzički program - '{STRING}'
STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}"
STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Indeks numera
STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Program - '{STRING}'
STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Obriši
+STR_PLAYLIST_CHANGE_SET :{BLACK}Promeni set
STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Obriši tekući program (samo korisnički-definisani programi)
+STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Promenite izbor muzike na drugi instalirani skup
STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klik na numeru je dodaje u tekući program (samo za korisnički-definisane programe)
STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Pritisnite na muzičku numeru kako biste je uklonili sa trenutnog rasporeda (samo za Custom1 ili Custom2)
@@ -1072,10 +1076,10 @@ STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLAC
# Extra view window
STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Pogled{COMMA}
-STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Premesti u pogled
+STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK} Kopiraj u prozor za pogled
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Premešta pogled na trenutnu poziciju glavnog pogleda
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Prebaci se
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Premešta glavni pogled na lokaciju na kojoj je ovaj pogled
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Promenite glavni prikaz
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Kopirajte lokaciju prozora za prikaz u glavnom prikazu
# Game options window
STR_GAME_OPTIONS_CAPTION :{WHITE}Opcije
@@ -1529,6 +1533,12 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Boja terena na
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Zelena
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Tamno zelena
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Ljubičasta
+STR_CONFIG_SETTING_SCROLLMODE :Ponašanje listanja pogleda: {STRING}
+STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Ponašanje prilikom skrolovanje mape
+STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Pomerite pogled sa desnim tasterom miša, položaj miša zaključan
+STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Pomerite mapu sa desnim tasterom miša, zaključajte položaj miša
+STR_CONFIG_SETTING_SCROLLMODE_RMB :Pomerite mapu pomoću desne tipke miša
+STR_CONFIG_SETTING_SCROLLMODE_LMB :Pomerite mapu pomoću levog miša
STR_CONFIG_SETTING_SMOOTH_SCROLLING :Ravnomeran prelaz prozora: {STRING}
STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Odredi kako se glavni prikaz pomiče na određeno mesto kada se klikne na malu kartu ili kada se daje naredba za pomicanje na određeni objekat na karti. Ako je omogućeno, prikaz se pomiče glatko, ako je onemogućeno, prikaz izravno skače na ciljano mesto
STR_CONFIG_SETTING_MEASURE_TOOLTIP :Prikazivati mere dok se koriste alati za gradnju: {STRING}
@@ -1560,6 +1570,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+Klik
STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Klik
STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Nikakvo
+STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Zatvori prozor pomoću desnog klika: {STRING}
+STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Zatvara prozor tako što klikne desnim klikom unutar nje. Onemogućava dodir sa desnim tasterom miša!
STR_CONFIG_SETTING_AUTOSAVE :Autočuvanje: {STRING}
STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Izbor vremenskog intervala između dve automatski sačuvane pozicije
@@ -2470,6 +2482,7 @@ STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Legenda
STR_LINKGRAPH_LEGEND_ALL :{BLACK}Sve
STR_LINKGRAPH_LEGEND_NONE :{BLACK}Nema
STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Odaberite preduzeća koja želite da se prikažu
+STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY}
# Linkgraph legend window and linkgraph legend in smallmap
STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}neiskorišćen
@@ -2777,6 +2790,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Naziv de
STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Tovar prihvaćen: {LTBLUE}
STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING})
+STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Tip šine: {LTBLUE}{STRING}
STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Najveća brzina na pruzi: {LTBLUE}{VELOCITY}
STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Ograničenje brzine: {LTBLUE}{VELOCITY}
@@ -2789,29 +2803,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Polja
STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Snegom prekrivena zemlja
STR_LAI_CLEAR_DESCRIPTION_DESERT :Pustinja
-STR_LAI_RAIL_DESCRIPTION_TRACK :Železnica kolosek
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Železnica kolosek sa blok signalizacijom
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Železnica kolosek sa predsignalizacijom
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Železnica kolosek sa izlaznom signalizacijom
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Železnica kolosek sa kombinovanom signalizacijom
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Železnica kolosek sa putnom signalizacijom
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Železnica kolosek sa jednosmernom putnom signalizacijom
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Železnica kolosek sa blok i predsignalizacijom
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Železnica kolosek sa blok i izlaznom signalizacijom
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Železnica kolosek sa blok i kombinovanom signalizacijom
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Železnica kolosek sa blok i putnom signalizacijom
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Železnica kolosek sa blok i jednosmernom putnom signalizacijom
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Železnica kolosek sa pred i izlaznom signalizacijom
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Železnica kolosek sa pred i kombinovanom signalizacijom
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Železnica kolosek sa pred i putnom signalizacijom
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Železnica kolosek sa pred i jednosmernom putnom signalizacijom
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Železnica kolosek sa izlaznom i kombinovanom signalizacijom
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Železnica kolosek sa izlaznom i putnom signalizacijom
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Železnica kolosek sa izlaznom i jednosmernom putnom signalizacijom
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Železnica kolosek sa kombinovanom i putnom signalizacijom
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Železnica kolosek sa kombinovanom i jednosmernom putnom signalizacijom
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Železnica kolosek sa putnom i jednosmernom putnom signalizacijom
-STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Železnica železnički depo
+STR_LAI_RAIL_DESCRIPTION_TRACK :Željeznički put
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Željeznički put sa blok signalima
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Željeznički put sa pred-signalima
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Železnički put sa izlaznom signalizacijom
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Željeznički put sa kombinovanim signalima
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Železnički put sa putnom signalizacijom
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Železnički put sa jednosmernim signalima
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Železnički put sa blokom i pred-signalima
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Željeznički put sa blokovnim i izlaznim signalima
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Željeznički put sa blokovnim i kombinovanim signalima
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Železnički put sa signalizacijom izlaza i puta
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Železnički put sa blokom i pred-signalima
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Željeznički put sa pred-i izlaznim signalima
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Željeznički put sa pred- i kombo-signalima
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Željeznički put sa pre- i putnom signalizacijom
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Željeznički put sa signalima pre i jednosmernog puta
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Železnički put sa izlaznim i kombo-signalima
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Železnički put sa signalizacijom izlaza i puta
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Železnički put sa izlaznim i jednosmernim signalima
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Željeznički put sa kombinovanim i putnim signalima
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Željeznički put sa kombinovanim i jednosmernim signalima
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Železnički put sa putnim i jednosmernim signalima
+STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Vozni park željeznice
STR_LAI_ROAD_DESCRIPTION_ROAD :Put
STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Kolovoz sa uličnom rasvetom
@@ -2877,6 +2891,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original
STR_ABOUT_VERSION :{BLACK}OpenTTD verzija {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD tim
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Sačuvaj poziciju
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Učitavanje Partije
@@ -3161,6 +3182,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Unos naz
STR_TOWN_DIRECTORY_CAPTION :{WHITE}Naselja
STR_TOWN_DIRECTORY_NONE :{ORANGE}- Prazno -
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA})
+STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (City){BLACK} ({COMMA})
STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Imena naselja - klikom na ime se centrira glavni pogled na to naselje. Ctrl+Klik otvara novi pogled na lokaciju naselja
STR_TOWN_POPULATION :{BLACK}Svetska populacija: {COMMA}
@@ -3168,6 +3190,7 @@ STR_TOWN_POPULATION :{BLACK}Svetska
STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN}
STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Grad)
STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Populacija: {ORANGE}{COMMA}{BLACK} Zgrada: {ORANGE}{COMMA}
+STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} u poslednjem mesecu: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA}
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Tovar potreban za razvoj naselja:
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} potrebno
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} potrebno zimi
@@ -3478,6 +3501,9 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Potražu
STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Potražuje: {YELLOW}{STRING.aku}{STRING}, {STRING.aku}{STRING}, {STRING.aku}{STRING}
############ range for requires ends
+STR_INDUSTRY_VIEW_REQUIRES :{BLACK} Zahteva:
+STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING}
+STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} čekaje {STRING}
############ range for produces starts
STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Proizvodi: {YELLOW}{STRING}{STRING}
@@ -3546,6 +3572,10 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Ukloni sva vozi
STR_GROUP_RENAME_CAPTION :{BLACK}Preimenuj grupu
+STR_GROUP_PROFIT_THIS_YEAR :Dobit ove godine:
+STR_GROUP_PROFIT_LAST_YEAR :Dobit prošle godine:
+STR_GROUP_OCCUPANCY :Trenutna upotreba:
+STR_GROUP_OCCUPANCY_VALUE :{NUM}%
# Build vehicle window
STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nova Železnička Vozila
@@ -3578,6 +3608,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Sve vrste teret
STR_PURCHASE_INFO_ALL_BUT :Sve sem {CARGO_LIST}
STR_PURCHASE_INFO_MAX_TE :{BLACK}Najveća vučna snaga: {GOLD}{FORCE}
STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Domet: {GOLD}{COMMA} pločica
+STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK} Tip aviona: {GOLD} {STRING}
STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Spisak probranih šinskih vozila - kliknite na vozilo za više podataka
STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Spisak probranih drumskih vozila - kliknite na vozilo za više podataka
@@ -3718,6 +3749,10 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE.aku :magnetnog žel.
STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Cena: {CURRENCY_LONG} Težina: {WEIGHT_SHORT}{}Brzina: {VELOCITY} Snaga: {POWER}{}Cena Održavanja: {CURRENCY_LONG}/god.{}Nosivost: {CARGO_LONG}
STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cena: {CURRENCY_LONG} Težina: {WEIGHT_SHORT}{}Brzina: {VELOCITY} Snaga: {POWER} Najveća vučna snaga: {6:FORCE}{}Cena Održavanja: {4:CURRENCY_LONG}/god{}Nosivost: {5:CARGO_LONG}
STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Najveća Brzina: {VELOCITY}{}Nosivost: {CARGO_LONG}{}Cena Održavanja: {CURRENCY_LONG}/god.
+STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :BLACK} Cena: {CURRENCY_LONG} Maks. Brzina: {VELOCITY}{} Tip aviona: {STRING}{} Kapacitet: {CARGO_LONG}, {CARGO_LONG}{}Pokretna cena: {CURRENCY_LONG}/godine.
+STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK} Cena: {CURRENCY_LONG} Maks. Brzina: {VELOCITY}{}Tip aviona: {STRING}{}Kapacitet: {CARGO_LONG}{}Pokretna cena: {CURRENCY_LONG}/god.
+STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK} Cena: {CURRENCY_LONG} Maks. Brzina: {VELOCITY}{} Tip aviona: {STRING} Domet: {COMMA} pločice{}Kapacitet: {CARGO_LONG}, {CARGO_LONG}{} Pokretni trošak: {CURRENCY_LONG} /god.
+STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :BLACK}Cena: {CURRENCY_LONG} Maks. Brzina: {VELOCITY}{}Tip aviona: {STRING} Opseg: {COMMA} pločice{}Kapacitet: {CARGO_LONG}{}Pokretni trošak: {CURRENCY_LONG}/god.
# Autoreplace window
STR_REPLACE_VEHICLES_WHITE :{WHITE}Zameni {STRING} - {STRING}
@@ -3757,6 +3792,7 @@ STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Pritisni
STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Prebacuje između prikaza zamene lokomotiva i zamene vagona
STR_REPLACE_ENGINES :Lokomotive
STR_REPLACE_WAGONS :Vagoni
+STR_REPLACE_ALL_RAILTYPE :Sve šinskih vozila
STR_REPLACE_HELP_RAILTYPE :{BLACK}Izaberite vrstu pruge za koju želite zamenu kompozicije
STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Prikazuje koja lokomotiva će se zameniti označenom sa leve strane, ako ih ima
@@ -3849,6 +3885,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} godin{P
STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} godin{P a e a} ({COMMA})
STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Najveća brzina: {LTBLUE}{VELOCITY}
+STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Maks. brzina: {LTBLUE}{VELOCITY} {BLACK}Tip aviona: {LTBLUE}{STRING}
+STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :BLACK} Maks. brzina: {LTBLUE} {VELOCITY} {BLACK} Tip aviona: {LTBLUE} {STRING} {BLACK} Opseg: {LTBLUE} {COMMA} pločice
STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Težina: {LTBLUE}{WEIGHT_SHORT} {BLACK}Snaga: {LTBLUE}{POWER}{BLACK} Najveća brzina: {LTBLUE}{VELOCITY}
STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Težina: {LTBLUE}{WEIGHT_SHORT} {BLACK}Snaga: {LTBLUE}{POWER}{BLACK} Najveća brzina: {LTBLUE}{VELOCITY} {BLACK} Najveća vučna snaga: {LTBLUE}{FORCE}
@@ -4407,7 +4445,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Previše
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Previše delova železničke stanice
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Previše autobuskih stanica
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Previše tovarnih stanica
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Previše je blizu druge stanice
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Previše je blizu drugog pristaništa
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Previše je blizu drugog aerodroma
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Ova stanica ne može biti preimenovana...
@@ -4415,6 +4452,7 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... ova
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... ulica je okrenuta u drugom pravcu
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... stajalište ne može biti na krivini
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... stajalište ne može biti na raskrsnici
+STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... put je jednosmeran ili blokiran.
# Station destruction related errors
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Deo stanice se ne može ukloniti...
@@ -4666,6 +4704,8 @@ STR_BASESOUNDS_DOS_DESCRIPTION :Originalni skup
STR_BASESOUNDS_WIN_DESCRIPTION :Originalni skup zvukova Transport Tycoon Deluxe Windows izdanja.
STR_BASESOUNDS_NONE_DESCRIPTION :Prazan skup zvukova.
STR_BASEMUSIC_WIN_DESCRIPTION :Originalni skup muzičkih numera Transport Tycoon Deluxe Windows izdanja.
+STR_BASEMUSIC_DOS_DESCRIPTION :Originalna muzika za TTD za DOS izdanje.
+STR_BASEMUSIC_TTO_DESCRIPTION :Originalna muzika TTD (Original / World Editor) DOS izdanja.
STR_BASEMUSIC_NONE_DESCRIPTION :Prazan skup muzičkih numera.
##id 0x2000
diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt
index dfa999bab7..535e94a582 100644
--- a/src/lang/simplified_chinese.txt
+++ b/src/lang/simplified_chinese.txt
@@ -475,6 +475,7 @@ STR_ABOUT_MENU_SCREENSHOT :屏幕截图
STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :高清截图
STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :默认缩放模式下的屏幕截图
STR_ABOUT_MENU_GIANT_SCREENSHOT :全地图截图
+STR_ABOUT_MENU_SHOW_FRAMERATE :显示帧率
STR_ABOUT_MENU_ABOUT_OPENTTD :关于 'OpenTTD'
STR_ABOUT_MENU_SPRITE_ALIGNER :Sprite 对齐
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :切换边界框
@@ -650,6 +651,7 @@ STR_MUSIC_RULER_MARKER :{TINY_FONT}{BLA
STR_MUSIC_TRACK_NONE :{TINY_FONT}{DKGREEN}--
STR_MUSIC_TRACK_DIGIT :{TINY_FONT}{DKGREEN}{ZEROFILL_NUM}
STR_MUSIC_TITLE_NONE :{TINY_FONT}{DKGREEN}------
+STR_MUSIC_TITLE_NOMUSIC :{TINY_FONT}{DKGREEN}没有可用的音乐包
STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}"
STR_MUSIC_TRACK :{TINY_FONT}{BLACK}音轨
STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}乐曲主题
@@ -812,6 +814,7 @@ STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLAC
STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDENT_NAME}{}(总裁)
STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}{STRING} 赞助了城镇 {TOWN} 的建设!
+STR_NEWS_NEW_TOWN_UNSPONSORED :{BLACK}{BIG_FONT}一个名叫{TOWN}的城镇刚刚成立了!
STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLACK}新 {STRING} 正在 {TOWN} 加紧建设!
STR_NEWS_INDUSTRY_PLANTED :{BIG_FONT}{BLACK}新 {STRING} 即将落户 {TOWN}!
@@ -1336,7 +1339,9 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :设置缩略地
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :绿色
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :深绿色
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :紫色
+STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :鼠标右键移动地图,鼠标指针不跟随移动
STR_CONFIG_SETTING_SCROLLMODE_RMB :鼠标右键移动地图
+STR_CONFIG_SETTING_SCROLLMODE_LMB :鼠标左键移动地图
STR_CONFIG_SETTING_SMOOTH_SCROLLING :平滑视角滚动: {STRING}
STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :设置在缩略图上点击或者发出转到特定目标的命令时主视角的转换方式,如果“打开”本选项,视角平缓滚动,“关闭”时直接跳转到目标位置
STR_CONFIG_SETTING_MEASURE_TOOLTIP :建设时显示测量数据:{STRING}
@@ -1368,6 +1373,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :按住Command
STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :按住Ctrl键 点击
STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :关闭
+STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :右键关闭窗口: {STRING}
+STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :使用在窗口内按右键关闭该窗口,本功能与右键工具提示不能共存!
STR_CONFIG_SETTING_AUTOSAVE :自动保存: {STRING}
STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :选择自动存档时间间隔
@@ -1603,7 +1610,7 @@ STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :游戏开局时
STR_CONFIG_SETTING_LINKGRAPH_INTERVAL :每 {STRING}{NBSP}天刷新一次分配图
STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT :指定每次计算货物分配图之间的时间。由于每次重新计算只会处理一个货物分配图元件,因此本设定不代表“每若干日重新计算整个货物分配图”。{}如果此设定赋值越小,則系统需要使用更多处理器时间计算货物分配图。相反,如果此设定赋值越大,則货物被派往新路线所需的时间越长。
STR_CONFIG_SETTING_LINKGRAPH_TIME :容许系统用 {STRING}{NBSP}天时间刷新货物分配图
-STR_CONFIG_SETTING_LINKGRAPH_TIME_HELPTEXT :當刷新货物分配图时,系统會衍生一条线程。本设定的值即为线程的持续时间。{}这设定赋值越小,线程越有可能在应当停止的时候还未完成,游戏会暂停运作至线程完成工作。相反,这设定赋值越大,則货物分配功能需要较长时间反映线路网変动的影晌。
+STR_CONFIG_SETTING_LINKGRAPH_TIME_HELPTEXT :当刷新货物分配图时,系统会创建一条线程。此处设定的数值即该线程的持续时间。{}赋值越小,线程越有可能在应当停止的时候还未完成,游戏会暂停运作至线程完成工作。相反,赋值越大,则货物分配功能需要较长时间反映线路网变动的影晌。
STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :手动
STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :不对称
STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :对称
@@ -1612,7 +1619,7 @@ STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :假设有交通
STR_CONFIG_SETTING_DISTRIBUTION_MAIL :邮件分配方式:{STRING}
STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :假设有交通路线连接甲、乙两站。“对称”指甲站往乙站的邮件数量與乙站往甲站的邮件数量大致相同。“不对称”指任何一站往另一站的邮件数量皆由系统随意决定。“手动”指系统不会自动分配邮件的目的地。
STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :装甲货物分配方式:{STRING}
-STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :“装甲货物”包括溫带场景的“贵重品”、寒带场景的“金块”及沙漠场景的“钻石”。使用 NewGRF 可能会改変以上设置。{} 假设有交通路线连接甲、乙两站。“对称”指甲站往乙站的货物数量與乙站往甲站的装甲货物数量大致相同。“不对称”指任何一站往另一站的装甲货物数量皆由系统随意决定。“手动”指系统不会自动分配装甲货物的目的地。{} 建议在溫带及沙漠场景使用“对称”,因为银行之间会相互发送贵重品或钻石;在寒带则应使用“不对称”,因为银行不会把金块送回金矿。
+STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :“装甲货物”包括温带场景的“贵重品”、寒带场景的“金块”及沙漠场景的“钻石”。使用 NewGRF 可能会改变以上设置。{} 假设有交通路线连接甲、乙两站。“对称”指甲站往乙站的货物数量与乙站往甲站的装甲货物数量大致相同。“不对称”指任何一站往另一站的装甲货物数量皆由系统随意决定。“手动”指系统不会自动分配装甲货物的目的地。{} 建议在温带及沙漠场景使用“对称”,因为银行之间会相互发送贵重品或钻石;在寒带则应使用“不对称”,因为银行不会把金块送回金矿。
STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :其他货物分配方式:{STRING}
STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :如为此设置赋值“不对称”,则任何一站往另一站的货物数量皆由系统随意决定。如为此设置赋值“手动”,则系统不会依据交通路线分配货物的目的地。
STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :分配精确度:{STRING}
@@ -2257,7 +2264,7 @@ STR_CONTENT_ERROR_COULD_NOT_EXTRACT :{WHITE}无法
STR_MISSING_GRAPHICS_SET_CAPTION :{WHITE}缺失图形组
STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD 需要基础图形组用以绘制界面。您是否希望 OpenTTD 下载并安装以下图形组?
-STR_MISSING_GRAPHICS_YES_DOWNLOAD :{BLACK}是的,下载之
+STR_MISSING_GRAPHICS_YES_DOWNLOAD :{BLACK}好,开始下载
STR_MISSING_GRAPHICS_NO_QUIT :{BLACK}不,退出OpenTTD
# Transparency settings window
@@ -2686,6 +2693,26 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}原始
STR_ABOUT_VERSION :{BLACK}OpenTTD 版本 {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD 团队
+# Framerate display window
+STR_FRAMERATE_CAPTION :{WHITE}帧率
+STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} ({DECIMAL}x)
+STR_FRAMERATE_RATE_BLITTER :{BLACK}帧率:{STRING}
+STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}每秒渲染更新的图像帧。
+STR_FRAMERATE_SPEED_FACTOR :{BLACK}当前游戏速度:{DECIMAL}x
+STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL} ms
+STR_FRAMERATE_MS_BAD :{RED}{DECIMAL} ms
+STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL} fps
+STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL} fps
+STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL} fps
+STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA} ms
+############ Leave those lines in this order!!
+STR_FRAMERATE_VIDEO :{BLACK}视频输出:
+STR_FRAMERATE_SOUND :{BLACK}混响:
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}保存游戏
STR_SAVELOAD_LOAD_CAPTION :{WHITE}读取存档
@@ -2708,6 +2735,7 @@ STR_SAVELOAD_DETAIL_CAPTION :{BLACK}游戏
STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}无可用信息
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING}
STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: {WHITE}{STRING}
+STR_SAVELOAD_FILTER_TITLE :{BLACK}过滤字串:
STR_SAVELOAD_OSKTITLE :{BLACK}为存档命名
@@ -3359,6 +3387,7 @@ STR_GROUP_RENAME_CAPTION :{BLACK}重命
STR_GROUP_PROFIT_THIS_YEAR :今年利润:
STR_GROUP_PROFIT_LAST_YEAR :去年利润
+STR_GROUP_OCCUPANCY :当前使用量:
STR_GROUP_OCCUPANCY_VALUE :{NUM}%
# Build vehicle window
@@ -3527,7 +3556,10 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :磁悬浮机车
STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}售价:{CURRENCY_LONG} 重量:{WEIGHT_SHORT}{}速度:{VELOCITY} 功率:{POWER}{}运行费用:{CURRENCY_LONG}/年{}运载能力: {CARGO_LONG}
STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}售价:{CURRENCY_LONG} 重量:{WEIGHT_SHORT}{}速度:{VELOCITY} 功率:{POWER} 最大牵引力:{6:FORCE}{}运行费用{4:CURRENCY_LONG}/年{}运载能力:{5:CARGO_LONG}
STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}售价:{CURRENCY_LONG} 最大速度:{VELOCITY}{}运载能力:{CARGO_LONG}{}运行成本:{CURRENCY_LONG} /年
+STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}售价:{CURRENCY_LONG} 最大速度:{VELOCITY}{}飞机类型:{STRING}{}运载能力:{CARGO_LONG}, {CARGO_LONG}{}运行成本: {CURRENCY_LONG}/年
+STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}售价: {CURRENCY_LONG} 最大速度: {VELOCITY}{}飞机类型: {STRING}{}运载能力: {CARGO_LONG}{}运行成本: {CURRENCY_LONG}/年
STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}购买费用: {CURRENCY_LONG} 最大速度: {VELOCITY}{}飞机种类: {STRING} 最大航程: {COMMA} 格{}装载量: {CARGO_LONG}, {CARGO_LONG}{}运行费用: {CURRENCY_LONG}/年
+STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}售价: {CURRENCY_LONG} 最大速度: {VELOCITY}{}飞机类型: {STRING} 续航里程: {COMMA} 格{}运载能力: {CARGO_LONG}{}运行成本: {CURRENCY_LONG}/年
# Autoreplace window
STR_REPLACE_VEHICLES_WHITE :{WHITE}更新 {STRING} - {STRING}
@@ -4130,7 +4162,7 @@ STR_ERROR_NOT_ALLOWED_WHILE_PAUSED :{WHITE}暂停
STR_ERROR_LOCAL_AUTHORITY_REFUSES_TO_ALLOW_THIS :{WHITE}{TOWN} 地方政府不批准此操作……
STR_ERROR_LOCAL_AUTHORITY_REFUSES_AIRPORT :{WHITE}{TOWN}地方政府{}不同意在本市范围内再兴建一座机场
STR_ERROR_LOCAL_AUTHORITY_REFUSES_NOISE :{WHITE}{TOWN} 考虑到噪音控制,地方当局拒绝修建机场。
-STR_ERROR_BRIBE_FAILED :{WHITE}您的桥梁修建计划受到了当地投资商的关注
+STR_ERROR_BRIBE_FAILED :{WHITE}您的贿赂行动被当地检察机关发现,赃款均已没收,您在本市评价已降为最低。
# Levelling errors
STR_ERROR_CAN_T_RAISE_LAND_HERE :{WHITE}不能提高这里的地面……
@@ -4209,7 +4241,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}车站
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}分体站台太多
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}公共汽车站过多
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}汽车货场过多
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}距离另一车站过近
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}距离另一码头过近
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}距离另一机场过近
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}不能重命名车站
@@ -4469,6 +4500,7 @@ STR_BASESOUNDS_WIN_DESCRIPTION :Transport Tycoo
STR_BASESOUNDS_NONE_DESCRIPTION :一个空的音效包.
STR_BASEMUSIC_WIN_DESCRIPTION :Transport Tycoon Deluxe(运输大亨Windows豪华版)的原版音乐包
STR_BASEMUSIC_DOS_DESCRIPTION :运输大亨DOS豪华版原版音乐。
+STR_BASEMUSIC_TTO_DESCRIPTION :原版运输大亨(DOS版及地图编辑器扩展)音乐。
STR_BASEMUSIC_NONE_DESCRIPTION :一个没有实际内容的音乐包.
##id 0x2000
diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt
index 2b76b4bd34..b828879d48 100644
--- a/src/lang/slovak.txt
+++ b/src/lang/slovak.txt
@@ -2750,6 +2750,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Pôvodn
STR_ABOUT_VERSION :{BLACK}OpenTTD verzia {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 team OpenTTD
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Uložiť hru
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Nahrať hru
@@ -4264,7 +4271,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Príliš
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Veľa častí vlakovej stanice
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Príliš veľa autobusových zastávok
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Príliš veľa zastávok nákladných automobilov
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Príliš blízko inej stanice/vykládky
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Príliš blízko iného prístavu
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Príliš blízko iného letiska
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Stanica sa nedá premenovať...
diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt
index c385b7f8e1..0704d6e95b 100644
--- a/src/lang/slovenian.txt
+++ b/src/lang/slovenian.txt
@@ -2836,6 +2836,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Prvotne
STR_ABOUT_VERSION :{BLACK}OpenTTD različica {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 ekipa OpenTTD
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Shrani igro
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Naloži igro
@@ -4351,7 +4358,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Preveč
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Preveč delov železniške postaje
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Preveč avtobusnih postaj
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Preveč tovornih postaj
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Preblizu druge postaje
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Preblizu drugemu pristanišču
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Preblizu sosednjemu letališču
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Ni mogoče preimenovati postaje
diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt
index 7dd3c4a548..43f9d57b19 100644
--- a/src/lang/spanish.txt
+++ b/src/lang/spanish.txt
@@ -476,6 +476,7 @@ STR_ABOUT_MENU_SCREENSHOT :Captura de pant
STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Captura con zoom de cerca
STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Captura con zoom por defecto
STR_ABOUT_MENU_GIANT_SCREENSHOT :Captura de mapa completo
+STR_ABOUT_MENU_SHOW_FRAMERATE :Mostrar fotogramas por segundo - FPS
STR_ABOUT_MENU_ABOUT_OPENTTD :Acerca de 'OpenTTD'
STR_ABOUT_MENU_SPRITE_ALIGNER :Alineador de sprites
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Activar cajas delimitadoras
@@ -574,7 +575,7 @@ STR_GRAPH_OPERATING_PROFIT_CAPTION :{WHITE}Gráfico
STR_GRAPH_INCOME_CAPTION :{WHITE}Gráfico de Ingresos
STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Unidades de carga entregadas
STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Calificaciones de actuación de empresas (tasa máxima=1000)
-STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Valores de las empresas
+STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Valor de la empresa
STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Tasas de pago por carga
STR_GRAPH_CARGO_PAYMENT_RATES_X_LABEL :{TINY_FONT}{BLACK}Días en tránsito
@@ -651,6 +652,7 @@ STR_MUSIC_RULER_MARKER :{TINY_FONT}{BLA
STR_MUSIC_TRACK_NONE :{TINY_FONT}{DKGREEN}--
STR_MUSIC_TRACK_DIGIT :{TINY_FONT}{DKGREEN}{ZEROFILL_NUM}
STR_MUSIC_TITLE_NONE :{TINY_FONT}{DKGREEN}------
+STR_MUSIC_TITLE_NOMUSIC :{TINY_FONT}{DKGREEN}No hay música disponible
STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}"
STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Pista
STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Título
@@ -671,13 +673,16 @@ STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Encender
STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Mostrar ventana de selección de pistas musicales
# Playlist window
+STR_PLAYLIST_MUSIC_SELECTION_SETNAME :{WHITE}Programación Musical - '{STRING}'
STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}"
STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Índice de pistas
STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Programa - '{STRING}'
STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Borrar
-STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Borrar programa actual (solo Personal 1 y Personal 2)
-STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Pulse en la pista de música para añadirla al programa actual (solo Personal 1 y 2)
-STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Pulsa sobre la canción para quitarla del programa actual (Solo Personalizado1 y Personalizado2)
+STR_PLAYLIST_CHANGE_SET :{BLACK}Cambiar set
+STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Borrar programa actual (solo Personalizado1 y 2)
+STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Cambia la selección musical a otro set instalado
+STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Pulse en la pista de música para añadirla al programa actual (solo Personalizado1 y 2)
+STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Pulsa sobre la canción para quitarla del programa actual (solo Personalizado1 y 2)
# Highscore window
STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Top de empresas que han alcanzado {NUM}
@@ -811,6 +816,7 @@ STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLAC
STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDENT_NAME}{}(Presidente)
STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}¡{STRING} patrocina la construcción del nuevo municipio {TOWN}!
+STR_NEWS_NEW_TOWN_UNSPONSORED :{BLACK}{BIG_FONT}¡Un nuevo municipio, llamado: {TOWN}, ha sido construido!
STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLACK}¡Nuev{G o a} {STRING} en construcción cerca de {TOWN}!
STR_NEWS_INDUSTRY_PLANTED :{BIG_FONT}{BLACK}¡Nuev{G o a} {STRING} está siendo plantad{G o a} cerca de {TOWN}!
@@ -878,10 +884,10 @@ STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLAC
# Extra view window
STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Vista {COMMA}
-STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Copiar punto de vista
+STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Cambiar punto de vista
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Copia la localización de la vista principal a este punto de vista
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Pegar punto de vista
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Pega la localización de este punto de vista a la principal
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Cambiar vista principal
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Copia la localización de este punto de vista en la vista principal
# Game options window
STR_GAME_OPTIONS_CAPTION :{WHITE}Opciones del juego
@@ -923,6 +929,7 @@ STR_GAME_OPTIONS_CURRENCY_ZAR :Rand sudafrican
STR_GAME_OPTIONS_CURRENCY_CUSTOM :Personalizada...
STR_GAME_OPTIONS_CURRENCY_GEL :Lari Georgiano (GEL)
STR_GAME_OPTIONS_CURRENCY_IRR :Rial Iraní (IRR)
+STR_GAME_OPTIONS_CURRENCY_RUB :Nuevo Rublo Ruso (RUB)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Vehículos de carretera
@@ -1490,11 +1497,11 @@ STR_CONFIG_SETTING_NEWS_INDUSTRY_CLOSE_HELPTEXT :Mostrar noticia
STR_CONFIG_SETTING_NEWS_ECONOMY_CHANGES :Cambios en la economía: {STRING}
STR_CONFIG_SETTING_NEWS_ECONOMY_CHANGES_HELPTEXT :Mostrar noticias sobre cambios globales a la economía
STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY :Cambios de producción en industrias atendidas por la empresa: {STRING}
-STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY_HELPTEXT :Mostrar una noticia cuando el nivel de producción de una industria que está servida por tu compañía cambia
+STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY_HELPTEXT :Mostrar una noticia cuando el nivel de producción de una industria, servida por tu compañía, cambia
STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER :Cambios de producción en las industrias servidas por los competidores: {STRING}
-STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER_HELPTEXT :Mostrar una noticia cuando el nivel de producción de una industria que está servida por compañías competidoras cambia
+STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER_HELPTEXT :Mostrar una noticia cuando el nivel de producción de una industria, servida por tus competidores, cambia
STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED :Cambios de producción de otras industrias: {STRING}
-STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED_HELPTEXT :Mostrar una noticia cuando el nivel de producción de una industria que no está servida por tu compañía o competidores cambia
+STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED_HELPTEXT :Mostrar una noticia cuando el nivel de producción de una industria, no servida por tu compañía o competidores, cambia
STR_CONFIG_SETTING_NEWS_ADVICE :Aviso / información de los vehículos de la empresa: {STRING}
STR_CONFIG_SETTING_NEWS_ADVICE_HELPTEXT :Mostrar mensajes sobre vehículos que requieren atención
STR_CONFIG_SETTING_NEWS_NEW_VEHICLES :Nuevos vehículos: {STRING}
@@ -1600,10 +1607,10 @@ STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Ninguna
STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Multiplicador inicial del tamaño de ciudad: {STRING}
STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Tamaño medio de las ciudades en relación a los pueblos normales al comienzo de la partida
-STR_CONFIG_SETTING_LINKGRAPH_INTERVAL :Actualizar el grafo de distribución cada {STRING}{NBSP}día{P 0:2 "" s}
-STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT :Periodo de tiempo entre cálculos del grafo de distribución consecutivos. Esta opción se refiere a los cálculos para cada uno de los componentes del grafo, por lo cual fijar un valor no quiere decir que el grafo completo se actualizará tras ese número de días. Cuanto menor sea, mayor tiempo de CPU será necesario para calcular el grafo de distribución. Cuanto mayor sea, más tardará el grafo de distribución en adaptarse a nuevas rutas
-STR_CONFIG_SETTING_LINKGRAPH_TIME :Usar {STRING}{NBSP}día{P 0:2 "" s} para el cálculo del grafo de distribución
-STR_CONFIG_SETTING_LINKGRAPH_TIME_HELPTEXT :Tiempo a emplear en el cálculo de cada uno de los componentes del grafo de distribución. Cuanto menor sea este valor, más probable es que se produzca ralentización en el juego. Cuanto mayor sea, más tiempo tardará la distribución en actualizarse cuando se producen cambios en las rutas
+STR_CONFIG_SETTING_LINKGRAPH_INTERVAL :Actualizar el gráfico de distribución cada {STRING}{NBSP}día{P 0:2 "" s}
+STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT :Periodo de tiempo entre cálculos del gráfico de distribución consecutivos. Esta opción se refiere a los cálculos para cada uno de los componentes del gráfico, por lo cual fijar un valor no quiere decir que el gráfico completo se actualizará tras ese número de días. Cuanto menor sea, mayor tiempo de CPU será necesario para calcular el gráfico de distribución. Cuanto mayor sea, más tardará el gráfico de distribución en adaptarse a nuevas rutas.
+STR_CONFIG_SETTING_LINKGRAPH_TIME :Usar {STRING}{NBSP}día{P 0:2 "" s} para el cálculo del gráfico de distribución
+STR_CONFIG_SETTING_LINKGRAPH_TIME_HELPTEXT :Tiempo a emplear en el cálculo de cada uno de los componentes del gráfico de distribución. Cuanto menor sea este valor, más probable es que se produzca ralentización en el juego. Cuanto mayor sea, más tiempo tardará la distribución en actualizarse cuando se producen cambios en las rutas.
STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :manual
STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :asimétrico
STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :simétrico
@@ -1616,7 +1623,7 @@ STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :La clase de car
STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Modo de distribución para otras clases de carga: {STRING}
STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"Asimétrico" significa que se pueden mover cantidades arbitrarias de carga en ambas direcciones. "Manual" significa que no habrá distribución automática para estos tipos de carga.
STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Precisión de la distribución: {STRING}
-STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Este valor determina el tiempo de CPU empleado en calcular el grafo de distribución. Si es demasiado elevado puede producir ralentización en el juego. Si es demasiado bajo la distribución puede ser poco precisa, causando que ocasionalmente se produzcan errores en los lugares a los que va la carga
+STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Este valor determina el tiempo de CPU empleado en calcular el gráfico de distribución. Si es demasiado elevado puede producir ralentización en el juego. Si es demasiado bajo la distribución puede ser poco precisa, causando que ocasionalmente se produzcan errores en los lugares a los que va la carga.
STR_CONFIG_SETTING_DEMAND_DISTANCE :Efecto de la distancia en la demanda: {STRING}
STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Si se fija a un valor superior a 0, la distancia entre la estación origen A de cierta carga y un posible destino B afectará a la cantidad de carga que se enviará de A a B. Cuanto más lejos esté B de A, menos carga se enviará. Cuanto mayor sea el valor de esta opción, menos carga se enviará a estaciones distantes en favor de estaciones cercanas
STR_CONFIG_SETTING_DEMAND_SIZE :Cantidad de carga a devolver en modo simétrico: {STRING}
@@ -1861,7 +1868,7 @@ STR_FACE_FACECODE :{BLACK}Cara del
STR_FACE_FACECODE_TOOLTIP :{BLACK}Ver y/o asignar número de cara de presidente
STR_FACE_FACECODE_CAPTION :{WHITE}Ver y/o asignar número de cara de presidente
STR_FACE_FACECODE_SET :{WHITE}Nuevo código de cara ha sido asignado
-STR_FACE_FACECODE_ERR :{WHITE}No se puede asignar número de cara de presidente - ¡debe ser un número entre 0 y 4,294,967,295!
+STR_FACE_FACECODE_ERR :{WHITE}No se puede asignar número de cara de presidente - ¡Ha de ser un número entre 0 y 4,294,967,295!
STR_FACE_SAVE :{BLACK}Guardar
STR_FACE_SAVE_TOOLTIP :{BLACK}Guardar cara favorita
STR_FACE_SAVE_DONE :{WHITE}Esta cara ha sido guardada como tu favorita en el fichero de configuración
@@ -2279,6 +2286,7 @@ STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Leyenda
STR_LINKGRAPH_LEGEND_ALL :{BLACK}Todas
STR_LINKGRAPH_LEGEND_NONE :{BLACK}Ninguna
STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Seleccione las compañías a mostrar
+STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY}
# Linkgraph legend window and linkgraph legend in smallmap
STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}sin uso
@@ -2687,6 +2695,34 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyrigh
STR_ABOUT_VERSION :{BLACK}OpenTTD versión {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 El equipo OpenTTD
+# Framerate display window
+STR_FRAMERATE_CAPTION :{WHITE}Fotogramas por segundo - FPS
+STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}Número de fotogramas renderizados por segundo.
+STR_FRAMERATE_CURRENT :{WHITE}Actual
+STR_FRAMERATE_AVERAGE :{WHITE}Medio
+STR_FRAMERATE_DATA_POINTS :{BLACK}Datos basados en {COMMA} medidas
+STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL} ms
+STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL} ms
+STR_FRAMERATE_MS_BAD :{RED}{DECIMAL} ms
+STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL} frames/s
+STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL} frames/s
+STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL} frames/s
+STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA} ms
+STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} s
+############ Leave those lines in this order!!
+STR_FRAMERATE_GL_TRAINS :{BLACK} Ticks de trenes:
+STR_FRAMERATE_GL_ROADVEHS :{BLACK} Ticks de vehículos de carretera:
+STR_FRAMERATE_GL_SHIPS :{BLACK} Ticks de barcos:
+STR_FRAMERATE_GL_AIRCRAFT :{BLACK} Ticks de aeronaves:
+STR_FRAMERATE_DRAWING :{BLACK}Renderizado gráfico:
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+STR_FRAMETIME_CAPTION_DRAWING :Renderizado gráfico
+STR_FRAMETIME_CAPTION_VIDEO :Salida de vídeo
+STR_FRAMETIME_CAPTION_SOUND :Mezcla de sonido
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Guardar Juego
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Cargar Juego
@@ -2709,6 +2745,7 @@ STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Detalles
STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}No hay información disponible
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING}
STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: {WHITE}{STRING}
+STR_SAVELOAD_FILTER_TITLE :{BLACK}Patrón de filtrado:
STR_SAVELOAD_OSKTITLE :{BLACK}Introduce un nombre para el juego guardado
@@ -2775,7 +2812,7 @@ STR_GENERATION_ABORT_MESSAGE :{YELLOW}¿Desea
STR_GENERATION_PROGRESS :{WHITE}{NUM}% completado
STR_GENERATION_PROGRESS_NUM :{BLACK}{NUM} / {NUM}
STR_GENERATION_WORLD_GENERATION :{BLACK}Generación de mundo
-STR_GENERATION_RIVER_GENERATION :{BLACK}Generación de Ríos
+STR_GENERATION_RIVER_GENERATION :{BLACK}Generación de ríos
STR_GENERATION_TREE_GENERATION :{BLACK}Generación de árboles
STR_GENERATION_OBJECT_GENERATION :{BLACK}Generación de inamovibles
STR_GENERATION_CLEARING_TILES :{BLACK}Generación de áreas ásperas o rocosas
@@ -2907,6 +2944,7 @@ STR_NEWGRF_ERROR_READ_BOUNDS :Lectura más al
STR_NEWGRF_ERROR_GRM_FAILED :Recursos GRF solicitados no disponibles (sprite {3:NUM})
STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} fue desactivado por {STRING}
STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Formato de colocación de sprites inválido o desconocido (sprite {3:NUM})
+STR_NEWGRF_ERROR_LIST_PROPERTY_TOO_LONG :Demasiados elementos en la lista de valores de propiedad (sprite {3:NUM}, propiedad {4:HEX})
# NewGRF related 'general' warnings
STR_NEWGRF_POPUP_CAUTION_CAPTION :{WHITE}¡Precaución!
@@ -2971,6 +3009,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Introduc
STR_TOWN_DIRECTORY_CAPTION :{WHITE}Municipios
STR_TOWN_DIRECTORY_NONE :{ORANGE}- Ninguna -
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA})
+STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Ciudad){BLACK} ({COMMA})
STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Nombres de los municipios - click sobre un nombre para centrar la vista principal en él. Ctrl+Click abre una ventana de visualización en dicha posición
STR_TOWN_POPULATION :{BLACK}Población mundial: {COMMA}
@@ -2978,6 +3017,7 @@ STR_TOWN_POPULATION :{BLACK}Poblaci
STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN}
STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Ciudad)
STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Habitantes: {ORANGE}{COMMA}{BLACK} Casas: {ORANGE}{COMMA}
+STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} último mes: {ORANGE}{COMMA}{BLACK} máx: {ORANGE}{COMMA}
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Carga necesaria para crecimiento del municipio:
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} requeridos
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} requerido en invierno
@@ -2985,7 +3025,7 @@ STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{ORANGE}{STRING
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{RED} (todavía requerido)
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{GREEN} (entregado)
STR_TOWN_VIEW_TOWN_GROWS_EVERY :{BLACK}El municipio crece cada {ORANGE}{COMMA}{BLACK}{NBSP}día{P "" s}
-STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}El municipio crece cada {ORANGE}{COMMA}{BLACK}{NBSP}días{P "" s} (edificios fundados)
+STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}El municipio crece cada {ORANGE}{COMMA}{BLACK}{NBSP}día{P "" s} (edificios fundados)
STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}El municipio {RED}no{BLACK} está creciendo
STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Nivel de ruido en municipio: {ORANGE}{COMMA}{BLACK} Máx.: {ORANGE}{COMMA}
STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Centrar vista sobre el municipio. Ctrl+Click abre un punto de vista en dicha posición
@@ -3984,7 +4024,7 @@ STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}La vent
# AI configuration window
STR_AI_CONFIG_CAPTION :{WHITE}Configuración de Scripts de Juego / IA
-STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Script de Juego que será cargada en la próxima partida
+STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Script de Juego que será cargado en la próxima partida
STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}IAs que serán cargadas en la próxima partida
STR_AI_CONFIG_HUMAN_PLAYER :Jugador Humano
STR_AI_CONFIG_RANDOM_AI :IA aleatoria
@@ -4169,7 +4209,7 @@ STR_ERROR_PROTECTED :{WHITE}Esta emp
STR_ERROR_CAN_T_GENERATE_TOWN :{WHITE}No se puede construir ningún municipio
STR_ERROR_CAN_T_RENAME_TOWN :{WHITE}No se puede renombrar el municipio...
STR_ERROR_CAN_T_FOUND_TOWN_HERE :{WHITE}No se puede construir un municipio aquí...
-STR_ERROR_CAN_T_EXPAND_TOWN :{WHITE}No se puede expandir municipio...
+STR_ERROR_CAN_T_EXPAND_TOWN :{WHITE}No se puede expandir este municipio...
STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... demasiado cercano al borde del mapa
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... demasiado cercano a otro municipio
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... demasiados municipios
@@ -4216,7 +4256,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Demasiad
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Demasiadas partes de estación de tren
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Demasiadas paradas de autobús
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Demasiadas paradas de camión
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Demasiado cerca de otra estación/zona de carga
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Demasiado cerca de otro muelle
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Demasiado cerca de otro aeropuerto
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}No se puede renombrar estación...
@@ -4224,6 +4263,7 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... esta
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... carretera en la dirección incorrecta
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... las estaciones de autobús de paso no pueden tener esquinas
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... las estaciones de autobús de paso no pueden tener intersecciones
+STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... carretera de un solo sentido o bloqueada
# Station destruction related errors
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}No se puede retirar parte de la estación...
@@ -4468,13 +4508,15 @@ STR_ERROR_CAN_T_DELETE_SIGN :{WHITE}No se pu
STR_DESKTOP_SHORTCUT_COMMENT :Un juego de simulación basado en Transport Tycoon Deluxe
# Translatable descriptions in media/baseset/*.ob* files
-STR_BASEGRAPHICS_DOS_DESCRIPTION :Gráficos originales de Transport Tycoon Deluxe versión DOS.
-STR_BASEGRAPHICS_DOS_DE_DESCRIPTION :Gráficos originales de Transport Tycoon Deluxe versión DOS (Alemán).
-STR_BASEGRAPHICS_WIN_DESCRIPTION :Gráficos originales de Transport Tycoon Deluxe versión Windows.
-STR_BASESOUNDS_DOS_DESCRIPTION :Sonidos originales de Transport Tycoon Deluxe versión DOS.
-STR_BASESOUNDS_WIN_DESCRIPTION :Sonidos originales de Transport Tycoon Deluxe versión Windows.
+STR_BASEGRAPHICS_DOS_DESCRIPTION :Gráficos originales de Transport Tycoon Deluxe, versión DOS.
+STR_BASEGRAPHICS_DOS_DE_DESCRIPTION :Gráficos originales de Transport Tycoon Deluxe, versión DOS (Alemán).
+STR_BASEGRAPHICS_WIN_DESCRIPTION :Gráficos originales de Transport Tycoon Deluxe, versión Windows.
+STR_BASESOUNDS_DOS_DESCRIPTION :Sonidos originales de Transport Tycoon Deluxe, versión DOS.
+STR_BASESOUNDS_WIN_DESCRIPTION :Sonidos originales de Transport Tycoon Deluxe, versión Windows.
STR_BASESOUNDS_NONE_DESCRIPTION :Un conjunto de sonidos vacío.
-STR_BASEMUSIC_WIN_DESCRIPTION :Música original de Transport Tycoon Deluxe versión Windows.
+STR_BASEMUSIC_WIN_DESCRIPTION :Música original de Transport Tycoon Deluxe, versión Windows.
+STR_BASEMUSIC_DOS_DESCRIPTION :Música original de Transport Tycoon Deluxe, versión DOS.
+STR_BASEMUSIC_TTO_DESCRIPTION :Música original de Transport Tycoon (Original/Editor de Mundos), versión DOS.
STR_BASEMUSIC_NONE_DESCRIPTION :Un conjunto de música vacío.
##id 0x2000
diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt
index e8422b6aa4..113300b766 100644
--- a/src/lang/spanish_MX.txt
+++ b/src/lang/spanish_MX.txt
@@ -283,7 +283,7 @@ STR_SORT_BY_CAPTION_DATE :{BLACK}Fecha
STR_SORT_BY_NAME :Nombre
STR_SORT_BY_PRODUCTION :Producción
STR_SORT_BY_TYPE :Tipo
-STR_SORT_BY_TRANSPORTED :Entregado
+STR_SORT_BY_TRANSPORTED :Transportado
STR_SORT_BY_NUMBER :Número
STR_SORT_BY_PROFIT_LAST_YEAR :Utilidad año pasado
STR_SORT_BY_PROFIT_THIS_YEAR :Utilidad este año
@@ -317,7 +317,7 @@ STR_SORT_BY_RATING :Evaluación
STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Poner en pausa
STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}Avance rápido
STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Opciones
-STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}Guardar partida, retirarse, salir
+STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}Guardar partida, salir
STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Mostrar mapa, ventana de vista adicional o lista de carteles
STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}Mostrar guía de pueblos
STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Mostrar subsidios
@@ -391,7 +391,7 @@ STR_SETTINGS_MENU_TRANSPARENT_SIGNS :Carteles transp
############ range for file menu starts
STR_FILE_MENU_SAVE_GAME :Guardar partida
STR_FILE_MENU_LOAD_GAME :Cargar partida
-STR_FILE_MENU_QUIT_GAME :Retirarse de la partida
+STR_FILE_MENU_QUIT_GAME :Salir de la partida
STR_FILE_MENU_SEPARATOR :
STR_FILE_MENU_EXIT :Salir
############ range ends here
@@ -476,6 +476,7 @@ STR_ABOUT_MENU_SCREENSHOT :Captura de pant
STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Captura con acercamiento completo
STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Captura con acercamiento predeterminado
STR_ABOUT_MENU_GIANT_SCREENSHOT :Captura de mapa completo
+STR_ABOUT_MENU_SHOW_FRAMERATE :Mostrar FPS
STR_ABOUT_MENU_ABOUT_OPENTTD :Acerca de 'OpenTTD'
STR_ABOUT_MENU_SPRITE_ALIGNER :Alineador de sprites
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Activar cajas delimitadoras
@@ -815,6 +816,7 @@ STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLAC
STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDENT_NAME}{}(Presidente)
STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}¡{STRING} patrocina la creación del nuevo pueblo de {TOWN}!
+STR_NEWS_NEW_TOWN_UNSPONSORED :{BLACK}{BIG_FONT}¡El nuevo pueblo de {TOWN} ha sido formado!
STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLACK}¡Nuev{G o a} {STRING} en construcción cerca de {TOWN}!
STR_NEWS_INDUSTRY_PLANTED :{BIG_FONT}{BLACK}¡Nuev{G o a} {STRING} fundad{G o a} cerca de {TOWN}!
@@ -882,10 +884,10 @@ STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLAC
# Extra view window
STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Vista {COMMA}
-STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Copiar ventana de vista
+STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Cambiar ventana de vista
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Copiar la vista principal a esta ventana de vista
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Pegar ventana de vista
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Pegar esta ventana de vista en la principal
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Cambiar vista principal
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Copiar ubicación en esta vista a la principal
# Game options window
STR_GAME_OPTIONS_CAPTION :{WHITE}Opciones de juego
@@ -927,6 +929,7 @@ STR_GAME_OPTIONS_CURRENCY_ZAR :Rand sudafrican
STR_GAME_OPTIONS_CURRENCY_CUSTOM :Personalizada...
STR_GAME_OPTIONS_CURRENCY_GEL :Lari georgiano (GEL)
STR_GAME_OPTIONS_CURRENCY_IRR :Rial iraní (IRR)
+STR_GAME_OPTIONS_CURRENCY_RUB :Nuevo rublo ruso (RUR)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Vehículos de carretera
@@ -1303,7 +1306,7 @@ STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Número de indu
STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Distancia máxima de refinerías de petróleo con los bordes del mapa: {STRING}
STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Las refinerías de petróleo se construyen cerca del borde del mapa, el cual es costa en mapas con borde marítimo
STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Nivel de inicio de nieve: {STRING}
-STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :En los mapas de clima Subártico, la elevación a la cual la nieve comienza. La nieve también afecta a la generación de industrias y a los requisitos de crecimiento de los pueblos
+STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :En los mapas de clima Subártico, la elevación a la cual la nieve comienza. La nieve también afecta la generación de industrias y los requisitos de crecimiento de los pueblos
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Irregularidad del terreno: {STRING}
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(Solo TerraGenesis) Cantidad de colinas: los terrenos más planos tienen menos colinas, aunque suelen ser más extensas. Los terrenos más accidentados tienen múltiples colinas, lo cual puede resultar repetitivo
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Muy suave
@@ -1789,8 +1792,8 @@ STR_OSNAME_OS2 :OS/2
STR_OSNAME_SUNOS :SunOS
# Abandon game
-STR_ABANDON_GAME_CAPTION :{WHITE}Retirarse de la partida
-STR_ABANDON_GAME_QUERY :{YELLOW}¿Estás seguro de que deseas retirarte de esta partida?
+STR_ABANDON_GAME_CAPTION :{WHITE}Salir de la partida
+STR_ABANDON_GAME_QUERY :{YELLOW}¿Estás seguro de que deseas salir de esta partida?
STR_ABANDON_SCENARIO_QUERY :{YELLOW}¿Estás seguro de que deseas salir de este mapa?
# Cheat window
@@ -2289,6 +2292,7 @@ STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Leyenda
STR_LINKGRAPH_LEGEND_ALL :{BLACK}Todas
STR_LINKGRAPH_LEGEND_NONE :{BLACK}Ninguna
STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Elegir las empresas a mostrar
+STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY}
# Linkgraph legend window and linkgraph legend in smallmap
STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}sin uso
@@ -2566,7 +2570,7 @@ STR_INDUSTRY_CARGOES_HOUSES :{WHITE}Casas
STR_INDUSTRY_CARGOES_INDUSTRY_TOOLTIP :{BLACK}Clic en la industria para ver sus industrias proveedoras y receptoras
STR_INDUSTRY_CARGOES_CARGO_TOOLTIP :{BLACK}{STRING}{}Clic en el cargamento para ver sus industrias proveedoras y receptoras
STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Mostrar cadena
-STR_INDUSTRY_DISPLAY_CHAIN_TOOLTIP :{BLACK}Mostrar las industrias que proveen y reciben el cargamento
+STR_INDUSTRY_DISPLAY_CHAIN_TOOLTIP :{BLACK}Mostrar las industrias que proveen y aceptan el cargamento
STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP :{BLACK}Ver en minimapa
STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP :{BLACK}Elegir y ver en el minimapa las industrias mostradas en el mapa principal
STR_INDUSTRY_CARGOES_SELECT_CARGO :{BLACK}Elegir cargamento
@@ -2594,7 +2598,7 @@ STR_LAND_AREA_INFORMATION_AIRPORT_CLASS :{BLACK}Tipo de
STR_LAND_AREA_INFORMATION_AIRPORT_NAME :{BLACK}Nombre del aeropuerto: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Nombre de casilla del aeropuerto: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING}
-STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Cargamento recibido: {LTBLUE}
+STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Cargamento aceptado: {LTBLUE}
STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING})
STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Tipo de vía: {LTBLUE}{STRING}
STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Límite de velocidad de ferrocarril: {LTBLUE}{VELOCITY}
@@ -2697,6 +2701,56 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyrigh
STR_ABOUT_VERSION :{BLACK}OpenTTD versión {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018, el equipo de OpenTTD
+# Framerate display window
+STR_FRAMERATE_CAPTION :{WHITE}FPS
+STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} ({DECIMAL}x)
+STR_FRAMERATE_RATE_GAMELOOP :{BLACK}Simulación: {STRING}
+STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP :{BLACK}Número de ticks simulados por segundo.
+STR_FRAMERATE_RATE_BLITTER :{BLACK}FPS de gráficos: {STRING}
+STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}Número de cuadros por segundo.
+STR_FRAMERATE_SPEED_FACTOR :{BLACK}Factor de velocidad de juego actual: {DECIMAL}x
+STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Rapidez actual del juego comparada con la esperada durante una simulación normal.
+STR_FRAMERATE_CURRENT :{WHITE}Actual
+STR_FRAMERATE_AVERAGE :{WHITE}Promedio
+STR_FRAMERATE_DATA_POINTS :{BLACK}Información de {COMMA} mediciones
+STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL} ms
+STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL} ms
+STR_FRAMERATE_MS_BAD :{RED}{DECIMAL} ms
+STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL} cuadros/s
+STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL} cuadros/s
+STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL} cuadros/s
+STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA} ms
+STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} s
+############ Leave those lines in this order!!
+STR_FRAMERATE_GAMELOOP :{BLACK}Bucles de juego totales:
+STR_FRAMERATE_GL_ECONOMY :{BLACK} Manejo de cargamento:
+STR_FRAMERATE_GL_TRAINS :{BLACK} Ticks de trenes:
+STR_FRAMERATE_GL_ROADVEHS :{BLACK} Ticks de vehículos de carretera:
+STR_FRAMERATE_GL_SHIPS :{BLACK} Ticks de barcos:
+STR_FRAMERATE_GL_AIRCRAFT :{BLACK} Ticks de aeronaves:
+STR_FRAMERATE_GL_LANDSCAPE :{BLACK} Ticks de mapa:
+STR_FRAMERATE_GL_LINKGRAPH :{BLACK} Retraso en gráfica de distribución:
+STR_FRAMERATE_DRAWING :{BLACK}Presentación de gráficos:
+STR_FRAMERATE_DRAWING_VIEWPORTS :{BLACK} Ventanas de vista generales:
+STR_FRAMERATE_VIDEO :{BLACK}Salida de video:
+STR_FRAMERATE_SOUND :{BLACK}Mezcla de sonido:
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+STR_FRAMETIME_CAPTION_GAMELOOP :Bucle de juego
+STR_FRAMETIME_CAPTION_GL_ECONOMY :Manejo de cargamento
+STR_FRAMETIME_CAPTION_GL_TRAINS :Ticks de trenes
+STR_FRAMETIME_CAPTION_GL_ROADVEHS :Ticks de vehículos de carretera
+STR_FRAMETIME_CAPTION_GL_SHIPS :Ticks de barcos
+STR_FRAMETIME_CAPTION_GL_AIRCRAFT :Ticks de areonaves
+STR_FRAMETIME_CAPTION_GL_LANDSCAPE :Ticks de mapa
+STR_FRAMETIME_CAPTION_GL_LINKGRAPH :Retraro en gráfica de distribución
+STR_FRAMETIME_CAPTION_DRAWING :Presentación de gráficos
+STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Presentación de ventanas de vista generales
+STR_FRAMETIME_CAPTION_VIDEO :Salida de video
+STR_FRAMETIME_CAPTION_SOUND :Mezcla de sonido
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Guardar partida
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Cargar partida
@@ -2719,6 +2773,7 @@ STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Detalles
STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}No hay información disponible
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING}
STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: {WHITE}{STRING}
+STR_SAVELOAD_FILTER_TITLE :{BLACK}Filtrar palabras:
STR_SAVELOAD_OSKTITLE :{BLACK}Indicar un nombre para la partida a guardar
@@ -2917,6 +2972,8 @@ STR_NEWGRF_ERROR_READ_BOUNDS :La lectura exce
STR_NEWGRF_ERROR_GRM_FAILED :Recursos GRF solicitados no disponibles (sprite {3:NUM})
STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} fue desactivado por {STRING}
STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Formato de colocación de sprites no válido o desconocido (sprite {3:NUM})
+STR_NEWGRF_ERROR_LIST_PROPERTY_TOO_LONG :Demasiados elementos en la lista de valores de propiedad (sprite {3:NUM}, property {4:HEX})
+STR_NEWGRF_ERROR_INDPROD_CALLBACK :Llamada de producción de industria no válida (sprite {3:NUM}, "{1:STRING}")
# NewGRF related 'general' warnings
STR_NEWGRF_POPUP_CAUTION_CAPTION :{WHITE}¡Precaución!
@@ -2981,6 +3038,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Indicar
STR_TOWN_DIRECTORY_CAPTION :{WHITE}Pueblos
STR_TOWN_DIRECTORY_NONE :{ORANGE}- Ninguno -
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA})
+STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (ciudad){BLACK} ({COMMA})
STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Nombres de pueblos. Clic en un nombre para centrar la vista principal en el pueblo. Ctrl+Clic abre una ventana de vista en dicha ubicación
STR_TOWN_POPULATION :{BLACK}Población mundial: {COMMA}
@@ -2988,6 +3046,7 @@ STR_TOWN_POPULATION :{BLACK}Poblaci
STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN}
STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (ciudad)
STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Habitantes: {ORANGE}{COMMA}{BLACK} Casas: {ORANGE}{COMMA}
+STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} mes pasado: {ORANGE}{COMMA}{BLACK} máx.: {ORANGE}{COMMA}
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Cargamento necesario para crecimiento:
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} requeridos
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} requerido en invierno
@@ -3279,15 +3338,15 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL :{WHITE}{CURRENC
# Industry directory
STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Industrias
STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Ninguna -
-STR_INDUSTRY_DIRECTORY_ITEM :{ORANGE}{INDUSTRY}{BLACK} ({CARGO_LONG}{STRING}){YELLOW} ({COMMA}% entregado)
-STR_INDUSTRY_DIRECTORY_ITEM_TWO :{ORANGE}{INDUSTRY}{BLACK} ({CARGO_LONG}{STRING}, {CARGO_LONG}{STRING}){YELLOW} ({COMMA}%, {COMMA}% entregado)
+STR_INDUSTRY_DIRECTORY_ITEM :{ORANGE}{INDUSTRY}{BLACK} ({CARGO_LONG}{STRING}){YELLOW} ({COMMA}% transportado)
+STR_INDUSTRY_DIRECTORY_ITEM_TWO :{ORANGE}{INDUSTRY}{BLACK} ({CARGO_LONG}{STRING}, {CARGO_LONG}{STRING}){YELLOW} ({COMMA}%, {COMMA}% transportado)
STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY}
STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Nombre de industria: Clic en un nombre para centrar la vista principal en la industria. Ctrl+Clic abre una ventana de vista en dicha ubicación
# Industry view
STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY}
STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Producción mes pasado:
-STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} ({COMMA}% entregado)
+STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} ({COMMA}% transportado)
STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Centrar la vista sobre la industria. Ctrl+Clic abre una ventana de vista en dicha ubicación
STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Nivel de producción: {YELLOW}{COMMA}%
STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}¡La industria ha anunciado su cierre inminente!
@@ -4226,7 +4285,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Demasiad
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Demasiadas partes de estación de tren
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Demasiadas paradas de autobuses
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Demasiadas estaciones de camiones
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Demasiado cerca de otra estación o zona de carga
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Demasiado cerca de otro muelle
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Demasiado cerca de otro aeropuerto
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}No se puede cambiar nombre de la estación...
@@ -4234,6 +4292,7 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... esta
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... carretera en el sentido incorrecto
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... las estaciones y paradas intermedias no pueden ponerse sobre esquinas
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... las estaciones y paradas intermedias no pueden ponerse sobre intersecciones
+STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... la carretera está bloqueada o es de un solo sentido
# Station destruction related errors
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}No se puede quitar parte de la estación...
@@ -4485,6 +4544,8 @@ STR_BASESOUNDS_DOS_DESCRIPTION :Sonidos origina
STR_BASESOUNDS_WIN_DESCRIPTION :Sonidos originales de Transport Tycoon Deluxe para Windows.
STR_BASESOUNDS_NONE_DESCRIPTION :Paquete de sonidos vacío
STR_BASEMUSIC_WIN_DESCRIPTION :Música original de Transport Tycoon Deluxe para Windows.
+STR_BASEMUSIC_DOS_DESCRIPTION :Música original de Transport Tycoon Deluxe para DOS.
+STR_BASEMUSIC_TTO_DESCRIPTION :Música original de Transport Tycoon versión World Editor para DOS.
STR_BASEMUSIC_NONE_DESCRIPTION :Paquete de música vacío
##id 0x2000
diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt
index ca554caca1..1e9fe336a7 100644
--- a/src/lang/swedish.txt
+++ b/src/lang/swedish.txt
@@ -2686,6 +2686,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Ursprung
STR_ABOUT_VERSION :{BLACK}OpenTTD-version {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD-teamet
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Spara spel
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Ladda spel
@@ -4215,7 +4222,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}För må
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}För många delar på järnvägsstationen
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}För många busshållplatser
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}För många lastbryggor
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}För nära en annan station/hållplats
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}För nära en annan hamn
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}För nära en annan flygplats
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Kan inte byta namn på station...
diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt
index 6dbcb3e68d..d123db86e1 100644
--- a/src/lang/tamil.txt
+++ b/src/lang/tamil.txt
@@ -2376,6 +2376,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}அச
STR_ABOUT_VERSION :{BLACK}OpenTTD பதிப்பு {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD குழுமம்
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}ஆட்டத்தை பதிவு செய்
STR_SAVELOAD_LOAD_CAPTION :{WHITE}பதிவு செய்த ஆட்டத்தை தொடரு
@@ -3750,7 +3757,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}மி
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}மிக அதிகமான இரயில்வே நிலைய பாகங்கள்
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}மிக அதிகமான பேருந்து நிறுத்தங்கள்
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}மிக அதிகமான லாரி நிலையங்கள்
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}மற்றொரு நிலையத்திற்கு மிக அருகில் உள்ளது
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}மற்றொரு துறைமுகத்திற்கு மிக அருகில் உள்ளது
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}மற்றொரு விமான நிலையத்தின் அருகாமையில் உள்ளது
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}நிறுத்தத்தின் பெயரை மாற்ற இயலாது...
diff --git a/src/lang/thai.txt b/src/lang/thai.txt
index 4661c8ca09..878b9c26c5 100644
--- a/src/lang/thai.txt
+++ b/src/lang/thai.txt
@@ -2630,6 +2630,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}ลิ
STR_ABOUT_VERSION :{BLACK}OpenTTD รุ่นที่ {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}ลิขสิทธิ์ OpenTTD {COPYRIGHT}2002-2018 ของ The OpenTTD team
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}บันทึกเกม
STR_SAVELOAD_LOAD_CAPTION :{WHITE}โหลดเกม
@@ -4109,7 +4116,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}มี
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}ชิ้นส่วนสถานีมากเกินไป
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}ป้ายรถเมล์มากเกินไป
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}มีจุดขนถ่ายสินค้ามากเกินไป
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}ใกล้กับสถานี/จุดขนถ่ายสินค้าอื่นเกินไป
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}ใกล้กับท่าเทียบเรืออื่นมากเกินไป
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}ใกล้กับท่าอากาศยานอื่นมากเกินไป
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}ไม่สามารถเปลี่ยนชื่อได้...
diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt
index f2676f1ebd..e837d1efef 100644
--- a/src/lang/traditional_chinese.txt
+++ b/src/lang/traditional_chinese.txt
@@ -2682,6 +2682,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}原著
STR_ABOUT_VERSION :{BLACK}OpenTTD 版本 {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD 開發小組
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}儲存遊戲
STR_SAVELOAD_LOAD_CAPTION :{WHITE}載入遊戲
@@ -4196,7 +4203,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}太多
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}太多火車站元件
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}太多公車站
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}太多貨運站
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}太接近另一個車站/載貨區
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}太接近另一個碼頭
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}太接近另一個機場
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}無法修改車站名稱...
diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt
index 9d4bb12860..c7b456f68d 100644
--- a/src/lang/turkish.txt
+++ b/src/lang/turkish.txt
@@ -2687,6 +2687,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Telif ha
STR_ABOUT_VERSION :{BLACK}OpenTTD sürüm {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD ekibi
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Oyunu Kaydet
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Yükle
@@ -4216,7 +4223,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Haritada
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Çok fazla demiryolu istasyon parçası var
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Çok fazla durak var
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Çok fazla kamyon yükleme yeri var
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Başka bir istasyona çok yakın
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Başka bir limana çok yakın
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Başka bir havalimanına çok yakın
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}İsim değiştirilemiyor...
diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt
index 932d0462b8..d4f33017f1 100644
--- a/src/lang/ukrainian.txt
+++ b/src/lang/ukrainian.txt
@@ -2813,6 +2813,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Авто
STR_ABOUT_VERSION :{BLACK}OpenTTD версія {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 команда OpenTTD
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Зберегти гру
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Завантажити гру
@@ -4327,7 +4334,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Дуже
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Забагато частин залізничної станції
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Дуже багато зупинок
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Дуже багато вантажних станцій
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Дуже близько до іншої станції
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Дуже близько до іншого порту
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Дуже близько до іншого аеропорту
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Неможливо перейменувати станцію...
diff --git a/src/lang/unfinished/chuvash.txt b/src/lang/unfinished/chuvash.txt
index 600824f76a..474c328f96 100644
--- a/src/lang/unfinished/chuvash.txt
+++ b/src/lang/unfinished/chuvash.txt
@@ -970,6 +970,13 @@ STR_LAI_OBJECT_DESCRIPTION_LIGHTHOUSE :Маяк
# About OpenTTD window
STR_ABOUT_VERSION :{BLACK}OpenTTD верси {REV}
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
diff --git a/src/lang/unfinished/frisian.txt b/src/lang/unfinished/frisian.txt
index 7ee25160cb..624eec2f33 100644
--- a/src/lang/unfinished/frisian.txt
+++ b/src/lang/unfinished/frisian.txt
@@ -2470,6 +2470,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Orizjine
STR_ABOUT_VERSION :{BLACK}OpenTTD-ferzje {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 It OpenTTD team
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Spul Opslaan
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Spul Lade
@@ -3749,7 +3756,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Te folle
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Te folle stasjonsdielen
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Te folle bushaltes
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Te folle frachtstasjons
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Te ticht by in oar stasjon
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Te ticht by in oare haven
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Te ticht by in oar fleanfjild
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Kin namme fan stasjon net feroarje
diff --git a/src/lang/unfinished/ido.txt b/src/lang/unfinished/ido.txt
index a08e1c453d..114c434f36 100644
--- a/src/lang/unfinished/ido.txt
+++ b/src/lang/unfinished/ido.txt
@@ -777,6 +777,13 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_HEADQUARTERS :Stabeyo di komp
STR_ABOUT_VERSION :{BLACK}OpenTTD versiono {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 La kruo OpenTTD
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Ludo Detali
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING}
diff --git a/src/lang/unfinished/macedonian.txt b/src/lang/unfinished/macedonian.txt
index 6ee8339d75..30a0f142b1 100644
--- a/src/lang/unfinished/macedonian.txt
+++ b/src/lang/unfinished/macedonian.txt
@@ -1201,6 +1201,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Ориг
STR_ABOUT_VERSION :{BLACK}OpenTTD верзија {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 OpenTTD тимот
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_LOAD_BUTTON :{BLACK}Оптоварување
STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}Оптоварување на избраната игра
diff --git a/src/lang/unfinished/maltese.txt b/src/lang/unfinished/maltese.txt
index 20658141c5..4fc0e8cb10 100644
--- a/src/lang/unfinished/maltese.txt
+++ b/src/lang/unfinished/maltese.txt
@@ -682,6 +682,13 @@ STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Aghzel i
# About OpenTTD window
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
diff --git a/src/lang/unfinished/marathi.txt b/src/lang/unfinished/marathi.txt
index bff413d420..4576bccbae 100644
--- a/src/lang/unfinished/marathi.txt
+++ b/src/lang/unfinished/marathi.txt
@@ -1107,6 +1107,13 @@ STR_LAI_WATER_DESCRIPTION_RIVER :नदी
# About OpenTTD window
STR_ABOUT_OPENTTD :{WHITE}ओपेन टीटीडी बद्दल
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_BYTES_FREE :{BLACK}{BYTES} मोकळ
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING}
diff --git a/src/lang/unfinished/persian.txt b/src/lang/unfinished/persian.txt
index 908be68e0a..231f11af81 100644
--- a/src/lang/unfinished/persian.txt
+++ b/src/lang/unfinished/persian.txt
@@ -2386,6 +2386,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original
STR_ABOUT_VERSION :{BLACK}OpenTTD ویرایش {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 The OpenTTD team
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}ذخیره ی بازی
STR_SAVELOAD_LOAD_CAPTION :{WHITE}ادامه ی بازی
@@ -3405,7 +3412,6 @@ STR_ERROR_CAN_T_BUILD_AIRPORT_HERE :{WHITE}نمی
STR_ERROR_STATION_TOO_SPREAD_OUT :{WHITE}ایستگاه زیادی پراکنده شده است
STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}تعداد محوطه های بارگیری/ایستگاه بسیار زیاد شده
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}به محوطه ی بارگیری/ایستگاه دیگری بسیار نزدیک است
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}به بندر دیگری بسییار نزدیک است
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}به فرودگاه دیگری بسیار نزدیک شده
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}نام این ایستگاه را نمی شود تغییر داد
diff --git a/src/lang/unfinished/urdu.txt b/src/lang/unfinished/urdu.txt
index bd326251a5..b5fd180e01 100644
--- a/src/lang/unfinished/urdu.txt
+++ b/src/lang/unfinished/urdu.txt
@@ -2126,6 +2126,13 @@ STR_FOUND_TOWN_SELECT_LAYOUT_RANDOM :{G=f}{BLACK}ک
STR_ABOUT_OPENTTD :{WHITE}اوپن ٹی ٹی ڈی کے متعلق
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} ٢٠٠٢ - ٢٠١٦ OpenTTD ٹیم
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt
index 7f20bb0134..61a15d3681 100644
--- a/src/lang/vietnamese.txt
+++ b/src/lang/vietnamese.txt
@@ -475,6 +475,7 @@ STR_ABOUT_MENU_SCREENSHOT :Ảnh chụp m
STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Phóng to đầy đủ ảnh chụp màn hình
STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Phóng to mặc định ảnh chụp màn hình
STR_ABOUT_MENU_GIANT_SCREENSHOT :Ảnh màn hình toàn bản đồ
+STR_ABOUT_MENU_SHOW_FRAMERATE :Hiển thị tốc độ khung hình
STR_ABOUT_MENU_ABOUT_OPENTTD :Giới thiệu 'OpenTTD'
STR_ABOUT_MENU_SPRITE_ALIGNER :Trình điều chỉnh sprite
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Bật/tắt hiển thị khối nhà
@@ -650,6 +651,7 @@ STR_MUSIC_RULER_MARKER :{TINY_FONT}{BLA
STR_MUSIC_TRACK_NONE :{TINY_FONT}{DKGREEN}--
STR_MUSIC_TRACK_DIGIT :{TINY_FONT}{DKGREEN}{ZEROFILL_NUM}
STR_MUSIC_TITLE_NONE :{TINY_FONT}{DKGREEN}------
+STR_MUSIC_TITLE_NOMUSIC :{TINY_FONT}{DKGREEN}Không sẵn có nhạc nền
STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}"
STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Bài Nhạc
STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Tên
@@ -670,11 +672,14 @@ STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Bật/t
STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Hiện cửa số chọn bài nhạc
# Playlist window
+STR_PLAYLIST_MUSIC_SELECTION_SETNAME :{WHITE}Danh sách nhạc - '{STRING}'
STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}"
STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Bảng Bài Nhạc
STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Chương Trình - '{STRING}'
STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Xóa
+STR_PLAYLIST_CHANGE_SET :{BLACK}Tập danh sách thay đổi
STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Xóa chương trình đang chọn ("Tự chọn 1" và "Tự chọn 2")
+STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Thay đổi lựa chọn danh sách nhạc khác
STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Click vào bài nhạc để thêm vào chương trình hiện tại (cho "Tự chọn 1" hay "Tự chọn 2")
STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Click vào bài nhạc để xóa khỏi chương trình hiện tại (cho "Tự chọn 1" hay "Tự chọn 2")
@@ -810,6 +815,7 @@ STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLAC
STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDENT_NAME}{}(Giám Đốc)
STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}{STRING} Tài trợ xây dựng Thị Xã mới {TOWN}!
+STR_NEWS_NEW_TOWN_UNSPONSORED :{BLACK}{BIG_FONT}Một đô thị mới vừa được xây dựng, có tên là {TOWN}!
STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLACK}{STRING} mới đang được xây dựng gần {TOWN}!
STR_NEWS_INDUSTRY_PLANTED :{BIG_FONT}{BLACK}{STRING} được lên kế hoạch xây gần {TOWN}!
@@ -877,10 +883,10 @@ STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLAC
# Extra view window
STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Cửa sổ {COMMA}
-STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Nhìn ở cửa sổ lớn
+STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Đổi khung nhìn
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Nhìn vị trí này ở cửa sổ lớn chính
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Chuyển về cửa sổ nhỏ
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Chuyển vị trí từ cửa sổ lớn về cửa sổ nhỏ
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Chuyển về cửa sổ chính
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Sao chép vị trí từ cửa sổ này về cửa sổ lớn
# Game options window
STR_GAME_OPTIONS_CAPTION :{WHITE}Cấu Hình Trò Chơi
@@ -922,6 +928,7 @@ STR_GAME_OPTIONS_CURRENCY_ZAR :Rand Nam Phi (Z
STR_GAME_OPTIONS_CURRENCY_CUSTOM :Tùy chọn...
STR_GAME_OPTIONS_CURRENCY_GEL :Lari Georgia (GEL)
STR_GAME_OPTIONS_CURRENCY_IRR :Rial Iran (IRR)
+STR_GAME_OPTIONS_CURRENCY_RUB :Đồng Rúp Nga mới (RUB)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Xe cộ
@@ -1334,6 +1341,12 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Màu sắc củ
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Lục
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Lục tối
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Tím
+STR_CONFIG_SETTING_SCROLLMODE :Kiểu cuộn khung nhìn: {STRING}
+STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Hành xử khi kéo, cuộn bản đồ
+STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Kéo cuộn khung nhìn kiểu RMB, khoá vị trí con trỏ chuột
+STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Kéo cuộn kiểu RMB, khoá vị trí con trỏ chuột
+STR_CONFIG_SETTING_SCROLLMODE_RMB :Kéo cuộn bản đồ kiểu RMB
+STR_CONFIG_SETTING_SCROLLMODE_LMB :Kéo cuộn bản đồ kiểu LMB
STR_CONFIG_SETTING_SMOOTH_SCROLLING :Cuộn uyển chuyển cửa sổ: {STRING}
STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Điều khiển cách màn hình chính cuộn tới vị trí cụ thể khi nháy chuột vào bản đồ nhỏ hoặc khi gõ lệnh cuộn tới đối tượng trên bản đồ. Nếu bật, thì sẽ cuộn trượt, nếu tắt thì nhảy thẳng tới vị trí đó.
STR_CONFIG_SETTING_MEASURE_TOOLTIP :Hiện bảng chú giải đo lường khi dùng các công cụ xây dựng: {STRING}
@@ -2278,6 +2291,7 @@ STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Ghi chú
STR_LINKGRAPH_LEGEND_ALL :{BLACK}Tất cả
STR_LINKGRAPH_LEGEND_NONE :{BLACK}Không
STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Lựa chọn công ty nào sẽ được hiển thị
+STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY}
# Linkgraph legend window and linkgraph legend in smallmap
STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}không sử dụng
@@ -2686,6 +2700,56 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Nguyên
STR_ABOUT_VERSION :{BLACK}OpenTTD phiên bản {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 Nhóm OpenTTD
+# Framerate display window
+STR_FRAMERATE_CAPTION :{WHITE}Tốc độ khung hình
+STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} ({DECIMAL}x)
+STR_FRAMERATE_RATE_GAMELOOP :{WHITE}Tốc độ khung giả lập game: {STRING}
+STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP :{BLACK}Số nhịp đếm giả lập trong mỗi giây
+STR_FRAMERATE_RATE_BLITTER :{WHITE}Tốc độ khung hình: {STRING}
+STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}Số khu hình vẽ lại mỗi giây.
+STR_FRAMERATE_SPEED_FACTOR :{WHITE}Chỉ số vận tốc game hiện tại: {DECIMAL}x
+STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Tốc độ chạy game hiện tại, so với tốc độ bình thường
+STR_FRAMERATE_CURRENT :{WHITE}Hiện tại
+STR_FRAMERATE_AVERAGE :{WHITE}Trung bình
+STR_FRAMERATE_DATA_POINTS :{WHITE}Dữ liệu được tính theo số đo {COMMA}
+STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL}{WHITE} ms
+STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL}{WHITE} ms
+STR_FRAMERATE_MS_BAD :{RED}{DECIMAL}{WHITE} ms
+STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL}{WHITE} khung/s
+STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL}{WHITE} khung/s
+STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL}{WHITE} khung/s
+STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA} ms
+STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} s
+############ Leave those lines in this order!!
+STR_FRAMERATE_GAMELOOP :{WHITE}Tổng vòng lặp khung hình game:
+STR_FRAMERATE_GL_ECONOMY :{WHITE} Xử lý bốc dỡ hàng:
+STR_FRAMERATE_GL_TRAINS :{WHITE} Nhịp của tàu hoả:
+STR_FRAMERATE_GL_ROADVEHS :{WHITE} Nhịp của xe ô-tô
+STR_FRAMERATE_GL_SHIPS :{WHITE} Số nhịp của tàu thủy:
+STR_FRAMERATE_GL_AIRCRAFT :{WHITE} Số nhịp của máy bay:
+STR_FRAMERATE_GL_LANDSCAPE :{WHITE} Nhịp của bản đồ game:
+STR_FRAMERATE_GL_LINKGRAPH :{WHITE} Độ trễ tính toán đồ thị:
+STR_FRAMERATE_DRAWING :{WHITE}Cách vẽ đồ hoạ game:
+STR_FRAMERATE_DRAWING_VIEWPORTS :{WHITE} Khung nhìn toàn bản đồ:
+STR_FRAMERATE_VIDEO :Nguồn xuất hình:
+STR_FRAMERATE_SOUND :{WHITE}Trộn âm thanh:
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+STR_FRAMETIME_CAPTION_GAMELOOP :Vòng lặp khung hình game
+STR_FRAMETIME_CAPTION_GL_ECONOMY :Bốc dỡ hàng
+STR_FRAMETIME_CAPTION_GL_TRAINS :Nhịp cho tàu hoả
+STR_FRAMETIME_CAPTION_GL_ROADVEHS :Số nhịp xe ôtô
+STR_FRAMETIME_CAPTION_GL_SHIPS :Nhịp của tàu thủy
+STR_FRAMETIME_CAPTION_GL_AIRCRAFT :Nhịp cho máy bay
+STR_FRAMETIME_CAPTION_GL_LANDSCAPE :Nhịp của bản đồ
+STR_FRAMETIME_CAPTION_GL_LINKGRAPH :Độ trễ tính toán đồ thị
+STR_FRAMETIME_CAPTION_DRAWING :Cách vẽ đồ hoạ game
+STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Khung vẽ cả bản đồ game
+STR_FRAMETIME_CAPTION_VIDEO :Ngõ xuất hình
+STR_FRAMETIME_CAPTION_SOUND :Trộn âm thanh
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Lưu Ván Chơi
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Nạp Ván Chơi
@@ -2970,6 +3034,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Nhập t
STR_TOWN_DIRECTORY_CAPTION :{WHITE}Đô Thị
STR_TOWN_DIRECTORY_NONE :{ORANGE}- Không Có -
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA})
+STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (đô thị){BLACK} ({COMMA})
STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Tên các đô thị - nháy vào tên để xem trung tâm đô thị. Ctrl+Click mở cửa sổ mới về vị trí đô thị
STR_TOWN_POPULATION :{BLACK}Dân số thế giới: {COMMA}
@@ -2977,6 +3042,7 @@ STR_TOWN_POPULATION :{BLACK}Dân s
STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN}
STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Thành Phố)
STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Dân số: {ORANGE}{COMMA}{BLACK} Toà nhà: {ORANGE}{COMMA}
+STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} tháng trước: {ORANGE}{COMMA}{BLACK} tối đa: {ORANGE}{COMMA}
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Hàng hoá cần để đô thị tăng trưởng:
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} được yêu cầu
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} Yêu cầu trong mùa đông
@@ -4215,7 +4281,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Quá nhi
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Quá nhiều mảnh của ga tàu hoả
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Quá nhiều điểm đừng xe buýt
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Quá nhiều trạm bốc dỡ hàng xe tải
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Quá sát với một bến khác
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Quá sát với hải cảng khác
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Quá sát với sân bay khác
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Không thể đổi tên ga, bến,cảng...
@@ -4223,6 +4288,7 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... đâ
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... đường quay mặt sai hướng
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... đi qua điểm dừng không thể đi qua góc
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... đi qua điểm dừng không thể có ngã rẽ
+STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... đường 1 chiều hoặc bị chặn
# Station destruction related errors
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Không thể xoá bỏ một phần của ga...
@@ -4474,6 +4540,8 @@ STR_BASESOUNDS_DOS_DESCRIPTION :Âm thanh gốc
STR_BASESOUNDS_WIN_DESCRIPTION :Âm thanh gốc từ phiên bản Transport Tycoon Deluxe trên Windows
STR_BASESOUNDS_NONE_DESCRIPTION :Gói âm thanh này không có âm thanh nào.
STR_BASEMUSIC_WIN_DESCRIPTION :Nhạc gốc từ phiên bản Transport Tycoon Deluxe trên Windows
+STR_BASEMUSIC_DOS_DESCRIPTION :Nhạc của nguyên bản Transport Tycoon Deluxe cho DOS.
+STR_BASEMUSIC_TTO_DESCRIPTION :Nhạc của nguyên bản Transport Tycoon (Original/World Editor) cho DOS.
STR_BASEMUSIC_NONE_DESCRIPTION :Gói âm nhạc này không có nhạc nào.
##id 0x2000
diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt
index 0a076afe4d..9561354fb0 100644
--- a/src/lang/welsh.txt
+++ b/src/lang/welsh.txt
@@ -2686,6 +2686,13 @@ STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Hawlfrai
STR_ABOUT_VERSION :{BLACK}fersiwn OpenTTD {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 Y tîm OpenTTD
+# Framerate display window
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+############ Leave those lines in this order!!
+############ End of leave-in-this-order
+
+
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Cadw Gêm
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Llwytho Gêm
@@ -4215,7 +4222,6 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Gormod o
STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Mae gan yr orsaf ormod o rannau
STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Gormod o arosfannau bysus
STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Gormod o orsafoedd lorïau
-STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Rhy agos i orsaf/ardal lwytho
STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Rhy agos i ddoc arall
STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Rhy agos i faes awyr arall
STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Methu ailenwi gorsaf...
diff --git a/src/linkgraph/demands.cpp b/src/linkgraph/demands.cpp
index f4afbabf0a..f1b714820b 100644
--- a/src/linkgraph/demands.cpp
+++ b/src/linkgraph/demands.cpp
@@ -115,7 +115,6 @@ public:
* Check if there is any acceptance left for this node. In asymmetric distribution
* nodes always accept as long as their demand > 0.
* @param to The node to be checked.
- * @param to_anno Unused.
*/
inline bool HasDemandLeft(const Node &to) { return to.Demand() > 0; }
};
diff --git a/src/linkgraph/demands.h b/src/linkgraph/demands.h
index c3d9dc7cda..8a639b8b15 100644
--- a/src/linkgraph/demands.h
+++ b/src/linkgraph/demands.h
@@ -30,7 +30,7 @@ public:
/**
* Call the demand calculator on the given component.
- * @param graph Component to calculate the demands for.
+ * @param job Component to calculate the demands for.
*/
virtual void Run(LinkGraphJob &job) const { DemandCalculator c(job); }
diff --git a/src/linkgraph/flowmapper.cpp b/src/linkgraph/flowmapper.cpp
index 4b974a809e..b78b30335e 100644
--- a/src/linkgraph/flowmapper.cpp
+++ b/src/linkgraph/flowmapper.cpp
@@ -16,7 +16,7 @@
/**
* Map the paths generated by the MCF solver into flows associated with nodes.
- * @param component the link graph component to be used.
+ * @param job the link graph component to be used.
*/
void FlowMapper::Run(LinkGraphJob &job) const
{
diff --git a/src/linkgraph/linkgraph.cpp b/src/linkgraph/linkgraph.cpp
index 50945d361f..34b3a4aa09 100644
--- a/src/linkgraph/linkgraph.cpp
+++ b/src/linkgraph/linkgraph.cpp
@@ -252,8 +252,6 @@ void LinkGraph::Node::RemoveEdge(NodeID to)
* least the given capacity and usage, otherwise add the capacity and usage.
* In any case set the respective update timestamp(s), according to the given
* mode.
- * @param from Start node of the edge.
- * @param to End node of the edge.
* @param capacity Capacity to be added/updated.
* @param usage Usage to be added.
* @param mode Update mode to be applied.
diff --git a/src/linkgraph/linkgraph_gui.cpp b/src/linkgraph/linkgraph_gui.cpp
index c91fa20588..30c4451ee7 100644
--- a/src/linkgraph/linkgraph_gui.cpp
+++ b/src/linkgraph/linkgraph_gui.cpp
@@ -425,7 +425,7 @@ LinkGraphLegendWindow::LinkGraphLegendWindow(WindowDesc *desc, int window_number
/**
* Set the overlay belonging to this menu and import its company/cargo settings.
- * @params overlay New overlay for this menu.
+ * @param overlay New overlay for this menu.
*/
void LinkGraphLegendWindow::SetOverlay(LinkGraphOverlay *overlay) {
this->overlay = overlay;
diff --git a/src/linkgraph/linkgraphschedule.cpp b/src/linkgraph/linkgraphschedule.cpp
index a65783a5e7..8c508d8173 100644
--- a/src/linkgraph/linkgraphschedule.cpp
+++ b/src/linkgraph/linkgraphschedule.cpp
@@ -15,6 +15,7 @@
#include "demands.h"
#include "mcf.h"
#include "flowmapper.h"
+#include "../framerate_type.h"
#include "../safeguards.h"
@@ -151,6 +152,7 @@ void OnTick_LinkGraph()
if (offset == 0) {
LinkGraphSchedule::instance.SpawnNext();
} else if (offset == _settings_game.linkgraph.recalc_interval / 2) {
+ PerformanceMeasurer framerate(PFE_GL_LINKGRAPH);
LinkGraphSchedule::instance.JoinNext();
}
}
diff --git a/src/linkgraph/mcf.cpp b/src/linkgraph/mcf.cpp
index ecdf792afe..544584ef61 100644
--- a/src/linkgraph/mcf.cpp
+++ b/src/linkgraph/mcf.cpp
@@ -193,7 +193,7 @@ public:
* Determines if an extension to the given Path with the given parameters is
* better than this path.
* @param base Other path.
- * @param cap Capacity of the new edge to be added to base.
+ * @param free_cap Capacity of the new edge to be added to base.
* @param dist Distance of the new edge.
* @return True if base + the new edge would be better than the path associated
* with this annotation.
@@ -227,7 +227,7 @@ bool DistanceAnnotation::IsBetter(const DistanceAnnotation *base, uint cap,
* Determines if an extension to the given Path with the given parameters is
* better than this path.
* @param base Other path.
- * @param cap Capacity of the new edge to be added to base.
+ * @param free_cap Capacity of the new edge to be added to base.
* @param dist Distance of the new edge.
* @return True if base + the new edge would be better than the path associated
* with this annotation.
diff --git a/src/map_type.h b/src/map_type.h
index 620885e5da..0c57d37700 100644
--- a/src/map_type.h
+++ b/src/map_type.h
@@ -33,8 +33,9 @@ assert_compile(sizeof(Tile) == 8);
* Look at docs/landscape.html for the exact meaning of the members.
*/
struct TileExtended {
- byte m6; ///< General purpose
- byte m7; ///< Primarily used for newgrf support
+ byte m6; ///< General purpose
+ byte m7; ///< Primarily used for newgrf support
+ uint16 m8; ///< General purpose
};
/**
@@ -70,7 +71,7 @@ static const uint MAX_MAP_SIZE = 1 << MAX_MAP_SIZE_BITS; ///< Maximal map s
* Approximation of the length of a straight track, relative to a diagonal
* track (ie the size of a tile side).
*
- * #defined instead of const so it can
+ * \#defined instead of const so it can
* stay integer. (no runtime float operations) Is this needed?
* Watch out! There are _no_ brackets around here, to prevent intermediate
* rounding! Be careful when using this!
diff --git a/src/misc/dbg_helpers.cpp b/src/misc/dbg_helpers.cpp
index a80230de1c..22ccfa3464 100644
--- a/src/misc/dbg_helpers.cpp
+++ b/src/misc/dbg_helpers.cpp
@@ -117,7 +117,7 @@ void DumpTarget::WriteIndent()
}
}
-/** Write a line with indent at the beginning and at the end. */
+/** Write a line with indent at the beginning and \ at the end. */
void DumpTarget::WriteLine(const char *format, ...)
{
WriteIndent();
@@ -143,7 +143,7 @@ void DumpTarget::WriteTile(const char *name, TileIndex tile)
}
/**
- * Open new structure (one level deeper than the current one) 'name = {'.
+ * Open new structure (one level deeper than the current one) 'name = {\'.
*/
void DumpTarget::BeginStruct(size_t type_id, const char *name, const void *ptr)
{
@@ -167,7 +167,7 @@ void DumpTarget::BeginStruct(size_t type_id, const char *name, const void *ptr)
}
/**
- * Close structure '}'.
+ * Close structure '}\'.
*/
void DumpTarget::EndStruct()
{
diff --git a/src/misc/getoptdata.h b/src/misc/getoptdata.h
index 5982f01fb8..4ce916aa1e 100644
--- a/src/misc/getoptdata.h
+++ b/src/misc/getoptdata.h
@@ -34,7 +34,7 @@ struct GetOptData {
int numleft; ///< Number of arguments left in #argv.
char **argv; ///< Remaining command line arguments.
const OptionData *options; ///< Command line option descriptions.
- char *cont; ///< Next call to #MyGetOpt should start here (in the middle of an argument).
+ char *cont; ///< Next call to #GetOpt should start here (in the middle of an argument).
/**
* Constructor of the data store.
diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp
index dd75410628..b122d172d1 100644
--- a/src/misc_gui.cpp
+++ b/src/misc_gui.cpp
@@ -132,6 +132,7 @@ public:
DEBUG(misc, LANDINFOD_LEVEL, "m5 = %#x", _m[tile].m5);
DEBUG(misc, LANDINFOD_LEVEL, "m6 = %#x", _me[tile].m6);
DEBUG(misc, LANDINFOD_LEVEL, "m7 = %#x", _me[tile].m7);
+ DEBUG(misc, LANDINFOD_LEVEL, "m8 = %#x", _me[tile].m8);
#undef LANDINFOD_LEVEL
}
@@ -193,11 +194,8 @@ public:
StringID str = STR_LAND_AREA_INFORMATION_COST_TO_CLEAR_N_A;
Company *c = Company::GetIfValid(_local_company);
if (c != NULL) {
- Money old_money = c->money;
- c->money = INT64_MAX;
assert(_current_company == _local_company);
- CommandCost costclear = DoCommand(tile, 0, 0, DC_NONE, CMD_LANDSCAPE_CLEAR);
- c->money = old_money;
+ CommandCost costclear = DoCommand(tile, 0, 0, DC_QUERY_COST, CMD_LANDSCAPE_CLEAR);
if (costclear.Succeeded()) {
Money cost = costclear.GetCost();
if (cost < 0) {
@@ -401,6 +399,7 @@ static const char * const _credits[] = {
" Christoph Elsenhans (frosch) - General coding (since 0.6)",
" Lo\xC3\xAF""c Guilloux (glx) - General / Windows Expert (since 0.4.5)",
" Michael Lutz (michi_cc) - Path based signals (since 0.7)",
+ " Niels Martin Hansen (nielsm) - Music system, general coding (since 1.9)",
" Owen Rudge (orudge) - Forum host, OS/2 port (since 0.1)",
" Peter Nelson (peter1138) - Spiritual descendant from NewGRF gods (since 0.4.5)",
" Ingo von Borstel (planetmaker) - General, Support (since 1.1)",
@@ -734,7 +733,7 @@ struct TooltipsWindow : public Window
* @param str String to be displayed
* @param paramcount number of params to deal with
* @param params (optional) up to 5 pieces of additional information that may be added to a tooltip
- * @param use_left_mouse_button close the tooltip when the left (true) or right (false) mouse button is released
+ * @param close_tooltip when the left (true) or right (false) mouse button is released
*/
void GuiShowTooltips(Window *parent, StringID str, uint paramcount, const uint64 params[], TooltipCloseCondition close_tooltip)
{
@@ -1070,7 +1069,7 @@ void ShowQueryString(StringID str, StringID caption, uint maxsize, Window *paren
*/
struct QueryWindow : public Window {
QueryCallbackProc *proc; ///< callback function executed on closing of popup. Window* points to parent, bool is true if 'yes' clicked, false otherwise
- uint64 params[10]; ///< local copy of _decode_parameters
+ uint64 params[10]; ///< local copy of #_global_string_params
StringID message; ///< message shown for query window
StringID caption; ///< title of window
diff --git a/src/mixer.cpp b/src/mixer.cpp
index 5945bd235a..6014f6082e 100644
--- a/src/mixer.cpp
+++ b/src/mixer.cpp
@@ -12,8 +12,10 @@
#include "stdafx.h"
#include
#include "core/math_func.hpp"
+#include "framerate_type.h"
#include "safeguards.h"
+#include "mixer.h"
struct MixerChannel {
bool active;
@@ -37,6 +39,7 @@ struct MixerChannel {
static MixerChannel _channels[8];
static uint32 _play_rate = 11025;
static uint32 _max_size = UINT_MAX;
+static MxStreamCallback _music_stream = NULL;
/**
* The theoretical maximum volume for a single sound sample. Multiple sound
@@ -138,11 +141,21 @@ static void MxCloseChannel(MixerChannel *mc)
void MxMixSamples(void *buffer, uint samples)
{
+ PerformanceMeasurer framerate(PFE_SOUND);
+ static uint last_samples = 0;
+ if (samples != last_samples) {
+ framerate.SetExpectedRate((double)_play_rate / samples);
+ last_samples = samples;
+ }
+
MixerChannel *mc;
/* Clear the buffer */
memset(buffer, 0, sizeof(int16) * 2 * samples);
+ /* Fetch music if a sampled stream is available */
+ if (_music_stream) _music_stream((int16*)buffer, samples);
+
/* Mix each channel */
for (mc = _channels; mc != endof(_channels); mc++) {
if (mc->active) {
@@ -207,6 +220,17 @@ void MxSetChannelVolume(MixerChannel *mc, uint volume, float pan)
void MxActivateChannel(MixerChannel *mc)
{
mc->active = true;
+}
+
+/**
+ * Set source of PCM music
+ * @param music_callback Function that will be called to fill sample buffers with music data.
+ * @return Sample rate of mixer, which the buffers supplied to the callback must be rendered at.
+ */
+uint32 MxSetMusicSource(MxStreamCallback music_callback)
+{
+ _music_stream = music_callback;
+ return _play_rate;
}
@@ -214,5 +238,6 @@ bool MxInitialize(uint rate)
{
_play_rate = rate;
_max_size = UINT_MAX / _play_rate;
+ _music_stream = NULL; /* rate may have changed, any music source is now invalid */
return true;
}
diff --git a/src/mixer.h b/src/mixer.h
index 0ccee61092..9766682d6b 100644
--- a/src/mixer.h
+++ b/src/mixer.h
@@ -14,6 +14,14 @@
struct MixerChannel;
+/**
+ * Type of callback functions for supplying PCM music.
+ * A music decoder/renderer implements this function and installs it with MxSetMusicSource, which also returns the sample rate used.
+ * @param buffer Pointer to interleaved 2-channel signed 16 bit PCM data buffer, guaranteed to be 0-initialized.
+ * @param samples number of samples that must be filled into \c buffer.
+ */
+typedef void(*MxStreamCallback)(int16 *buffer, size_t samples);
+
bool MxInitialize(uint rate);
void MxMixSamples(void *buffer, uint samples);
@@ -22,4 +30,6 @@ void MxSetChannelRawSrc(MixerChannel *mc, int8 *mem, size_t size, uint rate, boo
void MxSetChannelVolume(MixerChannel *mc, uint volume, float pan);
void MxActivateChannel(MixerChannel*);
+uint32 MxSetMusicSource(MxStreamCallback music_callback);
+
#endif /* MIXER_H */
diff --git a/src/music/cocoa_m.cpp b/src/music/cocoa_m.cpp
index 8d97aedf06..2416cade0f 100644
--- a/src/music/cocoa_m.cpp
+++ b/src/music/cocoa_m.cpp
@@ -22,13 +22,9 @@
#include "../debug.h"
#include "../base_media_base.h"
-#define Rect OTTDRect
-#define Point OTTDPoint
#include
#include
#include
-#undef Rect
-#undef Point
#include "../safeguards.h"
diff --git a/src/music/dmusic.cpp b/src/music/dmusic.cpp
index d48f51e85f..fece709fda 100644
--- a/src/music/dmusic.cpp
+++ b/src/music/dmusic.cpp
@@ -29,11 +29,13 @@
#include
#include
#include
+#include
#include "../safeguards.h"
-#pragma comment(lib, "ole32.lib")
-
+#if defined(_MSC_VER)
+# pragma comment(lib, "ole32.lib")
+#endif /* defined(_MSC_VER) */
static const int MS_TO_REFTIME = 1000 * 10; ///< DirectMusic time base is 100 ns.
static const int MIDITIME_TO_REFTIME = 10; ///< Time base of the midi file reader is 1 us.
@@ -102,21 +104,19 @@ private:
bool ReadDLSWave(FILE *f, DWORD list_length, long offset);
};
-#pragma pack(2)
/** A RIFF chunk header. */
-struct ChunkHeader {
+PACK_N(struct ChunkHeader {
FOURCC type; ///< Chunk type.
DWORD length; ///< Length of the chunk, not including the chunk header itself.
-};
+}, 2);
/** Buffer format for a DLS wave download. */
-struct WAVE_DOWNLOAD {
+PACK_N(struct WAVE_DOWNLOAD {
DMUS_DOWNLOADINFO dlInfo;
ULONG ulOffsetTable[2];
DMUS_WAVE dmWave;
DMUS_WAVEDATA dmWaveData;
-};
-#pragma pack()
+}, 2);
struct PlaybackSegment {
uint32 start, end;
@@ -233,7 +233,7 @@ bool DLSFile::ReadDLSRegion(FILE *f, DWORD list_length, std::vector &
break;
default:
- DEBUG(driver, 7, "DLS: Ignoring unkown chunk %c%c%c%c", chunk.type & 0xFF, (chunk.type >> 8) & 0xFF, (chunk.type >> 16) & 0xFF, (chunk.type >> 24) & 0xFF);
+ DEBUG(driver, 7, "DLS: Ignoring unkown chunk %c%c%c%c", (char)(chunk.type & 0xFF), (char)((chunk.type >> 8) & 0xFF), (char)((chunk.type >> 16) & 0xFF), (char)((chunk.type >> 24) & 0xFF));
fseek(f, chunk.length, SEEK_CUR);
break;
}
@@ -256,11 +256,11 @@ bool DLSFile::ReadDLSRegionList(FILE *f, DWORD list_length, DLSInstrument &instr
if (list_type == FOURCC_RGN) {
this->ReadDLSRegion(f, chunk.length - sizeof(list_type), instrument.regions);
} else {
- DEBUG(driver, 7, "DLS: Ignoring unkown list chunk of type %c%c%c%c", list_type & 0xFF, (list_type >> 8) & 0xFF, (list_type >> 16) & 0xFF, (list_type >> 24) & 0xFF);
+ DEBUG(driver, 7, "DLS: Ignoring unkown list chunk of type %c%c%c%c", (char)(list_type & 0xFF), (char)((list_type >> 8) & 0xFF), (char)((list_type >> 16) & 0xFF), (char)((list_type >> 24) & 0xFF));
fseek(f, chunk.length - sizeof(list_type), SEEK_CUR);
}
} else {
- DEBUG(driver, 7, "DLS: Ignoring chunk %c%c%c%c", chunk.type & 0xFF, (chunk.type >> 8) & 0xFF, (chunk.type >> 16) & 0xFF, (chunk.type >> 24) & 0xFF);
+ DEBUG(driver, 7, "DLS: Ignoring chunk %c%c%c%c", (char)(chunk.type & 0xFF), (char)((chunk.type >> 8) & 0xFF), (char)((chunk.type >> 16) & 0xFF), (char)((chunk.type >> 24) & 0xFF));
fseek(f, chunk.length, SEEK_CUR);
}
}
@@ -303,7 +303,7 @@ bool DLSFile::ReadDLSInstrument(FILE *f, DWORD list_length)
break;
default:
- DEBUG(driver, 7, "DLS: Ignoring unkown chunk %c%c%c%c", chunk.type & 0xFF, (chunk.type >> 8) & 0xFF, (chunk.type >> 16) & 0xFF, (chunk.type >> 24) & 0xFF);
+ DEBUG(driver, 7, "DLS: Ignoring unkown chunk %c%c%c%c", (char)(chunk.type & 0xFF), (char)((chunk.type >> 8) & 0xFF), (char)((chunk.type >> 16) & 0xFF), (char)((chunk.type >> 24) & 0xFF));
fseek(f, chunk.length, SEEK_CUR);
break;
}
@@ -328,11 +328,11 @@ bool DLSFile::ReadDLSInstrumentList(FILE *f, DWORD list_length)
if (!this->ReadDLSInstrument(f, chunk.length - sizeof(list_type))) return false;
} else {
- DEBUG(driver, 7, "DLS: Ignoring unkown list chunk of type %c%c%c%c", list_type & 0xFF, (list_type >> 8) & 0xFF, (list_type >> 16) & 0xFF, (list_type >> 24) & 0xFF);
+ DEBUG(driver, 7, "DLS: Ignoring unkown list chunk of type %c%c%c%c", (char)(list_type & 0xFF), (char)((list_type >> 8) & 0xFF), (char)((list_type >> 16) & 0xFF), (char)((list_type >> 24) & 0xFF));
fseek(f, chunk.length - sizeof(list_type), SEEK_CUR);
}
} else {
- DEBUG(driver, 7, "DLS: Ignoring chunk %c%c%c%c", chunk.type & 0xFF, (chunk.type >> 8) & 0xFF, (chunk.type >> 16) & 0xFF, (chunk.type >> 24) & 0xFF);
+ DEBUG(driver, 7, "DLS: Ignoring chunk %c%c%c%c", (char)(chunk.type & 0xFF), (char)((chunk.type >> 8) & 0xFF), (char)((chunk.type >> 16) & 0xFF), (char)((chunk.type >> 24) & 0xFF));
fseek(f, chunk.length, SEEK_CUR);
}
}
@@ -391,7 +391,7 @@ bool DLSFile::ReadDLSWave(FILE *f, DWORD list_length, long offset)
break;
default:
- DEBUG(driver, 7, "DLS: Ignoring unkown chunk %c%c%c%c", chunk.type & 0xFF, (chunk.type >> 8) & 0xFF, (chunk.type >> 16) & 0xFF, (chunk.type >> 24) & 0xFF);
+ DEBUG(driver, 7, "DLS: Ignoring unkown chunk %c%c%c%c", (char)(chunk.type & 0xFF), (char)((chunk.type >> 8) & 0xFF), (char)((chunk.type >> 16) & 0xFF), (char)((chunk.type >> 24) & 0xFF));
fseek(f, chunk.length, SEEK_CUR);
break;
}
@@ -420,11 +420,11 @@ bool DLSFile::ReadDLSWaveList(FILE *f, DWORD list_length)
if (!this->ReadDLSWave(f, chunk.length - sizeof(list_type), chunk_offset - base_offset)) return false;
} else {
- DEBUG(driver, 7, "DLS: Ignoring unkown list chunk of type %c%c%c%c", list_type & 0xFF, (list_type >> 8) & 0xFF, (list_type >> 16) & 0xFF, (list_type >> 24) & 0xFF);
+ DEBUG(driver, 7, "DLS: Ignoring unkown list chunk of type %c%c%c%c", (char)(list_type & 0xFF), (char)((list_type >> 8) & 0xFF), (char)((list_type >> 16) & 0xFF), (char)((list_type >> 24) & 0xFF));
fseek(f, chunk.length - sizeof(list_type), SEEK_CUR);
}
} else {
- DEBUG(driver, 7, "DLS: Ignoring chunk %c%c%c%c", chunk.type & 0xFF, (chunk.type >> 8) & 0xFF, (chunk.type >> 16) & 0xFF, (chunk.type >> 24) & 0xFF);
+ DEBUG(driver, 7, "DLS: Ignoring chunk %c%c%c%c", (char)(chunk.type & 0xFF), (char)((chunk.type >> 8) & 0xFF), (char)((chunk.type >> 16) & 0xFF), (char)((chunk.type >> 24) & 0xFF));
fseek(f, chunk.length, SEEK_CUR);
}
}
@@ -499,7 +499,7 @@ bool DLSFile::LoadFile(const TCHAR *file)
break;
default:
- DEBUG(driver, 7, "DLS: Ignoring unkown chunk %c%c%c%c", chunk.type & 0xFF, (chunk.type >> 8) & 0xFF, (chunk.type >> 16) & 0xFF, (chunk.type >> 24) & 0xFF);
+ DEBUG(driver, 7, "DLS: Ignoring unkown chunk %c%c%c%c", (char)(chunk.type & 0xFF), (char)((chunk.type >> 8) & 0xFF), (char)((chunk.type >> 16) & 0xFF), (char)((chunk.type >> 24) & 0xFF));
fseek(f, chunk.length, SEEK_CUR);
break;
}
@@ -605,7 +605,7 @@ static void MidiThreadProc(void *)
REFERENCE_TIME playback_start_time; // timestamp current file began playback
MidiFile current_file; // file currently being played from
PlaybackSegment current_segment; // segment info for current playback
- size_t current_block; // next block index to send
+ size_t current_block = 0; // next block index to send
byte current_volume = 0; // current effective volume setting
byte channel_volumes[16]; // last seen volume controller values in raw data
@@ -743,13 +743,13 @@ static void MidiThreadProc(void *)
if (block.realtime * MIDITIME_TO_REFTIME > playback_time + 3 *_playback.preload_time * MS_TO_REFTIME) {
/* Stop the thread loop until we are at the preload time of the next block. */
next_timeout = Clamp(((int64)block.realtime * MIDITIME_TO_REFTIME - playback_time) / MS_TO_REFTIME - _playback.preload_time, 0, 1000);
- DEBUG(driver, 9, "DMusic thread: Next event in %u ms (music %u, ref %lld)", next_timeout, block.realtime * MIDITIME_TO_REFTIME, playback_time);
+ DEBUG(driver, 9, "DMusic thread: Next event in %lu ms (music %u, ref " OTTD_PRINTF64 ")", next_timeout, block.realtime * MIDITIME_TO_REFTIME, playback_time);
break;
}
/* Timestamp of the current block. */
block_time = playback_start_time + block.realtime * MIDITIME_TO_REFTIME;
- DEBUG(driver, 9, "DMusic thread: Streaming block %Iu (cur=%lld, block=%lld)", current_block, (long long)(current_time / MS_TO_REFTIME), (long long)(block_time / MS_TO_REFTIME));
+ DEBUG(driver, 9, "DMusic thread: Streaming block " PRINTF_SIZE " (cur=" OTTD_PRINTF64 ", block=" OTTD_PRINTF64 ")", current_block, (long long)(current_time / MS_TO_REFTIME), (long long)(block_time / MS_TO_REFTIME));
byte *data = block.data.Begin();
size_t remaining = block.data.Length();
@@ -1015,7 +1015,7 @@ static const char *LoadDefaultDLSFile(const char *user_dls)
DMUS_INSTRUMENT *inst_data = (DMUS_INSTRUMENT *)instrument;
MemSetT(inst_data, 0);
offset_table[last_offset++] = (char *)inst_data - inst_base;
- inst_data->ulPatch = dls_file.instruments[i].hdr.Locale.ulBank & F_INSTRUMENT_DRUMS | ((dls_file.instruments[i].hdr.Locale.ulBank & 0x7F7F) << 8) | dls_file.instruments[i].hdr.Locale.ulInstrument & 0x7F;
+ inst_data->ulPatch = (dls_file.instruments[i].hdr.Locale.ulBank & F_INSTRUMENT_DRUMS) | ((dls_file.instruments[i].hdr.Locale.ulBank & 0x7F7F) << 8) | (dls_file.instruments[i].hdr.Locale.ulInstrument & 0x7F);
instrument = inst_data + 1;
/* Write global articulations. */
diff --git a/src/music/fluidsynth.cpp b/src/music/fluidsynth.cpp
new file mode 100644
index 0000000000..d1088f4bc4
--- /dev/null
+++ b/src/music/fluidsynth.cpp
@@ -0,0 +1,155 @@
+/* $Id$ */
+
+/*
+ * 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 fluidsynth.cpp Playing music via the fluidsynth library. */
+
+#include "../stdafx.h"
+#include "../openttd.h"
+#include "../sound_type.h"
+#include "../debug.h"
+#include "fluidsynth.h"
+#include "midifile.hpp"
+#include
+#include "../mixer.h"
+
+static struct {
+ fluid_settings_t* settings; ///< FluidSynth settings handle
+ fluid_synth_t* synth; ///< FluidSynth synthesizer handle
+ fluid_player_t* player; ///< FluidSynth MIDI player handle
+} _midi; ///< Metadata about the midi we're playing.
+
+/** Factory for the FluidSynth driver. */
+static FMusicDriver_FluidSynth iFMusicDriver_FluidSynth;
+
+/** List of sound fonts to try by default. */
+static const char *default_sf[] = {
+ /* Debian/Ubuntu/OpenSUSE preferred */
+ "/usr/share/sounds/sf2/FluidR3_GM.sf2",
+
+ /* RedHat/Fedora/Arch preferred */
+ "/usr/share/soundfonts/FluidR3_GM.sf2",
+
+ /* Debian/Ubuntu/OpenSUSE alternatives */
+ "/usr/share/sounds/sf2/TimGM6mb.sf2",
+ "/usr/share/sounds/sf2/FluidR3_GS.sf2",
+
+ NULL
+};
+
+static void RenderMusicStream(int16 *buffer, size_t samples)
+{
+ if (!_midi.synth || !_midi.player) return;
+ fluid_synth_write_s16(_midi.synth, samples, buffer, 0, 2, buffer, 1, 2);
+}
+
+const char *MusicDriver_FluidSynth::Start(const char * const *param)
+{
+ const char *sfont_name = GetDriverParam(param, "soundfont");
+ int sfont_id;
+
+ DEBUG(driver, 1, "Fluidsynth: sf %s", sfont_name);
+
+ /* Create the settings. */
+ _midi.settings = new_fluid_settings();
+ if (!_midi.settings) return "Could not create midi settings";
+
+ /* Create the synthesizer. */
+ _midi.synth = new_fluid_synth(_midi.settings);
+ if (!_midi.synth) return "Could not open synth";
+
+ /* Load a SoundFont and reset presets (so that new instruments
+ * get used from the SoundFont) */
+ if (!sfont_name) {
+ int i;
+ sfont_id = FLUID_FAILED;
+ for (i = 0; default_sf[i]; i++) {
+ if (!fluid_is_soundfont(default_sf[i])) continue;
+ sfont_id = fluid_synth_sfload(_midi.synth, default_sf[i], 1);
+ if (sfont_id != FLUID_FAILED) break;
+ }
+ if (sfont_id == FLUID_FAILED) return "Could not open any sound font";
+ } else {
+ sfont_id = fluid_synth_sfload(_midi.synth, sfont_name, 1);
+ if (sfont_id == FLUID_FAILED) return "Could not open sound font";
+ }
+
+ _midi.player = NULL;
+
+ uint32 samplerate = MxSetMusicSource(RenderMusicStream);
+ fluid_synth_set_sample_rate(_midi.synth, samplerate);
+ DEBUG(driver, 1, "Fluidsynth: samplerate %.0f", (float)samplerate);
+
+ return NULL;
+}
+
+void MusicDriver_FluidSynth::Stop()
+{
+ MxSetMusicSource(NULL);
+ this->StopSong();
+ delete_fluid_synth(_midi.synth);
+ delete_fluid_settings(_midi.settings);
+}
+
+void MusicDriver_FluidSynth::PlaySong(const MusicSongInfo &song)
+{
+ std::string filename = MidiFile::GetSMFFile(song);
+
+ this->StopSong();
+
+ if (filename.empty()) {
+ return;
+ }
+
+ _midi.player = new_fluid_player(_midi.synth);
+ if (!_midi.player) {
+ DEBUG(driver, 0, "Could not create midi player");
+ return;
+ }
+
+ if (fluid_player_add(_midi.player, filename.c_str()) != FLUID_OK) {
+ DEBUG(driver, 0, "Could not open music file");
+ delete_fluid_player(_midi.player);
+ _midi.player = NULL;
+ return;
+ }
+ if (fluid_player_play(_midi.player) != FLUID_OK) {
+ DEBUG(driver, 0, "Could not start midi player");
+ delete_fluid_player(_midi.player);
+ _midi.player = NULL;
+ return;
+ }
+}
+
+void MusicDriver_FluidSynth::StopSong()
+{
+ if (!_midi.player) return;
+
+ fluid_player_stop(_midi.player);
+ if (fluid_player_join(_midi.player) != FLUID_OK) {
+ DEBUG(driver, 0, "Could not join player");
+ }
+ delete_fluid_player(_midi.player);
+ fluid_synth_system_reset(_midi.synth);
+ _midi.player = NULL;
+}
+
+bool MusicDriver_FluidSynth::IsSongPlaying()
+{
+ if (!_midi.player) return false;
+
+ return fluid_player_get_status(_midi.player) == FLUID_PLAYER_PLAYING;
+}
+
+void MusicDriver_FluidSynth::SetVolume(byte vol)
+{
+ /* Allowed range of synth.gain is 0.0 to 10.0 */
+ if (fluid_settings_setnum(_midi.settings, "synth.gain", 1.0 * vol / 128.0) != 1) {
+ DEBUG(driver, 0, "Could not set volume");
+ }
+}
diff --git a/src/music/fluidsynth.h b/src/music/fluidsynth.h
new file mode 100644
index 0000000000..171128a8e9
--- /dev/null
+++ b/src/music/fluidsynth.h
@@ -0,0 +1,41 @@
+/* $Id$ */
+
+/*
+ * 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 fluidsynth.h Base for FluidSynth music playback. */
+
+#ifndef MUSIC_FLUIDSYNTH_H
+#define MUSIC_FLUIDSYNTH_H
+
+#include "music_driver.hpp"
+
+/** Music driver making use of FluidSynth. */
+class MusicDriver_FluidSynth : public MusicDriver {
+public:
+ /* virtual */ const char *Start(const char * const *param);
+
+ /* virtual */ void Stop();
+
+ /* virtual */ void PlaySong(const MusicSongInfo &song);
+
+ /* virtual */ void StopSong();
+
+ /* virtual */ bool IsSongPlaying();
+
+ /* virtual */ void SetVolume(byte vol);
+ /* virtual */ const char *GetName() const { return "fluidsynth"; }
+};
+
+/** Factory for the fluidsynth driver. */
+class FMusicDriver_FluidSynth : public DriverFactoryBase {
+public:
+ FMusicDriver_FluidSynth() : DriverFactoryBase(Driver::DT_MUSIC, 5, "fluidsynth", "FluidSynth MIDI Driver") {}
+ /* virtual */ Driver *CreateInstance() const { return new MusicDriver_FluidSynth(); }
+};
+
+#endif /* MUSIC_FLUIDSYNTH_H */
diff --git a/src/music/midifile.cpp b/src/music/midifile.cpp
index 688538db9b..91f83c529d 100644
--- a/src/music/midifile.cpp
+++ b/src/music/midifile.cpp
@@ -520,8 +520,8 @@ struct MpsMachine {
/**
* Construct a TTD DOS music format decoder.
- * @param songdata Buffer of song data from CAT file, ownership remains with caller
- * @param songdatalen Length of the data buffer in bytes
+ * @param data Buffer of song data from CAT file, ownership remains with caller
+ * @param length Length of the data buffer in bytes
* @param target MidiFile object to add decoded data to
*/
MpsMachine(const byte *data, size_t length, MidiFile &target)
@@ -1010,21 +1010,30 @@ bool MidiFile::WriteSMF(const char *filename)
std::string MidiFile::GetSMFFile(const MusicSongInfo &song)
{
if (song.filetype == MTT_STANDARDMIDI) {
- return std::string(song.filename);
+ char filename[MAX_PATH];
+ if (FioFindFullPath(filename, lastof(filename), Subdirectory::BASESET_DIR, song.filename)) {
+ return std::string(filename);
+ } else if (FioFindFullPath(filename, lastof(filename), Subdirectory::OLD_GM_DIR, song.filename)) {
+ return std::string(filename);
+ } else {
+ return std::string();
+ }
}
if (song.filetype != MTT_MPSMIDI) return std::string();
- const char *lastpathsep = strrchr(song.filename, PATHSEPCHAR);
- if (lastpathsep == NULL) {
- lastpathsep = song.filename;
- }
-
char basename[MAX_PATH];
{
+ const char *fnstart = strrchr(song.filename, PATHSEPCHAR);
+ if (fnstart == NULL) {
+ fnstart = song.filename;
+ } else {
+ fnstart++;
+ }
+
/* Remove all '.' characters from filename */
char *wp = basename;
- for (const char *rp = lastpathsep + 1; *rp != '\0'; rp++) {
+ for (const char *rp = fnstart; *rp != '\0'; rp++) {
if (*rp != '.') *wp++ = *rp;
}
*wp++ = '\0';
diff --git a/src/music/music_driver.hpp b/src/music/music_driver.hpp
index 10a99d2750..f4d3d7dd36 100644
--- a/src/music/music_driver.hpp
+++ b/src/music/music_driver.hpp
@@ -21,7 +21,7 @@ class MusicDriver : public Driver {
public:
/**
* Play a particular song.
- * @param filename The name of file with the song to play.
+ * @param song The information for the song to play.
*/
virtual void PlaySong(const MusicSongInfo &song) = 0;
diff --git a/src/music_gui.cpp b/src/music_gui.cpp
index e7552fe02f..87a073b0a7 100644
--- a/src/music_gui.cpp
+++ b/src/music_gui.cpp
@@ -173,6 +173,9 @@ void MusicSystem::ChangeMusicSet(const char *set_name)
{
BaseMusic::SetSet(set_name);
+ free(BaseMusic::ini_set);
+ BaseMusic::ini_set = stredup(set_name);
+
this->BuildPlaylists();
this->ChangePlaylist(this->selected_playlist);
@@ -592,7 +595,6 @@ struct MusicTrackSelectionWindow : public Window {
break;
default:
NOT_REACHED();
- break;
}
}
};
diff --git a/src/network/core/core.cpp b/src/network/core/core.cpp
index 7a2ad92a29..c8db860dd5 100644
--- a/src/network/core/core.cpp
+++ b/src/network/core/core.cpp
@@ -64,7 +64,7 @@ bool NetworkCoreInitialize()
#endif /* __MORPHOS__ / __AMIGA__ */
/* Let's load the network in windows */
-#ifdef WIN32
+#ifdef _WIN32
{
WSADATA wsa;
DEBUG(net, 3, "[core] loading windows socket library");
@@ -73,7 +73,7 @@ bool NetworkCoreInitialize()
return false;
}
}
-#endif /* WIN32 */
+#endif /* _WIN32 */
return true;
}
@@ -94,7 +94,7 @@ void NetworkCoreShutdown()
if (SocketBase != NULL) CloseLibrary(SocketBase);
#endif
-#if defined(WIN32)
+#if defined(_WIN32)
WSACleanup();
#endif
}
diff --git a/src/network/core/host.cpp b/src/network/core/host.cpp
index e431dde9fc..216839032b 100644
--- a/src/network/core/host.cpp
+++ b/src/network/core/host.cpp
@@ -107,7 +107,7 @@ static void NetworkFindBroadcastIPsInternal(NetworkAddressList *broadcast) // GE
freeifaddrs(ifap);
}
-#elif defined(WIN32)
+#elif defined(_WIN32)
static void NetworkFindBroadcastIPsInternal(NetworkAddressList *broadcast) // Win32 implementation
{
SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
diff --git a/src/network/core/os_abstraction.h b/src/network/core/os_abstraction.h
index c24cc9f8fe..c320cd9102 100644
--- a/src/network/core/os_abstraction.h
+++ b/src/network/core/os_abstraction.h
@@ -21,7 +21,7 @@
#ifdef ENABLE_NETWORK
/* Windows stuff */
-#if defined(WIN32) || defined(WIN64)
+#if defined(_WIN32)
#include
#include
#include
@@ -125,7 +125,7 @@ static inline void OTTDfreeaddrinfo(struct addrinfo *ai)
}
#define freeaddrinfo OTTDfreeaddrinfo
#endif /* __MINGW32__ && __CYGWIN__ */
-#endif /* WIN32 */
+#endif /* _WIN32 */
/* UNIX stuff */
#if defined(UNIX) && !defined(__OS2__)
@@ -290,7 +290,7 @@ typedef unsigned long in_addr_t;
*/
static inline bool SetNonBlocking(SOCKET d)
{
-#ifdef WIN32
+#ifdef _WIN32
u_long nonblocking = 1;
#else
int nonblocking = 1;
diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp
index 4b1332c589..1df2fc82c4 100644
--- a/src/network/network_content_gui.cpp
+++ b/src/network/network_content_gui.cpp
@@ -519,7 +519,7 @@ public:
* Create the content list window.
* @param desc the window description to pass to Window's constructor.
* @param select_all Whether the select all button is allowed or not.
- * @param type the main type of content to display or #CONTENT_TYPE_END.
+ * @param types the main type of content to display or #CONTENT_TYPE_END.
* When a type other than #CONTENT_TYPE_END is given, dependencies of
* other types are only shown when content that depend on them are
* selected.
diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp
index c406b454d9..275b6200eb 100644
--- a/src/network/network_server.cpp
+++ b/src/network/network_server.cpp
@@ -2137,7 +2137,7 @@ bool NetworkCompanyHasClients(CompanyID company)
/**
- * Get the name of the client, if the user did not send it yet, Client # is used.
+ * Get the name of the client, if the user did not send it yet, Client ID is used.
* @param client_name The variable to write the name to.
* @param last The pointer to the last element of the destination buffer
*/
diff --git a/src/newgrf.cpp b/src/newgrf.cpp
index 4cd61b95cf..57dcb41ca5 100644
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -194,7 +194,7 @@ static GrfProcessingState _cur;
/**
* Helper to check whether an image index is valid for a particular NewGRF vehicle.
- * @param The type of vehicle.
+ * @tparam T The type of vehicle.
* @param image_index The image index to check.
* @return True iff the image index is valid, or 0xFD (use new graphics).
*/
@@ -734,9 +734,9 @@ static void MapSpriteMappingRecolour(PalSpriteID *grf_sprite)
* @param invert_action1_flag Set to true, if palette bit 15 means 'not from action 1'.
* @param use_cur_spritesets Whether to use currently referenceable action 1 sets.
* @param feature GrfSpecFeature to use spritesets from.
- * @param [out] grf_sprite Read sprite and palette.
- * @param [out] max_sprite_offset Optionally returns the number of sprites in the spriteset of the sprite. (0 if no spritset)
- * @param [out] max_palette_offset Optionally returns the number of sprites in the spriteset of the palette. (0 if no spritset)
+ * @param[out] grf_sprite Read sprite and palette.
+ * @param[out] max_sprite_offset Optionally returns the number of sprites in the spriteset of the sprite. (0 if no spritset)
+ * @param[out] max_palette_offset Optionally returns the number of sprites in the spriteset of the palette. (0 if no spritset)
* @return Read TileLayoutFlags.
*/
static TileLayoutFlags ReadSpriteLayoutSprite(ByteReader *buf, bool read_flags, bool invert_action1_flag, bool use_cur_spritesets, int feature, PalSpriteID *grf_sprite, uint16 *max_sprite_offset = NULL, uint16 *max_palette_offset = NULL)
@@ -1845,7 +1845,7 @@ static ChangeInfoResult AircraftVehicleChangeInfo(uint engine, int numinfo, int
/**
* Define properties for stations
- * @param stdid StationID of the first station tile.
+ * @param stid StationID of the first station tile.
* @param numinfo Number of subsequent station tiles to change the property for.
* @param prop The property to change.
* @param buf The property value.
@@ -2553,7 +2553,7 @@ static ChangeInfoResult TownHouseChangeInfo(uint hid, int numinfo, int prop, Byt
* @param gvid ID of the global variable. This is basically only checked for zerones.
* @param numinfo Number of subsequent IDs to change the property for.
* @param buf The property value.
- * @param [in,out] translation_table Storage location for the translation table.
+ * @param[in,out] translation_table Storage location for the translation table.
* @param name Name of the table for debug output.
* @return ChangeInfoResult.
*/
@@ -3083,6 +3083,10 @@ static ChangeInfoResult IgnoreIndustryTileProperty(int prop, ByteReader *buf)
buf->ReadWord();
break;
+ case 0x13:
+ buf->Skip(buf->ReadByte() * 2);
+ break;
+
default:
ret = CIR_UNKNOWN;
break;
@@ -3172,7 +3176,7 @@ static ChangeInfoResult IndustrytilesChangeInfo(uint indtid, int numinfo, int pr
case 0x0C: {
uint16 acctp = buf->ReadWord();
tsp->accepts_cargo[prop - 0x0A] = GetCargoTranslation(GB(acctp, 0, 8), _cur.grffile);
- tsp->acceptance[prop - 0x0A] = GB(acctp, 8, 8);
+ tsp->acceptance[prop - 0x0A] = Clamp(GB(acctp, 8, 8), 0, 16);
break;
}
@@ -3201,6 +3205,26 @@ static ChangeInfoResult IndustrytilesChangeInfo(uint indtid, int numinfo, int pr
tsp->special_flags = (IndustryTileSpecialFlags)buf->ReadByte();
break;
+ case 0x13: { // variable length cargo acceptance
+ byte num_cargoes = buf->ReadByte();
+ if (num_cargoes > lengthof(tsp->acceptance)) {
+ GRFError *error = DisableGrf(STR_NEWGRF_ERROR_LIST_PROPERTY_TOO_LONG);
+ error->param_value[1] = prop;
+ return CIR_DISABLED;
+ }
+ for (uint i = 0; i < lengthof(tsp->acceptance); i++) {
+ if (i < num_cargoes) {
+ tsp->accepts_cargo[i] = GetCargoTranslation(buf->ReadByte(), _cur.grffile);
+ /* Tile acceptance can be negative to counteract the INDTILE_SPECIAL_ACCEPTS_ALL_CARGO flag */
+ tsp->acceptance[i] = (int8)buf->ReadByte();
+ } else {
+ tsp->accepts_cargo[i] = CT_INVALID;
+ tsp->acceptance[i] = 0;
+ }
+ }
+ break;
+ }
+
default:
ret = CIR_UNKNOWN;
break;
@@ -3280,11 +3304,17 @@ static ChangeInfoResult IgnoreIndustryProperty(int prop, ByteReader *buf)
for (byte j = 0; j < 3; j++) buf->ReadByte();
break;
- case 0x15: {
- byte number_of_sounds = buf->ReadByte();
- for (uint8 j = 0; j < number_of_sounds; j++) {
- buf->ReadByte();
- }
+ case 0x15:
+ case 0x25:
+ case 0x26:
+ case 0x27:
+ buf->Skip(buf->ReadByte());
+ break;
+
+ case 0x28: {
+ int num_inputs = buf->ReadByte();
+ int num_outputs = buf->ReadByte();
+ buf->Skip(num_inputs * num_outputs * 2);
break;
}
@@ -3472,8 +3502,6 @@ static ChangeInfoResult IndustriesChangeInfo(uint indid, int numinfo, int prop,
} else {
/* Declared as been valid, can be used */
itt[k].gfx = tempid;
- size = k + 1;
- copy_from = itt;
}
} else if (itt[k].gfx == 0xFF) {
itt[k].ti.x = (int8)GB(itt[k].ti.x, 0, 8);
@@ -3644,6 +3672,77 @@ static ChangeInfoResult IndustriesChangeInfo(uint indid, int numinfo, int prop,
break;
}
+ case 0x25: { // variable length produced cargoes
+ byte num_cargoes = buf->ReadByte();
+ if (num_cargoes > lengthof(indsp->produced_cargo)) {
+ GRFError *error = DisableGrf(STR_NEWGRF_ERROR_LIST_PROPERTY_TOO_LONG);
+ error->param_value[1] = prop;
+ return CIR_DISABLED;
+ }
+ for (uint i = 0; i < lengthof(indsp->produced_cargo); i++) {
+ if (i < num_cargoes) {
+ CargoID cargo = GetCargoTranslation(buf->ReadByte(), _cur.grffile);
+ indsp->produced_cargo[i] = cargo;
+ } else {
+ indsp->produced_cargo[i] = CT_INVALID;
+ }
+ }
+ break;
+ }
+
+ case 0x26: { // variable length accepted cargoes
+ byte num_cargoes = buf->ReadByte();
+ if (num_cargoes > lengthof(indsp->accepts_cargo)) {
+ GRFError *error = DisableGrf(STR_NEWGRF_ERROR_LIST_PROPERTY_TOO_LONG);
+ error->param_value[1] = prop;
+ return CIR_DISABLED;
+ }
+ for (uint i = 0; i < lengthof(indsp->accepts_cargo); i++) {
+ if (i < num_cargoes) {
+ CargoID cargo = GetCargoTranslation(buf->ReadByte(), _cur.grffile);
+ indsp->accepts_cargo[i] = cargo;
+ } else {
+ indsp->accepts_cargo[i] = CT_INVALID;
+ }
+ }
+ break;
+ }
+
+ case 0x27: { // variable length production rates
+ byte num_cargoes = buf->ReadByte();
+ if (num_cargoes > lengthof(indsp->production_rate)) {
+ GRFError *error = DisableGrf(STR_NEWGRF_ERROR_LIST_PROPERTY_TOO_LONG);
+ error->param_value[1] = prop;
+ return CIR_DISABLED;
+ }
+ for (uint i = 0; i < lengthof(indsp->production_rate); i++) {
+ if (i < num_cargoes) {
+ indsp->production_rate[i] = buf->ReadByte();
+ } else {
+ indsp->production_rate[i] = 0;
+ }
+ }
+ break;
+ }
+
+ case 0x28: { // variable size input/output production multiplier table
+ byte num_inputs = buf->ReadByte();
+ byte num_outputs = buf->ReadByte();
+ if (num_inputs > lengthof(indsp->accepts_cargo) || num_outputs > lengthof(indsp->produced_cargo)) {
+ GRFError *error = DisableGrf(STR_NEWGRF_ERROR_LIST_PROPERTY_TOO_LONG);
+ error->param_value[1] = prop;
+ return CIR_DISABLED;
+ }
+ for (uint i = 0; i < lengthof(indsp->accepts_cargo); i++) {
+ for (uint j = 0; j < lengthof(indsp->produced_cargo); j++) {
+ uint16 mult = 0;
+ if (i < num_inputs && j < num_outputs) mult = buf->ReadWord();
+ indsp->input_cargo_multiplier[i][j] = mult;
+ }
+ }
+ break;
+ }
+
default:
ret = CIR_UNKNOWN;
break;
@@ -3787,8 +3886,6 @@ static ChangeInfoResult AirportChangeInfo(uint airport, int numinfo, int prop, B
} else {
/* Declared as been valid, can be used */
att[k].gfx = tempid;
- size = k + 1;
- copy_from = att;
}
} else if (att[k].gfx == 0xFF) {
att[k].ti.x = (int8)GB(att[k].ti.x, 0, 8);
@@ -4843,7 +4940,7 @@ static void NewSpriteGroup(ByteReader *buf)
}
case GSF_INDUSTRIES: {
- if (type > 1) {
+ if (type > 2) {
grfmsg(1, "NewSpriteGroup: Unsupported industry production version %d, skipping", type);
break;
}
@@ -4853,21 +4950,63 @@ static void NewSpriteGroup(ByteReader *buf)
act_group = group;
group->version = type;
if (type == 0) {
+ group->num_input = 3;
for (uint i = 0; i < 3; i++) {
group->subtract_input[i] = (int16)buf->ReadWord(); // signed
}
+ group->num_output = 2;
for (uint i = 0; i < 2; i++) {
group->add_output[i] = buf->ReadWord(); // unsigned
}
group->again = buf->ReadByte();
- } else {
+ } else if (type == 1) {
+ group->num_input = 3;
for (uint i = 0; i < 3; i++) {
group->subtract_input[i] = buf->ReadByte();
}
+ group->num_output = 2;
for (uint i = 0; i < 2; i++) {
group->add_output[i] = buf->ReadByte();
}
group->again = buf->ReadByte();
+ } else if (type == 2) {
+ group->num_input = buf->ReadByte();
+ if (group->num_input > lengthof(group->subtract_input)) {
+ GRFError *error = DisableGrf(STR_NEWGRF_ERROR_INDPROD_CALLBACK);
+ error->data = stredup("too many inputs (max 16)");
+ return;
+ }
+ for (uint i = 0; i < group->num_input; i++) {
+ byte rawcargo = buf->ReadByte();
+ CargoID cargo = GetCargoTranslation(rawcargo, _cur.grffile);
+ if (std::find(group->cargo_input, group->cargo_input + i, cargo) != group->cargo_input + i) {
+ GRFError *error = DisableGrf(STR_NEWGRF_ERROR_INDPROD_CALLBACK);
+ error->data = stredup("duplicate input cargo");
+ return;
+ }
+ group->cargo_input[i] = cargo;
+ group->subtract_input[i] = buf->ReadByte();
+ }
+ group->num_output = buf->ReadByte();
+ if (group->num_output > lengthof(group->add_output)) {
+ GRFError *error = DisableGrf(STR_NEWGRF_ERROR_INDPROD_CALLBACK);
+ error->data = stredup("too many outputs (max 16)");
+ return;
+ }
+ for (uint i = 0; i < group->num_output; i++) {
+ byte rawcargo = buf->ReadByte();
+ CargoID cargo = GetCargoTranslation(rawcargo, _cur.grffile);
+ if (std::find(group->cargo_output, group->cargo_output + i, cargo) != group->cargo_output + i) {
+ GRFError *error = DisableGrf(STR_NEWGRF_ERROR_INDPROD_CALLBACK);
+ error->data = stredup("duplicate output cargo");
+ return;
+ }
+ group->cargo_output[i] = cargo;
+ group->add_output[i] = buf->ReadByte();
+ }
+ group->again = buf->ReadByte();
+ } else {
+ NOT_REACHED();
}
break;
}
@@ -5907,7 +6046,8 @@ static uint32 GetParamVal(byte param, uint32 *cond_val)
/* Supported in Action 0x07 and 0x09, not 0x0D */
return 0;
} else {
- uint32 param_val = _ttdpatch_flags[*cond_val / 0x20];
+ uint32 index = *cond_val / 0x20;
+ uint32 param_val = index < lengthof(_ttdpatch_flags) ? _ttdpatch_flags[index] : 0;
*cond_val %= 0x20;
return param_val;
}
@@ -7897,6 +8037,8 @@ static void InitializeGRFSpecial()
| ((_settings_game.vehicle.dynamic_engines ? 1 : 0) << 0x18) // dynamic engines
| (1 << 0x1E) // variablerunningcosts
| (1 << 0x1F); // any switch is on
+
+ _ttdpatch_flags[4] = (1 << 0x00); // larger persistent storage
}
/** Reset and clear all NewGRF stations */
diff --git a/src/newgrf_airport.cpp b/src/newgrf_airport.cpp
index 0863d09861..6213097bd0 100644
--- a/src/newgrf_airport.cpp
+++ b/src/newgrf_airport.cpp
@@ -216,7 +216,6 @@ void AirportOverrideManager::SetEntitySpec(AirportSpec *as)
/**
* Store a value into the object's persistent storage.
- * @param object Object that we want to query.
* @param pos Position in the persistent storage to use.
* @param value Value to store.
*/
diff --git a/src/newgrf_animation_base.h b/src/newgrf_animation_base.h
index 7b94031fbd..791f3d691a 100644
--- a/src/newgrf_animation_base.h
+++ b/src/newgrf_animation_base.h
@@ -31,7 +31,6 @@ template industry);
}
+ case 0x69:
+ case 0x6A:
+ case 0x6B:
+ case 0x6C:
+ case 0x6D: {
+ CargoID cargo = GetCargoTranslation(parameter, this->ro.grffile);
+ int index = this->industry->GetCargoProducedIndex(cargo);
+ if (index < 0) return 0; // invalid cargo
+ if (variable == 0x69) return this->industry->produced_cargo_waiting[index];
+ if (variable == 0x6A) return this->industry->this_month_production[index];
+ if (variable == 0x6B) return this->industry->this_month_transported[index];
+ if (variable == 0x6C) return this->industry->last_month_production[index];
+ if (variable == 0x6D) return this->industry->last_month_transported[index];
+ NOT_REACHED();
+ }
+
+
+ case 0x6E:
+ case 0x6F: {
+ CargoID cargo = GetCargoTranslation(parameter, this->ro.grffile);
+ int index = this->industry->GetCargoAcceptedIndex(cargo);
+ if (index < 0) return 0; // invalid cargo
+ if (variable == 0x6E) return this->industry->last_cargo_accepted_at[index];
+ if (variable == 0x6F) return this->industry->incoming_cargo_waiting[index];
+ NOT_REACHED();
+ }
+
/* Get a variable from the persistent storage */
case 0x7C: return (this->industry->psa != NULL) ? this->industry->psa->GetValue(parameter) : 0;
@@ -364,7 +391,10 @@ static uint32 GetCountAndDistanceOfClosestInstance(byte param_setID, byte layout
case 0xB0: return Clamp(this->industry->construction_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 65535); // Date when built since 1920 (in days)
case 0xB3: return this->industry->construction_type; // Construction type
- case 0xB4: return Clamp(this->industry->last_cargo_accepted_at - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 65535); // Date last cargo accepted since 1920 (in days)
+ case 0xB4: {
+ Date *latest = std::max_element(this->industry->last_cargo_accepted_at, endof(this->industry->last_cargo_accepted_at));
+ return Clamp((*latest) - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 65535); // Date last cargo accepted since 1920 (in days)
+ }
}
DEBUG(grf, 1, "Unhandled industry variable 0x%X", variable);
@@ -415,7 +445,7 @@ static const GRFFile *GetGrffile(IndustryType type)
/**
* Constructor of the industries resolver.
* @param tile %Tile owned by the industry.
- * @param industry %Industry being resolved.
+ * @param indus %Industry being resolved.
* @param type Type of the industry.
* @param random_bits Random bits of the new industry.
* @param callback Callback ID.
@@ -575,13 +605,28 @@ void IndustryProductionCallback(Industry *ind, int reason)
if (tgroup == NULL || tgroup->type != SGT_INDUSTRY_PRODUCTION) break;
const IndustryProductionSpriteGroup *group = (const IndustryProductionSpriteGroup *)tgroup;
- bool deref = (group->version == 1);
+ bool deref = (group->version >= 1);
- for (uint i = 0; i < 3; i++) {
- ind->incoming_cargo_waiting[i] = Clamp(ind->incoming_cargo_waiting[i] - DerefIndProd(group->subtract_input[i], deref) * multiplier, 0, 0xFFFF);
- }
- for (uint i = 0; i < 2; i++) {
- ind->produced_cargo_waiting[i] = Clamp(ind->produced_cargo_waiting[i] + max(DerefIndProd(group->add_output[i], deref), 0) * multiplier, 0, 0xFFFF);
+ if (group->version < 2) {
+ /* Callback parameters map directly to industry cargo slot indices */
+ for (uint i = 0; i < group->num_input; i++) {
+ ind->incoming_cargo_waiting[i] = Clamp(ind->incoming_cargo_waiting[i] - DerefIndProd(group->subtract_input[i], deref) * multiplier, 0, 0xFFFF);
+ }
+ for (uint i = 0; i < group->num_output; i++) {
+ ind->produced_cargo_waiting[i] = Clamp(ind->produced_cargo_waiting[i] + max(DerefIndProd(group->add_output[i], deref), 0) * multiplier, 0, 0xFFFF);
+ }
+ } else {
+ /* Callback receives list of cargos to apply for, which need to have their cargo slots in industry looked up */
+ for (uint i = 0; i < group->num_input; i++) {
+ int cargo_index = ind->GetCargoAcceptedIndex(group->cargo_input[i]);
+ if (cargo_index < 0) continue;
+ ind->incoming_cargo_waiting[cargo_index] = Clamp(ind->incoming_cargo_waiting[cargo_index] - DerefIndProd(group->subtract_input[i], deref) * multiplier, 0, 0xFFFF);
+ }
+ for (uint i = 0; i < group->num_output; i++) {
+ int cargo_index = ind->GetCargoProducedIndex(group->cargo_output[i]);
+ if (cargo_index < 0) continue;
+ ind->produced_cargo_waiting[cargo_index] = Clamp(ind->produced_cargo_waiting[cargo_index] + max(DerefIndProd(group->add_output[i], deref), 0) * multiplier, 0, 0xFFFF);
+ }
}
int32 again = DerefIndProd(group->again, deref);
@@ -602,7 +647,7 @@ void IndustryProductionCallback(Industry *ind, int reason)
*/
bool IndustryTemporarilyRefusesCargo(Industry *ind, CargoID cargo_type)
{
- assert(cargo_type == ind->accepts_cargo[0] || cargo_type == ind->accepts_cargo[1] || cargo_type == ind->accepts_cargo[2]);
+ assert(std::find(ind->accepts_cargo, endof(ind->accepts_cargo), cargo_type) != endof(ind->accepts_cargo));
const IndustrySpec *indspec = GetIndustrySpec(ind->type);
if (HasBit(indspec->callback_mask, CBM_IND_REFUSE_CARGO)) {
diff --git a/src/newgrf_industrytiles.cpp b/src/newgrf_industrytiles.cpp
index 69c4b1d07d..0b2a55000e 100644
--- a/src/newgrf_industrytiles.cpp
+++ b/src/newgrf_industrytiles.cpp
@@ -296,7 +296,7 @@ bool StartStopIndustryTileAnimation(const Industry *ind, IndustryAnimationTrigge
* @param tile Industry tile to trigger.
* @param trigger Trigger to trigger.
* @param ind Industry of the tile.
- * @param [in,out] reseed_industry Collects bits to reseed for the industry.
+ * @param[in,out] reseed_industry Collects bits to reseed for the industry.
*/
static void DoTriggerIndustryTile(TileIndex tile, IndustryTileTrigger trigger, Industry *ind, uint32 &reseed_industry)
{
diff --git a/src/newgrf_object.cpp b/src/newgrf_object.cpp
index 40a966a166..1501cb9b8a 100644
--- a/src/newgrf_object.cpp
+++ b/src/newgrf_object.cpp
@@ -350,8 +350,8 @@ unhandled:
* @param tile %Tile of the object.
* @param view View of the object.
* @param callback Callback ID.
- * @param callback_param1 First parameter (var 10) of the callback.
- * @param callback_param2 Second parameter (var 18) of the callback.
+ * @param param1 First parameter (var 10) of the callback.
+ * @param param2 Second parameter (var 18) of the callback.
*/
ObjectResolverObject::ObjectResolverObject(const ObjectSpec *spec, Object *obj, TileIndex tile, uint8 view,
CallbackID callback, uint32 param1, uint32 param2)
diff --git a/src/newgrf_railtype.cpp b/src/newgrf_railtype.cpp
index 624b0eca84..8421844717 100644
--- a/src/newgrf_railtype.cpp
+++ b/src/newgrf_railtype.cpp
@@ -87,8 +87,8 @@ RailTypeResolverObject::RailTypeResolverObject(const RailtypeInfo *rti, TileInde
* @param rti The rail type data (spec).
* @param tile The tile to get the sprite for.
* @param rtsg The type of sprite to draw.
- * @param content Where are we drawing the tile?
- * @param [out] num_results If not NULL, return the number of sprites in the spriteset.
+ * @param context Where are we drawing the tile?
+ * @param[out] num_results If not NULL, return the number of sprites in the spriteset.
* @return The sprite to draw.
*/
SpriteID GetCustomRailSprite(const RailtypeInfo *rti, TileIndex tile, RailTypeSpriteGroup rtsg, TileContext context, uint *num_results)
diff --git a/src/newgrf_spritegroup.cpp b/src/newgrf_spritegroup.cpp
index a5d689bbf9..1bcb4a0359 100644
--- a/src/newgrf_spritegroup.cpp
+++ b/src/newgrf_spritegroup.cpp
@@ -118,7 +118,7 @@ static inline uint32 GetVariable(const ResolverObject &object, ScopeResolver *sc
/**
* Store a value into the persistent storage area (PSA). Default implementation does nothing (for newgrf classes without storage).
- * @param pos Position to store into.
+ * @param reg Position to store into.
* @param value Value to store.
*/
/* virtual */ void ScopeResolver::StorePSA(uint reg, int32 value) {}
@@ -144,21 +144,6 @@ static inline uint32 GetVariable(const ResolverObject &object, ScopeResolver *sc
return &this->default_scope;
}
-/**
- * Rotate val rot times to the right
- * @param val the value to rotate
- * @param rot the amount of times to rotate
- * @return the rotated value
- */
-static uint32 RotateRight(uint32 val, uint32 rot)
-{
- /* Do not rotate more than necessary */
- rot %= 32;
-
- return (val >> rot) | (val << (32 - rot));
-}
-
-
/* Evaluate an adjustment for a variable of the given size.
* U is the unsigned type and S is the signed type to use. */
template
@@ -191,7 +176,7 @@ static U EvalAdjustT(const DeterministicSpriteGroupAdjust *adjust, ScopeResolver
case DSGA_OP_STO: _temp_store.StoreValue((U)value, (S)last_value); return last_value;
case DSGA_OP_RST: return value;
case DSGA_OP_STOP: scope->StorePSA((U)value, (S)last_value); return last_value;
- case DSGA_OP_ROR: return RotateRight(last_value, value);
+ case DSGA_OP_ROR: return ROR((U)last_value, (U)value & 0x1F); // mask 'value' to 5 bits, which should behave the same on all architectures.
case DSGA_OP_SCMP: return ((S)last_value == (S)value) ? 1 : ((S)last_value < (S)value ? 0 : 2);
case DSGA_OP_UCMP: return ((U)last_value == (U)value) ? 1 : ((U)last_value < (U)value ? 0 : 2);
case DSGA_OP_SHL: return (uint32)(U)last_value << ((U)value & 0x1F); // Same behaviour as in ParamSet, mask 'value' to 5 bits, which should behave the same on all architectures.
@@ -308,7 +293,7 @@ const SpriteGroup *RealSpriteGroup::Resolve(ResolverObject &object) const
* Process registers and the construction stage into the sprite layout.
* The passed construction stage might get reset to zero, if it gets incorporated into the layout
* during the preprocessing.
- * @param [in, out] stage Construction stage (0-3), or NULL if not applicable.
+ * @param[in,out] stage Construction stage (0-3), or NULL if not applicable.
* @return sprite layout to draw.
*/
const DrawTileSprites *TileLayoutSpriteGroup::ProcessRegisters(uint8 *stage) const
diff --git a/src/newgrf_spritegroup.h b/src/newgrf_spritegroup.h
index 6adf7c2ac8..6f038fd138 100644
--- a/src/newgrf_spritegroup.h
+++ b/src/newgrf_spritegroup.h
@@ -15,6 +15,7 @@
#include "town_type.h"
#include "engine_type.h"
#include "house_type.h"
+#include "industry_type.h"
#include "newgrf_callbacks.h"
#include "newgrf_generic.h"
@@ -277,9 +278,14 @@ struct IndustryProductionSpriteGroup : SpriteGroup {
IndustryProductionSpriteGroup() : SpriteGroup(SGT_INDUSTRY_PRODUCTION) {}
uint8 version;
- int16 subtract_input[3]; // signed
- uint16 add_output[2]; // unsigned
+ uint8 num_input; ///< How many subtract_input values are valid
+ int16 subtract_input[INDUSTRY_NUM_INPUTS]; ///< Take this much of the input cargo (can be negative, is indirect in cb version 1+)
+ CargoID cargo_input[INDUSTRY_NUM_INPUTS]; ///< Which input cargoes to take from (only cb version 2)
+ uint8 num_output; ///< How many add_output values are valid
+ uint16 add_output[INDUSTRY_NUM_OUTPUTS]; ///< Add this much output cargo when successful (unsigned, is indirect in cb version 1+)
+ CargoID cargo_output[INDUSTRY_NUM_OUTPUTS]; ///< Which output cargoes to add to (only cb version 2)
uint8 again;
+
};
/**
diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp
index 5271b2bfc9..d9b79c55a1 100644
--- a/src/newgrf_station.cpp
+++ b/src/newgrf_station.cpp
@@ -881,7 +881,7 @@ bool CanStationTileHaveWires(TileIndex tile)
return statspec == NULL || !HasBit(statspec->wires, GetStationGfx(tile));
}
-/** Wrapper for animation control, see #GetStationCallback. */
+/** Wrapper for animation control, see GetStationCallback. */
uint16 GetAnimStationCallback(CallbackID callback, uint32 param1, uint32 param2, const StationSpec *statspec, BaseStation *st, TileIndex tile, int extra_data)
{
return GetStationCallback(callback, param1, param2, statspec, st, tile);
diff --git a/src/newgrf_storage.h b/src/newgrf_storage.h
index ae9782d88c..a0c1558f8e 100644
--- a/src/newgrf_storage.h
+++ b/src/newgrf_storage.h
@@ -220,7 +220,7 @@ extern PersistentStoragePool _persistent_storage_pool;
/**
* Class for pooled persistent storage of data.
*/
-struct PersistentStorage : PersistentStorageArray, PersistentStoragePool::PoolItem<&_persistent_storage_pool> {
+struct PersistentStorage : PersistentStorageArray, PersistentStoragePool::PoolItem<&_persistent_storage_pool> {
/** We don't want GCC to zero our struct! It already is zeroed and has an index! */
PersistentStorage(const uint32 new_grfid, byte feature, TileIndex tile)
{
@@ -230,7 +230,7 @@ struct PersistentStorage : PersistentStorageArray, PersistentStorageP
}
};
-assert_compile(cpp_lengthof(OldPersistentStorage, storage) == cpp_lengthof(PersistentStorage, storage));
+assert_compile(cpp_lengthof(OldPersistentStorage, storage) <= cpp_lengthof(PersistentStorage, storage));
#define FOR_ALL_STORAGES_FROM(var, start) FOR_ALL_ITEMS_FROM(PersistentStorage, storage_index, var, start)
#define FOR_ALL_STORAGES(var) FOR_ALL_STORAGES_FROM(var, 0)
diff --git a/src/newgrf_text.cpp b/src/newgrf_text.cpp
index eb4b11c5e0..b92b84355a 100644
--- a/src/newgrf_text.cpp
+++ b/src/newgrf_text.cpp
@@ -329,7 +329,7 @@ struct UnmappedChoiceList : ZeroedMemoryAllocator {
* @param language_id The (NewGRF) language ID associated with this string.
* @param allow_newlines Whether newlines are allowed in the string or not.
* @param str The string to translate.
- * @param [out] olen The length of the final string.
+ * @param[out] olen The length of the final string.
* @param byte80 The control code to use as replacement for the 0x80-value.
* @return The translated string.
*/
diff --git a/src/news_gui.cpp b/src/news_gui.cpp
index 94cfaccf93..71a39eb3a9 100644
--- a/src/news_gui.cpp
+++ b/src/news_gui.cpp
@@ -494,7 +494,7 @@ struct NewsWindow : Window {
private:
/**
- * Moves the window so #newtop is new 'top' coordinate. Makes screen dirty where needed.
+ * Moves the window to a new #top coordinate. Makes screen dirty where needed.
* @param newtop new top coordinate
*/
void SetWindowTop(int newtop)
@@ -962,7 +962,6 @@ void ShowLastNewsMessage()
* @param y position of the string
* @param colour the colour the string will be shown in
* @param *ni NewsItem being printed
- * @param maxw maximum width of string in pixels
*/
static void DrawNewsString(uint left, uint right, int y, TextColour colour, const NewsItem *ni)
{
diff --git a/src/news_type.h b/src/news_type.h
index fee7ae38e3..cad15ecbef 100644
--- a/src/news_type.h
+++ b/src/news_type.h
@@ -17,19 +17,6 @@
#include "strings_type.h"
#include "sound_type.h"
-/** Constants in the message options window. */
-enum MessageOptionsSpace {
- MOS_WIDG_PER_SETTING = 4, ///< Number of widgets needed for each news category, starting at widget #WID_MO_START_OPTION.
-
- MOS_LEFT_EDGE = 6, ///< Number of pixels between left edge of the window and the options buttons column.
- MOS_COLUMN_SPACING = 4, ///< Number of pixels between the buttons and the description columns.
- MOS_RIGHT_EDGE = 6, ///< Number of pixels between right edge of the window and the options descriptions column.
- MOS_BUTTON_SPACE = 10, ///< Additional space in the button with the option value (for better looks).
-
- MOS_ABOVE_GLOBAL_SETTINGS = 6, ///< Number of vertical pixels between the categories and the global options.
- MOS_BOTTOM_EDGE = 6, ///< Number of pixels between bottom edge of the window and bottom of the global options.
-};
-
/**
* Type of news.
*/
diff --git a/src/object_gui.cpp b/src/object_gui.cpp
index 57c45d09c9..8aabcfdc46 100644
--- a/src/object_gui.cpp
+++ b/src/object_gui.cpp
@@ -520,10 +520,7 @@ static WindowDesc _build_object_desc(
_nested_build_object_widgets, lengthof(_nested_build_object_widgets)
);
-/**
- * Show our object picker.
- * @param w The toolbar window we're associated with.
- */
+/** Show our object picker. */
void ShowBuildObjectPicker()
{
/* Don't show the place object button when there are no objects to place. */
diff --git a/src/openttd.cpp b/src/openttd.cpp
index cce94e35af..b4ccffcb3c 100644
--- a/src/openttd.cpp
+++ b/src/openttd.cpp
@@ -63,6 +63,7 @@
#include "subsidy_func.h"
#include "gfx_layout.h"
#include "viewport_sprite_sorter.h"
+#include "framerate_type.h"
#include "linkgraph/linkgraphschedule.h"
@@ -186,7 +187,7 @@ static void ShowHelp()
" -P password = Password to join company\n"
" -D [ip][:port] = Start dedicated server\n"
" -l ip[:port] = Redirect DEBUG()\n"
-#if !defined(__MORPHOS__) && !defined(__AMIGA__) && !defined(WIN32)
+#if !defined(__MORPHOS__) && !defined(__AMIGA__) && !defined(_WIN32)
" -f = Fork into the background (dedicated only)\n"
#endif
#endif /* ENABLE_NETWORK */
@@ -230,7 +231,7 @@ static void ShowHelp()
/* ShowInfo put output to stderr, but version information should go
* to stdout; this is the only exception */
-#if !defined(WIN32) && !defined(WIN64)
+#if !defined(_WIN32)
printf("%s\n", buf);
#else
ShowInfo(buf);
@@ -281,7 +282,7 @@ static void WriteSavegameInfo(const char *name)
/* ShowInfo put output to stderr, but version information should go
* to stdout; this is the only exception */
-#if !defined(WIN32) && !defined(WIN64)
+#if !defined(_WIN32)
printf("%s\n", buf);
#else
ShowInfo(buf);
@@ -396,6 +397,9 @@ void MakeNewgameSettingsLive()
_settings_game.ai_config[c] = NULL;
if (_settings_newgame.ai_config[c] != NULL) {
_settings_game.ai_config[c] = new AIConfig(_settings_newgame.ai_config[c]);
+ if (!AIConfig::GetConfig(c, AIConfig::SSS_FORCE_GAME)->HasScript()) {
+ AIConfig::GetConfig(c, AIConfig::SSS_FORCE_GAME)->Change(NULL);
+ }
}
}
_settings_game.game_config = NULL;
@@ -416,7 +420,7 @@ void OpenBrowser(const char *url)
/** Callback structure of statements to be executed after the NewGRF scan. */
struct AfterNewGRFScan : NewGRFScanCallback {
Year startyear; ///< The start year.
- uint generation_seed; ///< Seed for the new game.
+ uint32 generation_seed; ///< Seed for the new game.
char *dedicated_host; ///< Hostname for the dedicated server.
uint16 dedicated_port; ///< Port for the dedicated server.
char *network_conn; ///< Information about the server to connect to, or NULL.
@@ -436,6 +440,9 @@ struct AfterNewGRFScan : NewGRFScanCallback {
join_server_password(NULL), join_company_password(NULL),
save_config_ptr(save_config_ptr), save_config(true)
{
+ /* Visual C++ 2015 fails compiling this line (AfterNewGRFScan::generation_seed undefined symbol)
+ * if it's placed outside a member function, directly in the struct body. */
+ assert_compile(sizeof(generation_seed) == sizeof(_settings_game.game_creation.generation_seed));
}
virtual void OnNewGRFsScanned()
@@ -539,7 +546,7 @@ static const OptionData _options[] = {
GETOPT_SHORT_VALUE('l'),
GETOPT_SHORT_VALUE('p'),
GETOPT_SHORT_VALUE('P'),
-#if !defined(__MORPHOS__) && !defined(__AMIGA__) && !defined(WIN32)
+#if !defined(__MORPHOS__) && !defined(__AMIGA__) && !defined(_WIN32)
GETOPT_SHORT_NOVAL('f'),
#endif
#endif /* ENABLE_NETWORK */
@@ -639,7 +646,7 @@ int openttd_main(int argc, char *argv[])
case 'r': ParseResolution(&resolution, mgo.opt); break;
case 't': scanner->startyear = atoi(mgo.opt); break;
case 'd': {
-#if defined(WIN32)
+#if defined(_WIN32)
CreateConsole();
#endif
if (mgo.opt != NULL) SetDebugString(mgo.opt);
@@ -697,7 +704,7 @@ int openttd_main(int argc, char *argv[])
goto exit_noshutdown;
}
- case 'G': scanner->generation_seed = atoi(mgo.opt); break;
+ case 'G': scanner->generation_seed = strtoul(mgo.opt, NULL, 10); break;
case 'c': free(_config_file); _config_file = stredup(mgo.opt); break;
case 'x': scanner->save_config = false; break;
case 'h':
@@ -1017,9 +1024,9 @@ static void MakeNewEditorWorld()
* Load the specified savegame but on error do different things.
* If loading fails due to corrupt savegame, bad version, etc. go back to
* a previous correct state. In the menu for example load the intro game again.
- * @param mode mode of loading, either SL_LOAD or SL_OLD_LOAD
- * @param newgm switch to this mode of loading fails due to some unknown error
* @param filename file to be loaded
+ * @param fop mode of loading, always SLO_LOAD
+ * @param newgm switch to this mode of loading fails due to some unknown error
* @param subdir default directory to look for filename, set to 0 if not needed
* @param lf Load filter to use, if NULL: use filename + subdir.
*/
@@ -1368,6 +1375,14 @@ void StateGameLoop()
{
/* don't execute the state loop during pause */
if (_pause_mode != PM_UNPAUSED) {
+ PerformanceMeasurer::Paused(PFE_GAMELOOP);
+ PerformanceMeasurer::Paused(PFE_GL_ECONOMY);
+ PerformanceMeasurer::Paused(PFE_GL_TRAINS);
+ PerformanceMeasurer::Paused(PFE_GL_ROADVEHS);
+ PerformanceMeasurer::Paused(PFE_GL_SHIPS);
+ PerformanceMeasurer::Paused(PFE_GL_AIRCRAFT);
+ PerformanceMeasurer::Paused(PFE_GL_LANDSCAPE);
+
UpdateLandscapingLimits();
#ifndef DEBUG_DUMP_COMMANDS
Game::GameLoop();
@@ -1375,6 +1390,9 @@ void StateGameLoop()
CallWindowTickEvent();
return;
}
+
+ PerformanceMeasurer framerate(PFE_GAMELOOP);
+ PerformanceAccumulator::Reset(PFE_GL_LANDSCAPE);
if (HasModalProgress()) return;
Layouter::ReduceLineCache();
diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp
index db812f6c53..ba8a1a060d 100644
--- a/src/order_cmd.cpp
+++ b/src/order_cmd.cpp
@@ -1948,7 +1948,6 @@ void DeleteVehicleOrders(Vehicle *v, bool keep_orderlist, bool reset_order_indic
* Clamp the service interval to the correct min/max. The actual min/max values
* depend on whether it's in percent or days.
* @param interval proposed service interval
- * @param company_id the owner of the vehicle
* @return Clamped service interval
*/
uint16 GetServiceIntervalClamped(uint interval, bool ispercent)
@@ -2018,6 +2017,7 @@ VehicleOrderID ProcessConditionalOrder(const Order *order, const Vehicle *v)
switch (order->GetConditionVariable()) {
case OCV_LOAD_PERCENTAGE: skip_order = OrderConditionCompare(occ, CalcPercentVehicleFilled(v, NULL), value); break;
case OCV_RELIABILITY: skip_order = OrderConditionCompare(occ, ToPercent16(v->reliability), value); break;
+ case OCV_MAX_RELIABILITY: skip_order = OrderConditionCompare(occ, ToPercent16(v->GetEngine()->reliability), value); break;
case OCV_MAX_SPEED: skip_order = OrderConditionCompare(occ, v->GetDisplayMaxSpeed() * 10 / 16, value); break;
case OCV_AGE: skip_order = OrderConditionCompare(occ, v->age / DAYS_IN_LEAP_YEAR, value); break;
case OCV_REQUIRES_SERVICE: skip_order = OrderConditionCompare(occ, v->NeedsServicing(), value); break;
diff --git a/src/order_gui.cpp b/src/order_gui.cpp
index 9045fac6b5..81350deb74 100644
--- a/src/order_gui.cpp
+++ b/src/order_gui.cpp
@@ -152,6 +152,7 @@ static const StringID _order_goto_dropdown_aircraft[] = {
static const OrderConditionVariable _order_conditional_variable[] = {
OCV_LOAD_PERCENTAGE,
OCV_RELIABILITY,
+ OCV_MAX_RELIABILITY,
OCV_MAX_SPEED,
OCV_AGE,
OCV_REMAINING_LIFETIME,
diff --git a/src/order_type.h b/src/order_type.h
index d3a771ce8b..ac66bfa38f 100644
--- a/src/order_type.h
+++ b/src/order_type.h
@@ -123,6 +123,7 @@ enum OrderConditionVariable {
OCV_REQUIRES_SERVICE, ///< Skip when the vehicle requires service
OCV_UNCONDITIONALLY, ///< Always skip
OCV_REMAINING_LIFETIME, ///< Skip based on the remaining lifetime
+ OCV_MAX_RELIABILITY, ///< Skip based on the maximum reliability
OCV_END
};
diff --git a/src/os/macosx/string_osx.cpp b/src/os/macosx/string_osx.cpp
new file mode 100644
index 0000000000..1c5d558855
--- /dev/null
+++ b/src/os/macosx/string_osx.cpp
@@ -0,0 +1,450 @@
+/* $Id$ */
+
+/*
+ * 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 string_osx.cpp Functions related to localized text support on OSX. */
+
+#include "../../stdafx.h"
+#include "string_osx.h"
+#include "../../string_func.h"
+#include "../../strings_func.h"
+#include "../../table/control_codes.h"
+#include "../../fontcache.h"
+#include "macos.h"
+
+#include
+
+
+#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5)
+/** Cached current locale. */
+static CFLocaleRef _osx_locale = NULL;
+/** CoreText cache for font information, cleared when OTTD changes fonts. */
+static CTFontRef _font_cache[FS_END];
+
+
+/**
+ * Wrapper for doing layouts with CoreText.
+ */
+class CoreTextParagraphLayout : public ParagraphLayouter {
+private:
+ const CoreTextParagraphLayoutFactory::CharType *text_buffer;
+ ptrdiff_t length;
+ const FontMap& font_map;
+
+ CTTypesetterRef typesetter;
+
+ CFIndex cur_offset = 0; ///< Offset from the start of the current run from where to output.
+
+public:
+ /** Visual run contains data about the bit of text with the same font. */
+ class CoreTextVisualRun : public ParagraphLayouter::VisualRun {
+ private:
+ std::vector glyphs;
+ std::vector positions;
+ std::vector glyph_to_char;
+
+ int total_advance = 0;
+ Font *font;
+
+ public:
+ CoreTextVisualRun(CTRunRef run, Font *font, const CoreTextParagraphLayoutFactory::CharType *buff);
+
+ virtual const GlyphID *GetGlyphs() const { return &this->glyphs[0]; }
+ virtual const float *GetPositions() const { return &this->positions[0]; }
+ virtual const int *GetGlyphToCharMap() const { return &this->glyph_to_char[0]; }
+
+ virtual const Font *GetFont() const { return this->font; }
+ virtual int GetLeading() const { return this->font->fc->GetHeight(); }
+ virtual int GetGlyphCount() const { return (int)this->glyphs.size(); }
+ int GetAdvance() const { return this->total_advance; }
+ };
+
+ /** A single line worth of VisualRuns. */
+ class CoreTextLine : public AutoDeleteSmallVector, public ParagraphLayouter::Line {
+ public:
+ CoreTextLine(CTLineRef line, const FontMap &fontMapping, const CoreTextParagraphLayoutFactory::CharType *buff)
+ {
+ CFArrayRef runs = CTLineGetGlyphRuns(line);
+ for (CFIndex i = 0; i < CFArrayGetCount(runs); i++) {
+ CTRunRef run = (CTRunRef)CFArrayGetValueAtIndex(runs, i);
+
+ /* Extract font information for this run. */
+ CFRange chars = CTRunGetStringRange(run);
+ FontMap::const_iterator map = fontMapping.Begin();
+ while (map < fontMapping.End() - 1 && map->first <= chars.location) map++;
+
+ *this->Append() = new CoreTextVisualRun(run, map->second, buff);
+ }
+ CFRelease(line);
+ }
+
+ virtual int GetLeading() const;
+ virtual int GetWidth() const;
+ virtual int CountRuns() const { return this->Length(); }
+ virtual const VisualRun *GetVisualRun(int run) const { return *this->Get(run); }
+
+ int GetInternalCharLength(WChar c) const
+ {
+ /* CoreText uses UTF-16 internally which means we need to account for surrogate pairs. */
+ return c >= 0x010000U ? 2 : 1;
+ }
+ };
+
+ CoreTextParagraphLayout(CTTypesetterRef typesetter, const CoreTextParagraphLayoutFactory::CharType *buffer, ptrdiff_t len, const FontMap &fontMapping) : text_buffer(buffer), length(len), font_map(fontMapping), typesetter(typesetter)
+ {
+ this->Reflow();
+ }
+
+ virtual ~CoreTextParagraphLayout()
+ {
+ CFRelease(this->typesetter);
+ }
+
+ virtual void Reflow()
+ {
+ this->cur_offset = 0;
+ }
+
+ virtual const Line *NextLine(int max_width);
+};
+
+
+/** Get the width of an encoded sprite font character. */
+static CGFloat SpriteFontGetWidth(void *ref_con)
+{
+ FontSize fs = (FontSize)((size_t)ref_con >> 24);
+ WChar c = (WChar)((size_t)ref_con & 0xFFFFFF);
+
+ return GetGlyphWidth(fs, c);
+}
+
+static CTRunDelegateCallbacks _sprite_font_callback = {
+ kCTRunDelegateCurrentVersion, NULL, NULL, NULL,
+ &SpriteFontGetWidth
+};
+
+/* static */ ParagraphLayouter *CoreTextParagraphLayoutFactory::GetParagraphLayout(CharType *buff, CharType *buff_end, FontMap &fontMapping)
+{
+ if (!MacOSVersionIsAtLeast(10, 5, 0)) return NULL;
+
+ /* Can't layout an empty string. */
+ ptrdiff_t length = buff_end - buff;
+ if (length == 0) return NULL;
+
+ /* Can't layout our in-built sprite fonts. */
+ for (FontMap::const_iterator i = fontMapping.Begin(); i != fontMapping.End(); i++) {
+ if (i->second->fc->IsBuiltInFont()) return NULL;
+ }
+
+ /* Make attributed string with embedded font information. */
+ CFMutableAttributedStringRef str = CFAttributedStringCreateMutable(kCFAllocatorDefault, 0);
+ CFAttributedStringBeginEditing(str);
+
+ CFStringRef base = CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault, buff, length, kCFAllocatorNull);
+ CFAttributedStringReplaceString(str, CFRangeMake(0, 0), base);
+ CFRelease(base);
+
+ /* Apply font and colour ranges to our string. This is important to make sure
+ * that we get proper glyph boundaries on style changes. */
+ int last = 0;
+ for (FontMap::const_iterator i = fontMapping.Begin(); i != fontMapping.End(); i++) {
+ if (i->first - last == 0) continue;
+
+ if (_font_cache[i->second->fc->GetSize()] == NULL) {
+ /* Cache font information. */
+ CFStringRef font_name = CFStringCreateWithCString(kCFAllocatorDefault, i->second->fc->GetFontName(), kCFStringEncodingUTF8);
+ _font_cache[i->second->fc->GetSize()] = CTFontCreateWithName(font_name, i->second->fc->GetFontSize(), NULL);
+ CFRelease(font_name);
+ }
+ CFAttributedStringSetAttribute(str, CFRangeMake(last, i->first - last), kCTFontAttributeName, _font_cache[i->second->fc->GetSize()]);
+
+ CGColorRef color = CGColorCreateGenericGray((uint8)i->second->colour / 255.0f, 1.0f); // We don't care about the real colours, just that they are different.
+ CFAttributedStringSetAttribute(str, CFRangeMake(last, i->first - last), kCTForegroundColorAttributeName, color);
+ CGColorRelease(color);
+
+ /* Install a size callback for our special sprite glyphs. */
+ for (ssize_t c = last; c < i->first; c++) {
+ if (buff[c] >= SCC_SPRITE_START && buff[c] <= SCC_SPRITE_END) {
+ CTRunDelegateRef del = CTRunDelegateCreate(&_sprite_font_callback, (void *)(size_t)(buff[c] | (i->second->fc->GetSize() << 24)));
+ CFAttributedStringSetAttribute(str, CFRangeMake(c, 1), kCTRunDelegateAttributeName, del);
+ CFRelease(del);
+ }
+ }
+
+ last = i->first;
+ }
+ CFAttributedStringEndEditing(str);
+
+ /* Create and return typesetter for the string. */
+ CTTypesetterRef typesetter = CTTypesetterCreateWithAttributedString(str);
+ CFRelease(str);
+
+ return typesetter != NULL ? new CoreTextParagraphLayout(typesetter, buff, length, fontMapping) : NULL;
+}
+
+/* virtual */ const CoreTextParagraphLayout::Line *CoreTextParagraphLayout::NextLine(int max_width)
+{
+ if (this->cur_offset >= this->length) return NULL;
+
+ /* Get line break position, trying word breaking first and breaking somewhere if that doesn't work. */
+ CFIndex len = CTTypesetterSuggestLineBreak(this->typesetter, this->cur_offset, max_width);
+ if (len <= 0) len = CTTypesetterSuggestClusterBreak(this->typesetter, this->cur_offset, max_width);
+
+ /* Create line. */
+ CTLineRef line = CTTypesetterCreateLine(this->typesetter, CFRangeMake(this->cur_offset, len));
+ this->cur_offset += len;
+
+ return line != NULL ? new CoreTextLine(line, this->font_map, this->text_buffer) : NULL;
+}
+
+CoreTextParagraphLayout::CoreTextVisualRun::CoreTextVisualRun(CTRunRef run, Font *font, const CoreTextParagraphLayoutFactory::CharType *buff) : font(font)
+{
+ this->glyphs.resize(CTRunGetGlyphCount(run));
+
+ /* Query map of glyphs to source string index. */
+ CFIndex map[this->glyphs.size()];
+ CTRunGetStringIndices(run, CFRangeMake(0, 0), map);
+
+ this->glyph_to_char.resize(this->glyphs.size());
+ for (size_t i = 0; i < this->glyph_to_char.size(); i++) this->glyph_to_char[i] = (int)map[i];
+
+ CGPoint pts[this->glyphs.size()];
+ CTRunGetPositions(run, CFRangeMake(0, 0), pts);
+ this->positions.resize(this->glyphs.size() * 2 + 2);
+
+ /* Convert glyph array to our data type. At the same time, substitute
+ * the proper glyphs for our private sprite glyphs. */
+ CGGlyph gl[this->glyphs.size()];
+ CTRunGetGlyphs(run, CFRangeMake(0, 0), gl);
+ for (size_t i = 0; i < this->glyphs.size(); i++) {
+ if (buff[this->glyph_to_char[i]] >= SCC_SPRITE_START && buff[this->glyph_to_char[i]] <= SCC_SPRITE_END) {
+ this->glyphs[i] = font->fc->MapCharToGlyph(buff[this->glyph_to_char[i]]);
+ this->positions[i * 2 + 0] = pts[i].x;
+ this->positions[i * 2 + 1] = font->fc->GetAscender() - font->fc->GetGlyph(this->glyphs[i])->height - 1; // Align sprite glyphs to font baseline.
+ } else {
+ this->glyphs[i] = gl[i];
+ this->positions[i * 2 + 0] = pts[i].x;
+ this->positions[i * 2 + 1] = pts[i].y;
+ }
+ }
+ this->total_advance = (int)CTRunGetTypographicBounds(run, CFRangeMake(0, 0), NULL, NULL, NULL);
+ this->positions[this->glyphs.size() * 2] = this->positions[0] + this->total_advance;
+}
+
+/**
+ * Get the height of the line.
+ * @return The maximum height of the line.
+ */
+int CoreTextParagraphLayout::CoreTextLine::GetLeading() const
+{
+ int leading = 0;
+ for (const CoreTextVisualRun * const *run = this->Begin(); run != this->End(); run++) {
+ leading = max(leading, (*run)->GetLeading());
+ }
+
+ return leading;
+}
+
+/**
+ * Get the width of this line.
+ * @return The width of the line.
+ */
+int CoreTextParagraphLayout::CoreTextLine::GetWidth() const
+{
+ if (this->Length() == 0) return 0;
+
+ int total_width = 0;
+ for (const CoreTextVisualRun * const *run = this->Begin(); run != this->End(); run++) {
+ total_width += (*run)->GetAdvance();
+ }
+
+ return total_width;
+}
+
+
+/** Delete CoreText font reference for a specific font size. */
+void MacOSResetScriptCache(FontSize size)
+{
+ if (_font_cache[size] != NULL) {
+ CFRelease(_font_cache[size]);
+ _font_cache[size] = NULL;
+ }
+}
+
+/** Store current language locale as a CoreFounation locale. */
+void MacOSSetCurrentLocaleName(const char *iso_code)
+{
+ if (!MacOSVersionIsAtLeast(10, 5, 0)) return;
+
+ if (_osx_locale != NULL) CFRelease(_osx_locale);
+
+ CFStringRef iso = CFStringCreateWithCString(kCFAllocatorNull, iso_code, kCFStringEncodingUTF8);
+ _osx_locale = CFLocaleCreate(kCFAllocatorDefault, iso);
+ CFRelease(iso);
+}
+
+/**
+ * Compares two strings using case insensitive natural sort.
+ *
+ * @param s1 First string to compare.
+ * @param s2 Second string to compare.
+ * @return 1 if s1 < s2, 2 if s1 == s2, 3 if s1 > s2, or 0 if not supported by the OS.
+ */
+int MacOSStringCompare(const char *s1, const char *s2)
+{
+ static bool supported = MacOSVersionIsAtLeast(10, 5, 0);
+ if (!supported) return 0;
+
+ CFStringCompareFlags flags = kCFCompareCaseInsensitive | kCFCompareNumerically | kCFCompareLocalized | kCFCompareWidthInsensitive | kCFCompareForcedOrdering;
+
+ CFStringRef cf1 = CFStringCreateWithCString(kCFAllocatorDefault, s1, kCFStringEncodingUTF8);
+ CFStringRef cf2 = CFStringCreateWithCString(kCFAllocatorDefault, s2, kCFStringEncodingUTF8);
+
+ CFComparisonResult res = CFStringCompareWithOptionsAndLocale(cf1, cf2, CFRangeMake(0, CFStringGetLength(cf1)), flags, _osx_locale);
+
+ CFRelease(cf1);
+ CFRelease(cf2);
+
+ return (int)res + 2;
+}
+
+
+/* virtual */ void OSXStringIterator::SetString(const char *s)
+{
+ const char *string_base = s;
+
+ this->utf16_to_utf8.clear();
+ this->str_info.clear();
+ this->cur_pos = 0;
+
+ /* CoreText operates on UTF-16, thus we have to convert the input string.
+ * To be able to return proper offsets, we have to create a mapping at the same time. */
+ std::vector utf16_str; ///< UTF-16 copy of the string.
+ while (*s != '\0') {
+ size_t idx = s - string_base;
+
+ WChar c = Utf8Consume(&s);
+ if (c < 0x10000) {
+ utf16_str.push_back((UniChar)c);
+ } else {
+ /* Make a surrogate pair. */
+ utf16_str.push_back((UniChar)(0xD800 + ((c - 0x10000) >> 10)));
+ utf16_str.push_back((UniChar)(0xDC00 + ((c - 0x10000) & 0x3FF)));
+ this->utf16_to_utf8.push_back(idx);
+ }
+ this->utf16_to_utf8.push_back(idx);
+ }
+ this->utf16_to_utf8.push_back(s - string_base);
+
+ /* Query CoreText for word and cluster break information. */
+ this->str_info.resize(utf16_to_utf8.size());
+
+ if (utf16_str.size() > 0) {
+ CFStringRef str = CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault, &utf16_str[0], utf16_str.size(), kCFAllocatorNull);
+
+ /* Get cluster breaks. */
+ for (CFIndex i = 0; i < CFStringGetLength(str); ) {
+ CFRange r = CFStringGetRangeOfComposedCharactersAtIndex(str, i);
+ this->str_info[r.location].char_stop = true;
+
+ i += r.length;
+ }
+
+ /* Get word breaks. */
+ CFStringTokenizerRef tokenizer = CFStringTokenizerCreate(kCFAllocatorDefault, str, CFRangeMake(0, CFStringGetLength(str)), kCFStringTokenizerUnitWordBoundary, _osx_locale);
+
+ CFStringTokenizerTokenType tokenType = kCFStringTokenizerTokenNone;
+ while ((tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer)) != kCFStringTokenizerTokenNone) {
+ /* Skip tokens that are white-space or punctuation tokens. */
+ if ((tokenType & kCFStringTokenizerTokenHasNonLettersMask) != kCFStringTokenizerTokenHasNonLettersMask) {
+ CFRange r = CFStringTokenizerGetCurrentTokenRange(tokenizer);
+ this->str_info[r.location].word_stop = true;
+ }
+ }
+
+ CFRelease(tokenizer);
+ CFRelease(str);
+ }
+
+ /* End-of-string is always a valid stopping point. */
+ this->str_info.back().char_stop = true;
+ this->str_info.back().word_stop = true;
+}
+
+/* virtual */ size_t OSXStringIterator::SetCurPosition(size_t pos)
+{
+ /* Convert incoming position to an UTF-16 string index. */
+ size_t utf16_pos = 0;
+ for (size_t i = 0; i < this->utf16_to_utf8.size(); i++) {
+ if (this->utf16_to_utf8[i] == pos) {
+ utf16_pos = i;
+ break;
+ }
+ }
+
+ /* Sanitize in case we get a position inside a grapheme cluster. */
+ while (utf16_pos > 0 && !this->str_info[utf16_pos].char_stop) utf16_pos--;
+ this->cur_pos = utf16_pos;
+
+ return this->utf16_to_utf8[this->cur_pos];
+}
+
+/* virtual */ size_t OSXStringIterator::Next(IterType what)
+{
+ assert(this->cur_pos <= this->utf16_to_utf8.size());
+ assert(what == StringIterator::ITER_CHARACTER || what == StringIterator::ITER_WORD);
+
+ if (this->cur_pos == this->utf16_to_utf8.size()) return END;
+
+ do {
+ this->cur_pos++;
+ } while (this->cur_pos < this->utf16_to_utf8.size() && (what == ITER_WORD ? !this->str_info[this->cur_pos].word_stop : !this->str_info[this->cur_pos].char_stop));
+
+ return this->cur_pos == this->utf16_to_utf8.size() ? END : this->utf16_to_utf8[this->cur_pos];
+}
+
+/* virtual */ size_t OSXStringIterator::Prev(IterType what)
+{
+ assert(this->cur_pos <= this->utf16_to_utf8.size());
+ assert(what == StringIterator::ITER_CHARACTER || what == StringIterator::ITER_WORD);
+
+ if (this->cur_pos == 0) return END;
+
+ do {
+ this->cur_pos--;
+ } while (this->cur_pos > 0 && (what == ITER_WORD ? !this->str_info[this->cur_pos].word_stop : !this->str_info[this->cur_pos].char_stop));
+
+ return this->utf16_to_utf8[this->cur_pos];
+}
+
+/* static */ StringIterator *OSXStringIterator::Create()
+{
+ if (!MacOSVersionIsAtLeast(10, 5, 0)) return NULL;
+
+ return new OSXStringIterator();
+}
+
+#else
+void MacOSResetScriptCache(FontSize size) {}
+void MacOSSetCurrentLocaleName(const char *iso_code) {}
+
+int MacOSStringCompare(const char *s1, const char *s2)
+{
+ return 0;
+}
+
+/* static */ StringIterator *OSXStringIterator::Create()
+{
+ return NULL;
+}
+
+/* static */ ParagraphLayouter *CoreTextParagraphLayoutFactory::GetParagraphLayout(CharType *buff, CharType *buff_end, FontMap &fontMapping)
+{
+ return NULL;
+}
+#endif /* (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) */
diff --git a/src/os/macosx/string_osx.h b/src/os/macosx/string_osx.h
new file mode 100644
index 0000000000..d632b0a440
--- /dev/null
+++ b/src/os/macosx/string_osx.h
@@ -0,0 +1,90 @@
+/* $Id$ */
+
+/*
+ * 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 string_osx.h Functions related to localized text support on OSX. */
+
+#ifndef STRING_OSX_H
+#define STRING_OSX_H
+
+#include "../../gfx_layout.h"
+#include "../../string_base.h"
+#include
+
+/** String iterator using CoreText as a backend. */
+class OSXStringIterator : public StringIterator {
+ /** Break info for a character. */
+ struct CharInfo {
+ bool word_stop : 1; ///< Code point is suitable as a word break.
+ bool char_stop : 1; ///< Code point is the start of a grapheme cluster, i.e. a "character".
+ };
+
+ std::vector str_info; ///< Break information for each code point.
+ std::vector utf16_to_utf8; ///< Mapping from UTF-16 code point position to index in the UTF-8 source string.
+
+ size_t cur_pos; ///< Current iteration position.
+
+public:
+ virtual void SetString(const char *s);
+ virtual size_t SetCurPosition(size_t pos);
+ virtual size_t Next(IterType what);
+ virtual size_t Prev(IterType what);
+
+ static StringIterator *Create();
+};
+
+/**
+ * Helper class to construct a new #CoreTextParagraphLayout.
+ */
+class CoreTextParagraphLayoutFactory {
+public:
+ /** Helper for GetLayouter, to get the right type. */
+ typedef UniChar CharType;
+ /** Helper for GetLayouter, to get whether the layouter supports RTL. */
+ static const bool SUPPORTS_RTL = true;
+
+ /**
+ * Get the actual ParagraphLayout for the given buffer.
+ * @param buff The begin of the buffer.
+ * @param buff_end The location after the last element in the buffer.
+ * @param fontMapping THe mapping of the fonts.
+ * @return The ParagraphLayout instance.
+ */
+ static ParagraphLayouter *GetParagraphLayout(CharType *buff, CharType *buff_end, FontMap &fontMapping);
+
+ /**
+ * Append a wide character to the internal buffer.
+ * @param buff The buffer to append to.
+ * @param buffer_last The end of the buffer.
+ * @param c The character to add.
+ * @return The number of buffer spaces that were used.
+ */
+ static size_t AppendToBuffer(CharType *buff, const CharType *buffer_last, WChar c)
+ {
+ if (c >= 0x010000U) {
+ /* Character is encoded using surrogates in UTF-16. */
+ if (buff + 1 <= buffer_last) {
+ buff[0] = (CharType)(((c - 0x010000U) >> 10) + 0xD800);
+ buff[1] = (CharType)(((c - 0x010000U) & 0x3FF) + 0xDC00);
+ } else {
+ /* Not enough space in buffer. */
+ *buff = 0;
+ }
+ return 2;
+ } else {
+ *buff = (CharType)(c & 0xFFFF);
+ return 1;
+ }
+ }
+};
+
+void MacOSResetScriptCache(FontSize size);
+void MacOSSetCurrentLocaleName(const char *iso_code);
+int MacOSStringCompare(const char *s1, const char *s2);
+
+#endif /* STRING_OSX_H */
diff --git a/src/os/windows/string_uniscribe.cpp b/src/os/windows/string_uniscribe.cpp
index ea8b8c0224..ce61537b2b 100644
--- a/src/os/windows/string_uniscribe.cpp
+++ b/src/os/windows/string_uniscribe.cpp
@@ -195,6 +195,7 @@ static bool UniscribeShapeRun(const UniscribeParagraphLayoutFactory::CharType *b
for (int i = 0; i < range.len; i++) {
if (buff[range.pos + i] >= SCC_SPRITE_START && buff[range.pos + i] <= SCC_SPRITE_END) {
range.ft_glyphs[range.char_to_glyph[i]] = range.font->fc->MapCharToGlyph(buff[range.pos + i]);
+ range.offsets[range.char_to_glyph[i]].dv = range.font->fc->GetAscender() - range.font->fc->GetGlyph(range.ft_glyphs[range.char_to_glyph[i]])->height - 1; // Align sprite glyphs to font baseline.
}
}
diff --git a/src/os/windows/win32.cpp b/src/os/windows/win32.cpp
index 2d853037f0..bb1a0a4209 100644
--- a/src/os/windows/win32.cpp
+++ b/src/os/windows/win32.cpp
@@ -300,7 +300,7 @@ void CreateConsole()
if (_has_console) return;
_has_console = true;
- AllocConsole();
+ if (!AllocConsole()) return;
hand = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hand, &coninfo);
@@ -625,11 +625,11 @@ char *convert_from_fs(const TCHAR *name, char *utf8_buf, size_t buflen)
* Convert from OpenTTD's encoding to that of the environment in
* UNICODE. OpenTTD encoding is UTF8, local is wide
* @param name pointer to a valid string that will be converted
- * @param utf16_buf pointer to a valid wide-char buffer that will receive the
+ * @param system_buf pointer to a valid wide-char buffer that will receive the
* converted string
* @param buflen length in wide characters of the receiving buffer
* @param console_cp convert to the console encoding instead of the normal system encoding.
- * @return pointer to utf16_buf. If conversion fails the string is of zero-length
+ * @return pointer to system_buf. If conversion fails the string is of zero-length
*/
TCHAR *convert_to_fs(const char *name, TCHAR *system_buf, size_t buflen, bool console_cp)
{
@@ -805,16 +805,15 @@ int OTTDStringCompare(const char *s1, const char *s2)
}
#ifdef _MSC_VER
-/* Code from MSDN: https://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx */
+/* Based on code from MSDN: https://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx */
const DWORD MS_VC_EXCEPTION = 0x406D1388;
-#pragma pack(push,8)
-typedef struct {
+
+PACK_N(struct THREADNAME_INFO {
DWORD dwType; ///< Must be 0x1000.
LPCSTR szName; ///< Pointer to name (in user addr space).
DWORD dwThreadID; ///< Thread ID (-1=caller thread).
DWORD dwFlags; ///< Reserved for future use, must be zero.
-} THREADNAME_INFO;
-#pragma pack(pop)
+}, 8);
/**
* Signal thread name to any attached debuggers.
diff --git a/src/osk_gui.cpp b/src/osk_gui.cpp
index 974e465f43..dc069d1686 100644
--- a/src/osk_gui.cpp
+++ b/src/osk_gui.cpp
@@ -437,9 +437,9 @@ void UpdateOSKOriginalText(const Window *parent, int button)
/**
* Check whether the OSK is opened for a specific editbox.
- * @parent w Window to check for
+ * @param w Window to check for
* @param button Editbox of \a w to check for
- * @return true if the OSK is oppened for \a button.
+ * @return true if the OSK is opened for \a button.
*/
bool IsOSKOpenedFor(const Window *w, int button)
{
diff --git a/src/pathfinder/follow_track.hpp b/src/pathfinder/follow_track.hpp
index 70f148de38..9b4377248e 100644
--- a/src/pathfinder/follow_track.hpp
+++ b/src/pathfinder/follow_track.hpp
@@ -124,8 +124,12 @@ struct CFollowTrackT
m_old_tile = old_tile;
m_old_td = old_td;
m_err = EC_NONE;
- assert(((TrackStatusToTrackdirBits(GetTileTrackStatus(m_old_tile, TT(), IsRoadTT() ? RoadVehicle::From(m_veh)->compatible_roadtypes : 0)) & TrackdirToTrackdirBits(m_old_td)) != 0) ||
- (IsTram() && GetSingleTramBit(m_old_tile) != INVALID_DIAGDIR)); // Disable the assertion for single tram bits
+ assert(
+ ((TrackStatusToTrackdirBits(
+ GetTileTrackStatus(m_old_tile, TT(), (IsRoadTT() && m_veh != NULL) ? RoadVehicle::From(m_veh)->compatible_roadtypes : 0)
+ ) & TrackdirToTrackdirBits(m_old_td)) != 0) ||
+ (IsTram() && GetSingleTramBit(m_old_tile) != INVALID_DIAGDIR) // Disable the assertion for single tram bits
+ );
m_exitdir = TrackdirToExitdir(m_old_td);
if (ForcedReverse()) return true;
if (!CanExitOldTile()) return false;
@@ -406,8 +410,9 @@ protected:
}
}
- /* single tram bits cause reversing */
- if (IsTram() && GetSingleTramBit(m_old_tile) == ReverseDiagDir(m_exitdir)) {
+ /* Single tram bits and standard road stops cause reversing. */
+ if (IsRoadTT() && ((IsTram() && GetSingleTramBit(m_old_tile) == ReverseDiagDir(m_exitdir)) ||
+ (IsStandardRoadStopTile(m_old_tile) && GetRoadStopDir(m_old_tile) == ReverseDiagDir(m_exitdir)))) {
/* reverse */
m_new_tile = m_old_tile;
m_new_td_bits = TrackdirToTrackdirBits(ReverseTrackdir(m_old_td));
diff --git a/src/pathfinder/npf/aystar.cpp b/src/pathfinder/npf/aystar.cpp
index 9ef2bca479..8bd63beb7b 100644
--- a/src/pathfinder/npf/aystar.cpp
+++ b/src/pathfinder/npf/aystar.cpp
@@ -156,7 +156,7 @@ void AyStar::CheckTile(AyStarNode *current, OpenListNode *parent)
* his neighbour items. If they are valid, they are added to be checked too.
* @return Possible values:
* - #AYSTAR_EMPTY_OPENLIST : indicates all items are tested, and no path has been found.
- * - #AYSTAR_LIMIT_REACHED : Indicates that the max_nodes limit has been reached.
+ * - #AYSTAR_LIMIT_REACHED : Indicates that the max_search_nodes limit has been reached.
* - #AYSTAR_FOUND_END_NODE : indicates we found the end. Path_found now is true, and in path is the path found.
* - #AYSTAR_STILL_BUSY : indicates we have done this tile, did not found the path yet, and have items left to try.
*/
diff --git a/src/pathfinder/npf/aystar.h b/src/pathfinder/npf/aystar.h
index eaa70bf915..4ee9df3329 100644
--- a/src/pathfinder/npf/aystar.h
+++ b/src/pathfinder/npf/aystar.h
@@ -30,7 +30,7 @@ enum AystarStatus {
AYSTAR_EMPTY_OPENLIST, ///< All items are tested, and no path has been found.
AYSTAR_STILL_BUSY, ///< Some checking was done, but no path found yet, and there are still items left to try.
AYSTAR_NO_PATH, ///< No path to the goal was found.
- AYSTAR_LIMIT_REACHED, ///< The #max_nodes limit has been reached, aborting search.
+ AYSTAR_LIMIT_REACHED, ///< The #AyStar::max_search_nodes limit has been reached, aborting search.
AYSTAR_DONE, ///< Not an end-tile, or wrong direction.
};
@@ -93,9 +93,9 @@ typedef int32 AyStar_CalculateG(AyStar *aystar, AyStarNode *current, OpenListNod
typedef int32 AyStar_CalculateH(AyStar *aystar, AyStarNode *current, OpenListNode *parent);
/**
- * This function requests the tiles around the current tile and put them in #tiles_around.
- * #tiles_around is never reset, so if you are not using directions, just leave it alone.
- * \warning Never add more tiles_around than memory allocated for it.
+ * This function requests the tiles around the current tile and put them in #neighbours.
+ * #neighbours is never reset, so if you are not using directions, just leave it alone.
+ * @warning Never add more #neighbours than memory allocated for it.
*/
typedef void AyStar_GetNeighbours(AyStar *aystar, OpenListNode *current);
diff --git a/src/pathfinder/npf/npf.cpp b/src/pathfinder/npf/npf.cpp
index 3218d8314f..9535ac0636 100644
--- a/src/pathfinder/npf/npf.cpp
+++ b/src/pathfinder/npf/npf.cpp
@@ -959,12 +959,13 @@ static void NPFFollowTrack(AyStar *aystar, OpenListNode *current)
* multiple targets that are spread around, we should perform a breadth first
* search by specifiying CalcZero as our heuristic.
*/
-static NPFFoundTargetData NPFRouteInternal(AyStarNode *start1, bool ignore_start_tile1, AyStarNode *start2, bool ignore_start_tile2, NPFFindStationOrTileData *target, AyStar_EndNodeCheck target_proc, AyStar_CalculateH heuristic_proc, AyStarUserData *user, uint reverse_penalty, bool ignore_reserved = false)
+static NPFFoundTargetData NPFRouteInternal(AyStarNode *start1, bool ignore_start_tile1, AyStarNode *start2, bool ignore_start_tile2, NPFFindStationOrTileData *target, AyStar_EndNodeCheck target_proc, AyStar_CalculateH heuristic_proc, AyStarUserData *user, uint reverse_penalty, bool ignore_reserved = false, int max_penalty = 0)
{
int r;
NPFFoundTargetData result;
/* Initialize procs */
+ _npf_aystar.max_path_cost = max_penalty;
_npf_aystar.CalculateH = heuristic_proc;
_npf_aystar.EndNodeCheck = target_proc;
_npf_aystar.FoundEndNode = NPFSaveTargetData;
@@ -1052,7 +1053,7 @@ static NPFFoundTargetData NPFRouteToStationOrTile(TileIndex tile, Trackdir track
* reverse_penalty applied (NPF_TILE_LENGTH is the equivalent of one full
* tile).
*/
-static NPFFoundTargetData NPFRouteToDepotBreadthFirstTwoWay(TileIndex tile1, Trackdir trackdir1, bool ignore_start_tile1, TileIndex tile2, Trackdir trackdir2, bool ignore_start_tile2, NPFFindStationOrTileData *target, AyStarUserData *user, uint reverse_penalty)
+static NPFFoundTargetData NPFRouteToDepotBreadthFirstTwoWay(TileIndex tile1, Trackdir trackdir1, bool ignore_start_tile1, TileIndex tile2, Trackdir trackdir2, bool ignore_start_tile2, NPFFindStationOrTileData *target, AyStarUserData *user, uint reverse_penalty, int max_penalty)
{
AyStarNode start1;
AyStarNode start2;
@@ -1064,7 +1065,7 @@ static NPFFoundTargetData NPFRouteToDepotBreadthFirstTwoWay(TileIndex tile1, Tra
/* perform a breadth first search. Target is NULL,
* since we are just looking for any depot...*/
- return NPFRouteInternal(&start1, ignore_start_tile1, (IsValidTile(tile2) ? &start2 : NULL), ignore_start_tile2, target, NPFFindDepot, NPFCalcZero, user, reverse_penalty);
+ return NPFRouteInternal(&start1, ignore_start_tile1, (IsValidTile(tile2) ? &start2 : NULL), ignore_start_tile2, target, NPFFindDepot, NPFCalcZero, user, reverse_penalty, false, max_penalty);
}
void InitializeNPF()
@@ -1114,7 +1115,7 @@ FindDepotData NPFRoadVehicleFindNearestDepot(const RoadVehicle *v, int max_penal
Trackdir trackdir = v->GetVehicleTrackdir();
AyStarUserData user = { v->owner, TRANSPORT_ROAD, INVALID_RAILTYPES, v->compatible_roadtypes };
- NPFFoundTargetData ftd = NPFRouteToDepotBreadthFirstTwoWay(v->tile, trackdir, false, v->tile, ReverseTrackdir(trackdir), false, NULL, &user, 0);
+ NPFFoundTargetData ftd = NPFRouteToDepotBreadthFirstTwoWay(v->tile, trackdir, false, INVALID_TILE, INVALID_TRACKDIR, false, NULL, &user, 0, max_penalty);
if (ftd.best_bird_dist != 0) return FindDepotData();
@@ -1169,7 +1170,7 @@ Track NPFShipChooseTrack(const Ship *v, TileIndex tile, DiagDirection enterdir,
* we did not find our target, but ftd.best_trackdir contains the direction leading
* to the tile closest to our target. */
path_found = (ftd.best_bird_dist == 0);
- if (ftd.best_trackdir == 0xff) return INVALID_TRACK;
+ if (ftd.best_trackdir == INVALID_TRACKDIR) return INVALID_TRACK;
return TrackdirToTrack(ftd.best_trackdir);
}
@@ -1204,7 +1205,7 @@ FindDepotData NPFTrainFindNearestDepot(const Train *v, int max_penalty)
assert(trackdir != INVALID_TRACKDIR);
AyStarUserData user = { v->owner, TRANSPORT_RAIL, v->compatible_railtypes, ROADTYPES_NONE };
- NPFFoundTargetData ftd = NPFRouteToDepotBreadthFirstTwoWay(v->tile, trackdir, false, last->tile, trackdir_rev, false, &fstd, &user, NPF_INFINITE_PENALTY);
+ NPFFoundTargetData ftd = NPFRouteToDepotBreadthFirstTwoWay(v->tile, trackdir, false, last->tile, trackdir_rev, false, &fstd, &user, NPF_INFINITE_PENALTY, max_penalty);
if (ftd.best_bird_dist != 0) return FindDepotData();
/* Found target */
diff --git a/src/pathfinder/opf/opf_ship.cpp b/src/pathfinder/opf/opf_ship.cpp
index 1a866337c7..c993f82033 100644
--- a/src/pathfinder/opf/opf_ship.cpp
+++ b/src/pathfinder/opf/opf_ship.cpp
@@ -145,6 +145,7 @@ static uint FindShipTrack(const Ship *v, TileIndex tile, DiagDirection dir, Trac
Track best_track = INVALID_TRACK;
+ assert(bits != TRACK_BIT_NONE);
do {
Track i = RemoveFirstTrack(&bits);
@@ -176,7 +177,7 @@ good:;
best_length = pfs.best_length;
bad:;
- } while (bits != 0);
+ } while (bits != TRACK_BIT_NONE);
*track = best_track;
return best_bird_dist;
diff --git a/src/pathfinder/pathfinder_type.h b/src/pathfinder/pathfinder_type.h
index 9f5a42d76d..73031d5c81 100644
--- a/src/pathfinder/pathfinder_type.h
+++ b/src/pathfinder/pathfinder_type.h
@@ -20,8 +20,8 @@ static const int NPF_TILE_LENGTH = 100;
/**
* This penalty is the equivalent of "infinite", which means that paths that
* get this penalty will be chosen, but only if there is no other route
- * without it. Be careful with not applying this penalty to often, or the
- * total path cost might overflow..
+ * without it. Be careful with not applying this penalty too often, or the
+ * total path cost might overflow.
*/
static const int NPF_INFINITE_PENALTY = 1000 * NPF_TILE_LENGTH;
@@ -35,8 +35,8 @@ static const int YAPF_TILE_CORNER_LENGTH = 71;
/**
* This penalty is the equivalent of "infinite", which means that paths that
* get this penalty will be chosen, but only if there is no other route
- * without it. Be careful with not applying this penalty to often, or the
- * total path cost might overflow..
+ * without it. Be careful with not applying this penalty too often, or the
+ * total path cost might overflow.
*/
static const int YAPF_INFINITE_PENALTY = 1000 * YAPF_TILE_LENGTH;
diff --git a/src/pathfinder/yapf/nodelist.hpp b/src/pathfinder/yapf/nodelist.hpp
index e82f869f1e..87e65fd26e 100644
--- a/src/pathfinder/yapf/nodelist.hpp
+++ b/src/pathfinder/yapf/nodelist.hpp
@@ -25,7 +25,7 @@ template
class CNodeList_HashTableT {
public:
typedef Titem_ Titem; ///< Make #Titem_ visible from outside of class.
- typedef typename Titem_::Key Key; ///< Make Titem_::Key a property of #HashTable.
+ typedef typename Titem_::Key Key; ///< Make Titem_::Key a property of this class.
typedef SmallArray CItemArray; ///< Type that we will use as item container.
typedef CHashTableT COpenList; ///< How pointers to open nodes will be stored.
typedef CHashTableT CClosedList; ///< How pointers to closed nodes will be stored.
diff --git a/src/pathfinder/yapf/yapf_rail.cpp b/src/pathfinder/yapf/yapf_rail.cpp
index dccee36860..d3f8e8aeee 100644
--- a/src/pathfinder/yapf/yapf_rail.cpp
+++ b/src/pathfinder/yapf/yapf_rail.cpp
@@ -28,6 +28,8 @@ template void DumpState(Tpf &pf1, Tpf &pf2)
pf2.DumpBase(dmp2);
FILE *f1 = fopen("yapf1.txt", "wt");
FILE *f2 = fopen("yapf2.txt", "wt");
+ assert(f1 != NULL);
+ assert(f2 != NULL);
fwrite(dmp1.m_out.Data(), 1, dmp1.m_out.Size(), f1);
fwrite(dmp2.m_out.Data(), 1, dmp2.m_out.Size(), f2);
fclose(f1);
diff --git a/src/pathfinder/yapf/yapf_road.cpp b/src/pathfinder/yapf/yapf_road.cpp
index edc8d2a3a3..0240eb9366 100644
--- a/src/pathfinder/yapf/yapf_road.cpp
+++ b/src/pathfinder/yapf/yapf_road.cpp
@@ -27,6 +27,10 @@ public:
typedef typename Node::Key Key; ///< key to hash tables
protected:
+ int m_max_cost;
+
+ CYapfCostRoadT() : m_max_cost(0) {};
+
/** to access inherited path finder */
Tpf& Yapf()
{
@@ -97,6 +101,11 @@ protected:
}
public:
+ inline void SetMaxCost(int max_cost)
+ {
+ m_max_cost = max_cost;
+ }
+
/**
* Called by YAPF to calculate the cost from the origin to the given node.
* Calculates only the cost of given node, adds it to the parent node cost
@@ -109,6 +118,8 @@ public:
/* start at n.m_key.m_tile / n.m_key.m_td and walk to the end of segment */
TileIndex tile = n.m_key.m_tile;
Trackdir trackdir = n.m_key.m_td;
+ int parent_cost = (n.m_parent != NULL) ? n.m_parent->m_cost : 0;
+
for (;;) {
/* base tile cost depending on distance between edges */
segment_cost += Yapf().OneTileCost(tile, trackdir);
@@ -117,6 +128,12 @@ public:
/* we have reached the vehicle's destination - segment should end here to avoid target skipping */
if (Yapf().PfDetectDestinationTile(tile, trackdir)) break;
+ /* Finish if we already exceeded the maximum path cost (i.e. when
+ * searching for the nearest depot). */
+ if (m_max_cost > 0 && (parent_cost + segment_cost) > m_max_cost) {
+ return false;
+ }
+
/* stop if we have just entered the depot */
if (IsRoadDepotTile(tile) && trackdir == DiagDirToDiagTrackdir(ReverseDiagDir(GetRoadDepotDirection(tile)))) {
/* next time we will reverse and leave the depot */
@@ -160,7 +177,6 @@ public:
n.m_segment_last_td = trackdir;
/* save also tile cost */
- int parent_cost = (n.m_parent != NULL) ? n.m_parent->m_cost : 0;
n.m_cost = parent_cost + segment_cost;
return true;
}
@@ -441,15 +457,12 @@ public:
* @param tile Tile of the vehicle.
* @param td Trackdir of the vehicle.
* @param max_distance max length (penalty) for paths.
- * @todo max_distance not used by YAPF for road vehicles.
- * It can be removed or copy the SetMaxCost() strategy
- * applied in YAPF for rail. The best depot can be at
- * a distance greater than max_distance.
*/
inline FindDepotData FindNearestDepot(const RoadVehicle *v, TileIndex tile, Trackdir td, int max_distance)
{
/* Set origin. */
Yapf().SetOrigin(tile, TrackdirToTrackdirBits(td));
+ Yapf().SetMaxCost(max_distance);
/* Find the best path and return if no depot is found. */
if (!Yapf().FindPath(v)) return FindDepotData();
diff --git a/src/rail.cpp b/src/rail.cpp
index d538064a23..1664f78e9a 100644
--- a/src/rail.cpp
+++ b/src/rail.cpp
@@ -251,7 +251,7 @@ RailTypes AddDateIntroducedRailTypes(RailTypes current, Date date)
/**
* Get the rail types the given company can build.
- * @param c the company to get the rail types for.
+ * @param company the company to get the rail types for.
* @return the rail types.
*/
RailTypes GetCompanyRailtypes(CompanyID company)
diff --git a/src/rail.h b/src/rail.h
index 1bc403d7fd..b7258d3016 100644
--- a/src/rail.h
+++ b/src/rail.h
@@ -239,7 +239,7 @@ public:
* When #INVALID_DATE or a vehicle using this railtype gets introduced earlier,
* the vehicle's introduction date will be used instead for this railtype.
* The introduction at this date is furthermore limited by the
- * #introduction_required_types.
+ * #introduction_required_railtypes.
*/
Date introduction_date;
diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp
index 5bc97a58dc..a0fd968cc6 100644
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
@@ -166,11 +166,11 @@ RailType AllocateRailType(RailTypeLabel label)
rti->alternate_labels.Clear();
/* Make us compatible with ourself. */
- rti->powered_railtypes = (RailTypes)(1 << rt);
- rti->compatible_railtypes = (RailTypes)(1 << rt);
+ rti->powered_railtypes = (RailTypes)(1LL << rt);
+ rti->compatible_railtypes = (RailTypes)(1LL << rt);
/* We also introduce ourself. */
- rti->introduces_railtypes = (RailTypes)(1 << rt);
+ rti->introduces_railtypes = (RailTypes)(1LL << rt);
/* Default sort order; order of allocation, but with some
* offsets so it's easier for NewGRF to pick a spot without
@@ -441,7 +441,7 @@ static inline bool ValParamTrackOrientation(Track track)
*/
CommandCost CmdBuildSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
{
- RailType railtype = Extract(p1);
+ RailType railtype = Extract(p1);
Track track = Extract