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/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..787a1c76c1 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{c,cpp,h,hpp}] +indent_style = tab +charset = utf-8 diff --git a/.gitignore b/.gitignore index cb1e9d1599..e30aabe37c 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ bin/ai/* bin/baseset/* !bin/baseset/openttd.grf !bin/baseset/opntitle.dat +!bin/baseset/orig_extra.grf !bin/baseset/orig_*.obg !bin/baseset/orig_*.obs !bin/baseset/no_sound.obs @@ -17,14 +18,19 @@ bin/scripts/* !bin/scripts/*.example !bin/scripts/readme.txt +*.aps bundle/* bundles/* docs/aidocs/* docs/gamedocs/* docs/source/* +.kdev4 +.kdev4/* +*.kdev4 media/openttd.desktop media/openttd.desktop.install objs/* +projects/.vs projects/Debug projects/Release projects/*.ncb @@ -33,6 +39,8 @@ projects/*.sdf projects/*.opensdf projects/*.vcproj.*.user projects/*.vcxproj.user +projects/*.VC.db +projects/*.VC.opendb src/rev.cpp src/os/windows/ottdres.rc diff --git a/.hgignore b/.hgignore index debab32b0e..03d99c6f29 100644 --- a/.hgignore +++ b/.hgignore @@ -1,6 +1,7 @@ syntax: glob .svn +*.aps bin/baseset/openttd.32.bmp bin/lang/* bin/openttd* @@ -13,12 +14,16 @@ config.pwd docs/aidocs/* docs/gamedocs/* docs/source/* +.kdev4 +.kdev4/* +*.kdev4 Makefile Makefile.am Makefile.bundle media/openttd.desktop media/openttd.desktop.install objs/* +projects/.vs projects/*.ncb projects/*.suo projects/*.sdf diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..2c7ce528c9 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,181 @@ + +# Contributing to OpenTTD + +Looking to contribute something to OpenTTD? **Here's how you can help.** + +Please take a moment to review this document in order to make the contribution process easy and effective for everyone involved. + +Following these guidelines helps to communicate that you respect the time of the developers managing and developing this open source project. In return, they should reciprocate that respect in addressing your issue or assessing patches and features. + + +## Using the issue tracker + +The [issue tracker](https://github.com/OpenTTD/OpenTTD/issues) is the preferred channel for [bug reports](#bug-reports), but please respect the following restrictions: + +* Please **do not** use the issue tracker for help playing or using OpenTTD. Please try [irc](https://wiki.openttd.org/IRC_channel), or the [forums](https://www.tt-forums.net/) + +* Please **do not** derail or troll issues. Keep the discussion on topic and respect the opinions of others. + +* Please **do not** post comments consisting solely of "+1" or ":thumbsup:". +Use [GitHub's "reactions" feature](https://github.com/blog/2119-add-reactions-to-pull-requests-issues-and-comments) instead. We reserve the right to delete comments which violate this rule. + +* Please **do not** open issues or pull requests regarding add-on content in NewGRF, GameScripts, AIs, etc. These are created by third-parties. Please try [irc](https://wiki.openttd.org/IRC_channel) or the [forums](https://www.tt-forums.net/) to discuss these. + +## Bug reports + +A bug is a _demonstrable problem_ that is caused by the code in the repository. +Good bug reports are extremely helpful, so thanks! + +Guidelines for bug reports: + +0. Please don't report issues with games where you changed NewGRFs. + +1. Please don't report issues with modified versions of OpenTTD (patchpacks and similar). + +2. **Use the GitHub issue search** --- check if the issue has already been +reported. + +3. **Check if the issue has been fixed** --- try to reproduce it using the latest `nightly` build of OpenTTD, available from https://www.openttd.org + +4. **Isolate the problem** --- ideally create reproduceable steps with an attached savegame and screenshots. Try to use few or no NewGRFs, AIs etc if possible. + +A good bug report shouldn't leave others needing to chase you up for more information. +Please try to be as detailed as possible in your report. + +* What is your environment? +* What steps will reproduce the issue? +* Which operating system(s) experience the problem? +* What would you expect to be the outcome? + +All these details will help people to fix any potential bugs. + +Example: + +> Short and descriptive example bug report title +> +> A summary of the issue and the OS environment in which it occurs. If +> suitable, include the steps required to reproduce the bug. +> +> 1. This is the first step +> 2. This is the second step +> 3. Further steps, etc. +> +> Attached savegame +> Attached screenshots showing the issue +> Crashlogs if the bug causes a crash +> +> Any other information you want to share that is relevant to the issue being +> reported. This might include the lines of code that you have identified as +> causing the bug, and potential solutions (and your opinions on their +> merits). + +## Feature requests + +Before opening a feature request, please take a moment to find out whether your idea fits with the scope and aims of the project. + +It's up to *you* to make a strong case to convince the project's developers of the merits of this feature. + +Please provide as much detail and context as possible. This means don't request for a solution, but describe the problem you see and how/why you think it should be fixed. + +For feature request we have a strict policy. + +Keeping issues around with "a good idea" or "not really a bug but we should maybe fix it" turns out to have the reversed effect: nobody looks at it anymore. + +Although we really appreciate feedback and ideas, we will close feature requests that we don't expect to fulfill in the next year. + +Many of those ideas etc do have a place on the [forums](https://www.tt-forums.net); and if enough people like it, someone will stand up and make it. + +It's usually best discuss in [irc](https://wiki.openttd.org/IRC_channel) before opening a feature request or working on a large feature in a fork. +Discussion in irc can take time, but it can be productive and avoid disappointment :) + +## Pull requests + +Good pull requests—patches, improvements, new features—are a fantastic help. +They should remain focused in scope and avoid containing unrelated commits. + +**Please ask first** before embarking on any significant pull request (e.g. implementing features, refactoring code, porting to a different language), otherwise you risk spending a lot of time working on something that the project's developers might not want to merge into the project. + +Please adhere to the [coding guidelines](#code-guidelines) used throughout the project (indentation, accurate comments, etc.) and any other requirements (such as test coverage). + +Adhering to the following process is the best way to get your work included in the project: + +1. [Fork](https://help.github.com/fork-a-repo/) the project, clone your fork, and configure the remotes: + +```bash +git clone https://github.com//OpenTTD.git openttd +git clone https://github.com/OpenTTD/OpenTTD-git-hooks.git openttd_hooks +cd openttd +git remote add upstream https://github.com/OpenTTD/OpenTTD.git +cd .git/hooks +ln -s ../../../openttd_hooks/hooks/* . +``` + +2. If you cloned a while ago, get the latest changes from upstream: + +```bash +git fetch upstream +``` + +3. Create a new topic branch (off the main project development branch) to +contain your feature, change, or fix: + +```bash +git checkout upstream/master -b +``` + +4. Commit your changes in logical chunks. Please adhere to these [git commit message guidelines](https://wiki.openttd.org/Commit_style#Commit_message) or your code is unlikely to be merged into the main project. +Use Git's [interactive rebase](https://help.github.com/articles/interactive-rebase) feature to tidy up your commits before making them public. + +5. Locally rebase the upstream development branch into your topic branch: + +```bash +git fetch upstream +git rebase upstream/master +``` + +6. Push your topic branch up to your fork the first time: + +```bash +git push --set-upstream origin +``` + +And any time after that: + +```bash +git push +``` + +7. [Open a Pull Request](https://help.github.com/articles/using-pull-requests/) with a clear title and description against the `master` branch. + +**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. + +The results of the CI tests will show on your pull request. + +By clicking on Details you can further zoom in; in case of a failure it will show you why it failed. In case of success it will report how awesome you were. + +## Code guidelines + +[Code style](https://wiki.openttd.org/Coding_style) must be adhered to for pull requests to be accepted + +## License + +By contributing your code, you agree to license your contribution under the [GPL v2](https://github.com/OpenTTD/OpenTTD/blob/master/COPYING). + +### 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/COPYING b/COPYING index 829ec64179..b790734971 100644 --- a/COPYING +++ b/COPYING @@ -1,5 +1,5 @@ This is the license which applies to OpenTTD with the exception of some -3rd party modules. See readme.txt for details +3rd party modules. See README.md for details GNU GENERAL PUBLIC LICENSE diff --git a/Doxyfile b/Doxyfile index 957ba60e19..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 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/Makefile.bundle.in b/Makefile.bundle.in index 969b2ebcf0..ff9ec1b2e1 100644 --- a/Makefile.bundle.in +++ b/Makefile.bundle.in @@ -12,15 +12,15 @@ # The revision is needed for the bundle name and creating an OSX application bundle. # Detect the revision VERSIONS := $(shell AWK="$(AWK)" "$(ROOT_DIR)/findversion.sh") -REV := $(shell echo "$(VERSIONS)" | cut -f 1 -d' ') +VERSION := $(shell echo "$(VERSIONS)" | cut -f 1 -d' ') -# Make sure we have something in REV -ifeq ($(REV),) -REV := norev000 +# Make sure we have something in VERSION +ifeq ($(VERSION),) +VERSION := norev000 endif ifndef BUNDLE_NAME -BUNDLE_NAME = openttd-custom-$(REV)-$(OS) +BUNDLE_NAME = openttd-custom-$(VERSION)-$(OS) endif # An OSX application bundle needs the data files, lang files and openttd executable in a different location. @@ -69,7 +69,7 @@ endif $(Q)cp "$(BIN_DIR)/baseset/opntitle.dat" "$(BASESET_DIR)/" $(Q)cp "$(BIN_DIR)/baseset/"*.obm "$(BASESET_DIR)/" $(Q)cp "$(BIN_DIR)/lang/"*.lng "$(LANG_DIR)/" - $(Q)cp "$(ROOT_DIR)/readme.txt" "$(BUNDLE_DIR)/" + $(Q)cp "$(ROOT_DIR)/README.md" "$(BUNDLE_DIR)/" $(Q)cp "$(ROOT_DIR)/COPYING" "$(BUNDLE_DIR)/" $(Q)cp "$(ROOT_DIR)/known-bugs.txt" "$(BUNDLE_DIR)/" $(Q)cp "$(ROOT_DIR)/docs/multiplayer.txt" "$(BUNDLE_DIR)/docs/" @@ -84,11 +84,11 @@ endif $(Q)cp "$(BIN_DIR)/scripts/"* "$(BUNDLE_DIR)/scripts/" ifdef MENU_DIR $(Q)cp "$(ROOT_DIR)/media/openttd.desktop" "$(BUNDLE_DIR)/media/" - $(Q)$(AWK) -f "$(ROOT_DIR)/media/openttd.desktop.translation.awk" "$(SRC_DIR)/lang/"*.txt | $(SORT) | $(AWK) -f "$(ROOT_DIR)/media/openttd.desktop.filter.awk" >> "$(BUNDLE_DIR)/media/openttd.desktop" + $(Q)$(AWK) -f "$(ROOT_DIR)/media/openttd.desktop.translation.awk" "$(SRC_DIR)/lang/"*.txt | LC_ALL=C $(SORT) | $(AWK) -f "$(ROOT_DIR)/media/openttd.desktop.filter.awk" >> "$(BUNDLE_DIR)/media/openttd.desktop" $(Q)sed s/=openttd/=$(BINARY_NAME)/g "$(BUNDLE_DIR)/media/openttd.desktop" > "$(ROOT_DIR)/media/openttd.desktop.install" endif ifeq ($(TTD), openttd.exe) - $(Q)unix2dos "$(BUNDLE_DIR)/docs/"* "$(BUNDLE_DIR)/readme.txt" "$(BUNDLE_DIR)/COPYING" "$(BUNDLE_DIR)/changelog.txt" "$(BUNDLE_DIR)/known-bugs.txt" + $(Q)unix2dos "$(BUNDLE_DIR)/docs/"* "$(BUNDLE_DIR)/README.md" "$(BUNDLE_DIR)/COPYING" "$(BUNDLE_DIR)/changelog.txt" "$(BUNDLE_DIR)/known-bugs.txt" ifeq ($(OS), DOS) $(Q)cp "$(ROOT_DIR)/os/dos/cwsdpmi/cwsdpmi.txt" "$(BUNDLE_DIR)/docs/" ifndef STRIP @@ -159,7 +159,7 @@ bundle_dmg: bundle bundle_exe: all @echo '[BUNDLE] Creating $(BUNDLE_NAME).exe' $(Q)mkdir -p "$(BUNDLES_DIR)" - $(Q)unix2dos "$(ROOT_DIR)/docs/"*.txt "$(ROOT_DIR)/readme.txt" "$(ROOT_DIR)/COPYING" "$(ROOT_DIR)/changelog.txt" "$(ROOT_DIR)/known-bugs.txt" + $(Q)unix2dos "$(ROOT_DIR)/docs/"*.txt "$(ROOT_DIR)/README.md" "$(ROOT_DIR)/COPYING" "$(ROOT_DIR)/changelog.txt" "$(ROOT_DIR)/known-bugs.txt" $(Q)cd $(ROOT_DIR)/os/windows/installer && makensis.exe //DVERSION_INCLUDE=version_$(PLATFORM).txt install.nsi $(Q)mv $(ROOT_DIR)/os/windows/installer/*$(PLATFORM).exe "$(BUNDLES_DIR)/$(BUNDLE_NAME).exe" @@ -188,7 +188,7 @@ endif $(Q)install -m 644 "$(BUNDLE_DIR)/scripts/"* "$(INSTALL_DATA_DIR)/scripts" ifndef DO_NOT_INSTALL_DOCS $(Q)install -d "$(INSTALL_DOC_DIR)" - $(Q)install -m 644 "$(BUNDLE_DIR)/docs/"* "$(BUNDLE_DIR)/readme.txt" "$(BUNDLE_DIR)/known-bugs.txt" "$(INSTALL_DOC_DIR)" + $(Q)install -m 644 "$(BUNDLE_DIR)/docs/"* "$(BUNDLE_DIR)/README.md" "$(BUNDLE_DIR)/known-bugs.txt" "$(INSTALL_DOC_DIR)" endif ifndef DO_NOT_INSTALL_CHANGELOG $(Q)install -d "$(INSTALL_DOC_DIR)" diff --git a/Makefile.grf.in b/Makefile.grf.in index 1cc2642320..1625b9e4c0 100644 --- a/Makefile.grf.in +++ b/Makefile.grf.in @@ -44,22 +44,18 @@ PNG_FILES := $(GRF_DIR)/*.png $(GRF_DIR)/rivers/*.png # Build the GRF. ifdef GRFCODEC -all: $(BIN_DIR)/openttd.grf $(BIN_DIR)/orig_dos.obg $(BIN_DIR)/orig_dos_de.obg $(BIN_DIR)/orig_win.obg $(BIN_DIR)/orig_dos.obs $(BIN_DIR)/orig_win.obs $(BIN_DIR)/no_sound.obs $(BIN_DIR)/orig_win.obm $(BIN_DIR)/no_music.obm +all: $(BIN_DIR)/openttd.grf $(BIN_DIR)/orig_extra.grf $(BIN_DIR)/orig_dos.obg $(BIN_DIR)/orig_dos_de.obg $(BIN_DIR)/orig_win.obg $(BIN_DIR)/orig_dos.obs $(BIN_DIR)/orig_win.obs $(BIN_DIR)/no_sound.obs $(BIN_DIR)/orig_win.obm $(BIN_DIR)/no_music.obm else all: endif -# Make sure the sprites directory exists. -$(OBJS_DIR)/sprites: - $(Q)-mkdir "$@" - $(OBJS_DIR)/langfiles.tmp: $(LANG_DIR)/*.txt $(E) '$(STAGE) Collecting baseset translations' $(Q) cat $^ > $@ -$(BIN_DIR)/%.obg: $(BASESET_DIR)/%.obg $(BIN_DIR)/openttd.grf $(OBJS_DIR)/langfiles.tmp $(BASESET_DIR)/translations.awk +$(BIN_DIR)/%.obg: $(BASESET_DIR)/%.obg $(BIN_DIR)/orig_extra.grf $(OBJS_DIR)/langfiles.tmp $(BASESET_DIR)/translations.awk $(E) '$(STAGE) Updating $(notdir $@)' - $(Q) sed 's/^OPENTTD.GRF = *[0-9a-f]*$$/OPENTTD.GRF = '`$(MD5SUM) $(BIN_DIR)/openttd.grf | sed 's@ .*@@'`'/' $< > $@.tmp + $(Q) sed 's/^ORIG_EXTRA.GRF = *[0-9a-f]*$$/ORIG_EXTRA.GRF = '`$(MD5SUM) $(BIN_DIR)/orig_extra.grf | sed 's@ .*@@'`'/' $< > $@.tmp $(Q) awk -v langfiles='$(OBJS_DIR)/langfiles.tmp' -f $(BASESET_DIR)/translations.awk $@.tmp >$@ $(Q) rm $@.tmp @@ -72,8 +68,9 @@ $(BIN_DIR)/%.obm: $(BASESET_DIR)/%.obm $(OBJS_DIR)/langfiles.tmp $(BASESET_DIR)/ $(Q) awk -v langfiles='$(OBJS_DIR)/langfiles.tmp' -f $(BASESET_DIR)/translations.awk $< >$@ # Compile extra grf -$(BIN_DIR)/openttd.grf: $(PNG_FILES) $(NFO_FILES) $(OBJS_DIR)/sprites $(GRF_DIR)/assemble_nfo.awk +$(BIN_DIR)/openttd.grf: $(PNG_FILES) $(NFO_FILES) $(GRF_DIR)/assemble_nfo.awk $(E) '$(STAGE) Assembling openttd.nfo' + $(Q)-mkdir -p $(OBJS_DIR)/sprites $(Q)-cp $(PNG_FILES) $(OBJS_DIR)/sprites 2> /dev/null $(Q) awk -f $(GRF_DIR)/assemble_nfo.awk $(GRF_DIR)/openttd.nfo > $(OBJS_DIR)/sprites/openttd.nfo $(Q) $(NFORENUM) -s $(OBJS_DIR)/sprites/openttd.nfo @@ -81,6 +78,17 @@ $(BIN_DIR)/openttd.grf: $(PNG_FILES) $(NFO_FILES) $(OBJS_DIR)/sprites $(GRF_DIR) $(Q) $(GRFCODEC) -n -s -e -p1 $(OBJS_DIR)/openttd.grf $(Q)cp $(OBJS_DIR)/openttd.grf $(BIN_DIR)/openttd.grf +# The copy operation of PNG_FILES is duplicated from the target 'openttd.grf', thus those targets may not run in parallel. +$(BIN_DIR)/orig_extra.grf: $(PNG_FILES) $(NFO_FILES) $(GRF_DIR)/assemble_nfo.awk | $(BIN_DIR)/openttd.grf + $(E) '$(STAGE) Assembling orig_extra.nfo' + $(Q)-mkdir -p $(OBJS_DIR)/sprites + $(Q)-cp $(PNG_FILES) $(OBJS_DIR)/sprites 2> /dev/null + $(Q) awk -f $(GRF_DIR)/assemble_nfo.awk $(GRF_DIR)/orig_extra.nfo > $(OBJS_DIR)/sprites/orig_extra.nfo + $(Q) $(NFORENUM) -s $(OBJS_DIR)/sprites/orig_extra.nfo + $(E) '$(STAGE) Compiling orig_extra.grf' + $(Q) $(GRFCODEC) -n -s -e -p1 $(OBJS_DIR)/orig_extra.grf + $(Q)cp $(OBJS_DIR)/orig_extra.grf $(BIN_DIR)/orig_extra.grf + # Clean up temporary files. clean: $(Q)rm -f *.bak *.grf diff --git a/Makefile.in b/Makefile.in index 0d50fc1b1e..d33d8a0d2a 100644 --- a/Makefile.in +++ b/Makefile.in @@ -152,7 +152,7 @@ mrproper: distclean: mrproper maintainer-clean: distclean - $(Q)rm -f $(BIN_DIR)/baseset/openttd.grf $(BIN_DIR)/baseset/*.obg $(BIN_DIR)/baseset/*.obs $(BIN_DIR)/baseset/*.obm + $(Q)rm -f $(BIN_DIR)/baseset/openttd.grf $(BIN_DIR)/baseset/orig_extra.grf $(BIN_DIR)/baseset/*.obg $(BIN_DIR)/baseset/*.obs $(BIN_DIR)/baseset/*.obm depend: @for dir in $(SRC_DIRS); do \ diff --git a/Makefile.lang.in b/Makefile.lang.in index fbed06b790..2853ae3898 100644 --- a/Makefile.lang.in +++ b/Makefile.lang.in @@ -6,7 +6,6 @@ # 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 . STRGEN = !!STRGEN!! -ENDIAN_CHECK = !!ENDIAN_CHECK!! SRC_DIR = !!SRC_DIR!! LANG_DIR = !!LANG_DIR!! BIN_DIR = !!BIN_DIR!! @@ -25,11 +24,6 @@ ifeq ($(LANG_SUPPRESS), yes) LANG_ERRORS = >/dev/null 2>&1 endif -# Make sure endian_host.h is reachable as if it was in the src/ dir -CFLAGS_BUILD += -I $(LANG_OBJS_DIR) - -ENDIAN_TARGETS := endian_host.h endian_target.h $(ENDIAN_CHECK) - # Check if we want to show what we are doing ifdef VERBOSE Q = @@ -43,19 +37,19 @@ RES := $(shell mkdir -p $(BIN_DIR)/lang ) all: table/strings.h $(LANGS) -strgen_base.o: $(SRC_DIR)/strgen/strgen_base.cpp $(SRC_DIR)/strgen/strgen.h endian_host.h $(SRC_DIR)/table/control_codes.h $(SRC_DIR)/table/strgen_tables.h $(SRC_DIR)/safeguards.h +strgen_base.o: $(SRC_DIR)/strgen/strgen_base.cpp $(SRC_DIR)/strgen/strgen.h $(SRC_DIR)/table/control_codes.h $(SRC_DIR)/table/strgen_tables.h $(SRC_DIR)/safeguards.h $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)' $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $< -strgen.o: $(SRC_DIR)/strgen/strgen.cpp $(SRC_DIR)/strgen/strgen.h endian_host.h $(SRC_DIR)/table/control_codes.h $(SRC_DIR)/table/strgen_tables.h $(SRC_DIR)/safeguards.h +strgen.o: $(SRC_DIR)/strgen/strgen.cpp $(SRC_DIR)/strgen/strgen.h $(SRC_DIR)/table/control_codes.h $(SRC_DIR)/table/strgen_tables.h $(SRC_DIR)/safeguards.h $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)' $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $< -string.o: $(SRC_DIR)/string.cpp endian_host.h $(SRC_DIR)/safeguards.h +string.o: $(SRC_DIR)/string.cpp $(SRC_DIR)/safeguards.h $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)' $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $< -alloc_func.o: $(SRC_DIR)/core/alloc_func.cpp endian_host.h $(SRC_DIR)/safeguards.h +alloc_func.o: $(SRC_DIR)/core/alloc_func.cpp $(SRC_DIR)/safeguards.h $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)' $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $< @@ -80,21 +74,11 @@ $(LANGS): %.lng: $(LANG_DIR)/%.txt $(STRGEN) lang/english.txt $(E) '$(STAGE) Compiling language $(*F)' $(Q)./$(STRGEN) $(STRGEN_FLAGS) -s $(LANG_DIR) -d $(LANG_OBJS_DIR) $< $(LANG_ERRORS) && cp $@ $(BIN_DIR)/lang || true # Do not fail all languages when one fails -# The targets to compile the endian-code - -endian_host.h: $(ENDIAN_CHECK) - $(E) '$(STAGE) Testing endianness for host' - $(Q)./$(ENDIAN_CHECK) > $@ - -$(ENDIAN_CHECK): $(SRC_DIR)/endian_check.cpp - $(E) '$(STAGE) Compiling and Linking $@' - $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) $(LDFLAGS_BUILD) $< -o $@ - 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.* $(ENDIAN_TARGETS) + $(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 d89501d21b..1e2dc992f8 100644 --- a/Makefile.setting.in +++ b/Makefile.setting.in @@ -6,7 +6,6 @@ # 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 . SETTINGSGEN = !!SETTINGSGEN!! -ENDIAN_CHECK = !!ENDIAN_CHECK!! SRC_DIR = !!SRC_DIR!! CXX_BUILD = !!CXX_BUILD!! CFLAGS_BUILD = !!CFLAGS_BUILD!! @@ -15,8 +14,6 @@ LDFLAGS_BUILD = !!LDFLAGS_BUILD!! STAGE = !!STAGE!! SETTING_OBJS_DIR = !!SETTING_OBJS_DIR!! -ENDIAN_TARGETS := endian_host.h endian_target.h $(ENDIAN_CHECK) - # Check if we want to show what we are doing ifdef VERBOSE Q = @@ -32,7 +29,7 @@ settingsgen.o: $(SRC_DIR)/settingsgen/settingsgen.cpp $(SRC_DIR)/string_func.h $ $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)' $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $< -alloc_func.o: $(SRC_DIR)/core/alloc_func.cpp endian_host.h $(SRC_DIR)/safeguards.h +alloc_func.o: $(SRC_DIR)/core/alloc_func.cpp $(SRC_DIR)/safeguards.h $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)' $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $< @@ -40,7 +37,7 @@ getoptdata.o: $(SRC_DIR)/misc/getoptdata.cpp $(SRC_DIR)/misc/getoptdata.h $(SRC_ $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/misc/%.cpp=%.cpp)' $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $< -string.o: $(SRC_DIR)/string.cpp endian_host.h $(SRC_DIR)/safeguards.h +string.o: $(SRC_DIR)/string.cpp $(SRC_DIR)/safeguards.h $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)' $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $< @@ -57,21 +54,11 @@ table/settings.h: $(SETTINGSGEN) $(SRC_DIR)/table/settings.h.preamble $(SRC_DIR) @mkdir -p table $(Q)./$(SETTINGSGEN) -o table/settings.h -b $(SRC_DIR)/table/settings.h.preamble -a $(SRC_DIR)/table/settings.h.postamble $(SRC_DIR)/table/*.ini -# The targets to compile the endian-code - -endian_host.h: $(ENDIAN_CHECK) - $(E) '$(STAGE) Testing endianness for host' - $(Q)./$(ENDIAN_CHECK) > $@ - -$(ENDIAN_CHECK): $(SRC_DIR)/endian_check.cpp - $(E) '$(STAGE) Compiling and Linking $@' - $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) $(LDFLAGS_BUILD) $< -o $@ - depend: clean: $(E) '$(STAGE) Cleaning up settings files' - $(Q)rm -f settingsgen.o alloc_func.o getoptdata.o ini_load.o $(SETTINGSGEN) $(ENDIAN_TARGETS) 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/Makefile.src.in b/Makefile.src.in index 1d654d283f..0589ba69a6 100644 --- a/Makefile.src.in +++ b/Makefile.src.in @@ -29,9 +29,7 @@ SCRIPT_SRC_DIR = !!SCRIPT_SRC_DIR!! MEDIA_DIR = !!MEDIA_DIR!! TTD = !!TTD!! STRGEN = !!STRGEN!! -ENDIAN_CHECK = !!ENDIAN_CHECK!! DEPEND = !!DEPEND!! -ENDIAN_FORCE = !!ENDIAN_FORCE!! OS = !!OS!! STAGE = !!STAGE!! MAKEDEPEND = !!MAKEDEPEND!! @@ -40,7 +38,6 @@ SORT = !!SORT!! AWK = !!AWK!! CONFIG_CACHE_COMPILER = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_COMPILER!! CONFIG_CACHE_LINKER = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_LINKER!! -CONFIG_CACHE_ENDIAN = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_ENDIAN!! CONFIG_CACHE_SOURCE = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_SOURCE!! CONFIG_CACHE_VERSION = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_VERSION!! @@ -52,19 +49,16 @@ OBJS := $(OBJS_C) $(OBJS_CPP) $(OBJS_MM) $(OBJS_RC) SRCS := !!SRCS!! # All C-files depend on those 3 files -FILE_DEP := $(CONFIG_CACHE_COMPILER) endian_target.h +FILE_DEP := $(CONFIG_CACHE_COMPILER) # Create all dirs and subdirs RES := $(shell mkdir -p $(BIN_DIR) $(sort $(dir $(OBJS)))) -# Make sure endian_target.h is reasable as if it was in the src/ dir CFLAGS += -I $(SRC_OBJS_DIR) -I $(LANG_OBJS_DIR) -I $(SETTING_OBJS_DIR) CFLAGS_MAKEDEP += -I $(SRC_OBJS_DIR) -I $(LANG_OBJS_DIR) -I $(SETTING_OBJS_DIR) ifdef SCRIPT_SRC_DIR CFLAGS_MAKEDEP += -I $(SCRIPT_SRC_DIR) endif -ENDIAN_TARGETS := endian_target.h $(ENDIAN_CHECK) - # Check if we want to show what we are doing ifdef VERBOSE Q = @@ -94,26 +88,25 @@ VERSIONS := $(shell AWK="$(AWK)" "$(ROOT_DIR)/findversion.sh") MODIFIED := $(shell echo "$(VERSIONS)" | cut -f 3 -d' ') # Use autodetected revisions -REV := $(shell echo "$(VERSIONS)" | cut -f 1 -d' ') -REV_NR := $(shell echo "$(VERSIONS)" | cut -f 2 -d' ') +VERSION := $(shell echo "$(VERSIONS)" | cut -f 1 -d' ') +ISODATE := $(shell echo "$(VERSIONS)" | cut -f 2 -d' ') -# Make sure we have something in REV and REV_NR -ifeq ($(REV),) -REV := norev000 +# Make sure we have something in VERSION and ISODATE +ifeq ($(VERSION),) +VERSION := norev000 endif -ifeq ($(REV_NR),) -REV_NR := 0 +ifeq ($(ISODATE),) +ISODATE := 00000000 endif # This helps to recompile if flags change RES := $(shell if [ "`cat $(CONFIG_CACHE_COMPILER) 2>/dev/null`" != "$(CFLAGS) $(CXXFLAGS)" ]; then echo "$(CFLAGS) $(CXXFLAGS)" > $(CONFIG_CACHE_COMPILER); fi ) RES := $(shell if [ "`cat $(CONFIG_CACHE_LINKER) 2>/dev/null`" != "$(LDFLAGS) $(LIBS)" ]; then echo "$(LDFLAGS) $(LIBS)" > $(CONFIG_CACHE_LINKER); fi ) -RES := $(shell if [ "`cat $(CONFIG_CACHE_ENDIAN) 2>/dev/null`" != "$(ENDIAN_FORCE)" ]; then echo "$(ENDIAN_FORCE)" > $(CONFIG_CACHE_ENDIAN); fi ) # If there is a change in the source-file-list, make sure we recheck the deps RES := $(shell if [ "`cat $(CONFIG_CACHE_SOURCE) 2>/dev/null`" != "$(SRCS)" ]; then echo "$(SRCS)" > $(CONFIG_CACHE_SOURCE); fi ) # If there is a change in the revision, make sure we recompile rev.cpp -RES := $(shell if [ "`cat $(CONFIG_CACHE_VERSION) 2>/dev/null`" != "$(REV) $(MODIFIED)" ]; then echo "$(REV) $(MODIFIED)" > $(CONFIG_CACHE_VERSION); fi ) +RES := $(shell if [ "`cat $(CONFIG_CACHE_VERSION) 2>/dev/null`" != "$(VERSION) $(MODIFIED)" ]; then echo "$(VERSION) $(MODIFIED)" > $(CONFIG_CACHE_VERSION); fi ) ifndef MAKEDEPEND # The slow, but always correct, dep-check @@ -121,7 +114,7 @@ DEP_MASK := %.d DEPS := $(OBJS:%.o=%.d) # Only include the deps if we are compiling everything -ifeq ($(filter $(ENDIAN_TARGETS) %.o clean mrproper, $(MAKECMDGOALS)),) +ifeq ($(filter %.o clean mrproper, $(MAKECMDGOALS)),) -include $(DEPS) else # In case we want to compile a single target, include the .d file for it @@ -155,7 +148,7 @@ DEP_MASK := DEPS := Makefile.dep # Only include the deps if we are not cleaning -ifeq ($(filter $(ENDIAN_TARGETS) depend clean mrproper, $(MAKECMDGOALS)),) +ifeq ($(filter depend clean mrproper, $(MAKECMDGOALS)),) -include Makefile.dep endif @@ -210,7 +203,7 @@ endif { \ print $$0 \ } \ - ' < Makefile.dep.tmp | sed 's@ *@ @g;s@ $$@@' | $(SORT) > Makefile.dep + ' < Makefile.dep.tmp | sed 's@ *@ @g;s@ $$@@' | LC_ALL=C $(SORT) > Makefile.dep $(Q)rm -f Makefile.dep.tmp Makefile.dep.tmp.bak @@ -264,14 +257,7 @@ endif $(TTD): $(OBJS) $(CONFIG_CACHE_LINKER) $(E) '$(STAGE) Linking $@' -ifeq ($(OS), PSP) - # Because of a bug in the PSP GCC tools, linking via CXX results - # in total chaos and more problems then you can handle. So we need - # CC to link OpenTTD for PSP - $(Q)+$(CC_HOST) $(LDFLAGS) $(OBJS) $(LIBS) -o $@ -else $(Q)+$(CXX_HOST) $(LDFLAGS) $(OBJS) $(LIBS) -o $@ -endif ifdef STRIP $(Q)$(STRIP) $@ endif @@ -280,23 +266,13 @@ ifeq ($(OS), DOS) $(Q)$(ROOT_DIR)/os/dos/make_dos_binary_selfcontained.sh $(SRC_OBJS_DIR)/$@ endif -# The targets to compile the endian-code - -endian_target.h: $(ENDIAN_CHECK) $(CONFIG_CACHE_ENDIAN) - $(E) '$(STAGE) Testing endianness for target' - $(Q)./$(ENDIAN_CHECK) $(ENDIAN_FORCE) > $@ - -$(ENDIAN_CHECK): $(SRC_DIR)/endian_check.cpp - $(E) '$(STAGE) Compiling and Linking $@' - $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) $(LDFLAGS_BUILD) $< -o $@ - # Revision files $(SRC_DIR)/rev.cpp: $(CONFIG_CACHE_VERSION) $(SRC_DIR)/rev.cpp.in - $(Q)cat $(SRC_DIR)/rev.cpp.in | sed "s@\!\!REVISION\!\!@$(REV_NR)@g;s@!!VERSION!!@$(REV)@g;s@!!MODIFIED!!@$(MODIFIED)@g;s@!!DATE!!@`date +%d.%m.%y`@g" > $(SRC_DIR)/rev.cpp + $(Q)cat $(SRC_DIR)/rev.cpp.in | sed "s@\!\!ISODATE\!\!@$(ISODATE)@g;s@!!VERSION!!@$(VERSION)@g;s@!!MODIFIED!!@$(MODIFIED)@g;s@!!DATE!!@`date +%d.%m.%y`@g" > $(SRC_DIR)/rev.cpp $(SRC_DIR)/os/windows/ottdres.rc: $(CONFIG_CACHE_VERSION) $(SRC_DIR)/os/windows/ottdres.rc.in - $(Q)cat $(SRC_DIR)/os/windows/ottdres.rc.in | sed "s@\!\!REVISION\!\!@$(REV_NR)@g;s@!!VERSION!!@$(REV)@g;s@!!DATE!!@`date +%d.%m.%y`@g" > $(SRC_DIR)/os/windows/ottdres.rc + $(Q)cat $(SRC_DIR)/os/windows/ottdres.rc.in | sed "s@\!\!ISODATE\!\!@$(ISODATE)@g;s@!!VERSION!!@$(VERSION)@g;s@!!DATE!!@`date +%d.%m.%y`@g" > $(SRC_DIR)/os/windows/ottdres.rc FORCE: @@ -304,7 +280,7 @@ depend: $(DEPS) clean: $(E) '$(STAGE) Cleaning up object files' - $(Q)rm -f $(DEPS) $(OBJS) $(TTD) $(DEPEND) $(TTD:%=$(BIN_DIR)/%) $(BIN_DIR)/baseset/openttd.32.bmp $(CONFIG_CACHE_COMPILER) $(CONFIG_CACHE_LINKER) $(CONFIG_CACHE_ENDIAN) $(CONFIG_CACHE_SOURCE) $(ENDIAN_TARGETS) + $(Q)rm -f $(DEPS) $(OBJS) $(TTD) $(DEPEND) $(TTD:%=$(BIN_DIR)/%) $(BIN_DIR)/baseset/openttd.32.bmp $(CONFIG_CACHE_COMPILER) $(CONFIG_CACHE_LINKER) $(CONFIG_CACHE_SOURCE) mrproper: clean $(Q)rm -f $(SRC_DIR)/rev.cpp $(SRC_DIR)/os/windows/ottdres.rc diff --git a/README.md b/README.md new file mode 100644 index 0000000000..96d3e49f36 --- /dev/null +++ b/README.md @@ -0,0 +1,833 @@ +# OpenTTD + +## Table of contents + +- 1.0) [About](#10-about) +- 2.0) [Contacting](#20-contacting) + - 2.1) [Reporting bugs](#21-reporting-bugs) + - 2.2) [Reporting desyncs](#22-reporting-desyncs) +- 3.0) [Supported platforms](#30-supported-platforms) +- 4.0) [Installing and running OpenTTD](#40-installing-and-running-openttd) + - 4.1) [(Required) 3rd party files](#41-required-3rd-party-files) + - 4.2) [OpenTTD directories](#42-openttd-directories) + - 4.3) [Portable installations (portable media)](#43-portable-installations-portable-media) + - 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) + - 7.2) [Supported compilers](#72-supported-compilers) + - 7.3) [Compilation of base sets](#73-compilation-of-base-sets) +- 8.0) [Translating](#80-translating) + - 8.1) [Translation](#81-translation) + - 8.2) [Previewing](#82-previewing) +- 9.0) [Troubleshooting](#90-troubleshooting) +- 10.0) [Licensing](#100-licensing) +- X.X) [Credits](#xx-credits) + +## 1.0) About + +OpenTTD is a transport simulation game based upon the popular game Transport +Tycoon Deluxe, written by Chris Sawyer. It attempts to mimic the original +game as closely as possible while extending it with new features. + +OpenTTD is licensed under the GNU General Public License version 2.0, +but includes some 3rd party software under different licenses. See the +section "Licensing" below for details. + +## 2.0) Contacting + +The easiest way to contact the OpenTTD team is by submitting bug reports or +posting comments in our forums. You can also chat with us on IRC (#openttd +on irc.oftc.net). + +The OpenTTD homepage is https://www.openttd.org. + +You can also find the OpenTTD forums at +[https://www.tt-forums.net](https://www.tt-forums.net/viewforum.php?f=55). + +### 2.1) Reporting bugs + +First of all, check whether the bug is not already known. Do this by looking +through the file called 'known-bugs.txt' which is distributed with OpenTTD +like this readme. + +For tracking our bugs we are using GitHub's issue tracker. You can find +the tracker at https://github.com/OpenTTD/OpenTTD/issues. Before actually +reporting take a look through the already reported bugs there to see if +the bug is already known. The 'known-bugs.txt' file might be a bit outdated +at the moment you are reading it as only bugs known before the release +are documented there. Also look through the recently closed bugs. + +When you are sure it is not already reported you should: + +- Make sure you are running a recent version, i.e. run the latest stable or + nightly based on where you found the bug. +- Make sure you are not running a non-official binary, like a patch pack. + When you are playing with a patch pack you should report any bugs to the + forum thread related to that patch pack. +- Make it reproducible for the developers. In other words, create a savegame + in which you can reproduce the issue once loaded. It is very useful to give + us the crash.dmp, crash.sav, crash.log and crash screenshot which are + created on crashes. +- Check whether the bug is already reported on our bug tracker. This includes + searching for recently closed bug reports as the bug might already be fixed. + +After you have done all that you can report the bug. Please include the +following information in your bug report: + +- OpenTTD version (PLEASE test the latest SVN/nightly build) +- Bug details, including instructions how to reproduce it +- Platform (Windows, Linux, FreeBSD, …) and compiler (including version) if + you compiled OpenTTD yourself. +- The processor architecture of your OS (32-bit Windows, 64-bit Windows, + Linux on an ARM, Mac OS X on a PowerPC, etc.) +- Attach a saved game **and** a screenshot if possible +- If this bug only occurred recently please note the last version without + the bug and the first version including the bug. That way we can fix it + quicker by looking at the changes made. +- Attach crash.dmp, crash.log and crash.sav. These files are usually created + next to your openttd.cfg. The crash handler will tell you the location. + +### 2.2) Reporting desyncs + +As desyncs are hard to make reproducible OpenTTD has the ability to log all +actions done by clients so we can replay the whole game in an effort to make +desyncs better reproducible. You need to turn this ability on. When turned +on an automatic savegame will be made once the map has been constructed in +the 'save/autosave' directory, see OpenTTD directories to know where to find +this directory. Furthermore the log file 'commands-out.log' will be created +and all actions will be written to there. + +To enable the desync debugging you need to set the debug level for 'desync' +to at least 1. You do this by starting OpenTTD with '`-d desync=`' as +parameter or by typing '`debug_level desync=`' in OpenTTD's internal +console. +The desync debug levels are: + +- 0: nothing. +- 1: dumping of commands to 'commands-out.log'. +- 2: same as 1 plus checking vehicle caches and dumping that too. +- 3: same as 2 plus monthly saves in autosave. +- 4 and higher: same as 3 + +Restarting OpenTTD will overwrite 'commands-out.log'. OpenTTD will not remove +the savegames (dmp_cmds_*.sav) made by the desync debugging system, so you +have to occasionally remove them yourself! + +The naming format of the desync savegames is as follows: +dmp_cmds_XXXXXXXX_YYYYYYYY.sav. The XXXXXXXX is the hexadecimal representation +of the generation seed of the game and YYYYYYYY is the hexadecimal +representation of the date of the game. This sorts the savegames by game and +then by date making it easier to find the right savegames. + +When a desync has occurred with the desync debugging turned on you should file +a bug report with the following files attached: + +- commands-out.log as it contains all the commands that were done +- the last saved savegame (search for the last line beginning with + 'save: dmp_cmds_' in commands-out.log). We use this savegame to check + whether we can quickly reproduce the desync. Otherwise we will need … +- the first saved savegame (search for the first line beginning with 'save' + where the first part, up to the last underscore '_', is the same). We need + this savegame to be able to reproduce the bug when the last savegame is not + old enough. If you loaded a scenario or savegame you need to attach that. +- optionally you can attach the savegames from around 50%, 75%, 85%, 90% and + 95% of the game's progression. We can use these savegames to speed up the + reproduction of the desync, but we should be able to reproduce these + savegames based on the first savegame and commands-out.log. +- in case you use any NewGRFs you should attach the ones you used unless + we can easily find them ourselves via bananas or when they are in the + #openttdcoop pack. + +Do NOT remove the dmp_cmds savegames of a desync you have reported until the +desync has been fixed; if you, by accident, send us the wrong savegames we +will not be able to reproduce the desync and thus will be unable to fix it. + +## 3.0) Supported platforms + +OpenTTD has been ported to several platforms and operating systems. It should +not be very difficult to port it to a new platform. The currently working +platforms are: + +- BeOS (SDL or Allegro) +- DOS (Allegro) +- FreeBSD (SDL) +- Linux (SDL or Allegro) +- macOS (universal) (Cocoa video and sound drivers) +- MorphOS (SDL) +- OpenBSD (SDL) +- OS/2 (SDL) +- Windows (Win32 GDI (faster) or SDL or Allegro) + +## 4.0) Installing and running OpenTTD + +Installing OpenTTD is fairly straightforward. Either you have downloaded an +archive which you have to extract to a directory where you want OpenTTD to +be installed, or you have downloaded an installer, which will automatically +extract OpenTTD in the given directory. + +OpenTTD looks in multiple locations to find the required data files (described +in section 4.2). Installing any 3rd party files into a 'shared' location has +the advantage that you only need to do this step once, rather than copying the +data files into all OpenTTD versions you have. + +Savegames, screenshots, etc are saved relative to the config file (openttd.cfg) +currently being used. This means that if you use a config file in one of the +shared directories, savegames will reside in the save/ directory next to the +openttd.cfg file there. + +If you want savegames and screenshots in the directory where the OpenTTD binary +resides, simply have your config file in that location. But if you remove this +config file, savegames will still be in this directory (see notes in +section 4.2 'OpenTTD directories') + +OpenTTD comes without AIs, so if you want to play with AIs you have to download +them. The easiest way is via the 'Check Online Content' button in the main menu. +You can select some AIs that you think are compatible with your playing style. +Another way is manually downloading the AIs from the forum although then you +need to make sure that you install all the required AI libraries too; they get +automatically selected (and downloaded) if you get the AIs via the 'Check +Online Content'. If you do not have an AI but have configured OpenTTD to start +an AI a message will be shown that the 'dummy' AI has been started. + +### 4.1) (Required) 3rd party files + +Before you run OpenTTD, you need to put the game's data files into a baseset/ +directory which can be located in various places addressed in the following +section. + +For OpenTTD you need to acquire some third party data files. For this you have +the choice of using the original Transport Tycoon Deluxe data files or a set +of free data files. + +Do NOT copy files included with OpenTTD into 'shared' directories (explained in +the following sections) as sooner or later you will run into graphical glitches +when using other versions of the game. + +#### 4.1.1) Free graphics and sound files + +The free data files, split into OpenGFX for graphics, OpenSFX for sounds and +OpenMSX for music can be found at: + +- https://www.openttd.org/download-opengfx for OpenGFX +- https://www.openttd.org/download-opensfx for OpenSFX +- https://www.openttd.org/download-openmsx for OpenMSX + +Please follow the readme of these packages about the installation procedure. +The Windows installer can optionally download and install these packages. + +#### 4.1.2) Original Transport Tycoon Deluxe graphics and sound files + +If you want to play with the original Transport Tycoon Deluxe data files you +have to copy the data files from the CD-ROM into the baseset/ directory. It +does not matter whether you copy them from the DOS or Windows version of +Transport Tycoon Deluxe. The Windows install can optionally copy these files. +You need to copy the following files: +- sample.cat +- trg1r.grf or TRG1.GRF +- trgcr.grf or TRGC.GRF +- trghr.grf or TRGH.GRF +- trgir.grf or TRGI.GRF +- trgtr.grf or TRGT.GRF + +#### 4.1.3) Original Transport Tycoon Deluxe music + +If you want the Transport Tycoon Deluxe music, copy the appropriate files from +the original game into the baseset folder. +- TTD for Windows: All files in the gm/ folder (gm_tt00.gm up to gm_tt21.gm) +- TTD for DOS: The GM.CAT file +- Transport Tycoon Original: The GM.CAT file, but rename it to GM-TTO.CAT + +#### 4.1.4) AIs + +If you want AIs use the in-game content downloader. If for some reason that is +not possible or you want to use an AI that has not been uploaded to the content +download system download the tar file and place it in the ai/ directory. If the +AI needs libraries you will have to download those too and put them in the +ai/library/ directory. All AIs and AI Libraries that have been uploaded to +the content download system can be found at https://noai.openttd.org/downloads. +The AIs and libraries can be found their in the form of .tar.gz packages. +OpenTTD can read inside tar files but it does not extract .tar.gz files by itself. + +To figure out which libraries you need for an AI you have to start the AI and +wait for an error message to pop up. The error message will tell you +'could not find library "lib-name"'. Download that library and try again. + +#### 4.1.5) Game scripts + +If you want an extra challenge in OpenTTD you can download so-called game +scripts via the in-game content downloader. These game scripts have varying +functionality, though they can generally influence town growth, subsidies, add +goals to reach or provide a different ranking system. + +If you download a game script manually you have to follow the same rules as for +AIs, except that game scripts are placed in the game/ directory instead of the +ai/ directory. + +### 4.2) OpenTTD directories + +OpenTTD uses its own directory to store its required 3rd party base set files +(see section 4.1 'Required 3rd party files') and non-compulsory extension and +configuration files. See below for their proper place within this OpenTTD main +data directory. + +The main OpenTTD directories can be found in various locations, depending on +your operating system: + +1. The current working directory (from where you started OpenTTD) + + For non-Windows operating systems OpenTTD will not scan for files in this + directory if it is your personal directory, i.e. '~/', or when it is the + root directory, i.e. '/'. + +2. Your personal directory + - Windows: + - `C:\My Documents\OpenTTD` (95, 98, ME) + - `C:\Documents and Settings\\My Documents\OpenTTD` (2000, XP) + - `C:\Users\\Documents\OpenTTD` (Vista, 7, 8.1, 10) + - macOS: `~/Documents/OpenTTD` + - Linux: `$XDG_DATA_HOME/openttd` which is usually `~/.local/share/openttd` + when built with XDG base directory support, otherwise `~/.openttd` +3. The shared directory + - Windows: + - `C:\Documents and Settings\All Users\Shared Documents\OpenTTD` (2000, XP) + - `C:\Users\Public\Documents\OpenTTD` (Vista, 7, 8.1, 10) + - macOS: `/Library/Application Support/OpenTTD` + - Linux: not available +4. The binary directory (where the OpenTTD executable is) + - Windows: `C:\Program Files\OpenTTD` + - Linux: `/usr/games` +5. The installation directory (Linux only) + - Linux: `/usr/share/games/openttd` +6. The application bundle (macOS only) + + It includes the OpenTTD files (grf+lng) and it will work as long as they + are not touched + +Different types of data or extensions go into different subdirectories of the +chosen main OpenTTD directory: + +| data type | directory | additional info | +| --- | --- | --- | +| Config File | (no subdirectory) | | +| Screenshots | screenshot | | +| Base Graphics | baseset | (or a subdirectory thereof) | +| Sound Sets | baseset | (or a subdirectory thereof) | +| NewGRFs | newgrf | (or a subdirectory thereof) | +| 32bpp Sets | newgrf | (or a subdirectory thereof) | +| Music Sets | baseset | (or a subdirectory thereof) | +| AIs | ai | (or a subdirectory thereof) | +| AI Libraries | ai/library | (or a subdirectory thereof) | +| Game Scripts (GS) | game | (or a subdirectory thereof) | +| GS Libraries | game/library | (or a subdirectory thereof) | +| Savegames | save | | +| Automatic Savegames | save/autosave | | +| Scenarios | scenario | | + +The (automatically created) directory content_download is for OpenTTD's internal +use and no files should be added to it or its subdirectories manually. + +#### Notes: + +- Linux in the previous list means .deb, but most paths should be similar for + others. +- The previous search order is also used for NewGRFs and openttd.cfg. +- If openttd.cfg is not found, then it will be created using the 2, 4, 1, 3, + 5 order. When built with XDG base directory support, openttd.cfg will be + created in $XDG_CONFIG_HOME/openttd which is usually ~/.config/openttd. +- Savegames will be relative to the config file only if there is no save/ + directory in paths with higher priority than the config file path, but + autosaves and screenshots will always be relative to the config file. + Unless the configuration file is in $XDG_CONFIG_HOME/openttd, then all + other files will be saved under $XDG_DATA_HOME/openttd. + +#### The preferred setup: + +Place 3rd party files in shared directory (or in personal directory if you do +not have write access on shared directory) and have your openttd.cfg config +file in personal directory (where the game will then also place savegames and +screenshots). + +### 4.3) Portable installations (portable media) + +You can install OpenTTD on external media so you can take it with you, i.e. +using a USB key, or a USB HDD, etc. +Create a directory where you shall store the game in (i.e. OpenTTD/). +Copy the binary (OpenTTD.exe, OpenTTD.app, openttd, etc), baseset/ and your +openttd.cfg to this directory. +You can copy binaries for any operating system into this directory, which will +allow you to play the game on nearly any computer you can attach the external +media to. +As always - additional grf files are stored in the newgrf/ dir (for details, +again, see section 4.1). + +### 4.4) Files in tar (archives) + +OpenTTD can read files that are in an uncompressed tar (archive), which +makes it easy to bundle files belonging to the same script, NewGRF or base +set. Music sets are the only exception as they cannot be stored in a tar +file due to being played by external applications. + +OpenTTD sees each tar archive as the 'root' of its search path. This means that +having a file with the same path in two different tar files means that one +cannot be opened, after all only one file will be found first. As such it is +advisable to put an uniquely named folder in the root of the tar and put all the +content in that folder. For example, all downloaded content has a path that +concatenates the name of the content and the version, which makes the path +unique. For custom tar files it is advised to do this as well. + +The normal files are also referred to by their relative path from the search +directory, this means that also normal files could hide files in a tar as +long as the relative path from the search path of the normal file is the +same as the path in the tar file. Again it is advised to have an unique path +to the normal file so they do not collide with the files from other tar +files. + +## 5.0) OpenTTD features + +OpenTTD has a lot of features going beyond the original Transport Tycoon Deluxe +emulation. Unfortunately, there is currently no comprehensive list of features, +but there is a basic features list on the web, and some optional features can be +controlled through the Advanced Settings dialog. We also implement some +features known from [TTDPatch](https://www.ttdpatch.net). + +Several important non-standard controls: + +- Ctrl modifies many commands and makes them more powerful. For example Ctrl + clicking on signals with the build signal tool changes their behaviour, + holding Ctrl while the track build tool is activated changes it to the track + removal tool, and so on. See https://wiki.openttd.org/Hidden_features + for a non-comprehensive list or look at the tooltips. +- Ingame console. More information at https://wiki.openttd.org/Console +- Hovering over a GUI element shows tooltips. This can be changed to right click + via the advanced settings. + +### 5.1) Logging of potentially dangerous actions + +OpenTTD is a complex program, and together with NewGRF, it may show a buggy +behaviour. But not only bugs in code can cause problems. There are several +ways to affect game state possibly resulting in program crash or multiplayer +desyncs. + +Easier way would be to forbid all these unsafe actions, but that would affect +game usability for many players. We certainly do not want that. +However, we receive bug reports because of this. To reduce time spent with +solving these problems, these potentially unsafe actions are logged in +the savegame (including crash.sav). Log is stored in crash logs, too. + +Information logged: + +- Adding / removing / changing order of NewGRFs +- Changing NewGRF parameters, loading compatible NewGRF +- Changing game mode (scenario editor <-> normal game) +- Loading game saved in a different OpenTTD / TTDPatch / Transport Tycoon Deluxe / + original Transport Tycoon version +- Running a modified OpenTTD build +- Changing settings affecting NewGRF behaviour (non-network-safe settings) +- Triggering NewGRF bugs + +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 +.INI format. It is mostly undocumented. Almost all settings can be changed +ingame by using the 'Advanced Settings' window. +When you cannot find openttd.cfg you should look in the directories as +described in section 4.2. If you do not have an openttd.cfg OpenTTD will +create one after closing. + +## 7.0) Compiling + +### Windows: + +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), 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. + +### Solaris, FreeBSD, OpenBSD: + +Use '`gmake`', but do a '`./configure`' before the first build. + +### Linux/Unix: + +OpenTTD can be built with GNU '`make`'. On non-GNU systems it is called '`gmake`'. +However, for the first build one has to do a '`./configure`' first. + +### macOS: + +Use '`make`' or Xcode (which will then call make for you) +This will give you a binary for your CPU type (PPC/Intel) +However, for the first build one has to do a '`./configure`' first. +To make a universal binary type '`./configure --enabled-universal`' +instead of '`./configure`'. + +### BeOS: + +Use '`make`', but do a '`./configure`' before the first build. + +### MorphOS: + +Use '`make`'. However, for the first build one has to do a '`./configure`' +first. Note that you need the MorphOS SDK, latest libnix updates (else C++ +parts of OpenTTD will not build) and the powersdl.library SDK. Optionally libz, +libpng and freetype2 developer files. + +### OS/2: + +A comprehensive GNU build environment is required to build the OS/2 version. +See the docs/Readme_OS2.txt file for more information. + +### DOS: + +A build environment with DJGPP is needed as well as libraries such as +Allegro, zlib and libpng, which all can be downloaded from the DJGPP +website. Compilation is straight forward: use '`make`', but do a '`./configure`' +before the first build. The build binary will need cwsdpmi.exe to be in +the same directory as the openttd executable. cwsdpmi.exe can be found in +the os/dos/cwsdpmi subdirectory. If you compile with stripping turned on a +binary will be generated that does not need cwsdpmi.exe by adding the +cswdstub.exe to the created OpenTTD binary. + +### 7.1) Required/optional libraries + +The following libraries are used by OpenTTD for: + +- libSDL/liballegro: hardware access (video, sound, mouse) +- zlib: (de)compressing of old (0.3.0-1.0.5) savegames, content downloads, + heightmaps +- liblzo2: (de)compressing of old (pre 0.3.0) savegames +- liblzma: (de)compressing of savegames (1.1.0 and later) +- libpng: making screenshots and loading heightmaps +- libfreetype: loading generic fonts and rendering them +- libfontconfig: searching for fonts, resolving font names to actual fonts +- libicu: handling of right-to-left scripts (e.g. Arabic and Persian) and + natural sorting of strings. + +OpenTTD does not require any of the libraries to be present, but without +liblzma you cannot open most recent savegames and without zlib you cannot +open most older savegames or use the content downloading system. +Without libSDL/liballegro on non-Windows and non-macOS machines you have +no graphical user interface; you would be building a dedicated server. + +### 7.2) Supported compilers + +The following compilers are known to compile OpenTTD: + +- Microsoft Visual C++ (MSVC) 2005, 2008 and 2010. + Version 2005 gives bogus warnings about scoping issues. +- GNU Compiler Collection (GCC) 3.3 - 4.4, 4.6 - 4.8. + - Versions 4.1 and earlier give bogus warnings about uninitialised variables. + - Versions 4.4, 4.6 give bogus warnings about freeing non-heap objects. + - Versions 4.6 and later give invalid warnings when lto is enabled. +- Intel C++ Compiler (ICC) 12.0. +- Clang/LLVM 2.9 - 3.0 + Version 2.9 gives bogus warnings about code nonconformity. + +The following compilers are known not to compile OpenTTD: + +- Microsoft Visual C++ (MSVC) 2003 and earlier. +- GNU Compiler Collection (GCC) 3.2 and earlier. + These old versions fail due to OpenTTD's template usage. +- GNU Compiler Collection (GCC) 4.5. It optimizes enums too aggressively. + See https://github.com/OpenTTD/OpenTTD/issues/5513 and references therein. +- Intel C++ Compiler (ICC) 11.1 and earlier. + - Version 10.0 and earlier fail a configure check and fail with recent + system headers. + - Version 10.1 fails to compile station_gui.cpp. + - Version 11.1 fails with an internal error when compiling network.cpp. +- Clang/LLVM 2.8 and earlier. +- (Open) Watcom. + +If any of these compilers can compile OpenTTD again, please let us know. +Patches to support more compilers are welcome. + +### 7.3) Compilation of base sets + +To recompile the extra graphics needed to play with the original Transport +Tycoon Deluxe graphics you need GRFCodec (which includes NFORenum) as well. +GRFCodec can be found at https://www.openttd.org/download-grfcodec. +The compilation of these extra graphics does generally not happen, unless +you remove the graphics file using '`make maintainer-clean`'. + +Re-compilation of the base sets, thus also use of '`--maintainer-clean`' can +leave the repository in a modified state as different grfcodec versions can +cause binary differences in the resulting grf. Also translations might have +been added for the base sets which are not yet included in the base set +information files. Use the configure option '`--without-grfcodec`' to avoid +modification of the base set files by the build process. + +## 8.0) Translating + +See https://www.openttd.org/development for up-to-date information. + +The use of the online Translator service, located at +https://translator.openttd.org, is highly encouraged. For getting an account +simply follow the guidelines in the FAQ of the translator website. + +If for some reason the website is down for a longer period of time, the +information below might be of help. + +Please contact the translations manager (https://www.openttd.org/contact) +before beginning the translation process! This avoids double work, as +someone else may have already started translating to the same language. + +### 8.1) Translation + +So, now that you have notified the development team about your intention to +translate (You did, right? Of course you did.) you can pick up english.txt +(found in the SVN repository under /src/lang) and translate. + +You must change the first two lines of the file appropriately: + + ##name English-Name-Of-Language + ##ownname Native-Name-Of-Language + +Note: Do not alter the following parts of the file: + +- String identifiers (the first word on each line) +- Parts of the strings which are in curly braces (such as {STRING}) +- Lines beginning with ## (such as ##id), other than the first two lines + of the file + +### 8.2) Previewing + +In order to view the translation in the game, you need to compile your language +file with the strgen utility. As this utility is tailored to a specific OpenTTD +version, you need to compile it yourself. Just take the normal OpenTTD sources +and build that. During the build process the strgen utility will be made. + +strgen is a command-line utility. It takes the language filename as parameter. + +Example: + + strgen lang/german.txt + +This results in compiling german.txt and produces another file named german.lng. +Any missing strings are replaced with the English strings. Note that it looks +for english.txt in the lang subdirectory, which is where your language file +should also be. + +That is all! You should now be able to select the language in the game options. + +## 9.0) Troubleshooting + +To see all startup options available to you, start OpenTTD with the +'`./openttd -h`' option. This might help you tweak some of the settings. + +If the game is acting strange and you feel adventurous you can try the +'`-d [[=]]`' flag, where the higher levels will give you more +debugging output. The 'name' variable can help you to display only some type of +debugging messages. This is mostly undocumented so best is to look in the +source code file debug.c for the various debugging types. For more information +look at https://wiki.openttd.org/Command_line. + +The most frequent problem is missing data files. Please install OpenGFX and +possibly OpenSFX and OpenMSX. See section 4.1.1 for more information. + +Under certain circumstance, especially on Ubuntu OpenTTD can be extremely slow +and/or freeze. See known-bugs.txt for more information and how to solve this +problem on your computer. + +Under Windows 98 and lower it is impossible to use a dedicated server; it will +fail to start. Perhaps this is for the better because those OSes are not known +for their stability. + +With the added support for font-based text selecting a non-latin language can +result in lots of question marks ('?') being shown on screen. Please open your +configuration file (openttd.cfg - see Section 4.2 for where to find it) +and add a suitable font for the small, medium and / or large font, e.g.: + + small_font = "Tahoma" + medium_font = "Tahoma" + large_font = "Tahoma" + +You should use a font name like 'Tahoma' or a path to the desired font. + +Any NewGRF file used in a game is stored inside the savegame and will refuse to +load if you do not have that NewGRF file available. A list of missing files can +be viewed in the NewGRF window accessible from the file load dialogue window. + +You can try to obtain the missing files from that NewGRF dialogue or – if they +are not available online – you can search manually through our +[forum's graphics development section](https://www.tt-forums.net/viewforum.php?f=66) +or [GRFCrawler](https://grfcrawler.tt-forums.net). Put the NewGRF files in +OpenTTD's newgrf folder (see section 4.2 'OpenTTD directories') and rescan the +list of available NewGRFs. Once you have all missing files, you are set to go. + +## 10.0) Licensing + +OpenTTD is licensed under the GNU General Public License version 2.0. For +the complete license text, see the file 'COPYING'. This license applies +to all files in this distribution, except as noted below. + +The squirrel implementation in src/3rdparty/squirrel is licensed under +the Zlib license. See src/3rdparty/squirrel/COPYRIGHT for the complete +license text. + +The md5 implementation in src/3rdparty/md5 is licensed under the Zlib +license. See the comments in the source files in src/3rdparty/md5 for +the complete license text. + +The implementations of Posix getaddrinfo and getnameinfo for OS/2 in +src/3rdparty/os2 are distributed partly under the GNU Lesser General Public +License 2.1, and partly under the (3-clause) BSD license. The exact licensing +terms can be found in src/3rdparty/os2/getaddrinfo.c resp. +src/3rdparty/os2/getnameinfo.c. + +The exe2coff implementation in os/dos/exe2coff is available under the +GPL, with a number of additional terms. See os/dos/exe2coff/copying and +os/dos/exe2coff/copying.dj for the exact licensing terms. + +The CWSDPMI implementation in os/dos/cwsdpmi is distributed under a +custom binary-only license that prohibits modification. The exact +licensing terms can be found in os/dos/cwsdpmi/cwsdpmi.txt. The sources +for these files can be downloaded at its author site, at +http://homer.rice.edu/~sandmann/cwsdpmi/csdpmi5s.zip. + +CONTRIBUTING.md 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. + +## X.X) Credits + +### The OpenTTD team (in alphabetical order): + +- Grzegorz Duczyński (adf88) - General coding (since 1.7.2) +- Albert Hofkamp (Alberth) - GUI expert (since 0.7) +- Matthijs Kooijman (blathijs) - Pathfinder-guru, Debian port (since 0.3) +- Ulf Hermann (fonsinchen) - Cargo Distribution (since 1.3) +- 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) +- Remko Bijker (Rubidium) - Lead coder and way more (since 0.4.5) +- José Soler (Terkhen) - General coding (since 1.0) +- Leif Linse (Zuu) - AI/Game Script (since 1.2) + +### Inactive Developers: + +- Jean-François Claeys (Belugas) - GUI, newindustries and more (0.4.5 - 1.0) +- Bjarni Corfitzen (Bjarni) - macOS port, coder and vehicles (0.3 - 0.7) +- Victor Fischer (Celestar) - Programming everywhere you need him to (0.3 - 0.6) +- Jaroslav Mazanec (KUDr) - YAPG (Yet Another Pathfinder God) ;) (0.4.5 - 0.6) +- Jonathan Coome (Maedhros) - High priest of the NewGRF Temple (0.5 - 0.6) +- Attila Bán (MiHaMiX) - WebTranslator 1 and 2 (0.3 - 0.5) +- Zdeněk Sojka (SmatZ) - Bug finder and fixer (0.6 - 1.3) +- Christoph Mallon (Tron) - Programmer, code correctness police (0.3 - 0.5) +- Patric Stout (TrueBrain) - NoProgrammer (0.3 - 1.2), sys op (active) +- Thijs Marinussen (Yexo) - AI Framework, General (0.6 - 1.3) + +### Retired Developers: + +- Tamás Faragó (Darkvater) - Ex-Lead coder (0.3 - 0.5) +- Dominik Scherer (dominik81) - Lead programmer, GUI expert (0.3 - 0.3) +- Emil Djupfeld (egladil) - macOS port (0.4 - 0.6) +- Simon Sasburg (HackyKid) - Bug fixer (0.4 - 0.4.5) +- Ludvig Strigeus (ludde) - Original author of OpenTTD, main coder (0.1 - 0.3) +- Cian Duffy (MYOB) - BeOS port / manual writing (0.1 - 0.3) +- Petr Baudiš (pasky) - Many patches, newgrf support, etc. (0.3 - 0.3) +- Benedikt Brüggemeier (skidd13) - Bug fixer and code reworker (0.6 - 0.7) +- Serge Paquet (vurlix) - 2nd contributor after ludde (0.1 - 0.3) + +### Thanks to: + +- Josef Drexler - For his great work on TTDPatch. +- Marcin Grzegorczyk - For his TTDPatch work and documentation of Transport Tycoon Deluxe internals and track foundations +- Stefan Meißner (sign_de) - For his work on the console +- Mike Ragsdale - OpenTTD installer +- Christian Rosentreter (tokai) - MorphOS / AmigaOS port +- Richard Kempton (RichK67) - Additional airports, initial TGP implementation +- Alberto Demichelis - Squirrel scripting language +- L. Peter Deutsch - MD5 implementation +- Michael Blunck - For revolutionizing TTD with awesome graphics +- George - Canal graphics +- Andrew Parkhouse (andythenorth) - River graphics +- David Dallaston (Pikka) - Tram tracks +- All Translators - For their support to make OpenTTD a truly international game +- Bug Reporters - Thanks for all bug reports +- Chris Sawyer - For an amazing game! 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/compat_1.6.nut b/bin/ai/compat_1.6.nut index fe985b90d0..8fb518e1b5 100644 --- a/bin/ai/compat_1.6.nut +++ b/bin/ai/compat_1.6.nut @@ -6,3 +6,5 @@ * 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 . */ + +AILog.Info("1.6 API compatibility in effect."); diff --git a/bin/ai/compat_1.7.nut b/bin/ai/compat_1.7.nut new file mode 100644 index 0000000000..6eb0c980ea --- /dev/null +++ b/bin/ai/compat_1.7.nut @@ -0,0 +1,10 @@ +/* $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 . + */ + +AILog.Info("1.7 API compatibility in effect."); diff --git a/bin/ai/compat_1.8.nut b/bin/ai/compat_1.8.nut new file mode 100644 index 0000000000..95ab6a76dd --- /dev/null +++ b/bin/ai/compat_1.8.nut @@ -0,0 +1,10 @@ +/* $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 . + */ + +AILog.Info("1.8 API compatibility in effect."); diff --git a/bin/ai/compat_1.9.nut b/bin/ai/compat_1.9.nut new file mode 100644 index 0000000000..fe985b90d0 --- /dev/null +++ b/bin/ai/compat_1.9.nut @@ -0,0 +1,8 @@ +/* $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 . + */ diff --git a/bin/ai/regression/regression_info.nut b/bin/ai/regression/regression_info.nut index 4e7aec7568..341d13a085 100644 --- a/bin/ai/regression/regression_info.nut +++ b/bin/ai/regression/regression_info.nut @@ -6,7 +6,7 @@ class Regression extends AIInfo { function GetShortName() { return "REGR"; } function GetDescription() { return "This runs regression-tests on some commands. On the same map the result should always be the same."; } function GetVersion() { return 1; } - function GetAPIVersion() { return "1.6"; } + function GetAPIVersion() { return "1.9"; } function GetDate() { return "2007-03-18"; } function CreateInstance() { return "Regression"; } } 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/bin/baseset/no_music.obm b/bin/baseset/no_music.obm index 07dcedf50b..7a70e3b55d 100644 --- a/bin/baseset/no_music.obm +++ b/bin/baseset/no_music.obm @@ -21,12 +21,15 @@ description.el_GR = Ένα πάκετο μουσικής χωρίς πραγμα description.en_AU = A music pack without actual music. description.en_US = A music pack without actual music. description.es_ES = Un conjunto de música vacío. +description.es_MX = Paquete de música vacío description.et_EE = Muusikakogu ilma muusikata. +description.eu_ES = Musika gabeko musika paketea. description.fi_FI = Musiikkipaketti, jossa ei ole musiikkia. description.fr_FR = Un pack de musiques sans musiques. description.ga_IE = Pacáiste ceoil gan aon cheol iarbhír ann. description.gd_GB = Pacaid ciùil anns nach eil fonn sam bith. description.gl_ES = Un conxunto de músicas sen ningunha música. +description.he_IL = אוסף מנגינות ללא מנגינות. description.hr_HR = Glazbeni paket bez ikakve glazbe. description.hu_HU = Zenei alapcsomag zene nélkül. description.id_ID = Paket musik tanpa musik sungguhan. @@ -38,6 +41,7 @@ description.la_VA = Sarcina musicae sine ulla musica. description.lb_LU = E Musikpack ouni aktuell Musik. description.lt_LT = Muzikos pakas be muzikos. description.lv_LV = Mūzikas kopa bez mūzikas +description.ms_MY = Pek muzik tanpa muzik sebenar. description.nb_NO = En musikkpakke uten noe musikk. description.nl_NL = Een muziekset zonder muziek. description.nn_NO = Ei musikkpakke utan noko musikk. diff --git a/bin/baseset/no_sound.obs b/bin/baseset/no_sound.obs index 522c45b9b9..8bd8d30fe0 100644 --- a/bin/baseset/no_sound.obs +++ b/bin/baseset/no_sound.obs @@ -21,6 +21,7 @@ description.el_GR = Ένα πάκετο ήχων χώρις ήχους. description.en_AU = A sound pack without any sounds. description.en_US = A sound pack without any sounds. description.es_ES = Un conjunto de sonidos vacío. +description.es_MX = Paquete de sonidos vacío description.et_EE = Helikogu ilma helideta. description.eu_ES = Soinurik gabeko soinu pakete bat description.fi_FI = Äänipaketti, jossa ei ole ääniä. @@ -28,6 +29,7 @@ description.fr_FR = Un pack de sons sans sons. description.ga_IE = Pacáiste fuaimeanna gan aon fhuaimeanna ann. description.gd_GB = Pacaid fhuaimean anns nach eil fuaim sam bith. description.gl_ES = Un conxunto de sons sen ningún son +description.he_IL = אוסף צלילים ללא צלילים. description.hr_HR = Zvučni paket bez ikakvih zvukova. description.hu_HU = Hang alapcsomag hangok nélkül. description.id_ID = Paket efek suara tanpa suara apapun. @@ -38,6 +40,7 @@ description.ko_KR = 아무런 효과음도 없는 효과음 팩입니다. description.la_VA = Sarcina sonorum sine ullis sonis. description.lb_LU = E Soundpack ouni iergendee Sound. description.lt_LT = Garsų pakas be jokių garsų. +description.lv_LV = Skaņu kopa bez skaņas. description.nb_NO = En lydpakke uten noen lyder. description.nl_NL = Een geluidset zonder geluid. description.nn_NO = Ei lydpakke utan nokon lydar. diff --git a/bin/baseset/openttd.grf b/bin/baseset/openttd.grf index efe35ffd38..6c9afef2ab 100644 Binary files a/bin/baseset/openttd.grf and b/bin/baseset/openttd.grf differ diff --git a/bin/baseset/orig_dos.obg b/bin/baseset/orig_dos.obg index 693d9dd95f..9d0db3e2af 100644 --- a/bin/baseset/orig_dos.obg +++ b/bin/baseset/orig_dos.obg @@ -22,12 +22,15 @@ description.el_GR = Αρχικά γραφικά από το Transport Tycoon Del description.en_AU = Original Transport Tycoon Deluxe DOS edition graphics. description.en_US = Original Transport Tycoon Deluxe DOS edition graphics. description.es_ES = Gráficos originales de Transport Tycoon Deluxe versión DOS. +description.es_MX = Gráficos originales de Transport Tycoon Deluxe para DOS. description.et_EE = Algse Transport Tycoon Deluxe DOSi versiooni graafika. +description.eu_ES = Transport Tycoon Deluxe originaleko DOS edizioko grafikoak. description.fi_FI = Alkuperäiset Transport Tycoon Deluxen DOS-version grafiikat. description.fr_FR = Graphiques originaux de Transport Tycoon Deluxe (version DOS). description.ga_IE = Grafaicí bunaidhTransport Tycoon Deluxe, eagrán DOS. description.gd_GB = Grafaigeachd aig an deasachadh DOS tùsail aig Transport Tycoon Deluxe. description.gl_ES = Graficos da edición orixinal de Transport Tycoon Deluxe para DOS. +description.he_IL = גרפיקות Transport Tycoon Deluxe המקורי בגרסת DOS. description.hr_HR = Originalna grafika za Transport Tycoon Deluxe DOS izdanje. description.hu_HU = Az eredeti Transport Tycoon Deluxe DOS verziójának grafikája. description.id_ID = Grafik orisinil Transport Tycoon Deluxe versi DOS. @@ -38,6 +41,8 @@ description.ko_KR = 오리지널 트랜스포트 타이쿤 디럭스 도스 에 description.la_VA = Graphica ex editione originale Transport Tycoon Deluxe DOS. description.lb_LU = Original Transport Tycoon Deluxe DOS Editioun Grafik. description.lt_LT = Originali Transport Tycoon Deluxe DOS leidimo grafika. +description.lv_LV = Oriģinālā Transport Tycoon Deluxe DOS izdevuma grafika. +description.ms_MY = Grafik asal Transport Tycoon Deluxe DOS edition. description.nb_NO = Original grafikk fra Transport Tycoon Deluxe for DOS. description.nl_NL = Originele graphics van de Transport Tycoon Deluxe DOS-versie. description.nn_NO = Original grafikk frå Transport Tycoon Deluxe for DOS. @@ -59,21 +64,21 @@ description.zh_CN = 运输大亨DOS豪华版原版图形包. description.zh_TW = 原版 Transport Tycoon Deluxe DOS 版的圖形。 [files] -base = TRG1.GRF -logos = TRGI.GRF -arctic = TRGC.GRF -tropical = TRGH.GRF -toyland = TRGT.GRF -extra = OPENTTD.GRF +base = TRG1.GRF +logos = TRGI.GRF +arctic = TRGC.GRF +tropical = TRGH.GRF +toyland = TRGT.GRF +extra = ORIG_EXTRA.GRF [md5s] -TRG1.GRF = 9311676280e5b14077a8ee41c1b42192 -TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8 -TRGC.GRF = ed446637e034104c5559b32c18afe78d -TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9 -TRGT.GRF = e30e8a398ae86c03dc534a8ac7dfb3b6 -OPENTTD.GRF = 505d96061556d3bb5cec6234096ec5bc +TRG1.GRF = 9311676280e5b14077a8ee41c1b42192 +TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8 +TRGC.GRF = ed446637e034104c5559b32c18afe78d +TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9 +TRGT.GRF = e30e8a398ae86c03dc534a8ac7dfb3b6 +ORIG_EXTRA.GRF = 67bcfac5911667309d86b7749ea8d08c [origin] -default = You can find it on your Transport Tycoon Deluxe CD-ROM. -OPENTTD.GRF = This file was part of your OpenTTD installation. +default = You can find it on your Transport Tycoon Deluxe CD-ROM. +ORIG_EXTRA.GRF = This file was part of your OpenTTD installation. diff --git a/bin/baseset/orig_dos.obm b/bin/baseset/orig_dos.obm new file mode 100644 index 0000000000..cdacc8e7f5 --- /dev/null +++ b/bin/baseset/orig_dos.obm @@ -0,0 +1,76 @@ +; $Id$ +; +; This represents the original music as on the Transport +; Tycoon Deluxe for DOS CD. +; +[metadata] +name = original_dos +shortname = TTDD +version = 1 +description = Original Transport Tycoon Deluxe DOS edition music. + +[files] +theme = gm.cat +old_0 = gm.cat +old_1 = gm.cat +old_2 = gm.cat +old_3 = gm.cat +old_4 = gm.cat +old_5 = gm.cat +old_6 = gm.cat +old_7 = gm.cat +old_8 = +old_9 = +new_0 = gm.cat +new_1 = gm.cat +new_2 = gm.cat +new_3 = gm.cat +new_4 = gm.cat +new_5 = gm.cat +new_6 = gm.cat +new_7 = +new_8 = +new_9 = +ezy_0 = gm.cat +ezy_1 = gm.cat +ezy_2 = gm.cat +ezy_3 = gm.cat +ezy_4 = gm.cat +ezy_5 = gm.cat +ezy_6 = +ezy_7 = +ezy_8 = +ezy_9 = + +[md5s] +gm.cat = 7a29d2d0c4f7d2e03091ffa9b2bdfffb + +[catindex] +theme = 0 +old_0 = 1 +old_1 = 8 +old_2 = 2 +old_3 = 9 +old_4 = 14 +old_5 = 15 +old_6 = 19 +old_7 = 13 +new_0 = 6 +new_1 = 11 +new_2 = 10 +new_3 = 17 +new_4 = 21 +new_5 = 18 +new_6 = 5 +ezy_0 = 12 +ezy_1 = 7 +ezy_2 = 16 +ezy_3 = 3 +ezy_4 = 20 +ezy_5 = 4 + +[names] +; Names get read from the CAT file + +[origin] +default = You can find it on your Transport Tycoon Deluxe CD-ROM. diff --git a/bin/baseset/orig_dos.obs b/bin/baseset/orig_dos.obs index 38eb7b5818..ce2d6d22e6 100644 --- a/bin/baseset/orig_dos.obs +++ b/bin/baseset/orig_dos.obs @@ -21,12 +21,15 @@ description.el_GR = Αρχικοί ήχοι από το Transport Tycoon Deluxe description.en_AU = Original Transport Tycoon Deluxe DOS edition sounds. description.en_US = Original Transport Tycoon Deluxe DOS edition sounds. description.es_ES = Sonidos originales de Transport Tycoon Deluxe versión DOS. +description.es_MX = Sonidos originales de Transport Tycoon Deluxe para DOS. description.et_EE = Algse Transport Tycoon Deluxe DOSi versiooni helid. +description.eu_ES = Transport Tycoon Deluxe originaleko DOS edizioko soinuak. description.fi_FI = Alkuperäiset Transport Tycoon Deluxen DOS-version äänet. description.fr_FR = Sons originaux de Transport Tycoon Deluxe (version DOS). description.ga_IE = Fuaimeanna bunaidh Transport Tycoon Deluxe, eagrán DOS. description.gd_GB = Fuaimean aig an deasachadh DOS tùsail aig Transport Tycoon Deluxe. description.gl_ES = Sons da edición orixinal de Transport Tycoon Deluxe para DOS. +description.he_IL = צלילי Transport Tycoon Deluxe המקורי בגרסת DOS. description.hr_HR = Originalni zvukovi za Transport Tycoon Deluxe DOS izdanje. description.hu_HU = Az eredeti Transport Tycoon Deluxe DOS verziójának hangjai. description.id_ID = Efek suara orisinil Transport Tycoon Deluxe versi DOS. diff --git a/bin/baseset/orig_dos_de.obg b/bin/baseset/orig_dos_de.obg index e9344b3f63..754ab5a2d4 100644 --- a/bin/baseset/orig_dos_de.obg +++ b/bin/baseset/orig_dos_de.obg @@ -22,12 +22,14 @@ description.el_GR = Αρχικά γραφικά από το Transport Tycoon Del description.en_AU = Original Transport Tycoon Deluxe DOS (German) edition graphics. description.en_US = Original Transport Tycoon Deluxe DOS (German) edition graphics. description.es_ES = Gráficos originales de Transport Tycoon Deluxe versión DOS (Alemán). +description.es_MX = Gráficos originales de Transport Tycoon Deluxe para DOS (en alemán). description.et_EE = Algse Transport Tycoon Deluxe DOSi (Saksa) versiooni graafika. description.fi_FI = Alkuperäiset Saksassa julkaistun Transport Tycoon Deluxen DOS-version grafiikat. description.fr_FR = Graphiques originaux de Transport Tycoon Deluxe (version DOS allemande). description.ga_IE = Grafaicí bunaidhTransport Tycoon Deluxe, eagrán DOS (Gearmánach). description.gd_GB = Grafaigeachd aig an deasachadh DOS (Gearmailteach) tùsail aig Transport Tycoon Deluxe. description.gl_ES = Graficos da edición orixinal (alemá) de Transport Tycoon Deluxe para DOS. +description.he_IL = גרפיקות Transport Tycoon Deluxe המקורי בגרסת DOS (גרמנית). description.hr_HR = Originalna grafika za Transport Tycoon Deluxe DOS (Njemački) izdanje. description.hu_HU = Az eredeti Transport Tycoon Deluxe DOS (német) verziójának grafikája. description.id_ID = Grafik orisinil Transport Tycoon Deluxe versi DOS (Jerman). @@ -38,6 +40,7 @@ description.ko_KR = 오리지널 트랜스포트 타이쿤 디럭스 도스 에 description.la_VA = Graphica ex editione originale Transport Tycoon Deluxe DOS (Germanica). description.lb_LU = Original Transport Tycoon Deluxe DOS (Däitsch) Editioun Grafik. description.lt_LT = Originali Transport Tycoon Deluxe DOS (Vokiečių) leidimo grafika. +description.lv_LV = Oriģinālā Transport Tycoon Deluxe DOS (vācu) izdevuma grafika. description.nb_NO = Original grafikk fra Transport Tycoon Deluxe for DOS (tysk). description.nl_NL = Originele graphics van de Duitse Transport Tycoon Deluxe DOS-versie. description.nn_NO = Original grafikk frå Transport Tycoon Deluxe for DOS (tysk). @@ -59,21 +62,21 @@ description.zh_CN = 运输大亨DOS豪华德语版原版图形包. description.zh_TW = 原版 Transport Tycoon Deluxe DOS 版 (德國版) 的圖形。 [files] -base = TRG1.GRF -logos = TRGI.GRF -arctic = TRGC.GRF -tropical = TRGH.GRF -toyland = TRGT.GRF -extra = OPENTTD.GRF +base = TRG1.GRF +logos = TRGI.GRF +arctic = TRGC.GRF +tropical = TRGH.GRF +toyland = TRGT.GRF +extra = ORIG_EXTRA.GRF [md5s] -TRG1.GRF = 9311676280e5b14077a8ee41c1b42192 -TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8 -TRGC.GRF = ed446637e034104c5559b32c18afe78d -TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9 -TRGT.GRF = fcde1d7e8a74197d72a62695884b909e -OPENTTD.GRF = 505d96061556d3bb5cec6234096ec5bc +TRG1.GRF = 9311676280e5b14077a8ee41c1b42192 +TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8 +TRGC.GRF = ed446637e034104c5559b32c18afe78d +TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9 +TRGT.GRF = fcde1d7e8a74197d72a62695884b909e +ORIG_EXTRA.GRF = 67bcfac5911667309d86b7749ea8d08c [origin] -default = You can find it on your Transport Tycoon Deluxe CD-ROM. -OPENTTD.GRF = This file was part of your OpenTTD installation. +default = You can find it on your Transport Tycoon Deluxe CD-ROM. +ORIG_EXTRA.GRF = This file was part of your OpenTTD installation. diff --git a/bin/baseset/orig_extra.grf b/bin/baseset/orig_extra.grf new file mode 100644 index 0000000000..728a8b2555 Binary files /dev/null and b/bin/baseset/orig_extra.grf differ diff --git a/bin/baseset/orig_tto.obm b/bin/baseset/orig_tto.obm new file mode 100644 index 0000000000..13b3efb110 --- /dev/null +++ b/bin/baseset/orig_tto.obm @@ -0,0 +1,71 @@ +; $Id$ +; +; This represents the original music as on the Transport +; Tycoon (with World Editor) for DOS CD. +; +[metadata] +name = original_tto +shortname = TTOD +version = 1 +description = Original Transport Tycoon (Original/World Editor) music. + +[files] +theme = gm-tto.cat +old_0 = gm-tto.cat +old_1 = gm-tto.cat +old_2 = gm-tto.cat +old_3 = gm-tto.cat +old_4 = gm-tto.cat +old_5 = gm-tto.cat +old_6 = gm-tto.cat +old_7 = gm-tto.cat +old_8 = +old_9 = +new_0 = gm-tto.cat +new_1 = gm-tto.cat +new_2 = gm-tto.cat +new_3 = gm-tto.cat +new_4 = gm-tto.cat +new_5 = gm-tto.cat +new_6 = gm-tto.cat +new_7 = gm-tto.cat +new_8 = +new_9 = +ezy_0 = +ezy_1 = +ezy_2 = +ezy_3 = +ezy_4 = +ezy_5 = +ezy_6 = +ezy_7 = +ezy_8 = +ezy_9 = + +[catindex] +theme = 0 +old_0 = 1 +old_1 = 6 +old_2 = 2 +old_3 = 7 +old_4 = 11 +old_5 = 12 +old_6 = 15 +old_7 = 10 +new_0 = 4 +new_1 = 5 +new_2 = 9 +new_3 = 8 +new_4 = 13 +new_5 = 16 +new_6 = 14 +new_7 = 3 + +[md5s] +gm-tto.cat = 26e85ff84b0063aa5da05dd4698fc76e + +[names] +; Names get read from the CAT file + +[origin] +default = You can find it on your Transport Tycoon CD-ROM. diff --git a/bin/baseset/orig_win.obg b/bin/baseset/orig_win.obg index 11ad4136f8..ec00781488 100644 --- a/bin/baseset/orig_win.obg +++ b/bin/baseset/orig_win.obg @@ -22,12 +22,14 @@ description.el_GR = Αρχικά γραφικά από το Transport Tycoon Del description.en_AU = Original Transport Tycoon Deluxe Windows edition graphics. description.en_US = Original Transport Tycoon Deluxe Windows edition graphics. description.es_ES = Gráficos originales de Transport Tycoon Deluxe versión Windows. +description.es_MX = Gráficos originales de Transport Tycoon Deluxe para Windows. description.et_EE = Algse Transport Tycoon Deluxe Windowsi versiooni graafika. description.fi_FI = Alkuperäiset Transport Tycoon Deluxen Windows-version grafiikat. description.fr_FR = Graphiques originaux de Transport Tycoon Deluxe (version Windows). description.ga_IE = Grafaicí bunaidhTransport Tycoon Deluxe, eagrán Windows. description.gd_GB = Grafaigeachd aig an deasachadh Windows tùsail aig Transport Tycoon Deluxe. description.gl_ES = Graficos da edición orixinal de Transport Tycoon Deluxe para Windows. +description.he_IL = גרפיקות Transport Tycoon Deluxe המקורי בגרסת Windows. description.hr_HR = Originalna grafika za Transport Tycoon Deluxe Windows izdanje. description.hu_HU = Az eredeti Transport Tycoon Deluxe Windows verziójának grafikája. description.id_ID = Grafik orisinil Transport Tycoon Deluxe versi Windows. @@ -38,6 +40,8 @@ description.ko_KR = 오리지널 트랜스포트 타이쿤 디럭스 윈도 에 description.la_VA = Graphica ex editione originale Transport Tycoon Deluxe Windows. description.lb_LU = Original Transport Tycoon Deluxe Windows Editioun Grafik. description.lt_LT = Originali Transport Tycoon Deluxe Windows leidimo grafika. +description.lv_LV = Oriģinālā Transport Tycoon Deluxe Windows izdevuma grafika. +description.ms_MY = Grafik asal Transport Tycoon Deluxe edisi Windows. description.nb_NO = Original grafikk fra Transport Tycoon Deluxe for Windows. description.nl_NL = Originele graphics van de Transport Tycoon Deluxe Windows-versie. description.nn_NO = Original grafikk frå Transport Tycoon Deluxe for Windows. @@ -59,21 +63,21 @@ description.zh_CN = 运输大亨Windows豪华版原版图形包. description.zh_TW = 原版 Transport Tycoon Deluxe Windows 版的圖形。 [files] -base = TRG1R.GRF -logos = TRGIR.GRF -arctic = TRGCR.GRF -tropical = TRGHR.GRF -toyland = TRGTR.GRF -extra = OPENTTD.GRF +base = TRG1R.GRF +logos = TRGIR.GRF +arctic = TRGCR.GRF +tropical = TRGHR.GRF +toyland = TRGTR.GRF +extra = ORIG_EXTRA.GRF [md5s] -TRG1R.GRF = b04ce593d8c5016e07473a743d7d3358 -TRGIR.GRF = 0c2484ff6be49fc63a83be6ab5c38f32 -TRGCR.GRF = 3668f410c761a050b5e7095a2b14879b -TRGHR.GRF = 06bf2b7a31766f048baac2ebe43457b1 -TRGTR.GRF = de53650517fe661ceaa3138c6edb0eb8 -OPENTTD.GRF = 505d96061556d3bb5cec6234096ec5bc +TRG1R.GRF = b04ce593d8c5016e07473a743d7d3358 +TRGIR.GRF = 0c2484ff6be49fc63a83be6ab5c38f32 +TRGCR.GRF = 3668f410c761a050b5e7095a2b14879b +TRGHR.GRF = 06bf2b7a31766f048baac2ebe43457b1 +TRGTR.GRF = de53650517fe661ceaa3138c6edb0eb8 +ORIG_EXTRA.GRF = 67bcfac5911667309d86b7749ea8d08c [origin] -default = You can find it on your Transport Tycoon Deluxe CD-ROM. -OPENTTD.GRF = This file was part of your OpenTTD installation. +default = You can find it on your Transport Tycoon Deluxe CD-ROM. +ORIG_EXTRA.GRF = This file was part of your OpenTTD installation. diff --git a/bin/baseset/orig_win.obm b/bin/baseset/orig_win.obm index 27164c73bc..c8c4923e0e 100644 --- a/bin/baseset/orig_win.obm +++ b/bin/baseset/orig_win.obm @@ -21,12 +21,14 @@ description.el_GR = Αρχική μουσική από το Transport Tycoon Del description.en_AU = Original Transport Tycoon Deluxe Windows edition music. description.en_US = Original Transport Tycoon Deluxe Windows edition music. description.es_ES = Música original de Transport Tycoon Deluxe versión Windows. +description.es_MX = Música original de Transport Tycoon Deluxe para Windows. description.et_EE = Algse Transport Tycoon Deluxe Windowsi versiooni muusika. description.fi_FI = Alkuperäinen Transport Tycoon Deluxen Windows-version musiikki. description.fr_FR = Musiques originales de Transport Tycoon Deluxe (version Windows). description.ga_IE = Ceol bunaidh Transport Tycoon Deluxe, eagrán Windows. description.gd_GB = Ceòl aig an deasachadh Windows tùsail aig Transport Tycoon Deluxe. description.gl_ES = Música da edición orixinal de Transport Tycoon Deluxe para Windows. +description.he_IL = מנגינות Transport Tycoon Deluxe המקורי בגרסת Windows. description.hr_HR = Originalna glazba za Transport Tycoon Deluxe Windows izdanje. description.hu_HU = Az eredeti Transport Tycoon Deluxe Windows verziójának zenéje. description.id_ID = Musik pengiring orisinil Transport Tycoon Deluxe versi Windows. @@ -38,6 +40,7 @@ description.la_VA = Musica ex editione originale Transport Tycoon Deluxe Windows description.lb_LU = Original Transport Tycoon Deluxe Windows Editioun Musik. description.lt_LT = Originali Transport Tycoon Deluxe Windows leidimo muzika. description.lv_LV = Oriģinālā Transport Tycoon Deluxe Windows izdevuma mūzika. +description.ms_MY = Muzik asal Transport Tycoon Deluxe edisi Windows. description.nb_NO = Original musikk fra Transport Tycoon Deluxe for Windows. description.nl_NL = Originele muziek van de Transport Tycoon Deluxe Windows-versie. description.nn_NO = Original musikk frå Transport Tycoon Deluxe for Windows. @@ -139,5 +142,17 @@ GM_TT19.GM = Funk Central GM_TT20.GM = Jammit GM_TT21.GM = Movin' On +; MIDI timecodes where the playback should attemp to start and stop short. +; This is to allow fixing undesired silences in original MIDI files. +; However not all music drivers may support this. +[timingtrim] +; Theme has two beats silence at the beginning which prevents clean looping. +GM_TT00.GM = 768:53760 +; Can't Get There From Here from the Windows version has a long silence at the end, +; followed by a solo repeat. This isn't in the original DOS version music and is likely +; unintentional from the people who converted the music from the DOS version. +; Actual song ends after measure 152. +GM_TT10.GM = 0:235008 + [origin] default = You can find it on your Transport Tycoon Deluxe CD-ROM. diff --git a/bin/baseset/orig_win.obs b/bin/baseset/orig_win.obs index 9fe250b304..c3e5fb7693 100644 --- a/bin/baseset/orig_win.obs +++ b/bin/baseset/orig_win.obs @@ -21,12 +21,15 @@ description.el_GR = Αρχικοί ήχοι από το Transport Tycoon Deluxe description.en_AU = Original Transport Tycoon Deluxe Windows edition sounds. description.en_US = Original Transport Tycoon Deluxe Windows edition sounds. description.es_ES = Sonidos originales de Transport Tycoon Deluxe versión Windows. +description.es_MX = Sonidos originales de Transport Tycoon Deluxe para Windows. description.et_EE = Algse Transport Tycoon Deluxe Windowsi versiooni helid. +description.eu_ES = Transport Tycoon Deluxe originaleko Windows edizioko grafikoak. description.fi_FI = Alkuperäiset Transport Tycoon Deluxen Windows-version äänet. description.fr_FR = Sons originaux de Transport Tycoon Deluxe (version Windows). description.ga_IE = Fuaimeanna bunaidh Transport Tycoon Deluxe, eagrán Windows. description.gd_GB = Fuaimean aig an deasachadh Windows tùsail aig Transport Tycoon Deluxe. description.gl_ES = Sons da edición orixinal de Transport Tycoon Deluxe para Windows. +description.he_IL = צלילי Transport Tycoon Deluxe המקורי בגרסת Windows. description.hr_HR = Originalni zvukovi za Transport Tycoon Deluxe Windows izdanje. description.hu_HU = Az eredeti Transport Tycoon Deluxe Windows verziójának hangjai. description.id_ID = Efek suara orisinil Transport Tycoon Deluxe versi Windows. diff --git a/bin/game/compat_1.6.nut b/bin/game/compat_1.6.nut index fe985b90d0..d25189db2a 100644 --- a/bin/game/compat_1.6.nut +++ b/bin/game/compat_1.6.nut @@ -6,3 +6,5 @@ * 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 . */ + +GSLog.Info("1.6 API compatibility in effect."); diff --git a/bin/game/compat_1.7.nut b/bin/game/compat_1.7.nut new file mode 100644 index 0000000000..1290443c4d --- /dev/null +++ b/bin/game/compat_1.7.nut @@ -0,0 +1,10 @@ +/* $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 . + */ + +GSLog.Info("1.7 API compatibility in effect."); diff --git a/bin/game/compat_1.8.nut b/bin/game/compat_1.8.nut new file mode 100644 index 0000000000..6acdbc0609 --- /dev/null +++ b/bin/game/compat_1.8.nut @@ -0,0 +1,10 @@ +/* $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 . + */ + +GSLog.Info("1.8 API compatibility in effect."); diff --git a/bin/game/compat_1.9.nut b/bin/game/compat_1.9.nut new file mode 100644 index 0000000000..fe985b90d0 --- /dev/null +++ b/bin/game/compat_1.9.nut @@ -0,0 +1,8 @@ +/* $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 . + */ diff --git a/changelog.txt b/changelog.txt index c110109386..5e1540a1e0 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,200 @@ +1.8.0 (2018-04-01) +------------------------------------------------------------------------ +(None) + + +1.8.0-RC1 (2018-03-21) +------------------------------------------------------------------------ +- Feature: [GFX] Climate-specific Action5 extra airport sprites [FS#6664] (r27976) +- Feature: Draw vertical separators at tile distance in the train depot GUI (r27938, r27899) +- Feature: [Build] MSVC 2017 project file generator. Most noticeable, std:c++latest is enabled (r27920, r27919, r27918, r27917) +- Feature: [Build] Project file generator for kdevelop 4/5 [FS#6577] (r27897) +- Feature: Add option to close windows with right click [FS#4950] (r27826, r27825) +- Feature: Vehicle Group Info: Add profits and occupancy display to group vehicle list (r27822) +- Feature: Display aircraft type in vehicle preview/purchase/detail windows (r27802, r27799, r27797) +- Change: [NewGRF] Various performance improvements to resolving VA2 (r27989, r27985, r27984, r27983, r27982) +- Change: [NewGRF] Increase maximum allowed vehicle sprite size to reduce clipping of ships (r27987) +- Change: Check companies for bankruptcy before subtracting reoccuring monthly costs [FS#6679] (r27981) +- Change: [GFX] Replace the office building sprite on various toyland airports with a better fitting sprite [FS#6664] (r27977) +- Change: [GFX] The switch-toolbar icon contained pixels from the fire cycle. Replace the whole icon with a new version [FS#6654] (r27961) +- Change: Reword texts in industry view, when stockpiling is used (r27952) +- Change: Remove the gap between windows when positioning them after opening [FS#6568] (r27934, r27900) +- Change: [Build] Enable usage of static_assert for MSVC (r27916) +- Change: [Build] Preserve PKG_CONFIG_PATH and PKG_CONFIG_LIBDIR environment variables in config.cache file [FS#6614] (r27902) +- Change: Do not cancel headquarter construction and engine-preview-query when shift-clicking (r27889) +- Change: Parse extmidi command string for parameters to pass on (r27834) +- Change: Draw images in centre of buttons (r27829, r27821) +- Fix: Store the map variety setting in the savegame like the other mapgen settings, so restarting maps considers it [FS#6673] (r27978) +- Fix: Hair selection was missing one option [FS#6642] (r27975) +- Fix: Avoid tile operations outside map border when building lock [FS#6662] (r27973) +- Fix: Catenary sprites got mixed up for depots [FS#6670] (r27972) +- Fix: Make automatic window-positioning RTL-aware (r27934, r27900) +- Fix: Automatic window-positioning now uses GUI-scale/style dependent sizes/distances instead of fixed pixel values (r27934, r27900) +- Fix: [NewGRF] While executing random triggers, var 5F should include the new triggers (r27928) +- Fix: [NewGRF] Reset used random triggers only after all A123 chains have been resolved, so that all RA2 in all chains can test the shared triggers (r27928) +- Fix: [NewGRF] Industry random triggers are stored per tile, even when randomising the shared random bits of the parent industry (r27928) +- Fix: [NPF] Reserved track bits were not accounted for when trying to find any safe position (r27912) +- Fix: Do not modify argv[0] [FS#6575] (r27886) +- Fix: Do not search directories when opening ini files as we already have their full path [FS#6421] (r27816) +- Fix: Road tunnel/bridge heads have no trackbits wrt. catenary drawing (r27812) + + +1.7.2 (2017-12-24) +------------------------------------------------------------------------ +(None) + + +1.7.2-RC1 (2017-12-11) +------------------------------------------------------------------------ +- Change: When train depots have a horizontal scrollbar, allow scrolling 1 tile beyond the longest train, so you can actually attach a wagon at the end (r27937) +- Fix: When moving wagons in the depot, the drag highlight did not exactly match the length of the dragged wagon chain (r27936) +- Fix: [Win32] Right mouse scrolling didn't work properly with the Windows 10 Fall Creators Update [FS#6629] (r27935) +- Fix: Forest, candyfloss forest and battery farm skipped the first animation frame [FS#6639] (r27932) +- Fix: Glyphs in range U+0020 to U+00FF may only be defined in orig_extra.grf, not in openttd.grf [FS#6620] (r27915) +- Fix: 'unban' console command was not handling IPv6 adresses properly (r27914, r27913) +- Fix: Keep the 'link' between industry chain and smallmap windows whenever possible [FS#6585] (r27905) +- Fix: When the last vehicle is removed from a shared orders group, hide the 'Stop sharing' button in the vehicle orders window [FS#6593] (r27904) +- Fix: Tooltip of 'increase service interval' said 'decrease' [FS#6606] (r27895) +- Fix: Console command parser passed invalid strings to the debug output, if command lines had many parameters [FS#6576] (r27884, r27883) + + +1.7.1 (2017-06-13) +------------------------------------------------------------------------ +(None) + + +1.7.1-RC1 (2017-05-04) +------------------------------------------------------------------------ +- Fix: Add missing game script event for ships arriving at a station [FS#6560] (r27859, r27858) +- Fix: StringID truncation to 16 bits broke string remapping test [FS#6555] (r27851) +- Fix: Infinite loop in pathfinder when checking safe waiting position from a waypoint [FS#5926] (r27846) +- Fix: [YAPF] Consider depot as destination before reversing path and applying penalty (r27843) +- Fix: Don't consider locks or ship depots as clear water when placing industries (r27841) +- Fix: Small news window's fake caption was not sized to fit its text (r27838) +- Fix: Black remap did nothing in 8bpp-simple blitter (r27837) +- Fix: Misaligned resize icon due to widget bounds being inclusive (r27831) +- Fix: Update viewport sign dimensions when changing GUI zoom level (r27827, r27819) +- Fix: Vehicle viewport is not user scrollable so flag window as such (r27823) +- Fix: Allow dropdown to be drawn above origin widget even with scrollbar (r27820) +- Fix: 32bpp-anim blitters assumed that pitch and width of the screen were equal [FS#6545] (r27796) +- Fix: Chat text background overflowed due to missing padding [FS#6526] (r27794) +- Fix: Failed to load lzo compressed savegames sometimes [FS#6450] (r27793) +- Fix: [Win32] Mark OpenTTD as DPI-aware to avoid OS window scaling that breaks mouse input [FS#6366] (r27791, r27790) +- Fix: [NewGRF] Get vehicle load amount after executing new cargo trigger [FS#6536] (r27788) +- Fix: AI configuration changed incorrect parameter when some parameters are hidden [FS#6479] (r27787, r27786) +- Fix: Buoys not always drawn after being placed depending on zoom level [FS#6508] (r27785) +- Fix: Allow rail conversion even if ship is on tile [FS#6505] (r27784) + + +1.7.0 (2017-04-01) +------------------------------------------------------------------------ +(None) + + +1.7.0-RC1 (2017-03-11) +------------------------------------------------------------------------ +- Feature: [NewGRF] Extend the DCxx range to D800-DFFF (r27769) +- Feature: [NewGRF, script] Increase the maximum number of GameScript texts to 64k, and NewGRF texts to 512k (r27758) +- Feature: [NewGRF] CB 37 results 0x0401 and 0x0800-0BFF for improved control of display of input cargos in the industry GUI (r27751) +- Feature: Sprites missing in outdated basesets are now provided by openttd.grf (r27732, r27731, r27730) +- Feature: [NewGRF] String command 9A 1E to print the name of a cargo type (r27707, r27706) +- Feature: [Debug] Assign descriptive names to threads [FS#6471] (r27674, r27673, r27670) +- Feature: [NewGRF] Allow composing vehicles from multiple sprites (r27668) +- Change: Enable realistic train and road vehicle acceleration by default (r27760) +- Change: Hide the drive-in stops from the tram station picker (r27734) +- Change: Do not count static NewGRF when checking for the maximum number of NewGRFs in a game (r27729) +- Change: Limit waypoint area by maximum station spread during dragging (r27710) +- Change: [Build] Re-enable Wnarrowing for gcc 4.9+ [FS#6532] (r27709, r27703) +- Change: List railtype of rail tiles explicitly in the tile info window (r27686) +- Change: Re-arrange the autoreplace GUI for trains, and do not filter it by railtype by default (r27683) +- Change: Various performance improvements to CargoDist and LinkGraphs (r27682, r27681, r27614, r27613, r27612, r27611) +- Change: Improve randomisation of rough land appearance (r27657) +- Change: [Build] Enable C++11 for clang 3.3 (r27654) +- Fix: Insufficient thread synchronisation when switching blitters lead to crashes [FS#6510] (r27775) +- Fix: Enabling palette animation for 32bpp blitters while paused skipped initialisation of the palette and resulted in black windows [FS#5889] (r27774) +- Fix: Intro games other than the traditional nightly one would cause townname NewGRFs to not get activated in the game options [FS#5819] (r27772) +- Fix: Some variables were not reset between loading old savegames, which made loading them fail [FS#6540] (r27770) +- Fix: Removing secondary roadtypes from bridges was factor 2 too cheap [FS#6538] (r27746) +- Fix: Extra viewports did not center on the selected tile [FS#6537] (r27743) +- Fix: [Build] Building on newer OSX versions with newer SDKs [FS#6295, FS#6502] (r27727, r27675) +- Fix: Improve error message when trying to build rail track over a depot (r27726) +- Fix: Rescanning NewGRF in-game could break the loaded NewGRF, if very many NewGRF were in use (r27721) +- Fix: Text could overflow various GUI elements [FS#6527] (r27713) +- Fix: Memory leak when reloading NewGRF (r27690, r27688, r27687) +- Fix: When removing objects of bankrupt companies the tiles may revert to canal. In that case also check the ownership of the canal [FS#6511] (r27656) +- Fix: Make the console file commands operate independent of the save/load GUI (r27645) +- Fix: When dragging vehicles in group or depot GUI, draw the complete articulated vehicle (r27632) +- Fix: When dragging multiple vehicles in the depot, make the destination gap as long as the chain instead of just considering the first vehicle (r27629) +- Fix: [Build] Change the GCC version detection so that it works with two-digit and truncated versions [FS#6487] (r27623, r27616) +- Fix: Do not hide filtered and highlighted industries by overlapping tiles in the zoomed-out smallmap (r27622, r27621, r27620) +- Fix: [Script] Kill scripts, when a non-suspendable valuator call takes way too long [FS#6473] (r27594) + + +1.6.1 (2016-07-01) +------------------------------------------------------------------------ +- Fix: Compilation and optimisation issues with GCC6 (r27606, r27605, r27595) +- Fix: Compilation with --disable-network [FS#6481] (r27602) +- Fix: [NewGRF] shift-and-add-divide/modulo varadjusts use signed division/modulo (r27600) +- Fix: Company 0 could accept engine previews before they were offered (r27598) + + +1.6.1-RC1 (2016-06-01) +------------------------------------------------------------------------ +- Feature: Mexican Spanish (r27564, r27553, r27552) +- Change: Performance improvement for dedicated servers by skipping drawing calls earlier in the process [FS#6402] (r27579) +- Fix: Automatic servicing of road vehicles compared path finder costs with tile distances, thus vehicles went to depots which were factor 100 too far away [FS#6410] (r27586) +- Fix: Enforce a non-zero load amount for all vehicles, so that vehicles can process their cargo reservations [FS#6437] (r27585, r27584) +- Fix: Do not decrease the column width of depot windows when vehicles with high unitnumbers leave [FS#6415] (r27583) +- Fix: Button size computation in script configuration window [FS#6461] (r27581) +- Fix: [NewGRF] Set date of last service on construction also for wagons and articulated parts [FS#6395] (r27580) +- Fix: Vehicles could not be hidden from the purchase list when they were in exclusive preview [FS#6454] (r27578) +- Fix: Dock and roadstop picker, client list and town authority window did not auto-resize according to their content when they were positioned at the bottom of the screen [FS#6386] (r27577) +- Fix: Various incorrect but uncritical size computations in the content client [FS#6449] (r27576, r27570) +- Fix: Memory leak when disabling palette animation [FS#6404] (r27575) +- Fix: [NewGRF] The house id as returned by house variable 66 was incorrect when querying neighboured tiles [FS#6432] (r27574) +- Fix: [Build] Compilation failure with gcc 6.1 due to headers included after safeguards.h [FS#6467] (r27573) +- Fix: Convenience savegame bump to distinguish 1.6 savegames from 1.5 savegames [FS#6442] (r27572) +- Fix: [Build] Force sorting to be locale independent, so files are always ordered the same and by that token better diff-able (r27562, r27558) +- Fix: Typos in comments and string (r27561, r27560) +- Fix: [Build] bashism that caused different CFLAGS with bash vs dash (r27557) +- Fix: Use a more appropiate sound effect for convert-rail (r27547) +- Fix: Remove SetFill from vehicle GUI buttons, so that the viewport is resized instead of them in case of long window titles (r27546) +- Fix: [Script] Generation of API wrappers (r27545, r27544, r27543) +- Fix: [Windows] ICU got disabled for Windows builds, breaking RTL support [FS#6427] (r27542) +- Fix: [NewGRF] Station spritelayouts did not accept the var10 flag for the palette [FS#6435] (r27534) + + +1.6.0 (2016-04-01) +------------------------------------------------------------------------ +(None) + + +1.6.0-RC1 (2016-03-01) +------------------------------------------------------------------------ +- Feature: [NewGRF] Allow custom sound IDs in RV property 0x12, ship property 0x10 and aircraft property 0x12 (r27507) +- Feature: When viewing online content of a particular type, hide content of other types unless they have been (auto)selected for download (r27469, r27468, r27444) +- Feature: [NewGRF] Move sprite 8 positions in sprite aligner with ctrl+click [FS#6241] (r27451) +- Feature: Lower the sell-vehicle and sell-chain buttons in the train depot GUI while dragging a vehicle over it [FS#6391] (r27450, r27446) +- Feature: Make the object placement GUI an independent window (r27438, r27397, r27346) +- Feature: [Build] Project files and compilation with MSVC2015 (r27385, r27382, r27381, r27380, r27379) +- Feature: [NewGRF] Allow railtype NewGRF to define separate sprites for the fences on either track side [FS#6315] (r27354, r27343) +- Feature: [NewGRF] Increase the maximum amount of industry types to 128 per NewGRF and 240 in total (r27279) +- Feature: Make Ctrl+Remove-Roadstop also remove the road, just like for rail stations [FS#6252] (r27251) +- Change: [NewGRF] Allow static NewGRF to enable the second rocky tile set (r27497) +- Change: Round loading percentage in loading indicators and conditional orders towards 50%, so that 0% and 100% mean completely empty or full (r27426) +- Change: [Build] Rework the configure system to make more use of pkg-config (r27377:r27366, r27361, r27360) +- Change: Enable YAPF cache debugging with desync debug level 2 (r27332) +- Change: [strgen] Default plural subparameter position for CARGO_xxx string control codes is subparameter 1 (r27295) +- Change: [NewGRF] Translate industry variable A6 (r27267) +- Change: Do not consider cargo that is already being loaded as waiting cargo wrt. the station rating [FS#6165] (r27256) +- Change: Tune down terrain generation to reduce amount of long slopes (r27230) +- Change: Generate more detailed curves at the coast (r27229) +- Change: Slightly more water in the non-custom sea levels (r27228) +- Change: Be more lenient about road stop removal when at least one stop could be removed [FS#6262] (r27225) +- Fix: [Win32] Stdin/out/err need to be re-assigned differently if the runtime lib of MSVC2015 is used (r27481) +- Fix: [Haiku] On Haiku use the appropriate system variable to obtain the include dir [FS#6401] (r27472) + + 1.5.3 (2015-12-01) ------------------------------------------------------------------------ (None) diff --git a/config.lib b/config.lib index a8c6e129c0..5b399d86a3 100644 --- a/config.lib +++ b/config.lib @@ -31,7 +31,6 @@ set_default() { awk="awk" pkg_config="pkg-config" os="DETECT" - endian="AUTO" cpu_type="DETECT" config_log="config.log" prefix_dir="/usr/local" @@ -78,17 +77,19 @@ set_default() { enable_builtin_depend="1" with_makedepend="0" with_direct_music="1" + with_xaudio2="1" with_sort="1" with_iconv="1" with_midi="" with_midi_arg="" with_libtimidity="1" + with_fluidsynth="1" with_freetype="1" with_fontconfig="1" with_icu_layout="1" with_icu_sort="1" static_icu="0" - with_psp_config="1" + with_uniscribe="1" with_threads="1" with_distcc="1" with_ccache="1" @@ -109,7 +110,6 @@ set_default() { awk pkg_config os - endian cpu_type config_log prefix_dir @@ -155,24 +155,26 @@ set_default() { enable_builtin_depend with_makedepend with_direct_music + with_xaudio2 with_sort with_iconv with_midi with_midi_arg with_libtimidity + with_fluidsynth with_freetype with_fontconfig with_icu_layout with_icu_sort static_icu - with_psp_config + with_uniscribe with_threads with_distcc with_ccache with_grfcodec with_nforenum with_sse - CC CXX CFLAGS CXXFLAGS LDFLAGS CFLAGS_BUILD CXXFLAGS_BUILD LDFLAGS_BUILD" + CC CXX CFLAGS CXXFLAGS LDFLAGS CFLAGS_BUILD CXXFLAGS_BUILD LDFLAGS_BUILD PKG_CONFIG_PATH PKG_CONFIG_LIBDIR" } detect_params() { @@ -224,9 +226,6 @@ detect_params() { --lipo) prev_p="lipo";; --lipo=*) lipo="$optarg";; - --endian) prev_p="endian";; - --endian=*) endian="$optarg";; - # Alias --prefix with --prefix-dir, for compatibility with GNU autotools @@ -375,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";; @@ -406,9 +408,9 @@ detect_params() { --static-libicu) static_icu="1";; --static-libicu=*) static_icu="$optarg";; - --with-psp-config) with_psp_config="2";; - --without-psp-config) with_psp_config="0";; - --with-psp-config=*) with_psp_config="$optarg";; + --with-uniscribe) with_uniscribe="2";; + --without-uniscribe) with_uniscribe="0";; + --with-uniscribe=*) with_uniscribe="$optarg";; --disable-builtin-depend) enable_builtin_depend="0";; --enable-builtin-depend) enable_builtin_depend="2";; @@ -422,6 +424,10 @@ detect_params() { --without-direct-music) with_direct_music="0";; --with-direct-music=*) with_direct_music="$optarg";; + --with-xaudio2) with_xaudio2="2";; + --without-xaudio2) with_xaudio2="0";; + --with-xaudio2=*) with_xaudio2="$optarg";; + --with-sort) with_sort="2";; --without-sort) with_sort="0";; --with-sort=*) with_sort="$optarg";; @@ -473,6 +479,8 @@ detect_params() { CFLAGS_BUILD=* | --CFLAGS_BUILD=* | --CFLAGS-BUILD=*) CFLAGS_BUILD="$optarg";; CXXFLAGS_BUILD=* | --CXXFLAGS_BUILD=* | --CXXFLAGS-BUILD=*) CXXFLAGS_BUILD="$optarg";; LDFLAGS_BUILD=* | --LDFLAGS_BUILD=* | --LDFLAGS-BUILD=*) LDFLAGS_BUILD="$optarg";; + PKG_CONFIG_PATH=* | --PKG_CONFIG_PATH=* | --PKG-CONFIG-PATH=*) PKG_CONFIG_PATH="$optarg";; + PKG_CONFIG_LIBDIR=* | --PKG_CONFIG_LIBDIR=* | --PKG-CONFIG-LIBDIR=*) PKG_CONFIG_LIBDIR="$optarg";; --ignore-extra-parameters) ignore_extra_parameters="1";; @@ -517,31 +525,43 @@ save_params() { echo "" >> $config_log } +# Export a variable so tools like pkg-config can see it when invoked. +# If the variable contains an empty string then unset it. +# $1 - name of the variable to export or unset +export_or_unset() { + eval local value=\$$1 + if [ -n "$value" ]; then + export $1; + log 2 "using $1=$value"; + else + unset $1; + log 2 "not using $1"; + fi +} + check_params() { # Some params want to be in full uppercase, else they might not work as # expected.. fix that here - endian=`echo $endian | tr '[a-z]' '[A-Z]'` os=`echo $os | tr '[a-z]' '[A-Z]'` cpu_type=`echo $cpu_type | tr '[a-z]' '[A-Z]'` + # Export some variables to be used by pkg-config + # + # PKG_CONFIG_LIBDIR variable musn't be set if we are not willing to + # override the default pkg-config search path, it musn't be an empty + # string. If the variable is empty (e.g. when an empty string comes + # from config.cache) then unset it. This way the "don't override" state + # will be properly preserved when (re)configuring. + export_or_unset PKG_CONFIG_PATH + export_or_unset PKG_CONFIG_LIBDIR + # Check if all params have valid values - # Endian only allows AUTO, LE and, BE - if [ -z "`echo $endian | egrep '^(AUTO|LE|BE|PREPROCESSOR)$'`" ]; then - log 1 "configure: error: invalid option --endian=$endian" - log 1 " Available options are: --endian=[AUTO|LE|BE]" - exit 1 - fi - if [ "$endian" = "PREPROCESSOR" ] && [ "$os" != "OSX" ]; then - log 1 "configure: error: invalid option --endian=$endian" - log 1 " PREPROCESSOR is only available for OSX" - exit 1 - fi - # OS only allows DETECT, UNIX, OSX, FREEBSD, DRAGONFLY, OPENBSD, NETBSD, MORPHOS, BEOS, HAIKU, SUNOS, CYGWIN, MINGW, OS2, DOS, WINCE, and PSP - if [ -z "`echo $os | egrep '^(DETECT|UNIX|OSX|FREEBSD|DRAGONFLY|OPENBSD|NETBSD|HPUX|MORPHOS|BEOS|HAIKU|SUNOS|CYGWIN|MINGW|OS2|DOS|WINCE|PSP)$'`" ]; then + # OS only allows DETECT, UNIX, OSX, FREEBSD, DRAGONFLY, OPENBSD, NETBSD, MORPHOS, BEOS, HAIKU, SUNOS, CYGWIN, MINGW, OS2, and DOS + if [ -z "`echo $os | egrep '^(DETECT|UNIX|OSX|FREEBSD|DRAGONFLY|OPENBSD|NETBSD|HPUX|MORPHOS|BEOS|HAIKU|SUNOS|CYGWIN|MINGW|OS2|DOS)$'`" ]; then log 1 "configure: error: invalid option --os=$os" - log 1 " Available options are: --os=[DETECT|UNIX|OSX|FREEBSD|DRAGONFLY|OPENBSD|NETBSD|HPUX|MORPHOS|BEOS|HAIKU|SUNOS|CYGWIN|MINGW|OS2|DOS|WINCE|PSP]" + log 1 " Available options are: --os=[DETECT|UNIX|OSX|FREEBSD|DRAGONFLY|OPENBSD|NETBSD|HPUX|MORPHOS|BEOS|HAIKU|SUNOS|CYGWIN|MINGW|OS2|DOS]" exit 1 fi # cpu_type can be either 32 or 64 @@ -740,13 +760,13 @@ check_params() { exit 1 fi else - if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ] || [ "$os" = "WINCE" ]; then + if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ]; then log 1 "checking GDI video driver... found" else log 1 "checking GDI video driver... not Windows, skipping" fi - if [ -z "$allegro_config" ] && [ -z "$sdl_config" ] && [ "$with_cocoa" = 0 ] && [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ] && [ "$os" != "WINCE" ]; then + if [ -z "$allegro_config" ] && [ -z "$sdl_config" ] && [ "$with_cocoa" = 0 ] && [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ]; then log 1 "configure: error: no video driver development files found" log 1 " If you want a dedicated server use --enable-dedicated as parameter" exit 1 @@ -846,14 +866,36 @@ check_params() { fi fi + if [ "$with_uniscribe" != "0" ]; then + if [ "$os" != "MINGW" ]; then + if [ "$with_uniscribe" != "1" ]; then + log 1 "configure: error: Uniscribe is only supported on native Win32 targets" + exit 1 + fi + with_uniscribe="0" + + log 1 "checking Uniscribe text layout... not Windows, skipping" + else + log 1 "checking Uniscribe text layout... found" + + # Don't use ICU unless forced. + if [ "$with_icu_layout" = "1" ]; then + with_icu_layout="0" + fi + if [ "$with_icu_sort" = "1" ]; then + with_icu_sort="0" + fi + fi + fi + detect_xdg_basedir detect_png detect_freetype detect_fontconfig detect_icu_layout detect_icu_sort - detect_pspconfig detect_libtimidity + detect_fluidsynth if [ "$with_direct_music" != "0" ]; then if [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ]; then @@ -869,13 +911,21 @@ check_params() { fi fi - detect_sort + if [ "$with_xaudio2" != "0" ]; then + if [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ]; then + if [ "$with_xaudio2" != "1" ]; then + log 1 "configure: error: xaudio2 is only supported on Win32 targets" + exit 1 + fi + with_xaudio2="0" - if [ "$os" = "OSX" ] && [ "$endian" = "AUTO" ]; then - endian="PREPROCESSOR" + log 1 "checking xaudio2... not Windows, skipping" + else + check_xaudio2 + fi fi - log 1 "checking endianness... $endian" + detect_sort # Suppress language errors when there is a version defined, indicating a release # It just isn't pretty if any release produces warnings in the languages. @@ -1087,7 +1137,7 @@ check_params() { fi if [ "$personal_dir" = "1" ]; then - if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ] || [ "$os" = "WINCE" ] || [ "$os" = "DOS" ] || [ "$os" = "HAIKU" ]; then + if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ] || [ "$os" = "DOS" ] || [ "$os" = "HAIKU" ]; then personal_dir="OpenTTD" elif [ "$os" = "OSX" ]; then personal_dir="Documents/OpenTTD" @@ -1184,12 +1234,15 @@ make_compiler_cflags() { # $4 - name of the ldflags variable # $5 - name of the features variable + # Get the compiler to tell us who it is + version_line="`$1 --version | head -n1`" + eval eval "flags=\\\$$2" eval eval "cxxflags=\\\$$3" eval eval "ldflags=\\\$$4" eval eval "features=\\\$$5" - if [ `basename $1 | cut -c 1-3` = "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` @@ -1264,8 +1317,11 @@ 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++0x" + fi + + if [ $cc_version -lt 140 ]; then + log 1 "configure: error: ICC version is too old: `$1 -dumpversion`, minumum: 14.0" + exit 1 fi if [ "$enable_lto" != "0" ]; then @@ -1276,16 +1332,17 @@ make_compiler_cflags() { features="$features lto" fi fi - elif [ `basename $1 | grep '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" # -W alone doesn't enable all warnings enabled by -Wall; on the other hand, # -Weverything enables too many useless warnings that can't be disabled (as of 3.0) - flags="$flags -Wall -W" + flags="$flags -Wall -W -Wextra" # warning: unused parameter '...' flags="$flags -Wno-unused-parameter" @@ -1326,13 +1383,22 @@ make_compiler_cflags() { flags="$flags -Wno-unused-variable" fi + 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 + # rdynamic is used to get useful stack traces from crash reports. ldflags="$ldflags -rdynamic" + + # Assume gcc, since it just uses argv[0] in its --version output else # Enable some things only for certain GCC versions - cc_version=`$1 -dumpversion | cut -c 1,3` + # cc_version = major_version * 100 + minor_version + # For example: "3.3" -> 303, "4.9.2" -> 409, "6" -> 600, "23.5" -> 2305 + cc_version=`$1 -dumpversion | $awk -F . '{printf "%d%02d", $1, $2}'` - if [ $cc_version -lt 33 ]; then + if [ $cc_version -lt 303 ]; then log 1 "configure: error: gcc older than 3.3 can't compile OpenTTD because of its poor template support" exit 1 fi @@ -1345,20 +1411,20 @@ make_compiler_cflags() { if [ $enable_assert -eq 0 ]; then # Do not warn about unused variables when building without asserts flags="$flags -Wno-unused-variable" - if [ $cc_version -ge 46 ]; then + if [ $cc_version -ge 406 ]; then # GCC 4.6 gives more warnings, disable them too flags="$flags -Wno-unused-but-set-variable" flags="$flags -Wno-unused-but-set-parameter" fi fi - if [ $cc_version -ge 34 ]; then + if [ $cc_version -ge 304 ]; then # Warn when a variable is used to initialise itself: # int a = a; flags="$flags -Winit-self" fi - if [ $cc_version -ge 40 ]; then + if [ $cc_version -ge 400 ]; then # GCC 4.0+ complains about that we break strict-aliasing. # On most places we don't see how to fix it, and it doesn't # break anything. So disable strict-aliasing to make the @@ -1369,7 +1435,7 @@ make_compiler_cflags() { flags="$flags -Wcast-qual" fi - if [ $cc_version -ge 42 ]; then + if [ $cc_version -ge 402 ]; then # GCC 4.2+ automatically assumes that signed overflows do # not occur in signed arithmetics, whereas we are not # sure that they will not happen. It furthermore complains @@ -1380,25 +1446,31 @@ make_compiler_cflags() { flags="$flags -Wnon-virtual-dtor" fi - if [ $cc_version -ge 43 ]; 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++0x" - fi - - if [ $cc_version -eq 45 ]; then + 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 flags="$flags -fno-tree-vrp" fi - if [ $cc_version -ge 47 ]; then + if [ $cc_version -eq 407 ]; then # Disable -Wnarrowing which gives many warnings, such as: # warning: narrowing conversion of '...' from 'unsigned int' to 'int' inside { } [-Wnarrowing] # They are valid according to the C++ standard, but useless. cxxflags="$cxxflags -Wno-narrowing" + fi + + if [ $cc_version -ge 407 ]; then # Disable bogus 'attempt to free a non-heap object' warning flags="$flags -Wno-free-nonheap-object" + else + log 1 "configure: error: GCC version is too old: `$1 -dumpversion`, minumum: 4.7" + exit 1 + fi + + 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" fi if [ "$enable_lto" != "0" ]; then @@ -1406,7 +1478,7 @@ make_compiler_cflags() { has_lto=`$1 -dumpspecs | grep '\%{flto'` if [ -n "$has_lto" ]; then # Use LTO only if we see LTO exists and is requested - if [ $cc_version -lt 46 ]; then + if [ $cc_version -lt 406 ]; then flags="$flags -flto" else flags="$flags -flto=jobserver" @@ -1432,21 +1504,27 @@ make_compiler_cflags() { make_cflags_and_ldflags() { # General CFlags for BUILD - CFLAGS_BUILD="$CFLAGS_BUILD" + CFLAGS_BUILD_ENV="$CFLAGS_BUILD" + CFLAGS_BUILD="" # Special CXXFlags for BUILD - CXXFLAGS_BUILD="$CXXFLAGS_BUILD" + CXXFLAGS_BUILD_ENV="$CXXFLAGS_BUILD" + CXXFLAGS_BUILD="" # LDFLAGS for BUILD - LDFLAGS_BUILD="$LDFLAGS_BUILD" + LDFLAGS_BUILD_ENV="$LDFLAGS_BUILD" + LDFLAGS_BUILD="" # FEATURES for BUILD (lto) FEATURES_BUILD="" # General CFlags for HOST - CFLAGS="$CFLAGS" + CFLAGS_ENV="$CFLAGS" + CFLAGS="" # Special CXXFlags for HOST - CXXFLAGS="$CXXFLAGS" + CXXFLAGS_ENV="$CXXFLAGS" + CXXFLAGS="" # Libs to compile. In fact this is just LDFLAGS LIBS="-lstdc++" # LDFLAGS used for HOST - LDFLAGS="$LDFLAGS" + LDFLAGS_ENV="$LDFLAGS" + LDFLAGS="" # FEATURES for HOST (lto) FEATURES="" @@ -1455,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 @@ -1475,9 +1555,6 @@ make_cflags_and_ldflags() { # Each debug level reduces the optimization by a bit if [ $enable_debug -ge 1 ]; then CFLAGS="$CFLAGS -g -D_DEBUG" - if [ "$os" = "PSP" ]; then - CFLAGS="$CFLAGS -G0" - fi fi if [ $enable_debug -ge 2 ]; then CFLAGS="$CFLAGS -fno-inline" @@ -1490,7 +1567,7 @@ make_cflags_and_ldflags() { fi if [ $enable_debug -le 2 ]; then - cc_host_is_gcc=`basename "$cc_host" | grep "gcc" &>/dev/null` + cc_host_is_gcc=`basename "$cc_host" | grep "gcc" 2>/dev/null` if [ -n "$cc_host_is_gcc" ]; then # Define only when compiling with GCC. Some GLIBC versions use GNU # extensions in a way that breaks build with at least ICC. @@ -1498,14 +1575,17 @@ make_cflags_and_ldflags() { CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2" fi - cc_build_is_gcc=`basename "$cc_build" | grep "gcc" &>/dev/null` + cc_build_is_gcc=`basename "$cc_build" | grep "gcc" 2>/dev/null` if [ -n "$cc_build_is_gcc" ]; then - # Just add -O1 to the tools needed for building. + # Add -O1 and fortify source to the tools needed for building, on gcc CFLAGS_BUILD="$CFLAGS_BUILD -D_FORTIFY_SOURCE=2 -O1" + elif [ -n "`basename "$cc_build" | grep "clang" 2>/dev/null`" ]; then + # Add -O1 to the tools needed for building, on clang + CFLAGS_BUILD="$CFLAGS_BUILD -O1" fi fi - if [ "$os" = "OSX" ] && [ $cc_version -eq 40 ]; then + if [ "$os" = "OSX" ] && [ $cc_version -eq 400 ]; then # Apple's GCC 4.0 has a compiler bug for x86_64 with (higher) optimization, # wrongly optimizing ^= in loops. This disables the failing optimisation. CFLAGS="$CFLAGS -fno-expensive-optimizations" @@ -1529,7 +1609,7 @@ make_cflags_and_ldflags() { LDFLAGS="$LDFLAGS -mwin32" fi if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ]; then - if [ $cc_version -lt 46 ]; then + if [ $cc_version -lt 406 ]; then flags="$flags -mno-cygwin" LDFLAGS="$LDFLAGS -mno-cygwin" fi @@ -1542,32 +1622,22 @@ make_cflags_and_ldflags() { LIBS="$LIBS -lws2_32 -lwinmm -lgdi32 -ldxguid -lole32 -limm32" - if [ $cc_version -ge 44 ]; then + if [ $cc_version -ge 404 ]; then LDFLAGS_BUILD="$LDFLAGS_BUILD -static-libgcc -static-libstdc++" fi - if [ $cc_version -ge 47 ]; then + if [ $cc_version -ge 407 ]; then CFLAGS="$CFLAGS -mno-ms-bitfields" fi fi fi - if [ "$os" != "CYGWIN" ] && [ "$os" != "HAIKU" ] && [ "$os" != "OPENBSD" ] && [ "$os" != "MINGW" ] && [ "$os" != "MORPHOS" ] && [ "$os" != "OSX" ] && [ "$os" != "DOS" ] && [ "$os" != "WINCE" ] && [ "$os" != "PSP" ] && [ "$os" != "OS2" ]; then + if [ "$os" != "CYGWIN" ] && [ "$os" != "HAIKU" ] && [ "$os" != "OPENBSD" ] && [ "$os" != "MINGW" ] && [ "$os" != "MORPHOS" ] && [ "$os" != "OSX" ] && [ "$os" != "DOS" ] && [ "$os" != "OS2" ]; then LIBS="$LIBS -lpthread" fi - if [ "$os" != "CYGWIN" ] && [ "$os" != "HAIKU" ] && [ "$os" != "MINGW" ] && [ "$os" != "DOS" ] && [ "$os" != "WINCE" ]; then + if [ "$os" != "CYGWIN" ] && [ "$os" != "HAIKU" ] && [ "$os" != "MINGW" ] && [ "$os" != "DOS" ]; then LIBS="$LIBS -lc" fi - if [ "$os" = "WINCE" ]; then - LIBS="$LIBS -lcoredll -lcorelibc -laygshell -lws2 -e WinMainCRTStartup" - fi - if [ "$os" = "PSP" ]; then - CFLAGS="$CFLAGS -I`$psp_config -p`/include" - LDFLAGS="$LDFLAGS -L`$psp_config -p`/lib" - - CFLAGS="$CFLAGS -fno-exceptions -fno-rtti -D_PSP_FW_VERSION=150" - LIBS="$LIBS -D_PSP_FW_VERSION=150 -lpspdebug -lpspdisplay -lpspge -lpspctrl -lpspsdk -lpspnet -lpspnet_inet -lpspnet_apctl -lpspnet_resolver -lpsputility -lpspuser -lpspkernel -lm" - fi if [ "$os" = "MORPHOS" ]; then # -Wstrict-prototypes generates much noise because of system headers @@ -1595,23 +1665,6 @@ make_cflags_and_ldflags() { CFLAGS="$OSX_SYSROOT $CFLAGS" LDFLAGS="$OSX_LD_SYSROOT $LDFLAGS" fi - - if [ "$enable_universal" = "0" ] && [ $cc_version -gt 40 ]; then - # Only set the min version when not doing an universal build. - # Universal builds set the version elsewhere. - if [ "$cpu_type" = "64" ]; then - CFLAGS="$CFLAGS -mmacosx-version-min=10.5" - else - gcc_cpu=`$cc_host -dumpmachine` - if [ "`echo $gcc_cpu | cut -c 1-3`" = "ppc" -o "`echo $gcc_cpu | cut -c 1-7`" = "powerpc" ]; then - # PowerPC build can run on 10.3 - CFLAGS="$CFLAGS -mmacosx-version-min=10.3" - else - # Intel is only available starting from 10.4 - CFLAGS="$CFLAGS -mmacosx-version-min=10.4" - fi - fi - fi fi if [ "$os" = "BEOS" ] || [ "$os" = "HAIKU" ]; then @@ -1623,14 +1676,14 @@ make_cflags_and_ldflags() { CFLAGS="$CFLAGS -DUNIX" fi # And others like Windows - if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ] || [ "$os" = "WINCE" ]; then + if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ]; then CFLAGS="$CFLAGS -DWIN" fi if [ -n "$allegro_config" ]; then CFLAGS="$CFLAGS -DWITH_ALLEGRO" CFLAGS="$CFLAGS `$allegro_config --cflags`" - if [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ] && [ "$os" != "WINCE" ]; then + if [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ]; then if [ "$enable_static" != "0" ]; then LIBS="$LIBS `$allegro_config --static --libs`" else @@ -1643,7 +1696,7 @@ make_cflags_and_ldflags() { CFLAGS="$CFLAGS -DWITH_SDL" # SDL must not add _GNU_SOURCE as it breaks many platforms CFLAGS="$CFLAGS `$sdl_config --cflags | sed 's@-D_GNU_SOURCE[^ ]*@@'`" - if [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ] && [ "$os" != "WINCE" ]; then + if [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ]; then if [ "$enable_static" != "0" ]; then LIBS="$LIBS `$sdl_config --static-libs`" else @@ -1740,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 @@ -1768,17 +1821,25 @@ make_cflags_and_ldflags() { fi fi + if [ "$with_uniscribe" != "0" ]; then + CFLAGS="$CFLAGS -DWITH_UNISCRIBE" + LIBS="$LIBS -lusp10" + fi if [ "$with_direct_music" != "0" ]; then CFLAGS="$CFLAGS -DWIN32_ENABLE_DIRECTMUSIC_SUPPORT" # GCC 4.0+ doesn't like the DirectX includes (gives tons of # warnings on it we won't be able to fix). For now just # suppress those warnings. - if [ $cc_version -ge 40 ]; then + if [ $cc_version -ge 400 ]; then CFLAGS="$CFLAGS -Wno-non-virtual-dtor" fi fi + if [ "$with_xaudio2" != "0" ]; then + CFLAGS="$CFLAGS -DWITH_XAUDIO2" + fi + if [ -n "$libtimidity_config" ]; then CFLAGS="$CFLAGS -DLIBTIMIDITY" CFLAGS="$CFLAGS `$libtimidity_config --cflags | tr '\n\r' ' '`" @@ -1790,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 @@ -1881,6 +1947,14 @@ make_cflags_and_ldflags() { fi fi + # All flags to be extended via the env + CFLAGS_BUILD="$CFLAGS_BUILD $CFLAGS_BUILD_ENV" + CXXFLAGS_BUILD="$CXXFLAGS_BUILD $CXXFLAGS_BUILD_ENV" + LDFLAGS_BUILD="$LDFLAGS_BUILD $LDFLAGS_BUILD_ENV" + CFLAGS="$CFLAGS $CFLAGS_ENV" + CXXFLAGS="$CXXFLAGS $CXXFLAGS_ENV" + LDFLAGS="$LDFLAGS $LDFLAGS_ENV" + log 1 "using CFLAGS_BUILD... $CFLAGS_BUILD" log 1 "using CXXFLAGS_BUILD... $CXXFLAGS_BUILD" log 1 "using LDFLAGS_BUILD... $LDFLAGS_BUILD" @@ -1931,7 +2005,22 @@ check_compiler() { # $8 - "0" gcc, "1" g++, "2" windres, "3" strip, "4" lipo # $9 - What the command is to check for - if [ -n "$3" ]; then + if [ -n "$4" ]; then + # Check for manual compiler + machine=`$4 $9 2>/dev/null` + ret=$? + eval "$2=\"$4\"" + + log 2 "executing $4 $9" + log 2 " returned $machine" + log 2 " exit code $ret" + + if ( [ -z "$machine" ] && [ "$8" != "3" ] ) || [ "$ret" != "0" ]; then + log 1 "checking $1... $4 not found" + log 1 "the selected binary doesn't seem to be a $6 binary" + exit 1 + fi + elif [ -n "$3" ]; then # Check for system if [ -z "$6" ]; then compiler="$3" @@ -1974,21 +2063,6 @@ check_compiler() { log 1 "the compiler suggests it doesn't build code for the machine you specified" exit 1 fi - elif [ -n "$4" ]; then - # Check for manual compiler - machine=`$4 $9 2>/dev/null` - ret=$? - eval "$2=\"$4\"" - - log 2 "executing $4 $9" - log 2 " returned $machine" - log 2 " exit code $ret" - - if ( [ -z "$machine" ] && [ "$8" != "3" ] ) || [ "$ret" != "0" ]; then - log 1 "checking $1... $4 not found" - log 1 "the selected binary doesn't seem to be a $6 binary" - exit 1 - fi else # Nothing given, autodetect @@ -2051,26 +2125,13 @@ check_compiler() { } check_build() { - if [ "$os" = "FREEBSD" ]; then - # FreeBSD's C compiler does not support dump machine. - # However, removing C support is not possible because PSP must be linked with the C compiler. - check_compiler "build system type" "cc_build" "$build" "$cc_build" "$CXX" "g++" "c++" "0" "-dumpmachine" - else - check_compiler "build system type" "cc_build" "$build" "$cc_build" "$CC" "gcc" "cc" "0" "-dumpmachine" - fi + check_compiler "build system type" "cc_build" "$build" "$cc_build" "$CC" "gcc" "cc" "0" "-dumpmachine" } check_host() { # By default the host is the build if [ -z "$host" ]; then host="$build"; fi - - if [ "$os" = "FREEBSD" ]; then - # FreeBSD's C compiler does not support dump machine. - # However, removing C support is not possible because PSP must be linked with the C compiler. - check_compiler "host system type" "cc_host" "$host" "$cc_host" "$CXX" "g++" "c++" "0" "-dumpmachine" - else - check_compiler "host system type" "cc_host" "$host" "$cc_host" "$CC" "gcc" "cc" "0" "-dumpmachine" - fi + check_compiler "host system type" "cc_host" "$host" "$cc_host" "$CC" "gcc" "cc" "0" "-dumpmachine" } check_cxx_build() { @@ -2084,7 +2145,7 @@ check_cxx_host() { } check_windres() { - if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ] || [ "$os" = "WINCE" ]; then + if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ]; then check_compiler "host windres" "windres" "$host" "$windres" "$WINDRES" "windres" "windres" "2" "-V" fi } @@ -2151,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=$? @@ -2172,6 +2231,35 @@ check_direct_music() { fi } +check_xaudio2() { + echo " + #include + + #undef NTDDI_VERSION + #undef _WIN32_WINNT + + #define NTDDI_VERSION NTDDI_WIN8 + #define _WIN32_WINNT _WIN32_WINNT_WIN8 + + #include + int main(int argc, char *argv[]) { }" > xaudio2.test.c + $cxx_host $CFLAGS xaudio2.test.c -o xaudio2.test 2> /dev/null + res=$? + rm -f xaudio2.test.c xaudio2.test + + if [ "$res" != "0" ]; then + if [ "$with_xaudio2" != "1" ]; then + log 1 "configure: error: xaudio2 is not available on this system" + exit 1 + fi + with_xaudio2="0" + + log 1 "checking xaudio2... not found" + else + log 1 "checking xaudio2... found" + fi +} + check_makedepend() { if [ "$enable_builtin_depend" != "0" ]; then with_makedepend="0" @@ -2290,7 +2378,7 @@ detect_awk() { detect_os() { if [ "$os" = "DETECT" ]; then - # Detect UNIX, OSX, FREEBSD, DRAGONFLY, OPENBSD, NETBSD, HPUX, MORPHOS, BEOS, SUNOS, CYGWIN, MINGW, OS2, DOS, WINCE, and PSP + # Detect UNIX, OSX, FREEBSD, DRAGONFLY, OPENBSD, NETBSD, HPUX, MORPHOS, BEOS, SUNOS, CYGWIN, MINGW, OS2, and DOS # Try first via dumpmachine, then via uname os=`echo "$host" | tr '[A-Z]' '[a-z]' | $awk ' @@ -2310,8 +2398,6 @@ detect_os() { /mingw/ { print "MINGW"; exit} /os2/ { print "OS2"; exit} /dos/ { print "DOS"; exit} - /wince/ { print "WINCE"; exit} - /psp/ { print "PSP"; exit} '` if [ -z "$os" ]; then @@ -2337,7 +2423,7 @@ detect_os() { if [ -z "$os" ]; then log 1 "detecting OS... none detected" log 1 "I couldn't detect your OS. Please use --os=OS to force one" - log 1 "Allowed values are: UNIX, OSX, FREEBSD, DRAGONFLY, OPENBSD, NETBSD, MORPHOS, HPUX, BEOS, HAIKU, SUNOS, CYGWIN, MINGW, OS2, DOS, WINCE, and PSP" + log 1 "Allowed values are: UNIX, OSX, FREEBSD, DRAGONFLY, OPENBSD, NETBSD, MORPHOS, HPUX, BEOS, HAIKU, SUNOS, CYGWIN, MINGW, OS2, and DOS" exit 1 fi @@ -2596,6 +2682,11 @@ detect_library() { eval "res=\$$2" if [ -z "$res" ]; then log 2 " trying /mingw/include/$4$5... no" + eval "$2=`ls -1 /mingw$cpu_type/include/$4*.h 2>/dev/null | egrep \"\/$5\$\"`" + fi + eval "res=\$$2" + if [ -z "$res" ]; then + log 2 " trying /mingw$cpu_type/include/$4$5... no" eval "$2=`ls -1 /opt/local/include/$4*.h 2>/dev/null | egrep \"\/$5\$\"`" fi eval "res=\$$2" @@ -2644,6 +2735,11 @@ detect_library() { eval "res=\$$2" if [ -z "$res" ]; then log 2 " trying /mingw/lib/$3... no" + eval "$2=`ls /mingw$cpu_type/lib/*.a 2>/dev/null | egrep \"\/$3\$\"`" + fi + eval "res=\$$2" + if [ -z "$res" ]; then + log 2 " trying /mingw$cpu_type/lib/$3... no" log 1 "configure: error: $2 couldn't be found" log 1 "configure: error: you requested a static link, but I can't find $3" @@ -2696,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') @@ -2780,7 +2880,7 @@ detect_fontconfig() { fontconfig_config="" return 0 fi - if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ] || [ "$os" = "WINCE" ]; then + if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ]; then log 1 "checking libfontconfig... WIN32, skipping" fontconfig_config="" return 0 @@ -2796,62 +2896,25 @@ 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" } -detect_pspconfig() { - # 0 means no, 1 is auto-detect, 2 is force - if [ "$with_psp_config" = "0" ]; then - log 1 "checking psp-config... disabled" - - psp_config="" - return 0 - fi - - if [ "$with_psp_config" = "1" ] && [ "$os" != "PSP" ]; then - log 1 "checking psp-config... not PSP, skipping" - - psp_config=""; - return 0 - fi - - if [ "$os" != "PSP" ]; then - log 1 "checking psp-config... not PSP" - - log 1 "configure: error: psp-config is only supported for PSP" - exit 1 - fi - - if [ "$with_psp_config" = "1" ] || [ "$with_psp_config" = "" ] || [ "$with_psp_config" = "2" ]; then - psp_config="psp-config" - else - psp_config="$with_psp_config" - fi - - version=`$psp_config -p 2>/dev/null` - ret=$? - log 2 "executing $psp_config -p" - log 2 " returned $version" - log 2 " exit code $ret" - - if [ -z "$version" ] || [ "$ret" != "0" ]; then - log 1 "checking psp-config... not found" - log 1 "configure: error: psp-config couldn't be found" - - # It was forced, so it should be found. - if [ "$with_psp_config" != "1" ]; then - log 1 "configure: error: you supplied '$with_psp_config', but it seems invalid" - fi - exit 1 - fi - - log 1 "checking psp-config... found" -} - detect_iconv() { # 0 means no, 1 is auto-detect, 2 is force if [ "$with_iconv" = "0" ]; then @@ -2870,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` @@ -3096,24 +3165,40 @@ detect_nforenum() { log 1 "checking nforenum... found" } -detect_cputype() { - if [ -n "$cpu_type" ] && [ "$cpu_type" != "DETECT" ]; then - log 1 "forcing cpu-type... $cpu_type bits" - return; - fi - echo "#define _SQ64 1" > tmp.64bit.cpp - echo "#include \"src/stdafx.h\"" >> tmp.64bit.cpp - echo "assert_compile(sizeof(size_t) == 8);" >> tmp.64bit.cpp - echo "int main() { return 0; }" >> tmp.64bit.cpp - execute="$cxx_host $CFLAGS tmp.64bit.cpp -o tmp.64bit -DTESTING 2>&1" +_detect_cputype_width() { + echo "#define _SQ64 1" > $1.cpp + echo "#include \"src/stdafx.h\"" >> $1.cpp + echo "assert_compile(sizeof(size_t) == $2);" >> $1.cpp + echo "int main() { return 0; }" >> $1.cpp + execute="$cxx_host $CFLAGS -std=c++11 $1.cpp -o $1 -DTESTING 2>&1" cpu_type="`eval $execute 2>/dev/null`" ret=$? log 2 "executing $execute" log 2 " returned $cpu_type" log 2 " exit code $ret" - if [ "$ret" = "0" ]; then cpu_type="64"; else cpu_type="32"; fi + rm -f $1 $1.cpp + return $ret +} + +detect_cputype() { + if [ -n "$cpu_type" ] && [ "$cpu_type" != "DETECT" ]; then + log 1 "forcing cpu-type... $cpu_type bits" + return; + fi + _detect_cputype_width tmp.32bit 4 + result32=$? + _detect_cputype_width tmp.64bit 8 + result64=$? + + if [ "$result32" = 0 ] && [ "$result64" != 0 ]; then + cpu_type="32" + elif [ "$result32" != 0 ] && [ "$result64" = 0 ]; then + cpu_type="64" + else + log 1 "configure: unable to determine cpu-type (pointer width)" + exit 1 + fi log 1 "detecting cpu-type... $cpu_type bits" - rm -f tmp.64bit tmp.64bit.cpp } detect_sse_capable_architecture() { @@ -3201,17 +3286,14 @@ make_sed() { s@!!INSTALL_DIR!!@$install_dir@g; s@!!BINARY_NAME!!@$binary_name@g; s@!!STRGEN!!@$STRGEN@g; - s@!!ENDIAN_CHECK!!@$ENDIAN_CHECK@g; s@!!DEPEND!!@$DEPEND@g; s@!!SETTINGSGEN!!@$SETTINGSGEN@g; - s@!!ENDIAN_FORCE!!@$endian@g; s@!!STAGE!!@$STAGE@g; s@!!MAKEDEPEND!!@$makedepend@g; s@!!CFLAGS_MAKEDEP!!@$cflags_makedep@g; s@!!SORT!!@$sort@g; s@!!CONFIG_CACHE_COMPILER!!@config.cache.compiler@g; s@!!CONFIG_CACHE_LINKER!!@config.cache.linker@g; - s@!!CONFIG_CACHE_ENDIAN!!@config.cache.endian@g; s@!!CONFIG_CACHE_SOURCE!!@config.cache.source@g; s@!!CONFIG_CACHE_VERSION!!@config.cache.version@g; s@!!CONFIG_CACHE_SOURCE_LIST!!@config.cache.source.list@g; @@ -3445,8 +3527,7 @@ showhelp() { echo " --os=OS the OS we are compiling for [DETECT]" echo " DETECT/UNIX/OSX/FREEBSD/DRAGONFLY/OPENBSD/" echo " NETBSD/MORPHOS/HPUX/BEOS/SUNOS/CYGWIN/" - echo " MINGW/OS2/DOS/WINCE/PSP/HAIKU" - echo " --endian=ENDIAN set the endian of the HOST (AUTO/LE/BE)" + echo " MINGW/OS2/DOS/HAIKU" echo "" echo "Paths:" echo " --prefix-dir=dir specifies the prefix for all installed" @@ -3517,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)" @@ -3542,7 +3624,6 @@ showhelp() { echo " --static-icu try to link statically (libsicu instead of" echo " libicu; can fail as the new name is guessed)" echo " --with-iconv[=iconv-path] enables iconv support" - echo " --with-psp-config[=psp-config] enables psp-config support (PSP ONLY)" echo " --disable-builtin-depend disable use of builtin deps finder" echo " --with-makedepend[=makedepend] enables makedepend support" echo " --with-ccache enables ccache support" @@ -3563,6 +3644,8 @@ showhelp() { echo " CFLAGS_BUILD C compiler flags for build time tool generation" echo " CXXFLAGS_BUILD C++ compiler flags for build time tool generation" echo " LDFLAGS_BUILD linker flags for build time tool generation" + echo " PKG_CONFIG_PATH additional library search paths (see \"man pkg-config\")" + echo " PKG_CONFIG_LIBDIR replace the default library search path (see \"man pkg-config\")" echo "" echo "Use these variables to override the choices made by 'configure' or to help" echo "it to find libraries and programs with nonstandard names/locations." diff --git a/configure b/configure index 6b2c9d87b7..afc1de51b4 100755 --- a/configure +++ b/configure @@ -75,13 +75,12 @@ save_params make_cflags_and_ldflags EXE="" -if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ] || [ "$os" = "OS2" ] || [ "$os" = "DOS" ] || [ "$os" = "WINCE" ]; then +if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ] || [ "$os" = "OS2" ] || [ "$os" = "DOS" ]; then EXE=".exe" fi TTD="openttd$EXE" STRGEN="strgen$EXE" -ENDIAN_CHECK="endian_check$EXE" DEPEND="depend$EXE" SETTINGSGEN="settings_gen$EXE" @@ -114,7 +113,6 @@ AWKCOMMAND=' if ($0 == "PNG" && "'$png_config'" == "") { next; } if ($0 == "OSX" && "'$os'" != "OSX") { next; } if ($0 == "OS2" && "'$os'" != "OS2") { next; } - if ($0 == "PSP" && "'$os'" != "PSP") { next; } if ($0 == "DEDICATED" && "'$enable_dedicated'" != "1") { next; } if ($0 == "AI" && "'$enable_ai'" == "0") { next; } if ($0 == "COCOA" && "'$with_cocoa'" == "0") { next; } @@ -124,10 +122,10 @@ AWKCOMMAND=' if ($0 == "WIN32" && "'$os'" != "MINGW" && "'$os'" != "CYGWIN" && "'$os'" != "MSVC") { next; } if ($0 == "MORPHOS" && "'$os'" != "MORPHOS") { next; } - if ($0 == "WINCE" && "'$os'" != "WINCE") { next; } 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; } @@ -149,7 +147,7 @@ AWKCOMMAND=' # Read the source.list and process it # Please escape ALL " within ` because e.g. "" terminates the string in some sh implementations -SRCS="`< $ROOT_DIR/source.list tr '\r' '\n' | $awk \"$AWKCOMMAND\" | $PIPE_SORT`" +SRCS="`< $ROOT_DIR/source.list tr '\r' '\n' | $awk \"$AWKCOMMAND\" | LC_ALL=C $PIPE_SORT`" OBJS_C="` echo \"$SRCS\" | $awk ' { ORS = \" \" } /\.c$/ { gsub(\".c$\", \".o\", $0); print $0; }'`" OBJS_CPP="`echo \"$SRCS\" | $awk ' { ORS = \" \" } /\.cpp$/ { gsub(\".cpp$\", \".o\", $0); print $0; }'`" 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 637b28b2e2..0000000000 --- a/docs/Readme_Windows_MSVC.txt +++ /dev/null @@ -1,108 +0,0 @@ -Compiling OpenTTD using Microsoft Visual C++ -Last updated: 2010-01-03 --------------------------------------------- -PLEASE READ THE ENTIRE DOCUMENT BEFORE DOING ANY ACTUAL CHANGES!! - - -SUPPORTED MSVC COMPILERS ------------------------- -OpenTTD includes projects for MSVC 2005.NET and MSVC 2008.NET. Both will -compile out of the box, providing you have the required libraries/headers; -which ones, see below. There is no support for VS6 or MSVC 2002, or -MSVC 2003.NET. You are therefore strongly encouraged to either upgrade to -MSVC 2008 Express (free) or use GCC. - - -1) REQUIRED FILES ------------------ -You might already have some of the files already installed, so check before -downloading; mostly because the DirectX SDK and Platform SDK are about -500MB each. -Download the following files: - - * openttd-useful.zip (http://binaries.openttd.org/extra/openttd-useful/) - * DirectX 8.1 SDK (http://neuron.tuke.sk/~mizanin/eng/Dx81sdk-include-lib.rar) (or alternatively the latest DirectX SDK from Microsoft) - * 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.txt for the required 3rdparty files and how to install them. - - -4) COMPILING ------------- -Open trunk/openttd_vs[89]0.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 trunk/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 @@
  • m1 bits 4..0: owner of the tile
  • m2: see signals
  • m3 bits 7..4: see signals
  • -
  • m3 bits 3..0 = track type: +
  • m8 bits 5..0 = track type: @@ -626,7 +626,8 @@
  • m5 bit 6 set: level crossing
    • m1 bits 4..0: owner of the railway track
    • -
    • m3 bits 3..0: railway track type
    • +
    • m5 bit 5: set if crossing lights are on
    • +
    • m5 bit 4: pbs reservation state
    • m5 bit 0: direction
  • 0 
    @@ -639,9 +640,8 @@
  • -
  • m5 bit 5: set if crossing lights are on
  • m7 bits 4..0: owner of the road type 0 (normal road)
  • -
  • m5 bit 4: pbs reservation state
  • +
  • m8 bits 5..0: railway track type
  • @@ -860,7 +860,6 @@
  • m2: index into the array of stations
  • m3 bits 7..4: persistent random data for railway stations/waypoints and airports)
  • m3 bits 7..4: owner of tram tracks (road stop)
  • -
  • m3 bits 3..0: track type for railway stations/waypoints
  • m4: custom station id; 0 means standard graphics
  • m5: graphics index (range from 0..255 for each station type): @@ -979,6 +978,7 @@
  • m7 bits 4..0: owner of road (road stops)
  • m7 bits 7..6: present road types (road stops)
  • m7: animation frame (railway stations/waypoints, airports)
  • +
  • m8 bits 5..0: track type for railway stations/waypoints
  • @@ -1444,7 +1444,6 @@
    • m1 bits 4..0: owner
    • m3 bits 7..4: owner of tram
    • -
    • m3 bits 3..0: track type for railway
    • m5 bit 4: pbs reservation state for railway
    • m5 bits 7 clear: tunnel entrance/exit
    • m5 bit 7 set: bridge ramp @@ -1582,6 +1581,7 @@
    • m7 bits 4..0: owner of road
    • m7 bit 5 set = on snow or desert
    • m7 bits 7..6: present road types for road
    • +
    • m8 bits 5..0: track type for railway
    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. + @@ -64,6 +66,7 @@ the array so you can quickly see what is used and what is not. + @@ -77,6 +80,7 @@ the array so you can quickly see what is used and what is not. + @@ -89,6 +93,7 @@ the array so you can quickly see what is used and what is not. + @@ -97,11 +102,12 @@ the array so you can quickly see what is used and what is not. - + + @@ -109,11 +115,12 @@ the array so you can quickly see what is used and what is not. - + + @@ -121,11 +128,12 @@ the array so you can quickly see what is used and what is not. - + + @@ -139,6 +147,7 @@ the array so you can quickly see what is used and what is not. + @@ -146,11 +155,12 @@ the array so you can quickly see what is used and what is not. - - - + + + + @@ -163,6 +173,7 @@ the array so you can quickly see what is used and what is not. + @@ -176,6 +187,7 @@ the array so you can quickly see what is used and what is not. + @@ -189,6 +201,7 @@ the array so you can quickly see what is used and what is not. + @@ -197,11 +210,12 @@ the array so you can quickly see what is used and what is not. - + + @@ -214,6 +228,7 @@ the array so you can quickly see what is used and what is not. + @@ -226,6 +241,7 @@ the array so you can quickly see what is used and what is not. + @@ -238,6 +254,7 @@ the array so you can quickly see what is used and what is not. + @@ -250,6 +267,7 @@ the array so you can quickly see what is used and what is not. + @@ -262,6 +280,7 @@ the array so you can quickly see what is used and what is not. + @@ -274,6 +293,7 @@ the array so you can quickly see what is used and what is not. + @@ -287,6 +307,7 @@ the array so you can quickly see what is used and what is not. + @@ -299,6 +320,7 @@ the array so you can quickly see what is used and what is not. + @@ -311,6 +333,7 @@ the array so you can quickly see what is used and what is not. + @@ -324,6 +347,7 @@ the array so you can quickly see what is used and what is not. + @@ -332,23 +356,25 @@ the array so you can quickly see what is used and what is not. - + + + - - + + @@ -362,6 +388,7 @@ the array so you can quickly see what is used and what is not. +
    m5 (8) m6 (8) m7 (8)m8 (16)
    bits7654 3210 7654 3210 7654 3210FEDC BA98 7654 3210
    0XXXX XXXX OOOX XXOO OOOO OOOOOOOO OOOO OOOO OOOO
    farmland-inherit- OOOX XXOO OOOO OOOOOOOO OOOO OOOO OOOO
    1XXXX XXXX OOOX XXXX OOOO XXXX OOOO OOOOOOOO XXXXOOOO OOOO OOOO XXXX XXXX XXXX OOOO OOOO OOOO OOOOOOOO OOOO OOXX XXXX
    rail with signals-inherit- -inherit- OOOO XXXX XXXX XXXXXXXX XXXXXXXX OOOO XXXX XXXX -inherit- OOOO OOOO OOOO OOOO-inherit-
    depot-inherit- -inherit- XXXX XXXX XXXX XXXXOOOO XXXX-inherit- OOOO XXXX XXOX OOXX OOOO OOOO OOOO OOOO-inherit-
    2XXXX XXXX OOXX XOOO XXXO XXXXOOOO OOOO OOOO OOOO
    level crossing-inherit- -inherit- -inherit-XXXX XXXX-inherit-XXXX OOOXXXXX OOOOOOOO OOOOXXXX OOOX OOXX XOOO XXXX XXXXOOOO OOOO OOXX XXXX
    road depotXXOO OOXX OOOO OOOO XXXO XXXXOOOO OOOO OOOO OOOO
    3XXXX XXXX XXXX XXOO XXXX XXXXOOOO OOOO OOOO OOOO
    4XXOO OXXX OOOO OOOO OOOO OOOOOOOO OOOO OOOO OOOO
    5XXXX XXXX OXXX XXXX XXXX XXXX XXXX XXXXXXXX XXXXXXXX OOOO XXXX XXXX XXXX XXXX OOXX XXOO XXXX XXXXOOOO OOOO OOXX XXXX
    rail waypoint-inherit- -inherit- -inherit--inherit-
    road stop~~~~ ~XXX OOXX XOOO XXOX XXXXOOOO OOOO OOOO OOOO
    dock~~~~ ~XXX OOXX XOOO OOOO OOOOOOOO OOOO OOOO OOOO
    airportXXXX XXXX OOXX XOOO XXXX XXXXOOOO OOOO OOOO OOOO
    buoy~~~~ ~~~~ OOXX XOOO OOOO OOOOOOOO OOOO OOOO OOOO
    oilrig~~~~ ~~~~ OOXX XOOO OOOO OOOOOOOO OOOO OOOO OOOO
    6X~~X XXXX OOOO OOOO OOOO OOOOOOOO OOOO OOOO OOOO
    canal, river-inherit- OOOO OOOO OOOO OOOOOOOO OOOO OOOO OOOO
    shipdepot-inherit- OOOO OOOO OOOO OOOOOOOO OOOO OOOO OOOO
    8XXXX XXXX OOXX XXOO XXXX XXXXOOOO OOOO OOOO OOOO
    9XXXX XXXX OOOX XXXX OOOO OOOO OOOO OOOOXXXX XXXXXXXX OOOO OOOO OOOO XOOX XXXX OOOO OOOO XXXX XXXXOOOO OOOO OOXX XXXX
    bridge ramp -inherit- -inherit- -inherit-OOOO OOOO OOOO OOOO -inherit--inherit--inherit-OOOO OOOO -inherit- OOXX XXOO -inherit--inherit-
    AXXXX XXXX OOOO OOOO XXXX XXXXOOOO OOOO OOOO OOOO
    diff --git a/docs/obm_format.txt b/docs/obm_format.txt index 40f829a522..45fe5f879e 100644 --- a/docs/obm_format.txt +++ b/docs/obm_format.txt @@ -45,12 +45,15 @@ description.en_US = howdie ; The file names are case sensitive. ; You can have empty file names; in that case no song will be loaded ; for that 'entry'. +; If you want to load music from the MPS DOS music driver "cat" format, +; specify just the name of the .cat file the song is located in, then +; fill out the "catindex" section. [files] ; The theme song for OpenTTD theme = THEME_SONG.GM ; The songs in the 'old style' category -old_0 = -old_1 = +old_0 = GM.CAT +old_1 = GM.CAT old_2 = old_3 = old_4 = @@ -86,9 +89,17 @@ ezy_9 = ; Note that the list of files is case sensitive. Each file listed in the ; files section must be listed here with it's song name, otherwise you ; will get a lot of warnings when starting OpenTTD. +; You don't need to fill this out for "cat" format music, the song names +; are loaded directly from the file in that case. [names] THEME_SONG.GM = Tycoon DELUXE Theme +; If you are loading music from the DOS version "cat" format, specify +; which index into the file the song has. +[catindex] +old_0 = 1 +old_1 = 3 + ; The md5s section lists the MD5 checksum for the files that replace them. ; Note that the list of files is case sensitive. Each file listed in the ; files section must be listed here with it's MD5 checksum, otherwise you @@ -96,6 +107,13 @@ THEME_SONG.GM = Tycoon DELUXE Theme [md5s] THEME_SONG.GM = 45cfec1b9d8c7a0ad45e755833cbf221 +; If a song needs to have parts of the start or end cut off to avoid long +; silences, you can specify MIDI tick codes for start:end of the actual +; music part for each file here. +; Not all music drivers might support this feature. +[timingtrim] +THEME_SONG.GM = 768:53760 + ; The origin section provides the possibility to put and extra line into ; the warning that a file is missing/corrupt. This can be used to tell ; them where to find it. It works on the filename specified in the diff --git a/findversion.sh b/findversion.sh index 639d2a0eeb..b91947736a 100755 --- a/findversion.sh +++ b/findversion.sh @@ -14,42 +14,31 @@ if [ "$#" != "0" ]; then Usage: ./findversion.sh Finds the current revision and if the code is modified. -Output: \t\t\t -REV +Output: \t\t\t +VERSION a string describing what version of the code the current checkout is - based on. The exact format of this string depends on the version - control system in use, but it tries to identify the revision used as - close as possible (using the svn revision number or hg/git hash). - This also includes an indication of whether the checkout was - modified and which branch was checked out. This value is not + based on. + This also includes the commit date, an indication of whether the checkout + was modified and which branch was checked out. This value is not guaranteed to be sortable, but is mainly meant for identifying the revision and user display. If no revision identifier could be found, this is left empty. -REV_NR - the revision number of the svn revision this checkout is based on. - This can be used to determine which functionality is present in this - checkout. For trunk svn checkouts and hg/git branches based upon it, - this number should be accurate. For svn branch checkouts, this - number is mostly meaningless, at least when comparing with the - REV_NR from other branches or trunk. +ISODATE + the commit date of the revision this checkout is based on. + The commit date may differ from the author date. + This can be used to decide upon the age of the source. - This number should be sortable. Within a given branch or trunk, a - higher number means a newer version. However, when using git or hg, - this number will not increase on new commits. - - If no revision number could be found, this is left empty. + If no timestamp could be found, this is left empty. MODIFIED Whether (the src directory of) this checkout is modified or not. A value of 0 means not modified, a value of 2 means it was modified. - Modification is determined in relation to the commit identified by - REV, so not in relation to the svn revision identified by REV_NR. A value of 1 means that the modified status is unknown, because this - is not an svn/git/hg checkout for example. + is not an git checkout for example. -CLEAN_REV - the same as REV but without branch name +HASH + the git revision hash By setting the AWK environment variable, a caller can determine which version of "awk" is used. If nothing is set, this script defaults to @@ -70,21 +59,7 @@ ROOT_DIR=`pwd` # Determine if we are using a modified version # Assume the dir is not modified MODIFIED="0" -if [ -d "$ROOT_DIR/.svn" ] || [ -d "$ROOT_DIR/../.svn" ]; then - # We are an svn checkout - if [ -n "`svnversion | grep 'M'`" ]; then - MODIFIED="2" - fi - # Find the revision like: rXXXXM-branch - BRANCH=`LC_ALL=C svn info | "$AWK" '/^URL:.*branches/ { split($2, a, "/"); for(i in a) if (a[i]=="branches") { print a[i+1]; break } }'` - TAG=`LC_ALL=C svn info | "$AWK" '/^URL:.*tags/ { split($2, a, "/"); for(i in a) if (a[i]=="tags") { print a[i+1]; break } }'` - REV_NR=`LC_ALL=C svn info | "$AWK" '/^Last Changed Rev:/ { print $4 }'` - if [ -n "$TAG" ]; then - REV=$TAG - else - REV="r$REV_NR" - fi -elif [ -d "$ROOT_DIR/.git" ]; then +if [ -d "$ROOT_DIR/.git" ]; then # We are a git checkout # Refresh the index to make sure file stat info is in sync, then look for modifications git update-index --refresh >/dev/null @@ -92,35 +67,21 @@ elif [ -d "$ROOT_DIR/.git" ]; then MODIFIED="2" fi HASH=`LC_ALL=C git rev-parse --verify HEAD 2>/dev/null` - REV="g`echo $HASH | cut -c1-8`" - BRANCH="`git symbolic-ref -q HEAD 2>/dev/null | sed 's@.*/@@;s@^master$@@'`" - REV_NR=`LC_ALL=C git log --pretty=format:%s --grep="^(svn r[0-9]*)" -1 | sed "s@.*(svn r\([0-9]*\)).*@\1@"` - if [ -z "$REV_NR" ]; then - # No rev? Maybe it is a custom git-svn clone - REV_NR=`LC_ALL=C git log --pretty=format:%b --grep="git-svn-id:.*@[0-9]*" -1 | sed "s@.*\@\([0-9]*\).*@\1@"` - fi + SHORTHASH=`echo ${HASH} | cut -c1-8` + ISODATE=`LC_ALL=C git show -s --pretty='format:%ci' HEAD | "$AWK" '{ gsub("-", "", $1); print $1 }'` + BRANCH="`git symbolic-ref -q HEAD 2>/dev/null | sed 's@.*/@@'`" TAG="`git describe --tags 2>/dev/null`" + if [ -n "$TAG" ]; then - BRANCH="" - REV="$TAG" + VERSION="${TAG}" + elif [ "${BRANCH}" = "master" ]; then + VERSION="${ISODATE}-g${SHORTHASH}" + else + VERSION="${ISODATE}-${BRANCH}-g${SHORTHASH}" fi -elif [ -d "$ROOT_DIR/.hg" ]; then - # We are a hg checkout - if [ -n "`HGPLAIN= hg status | grep -v '^?'`" ]; then - MODIFIED="2" - fi - HASH=`LC_ALL=C HGPLAIN= hg id -i | cut -c1-12` - REV="h`echo $HASH | cut -c1-8`" - BRANCH="`HGPLAIN= hg branch | sed 's@^default$@@'`" - TAG="`HGPLAIN= hg id -t | grep -v 'tip$'`" - if [ -n "$TAG" ]; then - BRANCH="" - REV="$TAG" - fi - REV_NR=`LC_ALL=C HGPLAIN= hg log -f -k "(svn r" -l 1 --template "{desc|firstline}\n" | grep "^(svn r[0-9]*)" | sed "s@.*(svn r\([0-9]*\)).*@\1@"` - if [ -z "$REV_NR" ]; then - # No rev? Maybe it is a custom hgsubversion clone - REV_NR=`LC_ALL=C HGPLAIN= hg parent --template="{svnrev}"` + + if [ "$MODIFIED" -eq "2" ]; then + VERSION="${VERSION}M" fi elif [ -f "$ROOT_DIR/.ottdrev" ]; then # We are an exported source bundle @@ -129,19 +90,12 @@ elif [ -f "$ROOT_DIR/.ottdrev" ]; then else # We don't know MODIFIED="1" + HASH="" + SHORTHASH="" BRANCH="" - REV="" - REV_NR="" + ISODATE="" + TAG="" + VERSION="" fi -if [ "$MODIFIED" -eq "2" ]; then - REV="${REV}M" -fi - -CLEAN_REV=${REV} - -if [ -n "$BRANCH" ]; then - REV="${REV}-$BRANCH" -fi - -echo "$REV $REV_NR $MODIFIED $CLEAN_REV" +echo "$VERSION $ISODATE $MODIFIED $HASH" diff --git a/known-bugs.txt b/known-bugs.txt index 34aca33002..8d4fd2204b 100644 --- a/known-bugs.txt +++ b/known-bugs.txt @@ -1,6 +1,6 @@ OpenTTD's known bugs -Last updated: 2015-02-24 -Release version: 1.5.0-beta2 +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: http://bugs.openttd.org -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,427 +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 [#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/baseset/orig_dos.obg b/media/baseset/orig_dos.obg index b4cde64007..f9db843af1 100644 --- a/media/baseset/orig_dos.obg +++ b/media/baseset/orig_dos.obg @@ -11,21 +11,21 @@ palette = DOS !! description STR_BASEGRAPHICS_DOS_DESCRIPTION [files] -base = TRG1.GRF -logos = TRGI.GRF -arctic = TRGC.GRF -tropical = TRGH.GRF -toyland = TRGT.GRF -extra = OPENTTD.GRF +base = TRG1.GRF +logos = TRGI.GRF +arctic = TRGC.GRF +tropical = TRGH.GRF +toyland = TRGT.GRF +extra = ORIG_EXTRA.GRF [md5s] -TRG1.GRF = 9311676280e5b14077a8ee41c1b42192 -TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8 -TRGC.GRF = ed446637e034104c5559b32c18afe78d -TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9 -TRGT.GRF = e30e8a398ae86c03dc534a8ac7dfb3b6 -OPENTTD.GRF = +TRG1.GRF = 9311676280e5b14077a8ee41c1b42192 +TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8 +TRGC.GRF = ed446637e034104c5559b32c18afe78d +TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9 +TRGT.GRF = e30e8a398ae86c03dc534a8ac7dfb3b6 +ORIG_EXTRA.GRF = [origin] -default = You can find it on your Transport Tycoon Deluxe CD-ROM. -OPENTTD.GRF = This file was part of your OpenTTD installation. +default = You can find it on your Transport Tycoon Deluxe CD-ROM. +ORIG_EXTRA.GRF = This file was part of your OpenTTD installation. diff --git a/media/baseset/orig_dos.obm b/media/baseset/orig_dos.obm new file mode 100644 index 0000000000..9920bfdbe1 --- /dev/null +++ b/media/baseset/orig_dos.obm @@ -0,0 +1,76 @@ +; $Id$ +; +; This represents the original music as on the Transport +; Tycoon Deluxe for DOS CD. +; +[metadata] +name = original_dos +shortname = TTDD +version = 1 +!! description STR_BASEMUSIC_DOS_DESCRIPTION + +[files] +theme = gm.cat +old_0 = gm.cat +old_1 = gm.cat +old_2 = gm.cat +old_3 = gm.cat +old_4 = gm.cat +old_5 = gm.cat +old_6 = gm.cat +old_7 = gm.cat +old_8 = +old_9 = +new_0 = gm.cat +new_1 = gm.cat +new_2 = gm.cat +new_3 = gm.cat +new_4 = gm.cat +new_5 = gm.cat +new_6 = gm.cat +new_7 = +new_8 = +new_9 = +ezy_0 = gm.cat +ezy_1 = gm.cat +ezy_2 = gm.cat +ezy_3 = gm.cat +ezy_4 = gm.cat +ezy_5 = gm.cat +ezy_6 = +ezy_7 = +ezy_8 = +ezy_9 = + +[md5s] +gm.cat = 7a29d2d0c4f7d2e03091ffa9b2bdfffb + +[catindex] +theme = 0 +old_0 = 1 +old_1 = 8 +old_2 = 2 +old_3 = 9 +old_4 = 14 +old_5 = 15 +old_6 = 19 +old_7 = 13 +new_0 = 6 +new_1 = 11 +new_2 = 10 +new_3 = 17 +new_4 = 21 +new_5 = 18 +new_6 = 5 +ezy_0 = 12 +ezy_1 = 7 +ezy_2 = 16 +ezy_3 = 3 +ezy_4 = 20 +ezy_5 = 4 + +[names] +; Names get read from the CAT file + +[origin] +default = You can find it on your Transport Tycoon Deluxe CD-ROM. diff --git a/media/baseset/orig_dos_de.obg b/media/baseset/orig_dos_de.obg index 8cfcc27074..4e12582727 100644 --- a/media/baseset/orig_dos_de.obg +++ b/media/baseset/orig_dos_de.obg @@ -11,21 +11,21 @@ palette = DOS !! description STR_BASEGRAPHICS_DOS_DE_DESCRIPTION [files] -base = TRG1.GRF -logos = TRGI.GRF -arctic = TRGC.GRF -tropical = TRGH.GRF -toyland = TRGT.GRF -extra = OPENTTD.GRF +base = TRG1.GRF +logos = TRGI.GRF +arctic = TRGC.GRF +tropical = TRGH.GRF +toyland = TRGT.GRF +extra = ORIG_EXTRA.GRF [md5s] -TRG1.GRF = 9311676280e5b14077a8ee41c1b42192 -TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8 -TRGC.GRF = ed446637e034104c5559b32c18afe78d -TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9 -TRGT.GRF = fcde1d7e8a74197d72a62695884b909e -OPENTTD.GRF = +TRG1.GRF = 9311676280e5b14077a8ee41c1b42192 +TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8 +TRGC.GRF = ed446637e034104c5559b32c18afe78d +TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9 +TRGT.GRF = fcde1d7e8a74197d72a62695884b909e +ORIG_EXTRA.GRF = [origin] -default = You can find it on your Transport Tycoon Deluxe CD-ROM. -OPENTTD.GRF = This file was part of your OpenTTD installation. +default = You can find it on your Transport Tycoon Deluxe CD-ROM. +ORIG_EXTRA.GRF = This file was part of your OpenTTD installation. diff --git a/media/baseset/orig_tto.obm b/media/baseset/orig_tto.obm new file mode 100644 index 0000000000..ff600d00f6 --- /dev/null +++ b/media/baseset/orig_tto.obm @@ -0,0 +1,71 @@ +; $Id$ +; +; This represents the original music as on the Transport +; Tycoon (with World Editor) for DOS CD. +; +[metadata] +name = original_tto +shortname = TTOD +version = 1 +!! description STR_BASEMUSIC_TTO_DESCRIPTION + +[files] +theme = gm-tto.cat +old_0 = gm-tto.cat +old_1 = gm-tto.cat +old_2 = gm-tto.cat +old_3 = gm-tto.cat +old_4 = gm-tto.cat +old_5 = gm-tto.cat +old_6 = gm-tto.cat +old_7 = gm-tto.cat +old_8 = +old_9 = +new_0 = gm-tto.cat +new_1 = gm-tto.cat +new_2 = gm-tto.cat +new_3 = gm-tto.cat +new_4 = gm-tto.cat +new_5 = gm-tto.cat +new_6 = gm-tto.cat +new_7 = gm-tto.cat +new_8 = +new_9 = +ezy_0 = +ezy_1 = +ezy_2 = +ezy_3 = +ezy_4 = +ezy_5 = +ezy_6 = +ezy_7 = +ezy_8 = +ezy_9 = + +[catindex] +theme = 0 +old_0 = 1 +old_1 = 6 +old_2 = 2 +old_3 = 7 +old_4 = 11 +old_5 = 12 +old_6 = 15 +old_7 = 10 +new_0 = 4 +new_1 = 5 +new_2 = 9 +new_3 = 8 +new_4 = 13 +new_5 = 16 +new_6 = 14 +new_7 = 3 + +[md5s] +gm-tto.cat = 26e85ff84b0063aa5da05dd4698fc76e + +[names] +; Names get read from the CAT file + +[origin] +default = You can find it on your Transport Tycoon CD-ROM. diff --git a/media/baseset/orig_win.obg b/media/baseset/orig_win.obg index 82a5c2a616..393b5d3013 100644 --- a/media/baseset/orig_win.obg +++ b/media/baseset/orig_win.obg @@ -11,21 +11,21 @@ palette = Windows !! description STR_BASEGRAPHICS_WIN_DESCRIPTION [files] -base = TRG1R.GRF -logos = TRGIR.GRF -arctic = TRGCR.GRF -tropical = TRGHR.GRF -toyland = TRGTR.GRF -extra = OPENTTD.GRF +base = TRG1R.GRF +logos = TRGIR.GRF +arctic = TRGCR.GRF +tropical = TRGHR.GRF +toyland = TRGTR.GRF +extra = ORIG_EXTRA.GRF [md5s] -TRG1R.GRF = b04ce593d8c5016e07473a743d7d3358 -TRGIR.GRF = 0c2484ff6be49fc63a83be6ab5c38f32 -TRGCR.GRF = 3668f410c761a050b5e7095a2b14879b -TRGHR.GRF = 06bf2b7a31766f048baac2ebe43457b1 -TRGTR.GRF = de53650517fe661ceaa3138c6edb0eb8 -OPENTTD.GRF = +TRG1R.GRF = b04ce593d8c5016e07473a743d7d3358 +TRGIR.GRF = 0c2484ff6be49fc63a83be6ab5c38f32 +TRGCR.GRF = 3668f410c761a050b5e7095a2b14879b +TRGHR.GRF = 06bf2b7a31766f048baac2ebe43457b1 +TRGTR.GRF = de53650517fe661ceaa3138c6edb0eb8 +ORIG_EXTRA.GRF = [origin] -default = You can find it on your Transport Tycoon Deluxe CD-ROM. -OPENTTD.GRF = This file was part of your OpenTTD installation. +default = You can find it on your Transport Tycoon Deluxe CD-ROM. +ORIG_EXTRA.GRF = This file was part of your OpenTTD installation. diff --git a/media/baseset/orig_win.obm b/media/baseset/orig_win.obm index 8b35b6de9d..b5d4b024ed 100644 --- a/media/baseset/orig_win.obm +++ b/media/baseset/orig_win.obm @@ -90,5 +90,17 @@ GM_TT19.GM = Funk Central GM_TT20.GM = Jammit GM_TT21.GM = Movin' On +; MIDI timecodes where the playback should attemp to start and stop short. +; This is to allow fixing undesired silences in original MIDI files. +; However not all music drivers may support this. +[timingtrim] +; Theme has two beats silence at the beginning which prevents clean looping. +GM_TT00.GM = 768:53760 +; Can't Get There From Here from the Windows version has a long silence at the end, +; followed by a solo repeat. This isn't in the original DOS version music and is likely +; unintentional from the people who converted the music from the DOS version. +; Actual song ends after measure 152. +GM_TT10.GM = 0:235008 + [origin] default = You can find it on your Transport Tycoon Deluxe CD-ROM. diff --git a/media/extra_grf/airports.nfo b/media/extra_grf/airports.nfo index 8feb813baf..45cd25de04 100644 --- a/media/extra_grf/airports.nfo +++ b/media/extra_grf/airports.nfo @@ -23,3 +23,16 @@ -1 sprites/airports.png 8bpp 82 88 64 31 -31 0 normal -1 sprites/airports.png 8bpp 162 88 64 31 -31 0 normal -1 sprites/airports.png 8bpp 242 88 64 31 -31 0 normal + -1 * 0 0C "Climate specific sprites by PaulC" + -1 * 0 07 83 01 \7! 01 03 + -1 * 0 05 90 02 0D + -1 sprites/airports.png 8bpp 320 88 64 31 -31 0 normal + -1 sprites/airports.png 8bpp 400 88 64 31 -31 0 normal + -1 * 0 07 83 01 \7! 02 03 + -1 * 0 05 90 02 0D + -1 sprites/airports.png 8bpp 480 88 64 31 -31 0 normal + -1 sprites/airports.png 8bpp 560 88 64 31 -31 0 normal + -1 * 0 07 83 01 \7! 03 03 + -1 * 0 05 90 02 0D + -1 sprites/airports.png 8bpp 640 88 64 31 -31 0 normal + -1 sprites/airports.png 8bpp 720 88 64 31 -31 0 normal diff --git a/media/extra_grf/airports.png b/media/extra_grf/airports.png index fd63355b1f..5fb9618bc5 100644 Binary files a/media/extra_grf/airports.png and b/media/extra_grf/airports.png differ diff --git a/media/extra_grf/airports_orig_extra.nfo b/media/extra_grf/airports_orig_extra.nfo new file mode 100644 index 0000000000..f2a8dc8327 --- /dev/null +++ b/media/extra_grf/airports_orig_extra.nfo @@ -0,0 +1,12 @@ +// +// $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 . +// + -1 * 0 0C "Climate specific airport sprite by PaulC" + -1 * 0 07 83 01 \7! 03 02 + -1 * 0 0A 01 01 2F 08 + -1 sprites/airports.png 8bpp 20 170 42 39 -19 -21 normal diff --git a/media/extra_grf/canals.nfo b/media/extra_grf/canals.nfo index c0d0275f35..e464762ee6 100644 --- a/media/extra_grf/canals.nfo +++ b/media/extra_grf/canals.nfo @@ -6,7 +6,7 @@ // 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 . // - -1 * 0 0C "Canal graphics by George / PaulC" + -1 * 0 0C "Canal graphics by George" -1 * 3 05 08 41 // Canal slopes -1 sprites/canal_locks.png 8bpp 66 8 64 23 -31 0 normal @@ -77,95 +77,3 @@ -1 sprites/canals.png 8bpp 446 10 24 16 -11 -6 normal // Canal icon -1 sprites/canal_locks.png 8bpp 50 232 20 20 0 0 normal - -// Differentiation for the climates starts here - -// Canal edges (arctic snowy) - -1 * 4 01 05 01 \b12 - -1 sprites/canals.png 8bpp 30 40 45 22 -11 -1 normal - -1 sprites/canals.png 8bpp 94 40 41 21 -8 10 normal - -1 sprites/canals.png 8bpp 142 40 42 21 -31 10 normal - -1 sprites/canals.png 8bpp 190 40 43 22 -31 -1 normal - -1 sprites/canals.png 8bpp 238 40 22 22 11 4 normal - -1 sprites/canals.png 8bpp 270 40 24 16 -11 15 normal - -1 sprites/canals.png 8bpp 302 40 23 23 -31 4 normal - -1 sprites/canals.png 8bpp 334 40 24 18 -11 -1 normal - -1 sprites/canals.png 8bpp 366 40 12 11 21 10 normal - -1 sprites/canals.png 8bpp 398 40 19 10 -8 21 normal - -1 sprites/canals.png 8bpp 430 40 11 10 -31 10 normal - -1 sprites/canals.png 8bpp 446 40 24 16 -11 -6 normal - -1 * 7 02 05 10 01 00 00 00 - -// Canal edges (arctic normal) - -1 * 4 01 05 01 \b12 - -1 sprites/canals.png 8bpp 30 70 45 22 -11 -1 normal - -1 sprites/canals.png 8bpp 94 70 41 21 -8 10 normal - -1 sprites/canals.png 8bpp 142 70 42 21 -31 10 normal - -1 sprites/canals.png 8bpp 190 70 43 22 -31 -1 normal - -1 sprites/canals.png 8bpp 238 70 22 22 11 4 normal - -1 sprites/canals.png 8bpp 270 70 24 16 -11 15 normal - -1 sprites/canals.png 8bpp 302 70 23 23 -31 4 normal - -1 sprites/canals.png 8bpp 334 70 24 18 -11 -1 normal - -1 sprites/canals.png 8bpp 366 70 12 11 21 10 normal - -1 sprites/canals.png 8bpp 398 70 19 10 -8 21 normal - -1 sprites/canals.png 8bpp 430 70 11 10 -31 10 normal - -1 sprites/canals.png 8bpp 446 70 24 16 -11 -6 normal - -1 * 7 02 05 11 01 00 00 00 -// Choose the right arctic canal edges - -1 * 14 02 05 12 81 81 00 FF 01 10 00 04 04 11 00 - -1 * 6 07 83 01 \7! 01 01 - -1 * 7 03 05 01 02 00 12 00 - -// Canal edges (tropic desert) - -1 * 4 01 05 01 \b12 - -1 sprites/canals.png 8bpp 30 100 45 22 -11 -1 normal - -1 sprites/canals.png 8bpp 94 100 41 21 -8 10 normal - -1 sprites/canals.png 8bpp 142 100 42 21 -31 10 normal - -1 sprites/canals.png 8bpp 190 100 43 22 -31 -1 normal - -1 sprites/canals.png 8bpp 238 100 22 22 11 4 normal - -1 sprites/canals.png 8bpp 270 100 24 16 -11 15 normal - -1 sprites/canals.png 8bpp 302 100 23 23 -31 4 normal - -1 sprites/canals.png 8bpp 334 100 24 18 -11 -1 normal - -1 sprites/canals.png 8bpp 366 100 12 11 21 10 normal - -1 sprites/canals.png 8bpp 398 100 19 10 -8 21 normal - -1 sprites/canals.png 8bpp 430 100 11 10 -31 10 normal - -1 sprites/canals.png 8bpp 446 100 24 16 -11 -6 normal - -1 * 7 02 05 13 01 00 00 00 - -// Canal edges (tropic rainforest) - -1 * 4 01 05 01 \b12 - -1 sprites/canals.png 8bpp 30 130 45 22 -11 -1 normal - -1 sprites/canals.png 8bpp 94 130 41 21 -8 10 normal - -1 sprites/canals.png 8bpp 142 130 42 21 -31 10 normal - -1 sprites/canals.png 8bpp 190 130 43 22 -31 -1 normal - -1 sprites/canals.png 8bpp 238 130 22 22 11 4 normal - -1 sprites/canals.png 8bpp 270 130 24 16 -11 15 normal - -1 sprites/canals.png 8bpp 302 130 23 23 -31 4 normal - -1 sprites/canals.png 8bpp 334 130 24 18 -11 -1 normal - -1 sprites/canals.png 8bpp 366 130 12 11 21 10 normal - -1 sprites/canals.png 8bpp 398 130 19 10 -8 21 normal - -1 sprites/canals.png 8bpp 430 130 11 10 -31 10 normal - -1 sprites/canals.png 8bpp 446 130 24 16 -11 -6 normal - -1 * 7 02 05 14 01 00 00 00 -// Choose the right tropic canal edges - -1 * 14 02 05 15 81 81 00 FF 01 13 00 01 01 14 00 - -1 * 6 07 83 01 \7! 02 01 - -1 * 7 03 05 01 02 00 15 00 - -// Canal edges (toyland) - -1 * 4 01 05 01 \b12 - -1 sprites/canals.png 8bpp 30 160 45 22 -11 -1 normal - -1 sprites/canals.png 8bpp 94 160 41 21 -8 10 normal - -1 sprites/canals.png 8bpp 142 160 42 21 -31 10 normal - -1 sprites/canals.png 8bpp 190 160 43 22 -31 -1 normal - -1 sprites/canals.png 8bpp 238 160 22 22 11 4 normal - -1 sprites/canals.png 8bpp 270 160 24 16 -11 15 normal - -1 sprites/canals.png 8bpp 302 160 23 23 -31 4 normal - -1 sprites/canals.png 8bpp 334 160 24 18 -11 -1 normal - -1 sprites/canals.png 8bpp 366 160 12 11 21 10 normal - -1 sprites/canals.png 8bpp 398 160 19 10 -8 21 normal - -1 sprites/canals.png 8bpp 430 160 11 10 -31 10 normal - -1 sprites/canals.png 8bpp 446 160 24 16 -11 -6 normal - -1 * 7 02 05 16 01 00 00 00 - -1 * 6 07 83 01 \7! 03 01 - -1 * 7 03 05 01 02 00 16 00 diff --git a/media/extra_grf/canals_extra.nfo b/media/extra_grf/canals_extra.nfo new file mode 100644 index 0000000000..3103886233 --- /dev/null +++ b/media/extra_grf/canals_extra.nfo @@ -0,0 +1,101 @@ +// +// $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 . +// + -1 * 0 0C "Extra canal graphics by PaulC" + +// Differentiation for the climates starts here + +// Canal edges (arctic snowy) + -1 * 4 01 05 01 \b12 + -1 sprites/canals.png 8bpp 30 40 45 22 -11 -1 normal + -1 sprites/canals.png 8bpp 94 40 41 21 -8 10 normal + -1 sprites/canals.png 8bpp 142 40 42 21 -31 10 normal + -1 sprites/canals.png 8bpp 190 40 43 22 -31 -1 normal + -1 sprites/canals.png 8bpp 238 40 22 22 11 4 normal + -1 sprites/canals.png 8bpp 270 40 24 16 -11 15 normal + -1 sprites/canals.png 8bpp 302 40 23 23 -31 4 normal + -1 sprites/canals.png 8bpp 334 40 24 18 -11 -1 normal + -1 sprites/canals.png 8bpp 366 40 12 11 21 10 normal + -1 sprites/canals.png 8bpp 398 40 19 10 -8 21 normal + -1 sprites/canals.png 8bpp 430 40 11 10 -31 10 normal + -1 sprites/canals.png 8bpp 446 40 24 16 -11 -6 normal + -1 * 7 02 05 10 01 00 00 00 + +// Canal edges (arctic normal) + -1 * 4 01 05 01 \b12 + -1 sprites/canals.png 8bpp 30 70 45 22 -11 -1 normal + -1 sprites/canals.png 8bpp 94 70 41 21 -8 10 normal + -1 sprites/canals.png 8bpp 142 70 42 21 -31 10 normal + -1 sprites/canals.png 8bpp 190 70 43 22 -31 -1 normal + -1 sprites/canals.png 8bpp 238 70 22 22 11 4 normal + -1 sprites/canals.png 8bpp 270 70 24 16 -11 15 normal + -1 sprites/canals.png 8bpp 302 70 23 23 -31 4 normal + -1 sprites/canals.png 8bpp 334 70 24 18 -11 -1 normal + -1 sprites/canals.png 8bpp 366 70 12 11 21 10 normal + -1 sprites/canals.png 8bpp 398 70 19 10 -8 21 normal + -1 sprites/canals.png 8bpp 430 70 11 10 -31 10 normal + -1 sprites/canals.png 8bpp 446 70 24 16 -11 -6 normal + -1 * 7 02 05 11 01 00 00 00 +// Choose the right arctic canal edges + -1 * 14 02 05 12 81 81 00 FF 01 10 00 04 04 11 00 + -1 * 6 07 83 01 \7! 01 01 + -1 * 7 03 05 01 02 00 12 00 + +// Canal edges (tropic desert) + -1 * 4 01 05 01 \b12 + -1 sprites/canals.png 8bpp 30 100 45 22 -11 -1 normal + -1 sprites/canals.png 8bpp 94 100 41 21 -8 10 normal + -1 sprites/canals.png 8bpp 142 100 42 21 -31 10 normal + -1 sprites/canals.png 8bpp 190 100 43 22 -31 -1 normal + -1 sprites/canals.png 8bpp 238 100 22 22 11 4 normal + -1 sprites/canals.png 8bpp 270 100 24 16 -11 15 normal + -1 sprites/canals.png 8bpp 302 100 23 23 -31 4 normal + -1 sprites/canals.png 8bpp 334 100 24 18 -11 -1 normal + -1 sprites/canals.png 8bpp 366 100 12 11 21 10 normal + -1 sprites/canals.png 8bpp 398 100 19 10 -8 21 normal + -1 sprites/canals.png 8bpp 430 100 11 10 -31 10 normal + -1 sprites/canals.png 8bpp 446 100 24 16 -11 -6 normal + -1 * 7 02 05 13 01 00 00 00 + +// Canal edges (tropic rainforest) + -1 * 4 01 05 01 \b12 + -1 sprites/canals.png 8bpp 30 130 45 22 -11 -1 normal + -1 sprites/canals.png 8bpp 94 130 41 21 -8 10 normal + -1 sprites/canals.png 8bpp 142 130 42 21 -31 10 normal + -1 sprites/canals.png 8bpp 190 130 43 22 -31 -1 normal + -1 sprites/canals.png 8bpp 238 130 22 22 11 4 normal + -1 sprites/canals.png 8bpp 270 130 24 16 -11 15 normal + -1 sprites/canals.png 8bpp 302 130 23 23 -31 4 normal + -1 sprites/canals.png 8bpp 334 130 24 18 -11 -1 normal + -1 sprites/canals.png 8bpp 366 130 12 11 21 10 normal + -1 sprites/canals.png 8bpp 398 130 19 10 -8 21 normal + -1 sprites/canals.png 8bpp 430 130 11 10 -31 10 normal + -1 sprites/canals.png 8bpp 446 130 24 16 -11 -6 normal + -1 * 7 02 05 14 01 00 00 00 +// Choose the right tropic canal edges + -1 * 14 02 05 15 81 81 00 FF 01 13 00 01 01 14 00 + -1 * 6 07 83 01 \7! 02 01 + -1 * 7 03 05 01 02 00 15 00 + +// Canal edges (toyland) + -1 * 4 01 05 01 \b12 + -1 sprites/canals.png 8bpp 30 160 45 22 -11 -1 normal + -1 sprites/canals.png 8bpp 94 160 41 21 -8 10 normal + -1 sprites/canals.png 8bpp 142 160 42 21 -31 10 normal + -1 sprites/canals.png 8bpp 190 160 43 22 -31 -1 normal + -1 sprites/canals.png 8bpp 238 160 22 22 11 4 normal + -1 sprites/canals.png 8bpp 270 160 24 16 -11 15 normal + -1 sprites/canals.png 8bpp 302 160 23 23 -31 4 normal + -1 sprites/canals.png 8bpp 334 160 24 18 -11 -1 normal + -1 sprites/canals.png 8bpp 366 160 12 11 21 10 normal + -1 sprites/canals.png 8bpp 398 160 19 10 -8 21 normal + -1 sprites/canals.png 8bpp 430 160 11 10 -31 10 normal + -1 sprites/canals.png 8bpp 446 160 24 16 -11 -6 normal + -1 * 7 02 05 16 01 00 00 00 + -1 * 6 07 83 01 \7! 03 01 + -1 * 7 03 05 01 02 00 16 00 diff --git a/media/extra_grf/chars.nfo b/media/extra_grf/chars.nfo index 26db641b35..32462f8c1c 100644 --- a/media/extra_grf/chars.nfo +++ b/media/extra_grf/chars.nfo @@ -8,245 +8,7 @@ // -1 * 0 0C "Font characters by PaulC, Bilbo and Jasper Vries" -// Replace original characters - - -1 * 5 0A 01 02 41 00 - -1 sprites/chars.png 8bpp 10 10 6 12 0 -1 normal - -1 sprites/chars.png 8bpp 20 10 4 12 0 -1 normal - -1 * 5 0A 01 02 86 00 - -1 sprites/chars.png 8bpp 50 10 8 12 0 -1 normal - -1 sprites/chars.png 8bpp 70 10 9 12 0 -1 normal - -1 * 5 0A 01 01 8A 00 - -1 sprites/chars.png 8bpp 120 10 6 12 0 -1 normal - -1 * 5 0A 01 01 A0 00 - -1 sprites/chars.png 8bpp 230 10 10 12 0 -1 normal - -1 * 5 0A 01 04 A2 00 - -1 sprites/chars.png 8bpp 260 10 8 12 0 -1 normal - -1 sprites/chars.png 8bpp 290 10 8 12 0 -1 normal - -1 sprites/chars.png 8bpp 320 10 8 12 0 -1 normal - -1 sprites/chars.png 8bpp 350 10 8 12 0 -1 normal - -1 * 5 0A 01 06 A7 00 - -1 sprites/chars.png 8bpp 410 10 8 12 0 -1 normal - -1 sprites/chars.png 8bpp 440 10 12 12 0 -1 normal - -1 sprites/chars.png 8bpp 470 10 8 12 0 -1 normal - -1 sprites/chars.png 8bpp 480 10 7 12 0 -1 normal - -1 sprites/chars.png 8bpp 500 10 7 12 0 -1 normal - -1 sprites/chars.png 8bpp 520 10 7 12 0 -1 normal - -1 * 5 0A 01 03 AE 00 - -1 sprites/chars.png 8bpp 560 10 4 12 0 -1 normal - -1 sprites/chars.png 8bpp 570 10 4 12 0 -1 normal - -1 sprites/chars.png 8bpp 580 10 5 12 0 -1 normal - -1 * 5 0A 01 05 B3 00 - -1 sprites/chars.png 8bpp 620 10 8 12 0 -1 normal - -1 sprites/chars.png 8bpp 640 10 9 12 0 -1 normal - -1 sprites/chars.png 8bpp 660 10 9 12 0 -1 normal - -1 sprites/chars.png 8bpp 680 10 9 12 0 -1 normal - -1 sprites/chars.png 8bpp 700 10 9 12 0 -1 normal - -1 * 5 0A 01 03 BB 00 - -1 sprites/chars.png 8bpp 770 10 8 12 0 -1 normal - -1 sprites/chars.png 8bpp 10 70 8 12 0 -1 normal - -1 sprites/chars.png 8bpp 30 70 8 12 0 -1 normal - -1 * 5 0A 01 01 BF 00 - -1 sprites/chars.png 8bpp 70 70 9 12 0 -1 normal - -1 * 5 0A 01 05 C1 00 - -1 sprites/chars.png 8bpp 450 70 8 12 0 -1 normal - -1 sprites/chars.png 8bpp 110 70 6 12 0 -1 normal - -1 sprites/chars.png 8bpp 120 70 6 12 0 -1 normal - -1 sprites/chars.png 8bpp 130 70 6 12 0 -1 normal - -1 sprites/chars.png 8bpp 140 70 6 12 0 -1 normal - -1 * 5 0A 01 01 C7 00 - -1 sprites/chars.png 8bpp 160 70 6 12 0 -1 normal - -1 * 5 0A 01 03 CA 00 - -1 sprites/chars.png 8bpp 200 70 6 12 0 -1 normal - -1 sprites/chars.png 8bpp 210 70 6 12 0 -1 normal - -1 sprites/chars.png 8bpp 220 70 6 12 0 -1 normal - -1 * 5 0A 01 04 CE 00 - -1 sprites/chars.png 8bpp 230 70 4 12 0 -1 normal - -1 sprites/chars.png 8bpp 240 70 4 12 0 -1 normal - -1 sprites/chars.png 8bpp 250 70 5 12 0 -1 normal - -1 sprites/chars.png 8bpp 260 70 5 12 0 -1 normal - -1 * 5 0A 01 05 D3 00 - -1 sprites/chars.png 8bpp 290 70 6 12 0 -1 normal - -1 sprites/chars.png 8bpp 310 70 6 12 0 -1 normal - -1 sprites/chars.png 8bpp 320 70 6 12 0 -1 normal - -1 sprites/chars.png 8bpp 330 70 6 12 0 -1 normal - -1 sprites/chars.png 8bpp 340 70 6 12 0 -1 normal - -1 * 5 0A 01 03 DB 00 - -1 sprites/chars.png 8bpp 390 70 6 12 0 -1 normal - -1 sprites/chars.png 8bpp 400 70 6 12 0 -1 normal - -1 sprites/chars.png 8bpp 410 70 6 12 0 -1 normal - -1 * 5 0A 01 02 DF 00 - -1 sprites/chars.png 8bpp 420 70 7 12 0 -1 normal - -1 sprites/chars.png 8bpp 430 70 6 12 0 -1 normal - -1 * 5 0A 01 01 22 01 - -1 sprites/chars.png 8bpp 20 30 2 7 0 0 normal - -1 * 5 0A 01 01 7D 01 - -1 sprites/chars.png 8bpp 220 30 4 7 0 0 normal - -1 * 5 0A 01 02 80 01 - -1 sprites/chars.png 8bpp 230 30 9 7 0 0 normal - -1 sprites/chars.png 8bpp 250 30 3 7 0 0 normal - -1 * 5 0A 01 01 89 01 - -1 sprites/chars.png 8bpp 470 30 3 7 0 0 normal - -1 * 5 0A 01 01 9F 01 - -1 sprites/chars.png 8bpp 70 90 3 7 0 0 normal - -1 * 5 0A 01 01 A9 01 - -1 sprites/chars.png 8bpp 190 90 3 7 0 0 normal - -1 * 5 0A 01 02 BF 01 - -1 sprites/chars.png 8bpp 420 90 3 7 0 0 normal - -1 sprites/chars.png 8bpp 430 90 3 7 0 0 normal - -1 * 5 0A 01 01 02 02 - -1 sprites/chars.png 8bpp 20 40 4 21 0 -2 normal - -1 * 5 0A 01 01 41 02 - -1 sprites/chars.png 8bpp 30 40 14 21 0 -2 normal - -1 * 5 0A 01 06 46 02 - -1 sprites/chars.png 8bpp 50 40 10 21 0 -2 normal - -1 sprites/chars.png 8bpp 70 40 14 21 0 -2 normal - -1 sprites/chars.png 8bpp 90 40 3 21 0 -2 normal - -1 sprites/chars.png 8bpp 100 40 13 21 0 -2 normal - -1 sprites/chars.png 8bpp 120 40 7 21 0 -2 normal - -1 sprites/chars.png 8bpp 130 40 16 21 0 -2 normal - -1 * 5 0A 01 01 50 02 - -1 sprites/chars.png 8bpp 150 40 16 21 0 -2 normal - -1 * 5 0A 01 04 52 02 - -1 sprites/chars.png 8bpp 170 40 8 21 0 -2 normal - -1 sprites/chars.png 8bpp 180 40 9 21 0 -2 normal - -1 sprites/chars.png 8bpp 190 40 6 21 0 -2 normal - -1 sprites/chars.png 8bpp 200 40 6 21 0 -2 normal - -1 * 5 0A 01 01 5C 02 - -1 sprites/chars.png 8bpp 210 40 7 21 0 -2 normal - -1 * 5 0A 01 01 60 02 - -1 sprites/chars.png 8bpp 230 40 16 21 0 -2 normal - -1 * 5 0A 01 07 62 02 - -1 sprites/chars.png 8bpp 260 40 20 21 0 -2 normal - -1 sprites/chars.png 8bpp 290 40 20 21 0 -2 normal - -1 sprites/chars.png 8bpp 320 40 20 21 0 -2 normal - -1 sprites/chars.png 8bpp 350 40 20 21 0 -2 normal - -1 sprites/chars.png 8bpp 380 40 20 21 0 -2 normal - -1 sprites/chars.png 8bpp 410 40 20 21 0 -2 normal - -1 sprites/chars.png 8bpp 440 40 24 21 0 -2 normal - -1 * 5 0A 01 18 6A 02 - -1 sprites/chars.png 8bpp 480 40 14 21 0 -2 normal - -1 sprites/chars.png 8bpp 500 40 14 21 0 -2 normal - -1 sprites/chars.png 8bpp 520 40 14 21 0 -2 normal - -1 sprites/chars.png 8bpp 540 40 14 21 0 -2 normal - -1 sprites/chars.png 8bpp 560 40 9 21 0 -2 normal - -1 sprites/chars.png 8bpp 570 40 9 21 0 -2 normal - -1 sprites/chars.png 8bpp 580 40 9 21 0 -2 normal - -1 sprites/chars.png 8bpp 590 40 9 21 0 -2 normal - -1 sprites/chars.png 8bpp 600 40 17 21 0 -2 normal - -1 sprites/chars.png 8bpp 620 40 18 21 0 -2 normal - -1 sprites/chars.png 8bpp 640 40 15 21 0 -2 normal - -1 sprites/chars.png 8bpp 660 40 15 21 0 -2 normal - -1 sprites/chars.png 8bpp 680 40 15 21 0 -2 normal - -1 sprites/chars.png 8bpp 700 40 15 21 0 -2 normal - -1 sprites/chars.png 8bpp 720 40 15 21 0 -2 normal - -1 sprites/chars.png 8bpp 740 40 9 21 0 -2 normal - -1 sprites/chars.png 8bpp 750 40 16 21 0 -2 normal - -1 sprites/chars.png 8bpp 770 40 17 21 0 -2 normal - -1 sprites/chars.png 8bpp 10 100 17 21 0 -2 normal - -1 sprites/chars.png 8bpp 30 100 17 21 0 -2 normal - -1 sprites/chars.png 8bpp 50 100 17 21 0 -2 normal - -1 sprites/chars.png 8bpp 70 100 14 21 0 -2 normal - -1 sprites/chars.png 8bpp 90 100 14 21 0 -2 normal - -1 sprites/chars.png 8bpp 450 100 14 21 0 -2 normal - -1 * 5 0A 01 01 85 02 - -1 sprites/chars.png 8bpp 140 100 12 21 0 -2 normal - -1 * 5 0A 01 01 88 02 - -1 sprites/chars.png 8bpp 170 100 19 21 0 -2 normal - -1 * 5 0A 01 02 92 02 - -1 sprites/chars.png 8bpp 270 100 11 21 0 -2 normal - -1 sprites/chars.png 8bpp 290 100 15 21 0 -2 normal - -1 * 5 0A 01 01 97 02 - -1 sprites/chars.png 8bpp 340 100 11 21 0 -2 normal - -1 * 5 0A 01 02 99 02 - -1 sprites/chars.png 8bpp 360 100 9 21 0 -2 normal - -1 sprites/chars.png 8bpp 370 100 11 21 0 -2 normal - -1 * 5 0A 01 01 A0 02 - -1 sprites/chars.png 8bpp 430 100 14 21 0 -2 normal - -// New characters, all fonts except monospaced - -// U+007B: Left Curly Bracket -// U+007C: Vertical Line -// U+007D: Right Curly Bracket -// U+007E: Tilde - -1 * 14 12 03 00 04 7B 00 01 04 7B 00 02 04 7B 00 - -1 sprites/chars.png 8bpp 10 130 5 12 0 -1 normal - -1 sprites/chars.png 8bpp 20 130 3 12 0 -1 normal - -1 sprites/chars.png 8bpp 30 130 5 12 0 -1 normal - -1 sprites/chars.png 8bpp 50 130 7 12 0 -1 normal - -1 sprites/chars.png 8bpp 10 150 3 7 0 0 normal - -1 sprites/chars.png 8bpp 20 150 1 7 0 0 normal - -1 sprites/chars.png 8bpp 30 150 3 7 0 0 normal - -1 sprites/chars.png 8bpp 50 150 4 7 0 0 normal - -1 sprites/chars.png 8bpp 10 160 9 21 0 -2 normal - -1 sprites/chars.png 8bpp 20 160 3 21 0 -2 normal - -1 sprites/chars.png 8bpp 30 160 9 21 0 -2 normal - -1 sprites/chars.png 8bpp 50 160 10 21 0 -2 normal - -// U+007F: No-Break Space - -1 * 14 12 03 00 01 7F 00 01 01 7F 00 02 01 7F 00 - -1 sprites/chars.png 8bpp 70 130 2 12 0 -1 normal - -1 sprites/chars.png 8bpp 70 150 1 7 0 0 normal - -1 sprites/chars.png 8bpp 70 160 5 21 0 -2 normal - -// U+00AA: Feminine Ordinal Indicator - -1 * 14 12 03 00 01 AA 00 01 01 AA 00 02 01 AA 00 - -1 sprites/chars.png 8bpp 80 130 6 12 0 -1 normal - -1 sprites/chars.png 8bpp 80 150 3 7 0 0 normal - -1 sprites/chars.png 8bpp 80 160 7 21 0 -2 normal - -// U+00AC: Not Sign -// U+00AD: Soft Hyphen - -1 * 14 12 03 00 02 AC 00 01 02 AC 00 02 02 AC 00 - -1 sprites/chars.png 8bpp 90 130 8 12 0 -1 normal - -1 sprites/chars.png 8bpp 110 130 6 12 0 -1 normal - -1 sprites/chars.png 8bpp 90 150 4 7 0 0 normal - -1 sprites/chars.png 8bpp 110 150 3 7 0 0 normal - -1 sprites/chars.png 8bpp 90 160 12 21 0 -2 normal - -1 sprites/chars.png 8bpp 110 160 9 21 0 -2 normal - -// U+00AF: Macron - -1 * 14 12 03 00 01 AF 00 01 01 AF 00 02 01 AF 00 - -1 sprites/chars.png 8bpp 130 130 6 12 0 -1 normal - -1 sprites/chars.png 8bpp 130 150 3 7 0 0 normal - -1 sprites/chars.png 8bpp 130 160 12 21 0 -2 normal - -// U+00B4: Acute Accent -// U+00B5: Micro Sign -// U+00B6: Pilcrow Sign -// U+00B7: Middle Dot -// U+00B8: Cedilla -// U+00B9: Superscript One - -1 * 14 12 03 00 06 B4 00 01 06 B4 00 02 06 B4 00 - -1 sprites/chars.png 8bpp 150 130 4 12 0 -1 normal - -1 sprites/chars.png 8bpp 160 130 6 12 0 -1 normal - -1 sprites/chars.png 8bpp 180 130 8 12 0 -1 normal - -1 sprites/chars.png 8bpp 200 130 3 12 0 -1 normal - -1 sprites/chars.png 8bpp 210 130 4 12 0 -1 normal - -1 sprites/chars.png 8bpp 220 130 5 12 0 -1 normal - -1 sprites/chars.png 8bpp 150 150 2 7 0 0 normal - -1 sprites/chars.png 8bpp 160 150 3 7 0 0 normal - -1 sprites/chars.png 8bpp 180 150 6 7 0 0 normal - -1 sprites/chars.png 8bpp 200 150 1 7 0 0 normal - -1 sprites/chars.png 8bpp 210 150 2 7 0 0 normal - -1 sprites/chars.png 8bpp 220 150 2 7 0 0 normal - -1 sprites/chars.png 8bpp 150 160 4 21 0 -2 normal - -1 sprites/chars.png 8bpp 160 160 15 21 0 -2 normal - -1 sprites/chars.png 8bpp 180 160 13 21 0 -2 normal - -1 sprites/chars.png 8bpp 200 160 3 21 0 -2 normal - -1 sprites/chars.png 8bpp 210 160 5 21 0 -2 normal - -1 sprites/chars.png 8bpp 220 160 6 21 0 -2 normal - -// U+00BC: Vulgar Fraction One Quarter -// U+00BD: Vulgar Fraction One Half - -1 * 14 12 03 00 02 BC 00 01 02 BC 00 02 02 BC 00 - -1 sprites/chars.png 8bpp 230 130 10 12 0 -1 normal - -1 sprites/chars.png 8bpp 250 130 10 12 0 -1 normal - -1 sprites/chars.png 8bpp 230 150 9 7 0 0 normal - -1 sprites/chars.png 8bpp 250 150 9 7 0 0 normal - -1 sprites/chars.png 8bpp 230 160 16 21 0 -2 normal - -1 sprites/chars.png 8bpp 250 160 16 21 0 -2 normal +// Note: Characters in range U+0020..U+00FF may only be defined in chars_orig_extra.nfo. // New characters, all fonts diff --git a/media/extra_grf/chars_orig_extra.nfo b/media/extra_grf/chars_orig_extra.nfo new file mode 100644 index 0000000000..7979e79450 --- /dev/null +++ b/media/extra_grf/chars_orig_extra.nfo @@ -0,0 +1,249 @@ +// +// $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 . +// + -1 * 0 0C "Font characters by PaulC, Bilbo and Jasper Vries" + +// Replace original characters + + -1 * 5 0A 01 02 41 00 + -1 sprites/chars.png 8bpp 10 10 6 12 0 -1 normal + -1 sprites/chars.png 8bpp 20 10 4 12 0 -1 normal + -1 * 5 0A 01 02 86 00 + -1 sprites/chars.png 8bpp 50 10 8 12 0 -1 normal + -1 sprites/chars.png 8bpp 70 10 9 12 0 -1 normal + -1 * 5 0A 01 01 8A 00 + -1 sprites/chars.png 8bpp 120 10 6 12 0 -1 normal + -1 * 5 0A 01 01 A0 00 + -1 sprites/chars.png 8bpp 230 10 10 12 0 -1 normal + -1 * 5 0A 01 04 A2 00 + -1 sprites/chars.png 8bpp 260 10 8 12 0 -1 normal + -1 sprites/chars.png 8bpp 290 10 8 12 0 -1 normal + -1 sprites/chars.png 8bpp 320 10 8 12 0 -1 normal + -1 sprites/chars.png 8bpp 350 10 8 12 0 -1 normal + -1 * 5 0A 01 06 A7 00 + -1 sprites/chars.png 8bpp 410 10 8 12 0 -1 normal + -1 sprites/chars.png 8bpp 440 10 12 12 0 -1 normal + -1 sprites/chars.png 8bpp 470 10 8 12 0 -1 normal + -1 sprites/chars.png 8bpp 480 10 7 12 0 -1 normal + -1 sprites/chars.png 8bpp 500 10 7 12 0 -1 normal + -1 sprites/chars.png 8bpp 520 10 7 12 0 -1 normal + -1 * 5 0A 01 03 AE 00 + -1 sprites/chars.png 8bpp 560 10 4 12 0 -1 normal + -1 sprites/chars.png 8bpp 570 10 4 12 0 -1 normal + -1 sprites/chars.png 8bpp 580 10 5 12 0 -1 normal + -1 * 5 0A 01 05 B3 00 + -1 sprites/chars.png 8bpp 620 10 8 12 0 -1 normal + -1 sprites/chars.png 8bpp 640 10 9 12 0 -1 normal + -1 sprites/chars.png 8bpp 660 10 9 12 0 -1 normal + -1 sprites/chars.png 8bpp 680 10 9 12 0 -1 normal + -1 sprites/chars.png 8bpp 700 10 9 12 0 -1 normal + -1 * 5 0A 01 03 BB 00 + -1 sprites/chars.png 8bpp 770 10 8 12 0 -1 normal + -1 sprites/chars.png 8bpp 10 70 8 12 0 -1 normal + -1 sprites/chars.png 8bpp 30 70 8 12 0 -1 normal + -1 * 5 0A 01 01 BF 00 + -1 sprites/chars.png 8bpp 70 70 9 12 0 -1 normal + -1 * 5 0A 01 05 C1 00 + -1 sprites/chars.png 8bpp 450 70 8 12 0 -1 normal + -1 sprites/chars.png 8bpp 110 70 6 12 0 -1 normal + -1 sprites/chars.png 8bpp 120 70 6 12 0 -1 normal + -1 sprites/chars.png 8bpp 130 70 6 12 0 -1 normal + -1 sprites/chars.png 8bpp 140 70 6 12 0 -1 normal + -1 * 5 0A 01 01 C7 00 + -1 sprites/chars.png 8bpp 160 70 6 12 0 -1 normal + -1 * 5 0A 01 03 CA 00 + -1 sprites/chars.png 8bpp 200 70 6 12 0 -1 normal + -1 sprites/chars.png 8bpp 210 70 6 12 0 -1 normal + -1 sprites/chars.png 8bpp 220 70 6 12 0 -1 normal + -1 * 5 0A 01 04 CE 00 + -1 sprites/chars.png 8bpp 230 70 4 12 0 -1 normal + -1 sprites/chars.png 8bpp 240 70 4 12 0 -1 normal + -1 sprites/chars.png 8bpp 250 70 5 12 0 -1 normal + -1 sprites/chars.png 8bpp 260 70 5 12 0 -1 normal + -1 * 5 0A 01 05 D3 00 + -1 sprites/chars.png 8bpp 290 70 6 12 0 -1 normal + -1 sprites/chars.png 8bpp 310 70 6 12 0 -1 normal + -1 sprites/chars.png 8bpp 320 70 6 12 0 -1 normal + -1 sprites/chars.png 8bpp 330 70 6 12 0 -1 normal + -1 sprites/chars.png 8bpp 340 70 6 12 0 -1 normal + -1 * 5 0A 01 03 DB 00 + -1 sprites/chars.png 8bpp 390 70 6 12 0 -1 normal + -1 sprites/chars.png 8bpp 400 70 6 12 0 -1 normal + -1 sprites/chars.png 8bpp 410 70 6 12 0 -1 normal + -1 * 5 0A 01 02 DF 00 + -1 sprites/chars.png 8bpp 420 70 7 12 0 -1 normal + -1 sprites/chars.png 8bpp 430 70 6 12 0 -1 normal + -1 * 5 0A 01 01 22 01 + -1 sprites/chars.png 8bpp 20 30 2 7 0 0 normal + -1 * 5 0A 01 01 7D 01 + -1 sprites/chars.png 8bpp 220 30 4 7 0 0 normal + -1 * 5 0A 01 02 80 01 + -1 sprites/chars.png 8bpp 230 30 9 7 0 0 normal + -1 sprites/chars.png 8bpp 250 30 3 7 0 0 normal + -1 * 5 0A 01 01 89 01 + -1 sprites/chars.png 8bpp 470 30 3 7 0 0 normal + -1 * 5 0A 01 01 9F 01 + -1 sprites/chars.png 8bpp 70 90 3 7 0 0 normal + -1 * 5 0A 01 01 A9 01 + -1 sprites/chars.png 8bpp 190 90 3 7 0 0 normal + -1 * 5 0A 01 02 BF 01 + -1 sprites/chars.png 8bpp 420 90 3 7 0 0 normal + -1 sprites/chars.png 8bpp 430 90 3 7 0 0 normal + -1 * 5 0A 01 01 02 02 + -1 sprites/chars.png 8bpp 20 40 4 21 0 -2 normal + -1 * 5 0A 01 01 41 02 + -1 sprites/chars.png 8bpp 30 40 14 21 0 -2 normal + -1 * 5 0A 01 06 46 02 + -1 sprites/chars.png 8bpp 50 40 10 21 0 -2 normal + -1 sprites/chars.png 8bpp 70 40 14 21 0 -2 normal + -1 sprites/chars.png 8bpp 90 40 3 21 0 -2 normal + -1 sprites/chars.png 8bpp 100 40 13 21 0 -2 normal + -1 sprites/chars.png 8bpp 120 40 7 21 0 -2 normal + -1 sprites/chars.png 8bpp 130 40 16 21 0 -2 normal + -1 * 5 0A 01 01 50 02 + -1 sprites/chars.png 8bpp 150 40 16 21 0 -2 normal + -1 * 5 0A 01 04 52 02 + -1 sprites/chars.png 8bpp 170 40 8 21 0 -2 normal + -1 sprites/chars.png 8bpp 180 40 9 21 0 -2 normal + -1 sprites/chars.png 8bpp 190 40 6 21 0 -2 normal + -1 sprites/chars.png 8bpp 200 40 6 21 0 -2 normal + -1 * 5 0A 01 01 5C 02 + -1 sprites/chars.png 8bpp 210 40 7 21 0 -2 normal + -1 * 5 0A 01 01 60 02 + -1 sprites/chars.png 8bpp 230 40 16 21 0 -2 normal + -1 * 5 0A 01 07 62 02 + -1 sprites/chars.png 8bpp 260 40 20 21 0 -2 normal + -1 sprites/chars.png 8bpp 290 40 20 21 0 -2 normal + -1 sprites/chars.png 8bpp 320 40 20 21 0 -2 normal + -1 sprites/chars.png 8bpp 350 40 20 21 0 -2 normal + -1 sprites/chars.png 8bpp 380 40 20 21 0 -2 normal + -1 sprites/chars.png 8bpp 410 40 20 21 0 -2 normal + -1 sprites/chars.png 8bpp 440 40 24 21 0 -2 normal + -1 * 5 0A 01 18 6A 02 + -1 sprites/chars.png 8bpp 480 40 14 21 0 -2 normal + -1 sprites/chars.png 8bpp 500 40 14 21 0 -2 normal + -1 sprites/chars.png 8bpp 520 40 14 21 0 -2 normal + -1 sprites/chars.png 8bpp 540 40 14 21 0 -2 normal + -1 sprites/chars.png 8bpp 560 40 9 21 0 -2 normal + -1 sprites/chars.png 8bpp 570 40 9 21 0 -2 normal + -1 sprites/chars.png 8bpp 580 40 9 21 0 -2 normal + -1 sprites/chars.png 8bpp 590 40 9 21 0 -2 normal + -1 sprites/chars.png 8bpp 600 40 17 21 0 -2 normal + -1 sprites/chars.png 8bpp 620 40 18 21 0 -2 normal + -1 sprites/chars.png 8bpp 640 40 15 21 0 -2 normal + -1 sprites/chars.png 8bpp 660 40 15 21 0 -2 normal + -1 sprites/chars.png 8bpp 680 40 15 21 0 -2 normal + -1 sprites/chars.png 8bpp 700 40 15 21 0 -2 normal + -1 sprites/chars.png 8bpp 720 40 15 21 0 -2 normal + -1 sprites/chars.png 8bpp 740 40 9 21 0 -2 normal + -1 sprites/chars.png 8bpp 750 40 16 21 0 -2 normal + -1 sprites/chars.png 8bpp 770 40 17 21 0 -2 normal + -1 sprites/chars.png 8bpp 10 100 17 21 0 -2 normal + -1 sprites/chars.png 8bpp 30 100 17 21 0 -2 normal + -1 sprites/chars.png 8bpp 50 100 17 21 0 -2 normal + -1 sprites/chars.png 8bpp 70 100 14 21 0 -2 normal + -1 sprites/chars.png 8bpp 90 100 14 21 0 -2 normal + -1 sprites/chars.png 8bpp 450 100 14 21 0 -2 normal + -1 * 5 0A 01 01 85 02 + -1 sprites/chars.png 8bpp 140 100 12 21 0 -2 normal + -1 * 5 0A 01 01 88 02 + -1 sprites/chars.png 8bpp 170 100 19 21 0 -2 normal + -1 * 5 0A 01 02 92 02 + -1 sprites/chars.png 8bpp 270 100 11 21 0 -2 normal + -1 sprites/chars.png 8bpp 290 100 15 21 0 -2 normal + -1 * 5 0A 01 01 97 02 + -1 sprites/chars.png 8bpp 340 100 11 21 0 -2 normal + -1 * 5 0A 01 02 99 02 + -1 sprites/chars.png 8bpp 360 100 9 21 0 -2 normal + -1 sprites/chars.png 8bpp 370 100 11 21 0 -2 normal + -1 * 5 0A 01 01 A0 02 + -1 sprites/chars.png 8bpp 430 100 14 21 0 -2 normal + +// New characters, all fonts except monospaced + +// U+007B: Left Curly Bracket +// U+007C: Vertical Line +// U+007D: Right Curly Bracket +// U+007E: Tilde + -1 * 14 12 03 00 04 7B 00 01 04 7B 00 02 04 7B 00 + -1 sprites/chars.png 8bpp 10 130 5 12 0 -1 normal + -1 sprites/chars.png 8bpp 20 130 3 12 0 -1 normal + -1 sprites/chars.png 8bpp 30 130 5 12 0 -1 normal + -1 sprites/chars.png 8bpp 50 130 7 12 0 -1 normal + -1 sprites/chars.png 8bpp 10 150 3 7 0 0 normal + -1 sprites/chars.png 8bpp 20 150 1 7 0 0 normal + -1 sprites/chars.png 8bpp 30 150 3 7 0 0 normal + -1 sprites/chars.png 8bpp 50 150 4 7 0 0 normal + -1 sprites/chars.png 8bpp 10 160 9 21 0 -2 normal + -1 sprites/chars.png 8bpp 20 160 3 21 0 -2 normal + -1 sprites/chars.png 8bpp 30 160 9 21 0 -2 normal + -1 sprites/chars.png 8bpp 50 160 10 21 0 -2 normal + +// U+007F: No-Break Space + -1 * 14 12 03 00 01 7F 00 01 01 7F 00 02 01 7F 00 + -1 sprites/chars.png 8bpp 70 130 2 12 0 -1 normal + -1 sprites/chars.png 8bpp 70 150 1 7 0 0 normal + -1 sprites/chars.png 8bpp 70 160 5 21 0 -2 normal + +// U+00AA: Feminine Ordinal Indicator + -1 * 14 12 03 00 01 AA 00 01 01 AA 00 02 01 AA 00 + -1 sprites/chars.png 8bpp 80 130 6 12 0 -1 normal + -1 sprites/chars.png 8bpp 80 150 3 7 0 0 normal + -1 sprites/chars.png 8bpp 80 160 7 21 0 -2 normal + +// U+00AC: Not Sign +// U+00AD: Soft Hyphen + -1 * 14 12 03 00 02 AC 00 01 02 AC 00 02 02 AC 00 + -1 sprites/chars.png 8bpp 90 130 8 12 0 -1 normal + -1 sprites/chars.png 8bpp 110 130 6 12 0 -1 normal + -1 sprites/chars.png 8bpp 90 150 4 7 0 0 normal + -1 sprites/chars.png 8bpp 110 150 3 7 0 0 normal + -1 sprites/chars.png 8bpp 90 160 12 21 0 -2 normal + -1 sprites/chars.png 8bpp 110 160 9 21 0 -2 normal + +// U+00AF: Macron + -1 * 14 12 03 00 01 AF 00 01 01 AF 00 02 01 AF 00 + -1 sprites/chars.png 8bpp 130 130 6 12 0 -1 normal + -1 sprites/chars.png 8bpp 130 150 3 7 0 0 normal + -1 sprites/chars.png 8bpp 130 160 12 21 0 -2 normal + +// U+00B4: Acute Accent +// U+00B5: Micro Sign +// U+00B6: Pilcrow Sign +// U+00B7: Middle Dot +// U+00B8: Cedilla +// U+00B9: Superscript One + -1 * 14 12 03 00 06 B4 00 01 06 B4 00 02 06 B4 00 + -1 sprites/chars.png 8bpp 150 130 4 12 0 -1 normal + -1 sprites/chars.png 8bpp 160 130 6 12 0 -1 normal + -1 sprites/chars.png 8bpp 180 130 8 12 0 -1 normal + -1 sprites/chars.png 8bpp 200 130 3 12 0 -1 normal + -1 sprites/chars.png 8bpp 210 130 4 12 0 -1 normal + -1 sprites/chars.png 8bpp 220 130 5 12 0 -1 normal + -1 sprites/chars.png 8bpp 150 150 2 7 0 0 normal + -1 sprites/chars.png 8bpp 160 150 3 7 0 0 normal + -1 sprites/chars.png 8bpp 180 150 6 7 0 0 normal + -1 sprites/chars.png 8bpp 200 150 1 7 0 0 normal + -1 sprites/chars.png 8bpp 210 150 2 7 0 0 normal + -1 sprites/chars.png 8bpp 220 150 2 7 0 0 normal + -1 sprites/chars.png 8bpp 150 160 4 21 0 -2 normal + -1 sprites/chars.png 8bpp 160 160 15 21 0 -2 normal + -1 sprites/chars.png 8bpp 180 160 13 21 0 -2 normal + -1 sprites/chars.png 8bpp 200 160 3 21 0 -2 normal + -1 sprites/chars.png 8bpp 210 160 5 21 0 -2 normal + -1 sprites/chars.png 8bpp 220 160 6 21 0 -2 normal + +// U+00BC: Vulgar Fraction One Quarter +// U+00BD: Vulgar Fraction One Half + -1 * 14 12 03 00 02 BC 00 01 02 BC 00 02 02 BC 00 + -1 sprites/chars.png 8bpp 230 130 10 12 0 -1 normal + -1 sprites/chars.png 8bpp 250 130 10 12 0 -1 normal + -1 sprites/chars.png 8bpp 230 150 9 7 0 0 normal + -1 sprites/chars.png 8bpp 250 150 9 7 0 0 normal + -1 sprites/chars.png 8bpp 230 160 16 21 0 -2 normal + -1 sprites/chars.png 8bpp 250 160 16 21 0 -2 normal diff --git a/media/extra_grf/openttd.nfo b/media/extra_grf/openttd.nfo index 66149a37e5..7ece5c7149 100644 --- a/media/extra_grf/openttd.nfo +++ b/media/extra_grf/openttd.nfo @@ -60,10 +60,11 @@ 00 // GRF ID, must start with FF so it gets ignored - -1 * 0 08 08 FF "OTT" +//@@WARNING DISABLE 101 + -1 * 0 08 08 FF FF FF FE // Name of the GRF - "OpenTTD's base graphics " 00 + "OpenTTD's default and fallback extra graphics" 00 // Description of the GRF. "License: GNU General Public License version 2" 0D @@ -86,7 +87,6 @@ #include "canals.nfo" #include "oneway.nfo" #include "tramtracks.nfo" -#include "shore.nfo" #include "sloped_tracks.nfo" #include "airports.nfo" #include "roadstops.nfo" @@ -97,11 +97,5 @@ #include "airport_preview.nfo" #include "chars.nfo" #include "mono.nfo" -#include "fix_graphics.nfo" -#include "rivers/rapids.nfo" -#include "rivers/temperate.nfo" -#include "rivers/arctic.nfo" -#include "rivers/tropic.nfo" -#include "rivers/toyland.nfo" #include "tunnel_portals.nfo" #include "palette.nfo" diff --git a/media/extra_grf/openttdgui.png b/media/extra_grf/openttdgui.png index 28ad2fbafe..900a612a87 100644 Binary files a/media/extra_grf/openttdgui.png and b/media/extra_grf/openttdgui.png differ diff --git a/media/extra_grf/orig_extra.nfo b/media/extra_grf/orig_extra.nfo new file mode 100644 index 0000000000..a1173a58c1 --- /dev/null +++ b/media/extra_grf/orig_extra.nfo @@ -0,0 +1,87 @@ +// Automatically generated by GRFCODEC. Do not modify! +// (Info version 32) +// Format: spritenum imagefile depth xpos ypos xsize ysize xrel yrel zoom flags +// +// $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 . +// +// Sources for extra graphics to complement the original graphics. +// Checks whether the correct version of OpenTTD is used before +// allowing it to be used. +// + +// +// Number of sprites, it is wrong, but GRFcodec automagically gets it right. +// + 0 * 4 00 00 00 00 + + +// +// Check whether we are running OTTD or not. +// + -1 * 0 07 9D 04 \7= 01 00 00 00 01 + -1 * 0 0B 03 7F FF 80 " is not for TTDPatch. Use ttdpatch(w).grf." 00 + + +// +// Check for OTTD's version number +// + +// First step... Variable A1 might not exist. If that's the case it always +// skips. As we do not want to skip out of the whole testing, we skip over +// the real version check. + -1 * 0 07 A1 04 \7= FF FF FF FF 02 + +// Real version check. + -1 * 0 07 A1 04 \7> \w20304 01 01 03 + +// If the version check is supported, the string is translateable via OpenTTD +// itself. Use it!. + + -1 * 0 0B 03 7F 06 "1.1 (or trunk r20304)" 00 + +// Some OTTD versions before r11130 did support Action B, so use the English +// phrase there + -1 * 0 0B 03 7F FF "Requires OpenTTD version 1.1 (or trunk r20304) or better." 00 + +// Final fallback. No Action B support, just skip to the end of the file. + -1 * 0 07 A1 04 \7= FF FF FF FF 00 + +// We are a DOS paletted NewGRF, so tell OpenTTD that. Then it can actually +// do the right thing. Yay for that feature as that means no duplicate NewGRF! + -1 * 0 14 + "C" "INFO" + "B" "PALS" \w1 "D" + 00 + 00 + +// GRF ID, must start with FF so it gets ignored +//@@WARNING DISABLE 101 + -1 * 0 08 08 FF "OTT" + +// Name of the GRF + "Original baseset extra graphics" 00 + +// Description of the GRF. + "License: GNU General Public License version 2" 0D + "Andrew Parkhouse: rivers" 0D + "Addi and PaulC: original graphics fixes" 0D + "OpenTTD developers: other graphics" 00 + +// +// The real data of the GRF is acquired from several subfiles. +// +#include "chars_orig_extra.nfo" +#include "shore.nfo" +#include "fix_graphics.nfo" +#include "airports_orig_extra.nfo" +#include "canals_extra.nfo" +#include "rivers/rapids.nfo" +#include "rivers/temperate.nfo" +#include "rivers/arctic.nfo" +#include "rivers/tropic.nfo" +#include "rivers/toyland.nfo" diff --git a/os/debian/changelog b/os/debian/changelog index 4dd5b1155f..bb57ca39e8 100644 --- a/os/debian/changelog +++ b/os/debian/changelog @@ -1,3 +1,75 @@ +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 + + -- OpenTTD Sun, 24 Dec 2017 14:00:00 +0100 + +openttd (1.7.2~RC1-0) unstable; urgency=low + + * New upstream release 1.7.2-RC1 + + -- OpenTTD Mon, 11 Dec 2017 21:30:00 +0100 + +openttd (1.7.1-0) unstable; urgency=low + + * New upstream release 1.7.1 + + -- OpenTTD Tue, 13 Jun 2017 21:00:00 +0200 + +openttd (1.7.1~RC1-0) unstable; urgency=low + + * New upstream release 1.7.1-RC1 + + -- OpenTTD Thu, 04 Mai 2017 21:00:00 +0200 + +openttd (1.7.0-0) unstable; urgency=low + + * New upstream release 1.7.0 + + -- OpenTTD Sat, 01 Apr 2017 19:00:00 +0200 + +openttd (1.7.0~RC1-0) unstable; urgency=low + + * New upstream release 1.7.0-RC1 + + -- OpenTTD Sat, 11 Mar 2017 22:30:00 +0100 + +openttd (1.6.1-0) unstable; urgency=low + + * New upstream release 1.6.1 + + -- OpenTTD Fri, 01 Jul 2016 00:00:00 +0200 + +openttd (1.6.1~RC1-0) unstable; urgency=low + + * New upstream release 1.6.1-RC1 + + -- OpenTTD Wed, 01 Jun 2016 21:00:00 +0200 + +openttd (1.6.0-0) unstable; urgency=low + + * New upstream release 1.6.0 + + -- OpenTTD Fri, 01 Apr 2016 21:00:00 +0200 + +openttd (1.6.0~RC1-0) unstable; urgency=low + + * New upstream release 1.6.0-RC1 + + -- OpenTTD Tue, 01 Mar 2016 21:00:00 +0100 + openttd (1.5.3-0) unstable; urgency=low * New upstream release 1.5.3 @@ -942,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/os/debian/copyright b/os/debian/copyright index be573b4825..05cbfc4328 100644 --- a/os/debian/copyright +++ b/os/debian/copyright @@ -5,7 +5,7 @@ Source: http://www.openttd.org Files: * -Copyright: © 2004-2012 Ludvig Strigeous and others. +Copyright: © 2004-2018 Ludvig Strigeous and others. License: GPL-2.0 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2.0 as diff --git a/os/os2/installer/make_installer.cmd b/os/os2/installer/make_installer.cmd index 6fe6dace66..a15198b5f1 100644 --- a/os/os2/installer/make_installer.cmd +++ b/os/os2/installer/make_installer.cmd @@ -1,6 +1,6 @@ @echo off -set OPENTTD_VERSION=1.6.0 +set OPENTTD_VERSION=1.9.0 set OPENSFX_VERSION=0.8.0 set NOSOUND_VERSION=0.8.0 set OPENGFX_VERSION=1.2.0 diff --git a/os/rpm/openttd.spec b/os/rpm/openttd.spec index 5ad5a53cab..5fa4d72a1e 100644 --- a/os/rpm/openttd.spec +++ b/os/rpm/openttd.spec @@ -2,7 +2,7 @@ # spec file for package openttd # # Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany. -# Copyright (c) 2007-2012 The OpenTTD developers +# Copyright (c) 2007-2018 The OpenTTD developers # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,9 +17,9 @@ # Name: openttd -Version: 1.6.beta1 +Version: 1.9.beta1 Release: 0 -%define srcver 1.6.0-beta1 +%define srcver 1.9.0-beta1 Summary: An open source reimplementation of Chris Sawyer's Transport Tycoon Deluxe License: GPL-2.0 Group: Amusements/Games/Strategy/Other diff --git a/os/windows/installer/install.nsi b/os/windows/installer/install.nsi index ebe9ed3dcd..2c4c6f94b2 100644 --- a/os/windows/installer/install.nsi +++ b/os/windows/installer/install.nsi @@ -1,6 +1,6 @@ # Version numbers to update !define APPV_MAJOR 1 -!define APPV_MINOR 6 +!define APPV_MINOR 9 !define APPV_MAINT 0 !define APPV_BUILD 0 !define APPV_EXTRA "-beta1" @@ -89,7 +89,7 @@ Page custom SelectCDEnter SelectCDExit ": TTD folder" !define MUI_FINISHPAGE_LINK "Visit the OpenTTD site for more information" !define MUI_FINISHPAGE_LINK_LOCATION "${APPURLLINK}" !define MUI_FINISHPAGE_NOREBOOTSUPPORT -!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\readme.txt" +!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\README.md" !define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED !define MUI_WELCOMEFINISHPAGE_CUSTOMFUNCTION_INIT DisableBack @@ -139,7 +139,7 @@ Section "!OpenTTD" Section1 ; Copy the scripts SetOutPath "$INSTDIR\scripts\" File ${PATH_ROOT}bin\scripts\*.* - Push "$INSTDIR\scripts\readme.txt" + Push "$INSTDIR\scripts\README.md" Call unix2dos ; Copy some documention files @@ -158,8 +158,8 @@ Section "!OpenTTD" Section1 File ${PATH_ROOT}COPYING Push "$INSTDIR\COPYING" Call unix2dos - File ${PATH_ROOT}readme.txt - Push "$INSTDIR\readme.txt" + File ${PATH_ROOT}README.md + Push "$INSTDIR\README.md" Call unix2dos File ${PATH_ROOT}known-bugs.txt Push "$INSTDIR\known-bugs.txt" @@ -213,13 +213,13 @@ Section "!OpenTTD" Section1 CreateDirectory "$SMPROGRAMS\$SHORTCUTS" CreateShortCut "$SMPROGRAMS\$SHORTCUTS\OpenTTD.lnk" "$INSTDIR\openttd.exe" CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Uninstall.lnk" "$INSTDIR\uninstall.exe" - CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Readme.lnk" "$INSTDIR\Readme.txt" + CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Readme.lnk" "$INSTDIR\README.md" CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Changelog.lnk" "$INSTDIR\Changelog.txt" CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Known-bugs.lnk" "$INSTDIR\known-bugs.txt" CreateDirectory "$SMPROGRAMS\$SHORTCUTS\Docs" CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Docs\Multiplayer.lnk" "$INSTDIR\docs\multiplayer.txt" CreateDirectory "$SMPROGRAMS\$SHORTCUTS\Scripts" - CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Scripts\Readme.lnk" "$INSTDIR\scripts\readme.txt" + CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Scripts\Readme.lnk" "$INSTDIR\scripts\README.md" !insertmacro MUI_STARTMENU_WRITE_END SectionEnd @@ -304,6 +304,7 @@ Section /o "Copy data from Transport Tycoon Deluxe CD-ROM" Section2 ; Let's copy the files with size approximation SetOutPath "$INSTDIR\baseset" CopyFiles "$CDDRIVE\gm\*.gm" "$INSTDIR\baseset\" 1028 + CopyFiles "$CDDRIVE\gm.cat" "$INSTDIR\baseset\gm.cat" 415 CopyFiles "$CDDRIVE\sample.cat" "$INSTDIR\baseset\sample.cat" 1566 ; Copy Windows files CopyFiles "$CDDRIVE\trg1r.grf" "$INSTDIR\baseset\trg1r.grf" 2365 @@ -387,7 +388,7 @@ Section "Uninstall" ; Clean up OpenTTD dir Delete "$INSTDIR\changelog.txt" - Delete "$INSTDIR\readme.txt" + Delete "$INSTDIR\README.md" Delete "$INSTDIR\known-bugs.txt" Delete "$INSTDIR\openttd.exe" Delete "$INSTDIR\COPYING" @@ -408,6 +409,7 @@ Section "Uninstall" ; Baseset files Delete "$INSTDIR\baseset\opntitle.dat" Delete "$INSTDIR\baseset\openttd.grf" + Delete "$INSTDIR\baseset\orig_extra.grf" Delete "$INSTDIR\baseset\orig_win.obg" Delete "$INSTDIR\baseset\orig_dos.obg" Delete "$INSTDIR\baseset\orig_dos_de.obg" @@ -425,6 +427,8 @@ Section "Uninstall" Delete "$INSTDIR\baseset\trgt.grf" Delete "$INSTDIR\baseset\trgc.grf" Delete "$INSTDIR\baseset\trgi.grf" + Delete "$INSTDIR\baseset\gm.cat" + Delete "$INSTDIR\baseset\gm-tto.cat" Delete "$INSTDIR\baseset\*.gm" Delete "$INSTDIR\data\sample.cat" @@ -466,8 +470,10 @@ Section "Uninstall" ; Base sets for music Delete "$INSTDIR\gm\orig_win.obm" + Delete "$INSTDIR\gm\orig_dos.obm" Delete "$INSTDIR\gm\no_music.obm" Delete "$INSTDIR\baseset\orig_win.obm" + Delete "$INSTDIR\baseset\orig_dos.obm" Delete "$INSTDIR\baseset\no_music.obm" ; Remove remaining directories diff --git a/os/windows/installer/version_win9x.txt b/os/windows/installer/version_win9x.txt index 077390eacb..21dbf6200a 100644 --- a/os/windows/installer/version_win9x.txt +++ b/os/windows/installer/version_win9x.txt @@ -1,5 +1,5 @@ !define APPBITS 32 ; Define number of bits for the architecture !define EXTRA_VERSION "95, 98, ME, 2000 and XP without SP3" !define APPARCH "win9x" ; Define the application architecture -!define BINARY_DIR "${PATH_ROOT}bin" +!define BINARY_DIR "${PATH_ROOT}objs\release" InstallDir "$PROGRAMFILES32\OpenTTD\" diff --git a/projects/determineversion.vbs b/projects/determineversion.vbs index e738569e3a..b1f7886a4f 100755 --- a/projects/determineversion.vbs +++ b/projects/determineversion.vbs @@ -21,312 +21,132 @@ Sub FindReplaceInFile(filename, to_find, replacement) file.Close End Sub -Sub UpdateFile(modified, revision, version, cur_date, filename) +Sub UpdateFile(modified, isodate, version, cur_date, filename) FSO.CopyFile filename & ".in", filename FindReplaceInFile filename, "!!MODIFIED!!", modified - FindReplaceInFile filename, "!!REVISION!!", revision + FindReplaceInFile filename, "!!ISODATE!!", isodate FindReplaceInFile filename, "!!VERSION!!", version FindReplaceInFile filename, "!!DATE!!", cur_date End Sub Sub UpdateFiles(version) - Dim modified, revision, cur_date + Dim modified, isodate, cur_date cur_date = DatePart("D", Date) & "." & DatePart("M", Date) & "." & DatePart("YYYY", Date) If InStr(version, Chr(9)) Then - revision = Mid(version, InStr(version, Chr(9)) + 1) - modified = Mid(revision, InStr(revision, Chr(9)) + 1) - revision = Mid(revision, 1, InStr(revision, Chr(9)) - 1) + isodate = Mid(version, InStr(version, Chr(9)) + 1) + modified = Mid(isodate, InStr(isodate, Chr(9)) + 1) + isodate = Mid(isodate, 1, InStr(isodate, Chr(9)) - 1) modified = Mid(modified, 1, InStr(modified, Chr(9)) - 1) version = Mid(version, 1, InStr(version, Chr(9)) - 1) Else - revision = 0 + isodate = 0 modified = 1 End If - UpdateFile modified, revision, version, cur_date, "../src/rev.cpp" - UpdateFile modified, revision, version, cur_date, "../src/os/windows/ottdres.rc" + UpdateFile modified, isodate, version, cur_date, "../src/rev.cpp" + UpdateFile modified, isodate, version, cur_date, "../src/os/windows/ottdres.rc" End Sub -Function ReadRegistryKey(shive, subkey, valuename, architecture) - Dim hiveKey, objCtx, objLocator, objServices, objReg, Inparams, Outparams - - ' First, get the Registry Provider for the requested architecture - Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet") - objCtx.Add "__ProviderArchitecture", architecture ' Must be 64 of 32 - Set objLocator = CreateObject("Wbemscripting.SWbemLocator") - Set objServices = objLocator.ConnectServer("","root\default","","",,,,objCtx) - Set objReg = objServices.Get("StdRegProv") - - ' Check the hive and give it the right value - Select Case shive - Case "HKCR", "HKEY_CLASSES_ROOT" - hiveKey = &h80000000 - Case "HKCU", "HKEY_CURRENT_USER" - hiveKey = &H80000001 - Case "HKLM", "HKEY_LOCAL_MACHINE" - hiveKey = &h80000002 - Case "HKU", "HKEY_USERS" - hiveKey = &h80000003 - Case "HKCC", "HKEY_CURRENT_CONFIG" - hiveKey = &h80000005 - Case "HKDD", "HKEY_DYN_DATA" ' Only valid for Windows 95/98 - hiveKey = &h80000006 - Case Else - MsgBox "Hive not valid (ReadRegistryKey)" - End Select - - Set Inparams = objReg.Methods_("GetStringValue").Inparameters - Inparams.Hdefkey = hiveKey - Inparams.Ssubkeyname = subkey - Inparams.Svaluename = valuename - Set Outparams = objReg.ExecMethod_("GetStringValue", Inparams,,objCtx) - - ReadRegistryKey = Outparams.SValue -End Function - -Function DetermineSVNVersion() - Dim WshShell, version, branch, modified, revision, clean_rev, url, oExec, line, hash +Function DetermineVersion() + Dim WshShell, branch, tag, modified, isodate, oExec, line, hash, shorthash Set WshShell = CreateObject("WScript.Shell") On Error Resume Next - revision = 0 + modified = 1 + hash = "" + shorthash = "" + branch = "" + isodate = "" + tag = "" - ' Try TortoiseSVN - ' Get the directory where TortoiseSVN (should) reside(s) - Dim sTortoise - ' First, try with 32-bit architecture - sTortoise = ReadRegistryKey("HKLM", "SOFTWARE\TortoiseSVN", "Directory", 32) - If sTortoise = "" Or IsNull(sTortoise) Then - ' No 32-bit version of TortoiseSVN installed, try 64-bit version (doesn't hurt on 32-bit machines, it returns nothing or is ignored) - sTortoise = ReadRegistryKey("HKLM", "SOFTWARE\TortoiseSVN", "Directory", 64) - End If + ' Set the environment to english + WshShell.Environment("PROCESS")("LANG") = "en" - ' If TortoiseSVN is installed, try to get the revision number - If sTortoise <> "" Then - Dim SubWCRev - Set SubWCRev = WScript.CreateObject("SubWCRev.object") - SubWCRev.GetWCInfo FSO.GetAbsolutePathName("../"), 0, 0 - revision = SubWCRev.Revision - version = "r" & revision - modified = 0 - if SubWCRev.HasModifications then modified = 2 - url = SubWCRev.Url - End If + Set oExec = WshShell.Exec("git rev-parse --verify HEAD") + If Err.Number = 0 Then + ' Wait till the application is finished ... + Do While oExec.Status = 0 + Loop - ' Looks like there is no TortoiseSVN installed either. Then we don't know it. - If revision = 0 Then - ' Reset error and version - Err.Clear - version = "norev000" - modified = 0 - - ' Set the environment to english - WshShell.Environment("PROCESS")("LANG") = "en" - - ' Do we have subversion installed? Check immediatelly whether we've got a modified WC. - Set oExec = WshShell.Exec("svnversion ../") - If Err.Number = 0 Then - ' Wait till the application is finished ... - Do While oExec.Status = 0 - Loop - - line = OExec.StdOut.ReadLine() - If line <> "exported" Then - If InStr(line, "M") Then - modified = 2 - End If - - ' And use svn info to get the correct revision and branch information. - Set oExec = WshShell.Exec("svn info ../") - If Err.Number = 0 Then - Do - line = OExec.StdOut.ReadLine() - If InStr(line, "URL") Then - url = line - End If - If InStr(line, "Last Changed Rev") Then - revision = Mid(line, 19) - version = "r" & revision - End If - Loop While Not OExec.StdOut.atEndOfStream - End If ' Err.Number = 0 - End If ' line <> "exported" - End If ' Err.Number = 0 - End If ' InStr(version, "$") - - If version <> "norev000" Then - If InStr(url, "branches") Then - branch = Mid(url, InStr(url, "branches/") + 9) - End If - If InStr(url, "tags") Then - version = Mid(url, InStr(url, "tags/") + 5) - End If - Else ' version <> "norev000" - ' svn detection failed, reset error and try git - Err.Clear - Set oExec = WshShell.Exec("git rev-parse --verify HEAD") - If Err.Number = 0 Then - ' Wait till the application is finished ... - Do While oExec.Status = 0 - Loop - - If oExec.ExitCode = 0 Then - hash = oExec.StdOut.ReadLine() - version = "g" & Mid(hash, 1, 8) - ' Make sure index is in sync with disk - Set oExec = WshShell.Exec("git update-index --refresh") - If Err.Number = 0 Then - ' StdOut and StdErr share a 4kB buffer so prevent it from filling up as we don't care about the output - oExec.StdOut.Close - oExec.StdErr.Close - ' Wait till the application is finished ... - Do While oExec.Status = 0 - WScript.Sleep 10 - Loop - End If - Set oExec = WshShell.Exec("git diff-index --exit-code --quiet HEAD ../") - If Err.Number = 0 Then - ' Wait till the application is finished ... - Do While oExec.Status = 0 - Loop - - If oExec.ExitCode = 1 Then - modified = 2 - End If ' oExec.ExitCode = 1 - - Set oExec = WshShell.Exec("git symbolic-ref HEAD") - If Err.Number = 0 Then - line = oExec.StdOut.ReadLine() - line = Mid(line, InStrRev(line, "/") + 1) - If line <> "master" Then - branch = line - End If ' line <> "master" - End If ' Err.Number = 0 - - Set oExec = WshShell.Exec("git log --pretty=format:%s --grep=" & Chr(34) & "^(svn r[0-9]*)" & Chr(34) & " -1") - if Err.Number = 0 Then - revision = Mid(oExec.StdOut.ReadLine(), 7) - revision = Mid(revision, 1, InStr(revision, ")") - 1) - End If ' Err.Number = 0 - If revision = "" Then - ' No revision? Maybe it is a custom git-svn clone - ' Reset error number as WshShell.Exec will not do that on success - Err.Clear - Set oExec = WshShell.Exec("git log --pretty=format:%b --grep=" & Chr(34) & "git-svn-id:.*@[0-9]*" & Chr(34) & " -1") - If Err.Number = 0 Then - revision = oExec.StdOut.ReadLine() - revision = Mid(revision, InStr(revision, "@") + 1) - revision = Mid(revision, 1, InStr(revision, " ") - 1) - End If ' Err.Number = 0 - End If ' revision = "" - - ' Check if a tag is currently checked out - Err.Clear - Set oExec = WshShell.Exec("git name-rev --name-only --tags --no-undefined HEAD") - If Err.Number = 0 Then - ' Wait till the application is finished ... - Do While oExec.Status = 0 - Loop - If oExec.ExitCode = 0 Then - version = oExec.StdOut.ReadLine() - If Right(version, 2) = "^0" Then - version = Left(version, Len(version) - 2) - End If - branch = "" - End If ' oExec.ExitCode = 0 - End If ' Err.Number = 0 - End If ' Err.Number = 0 - End If ' oExec.ExitCode = 0 - End If ' Err.Number = 0 - - If version = "norev000" Then - ' git detection failed, reset error and try mercurial (hg) - Err.Clear - Set oExec = WshShell.Exec("hg id -i") + If oExec.ExitCode = 0 Then + hash = oExec.StdOut.ReadLine() + shorthash = Mid(hash, 1, 8) + ' Make sure index is in sync with disk + Set oExec = WshShell.Exec("git update-index --refresh") + If Err.Number = 0 Then + ' StdOut and StdErr share a 4kB buffer so prevent it from filling up as we don't care about the output + oExec.StdOut.Close + oExec.StdErr.Close + ' Wait till the application is finished ... + Do While oExec.Status = 0 + WScript.Sleep 10 + Loop + End If + Set oExec = WshShell.Exec("git diff-index --exit-code --quiet HEAD ../") If Err.Number = 0 Then ' Wait till the application is finished ... Do While oExec.Status = 0 Loop - If oExec.ExitCode = 0 Then - line = OExec.StdOut.ReadLine() - hash = Left(line, 12) - version = "h" & Mid(hash, 1, 8) + If oExec.ExitCode = 1 Then + modified = 2 + End If ' oExec.ExitCode = 1 - ' Check if a tag is currently checked out - Err.Clear - Set oExec = WshShell.Exec("hg id -t") - If Err.Number = 0 Then - line = oExec.StdOut.ReadLine() - If Len(line) > 0 And Right(line, 3) <> "tip" Then - version = line - branch = "" - End If ' Len(line) > 0 And Right(line, 3) <> "tip" - End If ' Err.Number = 0 + Set oExec = WshShell.Exec("git show -s --pretty=format:%ci") + if Err.Number = 0 Then + isodate = Mid(oExec.StdOut.ReadLine(), 1, 10) + isodate = Replace(isodate, "-", "") + End If ' Err.Number = 0 - Err.Clear - Set oExec = WshShell.Exec("hg status ../") - If Err.Number = 0 Then - Do - line = OExec.StdOut.ReadLine() - If Len(line) > 0 And Mid(line, 1, 1) <> "?" Then - modified = 2 - Exit Do - End If ' Len(line) > 0 And Mid(line, 1, 1) <> "?" - Loop While Not OExec.StdOut.atEndOfStream + ' Check branch + Err.Clear + Set oExec = WshShell.Exec("git symbolic-ref HEAD") + If Err.Number = 0 Then + line = oExec.StdOut.ReadLine() + branch = Mid(line, InStrRev(line, "/") + 1) + End If ' Err.Number = 0 - Set oExec = WshShell.Exec("hg branch") - If Err.Number = 0 Then - line = OExec.StdOut.ReadLine() - If line <> "default" Then - branch = line - End If ' line <> "default" - End If ' Err.Number = 0 - - Set oExec = WshShell.Exec("hg log -f -k " & Chr(34) & "(svn r" & Chr(34) & " -l 1 --template " & Chr(34) & "{desc|firstline}\n" & Chr(34) & " --cwd ../") - If Err.Number = 0 Then - line = oExec.StdOut.ReadLine() - If Left(line, 6) = "(svn r" Then - revision = Mid(line, 7) - revision = Mid(revision, 1, InStr(revision, ")") - 1) - End If 'Left(line, 6) = "(svn r" - End If ' Err.Number = 0 - - If revision = "" Then - ' No rev? Maybe it is a custom hgsubversion clone - Err.Clear - Set oExec = WshShell.Exec("hg parent --template=" & Chr(34) & "{svnrev}" & Chr(34)) - If Err.Number = 0 Then - revision = oExec.StdOut.ReadLine() - End If ' Err.Number = 0 - End If ' revision = "" - End If ' Err.Number = 0 - End If ' oExec.ExitCode = 0 + ' Check if a tag is currently checked out + Err.Clear + Set oExec = WshShell.Exec("git name-rev --name-only --tags --no-undefined HEAD") + If Err.Number = 0 Then + ' Wait till the application is finished ... + Do While oExec.Status = 0 + Loop + If oExec.ExitCode = 0 Then + tag = oExec.StdOut.ReadLine() + If Right(tag, 2) = "^0" Then + tag = Left(tag, Len(tag) - 2) + End If + End If ' oExec.ExitCode = 0 + End If ' Err.Number = 0 End If ' Err.Number = 0 - End If ' version = "norev000" - End If ' version <> "norev000" + End If ' oExec.ExitCode = 0 + End If ' Err.Number = 0 - If version = "norev000" And FSO.FileExists("../.ottdrev") Then + If hash = "" And FSO.FileExists("../.ottdrev") Then Dim rev_file Set rev_file = FSO.OpenTextFile("../.ottdrev", 1, True, 0) - DetermineSVNVersion = rev_file.ReadLine() + DetermineVersion = rev_file.ReadLine() rev_file.Close() + ElseIf hash = "" Then + DetermineVersion = "norev000" Else + Dim version + If tag <> "" Then + version = tag + ElseIf branch = "master" Then + version = isodate & "-g" & shorthash + Else + version = isodate & "-" & branch & "-g" & shorthash + End If + If modified = 2 Then version = version & "M" End If - clean_rev = version - If branch <> "" Then - version = version & "-" & branch - End If - - If version <> "norev000" Then - DetermineSVNVersion = version & Chr(9) & revision & Chr(9) & modified & Chr(9) & clean_rev - Else - DetermineSVNVersion = version - End If + DetermineVersion = version & Chr(9) & isodate & Chr(9) & modified & Chr(9) & hash End If End Function @@ -359,7 +179,7 @@ Function CheckFile(filename) End Function Dim version -version = DetermineSVNVersion +version = DetermineVersion If Not (IsCachedVersion(version) And CheckFile("../src/rev.cpp") And CheckFile("../src/os/windows/ottdres.rc")) Then UpdateFiles version End If diff --git a/projects/dpi_aware.manifest b/projects/dpi_aware.manifest new file mode 100644 index 0000000000..6f04161596 --- /dev/null +++ b/projects/dpi_aware.manifest @@ -0,0 +1,7 @@ + + + + True/PM + + + diff --git a/projects/gen-kdev4.sh b/projects/gen-kdev4.sh new file mode 100755 index 0000000000..4ea5dbc2a8 --- /dev/null +++ b/projects/gen-kdev4.sh @@ -0,0 +1,203 @@ +#!/bin/sh + +# $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 . + +# echo without interpretation of backslash escapes and without +# adding newline at the end - just the string as it is +rawprint() +{ + printf '%s' "$@" +} + +encode_dword() +{ + printf '\x%02x' \ + `expr $1 / 16777216 % 256` \ + `expr $1 / 65536 % 256` \ + `expr $1 / 256 % 256` \ + `expr $1 % 256` +} + +encode_string() +{ + # turn string into UTF-16 and hexdump it + hex_utf16=`rawprint "$1" | iconv -t UTF-16BE | od -t x1 -A n | tr -d -c '[:xdigit:]'`; + + encode_dword `rawprint "$hex_utf16" | wc -m | xargs -I {} expr {} / 2` # length = num hex digits / 2 + rawprint "$hex_utf16" | sed 's/../\\x&/g' # put '\x' prefix before every pair of digits +} + +encode_single_define() +{ + encode_string `rawprint "$1" | grep -o '^[^=]*'` # everything before '=' + rawprint '\x00\x00\x00\n\x00' + encode_string `rawprint "$1" | sed 's/^[^=]*=\?//'` # everything after '=' +} + +# $1 - newline-separated list of defines +encode_defines() +{ + # add some fixed defines and discard empty lines from the tail + defines=`printf 'va_list\nva_args\n%s' "$1"` + + # count lines (no newline at the end so add one) + encode_dword `printf '%s\n' "$defines" | wc -l` + + while [ -n "$defines" ]; do + encode_single_define `rawprint "$defines" | head -n 1` + defines=`rawprint "$defines" | tail -n +2` + done +} + +encode_includes() +{ + encode_dword 3 # number of custom includes + encode_string "$1/src/stdafx.h" + encode_string "$1/objs/lang" + encode_string "$1/objs/setting" +} + +# escape with a backslash (\) characters special to the sed replace string: \ & +# also escape our custom filed separator that we will be using in sed: @ +escape_sed_special() +{ + sed -e 's/[\&@]/\\&/g' +} + + + +PROJECT_DIR=`pwd` +DIR_NAME=`pwd | xargs -0 basename` + +USAGE_TEXT='Usage: + + projects/gen-kdev4 [PROJECT_NAME|-h|--help] + +PROJECT_NAME is the name of the project that will be displayed in KDevelop. +Before executing, cd into OpenTTD folder and run ./configure script. + +-h, --help + print help and exit' + +case "$# $1" in + '1 -h' | '1 --help') printf 'Generate OpenTTD project files for KDevelop 4+\n\n%s\n' "$USAGE_TEXT"; exit 0;; + 1*) PROJECT_NAME="$1";; + 0*) PROJECT_NAME="$DIR_NAME";; + *) printf 'Wrong arguments given. %s\n' "$USAGE_TEXT" >&2; exit 1;; +esac + +CFLAGS=`grep '^using CFLAGS\.\.\.' config.log 2>/dev/null` +if [ -z "$CFLAGS" ]; then + echo "OpenTTD config.log not found" >&2 + echo "cd into OpenTTD first and run 'configure'" >&2 + exit 1 +fi +DEFINES=`eval "printf '%s\n' $CFLAGS" | grep '^\-D' | cut -c3-` + +PROJECT_NAME_SED=s@!!PROJECT_NAME!!@`rawprint "$PROJECT_NAME" | escape_sed_special`@g +PROJECT_DIR_SED=s@!!PROJECT_DIR!!@`rawprint "$PROJECT_DIR" | escape_sed_special`@g +CUSTOM_DEFINES_SED=s@!!CUSTOM_DEFINES!!@`encode_defines "$DEFINES" | escape_sed_special`@g +CUSTOM_INCLUDES_SED=s@!!CUSTOM_INCLUDES!!@`encode_includes "$PROJECT_DIR" | escape_sed_special`@g + +mkdir -p .kdev4 + +sed -e "$PROJECT_NAME_SED" \ + >"$PROJECT_DIR/$DIR_NAME.kdev4" \ + << "EOF" +[Project] +Manager=KDevCustomMakeManager +Name=!!PROJECT_NAME!! +EOF + +sed -e "$PROJECT_DIR_SED" -e "$CUSTOM_DEFINES_SED" -e "$CUSTOM_INCLUDES_SED" \ + >"$PROJECT_DIR/.kdev4/$DIR_NAME.kdev4" \ + << "EOF" +[CustomDefinesAndIncludes][ProjectPath0] +Defines=!!CUSTOM_DEFINES!! +Includes=!!CUSTOM_INCLUDES!! +Path=. + +[Defines And Includes][Compiler] +Name=GCC +Path=gcc +Type=GCC + +[Filters] +size=10 + +[Filters][0] +inclusive=0 +pattern=.* +targets=3 + +[Filters][1] +inclusive=0 +pattern=.svn +targets=2 + +[Filters][2] +inclusive=0 +pattern=.hg +targets=2 + +[Filters][3] +inclusive=0 +pattern=.git +targets=2 + +[Filters][4] +inclusive=0 +pattern=*.rej +targets=1 + +[Filters][5] +inclusive=0 +pattern=*.orig +targets=1 + +[Filters][6] +inclusive=0 +pattern=*~ +targets=1 + +[Filters][7] +inclusive=0 +pattern=.*.kate-swp +targets=1 + +[Filters][8] +inclusive=0 +pattern=.*.swp +targets=1 + +[Filters][9] +inclusive=0 +pattern=/objs +targets=2 + +[Launch] +Launch Configurations=Launch Configuration 0 + +[Launch][Launch Configuration 0] +Configured Launch Modes=execute +Configured Launchers=nativeAppLauncher +Name=Launch OpenTTD\s +Type=Native Application + +[Launch][Launch Configuration 0][Data] +Arguments=-d 1 +Dependencies=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x00) +Dependency Action=Nothing +EnvironmentGroup= +Executable=file://!!PROJECT_DIR!!/bin/openttd +External Terminal=konsole --noclose --workdir %workdir -e %exe +Project Target= +Use External Terminal=false +Working Directory=file://!!PROJECT_DIR!!/bin +isExecutable=true +EOF diff --git a/projects/generate b/projects/generate index bd177bf71b..af59a83fb2 100755 --- a/projects/generate +++ b/projects/generate @@ -22,6 +22,15 @@ then exit 1 fi +# openttd_vs141.sln is for MSVC 2017 +# openttd_vs141.vcxproj is for MSVC 2017 +# openttd_vs141.vcxproj.filters is for MSVC 2017 +# langs_vs141.vcxproj is for MSVC 2017 +# strgen_vs141.vcxproj is for MSVC 2017 +# strgen_vs141.vcxproj.filters is for MSVC 2017 +# generate_vs141.vcxproj is for MSVC 2017 +# version_vs141.vcxproj is for MSVC 2017 + # openttd_vs140.sln is for MSVC 2015 # openttd_vs140.vcxproj is for MSVC 2015 # openttd_vs140.vcxproj.filters is for MSVC 2015 @@ -31,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 @@ -65,6 +52,7 @@ enable_dedicated="0" enable_ai="1" with_cocoa="0" enable_directmusic="1" +enable_fluidsynth="0" with_threads="1" file_prefix="..\\\\src\\\\" @@ -114,7 +102,6 @@ load_main_data() { if ($0 == "PNG" && "'$png_config'" == "") { next; } if ($0 == "OSX" && "'$os'" != "OSX") { next; } if ($0 == "OS2" && "'$os'" != "OS2") { next; } - if ($0 == "PSP" && "'$os'" != "PSP") { next; } if ($0 == "DOS" && "'$os'" != "DOS") { next; } if ($0 == "DEDICATED" && "'$enable_dedicated'" != "1") { next; } if ($0 == "AI" && "'$enable_ai'" == "0") { next; } @@ -122,9 +109,9 @@ load_main_data() { if ($0 == "BEOS" && "'$os'" != "BEOS") { next; } if ($0 == "WIN32" && "'$os'" != "MINGW" && "'$os'" != "CYGWIN" && "'$os'" != "MSVC" ) { next; } - if ($0 == "WINCE" && "'$os'" != "WINCE") { 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; } @@ -183,9 +170,11 @@ load_main_data() { load_lang_data() { RES="" - for i in `ls $1` + # Windows Folder sort and Linux Folder sort are slightly different. + # By removing the extension and sorting it on Linux, they are the same. + for i in `ls $1 | sed s~.txt$~~g | sort` do - i=`basename $i | sed s~.txt$~~g` + i=`basename $i` if [ "$i" == "english" ] then continue @@ -311,21 +300,15 @@ 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 "$lang" "langs_vs80.vcproj" -generate "$lang" "langs_vs90.vcproj" -generate "$langvcxproj" "langs_vs100.vcxproj" -generate "$langfiles" "langs_vs100.vcxproj.filters" +generate "$openttdvcxproj" "openttd_vs141.vcxproj" +generate "$openttdfiles" "openttd_vs141.vcxproj.filters" "$openttdfilters" generate "$langvcxproj" "langs_vs140.vcxproj" generate "$langfiles" "langs_vs140.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 "$langvcxproj" "langs_vs141.vcxproj" +generate "$langfiles" "langs_vs141.vcxproj.filters" generate "$settingsvcxproj" "settings_vs140.vcxproj" "$settingscommand" generate "$settingsfiles" "settings_vs140.vcxproj.filters" +generate "$settingsvcxproj" "settings_vs141.vcxproj" "$settingscommand" +generate "$settingsfiles" "settings_vs141.vcxproj.filters" diff --git a/projects/generate.vbs b/projects/generate.vbs index 6692b45e7f..5439ed7c0d 100755 --- a/projects/generate.vbs +++ b/projects/generate.vbs @@ -10,6 +10,15 @@ Option Explicit Dim FSO Set FSO = CreateObject("Scripting.FileSystemObject") +' openttd_vs141.sln is for MSVC 2017 +' openttd_vs141.vcxproj is for MSVC 2017 +' openttd_vs141.vcxproj.filters is for MSVC 2017 +' langs_vs141.vcxproj is for MSVC 2017 +' strgen_vs141.vcxproj is for MSVC 2017 +' strgen_vs141.vcxproj.filters is for MSVC 2017 +' generate_vs141.vcxproj is for MSVC 2017 +' version_vs141.vcxproj is for MSVC 2017 + ' openttd_vs140.sln is for MSVC 2015 ' openttd_vs140.vcxproj is for MSVC 2015 ' openttd_vs140.vcxproj.filters is for MSVC 2015 @@ -19,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 @@ -374,27 +360,21 @@ 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 +generate openttdfiles, ROOT_DIR & "/projects/openttd_vs141.vcxproj.filters", openttdfilters 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 +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 +generate settingsfiles, ROOT_DIR & "/projects/settings_vs141.vcxproj.filters", Null 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_vs100.vcxproj b/projects/generate_vs141.vcxproj similarity index 89% rename from projects/generate_vs100.vcxproj rename to projects/generate_vs141.vcxproj index 4417308e60..2db93cf097 100644 --- a/projects/generate_vs100.vcxproj +++ b/projects/generate_vs141.vcxproj @@ -1,5 +1,5 @@ - - + + Debug @@ -14,6 +14,7 @@ Utility + v141 @@ -22,9 +23,6 @@ - - <_ProjectFileVersion>10.0.30319.1 - 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_vs140.vcxproj b/projects/langs_vs140.vcxproj index 0907bfa6f5..25e7160bfb 100644 --- a/projects/langs_vs140.vcxproj +++ b/projects/langs_vs140.vcxproj @@ -323,6 +323,12 @@ ..\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)" @@ -373,7 +379,7 @@ - + {a133a442-bd0a-4ade-b117-ad7545e4bdd1} false diff --git a/projects/langs_vs140.vcxproj.filters b/projects/langs_vs140.vcxproj.filters index fb16aa64e0..bf5257ec82 100644 --- a/projects/langs_vs140.vcxproj.filters +++ b/projects/langs_vs140.vcxproj.filters @@ -145,6 +145,9 @@ Translations + + Translations + Translations diff --git a/projects/langs_vs140.vcxproj.in b/projects/langs_vs140.vcxproj.in index f75ef9d6b5..3271fecffa 100644 --- a/projects/langs_vs140.vcxproj.in +++ b/projects/langs_vs140.vcxproj.in @@ -50,7 +50,7 @@ !!FILES!! - + {a133a442-bd0a-4ade-b117-ad7545e4bdd1} false diff --git a/projects/langs_vs100.vcxproj b/projects/langs_vs141.vcxproj similarity index 97% rename from projects/langs_vs100.vcxproj rename to projects/langs_vs141.vcxproj index 078a7b374a..c554c6e378 100644 --- a/projects/langs_vs100.vcxproj +++ b/projects/langs_vs141.vcxproj @@ -1,5 +1,5 @@ - + Debug @@ -16,6 +16,7 @@ Utility false + v141 @@ -25,7 +26,6 @@ - <_ProjectFileVersion>10.0.30319.1 ..\bin\lang\ ..\objs\langs\ @@ -323,6 +323,12 @@ ..\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)" @@ -373,7 +379,7 @@ - + {a133a442-bd0a-4ade-b117-ad7545e4bdd1} false diff --git a/projects/langs_vs100.vcxproj.filters b/projects/langs_vs141.vcxproj.filters similarity index 98% rename from projects/langs_vs100.vcxproj.filters rename to projects/langs_vs141.vcxproj.filters index fb16aa64e0..bf5257ec82 100644 --- a/projects/langs_vs100.vcxproj.filters +++ b/projects/langs_vs141.vcxproj.filters @@ -145,6 +145,9 @@ Translations + + Translations + Translations diff --git a/projects/langs_vs100.vcxproj.filters.in b/projects/langs_vs141.vcxproj.filters.in similarity index 100% rename from projects/langs_vs100.vcxproj.filters.in rename to projects/langs_vs141.vcxproj.filters.in diff --git a/projects/langs_vs100.vcxproj.in b/projects/langs_vs141.vcxproj.in similarity index 92% rename from projects/langs_vs100.vcxproj.in rename to projects/langs_vs141.vcxproj.in index 5bfec8bf0f..b73d52c5c9 100644 --- a/projects/langs_vs100.vcxproj.in +++ b/projects/langs_vs141.vcxproj.in @@ -1,5 +1,5 @@ - + Debug @@ -16,6 +16,7 @@ Utility false + v141 @@ -25,7 +26,6 @@ - <_ProjectFileVersion>10.0.30319.1 ..\bin\lang\ ..\objs\langs\ @@ -50,7 +50,7 @@ !!FILES!! - + {a133a442-bd0a-4ade-b117-ad7545e4bdd1} false diff --git a/projects/langs_vs80.vcproj b/projects/langs_vs80.vcproj deleted file mode 100644 index 1413a80d27..0000000000 --- a/projects/langs_vs80.vcproj +++ /dev/null @@ -1,880 +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 db6fef1a43..0000000000 --- a/projects/langs_vs90.vcproj +++ /dev/null @@ -1,881 +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.vcxproj b/projects/openttd_vs100.vcxproj index 0571ef4862..3baeeb5eb7 100644 --- a/projects/openttd_vs100.vcxproj +++ b/projects/openttd_vs100.vcxproj @@ -102,7 +102,7 @@ Size true ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;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) true Sync MultiThreaded @@ -145,6 +145,12 @@ MachineX86 true + + dpi_aware.manifest;os_versions.manifest + + + copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" + @@ -156,7 +162,7 @@ /MP %(AdditionalOptions) Disabled ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;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) EnableFastChecks MultiThreadedDebug @@ -188,6 +194,12 @@ MachineX86 + + dpi_aware.manifest;os_versions.manifest + + + copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" + @@ -204,7 +216,7 @@ Size true ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;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) true Sync MultiThreaded @@ -244,6 +256,12 @@ MachineX64 true + + dpi_aware.manifest;os_versions.manifest + + + copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" + @@ -256,7 +274,7 @@ /MP %(AdditionalOptions) Disabled ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;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) EnableFastChecks MultiThreadedDebug @@ -289,6 +307,12 @@ 1048576 MachineX64 + + dpi_aware.manifest;os_versions.manifest + + + copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" + @@ -571,6 +595,7 @@ + @@ -666,6 +691,8 @@ + + @@ -860,6 +887,7 @@ + @@ -1000,6 +1028,8 @@ + + @@ -1065,6 +1095,8 @@ + + @@ -1276,7 +1308,7 @@ - + diff --git a/projects/openttd_vs100.vcxproj.filters b/projects/openttd_vs100.vcxproj.filters index 0b6dc573b4..515f2b4c05 100644 --- a/projects/openttd_vs100.vcxproj.filters +++ b/projects/openttd_vs100.vcxproj.filters @@ -942,6 +942,9 @@ Header Files + + Header Files + Header Files @@ -1227,6 +1230,12 @@ Core Source Code + + Core Source Code + + + Core Source Code + Core Source Code @@ -1809,6 +1818,9 @@ Save/Load handlers + + Save/Load handlers + Save/Load handlers @@ -2229,6 +2241,12 @@ Script API + + Script API + + + Script API + Script API @@ -2424,6 +2442,12 @@ Script API Implementation + + Script API Implementation + + + Script API Implementation + Script API Implementation @@ -3051,6 +3075,6 @@ - + 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 88f7b44ddd..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 @@ Size true ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;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) true Sync MultiThreaded @@ -136,7 +138,7 @@ 0x0809 - 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) + winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) true %(IgnoreSpecificDefaultLibraries) true @@ -151,6 +153,13 @@ true 5.01 + + os_versions.manifest + PerMonitorHighDPIAware + + + copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" + @@ -163,7 +172,7 @@ Disabled true ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;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) EnableFastChecks MultiThreadedDebug @@ -185,7 +194,7 @@ 0x0809 - 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) + winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) true LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) true @@ -198,6 +207,13 @@ MachineX86 5.01 + + os_versions.manifest + PerMonitorHighDPIAware + + + copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" + @@ -214,7 +230,7 @@ Size true ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;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) true Sync MultiThreaded @@ -245,7 +261,7 @@ 0x0809 - 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) + winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) true %(IgnoreSpecificDefaultLibraries) true @@ -257,6 +273,13 @@ true 5.02 + + os_versions.manifest + PerMonitorHighDPIAware + + + copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" + @@ -270,7 +293,7 @@ Disabled true ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;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) EnableFastChecks MultiThreadedDebug @@ -296,7 +319,7 @@ 0x0809 - 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) + winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) true LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) true @@ -306,6 +329,13 @@ MachineX64 5.02 + + os_versions.manifest + PerMonitorHighDPIAware + + + copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" + @@ -474,6 +504,7 @@ + @@ -562,6 +593,8 @@ + + @@ -588,6 +621,7 @@ + @@ -622,6 +656,7 @@ + @@ -675,6 +710,7 @@ + @@ -683,6 +719,8 @@ + + @@ -720,6 +758,7 @@ + @@ -781,6 +820,7 @@ + @@ -877,6 +917,7 @@ + @@ -886,6 +927,8 @@ + + @@ -1015,6 +1058,8 @@ + + @@ -1080,6 +1125,8 @@ + + @@ -1135,6 +1182,8 @@ + + @@ -1279,30 +1328,33 @@ + + + - + - + {0f066b23-18df-4284-8265-f4a5e7e3b966} false - + {a133a442-bd0a-4ade-b117-ad7545e4bdd1} false - + {1a2b3c5e-1c23-41a5-9c9b-acba2aa75fec} false diff --git a/projects/openttd_vs140.vcxproj.filters b/projects/openttd_vs140.vcxproj.filters index 06800ffdaf..1fdac48354 100644 --- a/projects/openttd_vs140.vcxproj.filters +++ b/projects/openttd_vs140.vcxproj.filters @@ -600,6 +600,9 @@ Header Files + + Header Files + Header Files @@ -864,6 +867,12 @@ Header Files + + Header Files + + + Header Files + Header Files @@ -942,6 +951,9 @@ Header Files + + Header Files + Header Files @@ -1044,6 +1056,9 @@ Header Files + + Header Files + Header Files @@ -1203,6 +1218,9 @@ Header Files + + Header Files + Header Files @@ -1227,6 +1245,12 @@ Core Source Code + + Core Source Code + + + Core Source Code + Core Source Code @@ -1338,6 +1362,9 @@ GUI Source Code + + GUI Source Code + GUI Source Code @@ -1521,6 +1548,9 @@ Widgets + + Widgets + Widgets @@ -1809,6 +1839,9 @@ Save/Load handlers + + Save/Load handlers + Save/Load handlers @@ -1836,6 +1869,12 @@ Save/Load handlers + + Save/Load handlers + + + Save/Load handlers + Tables @@ -2223,6 +2262,12 @@ Script API + + Script API + + + Script API + Script API @@ -2418,6 +2463,12 @@ Script API Implementation + + Script API Implementation + + + Script API Implementation + Script API Implementation @@ -2583,6 +2634,12 @@ Blitters + + Blitters + + + Blitters + Blitters @@ -3015,6 +3072,9 @@ Music + + Music + Music @@ -3027,12 +3087,18 @@ Sound + + Sound + Windows files Windows files + + Windows files + Windows files @@ -3045,6 +3111,6 @@ - + diff --git a/projects/openttd_vs140.vcxproj.filters.in b/projects/openttd_vs140.vcxproj.filters.in index cda491072c..126bd61459 100644 --- a/projects/openttd_vs140.vcxproj.filters.in +++ b/projects/openttd_vs140.vcxproj.filters.in @@ -8,6 +8,6 @@ - + diff --git a/projects/openttd_vs140.vcxproj.in b/projects/openttd_vs140.vcxproj.in index 8089278bff..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 @@ Size true ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;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) true Sync MultiThreaded @@ -136,7 +138,7 @@ 0x0809 - 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) + winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) true %(IgnoreSpecificDefaultLibraries) true @@ -151,6 +153,13 @@ true 5.01 + + os_versions.manifest + PerMonitorHighDPIAware + + + copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" + @@ -163,7 +172,7 @@ Disabled true ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;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) EnableFastChecks MultiThreadedDebug @@ -185,7 +194,7 @@ 0x0809 - 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) + winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) true LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) true @@ -198,6 +207,13 @@ MachineX86 5.01 + + os_versions.manifest + PerMonitorHighDPIAware + + + copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" + @@ -214,7 +230,7 @@ Size true ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;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) true Sync MultiThreaded @@ -245,7 +261,7 @@ 0x0809 - 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) + winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) true %(IgnoreSpecificDefaultLibraries) true @@ -257,6 +273,13 @@ true 5.02 + + os_versions.manifest + PerMonitorHighDPIAware + + + copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" + @@ -270,7 +293,7 @@ Disabled true ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;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) EnableFastChecks MultiThreadedDebug @@ -296,7 +319,7 @@ 0x0809 - 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) + winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) true LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) true @@ -306,24 +329,31 @@ MachineX64 5.02 + + os_versions.manifest + PerMonitorHighDPIAware + + + 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_vs100.sln b/projects/openttd_vs141.sln similarity index 83% rename from projects/openttd_vs100.sln rename to projects/openttd_vs141.sln index a2ec939d30..86f2685cd9 100644 --- a/projects/openttd_vs100.sln +++ b/projects/openttd_vs141.sln @@ -1,25 +1,30 @@ -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}" + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.23107.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "openttd", "openttd_vs141.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}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "strgen", "strgen_vs141.vcxproj", "{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "langs", "langs_vs100.vcxproj", "{0F066B23-18DF-4284-8265-F4A5E7E3B966}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "langs", "langs_vs141.vcxproj", "{0F066B23-18DF-4284-8265-F4A5E7E3B966}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "version", "version_vs100.vcxproj", "{1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "version", "version_vs141.vcxproj", "{1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "generate", "generate_vs100.vcxproj", "{2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "generate", "generate_vs141.vcxproj", "{2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settings", "settings_vs100.vcxproj", "{0817F629-589E-4A3B-B81A-8647BC571E35}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settings", "settings_vs141.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}" +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 @@ -81,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 new file mode 100644 index 0000000000..5b305767ce --- /dev/null +++ b/projects/openttd_vs141.vcxproj @@ -0,0 +1,1361 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + openttd + {668328A0-B40E-4CDB-BD72-D0064424414A} + openttd + x86-windows-static + x64-windows-static + + + + Application + false + Unicode + v141 + + + Application + false + Unicode + true + v141 + + + Application + false + Unicode + v141 + + + Application + false + Unicode + true + v141 + + + + + + + + + + + + + + + + + $(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 + + + + + /J /Zc:throwingNew /std:c++latest %(AdditionalOptions) + Full + AnySuitable + true + Size + true + ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) + 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) + true + Sync + MultiThreaded + 4Bytes + false + true + + + + + + + All + $(IntDir) + $(IntDir) + $(IntDir)$(TargetName).pdb + Level3 + false + true + ProgramDatabase + FastCall + Default + true + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0809 + + + winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) + true + %(IgnoreSpecificDefaultLibraries) + true + Windows + 1048576 + 1048576 + true + false + + + MachineX86 + true + 5.01 + + + os_versions.manifest + PerMonitorHighDPIAware + + + copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" + + + + + .\Debug/openttd.tlb + + + + + /J /Zc:throwingNew /std:c++latest %(AdditionalOptions) + Disabled + true + ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) + _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) + EnableFastChecks + MultiThreadedDebug + + + $(IntDir) + $(IntDir) + $(IntDir)$(TargetName).pdb + Level3 + false + true + ProgramDatabase + FastCall + Default + true + true + + + _DEBUG;%(PreprocessorDefinitions) + 0x0809 + + + winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) + true + LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) + true + Windows + 1048576 + 1048576 + false + + + MachineX86 + 5.01 + + + os_versions.manifest + PerMonitorHighDPIAware + + + copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" + + + + + X64 + .\Release/openttd.tlb + + + + + /J /Zc:throwingNew /std:c++latest %(AdditionalOptions) + Full + AnySuitable + true + Size + true + ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) + 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) + true + Sync + MultiThreaded + Default + false + true + + + + + + + All + $(IntDir) + $(IntDir) + $(IntDir)$(TargetName).pdb + Level3 + false + true + ProgramDatabase + FastCall + Default + true + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0809 + + + winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) + true + %(IgnoreSpecificDefaultLibraries) + true + Windows + 1048576 + 1048576 + true + MachineX64 + true + 5.02 + + + os_versions.manifest + PerMonitorHighDPIAware + + + copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" + + + + + X64 + .\Debug/openttd.tlb + + + + + /J /Zc:throwingNew /std:c++latest %(AdditionalOptions) + Disabled + true + ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) + _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) + EnableFastChecks + MultiThreadedDebug + + + + + + + $(IntDir) + $(IntDir) + $(IntDir)$(TargetName).pdb + Level3 + false + true + ProgramDatabase + Cdecl + Default + true + true + + + _DEBUG;%(PreprocessorDefinitions) + 0x0809 + + + winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) + true + LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) + true + Windows + 1048576 + 1048576 + MachineX64 + 5.02 + + + os_versions.manifest + PerMonitorHighDPIAware + + + copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {0f066b23-18df-4284-8265-f4a5e7e3b966} + false + + + {a133a442-bd0a-4ade-b117-ad7545e4bdd1} + false + + + {1a2b3c5e-1c23-41a5-9c9b-acba2aa75fec} + false + + + + diff --git a/projects/openttd_vs141.vcxproj.filters b/projects/openttd_vs141.vcxproj.filters new file mode 100644 index 0000000000..b8bcc77042 --- /dev/null +++ b/projects/openttd_vs141.vcxproj.filters @@ -0,0 +1,3110 @@ + + + + + {c76ff9f1-1e62-46d8-8d55-000000000000} + + + {c76ff9f1-1e62-46d8-8d55-000000000001} + + + {c76ff9f1-1e62-46d8-8d55-000000000002} + + + {c76ff9f1-1e62-46d8-8d55-000000000003} + + + {c76ff9f1-1e62-46d8-8d55-000000000004} + + + {c76ff9f1-1e62-46d8-8d55-000000000005} + + + {c76ff9f1-1e62-46d8-8d55-000000000006} + + + {c76ff9f1-1e62-46d8-8d55-000000000007} + + + {c76ff9f1-1e62-46d8-8d55-000000000008} + + + {c76ff9f1-1e62-46d8-8d55-000000000009} + + + {c76ff9f1-1e62-46d8-8d55-000000000010} + + + {c76ff9f1-1e62-46d8-8d55-000000000011} + + + {c76ff9f1-1e62-46d8-8d55-000000000012} + + + {c76ff9f1-1e62-46d8-8d55-000000000013} + + + {c76ff9f1-1e62-46d8-8d55-000000000014} + + + {c76ff9f1-1e62-46d8-8d55-000000000015} + + + {c76ff9f1-1e62-46d8-8d55-000000000016} + + + {c76ff9f1-1e62-46d8-8d55-000000000017} + + + {c76ff9f1-1e62-46d8-8d55-000000000018} + + + {c76ff9f1-1e62-46d8-8d55-000000000019} + + + {c76ff9f1-1e62-46d8-8d55-000000000020} + + + {c76ff9f1-1e62-46d8-8d55-000000000021} + + + {c76ff9f1-1e62-46d8-8d55-000000000022} + + + {c76ff9f1-1e62-46d8-8d55-000000000023} + + + {c76ff9f1-1e62-46d8-8d55-000000000024} + + + {c76ff9f1-1e62-46d8-8d55-000000000025} + + + {c76ff9f1-1e62-46d8-8d55-000000000026} + + + {c76ff9f1-1e62-46d8-8d55-000000000027} + + + {c76ff9f1-1e62-46d8-8d55-000000000028} + + + {c76ff9f1-1e62-46d8-8d55-000000000029} + + + {c76ff9f1-1e62-46d8-8d55-000000000030} + + + {c76ff9f1-1e62-46d8-8d55-000000000031} + + + {c76ff9f1-1e62-46d8-8d55-000000000032} + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + Core Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + GUI Source Code + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Widgets + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Command handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Save/Load handlers + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + Tables + + + MD5 + + + MD5 + + + Script + + + Script + + + Script + + + Script + + + Script + + + Script + + + Script + + + Script + + + Script + + + Script + + + Script + + + Script + + + Script + + + Script + + + Script + + + Script + + + Script + + + Script + + + Script + + + Squirrel + + + Squirrel + + + Squirrel + + + Squirrel + + + Squirrel + + + Squirrel + + + Squirrel + + + Squirrel + + + Squirrel + + + Squirrel + + + Squirrel + + + Squirrel + + + Squirrel + + + Squirrel + + + Squirrel headers + + + Squirrel headers + + + Squirrel headers + + + Squirrel headers + + + Squirrel headers + + + Squirrel headers + + + Squirrel headers + + + Squirrel headers + + + Squirrel headers + + + Squirrel headers + + + Squirrel headers + + + Squirrel headers + + + Squirrel headers + + + Squirrel headers + + + Squirrel headers + + + Squirrel headers + + + Squirrel headers + + + Squirrel headers + + + Squirrel headers + + + Squirrel headers + + + AI Core + + + AI Core + + + AI Core + + + AI Core + + + AI Core + + + AI Core + + + AI Core + + + AI Core + + + AI Core + + + AI Core + + + AI Core + + + AI Core + + + AI API + + + Game API + + + Game Core + + + Game Core + + + Game Core + + + Game Core + + + Game Core + + + Game Core + + + Game Core + + + Game Core + + + Game Core + + + Game Core + + + Game Core + + + Game Core + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Script API Implementation + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Blitters + + + Drivers + + + Drivers + + + Drivers + + + Sprite loaders + + + Sprite loaders + + + Sprite loaders + + + NewGRF + + + NewGRF + + + NewGRF + + + NewGRF + + + NewGRF + + + NewGRF + + + NewGRF + + + NewGRF + + + NewGRF + + + NewGRF + + + NewGRF + + + NewGRF + + + NewGRF + + + NewGRF + + + NewGRF + + + NewGRF + + + NewGRF + + + NewGRF + + + NewGRF + + + NewGRF + + + NewGRF + + + Map Accessors + + + Map Accessors + + + Map Accessors + + + Map Accessors + + + Map Accessors + + + Map Accessors + + + Map Accessors + + + Map Accessors + + + Map Accessors + + + Map Accessors + + + Map Accessors + + + Map Accessors + + + Map Accessors + + + Map Accessors + + + Map Accessors + + + Map Accessors + + + Map Accessors + + + Misc + + + Misc + + + Misc + + + Misc + + + Misc + + + Misc + + + Misc + + + Misc + + + Misc + + + Misc + + + Misc + + + Misc + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Network Core + + + Pathfinder + + + Pathfinder + + + Pathfinder + + + Pathfinder + + + Pathfinder + + + Pathfinder + + + NPF + + + NPF + + + NPF + + + NPF + + + NPF + + + NPF + + + YAPF + + + YAPF + + + YAPF + + + YAPF + + + YAPF + + + YAPF + + + YAPF + + + YAPF + + + YAPF + + + YAPF + + + YAPF + + + YAPF + + + YAPF + + + YAPF + + + YAPF + + + YAPF + + + YAPF + + + YAPF + + + Video + + + Video + + + Video + + + Video + + + Music + + + Music + + + Music + + + Music + + + Sound + + + Sound + + + Sound + + + Sound + + + Windows files + + + Windows files + + + Windows files + + + Windows files + + + Threading + + + Threading + + + + + + + diff --git a/projects/openttd_vs100.vcxproj.filters.in b/projects/openttd_vs141.vcxproj.filters.in similarity index 88% rename from projects/openttd_vs100.vcxproj.filters.in rename to projects/openttd_vs141.vcxproj.filters.in index cda491072c..126bd61459 100644 --- a/projects/openttd_vs100.vcxproj.filters.in +++ b/projects/openttd_vs141.vcxproj.filters.in @@ -8,6 +8,6 @@ - + diff --git a/projects/openttd_vs100.vcxproj.in b/projects/openttd_vs141.vcxproj.in similarity index 76% rename from projects/openttd_vs100.vcxproj.in rename to projects/openttd_vs141.vcxproj.in index 7a4f0bce81..a054c2580e 100644 --- a/projects/openttd_vs100.vcxproj.in +++ b/projects/openttd_vs141.vcxproj.in @@ -1,5 +1,5 @@ - + Debug @@ -22,29 +22,35 @@ openttd {668328A0-B40E-4CDB-BD72-D0064424414A} openttd + x86-windows-static + x64-windows-static Application false Unicode + v141 Application false Unicode true + v141 Application false Unicode + v141 Application false Unicode true + v141 @@ -61,7 +67,6 @@ - <_ProjectFileVersion>10.0.30319.1 $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ false @@ -95,14 +100,14 @@ - /MP /J %(AdditionalOptions) + /J /Zc:throwingNew /std:c++latest %(AdditionalOptions) Full AnySuitable true Size true ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;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) true Sync MultiThreaded @@ -125,13 +130,15 @@ ProgramDatabase FastCall Default + true + true NDEBUG;%(PreprocessorDefinitions) 0x0809 - 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) + winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) true %(IgnoreSpecificDefaultLibraries) true @@ -144,7 +151,15 @@ MachineX86 true + 5.01 + + os_versions.manifest + PerMonitorHighDPIAware + + + copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" + @@ -153,10 +168,11 @@ - /MP %(AdditionalOptions) + /J /Zc:throwingNew /std:c++latest %(AdditionalOptions) Disabled + true ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;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) EnableFastChecks MultiThreadedDebug @@ -167,16 +183,18 @@ Level3 false true - EditAndContinue + ProgramDatabase FastCall Default + true + true _DEBUG;%(PreprocessorDefinitions) 0x0809 - 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) + winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) true LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) true @@ -187,7 +205,15 @@ MachineX86 + 5.01 + + os_versions.manifest + PerMonitorHighDPIAware + + + copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" + @@ -197,14 +223,14 @@ - /MP /J %(AdditionalOptions) + /J /Zc:throwingNew /std:c++latest %(AdditionalOptions) Full AnySuitable true Size true ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;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) true Sync MultiThreaded @@ -227,13 +253,15 @@ ProgramDatabase FastCall Default + true + true NDEBUG;%(PreprocessorDefinitions) 0x0809 - 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) + winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) true %(IgnoreSpecificDefaultLibraries) true @@ -243,7 +271,15 @@ true MachineX64 true + 5.02 + + os_versions.manifest + PerMonitorHighDPIAware + + + copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" + @@ -253,10 +289,11 @@ - /MP %(AdditionalOptions) + /J /Zc:throwingNew /std:c++latest %(AdditionalOptions) Disabled + true ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;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) EnableFastChecks MultiThreadedDebug @@ -274,13 +311,15 @@ ProgramDatabase Cdecl Default + true + true _DEBUG;%(PreprocessorDefinitions) 0x0809 - 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) + winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) true LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) true @@ -288,25 +327,33 @@ 1048576 1048576 MachineX64 + 5.02 + + os_versions.manifest + PerMonitorHighDPIAware + + + 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_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 f6b938ed7d..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_ICU;U_STATIC_IMPLEMENTATION;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" @@ -122,6 +122,8 @@ /> @@ -1558,6 +1566,10 @@ RelativePath=".\..\src\safeguards.h" > + + @@ -1942,6 +1954,14 @@ RelativePath=".\..\src\core\bitmath_func.hpp" > + + + + @@ -2734,6 +2754,10 @@ RelativePath=".\..\src\saveload\saveload_internal.h" > + + @@ -3334,6 +3358,14 @@ RelativePath=".\..\src\script\api\script_cargomonitor.hpp" > + + + + @@ -3598,6 +3630,14 @@ RelativePath=".\..\src\script\api\script_cargomonitor.cpp" > + + + + @@ -4496,7 +4536,7 @@ > diff --git a/projects/openttd_vs80.vcproj.in b/projects/openttd_vs80.vcproj.in deleted file mode 100644 index 57938f9e91..0000000000 --- a/projects/openttd_vs80.vcproj.in +++ /dev/null @@ -1,446 +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 84e6fffa3c..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_ICU;U_STATIC_IMPLEMENTATION;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" @@ -121,6 +121,8 @@ /> @@ -1555,6 +1563,10 @@ RelativePath=".\..\src\safeguards.h" > + + @@ -1939,6 +1951,14 @@ RelativePath=".\..\src\core\bitmath_func.hpp" > + + + + @@ -2731,6 +2751,10 @@ RelativePath=".\..\src\saveload\saveload_internal.h" > + + @@ -3331,6 +3355,14 @@ RelativePath=".\..\src\script\api\script_cargomonitor.hpp" > + + + + @@ -3595,6 +3627,14 @@ RelativePath=".\..\src\script\api\script_cargomonitor.cpp" > + + + + @@ -4493,7 +4533,7 @@ > diff --git a/projects/openttd_vs90.vcproj.in b/projects/openttd_vs90.vcproj.in deleted file mode 100644 index 2793927bdb..0000000000 --- a/projects/openttd_vs90.vcproj.in +++ /dev/null @@ -1,443 +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/os_versions.manifest b/projects/os_versions.manifest new file mode 100644 index 0000000000..52ed17bcb9 --- /dev/null +++ b/projects/os_versions.manifest @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + 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_vs141.vcxproj similarity index 94% rename from projects/settings_vs100.vcxproj rename to projects/settings_vs141.vcxproj index 61b289757a..ed6f5bab18 100644 --- a/projects/settings_vs100.vcxproj +++ b/projects/settings_vs141.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -14,6 +14,7 @@ Makefile + v141 @@ -27,7 +28,6 @@ - <_ProjectFileVersion>10.0.30319.1 ..\objs\settings\table\ ..\objs\settings\table\ $(SettingsCommandLine) diff --git a/projects/settings_vs100.vcxproj.filters b/projects/settings_vs141.vcxproj.filters similarity index 100% rename from projects/settings_vs100.vcxproj.filters rename to projects/settings_vs141.vcxproj.filters diff --git a/projects/settings_vs100.vcxproj.filters.in b/projects/settings_vs141.vcxproj.filters.in similarity index 100% rename from projects/settings_vs100.vcxproj.filters.in rename to projects/settings_vs141.vcxproj.filters.in diff --git a/projects/settings_vs100.vcxproj.in b/projects/settings_vs141.vcxproj.in similarity index 93% rename from projects/settings_vs100.vcxproj.in rename to projects/settings_vs141.vcxproj.in index 46064b53cf..e4a60227cb 100644 --- a/projects/settings_vs100.vcxproj.in +++ b/projects/settings_vs141.vcxproj.in @@ -1,5 +1,5 @@  - + Debug @@ -14,6 +14,7 @@ Makefile + v141 @@ -27,7 +28,6 @@ - <_ProjectFileVersion>10.0.30319.1 ..\objs\settings\table\ ..\objs\settings\table\ $(SettingsCommandLine) 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_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_vs100.vcxproj b/projects/settingsgen_vs141.vcxproj similarity index 93% rename from projects/settingsgen_vs100.vcxproj rename to projects/settingsgen_vs141.vcxproj index 30454d81f8..2b356f2eab 100644 --- a/projects/settingsgen_vs100.vcxproj +++ b/projects/settingsgen_vs141.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -15,6 +15,7 @@ Application MultiByte + v141 @@ -55,6 +56,7 @@ Console + 5.01 @@ -78,4 +80,4 @@ - \ No newline at end of file + diff --git a/projects/settingsgen_vs100.vcxproj.filters b/projects/settingsgen_vs141.vcxproj.filters similarity index 100% rename from projects/settingsgen_vs100.vcxproj.filters rename to projects/settingsgen_vs141.vcxproj.filters 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_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_vs100.vcxproj b/projects/strgen_vs141.vcxproj similarity index 94% rename from projects/strgen_vs100.vcxproj rename to projects/strgen_vs141.vcxproj index 7a43b4debb..addc6f10a5 100644 --- a/projects/strgen_vs100.vcxproj +++ b/projects/strgen_vs141.vcxproj @@ -1,5 +1,5 @@ - - + + Debug @@ -16,6 +16,7 @@ Application false MultiByte + v141 @@ -25,7 +26,6 @@ - <_ProjectFileVersion>10.0.30319.1 $(SolutionDir)..\objs\strgen\ $(SolutionDir)..\objs\strgen\ false @@ -70,6 +70,7 @@ MachineX86 + 5.01 diff --git a/projects/strgen_vs100.vcxproj.filters b/projects/strgen_vs141.vcxproj.filters similarity index 100% rename from projects/strgen_vs100.vcxproj.filters rename to projects/strgen_vs141.vcxproj.filters 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_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_vs100.vcxproj b/projects/version_vs141.vcxproj similarity index 92% rename from projects/version_vs100.vcxproj rename to projects/version_vs141.vcxproj index 008e6dd665..5d8ee8c74f 100644 --- a/projects/version_vs100.vcxproj +++ b/projects/version_vs141.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -15,6 +15,7 @@ Makefile MultiByte + v141 @@ -24,7 +25,6 @@ - <_ProjectFileVersion>10.0.30319.1 $(SolutionDir)..\objs\version\ $(SolutionDir)..\objs\version\ cscript "$(ProjectDir)/determineversion.vbs" @@ -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/readme.txt b/readme.txt deleted file mode 100644 index 817f397b51..0000000000 --- a/readme.txt +++ /dev/null @@ -1,734 +0,0 @@ -Last updated: 2015-02-24 -Release version: 1.5.0-beta2 ------------------------------------------------------------------------- - - -Table of contents ------------------ -1.0) About -2.0) Contacting - * 2.1) Reporting bugs - * 2.2) Reporting desyncs -3.0) Supported platforms -4.0) Installing and running OpenTTD - * 4.1) (Required) 3rd party files - * 4.2) OpenTTD directories - * 4.3) Portable installations (portable media) - * 4.4) Files in tar (archives) -5.0) OpenTTD features - * 5.1) Logging of potentially dangerous actions -6.0) Configuration file -7.0) Compiling - * 7.1) Required/optional libraries - * 7.2) Supported compilers - * 7.3) Compilation of base sets -8.0) Translating - * 8.1) Translation - * 8.2) Previewing -9.0) Troubleshooting -10.0) Licensing -X.X) Credits - - -1.0) About ----- ----- -OpenTTD is a transport simulation game based upon the popular game Transport -Tycoon Deluxe, written by Chris Sawyer. It attempts to mimic the original -game as closely as possible while extending it with new features. - -OpenTTD is licensed under the GNU General Public License version 2.0, -but includes some 3rd party software under different licenses. See the -section "Licensing" below for details. - -2.0) Contacting ----- ---------- -The easiest way to contact the OpenTTD team is by submitting bug reports or -posting comments in our forums. You can also chat with us on IRC (#openttd -on irc.oftc.net). - -The OpenTTD homepage is http://www.openttd.org/. - -You can also find the OpenTTD forums at -http://forum.openttd.org/ - -2.1) Reporting bugs ----- -------------- -First of all, check whether the bug is not already known. Do this by looking -through the file called 'known-bugs.txt' which is distributed with OpenTTD -like this readme. - -For tracking our bugs we are using a bug tracker called Flyspray. You can find -the tracker at http://bugs.openttd.org/. Before actually reporting take a look -through the already reported bugs there to see if the bug is already known. -The 'known-bugs.txt' file might be a bit outdated at the moment you are -reading it as only bugs known before the release are documented there. Also -look through the recently closed bugs. - -When you are sure it is not already reported you should: - * Make sure you are running a recent version, i.e. run the latest stable or - nightly based on where you found the bug. - * Make sure you are not running a non-official binary, like a patch pack. - When you are playing with a patch pack you should report any bugs to the - forum thread related to that patch pack. - * Make it reproducible for the developers. In other words, create a savegame - in which you can reproduce the issue once loaded. It is very useful to give - us the crash.dmp, crash.sav, crash.log and crash screenshot which are - created on crashes. - * Check whether the bug is already reported on our bug tracker. This includes - searching for recently closed bug reports as the bug might already be fixed. - -After you have done all that you can report the bug. Please include the -following information in your bug report: - * OpenTTD version (PLEASE test the latest SVN/nightly build) - * Bug details, including instructions how to reproduce it - * Platform (Windows, Linux, FreeBSD, ...) and compiler (including version) if - you compiled OpenTTD yourself. - * The processor architecture of your OS (32 bits Windows, 64 bits Windows, - Linux on an ARM, Mac OS X on a PowerPC, ...) - * Attach a saved game *and* a screenshot if possible - * If this bug only occurred recently please note the last version without - the bug and the first version including the bug. That way we can fix it - quicker by looking at the changes made. - * Attach crash.dmp, crash.log and crash.sav. These files are usually created - next to your openttd.cfg. The crash handler will tell you the location. - -2.2) Reporting desyncs ----- ----------------- -As desyncs are hard to make reproducible OpenTTD has the ability to log all -actions done by clients so we can replay the whole game in an effort to make -desyncs better reproducible. You need to turn this ability on. When turned -on an automatic savegame will be made once the map has been constructed in -the 'save/autosave' directory, see OpenTTD directories to know where to find -this directory. Furthermore the log file 'commands-out.log' will be created -and all actions will be written to there. - -To enable the desync debugging you need to set the debug level for 'desync' -to at least 1. You do this by starting OpenTTD with '-d desync=' as -parameter or by typing 'debug_level desync=' in OpenTTD's internal -console. -The desync debug levels are: - 0: nothing. - 1: dumping of commands to 'commands-out.log'. - 2: same as 1 plus checking vehicle caches and dumping that too. - 3: same as 2 plus monthly saves in autosave. - 4 and higher: same as 3 - -Restarting OpenTTD will overwrite 'commands-out.log'. OpenTTD will not remove -the savegames (dmp_cmds_*.sav) made by the desync debugging system, so you -have to occasionally remove them yourself! - -The naming format of the desync savegames is as follows: -dmp_cmds_XXXXXXXX_YYYYYYYY.sav. The XXXXXXXX is the hexadecimal representation -of the generation seed of the game and YYYYYYYY is the hexadecimal -representation of the date of the game. This sorts the savegames by game and -then by date making it easier to find the right savegames. - -When a desync has occurred with the desync debugging turned on you should file -a bug report with the following files attached: - - commands-out.log as it contains all the commands that were done - - the last saved savegame (search for the last line beginning with - 'save: dmp_cmds_' in commands-out.log). We use this savegame to check - whether we can quickly reproduce the desync. Otherwise we will need... - - the first saved savegame (search for the first line beginning with 'save' - where the first part, up to the last underscore '_', is the same). We need - this savegame to be able to reproduce the bug when the last savegame is not - old enough. If you loaded a scenario or savegame you need to attach that. - - optionally you can attach the savegames from around 50%, 75%, 85%, 90% and - 95% of the game's progression. We can use these savegames to speed up the - reproduction of the desync, but we should be able to reproduce these - savegames based on the first savegame and commands-out.log. - - in case you use any NewGRFs you should attach the ones you used unless - we can easily find them ourselves via bananas or when they are in the - #openttdcoop pack. - -Do NOT remove the dmp_cmds savegames of a desync you have reported until the -desync has been fixed; if you, by accident, send us the wrong savegames we -will not be able to reproduce the desync and thus will be unable to fix it. - - -3.0) Supported platforms ----- ------------------- -OpenTTD has been ported to several platforms and operating systems. It should -not be very difficult to port it to a new platform. The currently working -platforms are: - - BeOS - SDL or Allegro - DOS - Allegro - FreeBSD - SDL - Linux - SDL or Allegro - MacOS X (universal) - Cocoa video and sound drivers - MorphOS - SDL - OpenBSD - SDL - OS/2 - SDL - Windows - Win32 GDI (faster) or SDL or Allegro - - -4.0) Installing and running OpenTTD ----- ------------------------------ -Installing OpenTTD is fairly straightforward. Either you have downloaded an -archive which you have to extract to a directory where you want OpenTTD to -be installed, or you have downloaded an installer, which will automatically -extract OpenTTD in the given directory. - -OpenTTD looks in multiple locations to find the required data files (described -in section 4.2). Installing any 3rd party files into a 'shared' location has -the advantage that you only need to do this step once, rather than copying the -data files into all OpenTTD versions you have. -Savegames, screenshots, etc are saved relative to the config file (openttd.cfg) -currently being used. This means that if you use a config file in one of the -shared directories, savegames will reside in the save/ directory next to the -openttd.cfg file there. -If you want savegames and screenshots in the directory where the OpenTTD binary -resides, simply have your config file in that location. But if you remove this -config file, savegames will still be in this directory (see notes in -section 4.2 'OpenTTD directories') - -OpenTTD comes without AIs, so if you want to play with AIs you have to download -them. The easiest way is via the 'Check Online Content' button in the main menu. -You can select some AIs that you think are compatible with your playing style. -Another way is manually downloading the AIs from the forum although then you -need to make sure that you install all the required AI libraries too; they get -automatically selected (and downloaded) if you get the AIs via the 'Check -Online Content'. If you do not have an AI but have configured OpenTTD to start -an AI a message will be shown that the 'dummy' AI has been started. - -4.1) (Required) 3rd party files ----- -------------------------- -Before you run OpenTTD, you need to put the game's data files into a baseset/ -directory which can be located in various places addressed in the following -section. - -For OpenTTD you need to acquire some third party data files. For this you have -the choice of using the original Transport Tycoon Deluxe data files or a set -of free data files. - -Do NOT copy files included with OpenTTD into 'shared' directories (explained in -the following sections) as sooner or later you will run into graphical glitches -when using other versions of the game. - -4.1.1) Free graphics and sound files ------- ----------------------------- -The free data files, split into OpenGFX for graphics, OpenSFX for sounds and -OpenMSX for music can be found at: - - http://www.openttd.org/download-opengfx for OpenGFX - - http://www.openttd.org/download-opensfx for OpenSFX - - http://www.openttd.org/download-openmsx for OpenMSX -Please follow the readme of these packages about the installation procedure. -The Windows installer can optionally download and install these packages. - -4.1.2) Original Transport Tycoon Deluxe graphics and sound files ------- --------------------------------------------------------- -If you want to play with the original Transport Tycoon Deluxe data files you -have to copy the data files from the CD-ROM into the baseset/ directory. It -does not matter whether you copy them from the DOS or Windows version of -Transport Tycoon Deluxe. The Windows install can optionally copy these files. -You need to copy the following files: - - sample.cat - - trg1r.grf or TRG1.GRF - - trgcr.grf or TRGC.GRF - - trghr.grf or TRGH.GRF - - trgir.grf or TRGI.GRF - - trgtr.grf or TRGT.GRF - -4.1.3) Original Transport Tycoon Deluxe music ------- -------------------------------------- -If you want the Transport Tycoon Deluxe music, copy the files from the gm/ -folder from the Windows version of Transport Tycoon Deluxe to the baseset -folder in your OpenTTD folder (also explained in the following sections). -The music from the DOS version as well as the original Transport Tycoon does -not work. - -4.1.4) AIs ------- --- -If you want AIs use the in-game content downloader. If for some reason that is -not possible or you want to use an AI that has not been uploaded to the content -download system download the tar file and place it in the ai/ directory. If the -AI needs libraries you will have to download those too and put them in the -ai/library/ directory. All AIs and AI Libraries that have been uploaded to -the content download system can be found at http://noai.openttd.org/downloads/ -The AIs and libraries can be found their in the form of .tar.gz packages. -OpenTTD can read inside tar files but it does not extract .tar.gz files by -itself. -To figure out which libraries you need for an AI you have to start the AI and -wait for an error message to pop up. The error message will tell you -'could not find library "lib-name"'. Download that library and try again. - -4.1.5) Game scripts ------- ------------ -If you want an extra challenge in OpenTTD you can download so-called game -scripts via the in-game content downloader. These game scripts have varying -functionality, though they can generally influence town growth, subsidies, add -goals to reach or provide a different ranking system. -If you download a game script manually you have to follow the same rules as for -AIs, except that game scripts are placed in the game/ directory instead of the -ai/ directory. - - -4.2) OpenTTD directories ----- ------------------- -OpenTTD uses its own directory to store its required 3rd party base set files -(see section 4.1 'Required 3rd party files') and non-compulsory extension and -configuration files. See below for their proper place within this OpenTTD main -data directory. - -The main OpenTTD directories can be found in various locations, depending on -your operating system: - 1. The current working directory (from where you started OpenTTD) - For non-Windows operating systems OpenTTD will not scan for files in this - directory if it is your personal directory, i.e. '~/', or when it is the - root directory, i.e. '/'. - 2. Your personal directory - Windows: C:\My Documents\OpenTTD (95, 98, ME) - C:\Documents and Settings\\My Documents\OpenTTD (2000, XP) - C:\Users\\Documents\OpenTTD (Vista, 7) - Mac OSX: ~/Documents/OpenTTD - Linux: $XDG_DATA_HOME/openttd which is usually ~/.local/share/openttd when - built with XDG base directory support, otherwise ~/.openttd - 3. The shared directory - Windows: C:\Documents and Settings\All Users\Shared Documents\OpenTTD (2000, XP) - C:\Users\Public\Documents\OpenTTD (Vista, 7) - Mac OSX: /Library/Application Support/OpenTTD - Linux: not available - 4. The binary directory (where the OpenTTD executable is) - Windows: C:\Program Files\OpenTTD - Linux: /usr/games - 5. The installation directory (Linux only) - Linux: /usr/share/games/openttd - 6. The application bundle (Mac OSX only) - It includes the OpenTTD files (grf+lng) and it will work as long as they - are not touched - -Different types of data or extensions go into different subdirectories of the -chosen main OpenTTD directory: - Config File: (no subdirectory) - Screenshots: screenshot - Base Graphics: baseset (or a subdirectory thereof) - Sound Sets: baseset (or a subdirectory thereof) - NewGRFs: newgrf (or a subdirectory thereof) - 32bpp Sets: newgrf (or a subdirectory thereof) - Music Sets: baseset (or a subdirectory thereof) - AIs: ai (or a subdirectory thereof) - AI Libraries: ai/library (or a subdirectory thereof) - Game Scripts (GS): game (or a subdirectory thereof) - GS Libraries: game/library (or a subdirectory thereof) - Savegames: save - Automatic Savegames: save/autosave - Scenarios: scenario - -The (automatically created) directory content_download is for OpenTTD's internal -use and no files should be added to it or its subdirectories manually. - -Notes: - - Linux in the previous list means .deb, but most paths should be similar for - others. - - The previous search order is also used for NewGRFs and openttd.cfg. - - If openttd.cfg is not found, then it will be created using the 2, 4, 1, 3, - 5 order. When built with XDG base directory support, openttd.cfg will be - created in $XDG_CONFIG_HOME/openttd which is usually ~/.config/openttd. - - Savegames will be relative to the config file only if there is no save/ - directory in paths with higher priority than the config file path, but - autosaves and screenshots will always be relative to the config file. - Unless the configuration file is in $XDG_CONFIG_HOME/openttd, then all - other files will be saved under $XDG_DATA_HOME/openttd. - -The preferred setup: -Place 3rd party files in shared directory (or in personal directory if you do -not have write access on shared directory) and have your openttd.cfg config -file in personal directory (where the game will then also place savegames and -screenshots). - -4.3) Portable installations (portable media) ----- --------------------------------------- -You can install OpenTTD on external media so you can take it with you, i.e. -using a USB key, or a USB HDD, etc. -Create a directory where you shall store the game in (i.e. OpenTTD/). -Copy the binary (OpenTTD.exe, OpenTTD.app, openttd, etc), baseset/ and your -openttd.cfg to this directory. -You can copy binaries for any operating system into this directory, which will -allow you to play the game on nearly any computer you can attach the external -media to. -As always - additional grf files are stored in the newgrf/ dir (for details, -again, see section 4.1). - -4.4) Files in tar (archives) ----- ----------------------- -OpenTTD can read files that are in an uncompressed tar (archive), which -makes it easy to bundle files belonging to the same script, NewGRF or base -set. Music sets are the only exception as they cannot be stored in a tar -file due to being played by external applications. - -OpenTTD sees each tar archive as the 'root' of its search path. This means that -having a file with the same path in two different tar files means that one -cannot be opened, after all only one file will be found first. As such it is -advisable to put an uniquely named folder in the root of the tar and put all the -content in that folder. For example, all downloaded content has a path that -concatenates the name of the content and the version, which makes the path -unique. For custom tar files it is advised to do this as well. - -The normal files are also referred to by their relative path from the search -directory, this means that also normal files could hide files in a tar as -long as the relative path from the search path of the normal file is the -same as the path in the tar file. Again it is advised to have an unique path -to the normal file so they do not collide with the files from other tar -files. - - -5.0) OpenTTD features ----- ---------------- -OpenTTD has a lot of features going beyond the original Transport Tycoon Deluxe -emulation. Unfortunately, there is currently no comprehensive list of features, -but there is a basic features list on the web, and some optional features can be -controlled through the Advanced Settings dialog. We also implement some -features known from TTDPatch (http://www.ttdpatch.net/). - -Several important non-standard controls: - -* Ctrl modifies many commands and makes them more powerful. For example Ctrl - clicking on signals with the build signal tool changes their behaviour, holding - Ctrl while the track build tool is activated changes it to the track removal - tool, and so on. See http://wiki.openttd.org/Hidden_features for a non- - comprehensive list or look at the tooltips. -* Ingame console. More information at - http://wiki.openttd.org/index.php/Console -* Hovering over a GUI element shows tooltips. This can be changed to right click - via the advanced settings. - -5.1) Logging of potentially dangerous actions ----- ---------------------------------------- -OpenTTD is a complex program, and together with NewGRF, it may show a buggy -behaviour. But not only bugs in code can cause problems. There are several -ways to affect game state possibly resulting in program crash or multiplayer -desyncs. -Easier way would be to forbid all these unsafe actions, but that would affect -game usability for many players. We certainly do not want that. -However, we receive bug reports because of this. To reduce time spent with -solving these problems, these potentially unsafe actions are logged in -the savegame (including crash.sav). Log is stored in crash logs, too. - -Information logged: - -* Adding / removing / changing order of NewGRFs -* Changing NewGRF parameters, loading compatible NewGRF -* Changing game mode (scenario editor <-> normal game) -* Loading game saved in a different OpenTTD / TTDPatch / Transport Tycoon Deluxe / - original Transport Tycoon version -* Running a modified OpenTTD build -* Changing settings affecting NewGRF behaviour (non-network-safe settings) -* Triggering NewGRF bugs - -No personal information is stored. - -You can show the game log by typing 'gamelog' in the console or by running -OpenTTD in debug mode. - - -6.0) Configuration file ----- ------------------ -The configuration file for OpenTTD (openttd.cfg) is in a simple Windows-like -.INI format. It is mostly undocumented. Almost all settings can be changed -ingame by using the 'Advanced Settings' window. -When you cannot find openttd.cfg you should look in the directories as -described in section 4.2. If you do not have an openttd.cfg OpenTTD will -create one after closing. - - -7.0) Compiling ----- --------- -Windows: - You need Microsoft Visual Studio .NET. 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 http://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. - - You can also build it using the Makefile with MSYS/MinGW or Cygwin/MinGW. - Please read the Makefile for more information. - -Solaris, FreeBSD, OpenBSD: - Use 'gmake', but do a './configure' before the first build. - -Linux/Unix: - OpenTTD can be built with GNU 'make'. On non-GNU systems it is called 'gmake'. - However, for the first build one has to do a './configure' first. - -MacOS X: - Use 'make' or Xcode (which will then call make for you) - This will give you a binary for your CPU type (PPC/Intel) - However, for the first build one has to do a './configure' first. - To make a universal binary type './configure --enabled-universal' - instead of './configure'. - -BeOS: - Use 'make', but do a './configure' before the first build. - -MorphOS: - Use 'make'. However, for the first build one has to do a './configure' first. - Note that you need the MorphOS SDK, latest libnix updates (else C++ parts of - OpenTTD will not build) and the powersdl.library SDK. Optionally libz, - libpng and freetype2 developer files. - -OS/2: - A comprehensive GNU build environment is required to build the OS/2 version. - See the docs/Readme_OS2.txt file for more information. - -DOS: - A build environment with DJGPP is needed as well as libraries such as - Allegro, zlib and libpng, which all can be downloaded from the DJGPP - website. Compilation is straight forward: use make, but do a './configure' - before the first build. The build binary will need cwsdpmi.exe to be in - the same directory as the openttd executable. cwsdpmi.exe can be found in - the os/dos/cwsdpmi subdirectory. If you compile with stripping turned on a - binary will be generated that does not need cwsdpmi.exe by adding the - cswdstub.exe to the created OpenTTD binary. - -7.1) Required/optional libraries ----- --------------------------- -The following libraries are used by OpenTTD for: - - libSDL/liballegro: hardware access (video, sound, mouse) - - zlib: (de)compressing of old (0.3.0-1.0.5) savegames, content downloads, - heightmaps - - liblzo2: (de)compressing of old (pre 0.3.0) savegames - - liblzma: (de)compressing of savegames (1.1.0 and later) - - libpng: making screenshots and loading heightmaps - - libfreetype: loading generic fonts and rendering them - - libfontconfig: searching for fonts, resolving font names to actual fonts - - libicu: handling of right-to-left scripts (e.g. Arabic and Persian) and - natural sorting of strings. - -OpenTTD does not require any of the libraries to be present, but without -liblzma you cannot open most recent savegames and without zlib you cannot -open most older savegames or use the content downloading system. -Without libSDL/liballegro on non-Windows and non-MacOS X machines you have -no graphical user interface; you would be building a dedicated server. - -7.2) Supported compilers ----- ------------------- -The following compilers are known to compile OpenTTD: - - Microsoft Visual C++ (MSVC) 2005, 2008 and 2010. - Version 2005 gives bogus warnings about scoping issues. - - GNU Compiler Collection (GCC) 3.3 - 4.4, 4.6 - 4.8. - Versions 4.1 and earlier give bogus warnings about uninitialised variables. - Versions 4.4, 4.6 give bogus warnings about freeing non-heap objects. - Versions 4.6 and later give invalid warnings when lto is enabled. - - Intel C++ Compiler (ICC) 12.0. - - Clang/LLVM 2.9 - 3.0 - Version 2.9 gives bogus warnings about code nonconformity. - -The following compilers are known not to compile OpenTTD: - - Microsoft Visual C++ (MSVC) 2003 and earlier. - - GNU Compiler Collection (GCC) 3.2 and earlier. - These old versions fail due to OpenTTD's template usage. - - GNU Compiler Collection (GCC) 4.5. It optimizes enums too aggressively. - See http://bugs.openttd.org/task/5513 and references therein. - - Intel C++ Compiler (ICC) 11.1 and earlier. - Version 10.0 and earlier fail a configure check and fail with recent system - headers. - Version 10.1 fails to compile station_gui.cpp. - Version 11.1 fails with an internal error when compiling network.cpp. - - Clang/LLVM 2.8 and earlier. - - (Open) Watcom. - -If any of these compilers can compile OpenTTD again, please let us know. -Patches to support more compilers are welcome. - -7.3) Compilation of base sets ------------------------------ -To recompile the extra graphics needed to play with the original Transport -Tycoon Deluxe graphics you need GRFCodec (which includes NFORenum) as well. -GRFCodec can be found at: http://www.openttd.org/download-grfcodec -The compilation of these extra graphics does generally not happen, unless -you remove the graphics file using 'make maintainer-clean'. - -Re-compilation of the base sets, thus also use of --maintainer-clean can -leave the repository in a modified state as different grfcodec versions can -cause binary differences in the resulting grf. Also translations might have -been added for the base sets which are not yet included in the base set -information files. Use the configure option --without-grfcodec to avoid -modification of the base set files by the build process. - - -8.0) Translating ----- ----------- -See http://www.openttd.org/development for up-to-date information. - -The use of the online Translator service, located at -http://translator.openttd.org/, is highly encouraged. For getting an account -simply follow the guidelines in the FAQ of the translator website. - -If for some reason the website is down for a longer period of time, the -information below might be of help. - -Please contact the translations manager (http://www.openttd.org/contact) -before beginning the translation process! This avoids double work, as -someone else may have already started translating to the same language. - -8.1) Translation ----- ----------- -So, now that you have notified the development team about your intention to -translate (You did, right? Of course you did.) you can pick up english.txt -(found in the SVN repository under /src/lang) and translate. - -You must change the first two lines of the file appropriately: - -##name English-Name-Of-Language -##ownname Native-Name-Of-Language - -Note: Do not alter the following parts of the file: - - * String identifiers (the first word on each line) - * Parts of the strings which are in curly braces (such as {STRING}) - * Lines beginning with ## (such as ##id), other than the first two lines of - the file - -8.2) Previewing ----- ---------- -In order to view the translation in the game, you need to compile your language -file with the strgen utility. As this utility is tailored to a specific OpenTTD -version, you need to compile it yourself. Just take the normal OpenTTD sources -and build that. During the build process the strgen utility will be made. - -strgen is a command-line utility. It takes the language filename as parameter. -Example: - -strgen lang/german.txt - -This results in compiling german.txt and produces another file named german.lng. -Any missing strings are replaced with the English strings. Note that it looks -for english.txt in the lang subdirectory, which is where your language file -should also be. - -That is all! You should now be able to select the language in the game options. - - -9.0) Troubleshooting ----- --------------- -To see all startup options available to you, start OpenTTD with the -'./openttd -h' option. This might help you tweak some of the settings. - -If the game is acting strange and you feel adventurous you can try the -'-d [[=]]' flag, where the higher levels will give you more -debugging output. The 'name' variable can help you to display only some type of -debugging messages. This is mostly undocumented so best is to look in the -source code file debug.c for the various debugging types. For more information -look at http://wiki.openttd.org/index.php/Command_line. - -The most frequent problem is missing data files. Please install OpenGFX and -possibly OpenSFX and OpenMSX. See section 4.1.1 for more information. - -Under certain circumstance, especially on Ubuntu OpenTTD can be extremely slow -and/or freeze. See known-bugs.txt for more information and how to solve this -problem on your computer. - -Under Windows 98 and lower it is impossible to use a dedicated server; it will -fail to start. Perhaps this is for the better because those OSes are not known -for their stability. - -With the added support for font-based text selecting a non-latin language can -result in lots of question marks ('?') being shown on screen. Please open your -configuration file (openttd.cfg - see Section 4.2 for where to find it) -and add a suitable font for the small, medium and / or large font, e.g.: - small_font = "Tahoma" - medium_font = "Tahoma" - large_font = "Tahoma" -You should use a font name like 'Tahoma' or a path to the desired font. - -Any NewGRF file used in a game is stored inside the savegame and will refuse -to load if you do not have that NewGRF file available. A list of missing files -can be viewed in the NewGRF window accessible from the file load dialogue window. - -You can try to obtain the missing files from that NewGRF dialogue or - if they -are not available online - you can search manually through our forum's graphics -development section (http://www.tt-forums.net/viewforum.php?f=66) or GrfCrawler -(http://grfcrawler.tt-forums.net/). Put the NewGRF files in OpenTTD's newgrf folder -(see section 4.2 'OpenTTD directories') and rescan the list of available NewGRFs. -Once you have all missing files, you are set to go. - -10.0) Licensing ------ --------- -OpenTTD is licensed under the GNU General Public License version 2.0. For -the complete license text, see the file 'COPYING'. This license applies -to all files in this distribution, except as noted below. - -The squirrel implementation in src/3rdparty/squirrel is licensed under -the Zlib license. See src/3rdparty/squirrel/COPYRIGHT for the complete -license text. - -The md5 implementation in src/3rdparty/md5 is licensed under the Zlib -license. See the comments in the source files in src/3rdparty/md5 for -the complete license text. - -The implementations of Posix getaddrinfo and getnameinfo for OS/2 in -src/3rdparty/os2 are distributed partly under the GNU Lesser General Public -License 2.1, and partly under the (3-clause) BSD license. The exact licensing -terms can be found in src/3rdparty/os2/getaddrinfo.c resp. -src/3rdparty/os2/getnameinfo.c. - -The exe2coff implementation in os/dos/exe2coff is available under the -GPL, with a number of additional terms. See os/dos/exe2coff/copying and -os/dos/exe2coff/copying.dj for the exact licensing terms. - -The CWSDPMI implementation in os/dos/cwsdpmi is distributed under a -custom binary-only license that prohibits modification. The exact -licensing terms can be found in os/dos/cwsdpmi/cwsdpmi.txt. The sources -for these files can be downloaded at its author site, at: -http://homer.rice.edu/~sandmann/cwsdpmi/csdpmi5s.zip - -X.X) Credits ----- ------- -The OpenTTD team (in alphabetical order): - Albert Hofkamp (Alberth) - GUI expert (since 0.7) - Matthijs Kooijman (blathijs) - Pathfinder-guru, Debian port (since 0.3) - Ulf Hermann (fonsinchen) - Cargo Distribution (since 1.3) - 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) - 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) - Remko Bijker (Rubidium) - Lead coder and way more (since 0.4.5) - José Soler (Terkhen) - General coding (since 1.0) - Leif Linse (Zuu) - AI/Game Script (since 1.2) - -Inactive Developers: - Jean-François Claeys (Belugas) - GUI, newindustries and more (0.4.5 - 1.0) - Bjarni Corfitzen (Bjarni) - MacOSX port, coder and vehicles (0.3 - 0.7) - Victor Fischer (Celestar) - Programming everywhere you need him to (0.3 - 0.6) - Jaroslav Mazanec (KUDr) - YAPG (Yet Another Pathfinder God) ;) (0.4.5 - 0.6) - Jonathan Coome (Maedhros) - High priest of the NewGRF Temple (0.5 - 0.6) - Attila Bán (MiHaMiX) - WebTranslator 1 and 2 (0.3 - 0.5) - Zdeněk Sojka (SmatZ) - Bug finder and fixer (0.6 - 1.3) - Christoph Mallon (Tron) - Programmer, code correctness police (0.3 - 0.5) - Patric Stout (TrueBrain) - NoProgrammer (0.3 - 1.2), sys op (active) - Thijs Marinussen (Yexo) - AI Framework, General (0.6 - 1.3) - -Retired Developers: - Tamás Faragó (Darkvater) - Ex-Lead coder (0.3 - 0.5) - Dominik Scherer (dominik81) - Lead programmer, GUI expert (0.3 - 0.3) - Emil Djupfeld (egladil) - MacOSX port (0.4 - 0.6) - Simon Sasburg (HackyKid) - Bug fixer (0.4 - 0.4.5) - Ludvig Strigeus (ludde) - Original author of OpenTTD, main coder (0.1 - 0.3) - Cian Duffy (MYOB) - BeOS port / manual writing (0.1 - 0.3) - Petr Baudiš (pasky) - Many patches, newgrf support, etc. (0.3 - 0.3) - Benedikt Brüggemeier (skidd13) - Bug fixer and code reworker (0.6 - 0.7) - Serge Paquet (vurlix) - 2nd contributor after ludde (0.1 - 0.3) - -Thanks to: - Josef Drexler - For his great work on TTDPatch. - Marcin Grzegorczyk - For his TTDPatch work and documentation of Transport Tycoon Deluxe internals and track foundations - Stefan Meißner (sign_de) - For his work on the console - Mike Ragsdale - OpenTTD installer - Christian Rosentreter (tokai) - MorphOS / AmigaOS port - Richard Kempton (RichK67) - Additional airports, initial TGP implementation - Alberto Demichelis - Squirrel scripting language - L. Peter Deutsch - MD5 implementation - Michael Blunck - For revolutionizing TTD with awesome graphics - George - Canal graphics - Andrew Parkhouse (andythenorth) - River graphics - David Dallaston (Pikka) - Tram tracks - All Translators - For their support to make OpenTTD a truly international game - Bug Reporters - Thanks for all bug reports - Chris Sawyer - For an amazing game! diff --git a/source.list b/source.list index 62b1dd3f43..d77b549cfd 100644 --- a/source.list +++ b/source.list @@ -95,22 +95,19 @@ tilearea.cpp townname.cpp #if WIN32 #else - #if WINCE + #if OS2 + os/os2/os2.cpp + 3rdparty/os2/getaddrinfo.c + 3rdparty/os2/getaddrinfo.h + 3rdparty/os2/getnameinfo.c + 3rdparty/os2/getnameinfo.h #else - #if OS2 - os/os2/os2.cpp - 3rdparty/os2/getaddrinfo.c - 3rdparty/os2/getaddrinfo.h - 3rdparty/os2/getnameinfo.c - 3rdparty/os2/getnameinfo.h + #if OSX + os/macosx/crashlog_osx.cpp #else - #if OSX - os/macosx/crashlog_osx.cpp - #else - os/unix/crashlog_unix.cpp - #end - os/unix/unix.cpp + os/unix/crashlog_unix.cpp #end + os/unix/unix.cpp #end #end vehicle.cpp @@ -196,6 +193,7 @@ fileio_type.h fios.h fontcache.h fontdetection.h +framerate_type.h base_consist.h gamelog.h gamelog_internal.h @@ -284,6 +282,8 @@ newgrf_townname.h news_func.h news_gui.h news_type.h +music/midi.h +music/midifile.hpp music/null_m.h sound/null_s.h video/null_v.h @@ -310,6 +310,7 @@ road_type.h roadstop_base.h roadveh.h safeguards.h +scope.h screenshot.h sdl.h sound/sdl_s.h @@ -343,7 +344,9 @@ story_type.h strgen/strgen.h string_base.h string_func.h +string_func_extra.h string_type.h +os/windows/string_uniscribe.h stringfilter_type.h strings_func.h strings_type.h @@ -397,6 +400,7 @@ video/win32_v.h window_func.h window_gui.h window_type.h +sound/xaudio2_s.h zoom_func.h zoom_type.h #if WIN32 @@ -405,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 @@ -422,6 +428,8 @@ core/alloc_type.hpp core/backup_type.hpp core/bitmath_func.cpp core/bitmath_func.hpp +core/container_func.hpp +core/dyn_arena_alloc.hpp core/endian_func.hpp core/endian_type.hpp core/enum_type.hpp @@ -461,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 @@ -524,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 @@ -624,6 +634,7 @@ saveload/saveload.cpp saveload/saveload.h saveload/saveload_filter.h saveload/saveload_internal.h +saveload/saveload_buffer.h saveload/signs_sl.cpp saveload/station_sl.cpp saveload/storage_sl.cpp @@ -784,6 +795,8 @@ script/api/script_bridgelist.hpp script/api/script_cargo.hpp script/api/script_cargolist.hpp script/api/script_cargomonitor.hpp +script/api/script_client.hpp +script/api/script_clientlist.hpp script/api/script_company.hpp script/api/script_companymode.hpp script/api/script_controller.hpp @@ -851,6 +864,8 @@ script/api/script_bridgelist.cpp script/api/script_cargo.cpp script/api/script_cargolist.cpp script/api/script_cargomonitor.cpp +script/api/script_client.cpp +script/api/script_clientlist.cpp script/api/script_company.cpp script/api/script_companymode.cpp script/api/script_controller.cpp @@ -911,6 +926,8 @@ script/api/script_window.cpp blitter/32bpp_anim.cpp blitter/32bpp_anim.hpp #if SSE +blitter/32bpp_anim_sse2.cpp +blitter/32bpp_anim_sse2.hpp blitter/32bpp_anim_sse4.cpp blitter/32bpp_anim_sse4.hpp #end @@ -1086,9 +1103,6 @@ video/null_v.cpp #if WIN32 video/win32_v.cpp #end -#if WINCE - video/win32_v.cpp -#end #end # Music @@ -1102,22 +1116,17 @@ video/null_v.cpp #end #end music/null_m.cpp +music/midifile.cpp #if DEDICATED #else #if WIN32 music/win32_m.cpp #else - #if WINCE + #if DOS #else - #if PSP + #if MORPHOS #else - #if DOS - #else - #if MORPHOS - #else - music/extmidi.cpp - #end - #end + music/extmidi.cpp #end #end #end @@ -1127,6 +1136,9 @@ music/null_m.cpp #if LIBTIMIDITY music/libtimidity.cpp #end +#if FLUIDSYNTH + music/fluidsynth.cpp +#end #end # Sound @@ -1141,6 +1153,7 @@ sound/null_s.cpp #end #if WIN32 sound/win32_s.cpp + sound/xaudio2_s.cpp #end #end @@ -1162,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 @@ -1169,10 +1183,7 @@ sound/null_s.cpp #if WIN32 os/windows/crashlog_win.cpp os/windows/ottdres.rc - os/windows/win32.cpp -#end -#if WINCE - os/windows/ottdres.rc + os/windows/string_uniscribe.cpp os/windows/win32.cpp #end diff --git a/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp b/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp index 67b299bcec..540975fb5c 100644 --- a/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp +++ b/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp @@ -119,10 +119,10 @@ static SQInteger _sqstd_aux_printerror(HSQUIRRELVM v) const SQChar *sErr = 0; if(sq_gettop(v)>=1) { if(SQ_SUCCEEDED(sq_getstring(v,2,&sErr))) { - pf(v,"\nAN ERROR HAS OCCURED [%s]\n",sErr); + pf(v,"\nAN ERROR HAS OCCURRED [%s]\n",sErr); } else{ - pf(v,"\nAN ERROR HAS OCCURED [unknown]\n"); + pf(v,"\nAN ERROR HAS OCCURRED [unknown]\n"); } sqstd_printcallstack(v); } diff --git a/src/3rdparty/squirrel/squirrel/sqapi.cpp b/src/3rdparty/squirrel/squirrel/sqapi.cpp index f02fee29f6..0d769bf1f7 100644 --- a/src/3rdparty/squirrel/squirrel/sqapi.cpp +++ b/src/3rdparty/squirrel/squirrel/sqapi.cpp @@ -798,7 +798,8 @@ SQRESULT sq_setdelegate(HSQUIRRELVM v,SQInteger idx) switch(type) { case OT_TABLE: if(type(mt) == OT_TABLE) { - if(!_table(self)->SetDelegate(_table(mt))) return sq_throwerror(v, "delagate cycle"); v->Pop();} + if(!_table(self)->SetDelegate(_table(mt))) return sq_throwerror(v, "delagate cycle"); + v->Pop();} else if(type(mt)==OT_NULL) { _table(self)->SetDelegate(NULL); v->Pop(); } else return sq_aux_invalidtype(v,type); diff --git a/src/3rdparty/squirrel/squirrel/sqdebug.cpp b/src/3rdparty/squirrel/squirrel/sqdebug.cpp index 74272e432a..2f24e83b66 100644 --- a/src/3rdparty/squirrel/squirrel/sqdebug.cpp +++ b/src/3rdparty/squirrel/squirrel/sqdebug.cpp @@ -105,7 +105,7 @@ void SQVM::Raise_IdxError(const SQObject &o) void SQVM::Raise_CompareError(const SQObject &o1, const SQObject &o2) { SQObjectPtr oval1 = PrintObjVal(o1), oval2 = PrintObjVal(o2); - Raise_Error("comparsion between '%.50s' and '%.50s'", _stringval(oval1), _stringval(oval2)); + Raise_Error("comparison between '%.50s' and '%.50s'", _stringval(oval1), _stringval(oval2)); } @@ -115,7 +115,7 @@ void SQVM::Raise_ParamTypeError(SQInteger nparam,SQInteger typemask,SQInteger ty SQInteger found = 0; for(SQInteger i=0; i<16; i++) { - SQInteger mask = 0x00000001 << i; + SQInteger mask = 0x00000001LL << i; if(typemask & (mask)) { if(found>0) StringCat(exptypes,SQString::Create(_ss(this), "|", -1), exptypes); found ++; diff --git a/src/3rdparty/squirrel/squirrel/squtils.h b/src/3rdparty/squirrel/squirrel/squtils.h index 28c6cbec2b..b1138dcb1a 100644 --- a/src/3rdparty/squirrel/squirrel/squtils.h +++ b/src/3rdparty/squirrel/squirrel/squtils.h @@ -90,7 +90,7 @@ public: { _vals[idx].~T(); if(idx < (_size - 1)) { - memmove(&_vals[idx], &_vals[idx+1], sizeof(T) * (_size - (size_t)idx - 1)); + memmove(static_cast(&_vals[idx]), &_vals[idx+1], sizeof(T) * (_size - (size_t)idx - 1)); } _size--; } diff --git a/src/3rdparty/squirrel/squirrel/sqvm.cpp b/src/3rdparty/squirrel/squirrel/sqvm.cpp index 973002b49d..03ffea2303 100644 --- a/src/3rdparty/squirrel/squirrel/sqvm.cpp +++ b/src/3rdparty/squirrel/squirrel/sqvm.cpp @@ -215,7 +215,7 @@ bool SQVM::ObjCmp(const SQObjectPtr &o1,const SQObjectPtr &o2,SQInteger &result) _RET_SUCCEED(_integer(res)) } } - //continues through (no break needed) + FALLTHROUGH; default: _RET_SUCCEED( _userpointer(o1) < _userpointer(o2)?-1:1 ); } @@ -287,6 +287,7 @@ void SQVM::ToString(const SQObjectPtr &o,SQObjectPtr &res) //else keeps going to the default } } + FALLTHROUGH; default: seprintf(buf, lastof(buf),"(%s : 0x%p)",GetTypeName(o),(void*)_rawval(o)); } @@ -377,8 +378,7 @@ bool SQVM::StartCall(SQClosure *closure,SQInteger target,SQInteger args,SQIntege } if (!tailcall) { - CallInfo lc; - memset(&lc, 0, sizeof(lc)); + CallInfo lc = {}; lc._generator = NULL; lc._etraps = 0; lc._prevstkbase = (SQInt32) ( stackbase - _stackbase ); @@ -539,7 +539,7 @@ bool SQVM::FOREACH_OP(SQObjectPtr &o1,SQObjectPtr &o2,SQObjectPtr _generator(o1)->Resume(this, arg_2+1); _FINISH(0); } - /* FALL THROUGH */ + FALLTHROUGH; default: Raise_Error("cannot iterate %s", GetTypeName(o1)); } @@ -769,7 +769,7 @@ exception_restore: ct_stackbase = _stackbase; goto common_call; } - /* FALL THROUGH */ + FALLTHROUGH; case _OP_CALL: { ct_tailcall = false; ct_target = arg0; @@ -1101,7 +1101,7 @@ exception_trap: _lasterror = currerror; return false; } - assert(0); + NOT_REACHED(); } bool SQVM::CreateClassInstance(SQClass *theclass, SQObjectPtr &inst, SQObjectPtr &constructor) @@ -1158,8 +1158,7 @@ bool SQVM::CallNative(SQNativeClosure *nclosure,SQInteger nargs,SQInteger stackb SQInteger oldtop = _top; SQInteger oldstackbase = _stackbase; _top = stackbase + nargs; - CallInfo lci; - memset(&lci, 0, sizeof(lci)); + CallInfo lci = {}; lci._closure = nclosure; lci._generator = NULL; lci._etraps = 0; @@ -1330,7 +1329,7 @@ bool SQVM::Set(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr return true; } } - //keeps going + FALLTHROUGH; case OT_USERDATA: if(_delegable(self)->_delegate) { SQObjectPtr t; diff --git a/src/ai/ai_gui.cpp b/src/ai/ai_gui.cpp index 8944e8bc4f..101a97d0a9 100644 --- a/src/ai/ai_gui.cpp +++ b/src/ai/ai_gui.cpp @@ -28,6 +28,7 @@ #include "../widgets/dropdown_type.h" #include "../widgets/dropdown_func.h" #include "../hotkeys.h" +#include "../core/geometry_func.hpp" #include "ai.hpp" #include "ai_gui.hpp" @@ -305,7 +306,6 @@ struct AISettingsWindow : public Window { timeout(0) { this->ai_config = GetConfig(slot); - this->RebuildVisibleSettings(); this->CreateNestedTree(); this->vscroll = this->GetScrollbar(WID_AIS_SCROLLBAR); @@ -313,7 +313,7 @@ struct AISettingsWindow : public Window { this->SetWidgetDisabledState(WID_AIS_RESET, _game_mode != GM_MENU && Company::IsValidID(this->slot)); - this->vscroll->SetCount((int)this->visible_settings.size()); + this->RebuildVisibleSettings(); } virtual void SetStringParameters(int widget) const @@ -341,6 +341,8 @@ struct AISettingsWindow : public Window { visible_settings.push_back(&(*it)); } } + + this->vscroll->SetCount((int)this->visible_settings.size()); } virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) @@ -530,21 +532,23 @@ struct AISettingsWindow : public Window { virtual void OnQueryTextFinished(char *str) { if (StrEmpty(str)) return; - ScriptConfigItemList::const_iterator it = this->ai_config->GetConfigList()->begin(); + VisibleSettingsList::const_iterator it = this->visible_settings.begin(); for (int i = 0; i < this->clicked_row; i++) it++; - if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (it->flags & SCRIPTCONFIG_INGAME) == 0) return; + const ScriptConfigItem config_item = **it; + if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (config_item.flags & SCRIPTCONFIG_INGAME) == 0) return; int32 value = atoi(str); - this->ai_config->SetSetting((*it).name, value); + this->ai_config->SetSetting(config_item.name, value); this->SetDirty(); } virtual void OnDropdownSelect(int widget, int index) { assert(this->clicked_dropdown); - ScriptConfigItemList::const_iterator it = this->ai_config->GetConfigList()->begin(); + VisibleSettingsList::const_iterator it = this->visible_settings.begin(); for (int i = 0; i < this->clicked_row; i++) it++; - if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (it->flags & SCRIPTCONFIG_INGAME) == 0) return; - this->ai_config->SetSetting((*it).name, index); + const ScriptConfigItem config_item = **it; + if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (config_item.flags & SCRIPTCONFIG_INGAME) == 0) return; + this->ai_config->SetSetting(config_item.name, index); this->SetDirty(); } @@ -766,6 +770,22 @@ struct AIConfigWindow : public Window { this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM; size->height = 8 * this->line_height; break; + + case WID_AIC_CHANGE: { + SetDParam(0, STR_AI_CONFIG_CHANGE_GAMESCRIPT); + Dimension dim = GetStringBoundingBox(STR_AI_CONFIG_CHANGE); + + SetDParam(0, STR_AI_CONFIG_CHANGE_NONE); + dim = maxdim(dim, GetStringBoundingBox(STR_AI_CONFIG_CHANGE)); + + SetDParam(0, STR_AI_CONFIG_CHANGE_AI); + dim = maxdim(dim, GetStringBoundingBox(STR_AI_CONFIG_CHANGE)); + + dim.width += padding.width; + dim.height += padding.height; + *size = maxdim(*size, dim); + break; + } } } diff --git a/src/ai/ai_info.cpp b/src/ai/ai_info.cpp index ec7c896cee..43a4345460 100644 --- a/src/ai/ai_info.cpp +++ b/src/ai/ai_info.cpp @@ -28,12 +28,13 @@ static bool CheckAPIVersion(const char *api_version) { return strcmp(api_version, "0.7") == 0 || strcmp(api_version, "1.0") == 0 || strcmp(api_version, "1.1") == 0 || strcmp(api_version, "1.2") == 0 || strcmp(api_version, "1.3") == 0 || strcmp(api_version, "1.4") == 0 || - strcmp(api_version, "1.5") == 0 || strcmp(api_version, "1.6") == 0; + strcmp(api_version, "1.5") == 0 || strcmp(api_version, "1.6") == 0 || strcmp(api_version, "1.7") == 0 || + 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/ai/ai_scanner.cpp b/src/ai/ai_scanner.cpp index 4eb2071479..5f16de3f91 100644 --- a/src/ai/ai_scanner.cpp +++ b/src/ai/ai_scanner.cpp @@ -114,7 +114,7 @@ AIInfo *AIScannerInfo::FindInfo(const char *nameParam, int versionParam, bool fo *e = '\0'; e++; versionParam = atoi(e); - /* FALL THROUGH, like we were calling this function with a version. */ + /* Continue, like we were calling this function with a version. */ } if (force_exact_match) { diff --git a/src/aircraft.h b/src/aircraft.h index 0805ae8ec6..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. @@ -90,10 +92,10 @@ struct Aircraft FINAL : public SpecializedVehicle { virtual ~Aircraft() { this->PreDestructor(); } void MarkDirty(); - void UpdateDeltaXY(Direction direction); + void UpdateDeltaXY(); ExpensesType GetExpenseType(bool income) const { return income ? EXPENSES_AIRCRAFT_INC : EXPENSES_AIRCRAFT_RUN; } bool IsPrimaryVehicle() const { return this->IsNormalAircraft(); } - SpriteID GetImage(Direction direction, EngineImageType image_type) const; + void GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const; int GetDisplaySpeed() const { return this->cur_speed; } int GetDisplayMaxSpeed() const { return this->vcache.cached_max_speed; } int GetSpeedOldUnits() const { return this->vcache.cached_max_speed * 10 / 128; } @@ -137,11 +139,11 @@ struct Aircraft FINAL : public SpecializedVehicle { }; /** - * Macro for iterating over all aircrafts. + * Macro for iterating over all aircraft. */ #define FOR_ALL_AIRCRAFT(var) FOR_ALL_VEHICLES_OF_TYPE(Aircraft, var) -SpriteID GetRotorImage(const Aircraft *v, EngineImageType image_type); +void GetRotorImage(const Aircraft *v, EngineImageType image_type, VehicleSpriteSeq *result); Station *GetTargetAirportIfValid(const Aircraft *v); diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index edb10af327..b495a1dff5 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -37,12 +37,13 @@ #include "core/backup_type.hpp" #include "zoom_func.h" #include "disaster_vehicle.h" +#include "framerate_type.h" #include "table/strings.h" #include "safeguards.h" -void Aircraft::UpdateDeltaXY(Direction direction) +void Aircraft::UpdateDeltaXY() { this->x_offs = -1; this->y_offs = -1; @@ -152,64 +153,69 @@ static StationID FindNearestHangar(const Aircraft *v) return index; } -SpriteID Aircraft::GetImage(Direction direction, EngineImageType image_type) const +void Aircraft::GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const { uint8 spritenum = this->spritenum; if (is_custom_sprite(spritenum)) { - SpriteID sprite = GetCustomVehicleSprite(this, direction, image_type); - if (sprite != 0) return sprite; + GetCustomVehicleSprite(this, direction, image_type, result); + if (result->IsValid()) return; spritenum = this->GetEngine()->original_image_index; } assert(IsValidImageIndex(spritenum)); - return direction + _aircraft_sprite[spritenum]; + result->Set(direction + _aircraft_sprite[spritenum]); } -SpriteID GetRotorImage(const Aircraft *v, EngineImageType image_type) +void GetRotorImage(const Aircraft *v, EngineImageType image_type, VehicleSpriteSeq *result) { assert(v->subtype == AIR_HELICOPTER); const Aircraft *w = v->Next()->Next(); if (is_custom_sprite(v->spritenum)) { - SpriteID sprite = GetCustomRotorSprite(v, false, image_type); - if (sprite != 0) return sprite; + GetCustomRotorSprite(v, false, image_type, result); + if (result->IsValid()) return; } /* Return standard rotor sprites if there are no custom sprites for this helicopter */ - return SPR_ROTOR_STOPPED + w->state; + result->Set(SPR_ROTOR_STOPPED + w->state); } -static SpriteID GetAircraftIcon(EngineID engine, EngineImageType image_type) +static void GetAircraftIcon(EngineID engine, EngineImageType image_type, VehicleSpriteSeq *result) { const Engine *e = Engine::Get(engine); uint8 spritenum = e->u.air.image_index; if (is_custom_sprite(spritenum)) { - SpriteID sprite = GetCustomVehicleIcon(engine, DIR_W, image_type); - if (sprite != 0) return sprite; + GetCustomVehicleIcon(engine, DIR_W, image_type, result); + if (result->IsValid()) return; spritenum = e->original_image_index; } assert(IsValidImageIndex(spritenum)); - return DIR_W + _aircraft_sprite[spritenum]; + result->Set(DIR_W + _aircraft_sprite[spritenum]); } void DrawAircraftEngine(int left, int right, int preferred_x, int y, EngineID engine, PaletteID pal, EngineImageType image_type) { - SpriteID sprite = GetAircraftIcon(engine, image_type); - const Sprite *real_sprite = GetSprite(sprite, ST_NORMAL); + VehicleSpriteSeq seq; + GetAircraftIcon(engine, image_type, &seq); + + Rect rect; + seq.GetBounds(&rect); preferred_x = Clamp(preferred_x, - left - UnScaleGUI(real_sprite->x_offs), - right - UnScaleGUI(real_sprite->width) - UnScaleGUI(real_sprite->x_offs)); - DrawSprite(sprite, pal, preferred_x, y); + left - UnScaleGUI(rect.left), + right - UnScaleGUI(rect.right)); + + seq.Draw(preferred_x, y, pal, pal == PALETTE_CRASH); if (!(AircraftVehInfo(engine)->subtype & AIR_CTOL)) { - SpriteID rotor_sprite = GetCustomRotorIcon(engine, image_type); - if (rotor_sprite == 0) rotor_sprite = SPR_ROTOR_STOPPED; - DrawSprite(rotor_sprite, PAL_NONE, preferred_x, y - ScaleGUITrad(5)); + VehicleSpriteSeq rotor_seq; + GetCustomRotorIcon(engine, image_type, &rotor_seq); + if (!rotor_seq.IsValid()) rotor_seq.Set(SPR_ROTOR_STOPPED); + rotor_seq.Draw(preferred_x, y - ScaleGUITrad(5), PAL_NONE, false); } } @@ -224,12 +230,16 @@ void DrawAircraftEngine(int left, int right, int preferred_x, int y, EngineID en */ void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, int &yoffs, EngineImageType image_type) { - const Sprite *spr = GetSprite(GetAircraftIcon(engine, image_type), ST_NORMAL); + VehicleSpriteSeq seq; + GetAircraftIcon(engine, image_type, &seq); - width = UnScaleGUI(spr->width); - height = UnScaleGUI(spr->height); - xoffs = UnScaleGUI(spr->x_offs); - yoffs = UnScaleGUI(spr->y_offs); + Rect rect; + seq.GetBounds(&rect); + + width = UnScaleGUI(rect.right - rect.left + 1); + height = UnScaleGUI(rect.bottom - rect.top + 1); + xoffs = UnScaleGUI(rect.left); + yoffs = UnScaleGUI(rect.top); } /** @@ -238,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) @@ -294,10 +304,10 @@ CommandCost CmdBuildAircraft(TileIndex tile, DoCommandFlag flags, const Engine * u->engine_type = e->index; v->subtype = (avi->subtype & AIR_CTOL ? AIR_AIRCRAFT : AIR_HELICOPTER); - v->UpdateDeltaXY(INVALID_DIR); + v->UpdateDeltaXY(); u->subtype = AIR_SHADOW; - u->UpdateDeltaXY(INVALID_DIR); + u->UpdateDeltaXY(); v->reliability = e->reliability; v->reliability_spd_dec = e->reliability_spd_dec; @@ -317,7 +327,8 @@ CommandCost CmdBuildAircraft(TileIndex tile, DoCommandFlag flags, const Engine * v->date_of_last_service = _date; v->build_year = u->build_year = _cur_year; - v->cur_image = u->cur_image = SPR_IMG_QUERY; + v->sprite_seq.Set(SPR_IMG_QUERY); + u->sprite_seq.Set(SPR_IMG_QUERY); v->random_bits = VehicleRandomBits(); u->random_bits = VehicleRandomBits(); @@ -349,11 +360,11 @@ CommandCost CmdBuildAircraft(TileIndex tile, DoCommandFlag flags, const Engine * w->vehstatus = VS_HIDDEN | VS_UNCLICKABLE; w->spritenum = 0xFF; w->subtype = AIR_ROTOR; - w->cur_image = SPR_ROTOR_STOPPED; + w->sprite_seq.Set(SPR_ROTOR_STOPPED); w->random_bits = VehicleRandomBits(); /* Use rotor's air.state to store the rotor animation frame */ w->state = HRS_ROTOR_STOPPED; - w->UpdateDeltaXY(INVALID_DIR); + w->UpdateDeltaXY(); u->SetNext(w); w->UpdatePosition(); @@ -468,21 +479,21 @@ static void HelicopterTickHandler(Aircraft *v) int tick = ++u->tick_counter; int spd = u->cur_speed >> 4; - SpriteID img; + VehicleSpriteSeq seq; if (spd == 0) { u->state = HRS_ROTOR_STOPPED; - img = GetRotorImage(v, EIT_ON_MAP); - if (u->cur_image == img) return; + GetRotorImage(v, EIT_ON_MAP, &seq); + if (u->sprite_seq == seq) return; } else if (tick >= spd) { u->tick_counter = 0; u->state++; if (u->state > HRS_ROTOR_MOVING_3) u->state = HRS_ROTOR_MOVING_1; - img = GetRotorImage(v, EIT_ON_MAP); + GetRotorImage(v, EIT_ON_MAP, &seq); } else { return; } - u->cur_image = img; + u->sprite_seq = seq; u->UpdatePositionAndViewport(); } @@ -502,7 +513,9 @@ void SetAircraftPosition(Aircraft *v, int x, int y, int z) v->UpdatePosition(); v->UpdateViewport(true, false); - if (v->subtype == AIR_HELICOPTER) v->Next()->Next()->cur_image = GetRotorImage(v, EIT_ON_MAP); + if (v->subtype == AIR_HELICOPTER) { + GetRotorImage(v, EIT_ON_MAP, &v->Next()->Next()->sprite_seq); + } Aircraft *u = v->Next(); @@ -513,7 +526,7 @@ void SetAircraftPosition(Aircraft *v, int x, int y, int z) safe_y = Clamp(u->y_pos, 0, MapMaxY() * TILE_SIZE); u->z_pos = GetSlopePixelZ(safe_x, safe_y); - u->cur_image = v->cur_image; + u->sprite_seq.CopyWithoutPalette(v->sprite_seq); // the shadow is never coloured u->UpdatePositionAndViewport(); @@ -622,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; @@ -641,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; @@ -681,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) { @@ -715,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. @@ -737,7 +753,7 @@ int GetAircraftFlightLevel(T *v, bool takeoff) GetAircraftFlightLevelBounds(v, &aircraft_min_altitude, &aircraft_max_altitude); int aircraft_middle_altitude = (aircraft_min_altitude + aircraft_max_altitude) / 2; - /* If those assumptions would be violated, aircrafts would behave fairly strange. */ + /* If those assumptions would be violated, aircraft would behave fairly strange. */ assert(aircraft_min_altitude < aircraft_middle_altitude); assert(aircraft_middle_altitude < aircraft_max_altitude); @@ -902,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 @@ -922,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); @@ -1237,7 +1258,9 @@ void Aircraft::MarkDirty() { this->colourmap = PAL_NONE; this->UpdateViewport(true, false); - if (this->subtype == AIR_HELICOPTER) this->Next()->Next()->cur_image = GetRotorImage(this, EIT_ON_MAP); + if (this->subtype == AIR_HELICOPTER) { + GetRotorImage(this, EIT_ON_MAP, &this->Next()->Next()->sprite_seq); + } } @@ -1347,7 +1370,7 @@ static void AircraftEntersTerminal(Aircraft *v) */ static void AircraftLandAirplane(Aircraft *v) { - v->UpdateDeltaXY(INVALID_DIR); + v->UpdateDeltaXY(); if (!PlayVehicleSound(v, VSE_TOUCHDOWN)) { SndPlayVehicleFx(SND_17_SKID_PLANE, v); @@ -1539,7 +1562,7 @@ static void AircraftEventHandler_TakeOff(Aircraft *v, const AirportFTAClass *apc static void AircraftEventHandler_StartTakeOff(Aircraft *v, const AirportFTAClass *apc) { v->state = ENDTAKEOFF; - v->UpdateDeltaXY(INVALID_DIR); + v->UpdateDeltaXY(); } static void AircraftEventHandler_EndTakeOff(Aircraft *v, const AirportFTAClass *apc) @@ -1552,7 +1575,7 @@ static void AircraftEventHandler_EndTakeOff(Aircraft *v, const AirportFTAClass * static void AircraftEventHandler_HeliTakeOff(Aircraft *v, const AirportFTAClass *apc) { v->state = FLYING; - v->UpdateDeltaXY(INVALID_DIR); + v->UpdateDeltaXY(); /* get the next position to go to, differs per airport */ AircraftNextAirportPos_and_Order(v); @@ -1585,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! */ @@ -1618,7 +1642,7 @@ static void AircraftEventHandler_Landing(Aircraft *v, const AirportFTAClass *apc static void AircraftEventHandler_HeliLanding(Aircraft *v, const AirportFTAClass *apc) { v->state = HELIENDLANDING; - v->UpdateDeltaXY(INVALID_DIR); + v->UpdateDeltaXY(); } static void AircraftEventHandler_EndLanding(Aircraft *v, const AirportFTAClass *apc) @@ -1874,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) @@ -2024,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/aircraft_gui.cpp b/src/aircraft_gui.cpp index c3379d3951..6693b1f8ad 100644 --- a/src/aircraft_gui.cpp +++ b/src/aircraft_gui.cpp @@ -83,11 +83,14 @@ void DrawAircraftImage(const Vehicle *v, int left, int right, int y, VehicleID s { bool rtl = _current_text_dir == TD_RTL; - SpriteID sprite = v->GetImage(rtl ? DIR_E : DIR_W, image_type); - const Sprite *real_sprite = GetSprite(sprite, ST_NORMAL); + VehicleSpriteSeq seq; + v->GetImage(rtl ? DIR_E : DIR_W, image_type, &seq); - int width = UnScaleGUI(real_sprite->width); - int x_offs = UnScaleGUI(real_sprite->x_offs); + Rect rect; + seq.GetBounds(&rect); + + int width = UnScaleGUI(rect.right - rect.left + 1); + int x_offs = UnScaleGUI(rect.left); int x = rtl ? right - width - x_offs : left - x_offs; bool helicopter = v->subtype == AIR_HELICOPTER; @@ -95,17 +98,18 @@ void DrawAircraftImage(const Vehicle *v, int left, int right, int y, VehicleID s int heli_offs = 0; PaletteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v); - DrawSprite(sprite, pal, x, y + y_offs); + seq.Draw(x, y + y_offs, pal, (v->vehstatus & VS_CRASHED) != 0); if (helicopter) { const Aircraft *a = Aircraft::From(v); - SpriteID rotor_sprite = GetCustomRotorSprite(a, true, image_type); - if (rotor_sprite == 0) rotor_sprite = SPR_ROTOR_STOPPED; + VehicleSpriteSeq rotor_seq; + GetCustomRotorSprite(a, true, image_type, &rotor_seq); + if (!rotor_seq.IsValid()) rotor_seq.Set(SPR_ROTOR_STOPPED); heli_offs = ScaleGUITrad(5); - DrawSprite(rotor_sprite, PAL_NONE, x, y + y_offs - heli_offs); + rotor_seq.Draw(x, y + y_offs - heli_offs, PAL_NONE, false); } if (v->index == selection) { x += x_offs; - y += UnScaleGUI(real_sprite->y_offs) + y_offs - heli_offs; - DrawFrameRect(x - 1, y - 1, x + width + 1, y + UnScaleGUI(real_sprite->height) + heli_offs + 1, COLOUR_WHITE, FR_BORDERONLY); + y += UnScaleGUI(rect.top) + y_offs - heli_offs; + DrawFrameRect(x - 1, y - 1, x + width + 1, y + UnScaleGUI(rect.bottom - rect.top + 1) + heli_offs + 1, COLOUR_WHITE, FR_BORDERONLY); } } diff --git a/src/airport.cpp b/src/airport.cpp index a50c049c23..7985e017aa 100644 --- a/src/airport.cpp +++ b/src/airport.cpp @@ -27,7 +27,7 @@ * @param delta_z Height of the airport above the land. */ #define AIRPORT_GENERIC(name, terminals, num_helipads, flags, delta_z) \ - static AirportFTAClass _airportfta_ ## name(_airport_moving_data_ ## name, terminals, \ + static const AirportFTAClass _airportfta_ ## name(_airport_moving_data_ ## name, terminals, \ num_helipads, _airport_entries_ ## name, flags, _airport_fta_ ## name, delta_z); /** diff --git a/src/animated_tile.cpp b/src/animated_tile.cpp index 78dda8b3b6..2a4cd89583 100644 --- a/src/animated_tile.cpp +++ b/src/animated_tile.cpp @@ -11,17 +11,15 @@ #include "stdafx.h" #include "core/alloc_func.hpp" +#include "core/smallvec_type.hpp" #include "tile_cmd.h" #include "viewport_func.h" +#include "framerate_type.h" #include "safeguards.h" /** The table/list with animated tiles. */ -TileIndex *_animated_tile_list = NULL; -/** The number of animated tiles in the current state. */ -uint _animated_tile_count = 0; -/** The number of slots for animated tiles allocated currently. */ -uint _animated_tile_allocated = 0; +SmallVector _animated_tiles; /** * Removes the given tile from the animated tile table. @@ -29,17 +27,11 @@ uint _animated_tile_allocated = 0; */ void DeleteAnimatedTile(TileIndex tile) { - for (TileIndex *ti = _animated_tile_list; ti < _animated_tile_list + _animated_tile_count; ti++) { - if (tile == *ti) { - /* Remove the hole - * The order of the remaining elements must stay the same, otherwise the animation loop - * may miss a tile; that's why we must use memmove instead of just moving the last element. - */ - memmove(ti, ti + 1, (_animated_tile_list + _animated_tile_count - (ti + 1)) * sizeof(*ti)); - _animated_tile_count--; - MarkTileDirtyByTile(tile); - return; - } + TileIndex *to_remove = _animated_tiles.Find(tile); + if (to_remove != _animated_tiles.End()) { + /* The order of the remaining elements must stay the same, otherwise the animation loop may miss a tile. */ + _animated_tiles.ErasePreservingOrder(to_remove); + MarkTileDirtyByTile(tile); } } @@ -51,19 +43,7 @@ void DeleteAnimatedTile(TileIndex tile) void AddAnimatedTile(TileIndex tile) { MarkTileDirtyByTile(tile); - - for (const TileIndex *ti = _animated_tile_list; ti < _animated_tile_list + _animated_tile_count; ti++) { - if (tile == *ti) return; - } - - /* Table not large enough, so make it larger */ - if (_animated_tile_count == _animated_tile_allocated) { - _animated_tile_allocated *= 2; - _animated_tile_list = ReallocT(_animated_tile_list, _animated_tile_allocated); - } - - _animated_tile_list[_animated_tile_count] = tile; - _animated_tile_count++; + _animated_tiles.Include(tile); } /** @@ -71,8 +51,10 @@ void AddAnimatedTile(TileIndex tile) */ void AnimateAnimatedTiles() { - const TileIndex *ti = _animated_tile_list; - while (ti < _animated_tile_list + _animated_tile_count) { + PerformanceAccumulator framerate(PFE_GL_LANDSCAPE); + + const TileIndex *ti = _animated_tiles.Begin(); + while (ti < _animated_tiles.End()) { const TileIndex curr = *ti; AnimateTile(curr); /* During the AnimateTile call, DeleteAnimatedTile could have been called, @@ -93,7 +75,5 @@ void AnimateAnimatedTiles() */ void InitializeAnimatedTiles() { - _animated_tile_list = ReallocT(_animated_tile_list, 256); - _animated_tile_count = 0; - _animated_tile_allocated = 256; + _animated_tiles.Clear(); } diff --git a/src/articulated_vehicles.cpp b/src/articulated_vehicles.cpp index 193c5ac4a8..44ad587895 100644 --- a/src/articulated_vehicles.cpp +++ b/src/articulated_vehicles.cpp @@ -119,12 +119,12 @@ static inline uint16 GetVehicleDefaultCapacity(EngineID engine, CargoID *cargo_t * @param include_initial_cargo_type if true the default cargo type of the vehicle is included; if false only the refit_mask * @return bit set of CargoIDs */ -static inline uint32 GetAvailableVehicleCargoTypes(EngineID engine, bool include_initial_cargo_type) +static inline CargoTypes GetAvailableVehicleCargoTypes(EngineID engine, bool include_initial_cargo_type) { const Engine *e = Engine::Get(engine); if (!e->CanCarryCargo()) return 0; - uint32 cargoes = e->info.refit_mask; + CargoTypes cargoes = e->info.refit_mask; if (include_initial_cargo_type) { SetBit(cargoes, e->GetDefaultCargoType()); @@ -169,7 +169,7 @@ CargoArray GetCapacityOfArticulatedParts(EngineID engine) * @param[out] cargoes Total amount of units that can be transported, summed by cargo. * @param[out] refits Whether a (possibly partial) refit for each cargo is possible. */ -void GetArticulatedVehicleCargoesAndRefits(EngineID engine, CargoArray *cargoes, uint32 *refits) +void GetArticulatedVehicleCargoesAndRefits(EngineID engine, CargoArray *cargoes, CargoTypes *refits) { cargoes->Clear(); *refits = 0; @@ -228,12 +228,12 @@ bool IsArticulatedVehicleRefittable(EngineID engine) * @param union_mask returns bit mask of CargoIDs which are a refit option for at least one articulated part * @param intersection_mask returns bit mask of CargoIDs which are a refit option for every articulated part (with default capacity > 0) */ -void GetArticulatedRefitMasks(EngineID engine, bool include_initial_cargo_type, uint32 *union_mask, uint32 *intersection_mask) +void GetArticulatedRefitMasks(EngineID engine, bool include_initial_cargo_type, CargoTypes *union_mask, CargoTypes *intersection_mask) { const Engine *e = Engine::Get(engine); - uint32 veh_cargoes = GetAvailableVehicleCargoTypes(engine, include_initial_cargo_type); + CargoTypes veh_cargoes = GetAvailableVehicleCargoTypes(engine, include_initial_cargo_type); *union_mask = veh_cargoes; - *intersection_mask = (veh_cargoes != 0) ? veh_cargoes : UINT32_MAX; + *intersection_mask = (veh_cargoes != 0) ? veh_cargoes : ALL_CARGOTYPES; if (!e->IsGroundVehicle()) return; if (!HasBit(e->info.callback_mask, CBM_VEHICLE_ARTIC_ENGINE)) return; @@ -254,9 +254,9 @@ void GetArticulatedRefitMasks(EngineID engine, bool include_initial_cargo_type, * @param include_initial_cargo_type if true the default cargo type of the vehicle is included; if false only the refit_mask * @return bit mask of CargoIDs which are a refit option for at least one articulated part */ -uint32 GetUnionOfArticulatedRefitMasks(EngineID engine, bool include_initial_cargo_type) +CargoTypes GetUnionOfArticulatedRefitMasks(EngineID engine, bool include_initial_cargo_type) { - uint32 union_mask, intersection_mask; + CargoTypes union_mask, intersection_mask; GetArticulatedRefitMasks(engine, include_initial_cargo_type, &union_mask, &intersection_mask); return union_mask; } @@ -267,9 +267,9 @@ uint32 GetUnionOfArticulatedRefitMasks(EngineID engine, bool include_initial_car * @param include_initial_cargo_type if true the default cargo type of the vehicle is included; if false only the refit_mask * @return bit mask of CargoIDs which are a refit option for every articulated part (with default capacity > 0) */ -uint32 GetIntersectionOfArticulatedRefitMasks(EngineID engine, bool include_initial_cargo_type) +CargoTypes GetIntersectionOfArticulatedRefitMasks(EngineID engine, bool include_initial_cargo_type) { - uint32 union_mask, intersection_mask; + CargoTypes union_mask, intersection_mask; GetArticulatedRefitMasks(engine, include_initial_cargo_type, &union_mask, &intersection_mask); return intersection_mask; } @@ -314,16 +314,16 @@ void CheckConsistencyOfArticulatedVehicle(const Vehicle *v) { const Engine *engine = v->GetEngine(); - uint32 purchase_refit_union, purchase_refit_intersection; + CargoTypes purchase_refit_union, purchase_refit_intersection; GetArticulatedRefitMasks(v->engine_type, true, &purchase_refit_union, &purchase_refit_intersection); CargoArray purchase_default_capacity = GetCapacityOfArticulatedParts(v->engine_type); - uint32 real_refit_union = 0; - uint32 real_refit_intersection = UINT_MAX; + CargoTypes real_refit_union = 0; + CargoTypes real_refit_intersection = ALL_CARGOTYPES; CargoArray real_default_capacity; do { - uint32 refit_mask = GetAvailableVehicleCargoTypes(v->engine_type, true); + CargoTypes refit_mask = GetAvailableVehicleCargoTypes(v->engine_type, true); real_refit_union |= refit_mask; if (refit_mask != 0) real_refit_intersection &= refit_mask; @@ -433,6 +433,7 @@ void AddArticulatedParts(Vehicle *first) v->x_pos = first->x_pos; v->y_pos = first->y_pos; v->z_pos = first->z_pos; + v->date_of_last_service = first->date_of_last_service; v->build_year = first->build_year; v->vehstatus = first->vehstatus & ~VS_STOPPED; @@ -440,7 +441,7 @@ void AddArticulatedParts(Vehicle *first) v->max_age = 0; v->engine_type = engine_type; v->value = 0; - v->cur_image = SPR_IMG_QUERY; + v->sprite_seq.Set(SPR_IMG_QUERY); v->random_bits = VehicleRandomBits(); if (flip_image) v->spritenum++; diff --git a/src/articulated_vehicles.h b/src/articulated_vehicles.h index 46b4da3744..77322fb4c7 100644 --- a/src/articulated_vehicles.h +++ b/src/articulated_vehicles.h @@ -18,9 +18,9 @@ uint CountArticulatedParts(EngineID engine_type, bool purchase_window); CargoArray GetCapacityOfArticulatedParts(EngineID engine); void AddArticulatedParts(Vehicle *first); -void GetArticulatedRefitMasks(EngineID engine, bool include_initial_cargo_type, uint32 *union_mask, uint32 *intersection_mask); -uint32 GetUnionOfArticulatedRefitMasks(EngineID engine, bool include_initial_cargo_type); -uint32 GetIntersectionOfArticulatedRefitMasks(EngineID engine, bool include_initial_cargo_type); +void GetArticulatedRefitMasks(EngineID engine, bool include_initial_cargo_type, CargoTypes *union_mask, CargoTypes *intersection_mask); +CargoTypes GetUnionOfArticulatedRefitMasks(EngineID engine, bool include_initial_cargo_type); +CargoTypes GetIntersectionOfArticulatedRefitMasks(EngineID engine, bool include_initial_cargo_type); bool IsArticulatedVehicleCarryingDifferentCargoes(const Vehicle *v, CargoID *cargo_type); bool IsArticulatedVehicleRefittable(EngineID engine); bool IsArticulatedEngine(EngineID engine_type); diff --git a/src/autoreplace_cmd.cpp b/src/autoreplace_cmd.cpp index e69ac66eb2..48f818c947 100644 --- a/src/autoreplace_cmd.cpp +++ b/src/autoreplace_cmd.cpp @@ -32,13 +32,12 @@ 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) { - uint32 available_cargoes_a = GetUnionOfArticulatedRefitMasks(engine_a, true); - uint32 available_cargoes_b = GetUnionOfArticulatedRefitMasks(engine_b, true); + CargoTypes available_cargoes_a = GetUnionOfArticulatedRefitMasks(engine_a, true); + CargoTypes available_cargoes_b = GetUnionOfArticulatedRefitMasks(engine_b, true); return (available_cargoes_a == 0 || available_cargoes_b == 0 || (available_cargoes_a & available_cargoes_b) != 0); } @@ -173,9 +172,8 @@ static void TransferCargo(Vehicle *old_veh, Vehicle *new_head, bool part_of_chai */ static bool VerifyAutoreplaceRefitForOrders(const Vehicle *v, EngineID engine_type) { - - uint32 union_refit_mask_a = GetUnionOfArticulatedRefitMasks(v->engine_type, false); - uint32 union_refit_mask_b = GetUnionOfArticulatedRefitMasks(engine_type, false); + CargoTypes union_refit_mask_a = GetUnionOfArticulatedRefitMasks(v->engine_type, false); + CargoTypes union_refit_mask_b = GetUnionOfArticulatedRefitMasks(engine_type, false); const Order *o; const Vehicle *u = (v->type == VEH_TRAIN) ? v->First() : v; @@ -201,7 +199,7 @@ static bool VerifyAutoreplaceRefitForOrders(const Vehicle *v, EngineID engine_ty */ static CargoID GetNewCargoTypeForReplace(Vehicle *v, EngineID engine_type, bool part_of_chain) { - uint32 available_cargo_types, union_mask; + CargoTypes available_cargo_types, union_mask; GetArticulatedRefitMasks(engine_type, true, &union_mask, &available_cargo_types); if (union_mask == 0) return CT_NO_REFIT; // Don't try to refit an engine with no cargo capacity @@ -238,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 691042a1d5..eae0a378eb 100644 --- a/src/autoreplace_gui.cpp +++ b/src/autoreplace_gui.cpp @@ -81,13 +81,13 @@ 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. bool descending_sort_order; ///< Order of sorting vehicles. bool show_hidden_engines; ///< Whether to show the hidden engines. - RailType sel_railtype; ///< Type of rail tracks selected. + RailType sel_railtype; ///< Type of rail tracks selected. #INVALID_RAILTYPE to show all. Scrollbar *vscroll[2]; /** @@ -104,7 +104,7 @@ class ReplaceVehicleWindow : public Window { /* Ensure that the wagon/engine selection fits the engine. */ if ((rvi->railveh_type == RAILVEH_WAGON) == show_engines) return false; - if (draw_left && show_engines) { + if (draw_left && this->sel_railtype != INVALID_RAILTYPE) { /* Ensure that the railtype is specific to the selected one */ if (rvi->railtype != this->sel_railtype) return false; } @@ -211,24 +211,7 @@ class ReplaceVehicleWindow : public Window { public: ReplaceVehicleWindow(WindowDesc *desc, VehicleType vehicletype, GroupID id_g) : Window(desc) { - if (vehicletype == VEH_TRAIN) { - /* For rail vehicles find the most used vehicle type, which is usually - * better than 'just' the first/previous vehicle type. */ - uint type_count[RAILTYPE_END]; - memset(type_count, 0, sizeof(type_count)); - - const Engine *e; - FOR_ALL_ENGINES_OF_TYPE(e, VEH_TRAIN) { - if (e->u.rail.railveh_type == RAILVEH_WAGON) continue; - type_count[e->u.rail.railtype] += GetGroupNumEngines(_local_company, id_g, e->index); - } - - this->sel_railtype = RAILTYPE_BEGIN; - for (RailType rt = RAILTYPE_BEGIN; rt < RAILTYPE_END; rt++) { - if (type_count[this->sel_railtype] < type_count[rt]) this->sel_railtype = rt; - } - } - + this->sel_railtype = INVALID_RAILTYPE; this->replace_engines = true; // start with locomotives (all other vehicles will not read this bool) this->engines[0].ForceRebuild(); this->engines[1].ForceRebuild(); @@ -288,12 +271,9 @@ public: break; } - case WID_RV_TRAIN_ENGINEWAGON_TOGGLE: { - StringID str = this->GetWidget(widget)->widget_data; - SetDParam(0, STR_REPLACE_ENGINES); - Dimension d = GetStringBoundingBox(str); - SetDParam(0, STR_REPLACE_WAGONS); - d = maxdim(d, GetStringBoundingBox(str)); + case WID_RV_TRAIN_ENGINEWAGON_DROPDOWN: { + Dimension d = GetStringBoundingBox(STR_REPLACE_ENGINES); + d = maxdim(d, GetStringBoundingBox(STR_REPLACE_WAGONS)); d.width += padding.width; d.height += padding.height; *size = maxdim(*size, d); @@ -367,7 +347,7 @@ public: break; } - case WID_RV_TRAIN_ENGINEWAGON_TOGGLE: + case WID_RV_TRAIN_ENGINEWAGON_DROPDOWN: SetDParam(0, this->replace_engines ? STR_REPLACE_ENGINES : STR_REPLACE_WAGONS); break; } @@ -432,12 +412,8 @@ public: this->SetWidgetDisabledState(WID_RV_STOP_REPLACE, this->sel_engine[0] == INVALID_ENGINE || !EngineHasReplacementForCompany(c, this->sel_engine[0], this->sel_group)); if (this->window_number == VEH_TRAIN) { - /* sets the colour of that art thing */ - this->GetWidget(WID_RV_TRAIN_FLUFF_LEFT)->colour = _company_colours[_local_company]; - this->GetWidget(WID_RV_TRAIN_FLUFF_RIGHT)->colour = _company_colours[_local_company]; - /* Show the selected railtype in the pulldown menu */ - this->GetWidget(WID_RV_TRAIN_RAILTYPE_DROPDOWN)->widget_data = GetRailTypeInfo(sel_railtype)->strings.replace_text; + this->GetWidget(WID_RV_TRAIN_RAILTYPE_DROPDOWN)->widget_data = sel_railtype == INVALID_RAILTYPE ? STR_REPLACE_ALL_RAILTYPE : GetRailTypeInfo(sel_railtype)->strings.replace_text; } this->DrawWidgets(); @@ -483,15 +459,16 @@ public: DisplayVehicleSortDropDown(this, static_cast(this->window_number), this->sort_criteria, WID_RV_SORT_DROPDOWN); break; - case WID_RV_TRAIN_ENGINEWAGON_TOGGLE: - this->replace_engines = !(this->replace_engines); - this->engines[0].ForceRebuild(); - this->reset_sel_engine = true; - this->SetDirty(); + case WID_RV_TRAIN_ENGINEWAGON_DROPDOWN: { + DropDownList *list = new DropDownList(); + *list->Append() = new DropDownListStringItem(STR_REPLACE_ENGINES, 1, false); + *list->Append() = new DropDownListStringItem(STR_REPLACE_WAGONS, 0, false); + ShowDropDownList(this, list, this->replace_engines ? 1 : 0, WID_RV_TRAIN_ENGINEWAGON_DROPDOWN); break; + } case WID_RV_TRAIN_RAILTYPE_DROPDOWN: // Railtype selection dropdown menu - ShowDropDownList(this, GetRailTypeDropDownList(true), sel_railtype, WID_RV_TRAIN_RAILTYPE_DROPDOWN); + ShowDropDownList(this, GetRailTypeDropDownList(true, true), sel_railtype, WID_RV_TRAIN_RAILTYPE_DROPDOWN); break; case WID_RV_TRAIN_WAGONREMOVE_TOGGLE: // toggle renew_keep_length @@ -566,6 +543,14 @@ public: break; } + case WID_RV_TRAIN_ENGINEWAGON_DROPDOWN: { + this->replace_engines = index != 0; + this->engines[0].ForceRebuild(); + this->reset_sel_engine = true; + this->SetDirty(); + break; + } + case WID_RV_START_REPLACE: this->ReplaceClick_StartReplace(index != 0); break; @@ -611,7 +596,13 @@ static const NWidgetPart _nested_replace_rail_vehicle_widgets[] = { EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), - NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), EndContainer(), + NWidget(NWID_VERTICAL), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_RV_TRAIN_RAILTYPE_DROPDOWN), SetMinimalSize(136, 12), SetDataTip(0x0, STR_REPLACE_HELP_RAILTYPE), SetFill(1, 0), SetResize(1, 0), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_RV_TRAIN_ENGINEWAGON_DROPDOWN), SetDataTip(STR_BLACK_STRING, STR_REPLACE_ENGINE_WAGON_SELECT_HELP), + EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), EndContainer(), + EndContainer(), NWidget(NWID_VERTICAL), NWidget(NWID_HORIZONTAL), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_SORT_ASCENDING_DESCENDING), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER), SetFill(1, 1), @@ -631,20 +622,16 @@ static const NWidgetPart _nested_replace_rail_vehicle_widgets[] = { EndContainer(), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_LEFT_DETAILS), SetMinimalSize(240, 122), SetResize(1, 0), EndContainer(), - NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_RIGHT_DETAILS), SetMinimalSize(240, 122), SetResize(1, 0), EndContainer(), + NWidget(NWID_VERTICAL), + NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_RIGHT_DETAILS), SetMinimalSize(240, 122), SetResize(1, 0), EndContainer(), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_TRAIN_WAGONREMOVE_TOGGLE), SetMinimalSize(138, 12), SetDataTip(STR_REPLACE_REMOVE_WAGON, STR_REPLACE_REMOVE_WAGON_HELP), SetFill(1, 0), SetResize(1, 0), + EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL), NWidget(NWID_PUSHBUTTON_DROPDOWN, COLOUR_GREY, WID_RV_START_REPLACE), SetMinimalSize(139, 12), SetDataTip(STR_REPLACE_VEHICLES_START, STR_REPLACE_HELP_START_BUTTON), NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_INFO_TAB), SetMinimalSize(167, 12), SetDataTip(0x0, STR_REPLACE_HELP_REPLACE_INFO_TAB), SetResize(1, 0), EndContainer(), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_STOP_REPLACE), SetMinimalSize(150, 12), SetDataTip(STR_REPLACE_VEHICLES_STOP, STR_REPLACE_HELP_STOP_BUTTON), - EndContainer(), - NWidget(NWID_HORIZONTAL), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_TRAIN_ENGINEWAGON_TOGGLE), SetMinimalSize(139, 12), SetDataTip(STR_REPLACE_ENGINE_WAGON_SELECT, STR_REPLACE_ENGINE_WAGON_SELECT_HELP), - NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_TRAIN_FLUFF_LEFT), SetMinimalSize(15, 12), EndContainer(), - NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_RV_TRAIN_RAILTYPE_DROPDOWN), SetMinimalSize(136, 12), SetDataTip(0x0, STR_REPLACE_HELP_RAILTYPE), SetResize(1, 0), - NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_TRAIN_FLUFF_RIGHT), SetMinimalSize(16, 12), EndContainer(), - NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_TRAIN_WAGONREMOVE_TOGGLE), SetMinimalSize(138, 12), SetDataTip(STR_REPLACE_REMOVE_WAGON, STR_REPLACE_REMOVE_WAGON_HELP), NWidget(WWT_RESIZEBOX, COLOUR_GREY), EndContainer(), }; diff --git a/src/base_media_base.h b/src/base_media_base.h index d5de6c3739..b040abcf9d 100644 --- a/src/base_media_base.h +++ b/src/base_media_base.h @@ -26,6 +26,7 @@ struct ContentInfo; struct MD5File { /** The result of a checksum check */ enum ChecksumResult { + CR_UNKNOWN, ///< The file has not been checked yet CR_MATCH, ///< The file did exist and the md5 checksum did match CR_MISMATCH, ///< The file did exist, just the md5 checksum did not match CR_NO_FILE, ///< The file did not exist @@ -34,6 +35,7 @@ struct MD5File { const char *filename; ///< filename uint8 hash[16]; ///< md5 sum of the file const char *missing_warning; ///< warning when this file is missing + ChecksumResult check_result; ///< cached result of md5 check ChecksumResult CheckMD5(Subdirectory subdir, size_t max_size) const; }; @@ -219,6 +221,11 @@ public: static bool HasSet(const ContentInfo *ci, bool md5sum); }; +template /* static */ const char *BaseMedia::ini_set; +template /* static */ const Tbase_set *BaseMedia::used_set; +template /* static */ Tbase_set *BaseMedia::available_sets; +template /* static */ Tbase_set *BaseMedia::duplicate_sets; + /** * Check whether there's a base set matching some information. * @param ci The content info to compare it to. @@ -280,11 +287,32 @@ static const uint NUM_SONGS_AVAILABLE = 1 + NUM_SONG_CLASSES * NUM_SONGS_CLASS; /** Maximum number of songs in the (custom) playlist */ static const uint NUM_SONGS_PLAYLIST = 32; +/* Functions to read DOS music CAT files, similar to but not quite the same as sound effect CAT files */ +char *GetMusicCatEntryName(const char *filename, size_t entrynum); +byte *GetMusicCatEntryData(const char *filename, size_t entrynum, size_t &entrylen); + +enum MusicTrackType { + MTT_STANDARDMIDI, ///< Standard MIDI file + MTT_MPSMIDI, ///< MPS GM driver MIDI format (contained in a CAT file) +}; + +/** Metadata about a music track. */ +struct MusicSongInfo { + char songname[32]; ///< name of song displayed in UI + byte tracknr; ///< track number of song displayed in UI + const char *filename; ///< file on disk containing song (when used in MusicSet class, this pointer is owned by MD5File object for the file) + MusicTrackType filetype; ///< decoder required for song file + int cat_index; ///< entry index in CAT file, for filetype==MTT_MPSMIDI + bool loop; ///< song should play in a tight loop if possible, never ending + int override_start; ///< MIDI ticks to skip over in beginning + int override_end; ///< MIDI tick to end the song at (0 if no override) +}; + /** All data of a music set. */ struct MusicSet : BaseSet { - /** The name of the different songs. */ - char song_name[NUM_SONGS_AVAILABLE][32]; - byte track_nr[NUM_SONGS_AVAILABLE]; + /** Data about individual songs in set. */ + MusicSongInfo songinfo[NUM_SONGS_AVAILABLE]; + /** Number of valid songs in set. */ byte num_available; bool FillSetDetails(struct IniFile *ini, const char *path, const char *full_filename); diff --git a/src/base_media_func.h b/src/base_media_func.h index e3678d5a15..f7afca0edb 100644 --- a/src/base_media_func.h +++ b/src/base_media_func.h @@ -17,11 +17,6 @@ #include "ini_type.h" #include "string_func.h" -template /* static */ const char *BaseMedia::ini_set; -template /* static */ const Tbase_set *BaseMedia::used_set; -template /* static */ Tbase_set *BaseMedia::available_sets; -template /* static */ Tbase_set *BaseMedia::duplicate_sets; - /** * Try to read a single piece of metadata and return false if it doesn't exist. * @param name the name of the item to fetch. @@ -45,8 +40,6 @@ template /* static */ Tbase_set *BaseMedia::duplica template bool BaseSet::FillSetDetails(IniFile *ini, const char *path, const char *full_filename, bool allow_empty_filename) { - memset(this, 0, sizeof(*this)); - IniGroup *metadata = ini->GetGroup("metadata"); IniItem *item; @@ -134,7 +127,11 @@ bool BaseSet::FillSetDetails(IniFile *ini, const file->missing_warning = stredup(item->value); } - switch (T::CheckMD5(file, BASESET_DIR)) { + file->check_result = T::CheckMD5(file, BASESET_DIR); + switch (file->check_result) { + case MD5File::CR_UNKNOWN: + break; + case MD5File::CR_MATCH: this->valid_files++; this->found_files++; diff --git a/src/base_station_base.h b/src/base_station_base.h index 53e104a826..cd512c5177 100644 --- a/src/base_station_base.h +++ b/src/base_station_base.h @@ -71,7 +71,7 @@ struct BaseStation : StationPool::PoolItem<&_station_pool> { uint16 random_bits; ///< Random bits assigned to this station byte waiting_triggers; ///< Waiting triggers (NewGRF) for this station uint8 cached_anim_triggers; ///< NOSAVE: Combined animation trigger bitmask, used to determine if trigger processing should happen. - uint32 cached_cargo_triggers; ///< NOSAVE: Combined cargo trigger bitmask + CargoTypes cached_cargo_triggers; ///< NOSAVE: Combined cargo trigger bitmask TileArea train_station; ///< Tile area the train 'station' part covers StationRect rect; ///< NOSAVE: Station spread out rectangle maintained by StationRect::xxx() functions diff --git a/src/blitter/32bpp_anim.cpp b/src/blitter/32bpp_anim.cpp index a3083e40b3..98ae22b00c 100644 --- a/src/blitter/32bpp_anim.cpp +++ b/src/blitter/32bpp_anim.cpp @@ -20,6 +20,11 @@ /** Instantiation of the 32bpp with animation blitter factory. */ static FBlitter_32bppAnim iFBlitter_32bppAnim; +Blitter_32bppAnim::~Blitter_32bppAnim() +{ + free(this->anim_alloc); +} + template inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom) { @@ -34,13 +39,13 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel } Colour *dst = (Colour *)bp->dst + bp->top * bp->pitch + bp->left; - uint16 *anim = this->anim_buf + ((uint32 *)bp->dst - (uint32 *)_screen.dst_ptr) + bp->top * this->anim_buf_width + bp->left; + uint16 *anim = this->anim_buf + this->ScreenToAnimOffset((uint32 *)bp->dst) + bp->top * this->anim_buf_pitch + bp->left; const byte *remap = bp->remap; // store so we don't have to access it via bp everytime for (int y = 0; y < bp->height; y++) { Colour *dst_ln = dst + bp->pitch; - uint16 *anim_ln = anim + this->anim_buf_width; + uint16 *anim_ln = anim + this->anim_buf_pitch; const Colour *src_px_ln = (const Colour *)((const byte *)src_px + *(const uint32 *)src_px); src_px++; @@ -274,9 +279,7 @@ void Blitter_32bppAnim::DrawColourMappingRect(void *dst, int width, int height, } Colour *udst = (Colour *)dst; - uint16 *anim; - - anim = this->anim_buf + ((uint32 *)dst - (uint32 *)_screen.dst_ptr); + uint16 *anim = this->anim_buf + this->ScreenToAnimOffset((uint32 *)dst); if (pal == PALETTE_TO_TRANSPARENT) { do { @@ -287,7 +290,7 @@ void Blitter_32bppAnim::DrawColourMappingRect(void *dst, int width, int height, anim++; } udst = udst - width + _screen.pitch; - anim = anim - width + this->anim_buf_width; + anim = anim - width + this->anim_buf_pitch; } while (--height); return; } @@ -300,7 +303,7 @@ void Blitter_32bppAnim::DrawColourMappingRect(void *dst, int width, int height, anim++; } udst = udst - width + _screen.pitch; - anim = anim - width + this->anim_buf_width; + anim = anim - width + this->anim_buf_pitch; } while (--height); return; } @@ -314,7 +317,8 @@ void Blitter_32bppAnim::SetPixel(void *video, int x, int y, uint8 colour) /* Set the colour in the anim-buffer too, if we are rendering to the screen */ if (_screen_disable_anim) return; - this->anim_buf[((uint32 *)video - (uint32 *)_screen.dst_ptr) + x + y * this->anim_buf_width] = colour | (DEFAULT_BRIGHTNESS << 8); + + this->anim_buf[this->ScreenToAnimOffset((uint32 *)video) + x + y * this->anim_buf_pitch] = colour | (DEFAULT_BRIGHTNESS << 8); } void Blitter_32bppAnim::DrawRect(void *video, int width, int height, uint8 colour) @@ -326,9 +330,7 @@ void Blitter_32bppAnim::DrawRect(void *video, int width, int height, uint8 colou } Colour colour32 = LookupColourInPalette(colour); - uint16 *anim_line; - - anim_line = ((uint32 *)video - (uint32 *)_screen.dst_ptr) + this->anim_buf; + uint16 *anim_line = this->ScreenToAnimOffset((uint32 *)video) + this->anim_buf; do { Colour *dst = (Colour *)video; @@ -342,7 +344,7 @@ void Blitter_32bppAnim::DrawRect(void *video, int width, int height, uint8 colou anim++; } video = (uint32 *)video + _screen.pitch; - anim_line += this->anim_buf_width; + anim_line += this->anim_buf_pitch; } while (--height); } @@ -352,20 +354,20 @@ void Blitter_32bppAnim::CopyFromBuffer(void *video, const void *src, int width, assert(video >= _screen.dst_ptr && video <= (uint32 *)_screen.dst_ptr + _screen.width + _screen.height * _screen.pitch); Colour *dst = (Colour *)video; const uint32 *usrc = (const uint32 *)src; - uint16 *anim_line = ((uint32 *)video - (uint32 *)_screen.dst_ptr) + this->anim_buf; + uint16 *anim_line = this->ScreenToAnimOffset((uint32 *)video) + this->anim_buf; for (; height > 0; height--) { /* We need to keep those for palette animation. */ Colour *dst_pal = dst; uint16 *anim_pal = anim_line; - memcpy(dst, usrc, width * sizeof(uint32)); + memcpy(static_cast(dst), usrc, width * sizeof(uint32)); usrc += width; dst += _screen.pitch; /* Copy back the anim-buffer */ memcpy(anim_line, usrc, width * sizeof(uint16)); usrc = (const uint32 *)((const uint16 *)usrc + width); - anim_line += this->anim_buf_width; + anim_line += this->anim_buf_pitch; /* Okay, it is *very* likely that the image we stored is using * the wrong palette animated colours. There are two things we @@ -392,11 +394,10 @@ void Blitter_32bppAnim::CopyToBuffer(const void *video, void *dst, int width, in assert(video >= _screen.dst_ptr && video <= (uint32 *)_screen.dst_ptr + _screen.width + _screen.height * _screen.pitch); uint32 *udst = (uint32 *)dst; const uint32 *src = (const uint32 *)video; - const uint16 *anim_line; if (this->anim_buf == NULL) return; - anim_line = ((const uint32 *)video - (uint32 *)_screen.dst_ptr) + this->anim_buf; + const uint16 *anim_line = this->ScreenToAnimOffset((const uint32 *)video) + this->anim_buf; for (; height > 0; height--) { memcpy(udst, src, width * sizeof(uint32)); @@ -405,7 +406,7 @@ void Blitter_32bppAnim::CopyToBuffer(const void *video, void *dst, int width, in /* Copy the anim-buffer */ memcpy(udst, anim_line, width * sizeof(uint16)); udst = (uint32 *)((uint16 *)udst + width); - anim_line += this->anim_buf_width; + anim_line += this->anim_buf_pitch; } } @@ -417,8 +418,8 @@ void Blitter_32bppAnim::ScrollBuffer(void *video, int &left, int &top, int &widt /* We need to scroll the anim-buffer too */ if (scroll_y > 0) { - dst = this->anim_buf + left + (top + height - 1) * this->anim_buf_width; - src = dst - scroll_y * this->anim_buf_width; + dst = this->anim_buf + left + (top + height - 1) * this->anim_buf_pitch; + src = dst - scroll_y * this->anim_buf_pitch; /* Adjust left & width */ if (scroll_x >= 0) { @@ -431,13 +432,13 @@ void Blitter_32bppAnim::ScrollBuffer(void *video, int &left, int &top, int &widt uint th = height - scroll_y; for (; th > 0; th--) { memcpy(dst, src, tw * sizeof(uint16)); - src -= this->anim_buf_width; - dst -= this->anim_buf_width; + src -= this->anim_buf_pitch; + dst -= this->anim_buf_pitch; } } else { /* Calculate pointers */ - dst = this->anim_buf + left + top * this->anim_buf_width; - src = dst - scroll_y * this->anim_buf_width; + dst = this->anim_buf + left + top * this->anim_buf_pitch; + src = dst - scroll_y * this->anim_buf_pitch; /* Adjust left & width */ if (scroll_x >= 0) { @@ -452,8 +453,8 @@ void Blitter_32bppAnim::ScrollBuffer(void *video, int &left, int &top, int &widt uint th = height + scroll_y; for (; th > 0; th--) { memmove(dst, src, tw * sizeof(uint16)); - src += this->anim_buf_width; - dst += this->anim_buf_width; + src += this->anim_buf_pitch; + dst += this->anim_buf_pitch; } } @@ -479,17 +480,22 @@ void Blitter_32bppAnim::PaletteAnimate(const Palette &palette) Colour *dst = (Colour *)_screen.dst_ptr; /* Let's walk the anim buffer and try to find the pixels */ + const int width = this->anim_buf_width; + const int pitch_offset = _screen.pitch - width; + const int anim_pitch_offset = this->anim_buf_pitch - width; for (int y = this->anim_buf_height; y != 0 ; y--) { - for (int x = this->anim_buf_width; x != 0 ; x--) { - uint colour = GB(*anim, 0, 8); + for (int x = width; x != 0 ; x--) { + uint16 value = *anim; + uint8 colour = GB(value, 0, 8); if (colour >= PALETTE_ANIM_START) { /* Update this pixel */ - *dst = this->AdjustBrightness(LookupColourInPalette(colour), GB(*anim, 8, 8)); + *dst = this->AdjustBrightness(LookupColourInPalette(colour), GB(value, 8, 8)); } dst++; anim++; } - dst += _screen.pitch - this->anim_buf_width; + dst += pitch_offset; + anim += anim_pitch_offset; } /* Make sure the backend redraws the whole screen */ @@ -503,11 +509,16 @@ Blitter::PaletteAnimation Blitter_32bppAnim::UsePaletteAnimation() void Blitter_32bppAnim::PostResize() { - if (_screen.width != this->anim_buf_width || _screen.height != this->anim_buf_height) { + if (_screen.width != this->anim_buf_width || _screen.height != this->anim_buf_height || + _screen.pitch != this->anim_buf_pitch) { /* The size of the screen changed; we can assume we can wipe all data from our buffer */ - free(this->anim_buf); - this->anim_buf = CallocT(_screen.width * _screen.height); + free(this->anim_alloc); this->anim_buf_width = _screen.width; this->anim_buf_height = _screen.height; + this->anim_buf_pitch = (_screen.width + 7) & ~7; + this->anim_alloc = CallocT(this->anim_buf_pitch * this->anim_buf_height + 8); + + /* align buffer to next 16 byte boundary */ + this->anim_buf = reinterpret_cast((reinterpret_cast(this->anim_alloc) + 0xF) & (~0xF)); } } diff --git a/src/blitter/32bpp_anim.hpp b/src/blitter/32bpp_anim.hpp index e707c4437d..da33ec95bb 100644 --- a/src/blitter/32bpp_anim.hpp +++ b/src/blitter/32bpp_anim.hpp @@ -18,16 +18,24 @@ class Blitter_32bppAnim : public Blitter_32bppOptimized { protected: uint16 *anim_buf; ///< In this buffer we keep track of the 8bpp indexes so we can do palette animation + void *anim_alloc; ///< The raw allocated buffer, not necessarily aligned correctly int anim_buf_width; ///< The width of the animation buffer. int anim_buf_height; ///< The height of the animation buffer. + int anim_buf_pitch; ///< The pitch of the animation buffer (width rounded up to 16 byte boundary). Palette palette; ///< The current palette. public: Blitter_32bppAnim() : anim_buf(NULL), + anim_alloc(NULL), anim_buf_width(0), - anim_buf_height(0) - {} + anim_buf_height(0), + anim_buf_pitch(0) + { + this->palette = _cur_palette; + } + + ~Blitter_32bppAnim(); /* virtual */ void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom); /* virtual */ void DrawColourMappingRect(void *dst, int width, int height, PaletteID pal); @@ -52,6 +60,15 @@ public: return this->palette.palette[index]; } + inline int ScreenToAnimOffset(const uint32 *video) + { + int raw_offset = video - (const uint32 *)_screen.dst_ptr; + if (_screen.pitch == this->anim_buf_pitch) return raw_offset; + int lines = raw_offset / _screen.pitch; + int across = raw_offset % _screen.pitch; + return across + (lines * this->anim_buf_pitch); + } + template void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom); }; diff --git a/src/blitter/32bpp_anim_sse2.cpp b/src/blitter/32bpp_anim_sse2.cpp new file mode 100644 index 0000000000..d5fa4268a8 --- /dev/null +++ b/src/blitter/32bpp_anim_sse2.cpp @@ -0,0 +1,100 @@ +/* $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 32bpp_anim.cpp Implementation of a partially SSSE2 32bpp blitter with animation support. */ + +#ifdef WITH_SSE + +#include "../stdafx.h" +#include "../video/video_driver.hpp" +#include "32bpp_anim_sse2.hpp" +#include "32bpp_sse_func.hpp" + +#include "../safeguards.h" + +/** Instantiation of the partially SSSE2 32bpp with animation blitter factory. */ +static FBlitter_32bppSSE2_Anim iFBlitter_32bppSSE2_Anim; + +void Blitter_32bppSSE2_Anim::PaletteAnimate(const Palette &palette) +{ + assert(!_screen_disable_anim); + + this->palette = palette; + /* If first_dirty is 0, it is for 8bpp indication to send the new + * palette. However, only the animation colours might possibly change. + * Especially when going between toyland and non-toyland. */ + assert(this->palette.first_dirty == PALETTE_ANIM_START || this->palette.first_dirty == 0); + + const uint16 *anim = this->anim_buf; + Colour *dst = (Colour *)_screen.dst_ptr; + + bool screen_dirty = false; + + /* Let's walk the anim buffer and try to find the pixels */ + const int width = this->anim_buf_width; + const int screen_pitch = _screen.pitch; + const int anim_pitch = this->anim_buf_pitch; + __m128i anim_cmp = _mm_set1_epi16(PALETTE_ANIM_START - 1); + __m128i brightness_cmp = _mm_set1_epi16(Blitter_32bppBase::DEFAULT_BRIGHTNESS); + __m128i colour_mask = _mm_set1_epi16(0xFF); + for (int y = this->anim_buf_height; y != 0 ; y--) { + Colour *next_dst_ln = dst + screen_pitch; + const uint16 *next_anim_ln = anim + anim_pitch; + int x = width; + while (x > 0) { + __m128i data = _mm_load_si128((const __m128i *) anim); + + /* low bytes only, shifted into high positions */ + __m128i colour_data = _mm_and_si128(data, colour_mask); + + /* test if any colour >= PALETTE_ANIM_START */ + int colour_cmp_result = _mm_movemask_epi8(_mm_cmpgt_epi16(colour_data, anim_cmp)); + if (colour_cmp_result) { + /* test if any brightness is unexpected */ + if (x < 8 || colour_cmp_result != 0xFFFF || + _mm_movemask_epi8(_mm_cmpeq_epi16(_mm_srli_epi16(data, 8), brightness_cmp)) != 0xFFFF) { + /* slow path: < 8 pixels left or unexpected brightnesses */ + for (int z = min(x, 8); z != 0 ; z--) { + int value = _mm_extract_epi16(data, 0); + uint8 colour = GB(value, 0, 8); + if (colour >= PALETTE_ANIM_START) { + /* Update this pixel */ + *dst = AdjustBrightneSSE(LookupColourInPalette(colour), GB(value, 8, 8)); + screen_dirty = true; + } + data = _mm_srli_si128(data, 2); + dst++; + } + } else { + /* medium path: 8 pixels to animate all of expected brightnesses */ + for (int z = 0; z < 8; z++) { + *dst = LookupColourInPalette(_mm_extract_epi16(colour_data, 0)); + colour_data = _mm_srli_si128(colour_data, 2); + dst++; + } + screen_dirty = true; + } + } else { + /* fast path, no animation */ + dst += 8; + } + anim += 8; + x -= 8; + } + dst = next_dst_ln; + anim = next_anim_ln; + } + + if (screen_dirty) { + /* Make sure the backend redraws the whole screen */ + VideoDriver::GetInstance()->MakeDirty(0, 0, _screen.width, _screen.height); + } +} + +#endif /* WITH_SSE */ diff --git a/src/blitter/32bpp_anim_sse2.hpp b/src/blitter/32bpp_anim_sse2.hpp new file mode 100644 index 0000000000..0d4a5f1e65 --- /dev/null +++ b/src/blitter/32bpp_anim_sse2.hpp @@ -0,0 +1,43 @@ +/* $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 32bpp_anim.hpp A partially SSE2 32 bpp blitter with animation support. */ + +#ifndef BLITTER_32BPP_SSE2_ANIM_HPP +#define BLITTER_32BPP_SSE2_ANIM_HPP + +#ifdef WITH_SSE + +#ifndef SSE_VERSION +#define SSE_VERSION 2 +#endif + +#ifndef FULL_ANIMATION +#define FULL_ANIMATION 1 +#endif + +#include "32bpp_anim.hpp" +#include "32bpp_sse2.hpp" + +/** A partially 32 bpp blitter with palette animation. */ +class Blitter_32bppSSE2_Anim : public Blitter_32bppAnim { +public: + /* virtual */ void PaletteAnimate(const Palette &palette); + /* virtual */ const char *GetName() { return "32bpp-sse2-anim"; } +}; + +/** Factory for the partially 32bpp blitter with animation. */ +class FBlitter_32bppSSE2_Anim : public BlitterFactory { +public: + FBlitter_32bppSSE2_Anim() : BlitterFactory("32bpp-sse2-anim", "32bpp partially SSE2 Animation Blitter (palette animation)", HasCPUIDFlag(1, 3, 26)) {} + /* virtual */ Blitter *CreateInstance() { return new Blitter_32bppSSE2_Anim(); } +}; + +#endif /* WITH_SSE */ +#endif /* BLITTER_32BPP_ANIM_HPP */ diff --git a/src/blitter/32bpp_anim_sse4.cpp b/src/blitter/32bpp_anim_sse4.cpp index 7d4b66fca6..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 @@ -35,7 +35,7 @@ inline void Blitter_32bppSSE4_Anim::Draw(const Blitter::BlitterParams *bp, ZoomL { const byte * const remap = bp->remap; Colour *dst_line = (Colour *) bp->dst + bp->top * bp->pitch + bp->left; - uint16 *anim_line = this->anim_buf + ((uint32 *)bp->dst - (uint32 *)_screen.dst_ptr) + bp->top * this->anim_buf_width + bp->left; + uint16 *anim_line = this->anim_buf + this->ScreenToAnimOffset((uint32 *)bp->dst) + bp->top * this->anim_buf_pitch + bp->left; int effective_width = bp->width; /* Find where to start reading in the source sprite. */ @@ -353,7 +353,7 @@ next_line: if (mode != BM_TRANSPARENT) src_mv_line += si->sprite_width; src_rgba_line = (const Colour*) ((const byte*) src_rgba_line + si->sprite_line_size); dst_line += bp->pitch; - anim_line += this->anim_buf_width; + anim_line += this->anim_buf_pitch; } } IGNORE_UNINITIALIZED_WARNING_STOP diff --git a/src/blitter/32bpp_anim_sse4.hpp b/src/blitter/32bpp_anim_sse4.hpp index e2d4cfc231..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 @@ -23,13 +23,14 @@ #endif #include "32bpp_anim.hpp" +#include "32bpp_anim_sse2.hpp" #include "32bpp_sse4.hpp" #undef MARGIN_NORMAL_THRESHOLD #define MARGIN_NORMAL_THRESHOLD 4 /** The SSE4 32 bpp blitter with palette animation. */ -class Blitter_32bppSSE4_Anim FINAL : public Blitter_32bppAnim, public Blitter_32bppSSE_Base { +class Blitter_32bppSSE4_Anim FINAL : public Blitter_32bppSSE2_Anim, public Blitter_32bppSSE_Base { private: public: diff --git a/src/blitter/32bpp_base.cpp b/src/blitter/32bpp_base.cpp index 26dd2f037e..c396e45410 100644 --- a/src/blitter/32bpp_base.cpp +++ b/src/blitter/32bpp_base.cpp @@ -143,6 +143,36 @@ void Blitter_32bppBase::PaletteAnimate(const Palette &palette) /* By default, 32bpp doesn't have palette animation */ } +Colour Blitter_32bppBase::ReallyAdjustBrightness(Colour colour, uint8 brightness) +{ + assert(DEFAULT_BRIGHTNESS == 1 << 7); + + uint64 combined = (((uint64) colour.r) << 32) | (((uint64) colour.g) << 16) | ((uint64) colour.b); + combined *= brightness; + + uint16 r = GB(combined, 39, 9); + uint16 g = GB(combined, 23, 9); + uint16 b = GB(combined, 7, 9); + + if ((combined & 0x800080008000L) == 0L) { + return Colour(r, g, b, colour.a); + } + + uint16 ob = 0; + /* Sum overbright */ + if (r > 255) ob += r - 255; + if (g > 255) ob += g - 255; + if (b > 255) ob += b - 255; + + /* Reduce overbright strength */ + ob /= 2; + return Colour( + r >= 255 ? 255 : min(r + ob * (255 - r) / 256, 255), + g >= 255 ? 255 : min(g + ob * (255 - g) / 256, 255), + b >= 255 ? 255 : min(b + ob * (255 - b) / 256, 255), + colour.a); +} + Blitter::PaletteAnimation Blitter_32bppBase::UsePaletteAnimation() { return Blitter::PALETTE_ANIMATION_NONE; diff --git a/src/blitter/32bpp_base.hpp b/src/blitter/32bpp_base.hpp index 26c3dee3fd..9b76271704 100644 --- a/src/blitter/32bpp_base.hpp +++ b/src/blitter/32bpp_base.hpp @@ -146,30 +146,14 @@ public: static const int DEFAULT_BRIGHTNESS = 128; + static Colour ReallyAdjustBrightness(Colour colour, uint8 brightness); + static inline Colour AdjustBrightness(Colour colour, uint8 brightness) { /* Shortcut for normal brightness */ if (brightness == DEFAULT_BRIGHTNESS) return colour; - uint16 ob = 0; - uint16 r = colour.r * brightness / DEFAULT_BRIGHTNESS; - uint16 g = colour.g * brightness / DEFAULT_BRIGHTNESS; - uint16 b = colour.b * brightness / DEFAULT_BRIGHTNESS; - - /* Sum overbright */ - if (r > 255) ob += r - 255; - if (g > 255) ob += g - 255; - if (b > 255) ob += b - 255; - - if (ob == 0) return Colour(r, g, b, colour.a); - - /* Reduce overbright strength */ - ob /= 2; - return Colour( - r >= 255 ? 255 : min(r + ob * (255 - r) / 256, 255), - g >= 255 ? 255 : min(g + ob * (255 - g) / 256, 255), - b >= 255 ? 255 : min(b + ob * (255 - b) / 256, 255), - colour.a); + return ReallyAdjustBrightness(colour, brightness); } }; diff --git a/src/blitter/32bpp_sse_type.h b/src/blitter/32bpp_sse_type.h index ac8da1be77..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 @@ -27,6 +27,8 @@ #define MARGIN_NORMAL_THRESHOLD (zoom == ZOOM_LVL_OUT_32X ? 8 : 4) ///< Minimum width to use margins with BM_NORMAL. #define MARGIN_REMAP_THRESHOLD 4 ///< Minimum width to use margins with BM_COLOUR_REMAP. +#undef ALIGN + #ifdef _MSC_VER #define ALIGN(n) __declspec(align(n)) #else @@ -53,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/blitter/8bpp_simple.cpp b/src/blitter/8bpp_simple.cpp index ed5dd3f7ae..2131a04682 100644 --- a/src/blitter/8bpp_simple.cpp +++ b/src/blitter/8bpp_simple.cpp @@ -48,7 +48,7 @@ void Blitter_8bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Zoom break; case BM_BLACK_REMAP: - colour = 0; + if (*src != 0) *dst = 0; break; default: diff --git a/src/bootstrap_gui.cpp b/src/bootstrap_gui.cpp index 7abc38563c..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. */ @@ -264,6 +264,6 @@ bool HandleBootstrap() /* Failure to get enough working to get a graphics set. */ failure: - usererror("Failed to find a graphics set. Please acquire a graphics set for OpenTTD. See section 4.1 of readme.txt."); + usererror("Failed to find a graphics set. Please acquire a graphics set for OpenTTD. See section 4.1 of README.md."); return false; } 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/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index bd4bf3b59b..51247e84ba 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -524,7 +524,7 @@ const StringID _engine_sort_listing[][12] = {{ static bool CDECL CargoFilter(const EngineID *eid, const CargoID cid) { if (cid == CF_ANY) return true; - uint32 refit_mask = GetUnionOfArticulatedRefitMasks(*eid, true) & _standard_cargo_mask; + CargoTypes refit_mask = GetUnionOfArticulatedRefitMasks(*eid, true) & _standard_cargo_mask; return (cid == CF_NONE ? refit_mask == 0 : HasBit(refit_mask, cid)); } @@ -535,7 +535,7 @@ static GUIEngineList::FilterFunction * const _filter_funcs[] = { static int DrawCargoCapacityInfo(int left, int right, int y, EngineID engine) { CargoArray cap; - uint32 refits; + CargoTypes refits; GetArticulatedVehicleCargoesAndRefits(engine, &cap, &refits); for (CargoID c = 0; c < NUM_CARGO; c++) { @@ -719,7 +719,15 @@ static int DrawShipPurchaseInfo(int left, int right, int y, EngineID engine_numb return y; } -/* Draw aircraft specific details */ +/** + * Draw aircraft specific details in the buy window. + * @param left Left edge of the window to draw in. + * @param right Right edge of the window to draw in. + * @param y Top of the area to draw in. + * @param engine_number Engine to display. + * @param refittable If set, the aircraft can be refitted. + * @return Bottom of the used area. + */ static int DrawAircraftPurchaseInfo(int left, int right, int y, EngineID engine_number, bool refittable) { const Engine *e = Engine::Get(engine_number); @@ -755,6 +763,12 @@ static int DrawAircraftPurchaseInfo(int left, int right, int y, EngineID engine_ DrawString(left, right, y, STR_PURCHASE_INFO_RUNNINGCOST); y += FONT_HEIGHT_NORMAL; + /* Aircraft type */ + SetDParam(0, e->GetAircraftTypeText()); + DrawString(left, right, y, STR_PURCHASE_INFO_AIRCRAFT_TYPE); + y += FONT_HEIGHT_NORMAL; + + /* Aircraft range, if available. */ uint16 range = e->GetRange(); if (range != 0) { SetDParam(0, range); diff --git a/src/cargo_type.h b/src/cargo_type.h index 7b7168a102..79d1c84f46 100644 --- a/src/cargo_type.h +++ b/src/cargo_type.h @@ -22,7 +22,7 @@ typedef byte CargoID; /** Available types of cargo */ -enum CargoTypes { +enum CargoType { /* Temperate */ CT_PASSENGERS = 0, CT_COAL = 1, @@ -63,13 +63,22 @@ enum CargoTypes { CT_PLASTIC = 10, CT_FIZZY_DRINKS = 11, - NUM_CARGO = 32, ///< Maximal number of cargo types in a game. + NUM_CARGO = 64, ///< Maximal number of cargo types in a game. CT_AUTO_REFIT = 0xFD, ///< Automatically choose cargo type when doing auto refitting. CT_NO_REFIT = 0xFE, ///< Do not refit cargo of a vehicle (used in vehicle orders and auto-replace/auto-new). 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)UINT64_MAX; + /** Class for storing amounts of cargo */ struct CargoArray { private: 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::ReassignIsValid()) #define FOR_ALL_CARGOSPECS(var) FOR_ALL_CARGOSPECS_FROM(var, 0) -#define FOR_EACH_SET_CARGO_ID(var, cargo_bits) FOR_EACH_SET_BIT_EX(CargoID, var, uint, cargo_bits) +#define FOR_EACH_SET_CARGO_ID(var, cargo_bits) FOR_EACH_SET_BIT_EX(CargoID, var, CargoTypes, cargo_bits) /** * Loop header for iterating over cargoes, sorted by name. This includes phony cargoes like regearing cargoes. diff --git a/src/clear_cmd.cpp b/src/clear_cmd.cpp index 2e9589aee2..f9eb88df54 100644 --- a/src/clear_cmd.cpp +++ b/src/clear_cmd.cpp @@ -56,7 +56,7 @@ void DrawHillyLandTile(const TileInfo *ti) if (ti->tileh != SLOPE_FLAT) { DrawGroundSprite(SPR_FLAT_ROUGH_LAND + SlopeToSpriteOffset(ti->tileh), PAL_NONE); } else { - DrawGroundSprite(_landscape_clear_sprites_rough[GB(ti->x ^ ti->y, 4, 3)], PAL_NONE); + DrawGroundSprite(_landscape_clear_sprites_rough[GB(TileHash(ti->x, ti->y), 0, 3)], PAL_NONE); } } diff --git a/src/clear_map.h b/src/clear_map.h index 76b1e82d04..d24916de35 100644 --- a/src/clear_map.h +++ b/src/clear_map.h @@ -269,6 +269,7 @@ static inline void MakeClear(TileIndex t, ClearGround g, uint density) SetClearGroundDensity(t, g, density); // Sets m5 _me[t].m6 = 0; _me[t].m7 = 0; + _me[t].m8 = 0; } @@ -289,6 +290,7 @@ static inline void MakeField(TileIndex t, uint field_type, IndustryID industry) SetClearGroundDensity(t, CLEAR_FIELDS, 3); SB(_me[t].m6, 2, 4, 0); _me[t].m7 = 0; + _me[t].m8 = 0; } /** diff --git a/src/command.cpp b/src/command.cpp index 959610cd28..e7a5a3c36b 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -167,6 +167,7 @@ CommandProc CmdSetStoryPageDate; CommandProc CmdShowStoryPage; CommandProc CmdRemoveStoryPage; CommandProc CmdRemoveStoryPageElement; +CommandProc CmdScrollViewport; CommandProc CmdLevelLand; @@ -322,6 +323,7 @@ static const Command _command_proc_table[] = { DEF_CMD(CmdShowStoryPage, CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_SHOW_STORY_PAGE DEF_CMD(CmdRemoveStoryPage, CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_REMOVE_STORY_PAGE DEF_CMD(CmdRemoveStoryPageElement, CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_REMOVE_STORY_ELEMENT_PAGE + DEF_CMD(CmdScrollViewport, CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_SCROLL_VIEWPORT DEF_CMD(CmdLevelLand, CMD_ALL_TILES | CMD_NO_TEST | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_LEVEL_LAND; test run might clear tiles multiple times, in execution that only happens once @@ -603,7 +605,6 @@ bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallbac /** * Helper to deduplicate the code for returning. * @param cmd the command cost to return. - * @param clear whether to keep the storage changes or not. */ #define return_dcpi(cmd) { _docommand_recursive = 0; return cmd; } diff --git a/src/command_func.h b/src/command_func.h index c4cc51e3da..3369475675 100644 --- a/src/command_func.h +++ b/src/command_func.h @@ -81,7 +81,7 @@ CommandCallback CcBuildBridge; /* dock_gui.cpp */ CommandCallback CcBuildDocks; -CommandCallback CcBuildCanal; +CommandCallback CcPlaySound_SPLAT_WATER; /* depot_gui.cpp */ CommandCallback CcCloneVehicle; @@ -97,19 +97,19 @@ CommandCallback CcAddVehicleNewGroup; CommandCallback CcBuildIndustry; /* main_gui.cpp */ -CommandCallback CcPlaySound10; +CommandCallback CcPlaySound_EXPLOSION; CommandCallback CcPlaceSign; CommandCallback CcTerraform; CommandCallback CcGiveMoney; /* rail_gui.cpp */ -CommandCallback CcPlaySound1E; +CommandCallback CcPlaySound_SPLAT_RAIL; CommandCallback CcRailDepot; CommandCallback CcStation; CommandCallback CcBuildRailTunnel; /* road_gui.cpp */ -CommandCallback CcPlaySound1D; +CommandCallback CcPlaySound_SPLAT_OTHER; CommandCallback CcBuildRoadTunnel; CommandCallback CcRoadDepot; CommandCallback CcRoadStop; diff --git a/src/command_type.h b/src/command_type.h index f318216acc..0a2fde297b 100644 --- a/src/command_type.h +++ b/src/command_type.h @@ -293,6 +293,8 @@ enum Commands { CMD_SHOW_STORY_PAGE, ///< show a story page CMD_REMOVE_STORY_PAGE, ///< remove a story page CMD_REMOVE_STORY_PAGE_ELEMENT, ///< remove a story page element + CMD_SCROLL_VIEWPORT, ///< scroll main viewport of players + CMD_LEVEL_LAND, ///< level land CMD_BUILD_LOCK, ///< build a lock diff --git a/src/company_base.h b/src/company_base.h index 0017761216..9d2bc90009 100644 --- a/src/company_base.h +++ b/src/company_base.h @@ -52,10 +52,10 @@ extern CompanyPool _company_pool; /** Statically loadable part of Company pool item */ struct CompanyProperties { uint32 name_2; ///< Parameter of #name_1. - uint16 name_1; ///< Name of the company if the user did not change it. + StringID name_1; ///< Name of the company if the user did not change it. char *name; ///< Name of the company if the user changed it. - uint16 president_name_1; ///< Name of the president if the user did not change it. + StringID president_name_1; ///< Name of the president if the user did not change it. uint32 president_name_2; ///< Parameter of #president_name_1 char *president_name; ///< Name of the president if the user changed it. @@ -67,8 +67,6 @@ struct CompanyProperties { byte colour; ///< Company colour. - RailTypes avail_railtypes; ///< Rail types available to the company. - byte block_preview; ///< Number of quarters that the company is not allowed to get new exclusive engine previews (see CompaniesGenStatistics). TileIndex location_of_HQ; ///< Northern tile of HQ; #INVALID_TILE when there is none. @@ -93,12 +91,18 @@ struct CompanyProperties { */ bool is_ai; - Money yearly_expenses[3][EXPENSES_END]; ///< Expenses of the company for the last three years, in every #Expenses category. + Money yearly_expenses[3][EXPENSES_END]; ///< Expenses of the company for the last three years, in every #ExpensesType category. CompanyEconomyEntry cur_economy; ///< Economic data of the company of this quarter. CompanyEconomyEntry old_economy[MAX_HISTORY_QUARTERS]; ///< Economic data of the company of the last #MAX_HISTORY_QUARTERS quarters. byte num_valid_stat_ent; ///< Number of valid statistical entries in #old_economy. - CompanyProperties() : name(NULL), president_name(NULL) {} + // TODO: Change some of these member variables to use relevant INVALID_xxx constants + CompanyProperties() + : name_2(0), name_1(0), name(NULL), president_name_1(0), president_name_2(0), president_name(NULL), + face(0), money(0), money_fraction(0), current_loan(0), colour(0), block_preview(0), + location_of_HQ(0), last_build_coordinate(0), share_owners(), inaugurated_year(0), + months_of_bankruptcy(0), bankrupt_asked(0), bankrupt_timeout(0), bankrupt_value(0), + terraform_limit(0), clear_limit(0), tree_limit(0), is_ai(false) {} ~CompanyProperties() { @@ -112,6 +116,7 @@ struct Company : CompanyPool::PoolItem<&_company_pool>, CompanyProperties { ~Company(); Livery livery[LS_END]; + RailTypes avail_railtypes; ///< Rail types available to this company. RoadTypes avail_roadtypes; ///< Road types available to this company. class AIInstance *ai_instance; diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index 577ea884d8..c4e1a89d72 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -162,7 +162,7 @@ static bool IsValidCompanyManagerFace(CompanyManagerFace cmf) for (CompanyManagerFaceVariable cmfv = CMFV_CHEEKS; cmfv < CMFV_END; cmfv++) { switch (cmfv) { case CMFV_MOUSTACHE: if (!has_moustache) continue; break; - case CMFV_LIPS: // FALL THROUGH + case CMFV_LIPS: case CMFV_NOSE: if (has_moustache) continue; break; case CMFV_TIE_EARRING: if (!has_tie_earring) continue; break; case CMFV_GLASSES: if (!has_glasses) continue; break; @@ -188,7 +188,7 @@ void InvalidateCompanyWindows(const Company *company) /** * Verify whether the company can pay the bill. - * @param cost [inout] Money to pay, is changed to an error if the company does not have enough money. + * @param[in,out] cost Money to pay, is changed to an error if the company does not have enough money. * @return Function returns \c true if the company has enough money, else it returns \c false. */ bool CheckCompanyHasMoney(CommandCost &cost) diff --git a/src/company_gui.cpp b/src/company_gui.cpp index 0be6679583..ac9ca9bda9 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -268,10 +268,7 @@ static const NWidgetPart _nested_company_finances_widgets[] = { EndContainer(), }; -/** - * Window class displaying the company finances. - * @todo #money_width should be calculated dynamically. - */ +/** Window class displaying the company finances. */ struct CompanyFinancesWindow : Window { static Money max_money; ///< The maximum amount of money a company has had this 'run' bool small; ///< Window is toggled to 'small'. @@ -318,7 +315,8 @@ struct CompanyFinancesWindow : Window { case WID_CF_EXPS_PRICE2: case WID_CF_EXPS_PRICE3: size->height = _expenses_list_types[type].GetHeight(); - /* FALL THROUGH */ + FALLTHROUGH; + case WID_CF_BALANCE_VALUE: case WID_CF_LOAN_VALUE: case WID_CF_TOTAL_VALUE: @@ -636,7 +634,8 @@ public: size->width = 0; break; } - /* FALL THROUGH */ + FALLTHROUGH; + case WID_SCL_PRI_COL_DROPDOWN: { int padding = this->square.width + NWidgetScrollbar::GetVerticalDimension().width + 10; for (const StringID *id = _colour_dropdown; id != endof(_colour_dropdown); id++) { @@ -892,7 +891,7 @@ void DrawCompanyManagerFace(CompanyManagerFace cmf, int colour, int x, int y) for (CompanyManagerFaceVariable cmfv = CMFV_CHEEKS; cmfv < CMFV_END; cmfv++) { switch (cmfv) { case CMFV_MOUSTACHE: if (!has_moustache) continue; break; - case CMFV_LIPS: // FALL THROUGH + case CMFV_LIPS: case CMFV_NOSE: if (has_moustache) continue; break; case CMFV_TIE_EARRING: if (!has_tie_earring) continue; break; case CMFV_GLASSES: if (!has_glasses) continue; break; @@ -1365,7 +1364,7 @@ public: /* OK button */ case WID_SCMF_ACCEPT: DoCommandP(0, 0, this->face, CMD_SET_COMPANY_MANAGER_FACE); - /* FALL THROUGH */ + FALLTHROUGH; /* Cancel button */ case WID_SCMF_CANCEL: @@ -1507,9 +1506,6 @@ static WindowDesc _select_company_manager_face_desc( * Open the simple/advanced company manager face selection window * * @param parent the parent company window - * @param adv simple or advanced face selection window - * @param top previous top position of the window - * @param left previous left position of the window */ static void DoSelectCompanyManagerFace(Window *parent) { @@ -2381,7 +2377,7 @@ struct CompanyWindow : Window virtual void OnPlaceObject(Point pt, TileIndex tile) { - if (DoCommandP(tile, OBJECT_HQ, 0, CMD_BUILD_OBJECT | CMD_MSG(STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS))) { + if (DoCommandP(tile, OBJECT_HQ, 0, CMD_BUILD_OBJECT | CMD_MSG(STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS)) && !_shift_pressed) { ResetObjectToPlace(); this->RaiseButtons(); } diff --git a/src/company_manager_face.h b/src/company_manager_face.h index 993e539cc7..511f85b7d5 100644 --- a/src/company_manager_face.h +++ b/src/company_manager_face.h @@ -78,7 +78,7 @@ static const CompanyManagerFaceBitsInfo _cmf_info[] = { /* CMFV_MOUSTACHE */ { 13, 2, { 3, 0, 3, 0 }, { 0x367, 0, 0x397, 0 } }, ///< Depends on CMFV_HAS_MOUSTACHE /* CMFV_LIPS */ { 13, 4, { 12, 10, 9, 9 }, { 0x35B, 0x351, 0x3A5, 0x3C8 } }, ///< Depends on !CMFV_HAS_MOUSTACHE /* CMFV_NOSE */ { 17, 3, { 8, 4, 4, 5 }, { 0x349, 0x34C, 0x393, 0x3B3 } }, ///< Depends on !CMFV_HAS_MOUSTACHE - /* CMFV_HAIR */ { 20, 4, { 9, 5, 5, 4 }, { 0x382, 0x38B, 0x3D4, 0x3D9 } }, + /* CMFV_HAIR */ { 20, 4, { 9, 5, 5, 5 }, { 0x382, 0x38B, 0x3D4, 0x3D9 } }, /* CMFV_JACKET */ { 24, 2, { 3, 3, 3, 3 }, { 0x36B, 0x378, 0x36B, 0x378 } }, /* CMFV_COLLAR */ { 26, 2, { 4, 4, 4, 4 }, { 0x36E, 0x37B, 0x36E, 0x37B } }, /* CMFV_TIE_EARRING */ { 28, 3, { 6, 3, 6, 3 }, { 0x372, 0x37F, 0x372, 0x3D1 } }, ///< Depends on CMFV_HAS_TIE_EARRING diff --git a/src/console.cpp b/src/console.cpp index 511019281a..2cf9d96958 100644 --- a/src/console.cpp +++ b/src/console.cpp @@ -235,8 +235,8 @@ void IConsoleAddSorted(T **base, T *item_new) /** * Remove underscores from a string; the string will be modified! - * @param name The string to remove the underscores from. - * @return #name. + * @param[in,out] name String to remove the underscores from. + * @return \a name, with its contents modified. */ char *RemoveUnderscores(char *name) { @@ -434,7 +434,10 @@ void IConsoleCmdExec(const char *cmdstr) * enclosed in "" are taken as one token. We can only go as far as the amount * of characters in our stream or the max amount of tokens we can handle */ for (cmdptr = cmdstr, t_index = 0, tstream_i = 0; *cmdptr != '\0'; cmdptr++) { - if (t_index >= lengthof(tokens) || tstream_i >= lengthof(tokenstream)) break; + if (tstream_i >= lengthof(tokenstream)) { + IConsoleError("command line too long"); + return; + } switch (*cmdptr) { case ' ': // Token separator @@ -452,6 +455,10 @@ void IConsoleCmdExec(const char *cmdstr) case '"': // Tokens enclosed in "" are one token longtoken = !longtoken; if (!foundtoken) { + if (t_index >= lengthof(tokens)) { + IConsoleError("command line too long"); + return; + } tokens[t_index++] = &tokenstream[tstream_i]; foundtoken = true; } @@ -461,11 +468,15 @@ void IConsoleCmdExec(const char *cmdstr) tokenstream[tstream_i++] = *++cmdptr; break; } - /* FALL THROUGH */ + FALLTHROUGH; default: // Normal character tokenstream[tstream_i++] = *cmdptr; if (!foundtoken) { + if (t_index >= lengthof(tokens)) { + IConsoleError("command line too long"); + return; + } tokens[t_index++] = &tokenstream[tstream_i - 1]; foundtoken = true; } @@ -473,7 +484,7 @@ void IConsoleCmdExec(const char *cmdstr) } } - for (uint i = 0; tokens[i] != NULL; i++) { + for (uint i = 0; i < lengthof(tokens) && tokens[i] != NULL; i++) { DEBUG(console, 8, "Token %d is: '%s'", i, tokens[i]); } diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index 8d9e04113d..d9155a97db 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -45,6 +45,38 @@ /* scriptfile handling */ static bool _script_running; ///< Script is running (used to abort execution when #ConReturn is encountered). +/** File list storage for the console, for caching the last 'ls' command. */ +class ConsoleFileList : public FileList { +public: + ConsoleFileList() : FileList() + { + this->file_list_valid = false; + } + + /** Declare the file storage cache as being invalid, also clears all stored files. */ + void InvalidateFileList() + { + this->Clear(); + this->file_list_valid = false; + } + + /** + * (Re-)validate the file storage cache. Only makes a change if the storage was invalid, or if \a force_reload. + * @param force_reload Always reload the file storage cache. + */ + void ValidateFileList(bool force_reload = false) + { + if (force_reload || !this->file_list_valid) { + this->BuildFileList(FT_SAVEGAME, SLO_LOAD); + this->file_list_valid = true; + } + } + + bool file_list_valid; ///< If set, the file list is valid. +}; + +static ConsoleFileList _console_file_list; ///< File storage cache for the console. + /* console command defines */ #define DEF_CONSOLE_CMD(function) static bool function(byte argc, char *argv[]) #define DEF_CONSOLE_HOOK(function) static ConsoleHookResult function(bool echo) @@ -224,8 +256,8 @@ DEF_CONSOLE_CMD(ConResetTile) /** * Scroll to a tile on the map. - * @param arg1 tile tile number or tile x coordinate. - * @param arg2 optionally tile y coordinate. + * param x tile number or tile x coordinate. + * param y optional y coordinate. * @note When only one argument is given it is intepreted as the tile number. * When two arguments are given, they are interpreted as the tile's x * and y coordinates. @@ -272,7 +304,7 @@ DEF_CONSOLE_CMD(ConScrollToTile) /** * Save the map to a file. - * @param filename the filename to save the map to. + * param filename the filename to save the map to. * @return True when help was displayed or the file attempted to be saved. */ DEF_CONSOLE_CMD(ConSave) @@ -286,7 +318,7 @@ DEF_CONSOLE_CMD(ConSave) char *filename = str_fmt("%s.sav", argv[1]); IConsolePrint(CC_DEFAULT, "Saving map..."); - if (SaveOrLoad(filename, SL_SAVE, SAVE_DIR) != SL_OK) { + if (SaveOrLoad(filename, SLO_SAVE, DFT_GAME_FILE, SAVE_DIR) != SL_OK) { IConsolePrint(CC_ERROR, "Saving map failed"); } else { IConsolePrintF(CC_DEFAULT, "Map successfully saved to %s", filename); @@ -315,42 +347,6 @@ DEF_CONSOLE_CMD(ConSaveConfig) return true; } -/** - * Get savegame file informations. - * @param file The savegame filename to return information about. Can be the actual name - * or a numbered entry into the filename list. - * @return FiosItem The information on the file. - */ -static const FiosItem *GetFiosItem(const char *file) -{ - _saveload_mode = SLD_LOAD_GAME; - BuildFileList(); - - for (const FiosItem *item = _fios_items.Begin(); item != _fios_items.End(); item++) { - if (strcmp(file, item->name) == 0) return item; - if (strcmp(file, item->title) == 0) return item; - } - - /* If no name matches, try to parse it as number */ - char *endptr; - int i = strtol(file, &endptr, 10); - if (file == endptr || *endptr != '\0') i = -1; - - if (IsInsideMM(i, 0, _fios_items.Length())) return _fios_items.Get(i); - - /* As a last effort assume it is an OpenTTD savegame and - * that the ".sav" part was not given. */ - char long_file[MAX_PATH]; - seprintf(long_file, lastof(long_file), "%s.sav", file); - for (const FiosItem *item = _fios_items.Begin(); item != _fios_items.End(); item++) { - if (strcmp(long_file, item->name) == 0) return item; - if (strcmp(long_file, item->title) == 0) return item; - } - - return NULL; -} - - DEF_CONSOLE_CMD(ConLoad) { if (argc == 0) { @@ -361,24 +357,21 @@ DEF_CONSOLE_CMD(ConLoad) if (argc != 2) return false; const char *file = argv[1]; - const FiosItem *item = GetFiosItem(file); + _console_file_list.ValidateFileList(); + const FiosItem *item = _console_file_list.FindItem(file); if (item != NULL) { - switch (item->type) { - case FIOS_TYPE_FILE: case FIOS_TYPE_OLDFILE: { - _switch_mode = SM_LOAD_GAME; - SetFiosType(item->type); - - strecpy(_file_to_saveload.name, FiosBrowseTo(item), lastof(_file_to_saveload.name)); - strecpy(_file_to_saveload.title, item->title, lastof(_file_to_saveload.title)); - break; - } - default: IConsolePrintF(CC_ERROR, "%s: Not a savegame.", file); + if (GetAbstractFileType(item->type) == FT_SAVEGAME) { + _switch_mode = SM_LOAD_GAME; + _file_to_saveload.SetMode(item->type); + _file_to_saveload.SetName(FiosBrowseTo(item)); + _file_to_saveload.SetTitle(item->title); + } else { + IConsolePrintF(CC_ERROR, "%s: Not a savegame.", file); } } else { IConsolePrintF(CC_ERROR, "%s: No such file or directory.", file); } - FiosFreeSavegameList(); return true; } @@ -393,7 +386,8 @@ DEF_CONSOLE_CMD(ConRemove) if (argc != 2) return false; const char *file = argv[1]; - const FiosItem *item = GetFiosItem(file); + _console_file_list.ValidateFileList(); + const FiosItem *item = _console_file_list.FindItem(file); if (item != NULL) { if (!FiosDelete(item->name)) { IConsolePrintF(CC_ERROR, "%s: Failed to delete file", file); @@ -402,7 +396,7 @@ DEF_CONSOLE_CMD(ConRemove) IConsolePrintF(CC_ERROR, "%s: No such file or directory.", file); } - FiosFreeSavegameList(); + _console_file_list.InvalidateFileList(); return true; } @@ -415,13 +409,11 @@ DEF_CONSOLE_CMD(ConListFiles) return true; } - BuildFileList(); - - for (uint i = 0; i < _fios_items.Length(); i++) { - IConsolePrintF(CC_DEFAULT, "%d) %s", i, _fios_items[i].title); + _console_file_list.ValidateFileList(true); + for (uint i = 0; i < _console_file_list.Length(); i++) { + IConsolePrintF(CC_DEFAULT, "%d) %s", i, _console_file_list[i].title); } - FiosFreeSavegameList(); return true; } @@ -436,7 +428,8 @@ DEF_CONSOLE_CMD(ConChangeDirectory) if (argc != 2) return false; const char *file = argv[1]; - const FiosItem *item = GetFiosItem(file); + _console_file_list.ValidateFileList(true); + const FiosItem *item = _console_file_list.FindItem(file); if (item != NULL) { switch (item->type) { case FIOS_TYPE_DIR: case FIOS_TYPE_DRIVE: case FIOS_TYPE_PARENT: @@ -448,7 +441,7 @@ DEF_CONSOLE_CMD(ConChangeDirectory) IConsolePrintF(CC_ERROR, "%s: No such file or directory.", file); } - FiosFreeSavegameList(); + _console_file_list.InvalidateFileList(); return true; } @@ -462,8 +455,8 @@ DEF_CONSOLE_CMD(ConPrintWorkingDirectory) } /* XXX - Workaround for broken file handling */ - FiosGetSavegameList(SLD_LOAD_GAME); - FiosFreeSavegameList(); + _console_file_list.ValidateFileList(true); + _console_file_list.InvalidateFileList(); FiosGetDescText(&path, NULL); IConsolePrint(CC_DEFAULT, path); @@ -560,29 +553,36 @@ DEF_CONSOLE_CMD(ConBan) DEF_CONSOLE_CMD(ConUnBan) { - if (argc == 0) { - IConsoleHelp("Unban a client from a network game. Usage: 'unban '"); + IConsoleHelp("Unban a client from a network game. Usage: 'unban '"); IConsoleHelp("For a list of banned IP's, see the command 'banlist'"); return true; } if (argc != 2) return false; - uint index = (strchr(argv[1], '.') == NULL) ? atoi(argv[1]) : 0; - index--; - uint i = 0; - - for (char **iter = _network_ban_list.Begin(); iter != _network_ban_list.End(); iter++, i++) { - if (strcmp(_network_ban_list[i], argv[1]) == 0 || index == i) { - free(_network_ban_list[i]); - _network_ban_list.Erase(iter); - IConsolePrint(CC_DEFAULT, "IP unbanned."); - return true; - } + /* Try by IP. */ + uint index; + for (index = 0; index < _network_ban_list.Length(); index++) { + if (strcmp(_network_ban_list[index], argv[1]) == 0) break; + } + + /* Try by index. */ + if (index >= _network_ban_list.Length()) { + index = atoi(argv[1]) - 1U; // let it wrap + } + + if (index < _network_ban_list.Length()) { + char msg[64]; + seprintf(msg, lastof(msg), "Unbanned %s", _network_ban_list[index]); + IConsolePrint(CC_DEFAULT, msg); + free(_network_ban_list[index]); + _network_ban_list.Erase(_network_ban_list.Get(index)); + } else { + IConsolePrint(CC_DEFAULT, "Invalid list index or IP not in ban-list."); + IConsolePrint(CC_DEFAULT, "For a list of banned IP's, see the command 'banlist'"); } - IConsolePrint(CC_DEFAULT, "IP not in ban-list."); return true; } @@ -1895,6 +1895,37 @@ static void IConsoleDebugLibRegister() } #endif +DEF_CONSOLE_CMD(ConFramerate) +{ + extern void ConPrintFramerate(); // framerate_gui.cpp + + if (argc == 0) { + IConsoleHelp("Show frame rate and game speed information"); + return true; + } + + ConPrintFramerate(); + return true; +} + +DEF_CONSOLE_CMD(ConFramerateWindow) +{ + extern void ShowFramerateWindow(); + + if (argc == 0) { + IConsoleHelp("Open the frame rate window"); + return true; + } + + if (_network_dedicated) { + IConsoleError("Can not open frame rate window on a dedicated server"); + return false; + } + + ShowFramerateWindow(); + return true; +} + /******************************* * console command registration *******************************/ @@ -2025,6 +2056,8 @@ void IConsoleStdLibRegister() #ifdef _DEBUG IConsoleDebugLibRegister(); #endif + IConsoleCmdRegister("fps", ConFramerate); + IConsoleCmdRegister("fps_wnd", ConFramerateWindow); /* NewGRF development stuff */ IConsoleCmdRegister("reload_newgrfs", ConNewGRFReload, ConHookNewGRFDeveloperTool); diff --git a/src/core/alloc_func.hpp b/src/core/alloc_func.hpp index c7e17421f7..c33e733016 100644 --- a/src/core/alloc_func.hpp +++ b/src/core/alloc_func.hpp @@ -125,7 +125,7 @@ static inline T *ReallocT(T *t_ptr, size_t num_elements) /* Ensure the size does not overflow. */ CheckAllocationConstraints(num_elements); - t_ptr = (T*)realloc(t_ptr, num_elements * sizeof(T)); + t_ptr = (T*)realloc(static_cast(t_ptr), num_elements * sizeof(T)); if (t_ptr == NULL) ReallocError(num_elements * sizeof(T)); return t_ptr; } diff --git a/src/core/backup_type.hpp b/src/core/backup_type.hpp index 60799170f7..7e3771b70f 100644 --- a/src/core/backup_type.hpp +++ b/src/core/backup_type.hpp @@ -53,7 +53,7 @@ struct Backup { { /* We cannot assert here, as missing restoration is 'normal' when exceptions are thrown. * Exceptions are especially used to abort world generation. */ - DEBUG(misc, 0, "%s:%d: Backupped value was not restored!", this->file, this->line); + DEBUG(misc, 0, "%s:%d: Backed-up value was not restored!", this->file, this->line); this->Restore(); } } diff --git a/src/core/bitmath_func.hpp b/src/core/bitmath_func.hpp index 31e679b005..18c3f91b53 100644 --- a/src/core/bitmath_func.hpp +++ b/src/core/bitmath_func.hpp @@ -302,6 +302,7 @@ static inline bool HasAtMostOneBit(T value) template 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)); } @@ -365,13 +367,32 @@ static inline T ROR(const T x, const uint8 n) * (since it will use hardware swapping if available). * Even though they should return uint16 and uint32, we get * warnings if we don't cast those (why?) */ + #define BSWAP64(x) ((uint64)CFSwapInt64(x)) #define BSWAP32(x) ((uint32)CFSwapInt32(x)) #define BSWAP16(x) ((uint16)CFSwapInt16(x)) #elif defined(_MSC_VER) /* MSVC has intrinsics for swapping, resulting in faster code */ + #define BSWAP64(x) (_byteswap_uint64(x)) #define BSWAP32(x) (_byteswap_ulong(x)) #define BSWAP16(x) (_byteswap_ushort(x)) #else + /** + * Perform a 64 bits endianness bitswap on x. + * @param x the variable to bitswap + * @return the bitswapped value. + */ + static inline uint64 BSWAP64(uint64 x) + { +#if !defined(__ICC) && (defined(__GNUC__) || defined(__clang__)) + /* GCC >= 4.3 provides a builtin, resulting in faster code */ + return (uint64)__builtin_bswap64((uint64)x); +#else + return ((x >> 56) & 0xFFULL) | ((x >> 40) & 0xFF00ULL) | ((x >> 24) & 0xFF0000ULL) | ((x >> 8) & 0xFF000000ULL) | + ((x << 8) & 0xFF00000000ULL) | ((x << 24) & 0xFF0000000000ULL) | ((x << 40) & 0xFF000000000000ULL) | ((x << 56) & 0xFF000000000000ULL); + ; +#endif /* __GNUC__ || __clang__ */ + } + /** * Perform a 32 bits endianness bitswap on x. * @param x the variable to bitswap diff --git a/src/core/container_func.hpp b/src/core/container_func.hpp new file mode 100644 index 0000000000..276c1f7f54 --- /dev/null +++ b/src/core/container_func.hpp @@ -0,0 +1,42 @@ +/* $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 container_func.hpp Functions related to use of containers. */ + +#ifndef CONTAINER_FUNC_HPP +#define CONTAINER_FUNC_HPP + +#include + +template unsigned int container_unordered_remove_if (C &container, UP predicate) { + unsigned int removecount = 0; + for (auto it = container.begin(); it != container.end();) { + if (predicate(*it)) { + removecount++; + if (std::next(it) != container.end()) { + *it = std::move(container.back()); + container.pop_back(); + } else { + container.pop_back(); + break; + } + } else { + ++it; + } + } + return removecount; +} + +template unsigned int container_unordered_remove(C &container, const V &value) { + return container_unordered_remove_if (container, [&](const typename C::value_type &v) { + return v == value; + }); +} + +#endif /* CONTAINER_FUNC_HPP */ diff --git a/src/core/dyn_arena_alloc.hpp b/src/core/dyn_arena_alloc.hpp new file mode 100644 index 0000000000..2a074d6aa1 --- /dev/null +++ b/src/core/dyn_arena_alloc.hpp @@ -0,0 +1,102 @@ +/* $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 dyn_arena_alloc.hpp Dynamic chunk-size arena allocator. */ + +#ifndef DYN_ARENA_ALLOC_HPP +#define DYN_ARENA_ALLOC_HPP + +#include + +/** + * Custom arena allocator for uniform-size allocations of a variable size. + * The allocation and chunk sizes may only be changed when the arena is empty. + */ +class DynUniformArenaAllocator { + std::vector used_blocks; + + void *current_block = nullptr; + void *last_freed = nullptr; + size_t next_position = 0; + + size_t item_size = 0; + size_t items_per_chunk = 0; + + void NewBlock() + { + current_block = malloc(item_size * items_per_chunk); + assert(current_block != nullptr); + next_position = 0; + used_blocks.push_back(current_block); + } + + public: + DynUniformArenaAllocator() = default; + DynUniformArenaAllocator(const DynUniformArenaAllocator &other) = delete; + DynUniformArenaAllocator& operator=(const DynUniformArenaAllocator &other) = delete; + + ~DynUniformArenaAllocator() + { + EmptyArena(); + } + + void EmptyArena() + { + current_block = nullptr; + last_freed = nullptr; + next_position = 0; + for (void *block : used_blocks) { + free(block); + } + used_blocks.clear(); + } + + void ResetArena() + { + EmptyArena(); + item_size = 0; + items_per_chunk = 0; + } + + void *Allocate() { + assert(item_size != 0); + if (last_freed) { + void *ptr = last_freed; + last_freed = *reinterpret_cast(ptr); + return ptr; + } else { + if (current_block == nullptr || next_position == items_per_chunk) { + NewBlock(); + } + void *out = reinterpret_cast(current_block) + (item_size * next_position); + next_position++; + return out; + } + } + + void Free(void *ptr) { + if (!ptr) return; + assert(current_block != nullptr); + + *reinterpret_cast(ptr) = last_freed; + last_freed = ptr; + } + + void SetParameters(size_t item_size, size_t items_per_chunk) + { + if (item_size < sizeof(void *)) item_size = sizeof(void *); + if (this->item_size == item_size && this->items_per_chunk == items_per_chunk) return; + + assert(current_block == nullptr); + this->item_size = item_size; + this->items_per_chunk = items_per_chunk; + } +}; + +#endif /* DYN_ARENA_ALLOC_HPP */ diff --git a/src/core/endian_func.hpp b/src/core/endian_func.hpp index ab5b181500..48060bd1ad 100644 --- a/src/core/endian_func.hpp +++ b/src/core/endian_func.hpp @@ -19,25 +19,33 @@ #if TTD_ENDIAN == TTD_BIG_ENDIAN #define FROM_BE16(x) (x) #define FROM_BE32(x) (x) + #define FROM_BE64(x) (x) #define TO_BE16(x) (x) #define TO_BE32(x) (x) #define TO_BE32X(x) (x) + #define TO_BE64(x) (x) #define FROM_LE16(x) BSWAP16(x) #define FROM_LE32(x) BSWAP32(x) + #define FROM_LE64(x) BSWAP64(x) #define TO_LE16(x) BSWAP16(x) #define TO_LE32(x) BSWAP32(x) #define TO_LE32X(x) BSWAP32(x) + #define TO_LE64(x) BSWAP64(x) #else #define FROM_BE16(x) BSWAP16(x) #define FROM_BE32(x) BSWAP32(x) + #define FROM_BE64(x) BSWAP64(x) #define TO_BE16(x) BSWAP16(x) #define TO_BE32(x) BSWAP32(x) #define TO_BE32X(x) BSWAP32(x) + #define TO_BE64(x) BSWAP64(x) #define FROM_LE16(x) (x) #define FROM_LE32(x) (x) + #define FROM_LE64(x) (x) #define TO_LE16(x) (x) #define TO_LE32(x) (x) #define TO_LE32X(x) (x) + #define TO_LE64(x) (x) #endif /* TTD_ENDIAN == TTD_BIG_ENDIAN */ static inline uint16 ReadLE16Aligned(const void *x) diff --git a/src/core/endian_type.hpp b/src/core/endian_type.hpp index dbb7faec66..4058c5c19a 100644 --- a/src/core/endian_type.hpp +++ b/src/core/endian_type.hpp @@ -26,15 +26,22 @@ #define TTD_BIG_ENDIAN 1 /* Windows has always LITTLE_ENDIAN */ -#if defined(WIN32) || defined(__OS2__) || defined(WIN64) - #define TTD_ENDIAN TTD_LITTLE_ENDIAN +#if defined(_WIN32) || defined(__OS2__) +# define TTD_ENDIAN TTD_LITTLE_ENDIAN +#elif defined(OSX) +# include +# if __DARWIN_BYTE_ORDER == __DARWIN_LITTLE_ENDIAN +# define TTD_ENDIAN TTD_LITTLE_ENDIAN +# else +# define TTD_ENDIAN TTD_BIG_ENDIAN +# endif #elif !defined(TESTING) - /* Else include endian[target/host].h, which has the endian-type, autodetected by the Makefile */ - #if defined(STRGEN) || defined(SETTINGSGEN) - #include "endian_host.h" - #else - #include "endian_target.h" - #endif -#endif /* WIN32 || __OS2__ || WIN64 */ +# include +# if __BYTE_ORDER == __LITTLE_ENDIAN +# define TTD_ENDIAN TTD_LITTLE_ENDIAN +# else +# define TTD_ENDIAN TTD_BIG_ENDIAN +# endif +#endif /* _WIN32 || __OS2__ */ #endif /* ENDIAN_TYPE_HPP */ diff --git a/src/core/math_func.hpp b/src/core/math_func.hpp index df9142462b..2149d1d269 100644 --- a/src/core/math_func.hpp +++ b/src/core/math_func.hpp @@ -318,6 +318,18 @@ static inline uint CeilDiv(uint a, uint b) return (a + b - 1) / b; } +/** + * Computes ceil(a / b) for non-negative a and b (templated). + * @param a Numerator + * @param b Denominator + * @return Quotient, rounded up + */ +template +static inline T CeilDivT(T a, T b) +{ + return (a + b - 1) / b; +} + /** * Computes ceil(a / b) * b for non-negative a and b. * @param a Numerator @@ -329,6 +341,18 @@ static inline uint Ceil(uint a, uint b) return CeilDiv(a, b) * b; } +/** + * Computes ceil(a / b) * b for non-negative a and b (templated). + * @param a Numerator + * @param b Denominator + * @return a rounded up to the nearest multiple of b. + */ +template +static inline T CeilT(T a, T b) +{ + return CeilDivT(a, b) * b; +} + /** * Computes round(a / b) for signed a and unsigned b. * @param a Numerator diff --git a/src/core/multimap.hpp b/src/core/multimap.hpp index e906677141..da6a33ef45 100644 --- a/src/core/multimap.hpp +++ b/src/core/multimap.hpp @@ -15,7 +15,7 @@ #include #include -template +template class MultiMap; /** @@ -23,14 +23,15 @@ class MultiMap; * @tparam Tmap_iter Iterator type for the map in the MultiMap. * @tparam Tlist_iter Iterator type for the lists in the MultiMap. * @tparam Tkey Key type of the MultiMap. - * @tparam Tvalue Value type of the MultMap. + * @tparam Tvalue Value type of the MultiMap. + * @tparam Tcontainer Container type for the values of the MultiMap. * @tparam Tcompare Comparator type for keys of the MultiMap. */ -template +template class MultiMapIterator { protected: - friend class MultiMap; - typedef MultiMapIterator Self; + friend class MultiMap; + typedef MultiMapIterator Self; Tlist_iter list_iter; ///< Iterator pointing to current position in the current list of items with equal keys. Tmap_iter map_iter; ///< Iterator pointing to the position of the current list of items with equal keys in the map. @@ -201,8 +202,8 @@ public: * @param iter2 Second iterator to compare. * @return If iter1 and iter2 are equal. */ -template -bool operator==(const MultiMapIterator &iter1, const MultiMapIterator &iter2) +template +bool operator==(const MultiMapIterator &iter1, const MultiMapIterator &iter2) { if (iter1.GetMapIter() != iter2.GetMapIter()) return false; if (!iter1.ListValid()) return !iter2.ListValid(); @@ -218,8 +219,8 @@ bool operator==(const MultiMapIterator -bool operator!=(const MultiMapIterator &iter1, const MultiMapIterator &iter2) +template +bool operator!=(const MultiMapIterator &iter1, const MultiMapIterator &iter2) { return !(iter1 == iter2); } @@ -232,8 +233,8 @@ bool operator!=(const MultiMapIterator -bool operator==(const MultiMapIterator &iter1, const Tmap_iter2 &iter2) +template +bool operator==(const MultiMapIterator &iter1, const Tmap_iter2 &iter2) { return !iter1.ListValid() && iter1.GetMapIter() == iter2; } @@ -244,8 +245,8 @@ bool operator==(const MultiMapIterator -bool operator!=(const MultiMapIterator &iter1, const Tmap_iter2 &iter2) +template +bool operator!=(const MultiMapIterator &iter1, const Tmap_iter2 &iter2) { return iter1.ListValid() || iter1.GetMapIter() != iter2; } @@ -256,8 +257,8 @@ bool operator!=(const MultiMapIterator -bool operator==(const Tmap_iter2 &iter2, const MultiMapIterator &iter1) +template +bool operator==(const Tmap_iter2 &iter2, const MultiMapIterator &iter1) { return !iter1.ListValid() && iter1.GetMapIter() == iter2; } @@ -268,8 +269,8 @@ bool operator==(const Tmap_iter2 &iter2, const MultiMapIterator -bool operator!=(const Tmap_iter2 &iter2, const MultiMapIterator &iter1) +template +bool operator!=(const Tmap_iter2 &iter2, const MultiMapIterator &iter1) { return iter1.ListValid() || iter1.GetMapIter() != iter2; } @@ -282,10 +283,10 @@ bool operator!=(const Tmap_iter2 &iter2, const MultiMapIterator > -class MultiMap : public std::map, Tcompare > { +template, typename Tcompare = std::less > +class MultiMap : public std::map { public: - typedef typename std::list List; + typedef Tcontainer List; typedef typename List::iterator ListIterator; typedef typename List::const_iterator ConstListIterator; @@ -293,8 +294,8 @@ public: typedef typename Map::iterator MapIterator; typedef typename Map::const_iterator ConstMapIterator; - typedef MultiMapIterator iterator; - typedef MultiMapIterator const_iterator; + typedef MultiMapIterator iterator; + typedef MultiMapIterator const_iterator; /** * Erase the value pointed to by an iterator. The iterator may be invalid afterwards. diff --git a/src/core/pool_func.hpp b/src/core/pool_func.hpp index 5569addbd7..a5375e13fc 100644 --- a/src/core/pool_func.hpp +++ b/src/core/pool_func.hpp @@ -196,6 +196,7 @@ DEFINE_POOL_METHOD(void)::FreeItem(size_t index) DEFINE_POOL_METHOD(void)::CleanPool() { this->cleaning = true; + Titem::PreCleanPool(); for (size_t i = 0; i < this->first_unused; i++) { delete this->Get(i); // 'delete NULL;' is very valid } diff --git a/src/core/pool_type.hpp b/src/core/pool_type.hpp index 4d20ed1abb..70f6480103 100644 --- a/src/core/pool_type.hpp +++ b/src/core/pool_type.hpp @@ -286,6 +286,13 @@ struct Pool : PoolBase { * @note it's called only when !CleaningPool() */ static inline void PostDestructor(size_t index) { } + + /** + * Dummy function called before a pool is about to be cleaned. + * If you want to use it, override it in PoolItem's subclass. + * @note it's called only when CleaningPool() + */ + static inline void PreCleanPool() { } }; private: 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/core/smallstack_type.hpp b/src/core/smallstack_type.hpp index 31edba0817..06b5aaafa6 100644 --- a/src/core/smallstack_type.hpp +++ b/src/core/smallstack_type.hpp @@ -195,10 +195,10 @@ public: inline void Push(const Titem &item) { if (this->value != Tinvalid) { - ThreadMutexLocker lock(_pool.GetMutex()); - Tindex new_item = _pool.Create(); + ThreadMutexLocker lock(SmallStack::GetPool().GetMutex()); + Tindex new_item = SmallStack::GetPool().Create(); if (new_item != Tmax_size) { - PooledSmallStack &pushed = _pool.Get(new_item); + PooledSmallStack &pushed = SmallStack::GetPool().Get(new_item); pushed.value = this->value; pushed.next = this->next; pushed.branch_count = 0; @@ -218,16 +218,16 @@ public: if (this->next == Tmax_size) { this->value = Tinvalid; } else { - ThreadMutexLocker lock(_pool.GetMutex()); - PooledSmallStack &popped = _pool.Get(this->next); + ThreadMutexLocker lock(SmallStack::GetPool().GetMutex()); + PooledSmallStack &popped = SmallStack::GetPool().Get(this->next); this->value = popped.value; if (popped.branch_count == 0) { - _pool.Destroy(this->next); + SmallStack::GetPool().Destroy(this->next); } else { --popped.branch_count; /* We can't use Branch() here as we already have the mutex.*/ if (popped.next != Tmax_size) { - ++(_pool.Get(popped.next).branch_count); + ++(SmallStack::GetPool().Get(popped.next).branch_count); } } /* Accessing popped here is no problem as the pool will only set @@ -257,11 +257,11 @@ public: { if (item == Tinvalid || item == this->value) return true; if (this->next != Tmax_size) { - ThreadMutexLocker lock(_pool.GetMutex()); + ThreadMutexLocker lock(SmallStack::GetPool().GetMutex()); const SmallStack *in_list = this; do { in_list = static_cast( - static_cast(&_pool.Get(in_list->next))); + static_cast(&SmallStack::GetPool().Get(in_list->next))); if (in_list->value == item) return true; } while (in_list->next != Tmax_size); } @@ -269,7 +269,11 @@ public: } protected: - static SmallStackPool _pool; + static SmallStackPool &GetPool() + { + static SmallStackPool pool; + return pool; + } /** * Create a branch in the pool if necessary. @@ -277,8 +281,8 @@ protected: inline void Branch() { if (this->next != Tmax_size) { - ThreadMutexLocker lock(_pool.GetMutex()); - ++(_pool.Get(this->next).branch_count); + ThreadMutexLocker lock(SmallStack::GetPool().GetMutex()); + ++(SmallStack::GetPool().Get(this->next).branch_count); } } }; diff --git a/src/core/smallvec_type.hpp b/src/core/smallvec_type.hpp index 62de176a54..588dd599dc 100644 --- a/src/core/smallvec_type.hpp +++ b/src/core/smallvec_type.hpp @@ -158,6 +158,23 @@ public: } } + /** + * Insert a new item at a specific position into the vector, moving all following items. + * @param item Position at which the new item should be inserted + * @return pointer to the new item + */ + inline T *Insert(T *item) + { + assert(item >= this->Begin() && item <= this->End()); + + size_t to_move = this->End() - item; + size_t start = item - this->Begin(); + + this->Append(); + if (to_move > 0) MemMoveT(this->Begin() + start + 1, this->Begin() + start, to_move); + return this->Begin() + start; + } + /** * Search for the first occurrence of an item. * The '!=' operator of T is used for comparison. @@ -232,13 +249,24 @@ public: * @param count Number of consecutive items to remove. */ void ErasePreservingOrder(uint pos, uint count = 1) + { + ErasePreservingOrder(this->data + pos, count); + } + + /** + * Remove items from the vector while preserving the order of other items. + * @param item First item to remove. + * @param count Number of consecutive items to remove. + */ + inline void ErasePreservingOrder(T *item, uint count = 1) { if (count == 0) return; - assert(pos < this->items); - assert(pos + count <= this->items); + assert(item >= this->Begin()); + assert(item + count <= this->End()); + this->items -= count; - uint to_move = this->items - pos; - if (to_move > 0) MemMoveT(this->data + pos, this->data + pos + count, to_move); + ptrdiff_t to_move = this->End() - item; + if (to_move > 0) MemMoveT(item, item + count, to_move); } /** @@ -256,6 +284,8 @@ public: /** * Get the number of items in the list. + * + * @return The number of items in the list. */ inline uint Length() const { diff --git a/src/cpu.cpp b/src/cpu.cpp index c48b8cbd4d..9393ea0613 100644 --- a/src/cpu.cpp +++ b/src/cpu.cpp @@ -18,7 +18,7 @@ /* rdtsc for MSC_VER, uses simple inline assembly, or _rdtsc * from external win64.asm because VS2005 does not support inline assembly */ -#if defined(_MSC_VER) && !defined(RDTSC_AVAILABLE) && !defined(WINCE) +#if defined(_MSC_VER) && !defined(RDTSC_AVAILABLE) #include uint64 ottd_rdtsc() { @@ -71,10 +71,7 @@ uint64 ottd_rdtsc() /* In all other cases we have no support for rdtsc. No major issue, * you just won't be able to profile your code with TIC()/TOC() */ #if !defined(RDTSC_AVAILABLE) -/* MSVC (in case of WinCE) can't handle #warning */ -# if !defined(_MSC_VER) #warning "(non-fatal) No support for rdtsc(), you won't be able to profile with TIC/TOC" -# endif uint64 ottd_rdtsc() {return 0;} #endif diff --git a/src/crashlog.cpp b/src/crashlog.cpp index 7ddc2131f9..78d9b1465b 100644 --- a/src/crashlog.cpp +++ b/src/crashlog.cpp @@ -27,6 +27,7 @@ #include "network/network.h" #include "language.h" #include "fontcache.h" +#include "news_gui.h" #include "ai/ai_info.hpp" #include "game/game.hpp" @@ -36,6 +37,38 @@ #include +#ifdef WITH_ALLEGRO +# include +#endif /* WITH_ALLEGRO */ +#ifdef WITH_FONTCONFIG +# include +#endif /* WITH_FONTCONFIG */ +#ifdef WITH_PNG + /* pngconf.h, included by png.h doesn't like something in the + * freetype headers. As such it's not alphabetically sorted. */ +# include +#endif /* WITH_PNG */ +#ifdef WITH_FREETYPE +# include +# include FT_FREETYPE_H +#endif /* WITH_FREETYPE */ +#if defined(WITH_ICU_LAYOUT) || defined(WITH_ICU_SORT) +# include +#endif /* WITH_ICU_SORT || WITH_ICU_LAYOUT */ +#ifdef WITH_LZMA +# include +#endif +#ifdef WITH_LZO +#include +#endif +#ifdef WITH_SDL +# include "sdl.h" +# include +#endif /* WITH_SDL */ +#ifdef WITH_ZLIB +# include +#endif + #include "safeguards.h" /* static */ const char *CrashLog::message = NULL; @@ -180,39 +213,6 @@ char *CrashLog::LogConfiguration(char *buffer, const char *last) const return buffer; } -/* Include these here so it's close to where it's actually used. */ -#ifdef WITH_ALLEGRO -# include -#endif /* WITH_ALLEGRO */ -#ifdef WITH_FONTCONFIG -# include -#endif /* WITH_FONTCONFIG */ -#ifdef WITH_PNG - /* pngconf.h, included by png.h doesn't like something in the - * freetype headers. As such it's not alphabetically sorted. */ -# include -#endif /* WITH_PNG */ -#ifdef WITH_FREETYPE -# include -# include FT_FREETYPE_H -#endif /* WITH_FREETYPE */ -#if defined(WITH_ICU_LAYOUT) || defined(WITH_ICU_SORT) -# include -#endif /* WITH_ICU_SORT || WITH_ICU_LAYOUT */ -#ifdef WITH_LZMA -# include -#endif -#ifdef WITH_LZO -#include -#endif -#ifdef WITH_SDL -# include "sdl.h" -# include -#endif /* WITH_SDL */ -#ifdef WITH_ZLIB -# include -#endif - /** * Writes information (versions) of the used libraries. * @param buffer The begin where to write at. @@ -309,6 +309,27 @@ char *CrashLog::LogGamelog(char *buffer, const char *last) const return CrashLog::gamelog_buffer + seprintf(CrashLog::gamelog_buffer, last, "\n"); } +/** + * Writes any recent news messages to the buffer. + * @param buffer The begin where to write at. + * @param last The last position in the buffer to write to. + * @return the position of the \c '\0' character after the buffer. + */ +char *CrashLog::LogRecentNews(char *buffer, const char *last) const +{ + buffer += seprintf(buffer, last, "Recent news messages:\n"); + + for (NewsItem *news = _oldest_news; news != NULL; news = news->next) { + YearMonthDay ymd; + ConvertDateToYMD(news->date, &ymd); + buffer += seprintf(buffer, last, "(%i-%02i-%02i) StringID: %u, Type: %u, Ref1: %u, %u, Ref2: %u, %u\n", + ymd.year, ymd.month + 1, ymd.day, news->string_id, news->type, + news->reftype1, news->ref1, news->reftype2, news->ref2); + } + buffer += seprintf(buffer, last, "\n"); + return buffer; +} + /** * Fill the crash log buffer with all data of a crash log. * @param buffer The begin where to write at. @@ -335,6 +356,7 @@ char *CrashLog::FillCrashLog(char *buffer, const char *last) const buffer = this->LogLibraries(buffer, last); buffer = this->LogModules(buffer, last); buffer = this->LogGamelog(buffer, last); + buffer = this->LogRecentNews(buffer, last); buffer += seprintf(buffer, last, "*** End of OpenTTD Crash Report ***\n"); return buffer; @@ -389,7 +411,7 @@ bool CrashLog::WriteSavegame(char *filename, const char *filename_last) const seprintf(filename, filename_last, "%scrash.sav", _personal_dir); /* Don't do a threaded saveload. */ - return SaveOrLoad(filename, SL_SAVE, NO_DIRECTORY, false) == SL_OK; + return SaveOrLoad(filename, SLO_SAVE, DFT_GAME_FILE, NO_DIRECTORY, false) == SL_OK; } catch (...) { return false; } diff --git a/src/crashlog.h b/src/crashlog.h index 6f7fb3c215..b9bc8afa24 100644 --- a/src/crashlog.h +++ b/src/crashlog.h @@ -85,6 +85,7 @@ protected: char *LogConfiguration(char *buffer, const char *last) const; char *LogLibraries(char *buffer, const char *last) const; char *LogGamelog(char *buffer, const char *last) const; + char *LogRecentNews(char *buffer, const char *list) const; public: /** Stub destructor to silence some compilers. */ 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 16eecadad0..13df98db34 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -17,6 +17,10 @@ #include "fileio_func.h" #include "settings_type.h" +#if defined(_WIN32) +#include "os/windows/win32.h" +#endif + #include #if defined(ENABLE_NETWORK) @@ -100,8 +104,6 @@ char *DumpDebugFacilityNames(char *buf, char *last) return buf; } -#if !defined(NO_DEBUG_MESSAGES) - /** * Internal function for outputting the debug line. * @param dbg Debug category. @@ -137,10 +139,10 @@ 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(WINCE) - NKDbgPrintfW(OTTD2FS(buffer)); -#elif defined(WIN32) || defined(WIN64) - _fputts(OTTD2FS(buffer, true), stderr); +#if defined(_WIN32) + TCHAR system_buf[512]; + convert_to_fs(buffer, system_buf, lengthof(system_buf), true); + _fputts(system_buf, stderr); #else fputs(buffer, stderr); #endif @@ -168,7 +170,6 @@ void CDECL debug(const char *dbg, const char *format, ...) debug_print(dbg, buf); } -#endif /* NO_DEBUG_MESSAGES */ /** * Set debugging levels by parsing the text in \a s. diff --git a/src/debug.h b/src/debug.h index 7da72da1d3..ce454c962e 100644 --- a/src/debug.h +++ b/src/debug.h @@ -28,37 +28,33 @@ * 6.. - extremely detailed spamming */ -#ifdef NO_DEBUG_MESSAGES - #define DEBUG(name, level, ...) { } -#else /* NO_DEBUG_MESSAGES */ - /** - * Output a line of debugging information. - * @param name Category - * @param level Debugging level, higher levels means more detailed information. - */ - #define DEBUG(name, level, ...) if ((level) == 0 || _debug_ ## name ## _level >= (level)) debug(#name, __VA_ARGS__) +/** + * Output a line of debugging information. + * @param name Category + * @param level Debugging level, higher levels means more detailed information. + */ +#define DEBUG(name, level, ...) if ((level) == 0 || _debug_ ## name ## _level >= (level)) debug(#name, __VA_ARGS__) - extern int _debug_driver_level; - extern int _debug_grf_level; - extern int _debug_map_level; - extern int _debug_misc_level; - extern int _debug_net_level; - extern int _debug_sprite_level; - extern int _debug_oldloader_level; - extern int _debug_npf_level; - extern int _debug_yapf_level; - extern int _debug_freetype_level; - extern int _debug_script_level; - extern int _debug_sl_level; - extern int _debug_gamelog_level; - extern int _debug_desync_level; - extern int _debug_console_level; +extern int _debug_driver_level; +extern int _debug_grf_level; +extern int _debug_map_level; +extern int _debug_misc_level; +extern int _debug_net_level; +extern int _debug_sprite_level; +extern int _debug_oldloader_level; +extern int _debug_npf_level; +extern int _debug_yapf_level; +extern int _debug_freetype_level; +extern int _debug_script_level; +extern int _debug_sl_level; +extern int _debug_gamelog_level; +extern int _debug_desync_level; +extern int _debug_console_level; #ifdef RANDOM_DEBUG - extern int _debug_random_level; +extern int _debug_random_level; #endif - void CDECL debug(const char *dbg, const char *format, ...) WARN_FORMAT(2, 3); -#endif /* NO_DEBUG_MESSAGES */ +void CDECL debug(const char *dbg, const char *format, ...) WARN_FORMAT(2, 3); char *DumpDebugFacilityNames(char *buf, char *last); void SetDebugString(const char *s); 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 4aff4700b3..39accd65f1 100644 --- a/src/depot_gui.cpp +++ b/src/depot_gui.cpp @@ -147,6 +147,7 @@ static void TrainDepotMoveVehicle(const Vehicle *wagon, VehicleID sel, const Veh static VehicleCellSize _base_block_sizes_depot[VEH_COMPANY_END]; ///< Cell size for vehicle images in the depot view. static VehicleCellSize _base_block_sizes_purchase[VEH_COMPANY_END]; ///< Cell size for vehicle images in the purchase list. +static uint _consistent_train_width; ///< Whether trains of all lengths are consistently scaled. Either TRAININFO_DEFAULT_VEHICLE_WIDTH, VEHICLEINFO_FULL_VEHICLE_WIDTH, or 0. /** * Get the GUI cell size for a vehicle image. @@ -219,6 +220,34 @@ void InitDepotWindowBlockSizes() InitBlocksizeForVehicles(vt, EIT_IN_DEPOT); InitBlocksizeForVehicles(vt, EIT_PURCHASE); } + + _consistent_train_width = TRAININFO_DEFAULT_VEHICLE_WIDTH; + bool first = true; + const Engine *e; + FOR_ALL_ENGINES_OF_TYPE(e, VEH_TRAIN) { + if (!e->IsEnabled()) continue; + + uint w = TRAININFO_DEFAULT_VEHICLE_WIDTH; + if (e->GetGRF() != NULL && is_custom_sprite(e->u.rail.image_index)) { + w = e->GetGRF()->traininfo_vehicle_width; + if (w != VEHICLEINFO_FULL_VEHICLE_WIDTH) { + /* Hopeless. + * This is a NewGRF vehicle that uses TRAININFO_DEFAULT_VEHICLE_WIDTH. + * If the vehicles are shorter than 8/8 we have fractional lengths, which are not consistent after rounding. + */ + _consistent_train_width = 0; + break; + } + } + + if (first) { + _consistent_train_width = w; + first = false; + } else if (w != _consistent_train_width) { + _consistent_train_width = 0; + break; + } + } } static void DepotSellAllConfirmationCallback(Window *w, bool confirmed); @@ -292,7 +321,10 @@ struct DepotWindow : Window { const Train *u = Train::From(v); free_wagon = u->IsFreeWagon(); - uint x_space = free_wagon ? ScaleGUITrad(TRAININFO_DEFAULT_VEHICLE_WIDTH) : 0; + uint x_space = free_wagon ? + ScaleGUITrad(_consistent_train_width != 0 ? _consistent_train_width : TRAININFO_DEFAULT_VEHICLE_WIDTH) : + 0; + DrawTrainImage(u, image_left + (rtl ? 0 : x_space), image_right - (rtl ? x_space : 0), sprite_y - 1, this->sel, EIT_IN_DEPOT, free_wagon ? 0 : this->hscroll->GetPosition(), this->vehicle_over); @@ -340,6 +372,29 @@ struct DepotWindow : Window { /* Set the row and number of boxes in each row based on the number of boxes drawn in the matrix */ const NWidgetCore *wid = this->GetWidget(WID_D_MATRIX); + + /* Draw vertical separators at whole tiles. + * This only works in two cases: + * - All vehicles use VEHICLEINFO_FULL_VEHICLE_WIDTH as reference width. + * - All vehicles are 8/8. This cannot be checked for NewGRF, so instead we check for "all vehicles are original vehicles". + */ + if (this->type == VEH_TRAIN && _consistent_train_width != 0) { + int w = ScaleGUITrad(2 * _consistent_train_width); + int col = _colour_gradient[wid->colour][4]; + int image_left = rtl ? r.left + this->count_width : r.left + this->header_width; + int image_right = rtl ? r.right - this->header_width : r.right - this->count_width; + int first_line = w + (-this->hscroll->GetPosition()) % w; + if (rtl) { + for (int x = image_right - first_line; x >= image_left; x -= w) { + GfxDrawLine(x, r.top, x, r.bottom, col, 1, 3); + } + } else { + for (int x = image_left + first_line; x <= image_right; x += w) { + GfxDrawLine(x, r.top, x, r.bottom, col, 1, 3); + } + } + } + uint16 rows_in_display = wid->current_y / wid->resize_y; uint16 num = this->vscroll->GetPosition() * this->num_columns; @@ -445,7 +500,8 @@ struct DepotWindow : Window { switch (this->type) { case VEH_TRAIN: if (wagon) return MODE_ERROR; - /* FALL THROUGH */ + FALLTHROUGH; + case VEH_ROAD: if (xm <= this->flag_width) return MODE_START_STOP; break; @@ -505,15 +561,12 @@ struct DepotWindow : Window { this->sel = INVALID_VEHICLE; TrainDepotMoveVehicle(v, sel, gdvp.head); } else if (v != NULL) { - bool rtl = _current_text_dir == TD_RTL; - int image = v->GetImage(rtl ? DIR_E : DIR_W, EIT_IN_DEPOT); - SetObjectToPlaceWnd(image, GetVehiclePalette(v), HT_DRAG, this); + SetObjectToPlaceWnd(SPR_CURSOR_MOUSE, PAL_NONE, HT_DRAG, this); + SetMouseCursorVehicle(v, EIT_IN_DEPOT); + _cursor.vehchain = _ctrl_pressed; this->sel = v->index; this->SetDirty(); - - _cursor.short_vehicle_offset = v->IsGroundVehicle() ? (16 - v->GetGroundVehicleCache()->cached_veh_length * 2) * (rtl ? -1 : 1) : 0; - _cursor.vehchain = _ctrl_pressed; } break; } @@ -663,7 +716,8 @@ struct DepotWindow : Window { DepotSortList(&this->vehicle_list); uint new_unitnumber_digits = GetUnitNumberDigits(this->vehicle_list); - if (this->unitnumber_digits != new_unitnumber_digits) { + /* Only increase the size; do not decrease to prevent constant changes */ + if (this->unitnumber_digits < new_unitnumber_digits) { this->unitnumber_digits = new_unitnumber_digits; this->ReInit(); } @@ -681,7 +735,8 @@ struct DepotWindow : Window { } /* Always have 1 empty row, so people can change the setting of the train */ this->vscroll->SetCount(this->vehicle_list.Length() + this->wagon_list.Length() + 1); - this->hscroll->SetCount(max_width); + /* Always make it longer than the longest train, so you can attach vehicles at the end, and also see the next vertical tile separator line */ + this->hscroll->SetCount(max_width + ScaleGUITrad(2 * VEHICLEINFO_FULL_VEHICLE_WIDTH + 1)); } else { this->vscroll->SetCount(CeilDiv(this->vehicle_list.Length(), this->num_columns)); } @@ -853,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/disaster_vehicle.cpp b/src/disaster_vehicle.cpp index d75e2d460e..64ebcd3fa1 100644 --- a/src/disaster_vehicle.cpp +++ b/src/disaster_vehicle.cpp @@ -112,7 +112,7 @@ void DisasterVehicle::UpdateImage() { SpriteID img = this->image_override; if (img == 0) img = _disaster_images[this->subtype][this->direction]; - this->cur_image = img; + this->sprite_seq.Set(img); } /** @@ -164,7 +164,7 @@ DisasterVehicle::DisasterVehicle(int x, int y, Direction direction, DisasterSubT this->direction = direction; this->tile = TileVirtXY(x, y); this->subtype = subtype; - this->UpdateDeltaXY(INVALID_DIR); + this->UpdateDeltaXY(); this->owner = OWNER_NONE; this->image_override = 0; this->current_order.Free(); @@ -499,7 +499,8 @@ static bool DisasterTick_Helicopter_Rotors(DisasterVehicle *v) v->tick_counter++; if (HasBit(v->tick_counter, 0)) return true; - if (++v->cur_image > SPR_ROTOR_MOVING_3) v->cur_image = SPR_ROTOR_MOVING_1; + SpriteID &cur_image = v->sprite_seq.seq[0].sprite; + if (++cur_image > SPR_ROTOR_MOVING_3) cur_image = SPR_ROTOR_MOVING_1; v->UpdatePositionAndViewport(); @@ -972,7 +973,7 @@ void ReleaseDisastersTargetingVehicle(VehicleID vehicle) } } -void DisasterVehicle::UpdateDeltaXY(Direction direction) +void DisasterVehicle::UpdateDeltaXY() { this->x_offs = -1; this->y_offs = -1; diff --git a/src/disaster_vehicle.h b/src/disaster_vehicle.h index 06fb36c1e3..e86d96e97d 100644 --- a/src/disaster_vehicle.h +++ b/src/disaster_vehicle.h @@ -48,7 +48,7 @@ struct DisasterVehicle FINAL : public SpecializedVehicle bottom) { - ResizeWindow(this, 0, top - bottom); + ResizeWindow(this, 0, top - bottom, false); } } diff --git a/src/economy.cpp b/src/economy.cpp index d78d2cccec..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.. */ @@ -654,12 +654,16 @@ static void CompanyCheckBankrupt(Company *c) */ static void CompaniesGenStatistics() { - Station *st; + /* Check for bankruptcy each month */ + Company *c; + FOR_ALL_COMPANIES(c) { + CompanyCheckBankrupt(c); + } Backup cur_company(_current_company, FILE_LINE); - Company *c; if (!_settings_game.economy.infrastructure_maintenance) { + Station *st; FOR_ALL_STATIONS(st) { cur_company.Change(st->owner); CommandCost cost(EXPENSES_PROPERTY, _price[PR_STATION_VALUE] >> 1); @@ -688,18 +692,14 @@ static void CompaniesGenStatistics() } cur_company.Restore(); - /* Check for bankruptcy each month */ - FOR_ALL_COMPANIES(c) { - CompanyCheckBankrupt(c); - } - /* Only run the economic statics and update company stats every 3rd month (1st of quarter). */ if (!HasBit(1 << 0 | 1 << 3 | 1 << 6 | 1 << 9, _cur_month)) return; FOR_ALL_COMPANIES(c) { - memmove(&c->old_economy[1], &c->old_economy[0], sizeof(c->old_economy) - sizeof(c->old_economy[0])); + /* Drop the oldest history off the end */ + std::copy_backward(c->old_economy, c->old_economy + MAX_HISTORY_QUARTERS - 1, c->old_economy + MAX_HISTORY_QUARTERS); c->old_economy[0] = c->cur_economy; - memset(&c->cur_economy, 0, sizeof(c->cur_economy)); + c->cur_economy = {}; if (c->num_valid_stat_ent != MAX_HISTORY_QUARTERS) c->num_valid_stat_ent++; @@ -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) @@ -1317,7 +1317,8 @@ static uint GetLoadAmount(Vehicle *v) /* Scale load amount the same as capacity */ if (HasBit(e->info.misc_flags, EF_NO_DEFAULT_CARGO_MULTIPLIER) && !air_mail) load_amount = CeilDiv(load_amount * CargoSpec::Get(v->cargo_type)->multiplier, 0x100); - return load_amount; + /* Zero load amount breaks a lot of things. */ + return max(1u, load_amount); } /** @@ -1366,14 +1367,14 @@ struct IsEmptyAction struct PrepareRefitAction { CargoArray &consist_capleft; ///< Capacities left in the consist. - uint32 &refit_mask; ///< Bitmask of possible refit cargoes. + CargoTypes &refit_mask; ///< Bitmask of possible refit cargoes. /** * Create a refit preparation action. * @param consist_capleft Capacities left in consist, to be updated here. * @param refit_mask Refit mask to be constructed from refit information of vehicles. */ - PrepareRefitAction(CargoArray &consist_capleft, uint32 &refit_mask) : + PrepareRefitAction(CargoArray &consist_capleft, CargoTypes &refit_mask) : consist_capleft(consist_capleft), refit_mask(refit_mask) {} /** @@ -1469,7 +1470,7 @@ static void HandleStationRefit(Vehicle *v, CargoArray &consist_capleft, Station Backup cur_company(_current_company, v->owner, FILE_LINE); - uint32 refit_mask = v->GetEngine()->info.refit_mask; + CargoTypes refit_mask = v->GetEngine()->info.refit_mask; /* Remove old capacity from consist capacity and collect refit mask. */ IterateVehicleParts(v_start, PrepareRefitAction(consist_capleft, refit_mask)); @@ -1627,10 +1628,10 @@ static void LoadUnloadVehicle(Vehicle *front) bool completely_emptied = true; bool anything_unloaded = false; bool anything_loaded = false; - uint32 full_load_amount = 0; - uint32 cargo_not_full = 0; - uint32 cargo_full = 0; - uint32 reservation_left = 0; + CargoTypes full_load_amount = 0; + CargoTypes cargo_not_full = 0; + CargoTypes cargo_full = 0; + CargoTypes reservation_left = 0; front->cur_speed = 0; @@ -1642,15 +1643,14 @@ static void LoadUnloadVehicle(Vehicle *front) if (v->cargo_cap == 0) continue; artic_part++; - uint load_amount = GetLoadAmount(v); - GoodsEntry *ge = &st->goods[v->cargo_type]; if (HasBit(v->vehicle_flags, VF_CARGO_UNLOADING) && (front->current_order.GetUnloadType() & OUFB_NO_UNLOAD) == 0) { uint cargo_count = v->cargo.UnloadCount(); - uint amount_unloaded = _settings_game.order.gradual_loading ? min(cargo_count, load_amount) : cargo_count; + uint amount_unloaded = _settings_game.order.gradual_loading ? min(cargo_count, GetLoadAmount(v)) : cargo_count; bool remaining = false; // Are there cargo entities in this vehicle that can still be unloaded here? + assert(payment != NULL); payment->SetCargo(v->cargo_type); if (!HasBit(ge->status, GoodsEntry::GES_ACCEPTANCE) && v->cargo.ActionCount(VehicleCargoList::MTA_DELIVER) > 0) { @@ -1726,7 +1726,7 @@ static void LoadUnloadVehicle(Vehicle *front) /* update stats */ int t; switch (front->type) { - case VEH_TRAIN: /* FALL THROUGH */ + case VEH_TRAIN: case VEH_SHIP: t = front->vcache.cached_max_speed; break; @@ -1752,8 +1752,8 @@ static void LoadUnloadVehicle(Vehicle *front) * has capacity for it, load it on the vehicle. */ uint cap_left = v->cargo_cap - v->cargo.StoredCount(); if (cap_left > 0 && (v->cargo.ActionCount(VehicleCargoList::MTA_LOAD) > 0 || ge->cargo.AvailableCount() > 0)) { - if (_settings_game.order.gradual_loading) cap_left = min(cap_left, load_amount); if (v->cargo.StoredCount() == 0) TriggerVehicle(v, VEHICLE_TRIGGER_NEW_CARGO); + if (_settings_game.order.gradual_loading) cap_left = min(cap_left, GetLoadAmount(v)); uint loaded = ge->cargo.Load(cap_left, &v->cargo, st->xy, next_station); if (v->cargo.ActionCount(VehicleCargoList::MTA_LOAD) > 0) { @@ -1839,7 +1839,7 @@ static void LoadUnloadVehicle(Vehicle *front) /* if the aircraft carries passengers and is NOT full, then * continue loading, no matter how much mail is in */ if ((front->type == VEH_AIRCRAFT && IsCargoInClass(front->cargo_type, CC_PASSENGERS) && front->cargo_cap > front->cargo.StoredCount()) || - (cargo_not_full && (cargo_full & ~cargo_not_full) == 0)) { // There are still non-full cargoes + (cargo_not_full != 0 && (cargo_full & ~cargo_not_full) == 0)) { // There are still non-full cargoes finished_loading = false; } } else if (cargo_not_full != 0) { 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/economy_type.h b/src/economy_type.h index 7e7a572413..31f74aacc7 100644 --- a/src/economy_type.h +++ b/src/economy_type.h @@ -152,12 +152,12 @@ enum ExpensesType { EXPENSES_NEW_VEHICLES, ///< New vehicles. EXPENSES_TRAIN_RUN, ///< Running costs trains. EXPENSES_ROADVEH_RUN, ///< Running costs road vehicles. - EXPENSES_AIRCRAFT_RUN, ///< Running costs aircrafts. + EXPENSES_AIRCRAFT_RUN, ///< Running costs aircraft. EXPENSES_SHIP_RUN, ///< Running costs ships. EXPENSES_PROPERTY, ///< Property costs. EXPENSES_TRAIN_INC, ///< Income from trains. EXPENSES_ROADVEH_INC, ///< Income from road vehicles. - EXPENSES_AIRCRAFT_INC, ///< Income from aircrafts. + EXPENSES_AIRCRAFT_INC, ///< Income from aircraft. EXPENSES_SHIP_INC, ///< Income from ships. EXPENSES_LOAN_INT, ///< Interest payments over the loan. EXPENSES_OTHER, ///< Other expenses. diff --git a/src/effectvehicle.cpp b/src/effectvehicle.cpp index 209b78d2e9..4d8f58acb8 100644 --- a/src/effectvehicle.cpp +++ b/src/effectvehicle.cpp @@ -22,10 +22,26 @@ #include "safeguards.h" +/** + * Increment the sprite unless it has reached the end of the animation. + * @param v Vehicle to increment sprite of. + * @param last Last sprite of animation. + * @return true if the sprite was incremented, false if the end was reached. + */ +static bool IncrementSprite(EffectVehicle *v, SpriteID last) +{ + if (v->sprite_seq.seq[0].sprite != last) { + v->sprite_seq.seq[0].sprite++; + return true; + } else { + return false; + } +} + static void ChimneySmokeInit(EffectVehicle *v) { uint32 r = Random(); - v->cur_image = SPR_CHIMNEY_SMOKE_0 + GB(r, 0, 3); + v->sprite_seq.Set(SPR_CHIMNEY_SMOKE_0 + GB(r, 0, 3)); v->progress = GB(r, 16, 3); } @@ -40,10 +56,8 @@ static bool ChimneySmokeTick(EffectVehicle *v) return false; } - if (v->cur_image != SPR_CHIMNEY_SMOKE_7) { - v->cur_image++; - } else { - v->cur_image = SPR_CHIMNEY_SMOKE_0; + if (!IncrementSprite(v, SPR_CHIMNEY_SMOKE_7)) { + v->sprite_seq.Set(SPR_CHIMNEY_SMOKE_0); } v->progress = 7; v->UpdatePositionAndViewport(); @@ -54,7 +68,7 @@ static bool ChimneySmokeTick(EffectVehicle *v) static void SteamSmokeInit(EffectVehicle *v) { - v->cur_image = SPR_STEAM_SMOKE_0; + v->sprite_seq.Set(SPR_STEAM_SMOKE_0); v->progress = 12; } @@ -70,9 +84,7 @@ static bool SteamSmokeTick(EffectVehicle *v) } if ((v->progress & 0xF) == 4) { - if (v->cur_image != SPR_STEAM_SMOKE_4) { - v->cur_image++; - } else { + if (!IncrementSprite(v, SPR_STEAM_SMOKE_4)) { delete v; return false; } @@ -86,7 +98,7 @@ static bool SteamSmokeTick(EffectVehicle *v) static void DieselSmokeInit(EffectVehicle *v) { - v->cur_image = SPR_DIESEL_SMOKE_0; + v->sprite_seq.Set(SPR_DIESEL_SMOKE_0); v->progress = 0; } @@ -98,13 +110,11 @@ static bool DieselSmokeTick(EffectVehicle *v) v->z_pos++; v->UpdatePositionAndViewport(); } else if ((v->progress & 7) == 1) { - if (v->cur_image != SPR_DIESEL_SMOKE_5) { - v->cur_image++; - v->UpdatePositionAndViewport(); - } else { + if (!IncrementSprite(v, SPR_DIESEL_SMOKE_5)) { delete v; return false; } + v->UpdatePositionAndViewport(); } return true; @@ -112,7 +122,7 @@ static bool DieselSmokeTick(EffectVehicle *v) static void ElectricSparkInit(EffectVehicle *v) { - v->cur_image = SPR_ELECTRIC_SPARK_0; + v->sprite_seq.Set(SPR_ELECTRIC_SPARK_0); v->progress = 1; } @@ -122,13 +132,12 @@ static bool ElectricSparkTick(EffectVehicle *v) v->progress++; } else { v->progress = 0; - if (v->cur_image != SPR_ELECTRIC_SPARK_5) { - v->cur_image++; - v->UpdatePositionAndViewport(); - } else { + + if (!IncrementSprite(v, SPR_ELECTRIC_SPARK_5)) { delete v; return false; } + v->UpdatePositionAndViewport(); } return true; @@ -136,7 +145,7 @@ static bool ElectricSparkTick(EffectVehicle *v) static void SmokeInit(EffectVehicle *v) { - v->cur_image = SPR_SMOKE_0; + v->sprite_seq.Set(SPR_SMOKE_0); v->progress = 12; } @@ -152,9 +161,7 @@ static bool SmokeTick(EffectVehicle *v) } if ((v->progress & 0xF) == 4) { - if (v->cur_image != SPR_SMOKE_4) { - v->cur_image++; - } else { + if (!IncrementSprite(v, SPR_SMOKE_4)) { delete v; return false; } @@ -168,7 +175,7 @@ static bool SmokeTick(EffectVehicle *v) static void ExplosionLargeInit(EffectVehicle *v) { - v->cur_image = SPR_EXPLOSION_LARGE_0; + v->sprite_seq.Set(SPR_EXPLOSION_LARGE_0); v->progress = 0; } @@ -176,13 +183,11 @@ static bool ExplosionLargeTick(EffectVehicle *v) { v->progress++; if ((v->progress & 3) == 0) { - if (v->cur_image != SPR_EXPLOSION_LARGE_F) { - v->cur_image++; - v->UpdatePositionAndViewport(); - } else { + if (!IncrementSprite(v, SPR_EXPLOSION_LARGE_F)) { delete v; return false; } + v->UpdatePositionAndViewport(); } return true; @@ -190,7 +195,7 @@ static bool ExplosionLargeTick(EffectVehicle *v) static void BreakdownSmokeInit(EffectVehicle *v) { - v->cur_image = SPR_BREAKDOWN_SMOKE_0; + v->sprite_seq.Set(SPR_BREAKDOWN_SMOKE_0); v->progress = 0; } @@ -198,10 +203,8 @@ static bool BreakdownSmokeTick(EffectVehicle *v) { v->progress++; if ((v->progress & 7) == 0) { - if (v->cur_image != SPR_BREAKDOWN_SMOKE_3) { - v->cur_image++; - } else { - v->cur_image = SPR_BREAKDOWN_SMOKE_0; + if (!IncrementSprite(v, SPR_BREAKDOWN_SMOKE_3)) { + v->sprite_seq.Set(SPR_BREAKDOWN_SMOKE_0); } v->UpdatePositionAndViewport(); } @@ -217,7 +220,7 @@ static bool BreakdownSmokeTick(EffectVehicle *v) static void ExplosionSmallInit(EffectVehicle *v) { - v->cur_image = SPR_EXPLOSION_SMALL_0; + v->sprite_seq.Set(SPR_EXPLOSION_SMALL_0); v->progress = 0; } @@ -225,13 +228,11 @@ static bool ExplosionSmallTick(EffectVehicle *v) { v->progress++; if ((v->progress & 3) == 0) { - if (v->cur_image != SPR_EXPLOSION_SMALL_B) { - v->cur_image++; - v->UpdatePositionAndViewport(); - } else { + if (!IncrementSprite(v, SPR_EXPLOSION_SMALL_B)) { delete v; return false; } + v->UpdatePositionAndViewport(); } return true; @@ -239,7 +240,7 @@ static bool ExplosionSmallTick(EffectVehicle *v) static void BulldozerInit(EffectVehicle *v) { - v->cur_image = SPR_BULLDOZER_NE; + v->sprite_seq.Set(SPR_BULLDOZER_NE); v->progress = 0; v->animation_state = 0; v->animation_substate = 0; @@ -290,7 +291,7 @@ static bool BulldozerTick(EffectVehicle *v) if ((v->progress & 7) == 0) { const BulldozerMovement *b = &_bulldozer_movement[v->animation_state]; - v->cur_image = SPR_BULLDOZER_NE + b->image; + v->sprite_seq.Set(SPR_BULLDOZER_NE + b->image); v->x_pos += _inc_by_dir[b->direction].x; v->y_pos += _inc_by_dir[b->direction].y; @@ -312,7 +313,7 @@ static bool BulldozerTick(EffectVehicle *v) static void BubbleInit(EffectVehicle *v) { - v->cur_image = SPR_BUBBLE_GENERATE_0; + v->sprite_seq.Set(SPR_BUBBLE_GENERATE_0); v->spritenum = 0; v->progress = 0; } @@ -475,8 +476,8 @@ static bool BubbleTick(EffectVehicle *v) if ((v->progress & 3) != 0) return true; if (v->spritenum == 0) { - v->cur_image++; - if (v->cur_image < SPR_BUBBLE_GENERATE_3) { + v->sprite_seq.seq[0].sprite++; + if (v->sprite_seq.seq[0].sprite < SPR_BUBBLE_GENERATE_3) { v->UpdatePositionAndViewport(); return true; } @@ -521,7 +522,7 @@ static bool BubbleTick(EffectVehicle *v) v->x_pos += b->x; v->y_pos += b->y; v->z_pos += b->z; - v->cur_image = SPR_BUBBLE_0 + b->image; + v->sprite_seq.Set(SPR_BUBBLE_0 + b->image); v->UpdatePositionAndViewport(); @@ -602,7 +603,7 @@ EffectVehicle *CreateEffectVehicle(int x, int y, int z, EffectVehicleType type) v->y_pos = y; v->z_pos = z; v->tile = 0; - v->UpdateDeltaXY(INVALID_DIR); + v->UpdateDeltaXY(); v->vehstatus = VS_UNCLICKABLE; _effect_init_procs[type](v); @@ -646,7 +647,7 @@ bool EffectVehicle::Tick() return _effect_tick_procs[this->subtype](this); } -void EffectVehicle::UpdateDeltaXY(Direction direction) +void EffectVehicle::UpdateDeltaXY() { this->x_offs = 0; this->y_offs = 0; diff --git a/src/effectvehicle_base.h b/src/effectvehicle_base.h index 27da420017..d809657fab 100644 --- a/src/effectvehicle_base.h +++ b/src/effectvehicle_base.h @@ -32,7 +32,7 @@ struct EffectVehicle FINAL : public SpecializedVehicle 0)) { *override = 1 << GetTunnelBridgeDirection(t); } @@ -107,12 +108,12 @@ static TrackBits GetRailTrackBitsUniversal(TileIndex t, byte *override) case MP_ROAD: if (!IsLevelCrossing(t)) return TRACK_BIT_NONE; - if (!HasCatenary(GetRailType(t))) return TRACK_BIT_NONE; + if (!HasRailCatenary(GetRailType(t))) return TRACK_BIT_NONE; return GetCrossingRailBits(t); case MP_STATION: if (!HasStationRail(t)) return TRACK_BIT_NONE; - if (!HasCatenary(GetRailType(t))) return TRACK_BIT_NONE; + if (!HasRailCatenary(GetRailType(t))) return TRACK_BIT_NONE; return TrackToTrackBits(GetRailStationTrack(t)); default: @@ -135,7 +136,7 @@ static TrackBits MaskWireBits(TileIndex t, TrackBits tracks) * axis that still display wires to preserve visual continuity. */ TileIndex next_tile = TileAddByDiagDir(t, d); RailType rt = GetTileRailType(next_tile); - if (rt == INVALID_RAILTYPE || !HasCatenary(rt) || + if (rt == INVALID_RAILTYPE || !HasRailCatenary(rt) || ((TrackStatusToTrackBits(GetTileTrackStatus(next_tile, TRANSPORT_RAIL, 0)) & DiagdirReachesTracks(d)) == TRACK_BIT_NONE && (!HasStationTileRail(next_tile) || GetRailStationAxis(next_tile) != DiagDirToAxis(d) || !CanStationTileHaveWires(next_tile)))) { neighbour_tdb |= DiagdirReachesTrackdirs(ReverseDiagDir(d)); @@ -241,7 +242,7 @@ static int GetPCPElevation(TileIndex tile, DiagDirection PCPpos) * * @param ti The Tileinfo to draw the tile for */ -void DrawCatenaryOnTunnel(const TileInfo *ti) +void DrawRailCatenaryOnTunnel(const TileInfo *ti) { /* xmin, ymin, xmax + 1, ymax + 1 of BB */ static const int _tunnel_wire_BB[4][4] = { @@ -255,7 +256,7 @@ void DrawCatenaryOnTunnel(const TileInfo *ti) SpriteID wire_base = GetWireBase(ti->tile); - const SortableSpriteStruct *sss = &CatenarySpriteData_Tunnel[dir]; + const SortableSpriteStruct *sss = &RailCatenarySpriteData_Tunnel[dir]; const int *BB_data = _tunnel_wire_BB[dir]; AddSortableSpriteToDraw( wire_base + sss->image_offset, PAL_NONE, ti->x + sss->x_offset, ti->y + sss->y_offset, @@ -270,7 +271,7 @@ void DrawCatenaryOnTunnel(const TileInfo *ti) * Draws wires and, if required, pylons on a given tile * @param ti The Tileinfo to draw the tile for */ -static void DrawCatenaryRailway(const TileInfo *ti) +static void DrawRailCatenaryRailway(const TileInfo *ti) { /* Pylons are placed on a tile edge, so we need to take into account * the track configuration of 2 adjacent tiles. trackconfig[0] stores the @@ -379,7 +380,7 @@ static void DrawCatenaryRailway(const TileInfo *ti) if (IsTileType(neighbour, MP_STATION) || IsTileType(neighbour, MP_ROAD)) tileh[TS_NEIGHBOUR] = SLOPE_FLAT; /* Read the foundations if they are present, and adjust the tileh */ - if (trackconfig[TS_NEIGHBOUR] != TRACK_BIT_NONE && IsTileType(neighbour, MP_RAILWAY) && HasCatenary(GetRailType(neighbour))) foundation = GetRailFoundation(tileh[TS_NEIGHBOUR], trackconfig[TS_NEIGHBOUR]); + if (trackconfig[TS_NEIGHBOUR] != TRACK_BIT_NONE && IsTileType(neighbour, MP_RAILWAY) && HasRailCatenary(GetRailType(neighbour))) foundation = GetRailFoundation(tileh[TS_NEIGHBOUR], trackconfig[TS_NEIGHBOUR]); if (IsBridgeTile(neighbour)) { foundation = GetBridgeFoundation(tileh[TS_NEIGHBOUR], DiagDirToAxis(GetTunnelBridgeDirection(neighbour))); } @@ -442,7 +443,7 @@ static void DrawCatenaryRailway(const TileInfo *ti) } } - /* The wire above the tunnel is drawn together with the tunnel-roof (see DrawCatenaryOnTunnel()) */ + /* The wire above the tunnel is drawn together with the tunnel-roof (see DrawRailCatenaryOnTunnel()) */ if (IsTunnelTile(ti->tile)) return; /* Don't draw a wire under a low bridge */ @@ -478,7 +479,7 @@ static void DrawCatenaryRailway(const TileInfo *ti) assert(PCPconfig != 0); // We have a pylon on neither end of the wire, that doesn't work (since we have no sprites for that) assert(!IsSteepSlope(tileh[TS_HOME])); - sss = &CatenarySpriteData[Wires[tileh_selector][t][PCPconfig]]; + sss = &RailCatenarySpriteData[Wires[tileh_selector][t][PCPconfig]]; /* * The "wire"-sprite position is inside the tile, i.e. 0 <= sss->?_offset < TILE_SIZE. @@ -498,7 +499,7 @@ static void DrawCatenaryRailway(const TileInfo *ti) * * @param ti The Tileinfo to draw the tile for */ -void DrawCatenaryOnBridge(const TileInfo *ti) +void DrawRailCatenaryOnBridge(const TileInfo *ti) { TileIndex end = GetSouthernBridgeEnd(ti->tile); TileIndex start = GetOtherBridgeEnd(end); @@ -511,15 +512,15 @@ void DrawCatenaryOnBridge(const TileInfo *ti) Axis axis = GetBridgeAxis(ti->tile); TLG tlg = GetTLG(ti->tile); - CatenarySprite offset = (CatenarySprite)(axis == AXIS_X ? 0 : WIRE_Y_FLAT_BOTH - WIRE_X_FLAT_BOTH); + RailCatenarySprite offset = (RailCatenarySprite)(axis == AXIS_X ? 0 : WIRE_Y_FLAT_BOTH - WIRE_X_FLAT_BOTH); if ((length % 2) && num == length) { /* Draw the "short" wire on the southern end of the bridge * only needed if the length of the bridge is odd */ - sss = &CatenarySpriteData[WIRE_X_FLAT_BOTH + offset]; + sss = &RailCatenarySpriteData[WIRE_X_FLAT_BOTH + offset]; } else { /* Draw "long" wires on all other tiles of the bridge (one pylon every two tiles) */ - sss = &CatenarySpriteData[WIRE_X_FLAT_SW + (num % 2) + offset]; + sss = &RailCatenarySpriteData[WIRE_X_FLAT_SW + (num % 2) + offset]; } height = GetBridgePixelHeight(end); @@ -558,14 +559,14 @@ void DrawCatenaryOnBridge(const TileInfo *ti) /** * Draws overhead wires and pylons for electric railways. * @param ti The TileInfo struct of the tile being drawn - * @see DrawCatenaryRailway + * @see DrawRailCatenaryRailway */ -void DrawCatenary(const TileInfo *ti) +void DrawRailCatenary(const TileInfo *ti) { switch (GetTileType(ti->tile)) { case MP_RAILWAY: if (IsRailDepot(ti->tile)) { - const SortableSpriteStruct *sss = &CatenarySpriteData_Depot[GetRailDepotDirection(ti->tile)]; + const SortableSpriteStruct *sss = &RailCatenarySpriteData_Depot[GetRailDepotDirection(ti->tile)]; SpriteID wire_base = GetWireBase(ti->tile); @@ -587,7 +588,7 @@ void DrawCatenary(const TileInfo *ti) default: return; } - DrawCatenaryRailway(ti); + DrawRailCatenaryRailway(ti); } bool SettingsDisableElrail(int32 p1) diff --git a/src/elrail_func.h b/src/elrail_func.h index 60cb782bbf..5cdae20c54 100644 --- a/src/elrail_func.h +++ b/src/elrail_func.h @@ -20,7 +20,7 @@ * Test if a rail type has catenary * @param rt Rail type to test */ -static inline bool HasCatenary(RailType rt) +static inline bool HasRailCatenary(RailType rt) { return HasBit(GetRailTypeInfo(rt)->flags, RTF_CATENARY); } @@ -29,14 +29,14 @@ static inline bool HasCatenary(RailType rt) * Test if we should draw rail catenary * @param rt Rail type to test */ -static inline bool HasCatenaryDrawn(RailType rt) +static inline bool HasRailCatenaryDrawn(RailType rt) { - return HasCatenary(rt) && !IsInvisibilitySet(TO_CATENARY) && !_settings_game.vehicle.disable_elrails; + return HasRailCatenary(rt) && !IsInvisibilitySet(TO_CATENARY) && !_settings_game.vehicle.disable_elrails; } -void DrawCatenary(const TileInfo *ti); -void DrawCatenaryOnTunnel(const TileInfo *ti); -void DrawCatenaryOnBridge(const TileInfo *ti); +void DrawRailCatenary(const TileInfo *ti); +void DrawRailCatenaryOnTunnel(const TileInfo *ti); +void DrawRailCatenaryOnBridge(const TileInfo *ti); bool SettingsDisableElrail(int32 p1); ///< _settings_game.disable_elrail callback diff --git a/src/endian_check.cpp b/src/endian_check.cpp deleted file mode 100644 index 815e5abbee..0000000000 --- a/src/endian_check.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* $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 endian_check.cpp - * This pretty simple file checks if the system is LITTLE_ENDIAN or BIG_ENDIAN - * it does that by putting a 1 and a 0 in an array, and read it out as one - * number. If it is 1, it is LITTLE_ENDIAN, if it is 256, it is BIG_ENDIAN - * - * After that it outputs the contents of an include files (endian.h) - * that says or TTD_LITTLE_ENDIAN, or TTD_BIG_ENDIAN. Makefile takes - * care of the real writing to the file. - */ - -#include -#include - -/** Supported endian types */ -enum Endian { - ENDIAN_LITTLE, ///< little endian - ENDIAN_BIG, ///< big endian -}; - -/** - * Shortcut to printf("#define TTD_ENDIAN TTD_*_ENDIAN") - * @param endian endian type to define - */ -static inline void printf_endian(Endian endian) -{ - printf("#define TTD_ENDIAN %s\n", endian == ENDIAN_LITTLE ? "TTD_LITTLE_ENDIAN" : "TTD_BIG_ENDIAN"); -} - -/** - * Main call of the endian_check program - * @param argc argument count - * @param argv arguments themselves - * @return exit code - */ -int main (int argc, char *argv[]) -{ - unsigned char endian_test[2] = { 1, 0 }; - int force_BE = 0, force_LE = 0, force_PREPROCESSOR = 0; - - if (argc > 1 && strcmp(argv[1], "BE") == 0) force_BE = 1; - if (argc > 1 && strcmp(argv[1], "LE") == 0) force_LE = 1; - if (argc > 1 && strcmp(argv[1], "PREPROCESSOR") == 0) force_PREPROCESSOR = 1; - - printf("#ifndef ENDIAN_H\n#define ENDIAN_H\n"); - - if (force_LE == 1) { - printf_endian(ENDIAN_LITTLE); - } else if (force_BE == 1) { - printf_endian(ENDIAN_BIG); - } else if (force_PREPROCESSOR == 1) { - /* Support for universal binaries on OSX - * Universal binaries supports both PPC and x86 - * If a compiler for OSX gets this setting, it will always pick the correct endian and no test is needed - */ - printf("#ifdef __BIG_ENDIAN__\n"); - printf_endian(ENDIAN_BIG); - printf("#else\n"); - printf_endian(ENDIAN_LITTLE); - printf("#endif\n"); - } else if (*(short*)endian_test == 1 ) { - printf_endian(ENDIAN_LITTLE); - } else { - printf_endian(ENDIAN_BIG); - } - printf("#endif\n"); - - return 0; -} diff --git a/src/engine.cpp b/src/engine.cpp index f8fc0ee6aa..9f500e1cdf 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -48,11 +48,6 @@ EngineOverrideManager _engine_mngr; */ static Year _year_engine_aging_stops; -/** - * The railtypes that have been or never will be introduced, or - * an inverse bitmap of rail types that have to be introduced. */ -static uint16 _introduced_railtypes; - /** Number of engines of each vehicle type in original engine data */ const uint8 _engine_counts[4] = { lengthof(_orig_rail_vehicle_info), @@ -85,6 +80,7 @@ Engine::Engine(VehicleType type, EngineID base) this->type = type; this->grf_prop.local_id = base; this->list_position = base; + this->preview_company = INVALID_COMPANY; /* Check if this base engine is within the original engine data range */ if (base >= _engine_counts[type]) { @@ -435,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(); } @@ -468,7 +464,26 @@ uint16 Engine::GetRange() const } /** - * Initializes the EngineOverrideManager with the default engines. + * Get the name of the aircraft type for display purposes. + * @return Aircraft type string. + */ +StringID Engine::GetAircraftTypeText() const +{ + switch (this->type) { + case VEH_AIRCRAFT: + switch (this->u.air.subtype) { + case AIR_HELI: return STR_LIVERY_HELICOPTER; + case AIR_CTOL: return STR_LIVERY_SMALL_PLANE; + case AIR_CTOL | AIR_FAST: return STR_LIVERY_LARGE_PLANE; + default: NOT_REACHED(); + } + + default: NOT_REACHED(); + } +} + +/** + * Initializes the #EngineOverrideManager with the default engines. */ void EngineOverrideManager::ResetToDefaultMapping() { @@ -542,29 +557,6 @@ void SetupEngines() const Engine *e = new Engine(eid->type, eid->internal_id); assert(e->index == index); } - - _introduced_railtypes = 0; -} - -/** - * Check whether the railtypes should be introduced. - */ -static void CheckRailIntroduction() -{ - /* All railtypes have been introduced. */ - if (_introduced_railtypes == UINT16_MAX || Company::GetPoolSize() == 0) return; - - /* We need to find the railtypes that are known to all companies. */ - RailTypes rts = (RailTypes)UINT16_MAX; - - /* We are at, or past the introduction date of the rail. */ - Company *c; - FOR_ALL_COMPANIES(c) { - c->avail_railtypes = AddDateIntroducedRailTypes(c->avail_railtypes, _date); - rts &= c->avail_railtypes; - } - - _introduced_railtypes |= rts; } void ShowEnginePreviewWindow(EngineID engine); @@ -581,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) @@ -710,19 +702,6 @@ void StartupEngines() c->avail_roadtypes = GetCompanyRoadtypes(c->index); } - /* Rail types that are invalid or never introduced are marked as - * being introduced upon start. That way we can easily check whether - * there is any date related introduction that is still going to - * happen somewhere in the future. */ - for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) { - const RailtypeInfo *rti = GetRailTypeInfo(rt); - if (rti->label != 0 && IsInsideMM(rti->introduction_date, 0, MAX_DAY)) continue; - - SetBit(_introduced_railtypes, rt); - } - - CheckRailIntroduction(); - /* Invalidate any open purchase lists */ InvalidateWindowClassesData(WC_BUILD_VEHICLE); } @@ -773,7 +752,7 @@ static CompanyID GetPreviewCompany(Engine *e) CompanyID best_company = INVALID_COMPANY; /* For trains the cargomask has no useful meaning, since you can attach other wagons */ - uint32 cargomask = e->type != VEH_TRAIN ? GetUnionOfArticulatedRefitMasks(e->index, true) : (uint32)-1; + CargoTypes cargomask = e->type != VEH_TRAIN ? GetUnionOfArticulatedRefitMasks(e->index, true) : ALL_CARGOTYPES; int32 best_hist = -1; const Company *c; @@ -819,7 +798,10 @@ static bool IsVehicleTypeDisabled(VehicleType type, bool ai) /** Daily check to offer an exclusive engine preview to the companies. */ void EnginesDailyLoop() { - CheckRailIntroduction(); + Company *c; + FOR_ALL_COMPANIES(c) { + c->avail_railtypes = AddDateIntroducedRailTypes(c->avail_railtypes, _date); + } if (_cur_year >= _year_engine_aging_stops) return; @@ -879,7 +861,7 @@ CommandCost CmdSetVehicleVisibility(TileIndex tile, DoCommandFlag flags, uint32 { Engine *e = Engine::GetIfValid(GB(p2, 0, 31)); if (e == NULL || _current_company >= MAX_COMPANIES) return CMD_ERROR; - if ((e->flags & ENGINE_AVAILABLE) == 0 || !HasBit(e->company_avail, _current_company)) return CMD_ERROR; + if (!IsEngineBuildable(e->index, e->type, _current_company)) return CMD_ERROR; if ((flags & DC_EXEC) != 0) { SB(e->company_hidden, _current_company, 1, GB(p2, 31, 1)); @@ -902,7 +884,7 @@ CommandCost CmdSetVehicleVisibility(TileIndex tile, DoCommandFlag flags, uint32 CommandCost CmdWantEnginePreview(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) { Engine *e = Engine::GetIfValid(p1); - if (e == NULL || e->preview_company != _current_company) return CMD_ERROR; + if (e == NULL || !(e->flags & ENGINE_EXCLUSIVE_PREVIEW) || e->preview_company != _current_company) return CMD_ERROR; if (flags & DC_EXEC) AcceptEnginePreview(p1, _current_company); @@ -1135,7 +1117,9 @@ bool IsEngineRefittable(EngineID engine) /* Is there any cargo except the default cargo? */ CargoID default_cargo = e->GetDefaultCargoType(); - return default_cargo != CT_INVALID && ei->refit_mask != 1U << default_cargo; + CargoTypes default_cargo_mask = 0; + SetBit(default_cargo_mask, default_cargo); + return default_cargo != CT_INVALID && ei->refit_mask != default_cargo_mask; } /** diff --git a/src/engine_base.h b/src/engine_base.h index 6a2e6816c3..25c6bfbeb9 100644 --- a/src/engine_base.h +++ b/src/engine_base.h @@ -111,6 +111,7 @@ struct Engine : EnginePool::PoolItem<&_engine_pool> { uint GetDisplayMaxTractiveEffort() const; Date GetLifeLengthInDays() const; uint16 GetRange() const; + StringID GetAircraftTypeText() const; /** * Check whether the engine is hidden in the GUI for the given company. diff --git a/src/engine_func.h b/src/engine_func.h index 6c3fb14ff2..37fb005092 100644 --- a/src/engine_func.h +++ b/src/engine_func.h @@ -26,7 +26,7 @@ extern const uint8 _engine_offsets[4]; bool IsEngineBuildable(EngineID engine, VehicleType type, CompanyID company); bool IsEngineRefittable(EngineID engine); -void GetArticulatedVehicleCargoesAndRefits(EngineID engine, CargoArray *cargoes, uint32 *refits); +void GetArticulatedVehicleCargoesAndRefits(EngineID engine, CargoArray *cargoes, CargoTypes *refits); void SetYearEngineAgingStops(); void StartupOneEngine(Engine *e, Date aging_date); diff --git a/src/engine_gui.cpp b/src/engine_gui.cpp index 899543c189..5e9e8cef7e 100644 --- a/src/engine_gui.cpp +++ b/src/engine_gui.cpp @@ -126,9 +126,9 @@ struct EnginePreviewWindow : Window { switch (widget) { case WID_EP_YES: DoCommandP(0, this->window_number, 0, CMD_WANT_ENGINE_PREVIEW); - /* FALL THROUGH */ + FALLTHROUGH; case WID_EP_NO: - delete this; + if (!_shift_pressed) delete this; break; } } @@ -196,6 +196,7 @@ static StringID GetAircraftEngineInfoString(const Engine *e) uint i = 0; SetDParam(i++, e->GetCost()); SetDParam(i++, e->GetDisplayMaxSpeed()); + SetDParam(i++, e->GetAircraftTypeText()); if (range > 0) SetDParam(i++, range); SetDParam(i++, cargo); SetDParam(i++, capacity); @@ -204,10 +205,10 @@ static StringID GetAircraftEngineInfoString(const Engine *e) SetDParam(i++, CT_MAIL); SetDParam(i++, mail_capacity); SetDParam(i++, e->GetRunningCost()); - return range > 0 ? STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST : STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST; + return range > 0 ? STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST : STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST; } else { SetDParam(i++, e->GetRunningCost()); - return range > 0 ? STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST : STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST; + return range > 0 ? STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST : STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST; } } @@ -224,7 +225,7 @@ static StringID GetRoadVehEngineInfoString(const Engine *e) SetDParam(2, CT_INVALID); } SetDParam(4, e->GetRunningCost()); - return STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST; + return STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST; } else { SetDParam(0, e->GetCost()); SetDParam(2, e->GetDisplayMaxSpeed()); @@ -252,7 +253,7 @@ static StringID GetShipEngineInfoString(const Engine *e) SetDParam(2, e->GetDefaultCargoType()); SetDParam(3, e->GetDisplayDefaultCapacity()); SetDParam(4, e->GetRunningCost()); - return STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST; + return STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST; } diff --git a/src/engine_type.h b/src/engine_type.h index aeebcb3522..82f10d9d87 100644 --- a/src/engine_type.h +++ b/src/engine_type.h @@ -137,7 +137,7 @@ struct EngineInfo { byte load_amount; byte climates; ///< Climates supported by the engine. CargoID cargo_type; - uint32 refit_mask; + CargoTypes refit_mask; byte refit_cost; byte misc_flags; ///< Miscellaneous flags. @see EngineMiscFlags byte callback_mask; ///< Bitmask of vehicle callbacks that have to be called @@ -158,6 +158,7 @@ enum EngineMiscFlags { EF_AUTO_REFIT = 4, ///< Automatic refitting is allowed EF_NO_DEFAULT_CARGO_MULTIPLIER = 5, ///< Use the new capacity algorithm. The default cargotype of the vehicle does not affect capacity multipliers. CB 15 is also called in purchase list. EF_NO_BREAKDOWN_SMOKE = 6, ///< Do not show black smoke during a breakdown. + EF_SPRITE_STACK = 7, ///< Draw vehicle by stacking multiple sprites. }; /** 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 a72950bc73..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__) @@ -325,15 +325,7 @@ bool FioCheckFileExists(const char *filename, Subdirectory subdir) */ bool FileExists(const char *filename) { -#if defined(WINCE) - /* There is always one platform that doesn't support basic commands... */ - HANDLE hand = CreateFile(OTTD2FS(filename), 0, 0, NULL, OPEN_EXISTING, 0, NULL); - if (hand == INVALID_HANDLE_VALUE) return 1; - CloseHandle(hand); - return 0; -#else return access(OTTD2FS(filename), 0) == 0; -#endif } /** @@ -355,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. @@ -369,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. */ @@ -407,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, @@ -424,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); } @@ -446,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. */ @@ -468,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) @@ -522,7 +513,7 @@ FILE *FioFOpenFile(const char *filename, const char *mode, Subdirectory subdir, case BASESET_DIR: f = FioFOpenFile(filename, mode, OLD_GM_DIR, filesize); if (f != NULL) break; - /* FALL THROUGH */ + FALLTHROUGH; case NEWGRF_DIR: f = FioFOpenFile(filename, mode, OLD_DATA_DIR, filesize); break; @@ -540,11 +531,11 @@ FILE *FioFOpenFile(const char *filename, const char *mode, Subdirectory subdir, * Create a directory with the given name * @param name the new name of the directory */ -static void FioCreateDirectory(const char *name) +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) || defined(WINCE) +#if defined(_WIN32) CreateDirectory(OTTD2FS(name), NULL); #elif defined(OS2) && !defined(__INNOTEK_LIBC__) mkdir(OTTD2FS(name)); @@ -584,32 +575,6 @@ bool AppendPathSeparator(char *buf, const char *last) return true; } -/** - * Allocates and files a variable with the full path - * based on the given directory. - * @param dir the directory to base the path on - * @return the malloced full path - */ -char *BuildWithFullPath(const char *dir) -{ - char *dest = MallocT(MAX_PATH); - char *last = dest + MAX_PATH - 1; - strecpy(dest, dir, last); - - /* Check if absolute or relative path */ - const char *s = strchr(dest, PATHSEPCHAR); - - /* Add absolute path */ - if (s == NULL || dest != s) { - if (getcwd(dest, MAX_PATH) == NULL) *dest = '\0'; - AppendPathSeparator(dest, last); - strecat(dest, dir, last); - } - AppendPathSeparator(dest, last); - - return dest; -} - /** * Find the first directory in a tar archive. * @param tarname the name of the tar archive to look in. @@ -666,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) @@ -1014,14 +979,14 @@ bool ExtractTar(const char *tar_filename, Subdirectory subdir) return true; } -#if defined(WIN32) || defined(WINCE) +#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) || defined(WINCE) */ +#else /* defined(_WIN32) */ /** * Changes the working directory to the path of the give executable. @@ -1032,30 +997,29 @@ extern void DetermineBasePaths(const char *exe); */ static bool ChangeWorkingDirectoryToExecutable(const char *exe) { + char tmp[MAX_PATH]; + strecpy(tmp, exe, lastof(tmp)); + bool success = false; #ifdef WITH_COCOA - char *app_bundle = strchr(exe, '.'); + char *app_bundle = strchr(tmp, '.'); while (app_bundle != NULL && strncasecmp(app_bundle, ".app", 4) != 0) app_bundle = strchr(&app_bundle[1], '.'); - if (app_bundle != NULL) app_bundle[0] = '\0'; + if (app_bundle != NULL) *app_bundle = '\0'; #endif /* WITH_COCOA */ - char *s = const_cast(strrchr(exe, PATHSEPCHAR)); + char *s = strrchr(tmp, PATHSEPCHAR); if (s != NULL) { *s = '\0'; #if defined(__DJGPP__) /* If we want to go to the root, we can't use cd C:, but we must use '/' */ - if (s[-1] == ':') chdir("/"); + if (s > tmp && *(s - 1) == ':') chdir("/"); #endif - if (chdir(exe) != 0) { + if (chdir(tmp) != 0) { DEBUG(misc, 0, "Directory with the binary does not exist?"); } else { success = true; } - *s = PATHSEPCHAR; } -#ifdef WITH_COCOA - if (app_bundle != NULL) app_bundle[0] = '.'; -#endif /* WITH_COCOA */ return success; } @@ -1185,7 +1149,7 @@ extern void cocoaSetApplicationBundleDir(); _searchpaths[SP_APPLICATION_BUNDLE_DIR] = NULL; #endif } -#endif /* defined(WIN32) || defined(WINCE) */ +#endif /* defined(_WIN32) */ const char *_personal_dir; @@ -1338,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. @@ -1478,7 +1442,7 @@ uint FileScanner::Scan(const char *extension, Subdirectory sd, bool tars, bool r switch (sd) { case BASESET_DIR: num += this->Scan(extension, OLD_GM_DIR, tars, recursive); - /* FALL THROUGH */ + FALLTHROUGH; case NEWGRF_DIR: num += this->Scan(extension, OLD_DATA_DIR, tars, recursive); break; diff --git a/src/fileio_func.h b/src/fileio_func.h index 443460b2d3..f5ef58ac06 100644 --- a/src/fileio_func.h +++ b/src/fileio_func.h @@ -55,6 +55,7 @@ char *FioGetFullPath(char *buf, const char *last, Searchpath sp, Subdirectory su char *FioFindFullPath(char *buf, const char *last, Subdirectory subdir, const char *filename); char *FioAppendDirectory(char *buf, const char *last, Searchpath sp, Subdirectory subdir); char *FioGetDirectory(char *buf, const char *last, Subdirectory subdir); +void FioCreateDirectory(const char *name); const char *FiosGetScreenshotDir(); @@ -117,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 @@ -135,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 @@ -149,4 +150,17 @@ static inline DIR *ttd_opendir(const char *path) return opendir(OTTD2FS(path)); } + +/** Auto-close a file upon scope exit. */ +class FileCloser { + FILE *f; + +public: + FileCloser(FILE *_f) : f(_f) {} + ~FileCloser() + { + fclose(f); + } +}; + #endif /* FILEIO_FUNC_H */ diff --git a/src/fileio_type.h b/src/fileio_type.h index 87cb2d1a82..fd3ac84554 100644 --- a/src/fileio_type.h +++ b/src/fileio_type.h @@ -14,6 +14,96 @@ #include "core/enum_type.hpp" +/** The different abstract types of files that the system knows about. */ +enum AbstractFileType { + FT_NONE, ///< nothing to do + FT_SAVEGAME, ///< old or new savegame + FT_SCENARIO, ///< old or new scenario + FT_HEIGHTMAP, ///< heightmap file + + FT_INVALID = 7, ///< Invalid or unknown file type. + FT_NUMBITS = 3, ///< Number of bits required for storing a #AbstractFileType value. + FT_MASK = (1 << FT_NUMBITS) - 1, ///< Bitmask for extracting an abstract file type. +}; + +/** Kinds of files in each #AbstractFileType. */ +enum DetailedFileType { + /* Save game and scenario files. */ + DFT_OLD_GAME_FILE, ///< Old save game or scenario file. + DFT_GAME_FILE, ///< Save game or scenario file. + + /* Heightmap files. */ + DFT_HEIGHTMAP_BMP, ///< BMP file. + DFT_HEIGHTMAP_PNG, ///< PNG file. + + /* fios 'files' */ + DFT_FIOS_DRIVE, ///< A drive (letter) entry. + DFT_FIOS_PARENT, ///< A parent directory entry. + DFT_FIOS_DIR, ///< A directory entry. + DFT_FIOS_DIRECT, ///< Direct filename. + + DFT_INVALID = 255, ///< Unknown or invalid file. +}; + +/** Operation performed on the file. */ +enum SaveLoadOperation { + SLO_CHECK, ///< Load file for checking and/or preview. + SLO_LOAD, ///< File is being loaded. + SLO_SAVE, ///< File is being saved. + + SLO_INVALID, ///< Unknown file operation. +}; + +/** + * Construct an enum value for #FiosType as a combination of an abstract and a detailed file type. + * @param abstract Abstract file type (one of #AbstractFileType). + * @param detailed Detailed file type (one of #DetailedFileType). + */ +#define MAKE_FIOS_TYPE(abstract, detailed) ((abstract) | ((detailed) << FT_NUMBITS)) + +/** + * Elements of a file system that are recognized. + * Values are a combination of #AbstractFileType and #DetailedFileType. + * @see GetAbstractFileType GetDetailedFileType + */ +enum FiosType { + FIOS_TYPE_DRIVE = MAKE_FIOS_TYPE(FT_NONE, DFT_FIOS_DRIVE), + FIOS_TYPE_PARENT = MAKE_FIOS_TYPE(FT_NONE, DFT_FIOS_PARENT), + FIOS_TYPE_DIR = MAKE_FIOS_TYPE(FT_NONE, DFT_FIOS_DIR), + FIOS_TYPE_DIRECT = MAKE_FIOS_TYPE(FT_NONE, DFT_FIOS_DIRECT), + + FIOS_TYPE_FILE = MAKE_FIOS_TYPE(FT_SAVEGAME, DFT_GAME_FILE), + FIOS_TYPE_OLDFILE = MAKE_FIOS_TYPE(FT_SAVEGAME, DFT_OLD_GAME_FILE), + FIOS_TYPE_SCENARIO = MAKE_FIOS_TYPE(FT_SCENARIO, DFT_GAME_FILE), + FIOS_TYPE_OLD_SCENARIO = MAKE_FIOS_TYPE(FT_SCENARIO, DFT_OLD_GAME_FILE), + FIOS_TYPE_PNG = MAKE_FIOS_TYPE(FT_HEIGHTMAP, DFT_HEIGHTMAP_PNG), + FIOS_TYPE_BMP = MAKE_FIOS_TYPE(FT_HEIGHTMAP, DFT_HEIGHTMAP_BMP), + + FIOS_TYPE_INVALID = MAKE_FIOS_TYPE(FT_INVALID, DFT_INVALID), +}; + +#undef MAKE_FIOS_TYPE + +/** + * Extract the abstract file type from a #FiosType. + * @param fios_type Type to query. + * @return The Abstract file type of the \a fios_type. + */ +inline AbstractFileType GetAbstractFileType(FiosType fios_type) +{ + return static_cast(fios_type & FT_MASK); +} + +/** + * Extract the detailed file type from a #FiosType. + * @param fios_type Type to query. + * @return The Detailed file type of the \a fios_type. + */ +inline DetailedFileType GetDetailedFileType(FiosType fios_type) +{ + return static_cast(fios_type >> FT_NUMBITS); +} + /** * The different kinds of subdirectories OpenTTD uses */ diff --git a/src/fios.cpp b/src/fios.cpp index 00ed5a484c..73365ddc29 100644 --- a/src/fios.cpp +++ b/src/fios.cpp @@ -20,26 +20,24 @@ #include "string_func.h" #include -#ifndef WIN32 +#ifndef _WIN32 # include -#endif /* WIN32 */ +#endif /* _WIN32 */ #include "table/strings.h" #include "safeguards.h" /* Variables to display file lists */ -SmallVector _fios_items; static char *_fios_path; static const char *_fios_path_last; -SmallFiosItem _file_to_saveload; SortingBits _savegame_sort_order = SORT_BY_DATE | SORT_DESCENDING; /* OS-specific functions are taken from their respective files (win32/unix/os2 .c) */ extern bool FiosIsRoot(const char *path); extern bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb); extern bool FiosIsHiddenFile(const struct dirent *ent); -extern void FiosGetDrives(); +extern void FiosGetDrives(FileList &file_list); extern bool FiosGetDiskFreeSpace(const char *path, uint64 *tot); /* get the name of an oldstyle savegame */ @@ -65,11 +63,72 @@ int CDECL CompareFiosItems(const FiosItem *da, const FiosItem *db) return r; } -/** Free the list of savegames. */ -void FiosFreeSavegameList() +FileList::~FileList() { - _fios_items.Clear(); - _fios_items.Compact(); + this->Clear(); +} + +/** + * Construct a file list with the given kind of files, for the stated purpose. + * @param abstract_filetype Kind of files to collect. + * @param fop Purpose of the collection, either #SLO_LOAD or #SLO_SAVE. + */ +void FileList::BuildFileList(AbstractFileType abstract_filetype, SaveLoadOperation fop) +{ + this->Clear(); + + assert(fop == SLO_LOAD || fop == SLO_SAVE); + switch (abstract_filetype) { + case FT_NONE: + break; + + case FT_SAVEGAME: + FiosGetSavegameList(fop, *this); + break; + + case FT_SCENARIO: + FiosGetScenarioList(fop, *this); + break; + + case FT_HEIGHTMAP: + FiosGetHeightmapList(fop, *this); + break; + + default: + NOT_REACHED(); + } +} + +/** + * Find file information of a file by its name from the file list. + * @param file The filename to return information about. Can be the actual name + * or a numbered entry into the filename list. + * @return The information on the file, or \c NULL if the file is not available. + */ +const FiosItem *FileList::FindItem(const char *file) +{ + for (const FiosItem *item = this->Begin(); item != this->End(); item++) { + if (strcmp(file, item->name) == 0) return item; + if (strcmp(file, item->title) == 0) return item; + } + + /* If no name matches, try to parse it as number */ + char *endptr; + int i = strtol(file, &endptr, 10); + if (file == endptr || *endptr != '\0') i = -1; + + if (IsInsideMM(i, 0, this->Length())) return this->Get(i); + + /* As a last effort assume it is an OpenTTD savegame and + * that the ".sav" part was not given. */ + char long_file[MAX_PATH]; + seprintf(long_file, lastof(long_file), "%s.sav", file); + for (const FiosItem *item = this->Begin(); item != this->End(); item++) { + if (strcmp(long_file, item->name) == 0) return item; + if (strcmp(long_file, item->title) == 0) return item; + } + + return NULL; } /** @@ -94,12 +153,11 @@ const char *FiosBrowseTo(const FiosItem *item) { switch (item->type) { case FIOS_TYPE_DRIVE: -#if defined(WINCE) - seprintf(_fios_path, _fios_path_last, PATHSEP ""); -#elif defined(WIN32) || defined(__OS2__) +#if defined(_WIN32) || defined(__OS2__) seprintf(_fios_path, _fios_path_last, "%c:" PATHSEP, item->title[0]); #endif - /* FALL THROUGH */ + break; + case FIOS_TYPE_INVALID: break; @@ -215,23 +273,24 @@ bool FiosDelete(const char *name) return unlink(filename) == 0; } -typedef FiosType fios_getlist_callback_proc(SaveLoadDialogMode mode, const char *filename, const char *ext, char *title, const char *last); +typedef FiosType fios_getlist_callback_proc(SaveLoadOperation fop, const char *filename, const char *ext, char *title, const char *last); /** * Scanner to scan for a particular type of FIOS file. */ class FiosFileScanner : public FileScanner { - SaveLoadDialogMode mode; ///< The mode we want to search for + SaveLoadOperation fop; ///< The kind of file we are looking for. fios_getlist_callback_proc *callback_proc; ///< Callback to check whether the file may be added + FileList &file_list; ///< Destination of the found files. public: /** * Create the scanner - * @param mode The mode we are in. Some modes don't allow 'parent'. - * @param callback_proc The function that is called where you need to do the filtering. + * @param fop Purpose of collecting the list. + * @param callback_proc The function that is called where you need to do the filtering. + * @param file_list Destination of the found files. */ - FiosFileScanner(SaveLoadDialogMode mode, fios_getlist_callback_proc *callback_proc) : - mode(mode), - callback_proc(callback_proc) + FiosFileScanner(SaveLoadOperation fop, fios_getlist_callback_proc *callback_proc, FileList &file_list) : + fop(fop), callback_proc(callback_proc), file_list(file_list) {} /* virtual */ bool AddFile(const char *filename, size_t basepath_length, const char *tar_filename); @@ -251,15 +310,15 @@ bool FiosFileScanner::AddFile(const char *filename, size_t basepath_length, cons char fios_title[64]; fios_title[0] = '\0'; // reset the title; - FiosType type = this->callback_proc(this->mode, filename, ext, fios_title, lastof(fios_title)); + FiosType type = this->callback_proc(this->fop, filename, ext, fios_title, lastof(fios_title)); if (type == FIOS_TYPE_INVALID) return false; - for (const FiosItem *fios = _fios_items.Begin(); fios != _fios_items.End(); fios++) { + for (const FiosItem *fios = file_list.Begin(); fios != file_list.End(); fios++) { if (strcmp(fios->name, filename) == 0) return false; } - FiosItem *fios = _fios_items.Append(); -#ifdef WIN32 + FiosItem *fios = file_list.Append(); +#ifdef _WIN32 struct _stat sb; if (_tstat(OTTD2FS(filename), &sb) == 0) { #else @@ -289,11 +348,12 @@ bool FiosFileScanner::AddFile(const char *filename, size_t basepath_length, cons /** * Fill the list of the files in a directory, according to some arbitrary rule. - * @param mode The mode we are in. Some modes don't allow 'parent'. - * @param callback_proc The function that is called where you need to do the filtering. - * @param subdir The directory from where to start (global) searching. + * @param fop Purpose of collecting the list. + * @param callback_proc The function that is called where you need to do the filtering. + * @param subdir The directory from where to start (global) searching. + * @param file_list Destination of the found files. */ -static void FiosGetFileList(SaveLoadDialogMode mode, fios_getlist_callback_proc *callback_proc, Subdirectory subdir) +static void FiosGetFileList(SaveLoadOperation fop, fios_getlist_callback_proc *callback_proc, Subdirectory subdir, FileList &file_list) { struct stat sb; struct dirent *dirent; @@ -302,11 +362,11 @@ static void FiosGetFileList(SaveLoadDialogMode mode, fios_getlist_callback_proc int sort_start; char d_name[sizeof(fios->name)]; - _fios_items.Clear(); + file_list.Clear(); /* A parent directory link exists if we are not in the root directory */ if (!FiosIsRoot(_fios_path)) { - fios = _fios_items.Append(); + fios = file_list.Append(); fios->type = FIOS_TYPE_PARENT; fios->mtime = 0; strecpy(fios->name, "..", lastof(fios->name)); @@ -322,7 +382,7 @@ static void FiosGetFileList(SaveLoadDialogMode mode, fios_getlist_callback_proc if (FiosIsValidFile(_fios_path, dirent, &sb) && S_ISDIR(sb.st_mode) && (!FiosIsHiddenFile(dirent) || strncasecmp(d_name, PERSONAL_DIR, strlen(d_name)) == 0) && strcmp(d_name, ".") != 0 && strcmp(d_name, "..") != 0) { - fios = _fios_items.Append(); + fios = file_list.Append(); fios->type = FIOS_TYPE_DIR; fios->mtime = 0; strecpy(fios->name, d_name, lastof(fios->name)); @@ -337,27 +397,27 @@ static void FiosGetFileList(SaveLoadDialogMode mode, fios_getlist_callback_proc { SortingBits order = _savegame_sort_order; _savegame_sort_order = SORT_BY_NAME | SORT_ASCENDING; - QSortT(_fios_items.Begin(), _fios_items.Length(), CompareFiosItems); + QSortT(file_list.files.Begin(), file_list.files.Length(), CompareFiosItems); _savegame_sort_order = order; } /* This is where to start sorting for the filenames */ - sort_start = _fios_items.Length(); + sort_start = file_list.Length(); /* Show files */ - FiosFileScanner scanner(mode, callback_proc); + FiosFileScanner scanner(fop, callback_proc, file_list); if (subdir == NO_DIRECTORY) { scanner.Scan(NULL, _fios_path, false); } else { scanner.Scan(NULL, subdir, true, true); } - QSortT(_fios_items.Get(sort_start), _fios_items.Length() - sort_start, CompareFiosItems); + QSortT(file_list.Get(sort_start), file_list.Length() - sort_start, CompareFiosItems); /* Show drives */ - FiosGetDrives(); + FiosGetDrives(file_list); - _fios_items.Compact(); + file_list.Compact(); } /** @@ -386,7 +446,7 @@ static void GetFileTitle(const char *file, char *title, const char *last, Subdir /** * Callback for FiosGetFileList. It tells if a file is a savegame or not. - * @param mode Save/load mode. + * @param fop Purpose of collecting the list. * @param file Name of the file to check. * @param ext A pointer to the extension identifier inside file * @param title Buffer if a callback wants to lookup the title of the file; NULL to skip the lookup @@ -395,7 +455,7 @@ static void GetFileTitle(const char *file, char *title, const char *last, Subdir * @see FiosGetFileList * @see FiosGetSavegameList */ -FiosType FiosGetSavegameListCallback(SaveLoadDialogMode mode, const char *file, const char *ext, char *title, const char *last) +FiosType FiosGetSavegameListCallback(SaveLoadOperation fop, const char *file, const char *ext, char *title, const char *last) { /* Show savegame files * .SAV OpenTTD saved game @@ -411,7 +471,7 @@ FiosType FiosGetSavegameListCallback(SaveLoadDialogMode mode, const char *file, return FIOS_TYPE_FILE; } - if (mode == SLD_LOAD_GAME || mode == SLD_LOAD_SCENARIO) { + if (fop == SLO_LOAD) { if (strcasecmp(ext, ".ss1") == 0 || strcasecmp(ext, ".sv1") == 0 || strcasecmp(ext, ".sv2") == 0) { if (title != NULL) GetOldSaveGameName(file, title, last); @@ -424,10 +484,11 @@ FiosType FiosGetSavegameListCallback(SaveLoadDialogMode mode, const char *file, /** * Get a list of savegames. - * @param mode Save/load mode. + * @param fop Purpose of collecting the list. + * @param file_list Destination of the found files. * @see FiosGetFileList */ -void FiosGetSavegameList(SaveLoadDialogMode mode) +void FiosGetSavegameList(SaveLoadOperation fop, FileList &file_list) { static char *fios_save_path = NULL; static char *fios_save_path_last = NULL; @@ -441,12 +502,12 @@ void FiosGetSavegameList(SaveLoadDialogMode mode) _fios_path = fios_save_path; _fios_path_last = fios_save_path_last; - FiosGetFileList(mode, &FiosGetSavegameListCallback, NO_DIRECTORY); + FiosGetFileList(fop, &FiosGetSavegameListCallback, NO_DIRECTORY, file_list); } /** * Callback for FiosGetFileList. It tells if a file is a scenario or not. - * @param mode Save/load mode. + * @param fop Purpose of collecting the list. * @param file Name of the file to check. * @param ext A pointer to the extension identifier inside file * @param title Buffer if a callback wants to lookup the title of the file @@ -455,7 +516,7 @@ void FiosGetSavegameList(SaveLoadDialogMode mode) * @see FiosGetFileList * @see FiosGetScenarioList */ -static FiosType FiosGetScenarioListCallback(SaveLoadDialogMode mode, const char *file, const char *ext, char *title, const char *last) +static FiosType FiosGetScenarioListCallback(SaveLoadOperation fop, const char *file, const char *ext, char *title, const char *last) { /* Show scenario files * .SCN OpenTTD style scenario file @@ -466,7 +527,7 @@ static FiosType FiosGetScenarioListCallback(SaveLoadDialogMode mode, const char return FIOS_TYPE_SCENARIO; } - if (mode == SLD_LOAD_GAME || mode == SLD_LOAD_SCENARIO) { + if (fop == SLO_LOAD) { if (strcasecmp(ext, ".sv0") == 0 || strcasecmp(ext, ".ss0") == 0 ) { GetOldSaveGameName(file, title, last); return FIOS_TYPE_OLD_SCENARIO; @@ -478,10 +539,11 @@ static FiosType FiosGetScenarioListCallback(SaveLoadDialogMode mode, const char /** * Get a list of scenarios. - * @param mode Save/load mode. + * @param fop Purpose of collecting the list. + * @param file_list Destination of the found files. * @see FiosGetFileList */ -void FiosGetScenarioList(SaveLoadDialogMode mode) +void FiosGetScenarioList(SaveLoadOperation fop, FileList &file_list) { static char *fios_scn_path = NULL; static char *fios_scn_path_last = NULL; @@ -499,10 +561,11 @@ void FiosGetScenarioList(SaveLoadDialogMode mode) char base_path[MAX_PATH]; FioGetDirectory(base_path, lastof(base_path), SCENARIO_DIR); - FiosGetFileList(mode, &FiosGetScenarioListCallback, (mode == SLD_LOAD_SCENARIO && strcmp(base_path, _fios_path) == 0) ? SCENARIO_DIR : NO_DIRECTORY); + Subdirectory subdir = (fop == SLO_LOAD && strcmp(base_path, _fios_path) == 0) ? SCENARIO_DIR : NO_DIRECTORY; + FiosGetFileList(fop, &FiosGetScenarioListCallback, subdir, file_list); } -static FiosType FiosGetHeightmapListCallback(SaveLoadDialogMode mode, const char *file, const char *ext, char *title, const char *last) +static FiosType FiosGetHeightmapListCallback(SaveLoadOperation fop, const char *file, const char *ext, char *title, const char *last) { /* Show heightmap files * .PNG PNG Based heightmap files @@ -548,9 +611,10 @@ static FiosType FiosGetHeightmapListCallback(SaveLoadDialogMode mode, const char /** * Get a list of heightmaps. - * @param mode Save/load mode. + * @param fop Purpose of collecting the list. + * @param file_list Destination of the found files. */ -void FiosGetHeightmapList(SaveLoadDialogMode mode) +void FiosGetHeightmapList(SaveLoadOperation fop, FileList &file_list) { static char *fios_hmap_path = NULL; static char *fios_hmap_path_last = NULL; @@ -567,7 +631,8 @@ void FiosGetHeightmapList(SaveLoadDialogMode mode) char base_path[MAX_PATH]; FioGetDirectory(base_path, lastof(base_path), HEIGHTMAP_DIR); - FiosGetFileList(mode, &FiosGetHeightmapListCallback, strcmp(base_path, _fios_path) == 0 ? HEIGHTMAP_DIR : NO_DIRECTORY); + Subdirectory subdir = strcmp(base_path, _fios_path) == 0 ? HEIGHTMAP_DIR : NO_DIRECTORY; + FiosGetFileList(fop, &FiosGetHeightmapListCallback, subdir, file_list); } /** diff --git a/src/fios.h b/src/fios.h index b26fe00925..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; /** @@ -81,52 +88,17 @@ extern LoadCheckData _load_check_data; enum FileSlots { /** - * Slot used for the GRF scanning and such. This slot cannot be reused - * as it will otherwise cause issues when pressing "rescan directories". - * It can furthermore not be larger than LAST_GRF_SLOT as that complicates - * the testing for "too much NewGRFs". + * Slot used for the GRF scanning and such. + * This slot is used for all temporary accesses to files when scanning/testing files, + * and thus cannot be used for files, which are continuously accessed during a game. */ CONFIG_SLOT = 0, /** Slot for the sound. */ SOUND_SLOT = 1, /** First slot usable for (New)GRFs used during the game. */ FIRST_GRF_SLOT = 2, - /** Last slot usable for (New)GRFs used during the game. */ - LAST_GRF_SLOT = 63, /** Maximum number of slots. */ - MAX_FILE_SLOTS = 64 -}; - -/** Mode of the file dialogue window. */ -enum SaveLoadDialogMode { - SLD_LOAD_GAME, ///< Load a game. - SLD_LOAD_SCENARIO, ///< Load a scenario. - SLD_SAVE_GAME, ///< Save a game. - SLD_SAVE_SCENARIO, ///< Save a scenario. - SLD_LOAD_HEIGHTMAP, ///< Load a heightmap. - SLD_SAVE_HEIGHTMAP, ///< Save a heightmap. -}; - -/** The different types of files that the system knows about. */ -enum FileType { - FT_NONE, ///< nothing to do - FT_SAVEGAME, ///< old or new savegame - FT_SCENARIO, ///< old or new scenario - FT_HEIGHTMAP, ///< heightmap file -}; - -enum FiosType { - FIOS_TYPE_DRIVE, - FIOS_TYPE_PARENT, - FIOS_TYPE_DIR, - FIOS_TYPE_FILE, - FIOS_TYPE_OLDFILE, - FIOS_TYPE_SCENARIO, - FIOS_TYPE_OLD_SCENARIO, - FIOS_TYPE_DIRECT, - FIOS_TYPE_PNG, - FIOS_TYPE_BMP, - FIOS_TYPE_INVALID = 255, + MAX_FILE_SLOTS = 128, }; /** Deals with finding savegames */ @@ -137,12 +109,95 @@ struct FiosItem { char name[MAX_PATH]; }; -/** Deals with the type of the savegame, independent of extension */ -struct SmallFiosItem { - int mode; ///< savegame/scenario type (old, new) - FileType filetype; ///< what type of file are we dealing with - char name[MAX_PATH]; ///< name - char title[255]; ///< internal name of the game +/** List of file information. */ +class FileList { +public: + ~FileList(); + + /** + * Construct a new entry in the file list. + * @return Pointer to the new items to be initialized. + */ + inline FiosItem *Append() + { + return this->files.Append(); + } + + /** + * Get the number of files in the list. + * @return The number of files stored in the list. + */ + inline uint Length() const + { + return this->files.Length(); + } + + /** + * Get a pointer to the first file information. + * @return Address of the first file information. + */ + inline const FiosItem *Begin() const + { + return this->files.Begin(); + } + + /** + * Get a pointer behind the last file information. + * @return Address behind the last file information. + */ + inline const FiosItem *End() const + { + return this->files.End(); + } + + /** + * Get a pointer to the indicated file information. File information must exist. + * @return Address of the indicated existing file information. + */ + inline const FiosItem *Get(uint index) const + { + return this->files.Get(index); + } + + /** + * Get a pointer to the indicated file information. File information must exist. + * @return Address of the indicated existing file information. + */ + inline FiosItem *Get(uint index) + { + return this->files.Get(index); + } + + inline const FiosItem &operator[](uint index) const + { + return this->files[index]; + } + + /** + * Get a reference to the indicated file information. File information must exist. + * @return The requested file information. + */ + inline FiosItem &operator[](uint index) + { + return this->files[index]; + } + + /** Remove all items from the list. */ + inline void Clear() + { + this->files.Clear(); + } + + /** Compact the list down to the smallest block size boundary. */ + inline void Compact() + { + this->files.Compact(); + } + + void BuildFileList(AbstractFileType abstract_filetype, SaveLoadOperation fop); + const FiosItem *FindItem(const char *file); + + SmallVector files; ///< The list of files. }; enum SortingBits { @@ -154,18 +209,14 @@ enum SortingBits { DECLARE_ENUM_AS_BIT_SET(SortingBits) /* Variables to display file lists */ -extern SmallVector _fios_items; -extern SmallFiosItem _file_to_saveload; -extern SaveLoadDialogMode _saveload_mode; extern SortingBits _savegame_sort_order; -void ShowSaveLoadDialog(SaveLoadDialogMode mode); +void ShowSaveLoadDialog(AbstractFileType abstract_filetype, SaveLoadOperation fop); -void FiosGetSavegameList(SaveLoadDialogMode mode); -void FiosGetScenarioList(SaveLoadDialogMode mode); -void FiosGetHeightmapList(SaveLoadDialogMode mode); +void FiosGetSavegameList(SaveLoadOperation fop, FileList &file_list); +void FiosGetScenarioList(SaveLoadOperation fop, FileList &file_list); +void FiosGetHeightmapList(SaveLoadOperation fop, FileList &file_list); -void FiosFreeSavegameList(); const char *FiosBrowseTo(const FiosItem *item); StringID FiosGetDescText(const char **path, uint64 *total_free); @@ -173,13 +224,8 @@ bool FiosDelete(const char *name); void FiosMakeHeightmapName(char *buf, const char *name, const char *last); void FiosMakeSavegameName(char *buf, const char *name, const char *last); -FiosType FiosGetSavegameListCallback(SaveLoadDialogMode mode, const char *file, const char *ext, char *title, const char *last); +FiosType FiosGetSavegameListCallback(SaveLoadOperation fop, const char *file, const char *ext, char *title, const char *last); int CDECL CompareFiosItems(const FiosItem *a, const FiosItem *b); -extern const TextColour _fios_colours[]; - -void BuildFileList(); -void SetFiosType(const byte fiostype); - #endif /* FIOS_H */ diff --git a/src/fios_gui.cpp b/src/fios_gui.cpp index 9316deb658..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" @@ -36,7 +37,6 @@ #include "safeguards.h" -SaveLoadDialogMode _saveload_mode; LoadCheckData _load_check_data; ///< Data loaded from save during SL_LOAD_CHECK. static bool _fios_path_changed; @@ -77,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), @@ -87,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), @@ -99,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), @@ -120,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), @@ -129,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), @@ -153,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), @@ -163,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), @@ -172,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), @@ -187,33 +226,24 @@ static const NWidgetPart _nested_save_dialog_widgets[] = { EndContainer(), }; -/** Colours for fios types, indexed by #FiosType. */ -const TextColour _fios_colours[] = { - TC_LIGHT_BLUE, TC_DARK_GREEN, TC_DARK_GREEN, TC_ORANGE, TC_LIGHT_BROWN, - TC_ORANGE, TC_LIGHT_BROWN, TC_ORANGE, TC_ORANGE, TC_YELLOW +/** Text colours of #DetailedFileType fios entries in the window. */ +static const TextColour _fios_colours[] = { + TC_LIGHT_BROWN, // DFT_OLD_GAME_FILE + TC_ORANGE, // DFT_GAME_FILE + TC_YELLOW, // DFT_HEIGHTMAP_BMP + TC_ORANGE, // DFT_HEIGHTMAP_PNG + TC_LIGHT_BLUE, // DFT_FIOS_DRIVE + TC_DARK_GREEN, // DFT_FIOS_PARENT + TC_DARK_GREEN, // DFT_FIOS_DIR + TC_ORANGE, // DFT_FIOS_DIRECT }; -void BuildFileList() -{ - _fios_path_changed = true; - FiosFreeSavegameList(); - switch (_saveload_mode) { - case SLD_LOAD_SCENARIO: - case SLD_SAVE_SCENARIO: - FiosGetScenarioList(_saveload_mode); break; - case SLD_SAVE_HEIGHTMAP: - case SLD_LOAD_HEIGHTMAP: - FiosGetHeightmapList(_saveload_mode); break; - - default: FiosGetSavegameList(_saveload_mode); break; - } - - /* Invalidate saveload window */ - InvalidateWindowData(WC_SAVELOAD, 0, 2, true); -} - -static void MakeSortedSaveGameList() +/** + * Sort the collected list save games prior to displaying it in the save/load gui. + * @param[in,out] file_list List of save game files found in the directory. + */ +static void SortSaveGameList(FileList &file_list) { uint sort_start = 0; uint sort_end = 0; @@ -222,7 +252,7 @@ static void MakeSortedSaveGameList() * Drives (A:\ (windows only) are always under the files (FIOS_TYPE_DRIVE) * Only sort savegames/scenarios, not directories */ - for (const FiosItem *item = _fios_items.Begin(); item != _fios_items.End(); item++) { + for (const FiosItem *item = file_list.Begin(); item != file_list.End(); item++) { switch (item->type) { case FIOS_TYPE_DIR: sort_start++; break; case FIOS_TYPE_PARENT: sort_start++; break; @@ -231,16 +261,26 @@ static void MakeSortedSaveGameList() } } - uint s_amount = _fios_items.Length() - sort_start - sort_end; - QSortT(_fios_items.Get(sort_start), s_amount, CompareFiosItems); + uint s_amount = file_list.Length() - sort_start - sort_end; + QSortT(file_list.Get(sort_start), s_amount, CompareFiosItems); } 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. + FileList fios_items; ///< Save game list. FiosItem o_dir; - const FiosItem *selected; + 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. */ @@ -250,38 +290,61 @@ public: this->filename_editbox.text.UpdateSize(); } - SaveLoadWindow(WindowDesc *desc, SaveLoadDialogMode mode) : Window(desc), filename_editbox(64) + SaveLoadWindow(WindowDesc *desc, AbstractFileType abstract_filetype, SaveLoadOperation fop) + : Window(desc), filename_editbox(64), abstract_filetype(abstract_filetype), fop(fop), filter_editbox(EDITBOX_MAX_SIZE) { - static const StringID saveload_captions[] = { - STR_SAVELOAD_LOAD_CAPTION, - STR_SAVELOAD_LOAD_SCENARIO, - STR_SAVELOAD_SAVE_CAPTION, - STR_SAVELOAD_SAVE_SCENARIO, - STR_SAVELOAD_LOAD_HEIGHTMAP, - STR_SAVELOAD_SAVE_HEIGHTMAP, - }; - assert((uint)mode < lengthof(saveload_captions)); + assert(this->fop == SLO_SAVE || this->fop == SLO_LOAD); - /* Use an array to define what will be the current file type being handled - * by current file mode */ - switch (mode) { - case SLD_SAVE_GAME: this->GenerateFileName(); break; - case SLD_SAVE_HEIGHTMAP: - case SLD_SAVE_SCENARIO: this->filename_editbox.text.Assign("UNNAMED"); break; - default: break; + /* For saving, construct an initial file name. */ + if (this->fop == SLO_SAVE) { + switch (this->abstract_filetype) { + case FT_SAVEGAME: + this->GenerateFileName(); + break; + + case FT_SCENARIO: + case FT_HEIGHTMAP: + this->filename_editbox.text.Assign("UNNAMED"); + break; + + default: + NOT_REACHED(); + } } - this->querystrings[WID_SL_SAVE_OSK_TITLE] = &this->filename_editbox; this->filename_editbox.ok_button = WID_SL_SAVE_GAME; this->CreateNestedTree(true); - if (mode == SLD_LOAD_GAME) this->GetWidget(WID_SL_CONTENT_DOWNLOAD_SEL)->SetDisplayedPlane(SZSP_HORIZONTAL); - this->GetWidget(WID_SL_CAPTION)->widget_data = saveload_captions[mode]; - this->vscroll = this->GetScrollbar(WID_SL_SCROLLBAR); + if (this->fop == SLO_LOAD && this->abstract_filetype == FT_SAVEGAME) { + this->GetWidget(WID_SL_CONTENT_DOWNLOAD_SEL)->SetDisplayedPlane(SZSP_HORIZONTAL); + } + /* Select caption string of the window. */ + StringID caption_string; + switch (this->abstract_filetype) { + case FT_SAVEGAME: + caption_string = (this->fop == SLO_SAVE) ? STR_SAVELOAD_SAVE_CAPTION : STR_SAVELOAD_LOAD_CAPTION; + break; + + case FT_SCENARIO: + caption_string = (this->fop == SLO_SAVE) ? STR_SAVELOAD_SAVE_SCENARIO : STR_SAVELOAD_LOAD_SCENARIO; + break; + + case FT_HEIGHTMAP: + caption_string = (this->fop == SLO_SAVE) ? STR_SAVELOAD_SAVE_HEIGHTMAP : STR_SAVELOAD_LOAD_HEIGHTMAP; + break; + + default: + NOT_REACHED(); + } + this->GetWidget(WID_SL_CAPTION)->widget_data = caption_string; + + this->vscroll = this->GetScrollbar(WID_SL_SCROLLBAR); 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. */ @@ -290,24 +353,22 @@ public: } SetObjectToPlace(SPR_CURSOR_ZZZ, PAL_NONE, HT_NONE, WC_MAIN_WINDOW, 0); - this->OnInvalidateData(0); + this->OnInvalidateData(SLIWD_RESCAN_FILES); ResetObjectToPlace(); + /* Select the initial directory. */ o_dir.type = FIOS_TYPE_DIRECT; - switch (_saveload_mode) { - case SLD_SAVE_GAME: - case SLD_LOAD_GAME: + switch (this->abstract_filetype) { + case FT_SAVEGAME: FioGetDirectory(o_dir.name, lastof(o_dir.name), SAVE_DIR); break; - case SLD_SAVE_SCENARIO: - case SLD_LOAD_SCENARIO: + case FT_SCENARIO: FioGetDirectory(o_dir.name, lastof(o_dir.name), SCENARIO_DIR); break; - case SLD_SAVE_HEIGHTMAP: - case SLD_LOAD_HEIGHTMAP: + case FT_HEIGHTMAP: FioGetDirectory(o_dir.name, lastof(o_dir.name), HEIGHTMAP_DIR); break; @@ -315,9 +376,14 @@ public: strecpy(o_dir.name, _personal_dir, lastof(o_dir.name)); } - /* Focus the edit box by default in the save windows */ - if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO || _saveload_mode == SLD_SAVE_HEIGHTMAP) { - 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); } } @@ -327,7 +393,6 @@ public: if (!_networking && _game_mode != GM_EDITOR && _game_mode != GM_MENU) { DoCommandP(0, PM_PAUSED_SAVELOAD, 0, CMD_PAUSE); } - FiosFreeSavegameList(); } virtual void DrawWidget(const Rect &r, int widget) const @@ -360,13 +425,17 @@ public: GfxFillRect(r.left + 1, r.top + 1, r.right, r.bottom, PC_BLACK); uint y = r.top + WD_FRAMERECT_TOP; - for (uint pos = this->vscroll->GetPosition(); pos < _fios_items.Length(); pos++) { - const FiosItem *item = _fios_items.Get(pos); + 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) { GfxFillRect(r.left + 1, y, r.right, y + this->resize.step_height, PC_DARK_BLUE); } - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, item->title, _fios_colours[item->type]); + DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, item->title, _fios_colours[GetDetailedFileType(item->type)]); y += this->resize.step_height; if (y >= this->vscroll->GetCapacity() * this->resize.step_height + r.top + WD_FRAMERECT_TOP) break; } @@ -421,7 +490,7 @@ public: if (y > y_max) break; /* Hide current date for scenarios */ - if (_saveload_mode != SLD_LOAD_SCENARIO && _saveload_mode != SLD_SAVE_SCENARIO) { + if (this->abstract_filetype != FT_SCENARIO) { /* Current date */ SetDParam(0, _load_check_data.current_date); DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_SERVER_LIST_CURRENT_DATE); @@ -429,7 +498,7 @@ public: } /* Hide the NewGRF stuff when saving. We also hide the button. */ - if (_saveload_mode == SLD_LOAD_GAME || _saveload_mode == SLD_LOAD_SCENARIO) { + if (this->fop == SLO_LOAD && (this->abstract_filetype == FT_SAVEGAME || this->abstract_filetype == FT_SCENARIO)) { y += WD_PAR_VSEP_NORMAL; if (y > y_max) break; @@ -442,7 +511,7 @@ public: if (y > y_max) break; /* Hide the company stuff for scenarios */ - if (_saveload_mode != SLD_LOAD_SCENARIO && _saveload_mode != SLD_SAVE_SCENARIO) { + if (this->abstract_filetype != FT_SCENARIO) { y += FONT_HEIGHT_NORMAL; if (y > y_max) break; @@ -495,10 +564,9 @@ public: { if (_savegame_sort_dirty) { _savegame_sort_dirty = false; - MakeSortedSaveGameList(); + SortSaveGameList(this->fios_items); } - this->vscroll->SetCount(_fios_items.Length()); this->DrawWidgets(); } @@ -521,20 +589,20 @@ 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: if (this->selected != NULL && !_load_check_data.HasErrors()) { const char *name = FiosBrowseTo(this->selected); - SetFiosType(this->selected->type); + _file_to_saveload.SetMode(this->selected->type); + _file_to_saveload.SetName(name); + _file_to_saveload.SetTitle(this->selected->title); - strecpy(_file_to_saveload.name, name, lastof(_file_to_saveload.name)); - strecpy(_file_to_saveload.title, this->selected->title, lastof(_file_to_saveload.title)); - - if (_saveload_mode == SLD_LOAD_HEIGHTMAP) { + if (this->abstract_filetype == FT_HEIGHTMAP) { delete this; ShowHeightmapLoad(); + } else if (!_load_check_data.HasNewGrfs() || _load_check_data.grf_compatibility != GLC_NOT_FOUND || _settings_client.gui.UserIsAllowedToChangeNewGRFs()) { _switch_mode = (_game_mode == GM_EDITOR) ? SM_LOAD_SCENARIO : SM_LOAD_GAME; ClearErrorMessages(); @@ -563,7 +631,13 @@ public: int y = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_SL_DRIVES_DIRECTORIES_LIST, WD_FRAMERECT_TOP); if (y == INT_MAX) return; - const FiosItem *file = _fios_items.Get(y); + /* 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); if (name != NULL) { @@ -572,33 +646,37 @@ public: this->selected = file; _load_check_data.Clear(); - if (file->type == FIOS_TYPE_FILE || file->type == FIOS_TYPE_SCENARIO) { - SaveOrLoad(name, SL_LOAD_CHECK, NO_DIRECTORY, false); + if (GetDetailedFileType(file->type) == DFT_GAME_FILE) { + /* Other detailed file types cannot be checked before. */ + SaveOrLoad(name, SLO_CHECK, DFT_GAME_FILE, NO_DIRECTORY, false); } - this->InvalidateData(1); + this->InvalidateData(SLIWD_SELECTION_CHANGES); } - if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO || _saveload_mode == SLD_SAVE_HEIGHTMAP) { + if (this->fop == SLO_SAVE) { /* Copy clicked name to editbox */ this->filename_editbox.text.Assign(file->title); this->SetWidgetDirty(WID_SL_SAVE_OSK_TITLE); } } else if (!_load_check_data.HasErrors()) { this->selected = file; - if (_saveload_mode == SLD_LOAD_GAME || _saveload_mode == SLD_LOAD_SCENARIO) { - this->OnClick(pt, WID_SL_LOAD_BUTTON, 1); - } else if (_saveload_mode == SLD_LOAD_HEIGHTMAP) { - SetFiosType(file->type); - strecpy(_file_to_saveload.name, name, lastof(_file_to_saveload.name)); - strecpy(_file_to_saveload.title, file->title, lastof(_file_to_saveload.title)); + if (this->fop == SLO_LOAD) { + if (this->abstract_filetype == FT_SAVEGAME || this->abstract_filetype == FT_SCENARIO) { + this->OnClick(pt, WID_SL_LOAD_BUTTON, 1); + } else { + assert(this->abstract_filetype == FT_HEIGHTMAP); + _file_to_saveload.SetMode(file->type); + _file_to_saveload.SetName(name); + _file_to_saveload.SetTitle(file->title); - delete this; - ShowHeightmapLoad(); + delete this; + ShowHeightmapLoad(); + } } } } else { /* Changed directory, need refresh. */ - this->InvalidateData(); + this->InvalidateData(SLIWD_RESCAN_FILES); } break; } @@ -608,10 +686,11 @@ public: ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, WL_ERROR); } else { #if defined(ENABLE_NETWORK) - switch (_saveload_mode) { + assert(this->fop == SLO_LOAD); + switch (this->abstract_filetype) { default: NOT_REACHED(); - case SLD_LOAD_SCENARIO: ShowNetworkContentListWindow(NULL, CONTENT_TYPE_SCENARIO); break; - case SLD_LOAD_HEIGHTMAP: ShowNetworkContentListWindow(NULL, CONTENT_TYPE_HEIGHTMAP); break; + case FT_SCENARIO: ShowNetworkContentListWindow(NULL, CONTENT_TYPE_SCENARIO); break; + case FT_HEIGHTMAP: ShowNetworkContentListWindow(NULL, CONTENT_TYPE_HEIGHTMAP); break; } #endif } @@ -639,20 +718,19 @@ public: virtual void OnTimeout() { - /* This test protects against using widgets 11 and 12 which are only available - * in those saveload modes. */ - if (!(_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO || _saveload_mode == SLD_SAVE_HEIGHTMAP)) return; + /* Widgets WID_SL_DELETE_SELECTION and WID_SL_SAVE_GAME only exist when saving to a file. */ + if (this->fop != SLO_SAVE) return; if (this->IsWidgetLowered(WID_SL_DELETE_SELECTION)) { // Delete button clicked 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 (_saveload_mode == SLD_SAVE_GAME) GenerateFileName(); + if (this->abstract_filetype == FT_SAVEGAME) GenerateFileName(); } } else if (this->IsWidgetLowered(WID_SL_SAVE_GAME)) { // Save button clicked - if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) { + if (this->abstract_filetype == FT_SAVEGAME || this->abstract_filetype == FT_SCENARIO) { _switch_mode = SM_SAVE_GAME; FiosMakeSavegameName(_file_to_saveload.name, this->filename_editbox.text.buf, lastof(_file_to_saveload.name)); } else { @@ -678,34 +756,86 @@ 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(); if (!gui_scope) break; - BuildFileList(); - /* FALL THROUGH */ - case 1: - /* Selection changes */ - if (!gui_scope) break; - if (_saveload_mode == SLD_LOAD_HEIGHTMAP) { - this->SetWidgetDisabledState(WID_SL_LOAD_BUTTON, this->selected == NULL || _load_check_data.HasErrors()); - } - if (_saveload_mode == SLD_LOAD_GAME || _saveload_mode == SLD_LOAD_SCENARIO) { - this->SetWidgetDisabledState(WID_SL_LOAD_BUTTON, - this->selected == NULL || _load_check_data.HasErrors() || !(!_load_check_data.HasNewGrfs() || _load_check_data.grf_compatibility != GLC_NOT_FOUND || _settings_client.gui.UserIsAllowedToChangeNewGRFs())); - this->SetWidgetDisabledState(WID_SL_NEWGRF_INFO, - !_load_check_data.HasNewGrfs()); - this->SetWidgetDisabledState(WID_SL_MISSING_NEWGRFS, - !_load_check_data.HasNewGrfs() || _load_check_data.grf_compatibility == GLC_ALL_GOOD); - } - break; - case 2: - /* _fios_items changed */ - this->vscroll->SetCount(_fios_items.Length()); + + _fios_path_changed = true; + this->fios_items.BuildFileList(this->abstract_filetype, this->fop); + 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 SLIWD_SELECTION_CHANGES: + /* Selection changes */ + if (!gui_scope) break; + + if (this->fop != SLO_LOAD) break; + + switch (this->abstract_filetype) { + case FT_HEIGHTMAP: + this->SetWidgetDisabledState(WID_SL_LOAD_BUTTON, this->selected == NULL || _load_check_data.HasErrors()); + break; + + case FT_SAVEGAME: + case FT_SCENARIO: { + bool disabled = this->selected == NULL || _load_check_data.HasErrors(); + if (!_settings_client.gui.UserIsAllowedToChangeNewGRFs()) { + disabled |= _load_check_data.HasNewGrfs() && _load_check_data.grf_compatibility == GLC_NOT_FOUND; + } + this->SetWidgetDisabledState(WID_SL_LOAD_BUTTON, disabled); + this->SetWidgetDisabledState(WID_SL_NEWGRF_INFO, !_load_check_data.HasNewGrfs()); + this->SetWidgetDisabledState(WID_SL_MISSING_NEWGRFS, + !_load_check_data.HasNewGrfs() || _load_check_data.grf_compatibility == GLC_ALL_GOOD); + break; + } + + default: + 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); } } }; @@ -734,70 +864,24 @@ static WindowDesc _save_dialog_desc( _nested_save_dialog_widgets, lengthof(_nested_save_dialog_widgets) ); -/** - * These values are used to convert the file/operations mode into a corresponding file type. - * So each entry, as expressed by the related comment, is based on the enum - */ -static const FileType _file_modetotype[] = { - FT_SAVEGAME, // used for SLD_LOAD_GAME - FT_SCENARIO, // used for SLD_LOAD_SCENARIO - FT_SAVEGAME, // used for SLD_SAVE_GAME - FT_SCENARIO, // used for SLD_SAVE_SCENARIO - FT_HEIGHTMAP, // used for SLD_LOAD_HEIGHTMAP - FT_HEIGHTMAP, // used for SLD_SAVE_HEIGHTMAP -}; - /** * Launch save/load dialog in the given mode. - * @param mode Save/load mode. + * @param abstract_filetype Kind of file to handle. + * @param fop File operation to perform (load or save). */ -void ShowSaveLoadDialog(SaveLoadDialogMode mode) +void ShowSaveLoadDialog(AbstractFileType abstract_filetype, SaveLoadOperation fop) { DeleteWindowById(WC_SAVELOAD, 0); WindowDesc *sld; - switch (mode) { - case SLD_SAVE_GAME: - case SLD_SAVE_SCENARIO: - case SLD_SAVE_HEIGHTMAP: - sld = &_save_dialog_desc; break; - case SLD_LOAD_HEIGHTMAP: - sld = &_load_heightmap_dialog_desc; break; - default: - sld = &_load_dialog_desc; break; + if (fop == SLO_SAVE) { + sld = &_save_dialog_desc; + } else { + /* Dialogue for loading a file. */ + sld = (abstract_filetype == FT_HEIGHTMAP) ? &_load_heightmap_dialog_desc : &_load_dialog_desc; } - _saveload_mode = mode; - _file_to_saveload.filetype = _file_modetotype[mode]; + _file_to_saveload.abstract_ftype = abstract_filetype; - new SaveLoadWindow(sld, mode); -} - -void SetFiosType(const byte fiostype) -{ - switch (fiostype) { - case FIOS_TYPE_FILE: - case FIOS_TYPE_SCENARIO: - _file_to_saveload.mode = SL_LOAD; - break; - - case FIOS_TYPE_OLDFILE: - case FIOS_TYPE_OLD_SCENARIO: - _file_to_saveload.mode = SL_OLD_LOAD; - break; - -#ifdef WITH_PNG - case FIOS_TYPE_PNG: - _file_to_saveload.mode = SL_PNG; - break; -#endif /* WITH_PNG */ - - case FIOS_TYPE_BMP: - _file_to_saveload.mode = SL_BMP; - break; - - default: - _file_to_saveload.mode = SL_INVALID; - break; - } + new SaveLoadWindow(sld, abstract_filetype, fop); } diff --git a/src/fontcache.cpp b/src/fontcache.cpp index 6bea59c103..55da0c55c8 100644 --- a/src/fontcache.cpp +++ b/src/fontcache.cpp @@ -41,7 +41,7 @@ FontCache::FontCache(FontSize fs) : parent(FontCache::Get(fs)), fs(fs), height(_ ascender(_default_font_ascender[fs]), descender(_default_font_ascender[fs] - _default_font_height[fs]), units_per_em(1) { - assert(parent == NULL || this->fs == parent->fs); + assert(this->parent == NULL || this->fs == this->parent->fs); FontCache::caches[this->fs] = this; Layouter::ResetFontCache(this->fs); } @@ -49,7 +49,7 @@ FontCache::FontCache(FontSize fs) : parent(FontCache::Get(fs)), fs(fs), height(_ /** Clean everything up. */ FontCache::~FontCache() { - assert(this->fs == parent->fs); + assert(this->fs == this->parent->fs); FontCache::caches[this->fs] = this->parent; Layouter::ResetFontCache(this->fs); } @@ -86,6 +86,7 @@ public: virtual GlyphID MapCharToGlyph(WChar key) { assert(IsPrintable(key)); return SPRITE_GLYPH | key; } virtual const void *GetFontTable(uint32 tag, size_t &length) { length = 0; return NULL; } virtual const char *GetFontName() { return "sprite"; } + virtual bool IsBuiltInFont() { return true; } }; /** @@ -126,7 +127,7 @@ void SpriteFontCache::InitializeUnicodeGlyphMap() SpriteID base; switch (this->fs) { default: NOT_REACHED(); - case FS_MONO: // Use normal as default for mono spaced font, i.e. FALL THROUGH + case FS_MONO: // Use normal as default for mono spaced font case FS_NORMAL: base = SPR_ASCII_SPACE; break; case FS_SMALL: base = SPR_ASCII_SPACE_SMALL; break; case FS_LARGE: base = SPR_ASCII_SPACE_BIG; break; @@ -208,6 +209,8 @@ bool SpriteFontCache::GetDrawGlyphShadow() 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. @@ -236,10 +239,12 @@ private: GlyphEntry *GetGlyphPtr(GlyphID key); void SetGlyphPtr(GlyphID key, const GlyphEntry *glyph, bool duplicate = false); + void SetFontSize(FontSize fs, FT_Face face, int pixels); 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(); } @@ -250,6 +255,7 @@ public: virtual GlyphID MapCharToGlyph(WChar key); virtual const void *GetFontTable(uint32 tag, size_t &length); virtual const char *GetFontName() { return face->family_name; } + virtual bool IsBuiltInFont() { return false; } }; FT_Library _library = NULL; @@ -265,22 +271,29 @@ static const byte SHADOW_COLOUR = 2; * @param face The font that has to be loaded. * @param pixels The number of pixels this font should be high. */ -FreeTypeFontCache::FreeTypeFontCache(FontSize fs, FT_Face face, int pixels) : FontCache(fs), face(face), glyph_to_sprite(NULL) +FreeTypeFontCache::FreeTypeFontCache(FontSize fs, FT_Face face, int pixels) : FontCache(fs), face(face), req_size(pixels), glyph_to_sprite(NULL) { assert(face != NULL); + this->SetFontSize(fs, face, pixels); +} + +void FreeTypeFontCache::SetFontSize(FontSize fs, FT_Face face, int pixels) +{ if (pixels == 0) { /* Try to determine a good height based on the minimal height recommended by the font. */ - pixels = _default_font_height[this->fs]; + int scaled_height = ScaleGUITrad(_default_font_height[this->fs]); + pixels = scaled_height; TT_Header *head = (TT_Header *)FT_Get_Sfnt_Table(this->face, ft_sfnt_head); if (head != NULL) { /* Font height is minimum height plus the difference between the default * height for this font size and the small size. */ - int diff = _default_font_height[this->fs] - _default_font_height[FS_SMALL]; - pixels = Clamp(min(head->Lowest_Rec_PPEM, 20) + diff, _default_font_height[this->fs], MAX_FONT_SIZE); + int diff = scaled_height - ScaleGUITrad(_default_font_height[FS_SMALL]); + 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) { @@ -393,6 +406,7 @@ found_face: FreeTypeFontCache::~FreeTypeFontCache() { FT_Done_Face(this->face); + this->face = NULL; this->ClearFontCache(); for (FontTable::iterator iter = this->font_tables.Begin(); iter != this->font_tables.End(); iter++) { @@ -422,6 +436,9 @@ void FreeTypeFontCache::ClearFontCache() this->glyph_to_sprite = NULL; Layouter::ResetFontCache(this->fs); + + /* GUI scaling might have changed, determine font size anew if it was automatically selected. */ + if (this->face != NULL && this->req_size == 0) this->SetFontSize(this->fs, this->face, this->req_size); } FreeTypeFontCache::GlyphEntry *FreeTypeFontCache::GetGlyphPtr(GlyphID key) @@ -474,7 +491,7 @@ static bool GetFontAAState(FontSize size) const Sprite *FreeTypeFontCache::GetGlyph(GlyphID key) { - if ((key & SPRITE_GLYPH) != 0) return parent->GetGlyph(key); + if ((key & SPRITE_GLYPH) != 0) return this->parent->GetGlyph(key); /* Check for the glyph in our cache */ GlyphEntry *glyph = this->GetGlyphPtr(key); diff --git a/src/fontcache.h b/src/fontcache.h index 8caf4f1bd3..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. @@ -143,6 +149,11 @@ public: { return this->parent != NULL; } + + /** + * Is this a built-in sprite font? + */ + virtual bool IsBuiltInFont() = 0; }; /** Get the SpriteID mapped to the given font size and key */ diff --git a/src/fontdetection.cpp b/src/fontdetection.cpp index 6df45cf6a1..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 @@ -382,38 +382,67 @@ FT_Error GetFontByFaceName(const char *font_name, FT_Face *face) FT_Error err = FT_Err_Cannot_Open_Resource; /* Get font reference from name. */ - CFStringRef name = CFStringCreateWithCString(kCFAllocatorDefault, font_name, kCFStringEncodingUTF8); - ATSFontRef font = ATSFontFindFromName(name, kATSOptionFlagsDefault); - CFRelease(name); - if (font == kInvalidFont) return err; - - /* Get a file system reference for the font. */ - FSRef ref; + UInt8 file_path[PATH_MAX]; OSStatus os_err = -1; -#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) - if (MacOSVersionIsAtLeast(10, 5, 0)) { - os_err = ATSFontGetFileReference(font, &ref); + CFStringRef name = CFStringCreateWithCString(kCFAllocatorDefault, font_name, kCFStringEncodingUTF8); + +#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6) + if (MacOSVersionIsAtLeast(10, 6, 0)) { + /* Simply creating the font using CTFontCreateWithNameAndSize will *always* return + * something, no matter the name. As such, we can't use it to check for existance. + * We instead query the list of all font descriptors that match the given name which + * does not do this stupid name fallback. */ + CTFontDescriptorRef name_desc = CTFontDescriptorCreateWithNameAndSize(name, 0.0); + CFSetRef mandatory_attribs = CFSetCreate(kCFAllocatorDefault, (const void **)&kCTFontNameAttribute, 1, &kCFTypeSetCallBacks); + CFArrayRef descs = CTFontDescriptorCreateMatchingFontDescriptors(name_desc, mandatory_attribs); + CFRelease(mandatory_attribs); + CFRelease(name_desc); + CFRelease(name); + + /* Loop over all matches until we can get a path for one of them. */ + for (CFIndex i = 0; descs != NULL && i < CFArrayGetCount(descs) && os_err != noErr; i++) { + CTFontRef font = CTFontCreateWithFontDescriptor((CTFontDescriptorRef)CFArrayGetValueAtIndex(descs, i), 0.0, NULL); + CFURLRef fontURL = (CFURLRef)CTFontCopyAttribute(font, kCTFontURLAttribute); + if (CFURLGetFileSystemRepresentation(fontURL, true, file_path, lengthof(file_path))) os_err = noErr; + CFRelease(font); + CFRelease(fontURL); + } + if (descs != NULL) CFRelease(descs); } else #endif { -#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) && !defined(__LP64__) - /* This type was introduced with the 10.5 SDK. */ -#if (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5) - #define ATSFSSpec FSSpec +#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6) + ATSFontRef font = ATSFontFindFromName(name, kATSOptionFlagsDefault); + CFRelease(name); + if (font == kInvalidFont) return err; + + /* Get a file system reference for the font. */ + FSRef ref; +#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) + if (MacOSVersionIsAtLeast(10, 5, 0)) { + os_err = ATSFontGetFileReference(font, &ref); + } else #endif - FSSpec spec; - os_err = ATSFontGetFileSpecification(font, (ATSFSSpec *)&spec); - if (os_err == noErr) os_err = FSpMakeFSRef(&spec, &ref); + { +#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) && !defined(__LP64__) + /* This type was introduced with the 10.5 SDK. */ +#if (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5) +#define ATSFSSpec FSSpec +#endif + FSSpec spec; + os_err = ATSFontGetFileSpecification(font, (ATSFSSpec *)&spec); + if (os_err == noErr) os_err = FSpMakeFSRef(&spec, &ref); +#endif + } + + /* Get unix path for file. */ + if (os_err == noErr) os_err = FSRefMakePath(&ref, file_path, sizeof(file_path)); #endif } if (os_err == noErr) { - /* Get unix path for file. */ - UInt8 file_path[PATH_MAX]; - if (FSRefMakePath(&ref, file_path, sizeof(file_path)) == noErr) { - DEBUG(freetype, 3, "Font path for %s: %s", font_name, file_path); - err = FT_New_Face(_library, (const char *)file_path, 0, face); - } + DEBUG(freetype, 3, "Font path for %s: %s", font_name, file_path); + err = FT_New_Face(_library, (const char *)file_path, 0, face); } return err; @@ -496,6 +525,7 @@ bool SetFallbackFont(FreeTypeSettings *settings, const char *language_isocode, i } else #endif { +#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6) /* Create a font iterator and iterate over all fonts that * are available to the application. */ ATSFontIterator itr; @@ -529,6 +559,7 @@ bool SetFallbackFont(FreeTypeSettings *settings, const char *language_isocode, i } } ATSFontIteratorRelease(&itr); +#endif } if (!result) { 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.hpp b/src/game/game.hpp index faa9650bfe..329ba5e500 100644 --- a/src/game/game.hpp +++ b/src/game/game.hpp @@ -55,7 +55,7 @@ public: /** * Resume execution of the Game Script. This function will not actually execute - * the script, but set a flag so that the script is executed my the usual + * the script, but set a flag so that the script is executed by the usual * mechanism that executes the script. */ static void Unpause(); diff --git a/src/game/game_info.cpp b/src/game/game_info.cpp index 9bb36d1aa5..f8c04608b7 100644 --- a/src/game/game_info.cpp +++ b/src/game/game_info.cpp @@ -25,12 +25,13 @@ static bool CheckAPIVersion(const char *api_version) { return strcmp(api_version, "1.2") == 0 || strcmp(api_version, "1.3") == 0 || strcmp(api_version, "1.4") == 0 || - strcmp(api_version, "1.5") == 0 || strcmp(api_version, "1.6") == 0; + strcmp(api_version, "1.5") == 0 || strcmp(api_version, "1.6") == 0 || strcmp(api_version, "1.7") == 0 || + 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_instance.cpp b/src/game/game_instance.cpp index c5e5c7f05a..e2b3775110 100644 --- a/src/game/game_instance.cpp +++ b/src/game/game_instance.cpp @@ -34,6 +34,8 @@ #include "../script/api/game/game_cargo.hpp.sq" #include "../script/api/game/game_cargolist.hpp.sq" #include "../script/api/game/game_cargomonitor.hpp.sq" +#include "../script/api/game/game_client.hpp.sq" +#include "../script/api/game/game_clientlist.hpp.sq" #include "../script/api/game/game_company.hpp.sq" #include "../script/api/game/game_companymode.hpp.sq" #include "../script/api/game/game_controller.hpp.sq" @@ -122,6 +124,9 @@ void GameInstance::RegisterAPI() SQGSCargoList_IndustryProducing_Register(this->engine); SQGSCargoList_StationAccepting_Register(this->engine); SQGSCargoMonitor_Register(this->engine); + SQGSClient_Register(this->engine); + SQGSClientList_Register(this->engine); + SQGSClientList_Company_Register(this->engine); SQGSCompany_Register(this->engine); SQGSCompanyMode_Register(this->engine); SQGSDate_Register(this->engine); diff --git a/src/game/game_scanner.cpp b/src/game/game_scanner.cpp index bc02f6afd2..38afdd1357 100644 --- a/src/game/game_scanner.cpp +++ b/src/game/game_scanner.cpp @@ -55,7 +55,7 @@ GameInfo *GameScannerInfo::FindInfo(const char *nameParam, int versionParam, boo *e = '\0'; e++; versionParam = atoi(e); - /* FALL THROUGH, like we were calling this function with a version. */ + /* Continue like we were calling this function with a version. */ } if (force_exact_match) { 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/game/game_text.hpp b/src/game/game_text.hpp index 19a31049ec..14da7d9b2e 100644 --- a/src/game/game_text.hpp +++ b/src/game/game_text.hpp @@ -14,9 +14,6 @@ #include "../core/smallvec_type.hpp" -/** The tab we place our strings in. */ -static const uint GAME_TEXT_TAB = 18; - const char *GetGameStringPtr(uint id); void RegisterGameTranslation(class Squirrel *engine); void ReconsiderGameScriptLanguage(); 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/gamelog.h b/src/gamelog.h index 7f5b6a7765..83694e3ea8 100644 --- a/src/gamelog.h +++ b/src/gamelog.h @@ -38,7 +38,7 @@ void GamelogReset(); * @param s The string to print. */ typedef void GamelogPrintProc(const char *s); -void GamelogPrint(GamelogPrintProc *proc); // needed for WIN32 / WINCE crash.log +void GamelogPrint(GamelogPrintProc *proc); // needed for WIN32 crash.log void GamelogPrintDebug(int level); void GamelogPrintConsole(); diff --git a/src/genworld.cpp b/src/genworld.cpp index 88e1b84a51..5cdb129b9c 100644 --- a/src/genworld.cpp +++ b/src/genworld.cpp @@ -77,7 +77,7 @@ static void CleanupGeneration() { _generating_world = false; - if (_cursor.sprite == SPR_CURSOR_ZZZ) SetMouseCursor(SPR_CURSOR_MOUSE, PAL_NONE); + SetMouseCursorBusy(false); /* Show all vital windows again, because we have hidden them */ if (_gw.threaded && _game_mode != GM_MENU) ShowVitalWindows(); SetModalProgress(false); @@ -204,7 +204,7 @@ static void _GenerateWorld(void *) if (_debug_desync_level > 0) { char name[MAX_PATH]; seprintf(name, lastof(name), "dmp_cmds_%08x_%08x.sav", _settings_game.game_creation.generation_seed, _date); - SaveOrLoad(name, SL_SAVE, AUTOSAVE_DIR, false); + SaveOrLoad(name, SLO_SAVE, DFT_GAME_FILE, AUTOSAVE_DIR, false); } } catch (...) { BasePersistentStorageArray::SwitchMode(PSM_LEAVE_GAMELOOP, true); @@ -331,7 +331,7 @@ void GenerateWorld(GenWorldMode mode, uint size_x, uint size_y, bool reset_setti _gw.thread = NULL; } - if (!VideoDriver::GetInstance()->HasGUI() || !ThreadObject::New(&_GenerateWorld, NULL, &_gw.thread)) { + if (!VideoDriver::GetInstance()->HasGUI() || !ThreadObject::New(&_GenerateWorld, NULL, &_gw.thread, "ottd:genworld")) { DEBUG(misc, 1, "Cannot create genworld thread, reverting to single-threaded mode"); _gw.threaded = false; _modal_progress_work_mutex->EndCritical(); 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 ad64ae802f..b22ba5287e 100644 --- a/src/genworld_gui.cpp +++ b/src/genworld_gui.cpp @@ -26,6 +26,7 @@ #include "town.h" #include "core/geometry_func.hpp" #include "core/random_func.hpp" +#include "saveload/saveload.h" #include "progress.h" #include "error.h" @@ -287,7 +288,7 @@ static DropDownList *BuildMapsizeDropDown() for (uint i = MIN_MAP_SIZE_BITS; i <= MAX_MAP_SIZE_BITS; i++) { DropDownListParamStringItem *item = new DropDownListParamStringItem(STR_JUST_INT, i, false); - item->SetParam(0, 1 << i); + item->SetParam(0, 1LL << i); *list->Append() = item; } @@ -335,8 +336,8 @@ struct GenerateLandscapeWindow : public Window { { switch (widget) { case WID_GL_START_DATE_TEXT: SetDParam(0, ConvertYMDToDate(_settings_newgame.game_creation.starting_year, 0, 1)); break; - case WID_GL_MAPSIZE_X_PULLDOWN: SetDParam(0, 1 << _settings_newgame.game_creation.map_x); break; - case WID_GL_MAPSIZE_Y_PULLDOWN: SetDParam(0, 1 << _settings_newgame.game_creation.map_y); break; + case WID_GL_MAPSIZE_X_PULLDOWN: SetDParam(0, 1LL << _settings_newgame.game_creation.map_x); break; + case WID_GL_MAPSIZE_Y_PULLDOWN: SetDParam(0, 1LL << _settings_newgame.game_creation.map_y); break; case WID_GL_MAX_HEIGHTLEVEL_TEXT: SetDParam(0, _settings_newgame.construction.max_heightlevel); break; case WID_GL_SNOW_LEVEL_TEXT: SetDParam(0, _settings_newgame.game_creation.snow_line_height); break; @@ -832,7 +833,7 @@ static void _ShowGenerateLandscape(GenerateLandscapeWindowMode mode) if (mode == GLWM_HEIGHTMAP) { /* If the function returns negative, it means there was a problem loading the heightmap */ - if (!GetHeightmapDimensions(_file_to_saveload.name, &x, &y)) return; + if (!GetHeightmapDimensions(_file_to_saveload.detail_ftype, _file_to_saveload.name, &x, &y)) return; } WindowDesc *desc = (mode == GLWM_HEIGHTMAP) ? &_heightmap_load_desc : &_generate_landscape_desc; @@ -869,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; @@ -895,11 +896,11 @@ struct CreateScenarioWindow : public Window break; case WID_CS_MAPSIZE_X_PULLDOWN: - SetDParam(0, 1 << _settings_newgame.game_creation.map_x); + SetDParam(0, 1LL << _settings_newgame.game_creation.map_x); break; case WID_CS_MAPSIZE_Y_PULLDOWN: - SetDParam(0, 1 << _settings_newgame.game_creation.map_y); + SetDParam(0, 1LL << _settings_newgame.game_creation.map_y); break; case WID_CS_FLAT_LAND_HEIGHT_TEXT: @@ -1190,7 +1191,7 @@ struct GenerateProgressWindow : public Window { { switch (widget) { case WID_GP_ABORT: - if (_cursor.sprite == SPR_CURSOR_ZZZ) SetMouseCursor(SPR_CURSOR_MOUSE, PAL_NONE); + SetMouseCursorBusy(false); ShowQuery( STR_GENERATION_ABORT_CAPTION, STR_GENERATION_ABORT_MESSAGE, diff --git a/src/gfx.cpp b/src/gfx.cpp index f3a98461d6..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. */ @@ -1111,16 +1111,17 @@ void DoPaletteAnimations() /** * Determine a contrasty text colour for a coloured background. * @param background Background colour. + * @param threshold Background colour brightness threshold below which the background is considered dark and TC_WHITE is returned, range: 0 - 255, default 128. * @return TC_BLACK or TC_WHITE depending on what gives a better contrast. */ -TextColour GetContrastColour(uint8 background) +TextColour GetContrastColour(uint8 background, uint8 threshold) { Colour c = _cur_palette.palette[background]; /* Compute brightness according to http://www.w3.org/TR/AERT#color-contrast. * The following formula computes 1000 * brightness^2, with brightness being in range 0 to 255. */ uint sq1000_brightness = c.r * c.r * 299 + c.g * c.g * 587 + c.b * c.b * 114; - /* Compare with threshold brightness 128 (50%) */ - return sq1000_brightness < 128 * 128 * 1000 ? TC_WHITE : TC_BLACK; + /* Compare with threshold brightness which defaults to 128 (50%) */ + return sq1000_brightness < ((uint) threshold) * ((uint) threshold) * 1000 ? TC_WHITE : TC_BLACK; } /** @@ -1169,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) @@ -1214,19 +1215,10 @@ void UndrawMouseCursor() void DrawMouseCursor() { -#if defined(WINCE) - /* Don't ever draw the mouse for WinCE, as we work with a stylus */ - return; -#endif - /* Don't draw the mouse cursor if the screen is not ready */ if (_screen.dst_ptr == NULL) return; Blitter *blitter = BlitterFactory::GetCurrentBlitter(); - int x; - int y; - int w; - int h; /* Redraw mouse cursor but only when it's inside the window */ if (!_cursor.in_window) return; @@ -1237,36 +1229,44 @@ void DrawMouseCursor() UndrawMouseCursor(); } - w = _cursor.size.x; - x = _cursor.pos.x + _cursor.offs.x + _cursor.short_vehicle_offset; - if (x < 0) { - w += x; - x = 0; + /* Determine visible area */ + int left = _cursor.pos.x + _cursor.total_offs.x; + int width = _cursor.total_size.x; + if (left < 0) { + width += left; + left = 0; } - if (w > _screen.width - x) w = _screen.width - x; - if (w <= 0) return; - _cursor.draw_pos.x = x; - _cursor.draw_size.x = w; - - h = _cursor.size.y; - y = _cursor.pos.y + _cursor.offs.y; - if (y < 0) { - h += y; - y = 0; + if (left + width > _screen.width) { + width = _screen.width - left; } - if (h > _screen.height - y) h = _screen.height - y; - if (h <= 0) return; - _cursor.draw_pos.y = y; - _cursor.draw_size.y = h; + if (width <= 0) return; - uint8 *buffer = _cursor_backup.Allocate(blitter->BufferSize(w, h)); + int top = _cursor.pos.y + _cursor.total_offs.y; + int height = _cursor.total_size.y; + if (top < 0) { + height += top; + top = 0; + } + if (top + height > _screen.height) { + height = _screen.height - top; + } + if (height <= 0) return; + + _cursor.draw_pos.x = left; + _cursor.draw_pos.y = top; + _cursor.draw_size.x = width; + _cursor.draw_size.y = height; + + uint8 *buffer = _cursor_backup.Allocate(blitter->BufferSize(_cursor.draw_size.x, _cursor.draw_size.y)); /* Make backup of stuff below cursor */ blitter->CopyToBuffer(blitter->MoveTo(_screen.dst_ptr, _cursor.draw_pos.x, _cursor.draw_pos.y), buffer, _cursor.draw_size.x, _cursor.draw_size.y); /* Draw cursor on screen */ _cur_dpi = &_screen; - DrawSprite(_cursor.sprite, _cursor.pal, _cursor.pos.x + _cursor.short_vehicle_offset, _cursor.pos.y); + for (uint i = 0; i < _cursor.sprite_count; ++i) { + DrawSprite(_cursor.sprite_seq[i].sprite, _cursor.sprite_seq[i].pal, _cursor.pos.x + _cursor.sprite_pos[i].x, _cursor.pos.y + _cursor.sprite_pos[i].y); + } VideoDriver::GetInstance()->MakeDirty(_cursor.draw_pos.x, _cursor.draw_pos.y, _cursor.draw_size.x, _cursor.draw_size.y); @@ -1525,15 +1525,33 @@ bool FillDrawPixelInfo(DrawPixelInfo *n, int left, int top, int width, int heigh */ void UpdateCursorSize() { - CursorVars *cv = &_cursor; - const Sprite *p = GetSprite(GB(cv->sprite, 0, SPRITE_WIDTH), ST_NORMAL); + /* Ignore setting any cursor before the sprites are loaded. */ + if (GetMaxSpriteID() == 0) return; - cv->size.y = UnScaleGUI(p->height); - cv->size.x = UnScaleGUI(p->width); - cv->offs.x = UnScaleGUI(p->x_offs); - cv->offs.y = UnScaleGUI(p->y_offs); + assert_compile(lengthof(_cursor.sprite_seq) == lengthof(_cursor.sprite_pos)); + assert(_cursor.sprite_count <= lengthof(_cursor.sprite_seq)); + for (uint i = 0; i < _cursor.sprite_count; ++i) { + const Sprite *p = GetSprite(GB(_cursor.sprite_seq[i].sprite, 0, SPRITE_WIDTH), ST_NORMAL); + Point offs, size; + offs.x = UnScaleGUI(p->x_offs) + _cursor.sprite_pos[i].x; + offs.y = UnScaleGUI(p->y_offs) + _cursor.sprite_pos[i].y; + size.x = UnScaleGUI(p->width); + size.y = UnScaleGUI(p->height); - cv->dirty = true; + if (i == 0) { + _cursor.total_offs = offs; + _cursor.total_size = size; + } else { + int right = max(_cursor.total_offs.x + _cursor.total_size.x, offs.x + size.x); + int bottom = max(_cursor.total_offs.y + _cursor.total_size.y, offs.y + size.y); + if (offs.x < _cursor.total_offs.x) _cursor.total_offs.x = offs.x; + if (offs.y < _cursor.total_offs.y) _cursor.total_offs.y = offs.y; + _cursor.total_size.x = right - _cursor.total_offs.x; + _cursor.total_size.y = bottom - _cursor.total_offs.y; + } + } + + _cursor.dirty = true; } /** @@ -1543,14 +1561,15 @@ void UpdateCursorSize() */ static void SetCursorSprite(CursorID cursor, PaletteID pal) { - CursorVars *cv = &_cursor; - if (cv->sprite == cursor) return; + if (_cursor.sprite_count == 1 && _cursor.sprite_seq[0].sprite == cursor && _cursor.sprite_seq[0].pal == pal) return; + + _cursor.sprite_count = 1; + _cursor.sprite_seq[0].sprite = cursor; + _cursor.sprite_seq[0].pal = pal; + _cursor.sprite_pos[0].x = 0; + _cursor.sprite_pos[0].y = 0; - cv->sprite = cursor; - cv->pal = pal; UpdateCursorSize(); - - cv->short_vehicle_offset = 0; } static void SwitchAnimatedCursor() @@ -1559,7 +1578,7 @@ static void SwitchAnimatedCursor() if (cur == NULL || cur->sprite == AnimCursor::LAST) cur = _cursor.animate_list; - SetCursorSprite(cur->sprite, _cursor.pal); + SetCursorSprite(cur->sprite, _cursor.sprite_seq[0].pal); _cursor.animate_timeout = cur->display_time; _cursor.animate_cur = cur + 1; @@ -1572,6 +1591,19 @@ void CursorTick() } } +/** + * Set or unset the ZZZ cursor. + * @param busy Whether to show the ZZZ cursor. + */ +void SetMouseCursorBusy(bool busy) +{ + if (busy) { + if (_cursor.sprite_seq[0].sprite == SPR_CURSOR_MOUSE) SetMouseCursor(SPR_CURSOR_ZZZ, PAL_NONE); + } else { + if (_cursor.sprite_seq[0].sprite == SPR_CURSOR_ZZZ) SetMouseCursor(SPR_CURSOR_MOUSE, PAL_NONE); + } +} + /** * Assign a single non-animated sprite to the cursor. * @param sprite Sprite to draw for the cursor. @@ -1595,7 +1627,7 @@ void SetAnimatedMouseCursor(const AnimCursor *table) { _cursor.animate_list = table; _cursor.animate_cur = NULL; - _cursor.pal = PAL_NONE; + _cursor.sprite_seq[0].pal = PAL_NONE; SwitchAnimatedCursor(); } @@ -1603,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_func.h b/src/gfx_func.h index 6576dee4fb..9f7cb9153d 100644 --- a/src/gfx_func.h +++ b/src/gfx_func.h @@ -142,9 +142,22 @@ void CheckBlitter(); bool FillDrawPixelInfo(DrawPixelInfo *n, int left, int top, int width, int height); +/** + * Determine where to draw a centred object inside a widget. + * @param min The top or left coordinate. + * @param max The bottom or right coordinate. + * @param size The height or width of the object to draw. + * @return Offset of where to start drawing the object. + */ +static inline int CenterBounds(int min, int max, int size) +{ + return min + (max - min - size + 1) / 2; +} + /* window.cpp */ void DrawOverlappedWindowForAll(int left, int top, int right, int bottom); +void SetMouseCursorBusy(bool busy); void SetMouseCursor(CursorID cursor, PaletteID pal); void SetAnimatedMouseCursor(const AnimCursor *table); void CursorTick(); @@ -160,21 +173,21 @@ void GetBroadestDigit(uint *front, uint *next, FontSize size = FS_NORMAL); int GetCharacterHeight(FontSize size); -/** Height of characters in the small (#FS_SMALL) font. */ +/** Height of characters in the small (#FS_SMALL) font. @note Some characters may be oversized. */ #define FONT_HEIGHT_SMALL (GetCharacterHeight(FS_SMALL)) -/** Height of characters in the normal (#FS_NORMAL) font. */ +/** Height of characters in the normal (#FS_NORMAL) font. @note Some characters may be oversized. */ #define FONT_HEIGHT_NORMAL (GetCharacterHeight(FS_NORMAL)) -/** Height of characters in the large (#FS_LARGE) font. */ +/** Height of characters in the large (#FS_LARGE) font. @note Some characters may be oversized. */ #define FONT_HEIGHT_LARGE (GetCharacterHeight(FS_LARGE)) -/** Height of characters in the large (#FS_MONO) font. */ +/** Height of characters in the large (#FS_MONO) font. @note Some characters may be oversized. */ #define FONT_HEIGHT_MONO (GetCharacterHeight(FS_MONO)) extern DrawPixelInfo *_cur_dpi; -TextColour GetContrastColour(uint8 background); +TextColour GetContrastColour(uint8 background, uint8 threshold = 128); /** * All 16 colour gradients diff --git a/src/gfx_layout.cpp b/src/gfx_layout.cpp index f5463d4015..c65ead90e1 100644 --- a/src/gfx_layout.cpp +++ b/src/gfx_layout.cpp @@ -21,6 +21,14 @@ #include #endif /* WITH_ICU_LAYOUT */ +#ifdef WITH_UNISCRIBE +#include "os/windows/string_uniscribe.h" +#endif /* WITH_UNISCRIBE */ + +#ifdef WITH_COCOA +#include "os/macosx/string_osx.h" +#endif + #include "safeguards.h" @@ -113,32 +121,18 @@ le_bool Font::getGlyphPoint(LEGlyphID glyph, le_int32 pointNumber, LEPoint &poin return FALSE; } -static size_t AppendToBuffer(UChar *buff, const UChar *buffer_last, WChar c) -{ - /* Transform from UTF-32 to internal ICU format of UTF-16. */ - int32 length = 0; - UErrorCode err = U_ZERO_ERROR; - u_strFromUTF32(buff, buffer_last - buff, &length, (UChar32*)&c, 1, &err); - return length; -} - /** * 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: - /** Helper for GetLayouter, to get the right type. */ - typedef UChar CharType; - /** Helper for GetLayouter, to get whether the layouter supports RTL. */ - static const bool SUPPORTS_RTL = true; - /** 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(); } @@ -150,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)); @@ -173,46 +167,65 @@ 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); } }; -static ParagraphLayouter *GetParagraphLayout(UChar *buff, UChar *buff_end, FontMap &fontMapping) -{ - int32 length = buff_end - buff; +/** + * Helper class to construct a new #ICUParagraphLayout. + */ +class ICUParagraphLayoutFactory { +public: + /** Helper for GetLayouter, to get the right type. */ + typedef UChar CharType; + /** Helper for GetLayouter, to get whether the layouter supports RTL. */ + static const bool SUPPORTS_RTL = true; - if (length == 0) { - /* ICU's ParagraphLayout cannot handle empty strings, so fake one. */ - buff[0] = ' '; - length = 1; - fontMapping.End()[-1].first++; + static ParagraphLayouter *GetParagraphLayout(UChar *buff, UChar *buff_end, FontMap &fontMapping) + { + int32 length = buff_end - buff; + + if (length == 0) { + /* ICU's ParagraphLayout cannot handle empty strings, so fake one. */ + buff[0] = ' '; + length = 1; + fontMapping.End()[-1].first++; + } + + /* Fill ICU's FontRuns with the right data. */ + icu::FontRuns runs(fontMapping.Length()); + for (FontMap::iterator iter = fontMapping.Begin(); iter != fontMapping.End(); iter++) { + runs.add(iter->second, iter->first); + } + + 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. */ + 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; + } + + return new ICUParagraphLayout(p); } - /* Fill ICU's FontRuns with the right data. */ - FontRuns runs(fontMapping.Length()); - for (FontMap::iterator iter = fontMapping.Begin(); iter != fontMapping.End(); iter++) { - runs.add(iter->second, iter->first); + static size_t AppendToBuffer(UChar *buff, const UChar *buffer_last, WChar c) + { + /* Transform from UTF-32 to internal ICU format of UTF-16. */ + int32 length = 0; + UErrorCode err = U_ZERO_ERROR; + u_strFromUTF32(buff, buffer_last - buff, &length, (UChar32*)&c, 1, &err); + return length; } - - 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); - if (status != LE_NO_ERROR) { - delete p; - return NULL; - } - - return new ICUParagraphLayout(p); -} - +}; #endif /* WITH_ICU_LAYOUT */ /*** Paragraph layout ***/ @@ -236,11 +249,6 @@ static ParagraphLayouter *GetParagraphLayout(UChar *buff, UChar *buff_end, FontM */ class FallbackParagraphLayout : public ParagraphLayouter { public: - /** Helper for GetLayouter, to get the right type. */ - typedef WChar CharType; - /** Helper for GetLayouter, to get whether the layouter supports RTL. */ - static const bool SUPPORTS_RTL = false; - /** Visual run contains data about the bit of text with the same font. */ class FallbackVisualRun : public ParagraphLayouter::VisualRun { Font *font; ///< The font used to layout these. @@ -280,6 +288,42 @@ public: const ParagraphLayouter::Line *NextLine(int max_width); }; +/** + * Helper class to construct a new #FallbackParagraphLayout. + */ +class FallbackParagraphLayoutFactory { +public: + /** Helper for GetLayouter, to get the right type. */ + typedef WChar CharType; + /** Helper for GetLayouter, to get whether the layouter supports RTL. */ + static const bool SUPPORTS_RTL = false; + + /** + * 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(WChar *buff, WChar *buff_end, FontMap &fontMapping) + { + return new FallbackParagraphLayout(buff, buff_end - buff, 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(WChar *buff, const WChar *buffer_last, WChar c) + { + *buff = c; + return 1; + } +}; + /** * Create the visual run. * @param font The font to use for this run. @@ -458,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) { @@ -473,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; @@ -536,31 +579,6 @@ const ParagraphLayouter::Line *FallbackParagraphLayout::NextLine(int max_width) return l; } -/** - * Appand 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(WChar *buff, const WChar *buffer_last, WChar c) -{ - *buff = c; - return 1; -} - -/** - * 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 FallbackParagraphLayout *GetParagraphLayout(WChar *buff, WChar *buff_end, FontMap &fontMapping) -{ - return new FallbackParagraphLayout(buff, buff_end - buff, fontMapping); -} - /** * Helper for getting a ParagraphLayouter of the given type. * @@ -582,6 +600,7 @@ static inline void GetLayouter(Layouter::LineCacheItem &line, const char *&str, Font *f = Layouter::GetFont(state.fontsize, state.cur_colour); line.buffer = buff_begin; + fontMapping.Clear(); /* * Go through the whole string while adding Font instances to the font map @@ -594,18 +613,18 @@ static inline void GetLayouter(Layouter::LineCacheItem &line, const char *&str, break; } else if (c >= SCC_BLUE && c <= SCC_BLACK) { state.SetColour((TextColour)(c - SCC_BLUE)); - } else if (c == SCC_PREVIOUS_COLOUR) { // Revert to the previous colour. - state.SetPreviousColour(); - } else if (c == SCC_TINYFONT) { - state.SetFontSize(FS_SMALL); - } else if (c == SCC_BIGFONT) { - state.SetFontSize(FS_LARGE); + } else if (c == SCC_PUSH_COLOUR) { + state.PushColour(); + } else if (c == SCC_POP_COLOUR) { + state.PopColour(); + } else if (c >= SCC_FIRST_FONT && c <= SCC_LAST_FONT) { + state.SetFontSize((FontSize)(c - SCC_FIRST_FONT)); } else { /* Filter out text direction characters that shouldn't be drawn, and * will not be handled in the fallback non ICU case because they are * mostly needed for RTL languages which need more ICU support. */ if (!T::SUPPORTS_RTL && IsTextDirectionChar(c)) continue; - buff += AppendToBuffer(buff, buffer_last, c); + buff += T::AppendToBuffer(buff, buffer_last, c); continue; } @@ -621,7 +640,7 @@ static inline void GetLayouter(Layouter::LineCacheItem &line, const char *&str, if (!fontMapping.Contains(buff - buff_begin)) { fontMapping.Insert(buff - buff_begin, f); } - line.layout = GetParagraphLayout(buff_begin, buff, fontMapping); + line.layout = T::GetParagraphLayout(buff_begin, buff, fontMapping); line.state_after = state; } @@ -654,11 +673,13 @@ Layouter::Layouter(const char *str, int maxw, TextColour colour, FontSize fontsi line.layout->Reflow(); } else { /* Line is new, layout it */ -#ifdef WITH_ICU_LAYOUT FontState old_state = state; +#if defined(WITH_ICU_LAYOUT) || defined(WITH_UNISCRIBE) || defined(WITH_COCOA) const char *old_str = str; +#endif - GetLayouter(line, str, state); +#ifdef WITH_ICU_LAYOUT + GetLayouter(line, str, state); if (line.layout == NULL) { static bool warned = false; if (!warned) { @@ -668,11 +689,32 @@ Layouter::Layouter(const char *str, int maxw, TextColour colour, FontSize fontsi state = old_state; str = old_str; - GetLayouter(line, str, state); } -#else - GetLayouter(line, str, state); #endif + +#ifdef WITH_UNISCRIBE + if (line.layout == NULL) { + GetLayouter(line, str, state); + if (line.layout == NULL) { + state = old_state; + str = old_str; + } + } +#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); + } } /* Copy all lines into a local cache so we can reuse them later on more easily. */ @@ -809,6 +851,13 @@ void Layouter::ResetFontCache(FontSize size) /* We must reset the linecache since it references the just freed fonts */ ResetLineCache(); + +#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 0a21d9b0ca..f6fc3b5c71 100644 --- a/src/gfx_layout.h +++ b/src/gfx_layout.h @@ -18,10 +18,11 @@ #include #include +#include #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 */ @@ -33,10 +34,11 @@ struct FontState { FontSize fontsize; ///< Current font size. TextColour cur_colour; ///< Current text colour. - TextColour prev_colour; ///< Text colour from before the last colour switch. - FontState() : fontsize(FS_END), cur_colour(TC_INVALID), prev_colour(TC_INVALID) {} - FontState(TextColour colour, FontSize fontsize) : fontsize(fontsize), cur_colour(colour), prev_colour(colour) {} + std::stack colour_stack; ///< Stack of colours to assist with colour switching. + + FontState() : fontsize(FS_END), cur_colour(TC_INVALID) {} + FontState(TextColour colour, FontSize fontsize) : fontsize(fontsize), cur_colour(colour) {} /** * Switch to new colour \a c. @@ -45,14 +47,25 @@ struct FontState { inline void SetColour(TextColour c) { assert(c >= TC_BLUE && c <= TC_BLACK); - this->prev_colour = this->cur_colour; this->cur_colour = c; } - /** Switch to previous colour. */ - inline void SetPreviousColour() + /** + * Switch to and pop the last saved colour on the stack. + */ + inline void PopColour() { - Swap(this->cur_colour, this->prev_colour); + if (colour_stack.empty()) return; + SetColour(colour_stack.top()); + colour_stack.pop(); + } + + /** + * Push the current colour on to the stack. + */ + inline void PushColour() + { + colour_stack.push(this->cur_colour); } /** @@ -149,7 +162,7 @@ class Layouter : public AutoDeleteSmallVectorstate_before.fontsize != other.state_before.fontsize) return this->state_before.fontsize < other.state_before.fontsize; if (this->state_before.cur_colour != other.state_before.cur_colour) return this->state_before.cur_colour < other.state_before.cur_colour; - if (this->state_before.prev_colour != other.state_before.prev_colour) return this->state_before.prev_colour < other.state_before.prev_colour; + if (this->state_before.colour_stack != other.state_before.colour_stack) return this->state_before.colour_stack < other.state_before.colour_stack; return this->str < other.str; } }; diff --git a/src/gfx_type.h b/src/gfx_type.h index d25abff218..4cfc149a86 100644 --- a/src/gfx_type.h +++ b/src/gfx_type.h @@ -115,29 +115,35 @@ struct AnimCursor { /** Collection of variables for cursor-display and -animation */ struct CursorVars { - Point pos, size, offs, delta; ///< position, size, offset from top-left, and movement - Point draw_pos, draw_size; ///< position and size bounding-box for drawing - int short_vehicle_offset; ///< offset of the X for short vehicles - CursorID sprite; ///< current image of cursor - PaletteID pal; - - int wheel; ///< mouse wheel movement + /* Logical mouse position */ + Point pos; ///< logical mouse position + Point delta; ///< relative mouse movement in this tick + int wheel; ///< mouse wheel movement + bool fix_at; ///< mouse is moving, but cursor is not (used for scrolling) /* We need two different vars to keep track of how far the scrollwheel moved. * OSX uses this for scrolling around the map. */ int v_wheel; int h_wheel; + /* Mouse appearance */ + PalSpriteID sprite_seq[16]; ///< current image of cursor + Point sprite_pos[16]; ///< relative position of individual sprites + uint sprite_count; ///< number of sprites to draw + Point total_offs, total_size; ///< union of sprite properties + + Point draw_pos, draw_size; ///< position and size bounding-box for drawing + const AnimCursor *animate_list; ///< in case of animated cursor, list of frames const AnimCursor *animate_cur; ///< in case of animated cursor, current frame uint animate_timeout; ///< in case of animated cursor, number of ticks to show the current cursor - bool visible; ///< cursor is visible - bool dirty; ///< the rect occupied by the mouse is dirty (redraw) - bool fix_at; ///< mouse is moving, but cursor is not (used for scrolling) - bool in_window; ///< mouse inside this window, determines drawing logic + bool visible; ///< cursor is visible + bool dirty; ///< the rect occupied by the mouse is dirty (redraw) + bool in_window; ///< mouse inside this window, determines drawing logic - bool vehchain; ///< vehicle chain is dragged + /* Drag data */ + bool vehchain; ///< vehicle chain is dragged bool UpdateCursorPosition(int x, int y, bool queued_warp); @@ -183,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 10bc0afa17..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. */ @@ -139,7 +139,7 @@ void CheckExternalFiles() if (used_set->GetNumInvalid() != 0) { /* Not all files were loaded successfully, see which ones */ - add_pos += seprintf(add_pos, last, "Trying to load graphics set '%s', but it is incomplete. The game will probably not run correctly until you properly install this set or select another one. See section 4.1 of readme.txt.\n\nThe following files are corrupted or missing:\n", used_set->name); + add_pos += seprintf(add_pos, last, "Trying to load graphics set '%s', but it is incomplete. The game will probably not run correctly until you properly install this set or select another one. See section 4.1 of README.md.\n\nThe following files are corrupted or missing:\n", used_set->name); for (uint i = 0; i < GraphicsSet::NUM_FILES; i++) { MD5File::ChecksumResult res = GraphicsSet::CheckMD5(&used_set->files[i], BASESET_DIR); if (res != MD5File::CR_MATCH) add_pos += seprintf(add_pos, last, "\t%s is %s (%s)\n", used_set->files[i].filename, res == MD5File::CR_MISMATCH ? "corrupt" : "missing", used_set->files[i].missing_warning); @@ -149,7 +149,7 @@ void CheckExternalFiles() const SoundsSet *sounds_set = BaseSounds::GetUsedSet(); if (sounds_set->GetNumInvalid() != 0) { - add_pos += seprintf(add_pos, last, "Trying to load sound set '%s', but it is incomplete. The game will probably not run correctly until you properly install this set or select another one. See section 4.1 of readme.txt.\n\nThe following files are corrupted or missing:\n", sounds_set->name); + add_pos += seprintf(add_pos, last, "Trying to load sound set '%s', but it is incomplete. The game will probably not run correctly until you properly install this set or select another one. See section 4.1 of README.md.\n\nThe following files are corrupted or missing:\n", sounds_set->name); assert_compile(SoundsSet::NUM_FILES == 1); /* No need to loop each file, as long as there is only a single @@ -197,31 +197,49 @@ static void LoadSpriteTables() InitializeUnicodeGlyphMap(); /* - * Load the base NewGRF with OTTD required graphics as first NewGRF. + * Load the base and extra NewGRF with OTTD required graphics as first NewGRF. * However, we do not want it to show up in the list of used NewGRFs, * so we have to manually add it, and then remove it later. */ GRFConfig *top = _grfconfig; - GRFConfig *master = new GRFConfig(used_set->files[GFT_EXTRA].filename); + + /* Default extra graphics */ + GRFConfig *master = new GRFConfig("OPENTTD.GRF"); + master->palette |= GRFP_GRF_DOS; + FillGRFDetails(master, false, BASESET_DIR); + ClrBit(master->flags, GCF_INIT_ONLY); + + /* Baseset extra graphics */ + GRFConfig *extra = new GRFConfig(used_set->files[GFT_EXTRA].filename); /* We know the palette of the base set, so if the base NewGRF is not * setting one, use the palette of the base set and not the global * one which might be the wrong palette for this base NewGRF. * The value set here might be overridden via action14 later. */ switch (used_set->palette) { - case PAL_DOS: master->palette |= GRFP_GRF_DOS; break; - case PAL_WINDOWS: master->palette |= GRFP_GRF_WINDOWS; break; + case PAL_DOS: extra->palette |= GRFP_GRF_DOS; break; + case PAL_WINDOWS: extra->palette |= GRFP_GRF_WINDOWS; break; default: break; } - FillGRFDetails(master, false, BASESET_DIR); + FillGRFDetails(extra, false, BASESET_DIR); + ClrBit(extra->flags, GCF_INIT_ONLY); - ClrBit(master->flags, GCF_INIT_ONLY); - master->next = top; + extra->next = top; + master->next = extra; _grfconfig = master; - LoadNewGRF(SPR_NEWGRFS_BASE, i); + LoadNewGRF(SPR_NEWGRFS_BASE, i, 2); + + uint total_extra_graphics = SPR_NEWGRFS_BASE - SPR_OPENTTD_BASE; + _missing_extra_graphics = GetSpriteCountForSlot(i, SPR_OPENTTD_BASE, SPR_NEWGRFS_BASE); + DEBUG(sprite, 1, "%u extra sprites, %u from baseset, %u from fallback", total_extra_graphics, total_extra_graphics - _missing_extra_graphics, _missing_extra_graphics); + + /* The original baseset extra graphics intentionally make use of the fallback graphics. + * Let's say everything which provides less than 500 sprites misses the rest intentionally. */ + if (500 + _missing_extra_graphics > total_extra_graphics) _missing_extra_graphics = 0; /* Free and remove the top element. */ + delete extra; delete master; _grfconfig = top; } @@ -266,12 +284,17 @@ static bool SwitchNewGRFBlitter() #endif { "8bpp-optimized", 2, 8, 8, 8, 8 }, { "32bpp-optimized", 0, 8, 32, 8, 32 }, +#ifdef WITH_SSE + { "32bpp-sse2-anim", 1, 8, 32, 8, 32 }, +#endif { "32bpp-anim", 1, 8, 32, 8, 32 }, }; const bool animation_wanted = HasBit(_display_opt, DO_FULL_ANIMATION); const char *cur_blitter = BlitterFactory::GetCurrentBlitter()->GetName(); + VideoDriver::GetInstance()->AcquireBlitterLock(); + for (uint i = 0; i < lengthof(replacement_blitters); i++) { if (animation_wanted && (replacement_blitters[i].animation == 0)) continue; if (!animation_wanted && (replacement_blitters[i].animation == 1)) continue; @@ -280,7 +303,10 @@ static bool SwitchNewGRFBlitter() if (!IsInsideMM(depth_wanted_by_grf, replacement_blitters[i].min_grf_depth, replacement_blitters[i].max_grf_depth + 1)) continue; const char *repl_blitter = replacement_blitters[i].name; - if (strcmp(repl_blitter, cur_blitter) == 0) return false; + if (strcmp(repl_blitter, cur_blitter) == 0) { + VideoDriver::GetInstance()->ReleaseBlitterLock(); + return false; + } if (BlitterFactory::GetBlitterFactory(repl_blitter) == NULL) continue; DEBUG(misc, 1, "Switching blitter from '%s' to '%s'... ", cur_blitter, repl_blitter); @@ -295,6 +321,8 @@ static bool SwitchNewGRFBlitter() if (BlitterFactory::SelectBlitter(cur_blitter) == NULL || !VideoDriver::GetInstance()->AfterBlitterChange()) usererror("Failed to reinitialize video driver. Specify a fixed blitter in the config"); } + VideoDriver::GetInstance()->ReleaseBlitterLock(); + return true; } diff --git a/src/goal.cpp b/src/goal.cpp index 2f6ca242a9..f7aae350e5 100644 --- a/src/goal.cpp +++ b/src/goal.cpp @@ -23,6 +23,8 @@ #include "string_func.h" #include "gui.h" #include "network/network.h" +#include "network/network_base.h" +#include "network/network_func.h" #include "safeguards.h" @@ -234,7 +236,9 @@ CommandCost CmdSetGoalCompleted(TileIndex tile, DoCommandFlag flags, uint32 p1, * @param flags type of operation * @param p1 various bitstuffed elements * - p1 = (bit 0 - 15) - Unique ID to use for this question. - * - p1 = (bit 16 - 23) - Company for which this question is. + * - p1 = (bit 16 - 23) - Company or client for which this question is. + * - p1 = (bit 24 - 25) - Question type. + * - p1 = (bit 31) - Question target: 0 - company, 1 - client. * @param p2 Buttons of the question. * @param text Text of the question. * @return the cost of this operation or an error @@ -243,17 +247,37 @@ CommandCost CmdGoalQuestion(TileIndex tile, DoCommandFlag flags, uint32 p1, uint { uint16 uniqueid = (GoalType)GB(p1, 0, 16); CompanyID company = (CompanyID)GB(p1, 16, 8); - byte type = GB(p1, 24, 8); +#ifdef ENABLE_NETWORK + ClientIndex client = (ClientIndex)GB(p1, 16, 8); +#endif + byte type = GB(p1, 24, 2); + bool is_client = HasBit(p1, 31); if (_current_company != OWNER_DEITY) return CMD_ERROR; if (StrEmpty(text)) return CMD_ERROR; - if (company != INVALID_COMPANY && !Company::IsValidID(company)) return CMD_ERROR; + if (is_client) { +#ifdef ENABLE_NETWORK + if (!NetworkClientInfo::IsValidID(client)) return CMD_ERROR; +#else + return CMD_ERROR; +#endif + } else { + if (company != INVALID_COMPANY && !Company::IsValidID(company)) return CMD_ERROR; + } if (CountBits(p2) < 1 || CountBits(p2) > 3) return CMD_ERROR; if (p2 >= (1 << GOAL_QUESTION_BUTTON_COUNT)) return CMD_ERROR; if (type >= GOAL_QUESTION_TYPE_COUNT) return CMD_ERROR; if (flags & DC_EXEC) { - if ((company != INVALID_COMPANY && company == _local_company) || (company == INVALID_COMPANY && Company::IsValidID(_local_company))) ShowGoalQuestion(uniqueid, type, p2, text); + if (is_client) { +#ifdef ENABLE_NETWORK + if (NetworkClientInfo::Get(client)->client_id != _network_own_client_id) return CommandCost(); +#endif + } else { + if (company == INVALID_COMPANY && !Company::IsValidID(_local_company)) return CommandCost(); + if (company != INVALID_COMPANY && company != _local_company) return CommandCost(); + } + ShowGoalQuestion(uniqueid, type, p2, text); } return CommandCost(); 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 c12c6ace4d..48b8c4c84a 100644 --- a/src/graph_gui.cpp +++ b/src/graph_gui.cpp @@ -33,8 +33,8 @@ #include "safeguards.h" /* Bitmasks of company and cargo indices that shouldn't be drawn. */ -static uint _legend_excluded_companies; -static uint _legend_excluded_cargo; +static CompanyMask _legend_excluded_companies; +static CargoTypes _legend_excluded_cargo; /* Apparently these don't play well with enums. */ static const OverflowSafeInt64 INVALID_DATAPOINT(INT64_MAX); // Value used for a datapoint that shouldn't be drawn. @@ -166,14 +166,14 @@ struct ValuesInterval { struct BaseGraphWindow : Window { protected: - static const int GRAPH_MAX_DATASETS = 32; + static const int GRAPH_MAX_DATASETS = 64; static const int GRAPH_AXIS_LINE_COLOUR = PC_BLACK; static const int GRAPH_NUM_MONTHS = 24; ///< Number of months displayed in the graph. static const int MIN_GRAPH_NUM_LINES_Y = 9; ///< Minimal number of horizontal lines to draw. static const int MIN_GRID_PIXEL_SIZE = 20; ///< Minimum distance between graph lines. - uint excluded_data; ///< bitmask of the datasets that shouldn't be displayed. + uint64 excluded_data; ///< bitmask of the datasets that shouldn't be displayed. byte num_dataset; byte num_on_x_axis; byte num_vert_lines; @@ -561,7 +561,7 @@ public: */ void UpdateStatistics(bool initialize) { - uint excluded_companies = _legend_excluded_companies; + CompanyMask excluded_companies = _legend_excluded_companies; /* Exclude the companies which aren't valid */ for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) { @@ -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 fcdab77b03..6fd8d77106 100644 --- a/src/ground_vehicle.cpp +++ b/src/ground_vehicle.cpp @@ -58,8 +58,8 @@ void GroundVehicle::PowerChanged() this->gcache.cached_air_drag = air_drag + 3 * air_drag * number_of_parts / 20; - max_te *= 10000; // Tractive effort in (tonnes * 1000 * 10 =) N. - max_te /= 256; // Tractive effort is a [0-255] coefficient. + 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. */ if (total_power == 0) this->vehstatus |= VS_STOPPED; 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 81fb1202e4..aef934ccf5 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -55,6 +55,7 @@ static const NWidgetPart _nested_group_widgets[] = { SetFill(1, 0), SetResize(0, 1), SetScrollbar(WID_GL_LIST_GROUP_SCROLLBAR), NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_GL_LIST_GROUP_SCROLLBAR), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_GL_INFO), SetFill(1, 0), EndContainer(), NWidget(NWID_HORIZONTAL), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_GL_CREATE_GROUP), SetFill(0, 1), SetDataTip(SPR_GROUP_CREATE_TRAIN, STR_GROUP_CREATE_TOOLTIP), @@ -371,6 +372,9 @@ public: max_icon_height = max(max_icon_height, GetSpriteSize(this->GetWidget(WID_GL_DELETE_GROUP)->widget_data).height); max_icon_height = max(max_icon_height, GetSpriteSize(this->GetWidget(WID_GL_REPLACE_PROTECTION)->widget_data).height); + /* ... minus the height of the group info ... */ + max_icon_height += (FONT_HEIGHT_NORMAL * 3) + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + /* Get a multiple of tiny_step_height of that amount */ size->height = Ceil(size->height - max_icon_height, tiny_step_height); break; @@ -403,6 +407,11 @@ public: *size = maxdim(*size, d); break; } + + case WID_GL_INFO: { + size->height = (FONT_HEIGHT_NORMAL * 3) + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + break; + } } } @@ -527,6 +536,44 @@ public: DrawGroupInfo(r.top + WD_FRAMERECT_TOP, r.left, r.right, DEFAULT_GROUP); break; + case WID_GL_INFO: { + Money this_year = 0; + Money last_year = 0; + uint32 occupancy = 0; + uint32 vehicle_count = this->vehicles.Length(); + + for (uint i = 0; i < vehicle_count; i++) { + const Vehicle *v = this->vehicles[i]; + assert(v->owner == this->owner); + + this_year += v->GetDisplayProfitThisYear(); + last_year += v->GetDisplayProfitLastYear(); + occupancy += v->trip_occupancy; + } + + const int left = r.left + WD_FRAMERECT_LEFT + 8; + const int right = r.right - WD_FRAMERECT_RIGHT - 8; + + int y = r.top + WD_FRAMERECT_TOP; + DrawString(left, right, y, STR_GROUP_PROFIT_THIS_YEAR, TC_BLACK); + SetDParam(0, this_year); + DrawString(left, right, y, STR_JUST_CURRENCY_LONG, TC_BLACK, SA_RIGHT); + + y += FONT_HEIGHT_NORMAL; + DrawString(left, right, y, STR_GROUP_PROFIT_LAST_YEAR, TC_BLACK); + SetDParam(0, last_year); + DrawString(left, right, y, STR_JUST_CURRENCY_LONG, TC_BLACK, SA_RIGHT); + + y += FONT_HEIGHT_NORMAL; + DrawString(left, right, y, STR_GROUP_OCCUPANCY, TC_BLACK); + if (vehicle_count > 0) { + SetDParam(0, occupancy / vehicle_count); + DrawString(left, right, y, STR_GROUP_OCCUPANCY_VALUE, TC_BLACK, SA_RIGHT); + } + + break; + } + case WID_GL_LIST_GROUP: { int y1 = r.top + WD_FRAMERECT_TOP; int max = min(this->group_sb->GetPosition() + this->group_sb->GetCapacity(), this->groups.Length()); @@ -627,8 +674,8 @@ public: this->vehicle_sel = v->index; - int image = v->GetImage(_current_text_dir == TD_RTL ? DIR_E : DIR_W, EIT_IN_LIST); - SetObjectToPlaceWnd(image, GetVehiclePalette(v), HT_DRAG, this); + SetObjectToPlaceWnd(SPR_CURSOR_MOUSE, PAL_NONE, HT_DRAG, this); + SetMouseCursorVehicle(v, EIT_IN_LIST); _cursor.vehchain = true; this->SetDirty(); @@ -930,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) @@ -948,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 ec31257287..17bdbbf610 100644 --- a/src/heightmap.cpp +++ b/src/heightmap.cpp @@ -102,7 +102,7 @@ static void ReadHeightmapPNGImageData(byte *map, png_structp png_ptr, png_infop * If map == NULL only the size of the PNG is read, otherwise a map * with grayscale pixels is allocated and assigned to *map. */ -static bool ReadHeightmapPNG(char *filename, uint *x, uint *y, byte **map) +static bool ReadHeightmapPNG(const char *filename, uint *x, uint *y, byte **map) { FILE *fp; png_structp png_ptr = NULL; @@ -232,7 +232,7 @@ static void ReadHeightmapBMPImageData(byte *map, BmpInfo *info, BmpData *data) * If map == NULL only the size of the BMP is read, otherwise a map * with grayscale pixels is allocated and assigned to *map. */ -static bool ReadHeightmapBMP(char *filename, uint *x, uint *y, byte **map) +static bool ReadHeightmapBMP(const char *filename, uint *x, uint *y, byte **map) { FILE *f; BmpInfo info; @@ -444,45 +444,56 @@ void FixSlopes() } /** - * Reads the heightmap with the correct file reader + * 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[in,out] map If not \c NULL, destination to store the loaded block of image data. + * @return Whether loading was successful. */ -static bool ReadHeightMap(char *filename, uint *x, uint *y, byte **map) +static bool ReadHeightMap(DetailedFileType dft, const char *filename, uint *x, uint *y, byte **map) { - switch (_file_to_saveload.mode) { - default: NOT_REACHED(); + switch (dft) { + default: + NOT_REACHED(); + #ifdef WITH_PNG - case SL_PNG: + case DFT_HEIGHTMAP_PNG: return ReadHeightmapPNG(filename, x, y, map); #endif /* WITH_PNG */ - case SL_BMP: + + case DFT_HEIGHTMAP_BMP: return ReadHeightmapBMP(filename, x, y, map); } } /** * Get the dimensions of a heightmap. + * @param dft Type of image file. * @param filename to query * @param x dimension x * @param y dimension y * @return Returns false if loading of the image failed. */ -bool GetHeightmapDimensions(char *filename, uint *x, uint *y) +bool GetHeightmapDimensions(DetailedFileType dft, const char *filename, uint *x, uint *y) { - return ReadHeightMap(filename, x, y, NULL); + return ReadHeightMap(dft, filename, x, y, NULL); } /** * Load a heightmap from file and change the map in his current dimensions * to a landscape representing the heightmap. * It converts pixels to height. The brighter, the higher. + * @param dft Type of image file. * @param filename of the heightmap file to be imported */ -void LoadHeightmap(char *filename) +void LoadHeightmap(DetailedFileType dft, const char *filename) { uint x, y; byte *map = NULL; - if (!ReadHeightMap(filename, &x, &y, &map)) { + if (!ReadHeightMap(dft, filename, &x, &y, &map)) { free(map); return; } diff --git a/src/heightmap.h b/src/heightmap.h index 08ae200ece..67349df483 100644 --- a/src/heightmap.h +++ b/src/heightmap.h @@ -12,6 +12,8 @@ #ifndef HEIGHTMAP_H #define HEIGHTMAP_H +#include "fileio_type.h" + /** * Order of these enums has to be the same as in lang/english.txt * Otherwise you will get inconsistent behaviour. @@ -21,8 +23,8 @@ enum HeightmapRotation { HM_CLOCKWISE, ///< Rotate the map clockwise 45 degrees }; -bool GetHeightmapDimensions(char *filename, uint *x, uint *y); -void LoadHeightmap(char *filename); +bool GetHeightmapDimensions(DetailedFileType dft, const char *filename, uint *x, uint *y); +void LoadHeightmap(DetailedFileType dft, const char *filename); void FlatEmptyWorld(byte tile_height); void FixSlopes(); diff --git a/src/hotkeys.cpp b/src/hotkeys.cpp index 84288a0e81..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}, @@ -311,7 +312,7 @@ int HotkeyList::CheckMatch(uint16 keycode, bool global_only) const static void SaveLoadHotkeys(bool save) { IniFile *ini = new IniFile(); - ini->LoadFromDisk(_hotkeys_file, BASE_DIR); + ini->LoadFromDisk(_hotkeys_file, NO_DIRECTORY); for (HotkeyList **list = _hotkey_lists->Begin(); list != _hotkey_lists->End(); ++list) { if (save) { 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 5e5d046880..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,10 +65,9 @@ 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 - byte random_triggers; ///< Triggers for the random uint16 random; ///< Random value used for randomisation of all kinds of things PersistentStorage *psa; ///< Persistent storage for NewGRF industries. @@ -86,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 5971964fd7..d918ef16bd 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -390,39 +390,53 @@ static Foundation GetFoundation_Industry(TileIndex tile, Slope tileh) return FlatteningFoundation(tileh); } -static void AddAcceptedCargo_Industry(TileIndex tile, CargoArray &acceptance, uint32 *always_accepted) +static void AddAcceptedCargo_Industry(TileIndex tile, CargoArray &acceptance, CargoTypes *always_accepted) { 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]; @@ -491,7 +505,12 @@ static CommandCost ClearTile_Industry(TileIndex tile, DoCommandFlag flags) return CommandCost(EXPENSES_CONSTRUCTION, indspec->GetRemovalCost()); } -static void TransportIndustryGoods(TileIndex tile) +/** + * Move produced cargo from industry to nearby stations. + * @param tile Industry tile + * @return true if any cargo was moved. + */ +static bool TransportIndustryGoods(TileIndex tile) { Industry *i = Industry::GetByTile(tile); const IndustrySpec *indspec = GetIndustrySpec(i->type); @@ -516,16 +535,7 @@ static void TransportIndustryGoods(TileIndex tile) } } - if (moved_cargo && !StartStopIndustryTileAnimation(i, IAT_INDUSTRY_DISTRIBUTES_CARGO)) { - uint newgfx = GetIndustryTileSpec(GetIndustryGfx(tile))->anim_production; - - if (newgfx != INDUSTRYTILE_NOANIM) { - ResetIndustryConstructionStage(tile); - SetIndustryCompleted(tile); - SetIndustryGfx(tile, newgfx); - MarkTileDirtyByTile(tile); - } - } + return moved_cargo; } @@ -810,7 +820,17 @@ static void TileLoop_Industry(TileIndex tile) if (_game_mode == GM_EDITOR) return; - TransportIndustryGoods(tile); + if (TransportIndustryGoods(tile) && !StartStopIndustryTileAnimation(Industry::GetByTile(tile), IAT_INDUSTRY_DISTRIBUTES_CARGO)) { + uint newgfx = GetIndustryTileSpec(GetIndustryGfx(tile))->anim_production; + + if (newgfx != INDUSTRYTILE_NOANIM) { + ResetIndustryConstructionStage(tile); + SetIndustryCompleted(tile); + SetIndustryGfx(tile, newgfx); + MarkTileDirtyByTile(tile); + return; + } + } if (StartStopIndustryTileAnimation(tile, IAT_TILELOOP)) return; @@ -1112,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; @@ -1317,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 @@ -1359,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) @@ -1383,7 +1404,7 @@ static CommandCost CheckIfIndustryTilesAreFree(TileIndex tile, const IndustryTil } if (gfx == GFX_WATERTILE_SPECIALCHECK) { - if (!IsTileType(cur_tile, MP_WATER) || + if (!IsWaterTile(cur_tile) || !IsTileFlat(cur_tile)) { return_cmd_error(STR_ERROR_SITE_UNSUITABLE); } @@ -1642,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; @@ -1663,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; @@ -1706,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)) { @@ -1721,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; } } @@ -1787,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. @@ -1955,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) @@ -1980,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) @@ -2188,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 c160142249..98c9edda21 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -56,42 +56,87 @@ enum CargoSuffixType { CST_DIR, ///< Industry-directory window }; +/** Ways of displaying the cargo. */ +enum CargoSuffixDisplay { + CSD_CARGO, ///< Display the cargo without sub-type (cb37 result 401). + CSD_CARGO_AMOUNT, ///< Display the cargo and amount (if useful), but no sub-type (cb37 result 400 or fail). + CSD_CARGO_TEXT, ///< Display then cargo and supplied string (cb37 result 800-BFF). + CSD_CARGO_AMOUNT_TEXT, ///< Display then cargo, amount, and string (cb37 result 000-3FF). +}; + +/** Transfer storage of cargo suffix information. */ +struct CargoSuffix { + CargoSuffixDisplay display; ///< How to display the cargo and text. + char text[512]; ///< Cargo suffix text. +}; + 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 * @param indspec the industry spec * @param suffix is filled with the string to display - * @param suffix_last lastof(suffix) */ -static void GetCargoSuffix(uint cargo, CargoSuffixType cst, const Industry *ind, IndustryType ind_type, const IndustrySpec *indspec, char *suffix, const char *suffix_last) +static void GetCargoSuffix(uint cargo, CargoSuffixType cst, const Industry *ind, IndustryType ind_type, const IndustrySpec *indspec, CargoSuffix &suffix) { - suffix[0] = '\0'; + suffix.text[0] = '\0'; + suffix.display = CSD_CARGO_AMOUNT; + if (HasBit(indspec->callback_mask, CBM_IND_CARGO_SUFFIX)) { - uint16 callback = GetIndustryCallback(CBID_INDUSTRY_CARGO_SUFFIX, 0, (cst << 8) | cargo, const_cast(ind), ind_type, (cst != CST_FUND) ? ind->location.tile : INVALID_TILE); - if (callback == CALLBACK_FAILED || callback == 0x400) return; - if (callback > 0x400) { + TileIndex t = (cst != CST_FUND) ? ind->location.tile : INVALID_TILE; + uint16 callback = GetIndustryCallback(CBID_INDUSTRY_CARGO_SUFFIX, 0, (cst << 8) | cargo, const_cast(ind), ind_type, t); + if (callback == CALLBACK_FAILED) return; + + if (indspec->grf_prop.grffile->grf_version < 8) { + if (GB(callback, 0, 8) == 0xFF) return; + if (callback < 0x400) { + StartTextRefStackUsage(indspec->grf_prop.grffile, 6); + GetString(suffix.text, GetGRFStringID(indspec->grf_prop.grffile->grfid, 0xD000 + callback), lastof(suffix.text)); + StopTextRefStackUsage(); + suffix.display = CSD_CARGO_AMOUNT_TEXT; + return; + } ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_CARGO_SUFFIX, callback); - } else if (indspec->grf_prop.grffile->grf_version >= 8 || GB(callback, 0, 8) != 0xFF) { - StartTextRefStackUsage(indspec->grf_prop.grffile, 6); - GetString(suffix, GetGRFStringID(indspec->grf_prop.grffile->grfid, 0xD000 + callback), suffix_last); - StopTextRefStackUsage(); + return; + + } else { // GRF version 8 or higher. + if (callback == 0x400) return; + if (callback == 0x401) { + suffix.display = CSD_CARGO; + return; + } + if (callback < 0x400) { + StartTextRefStackUsage(indspec->grf_prop.grffile, 6); + GetString(suffix.text, GetGRFStringID(indspec->grf_prop.grffile->grfid, 0xD000 + callback), lastof(suffix.text)); + StopTextRefStackUsage(); + suffix.display = CSD_CARGO_AMOUNT_TEXT; + return; + } + if (callback >= 0x800 && callback < 0xC00) { + StartTextRefStackUsage(indspec->grf_prop.grffile, 6); + GetString(suffix.text, GetGRFStringID(indspec->grf_prop.grffile->grfid, 0xD000 - 0x800 + callback), lastof(suffix.text)); + StopTextRefStackUsage(); + suffix.display = CSD_CARGO_TEXT; + return; + } + ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_CARGO_SUFFIX, callback); + return; } } } +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 @@ -100,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], lastof(suffixes[j])); - } else { - suffixes[j][0] = '\0'; + + 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(); } } } @@ -313,8 +384,8 @@ public: const IndustrySpec *indsp = GetIndustrySpec(this->index[i]); - char cargo_suffix[3][512]; - 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); @@ -323,12 +394,12 @@ public: if (indsp->accepts_cargo[j] == CT_INVALID) continue; if (p > 0) str++; SetDParam(p++, CargoSpec::Get(indsp->accepts_cargo[j])->name); - SetDParamStr(p++, cargo_suffix[j]); + SetDParamStr(p++, cargo_suffix[j].text); } 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); @@ -337,7 +408,7 @@ public: if (indsp->produced_cargo[j] == CT_INVALID) continue; if (p > 0) str++; SetDParam(p++, CargoSpec::Get(indsp->produced_cargo[j])->name); - SetDParamStr(p++, cargo_suffix[j]); + SetDParamStr(p++, cargo_suffix[j].text); } d = maxdim(d, GetStringBoundingBox(str)); } @@ -432,8 +503,8 @@ public: } /* Draw the accepted cargoes, if any. Otherwise, will print "Nothing". */ - char cargo_suffix[3][512]; - 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); @@ -442,13 +513,13 @@ public: if (indsp->accepts_cargo[j] == CT_INVALID) continue; if (p > 0) str++; SetDParam(p++, CargoSpec::Get(indsp->accepts_cargo[j])->name); - SetDParamStr(p++, cargo_suffix[j]); + SetDParamStr(p++, cargo_suffix[j].text); } DrawString(left, right, y, str); 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); @@ -457,13 +528,12 @@ public: if (indsp->produced_cargo[j] == CT_INVALID) continue; if (p > 0) str++; SetDParam(p++, CargoSpec::Get(indsp->produced_cargo[j])->name); - SetDParamStr(p++, cargo_suffix[j]); + SetDParamStr(p++, cargo_suffix[j].text); } DrawString(left, right, y, str); 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) { @@ -639,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); } @@ -713,47 +790,53 @@ public: int y = top + WD_FRAMERECT_TOP; bool first = true; bool has_accept = false; - char cargo_suffix[3][512]; if (i->prod_level == PRODLEVEL_CLOSURE) { DrawString(left + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, y, STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE); y += 2 * FONT_HEIGHT_NORMAL; } - if (HasBit(ind->callback_mask, CBM_IND_PRODUCTION_CARGO_ARRIVAL) || HasBit(ind->callback_mask, CBM_IND_PRODUCTION_256_TICKS)) { - GetAllCargoSuffixes(0, CST_VIEW, i, i->type, ind, i->accepts_cargo, cargo_suffix); - for (byte j = 0; j < lengthof(i->accepts_cargo); j++) { - if (i->accepts_cargo[j] == CT_INVALID) continue; - has_accept = true; - if (first) { - DrawString(left + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, y, STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING); - y += FONT_HEIGHT_NORMAL; - first = false; - } - SetDParam(0, i->accepts_cargo[j]); - SetDParam(1, i->incoming_cargo_waiting[j]); - SetDParamStr(2, cargo_suffix[j]); - DrawString(left + WD_FRAMETEXT_LEFT, right - WD_FRAMERECT_RIGHT, y, STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO); + 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. + for (byte j = 0; j < lengthof(i->accepts_cargo); j++) { + if (i->accepts_cargo[j] == CT_INVALID) continue; + has_accept = true; + if (first) { + DrawString(left + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, y, STR_INDUSTRY_VIEW_REQUIRES); y += FONT_HEIGHT_NORMAL; + first = false; } - } else { - GetAllCargoSuffixes(0, CST_VIEW, i, i->type, ind, i->accepts_cargo, cargo_suffix); - StringID str = STR_INDUSTRY_VIEW_REQUIRES_CARGO; - byte p = 0; - for (byte j = 0; j < lengthof(i->accepts_cargo); j++) { - if (i->accepts_cargo[j] == CT_INVALID) continue; - has_accept = true; - if (p > 0) str++; - SetDParam(p++, CargoSpec::Get(i->accepts_cargo[j])->name); - SetDParamStr(p++, cargo_suffix[j]); - } - if (has_accept) { - DrawString(left + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, y, str); - y += FONT_HEIGHT_NORMAL; + SetDParam(0, CargoSpec::Get(i->accepts_cargo[j])->name); + SetDParam(1, i->accepts_cargo[j]); + SetDParam(2, i->incoming_cargo_waiting[j]); + SetDParamStr(3, ""); + StringID str = STR_NULL; + switch (cargo_suffix[j].display) { + case CSD_CARGO_AMOUNT_TEXT: + SetDParamStr(3, cargo_suffix[j].text); + FALLTHROUGH; + case CSD_CARGO_AMOUNT: + str = stockpiling ? STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT : STR_INDUSTRY_VIEW_ACCEPT_CARGO; + break; + + case CSD_CARGO_TEXT: + SetDParamStr(3, cargo_suffix[j].text); + FALLTHROUGH; + case CSD_CARGO: + str = STR_INDUSTRY_VIEW_ACCEPT_CARGO; + break; + + default: + NOT_REACHED(); } + DrawString(left_side, right - WD_FRAMERECT_RIGHT, y, str); + 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; @@ -767,7 +850,7 @@ public: SetDParam(0, i->produced_cargo[j]); SetDParam(1, i->last_month_production[j]); - SetDParamStr(2, cargo_suffix[j]); + SetDParamStr(2, cargo_suffix[j].text); SetDParam(3, ToPercent8(i->last_month_pct_transported[j])); uint x = left + WD_FRAMETEXT_LEFT + (this->editable == EA_RATE ? SETTING_BUTTON_WIDTH + 10 : 0); DrawString(x, right - WD_FRAMERECT_RIGHT, y, STR_INDUSTRY_VIEW_TRANSPORTED); @@ -1204,15 +1287,15 @@ protected: /* Industry name */ SetDParam(p++, i->index); - static char cargo_suffix[lengthof(i->produced_cargo)][512]; - GetAllCargoSuffixes(3, CST_DIR, i, i->type, indsp, i->produced_cargo, cargo_suffix); + static CargoSuffix cargo_suffix[lengthof(i->produced_cargo)]; + 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++) { if (i->produced_cargo[j] == CT_INVALID) continue; SetDParam(p++, i->produced_cargo[j]); SetDParam(p++, i->last_month_production[j]); - SetDParamStr(p++, cargo_suffix[j]); + SetDParamStr(p++, cargo_suffix[j].text); } /* Transported productions */ @@ -1464,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 { @@ -1472,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; @@ -1480,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 { @@ -1529,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) @@ -1633,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 { @@ -1698,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; @@ -1763,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; } @@ -1885,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. @@ -1901,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. @@ -1928,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 { @@ -1985,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 { @@ -2074,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; @@ -2096,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: @@ -2468,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); @@ -2487,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; } } @@ -2519,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; } @@ -2536,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/intro_gui.cpp b/src/intro_gui.cpp index de8b379392..3659b033cf 100644 --- a/src/intro_gui.cpp +++ b/src/intro_gui.cpp @@ -60,13 +60,21 @@ struct SelectGameWindow : public Window { virtual void OnInit() { - bool missing = _current_language->missing >= _settings_client.gui.missing_strings_threshold && !IsReleasedVersion(); - this->GetWidget(WID_SGI_TRANSLATION_SELECTION)->SetDisplayedPlane(missing ? 0 : SZSP_NONE); + bool missing_sprites = _missing_extra_graphics > 0 && !IsReleasedVersion(); + this->GetWidget(WID_SGI_BASESET_SELECTION)->SetDisplayedPlane(missing_sprites ? 0 : SZSP_NONE); + + bool missing_lang = _current_language->missing >= _settings_client.gui.missing_strings_threshold && !IsReleasedVersion(); + this->GetWidget(WID_SGI_TRANSLATION_SELECTION)->SetDisplayedPlane(missing_lang ? 0 : SZSP_NONE); } virtual void DrawWidget(const Rect &r, int widget) const { switch (widget) { + case WID_SGI_BASESET: + SetDParam(0, _missing_extra_graphics); + DrawStringMultiLine(r.left, r.right, r.top, r.bottom, STR_INTRO_BASESET, TC_FROMSTRING, SA_CENTER); + break; + case WID_SGI_TRANSLATION: SetDParam(0, _current_language->missing); DrawStringMultiLine(r.left, r.right, r.top, r.bottom, STR_INTRO_TRANSLATION, TC_FROMSTRING, SA_CENTER); @@ -76,20 +84,29 @@ struct SelectGameWindow : public Window { virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) { + StringID str = 0; switch (widget) { - case WID_SGI_TRANSLATION: { - SetDParam(0, _current_language->missing); - int height = GetStringHeight(STR_INTRO_TRANSLATION, size->width); - if (height > 3 * FONT_HEIGHT_NORMAL) { - /* Don't let the window become too high. */ - Dimension textdim = GetStringBoundingBox(STR_INTRO_TRANSLATION); - textdim.height *= 3; - textdim.width -= textdim.width / 2; - *size = maxdim(*size, textdim); - } else { - size->height = height + padding.height; - } + case WID_SGI_BASESET: + SetDParam(0, _missing_extra_graphics); + str = STR_INTRO_BASESET; break; + + case WID_SGI_TRANSLATION: + SetDParam(0, _current_language->missing); + str = STR_INTRO_TRANSLATION; + break; + } + + if (str != 0) { + int height = GetStringHeight(str, size->width); + if (height > 3 * FONT_HEIGHT_NORMAL) { + /* Don't let the window become too high. */ + Dimension textdim = GetStringBoundingBox(str); + textdim.height *= 3; + textdim.width -= textdim.width / 2; + *size = maxdim(*size, textdim); + } else { + size->height = height + padding.height; } } } @@ -111,9 +128,9 @@ struct SelectGameWindow : public Window { } break; - case WID_SGI_LOAD_GAME: ShowSaveLoadDialog(SLD_LOAD_GAME); break; - case WID_SGI_PLAY_SCENARIO: ShowSaveLoadDialog(SLD_LOAD_SCENARIO); break; - case WID_SGI_PLAY_HEIGHTMAP: ShowSaveLoadDialog(SLD_LOAD_HEIGHTMAP); break; + case WID_SGI_LOAD_GAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break; + case WID_SGI_PLAY_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_LOAD); break; + case WID_SGI_PLAY_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP,SLO_LOAD); break; case WID_SGI_EDIT_SCENARIO: StartScenarioEditor(); break; case WID_SGI_PLAY_NETWORK: @@ -199,6 +216,11 @@ static const NWidgetPart _nested_select_game_widgets[] = { EndContainer(), NWidget(NWID_SPACER), SetMinimalSize(0, 7), + NWidget(NWID_SELECTION, INVALID_COLOUR, WID_SGI_BASESET_SELECTION), + NWidget(NWID_VERTICAL), + NWidget(WWT_EMPTY, COLOUR_ORANGE, WID_SGI_BASESET), SetMinimalSize(316, 12), SetFill(1, 0), SetPadding(0, 10, 7, 10), + EndContainer(), + EndContainer(), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_SGI_TRANSLATION_SELECTION), NWidget(NWID_VERTICAL), NWidget(WWT_EMPTY, COLOUR_ORANGE, WID_SGI_TRANSLATION), SetMinimalSize(316, 12), SetFill(1, 0), SetPadding(0, 10, 7, 10), diff --git a/src/landscape.cpp b/src/landscape.cpp index d1c73fd42b..18f27807d7 100644 --- a/src/landscape.cpp +++ b/src/landscape.cpp @@ -31,6 +31,8 @@ #include "object_base.h" #include "company_func.h" #include "pathfinder/npf/aystar.h" +#include "saveload/saveload.h" +#include "framerate_type.h" #include #include @@ -719,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. */ @@ -1079,8 +1083,7 @@ static uint River_Hash(uint tile, uint dir) */ static void BuildRiver(TileIndex begin, TileIndex end) { - AyStar finder; - MemSetT(&finder, 0); + AyStar finder = {}; finder.CalculateG = River_CalculateG; finder.CalculateH = River_CalculateH; finder.GetNeighbours = River_GetNeighbours; @@ -1221,7 +1224,7 @@ void GenerateLandscape(byte mode) if (mode == GWM_HEIGHTMAP) { SetGeneratingWorldProgress(GWP_LANDSCAPE, steps + GLS_HEIGHTMAP); - LoadHeightmap(_file_to_saveload.name); + LoadHeightmap(_file_to_saveload.detail_ftype, _file_to_saveload.name); IncreaseGeneratingWorldProgress(GWP_LANDSCAPE); } else if (_settings_game.game_creation.land_generator == LG_TERRAGENESIS) { SetGeneratingWorldProgress(GWP_LANDSCAPE, steps + GLS_TERRAGENESIS); @@ -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 68b3682279..d1e96d41d7 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -670,10 +670,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Kies 'Be STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Skakel musiek lys skommel aan/af STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Vertoon musiek snit keuse venster -STR_ERROR_NO_SONGS :{WHITE}'n Musiek stel is gekies wat geen liedere bevat nie. Geen liedere sal gespeel word nie - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Musiek Program Keuse STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Liedjie Indeks STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Program - '{STRING}' @@ -1338,8 +1335,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Kleur van die t STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Groen STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Donkergroen STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violet -STR_CONFIG_SETTING_REVERSE_SCROLLING :Agteruit rol rigting: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :As dit geaktiveer is, skuif die muis die kaart, andersins skuif die muis die kamera. STR_CONFIG_SETTING_SMOOTH_SCROLLING :Maak kykpoort beweegings glad: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Beheer hoe die hoofvertoonvenster skuif na 'n spesifieke posisie - as dit geaktiveer is, dan skuif die venster glad na die posisie toe, andersins skuif die venster direk na die posisie toe. STR_CONFIG_SETTING_MEASURE_TOOLTIP :Toon 'n meting wanneer jy verskeie bou-gereedskap gebruik: {STRING} @@ -1371,8 +1366,6 @@ 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 :Af -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Links-klik vir skermrol: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Maak dit moontlik om die kaart te skuif deur met die die linker-muisknoppie te sleep. Hier opsie werk baie goed vir toestelle met raakskerms. STR_CONFIG_SETTING_AUTOSAVE :Outostoor: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Tyd tussen outomatiese spelstore @@ -2602,29 +2595,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Velde STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Sneeu-bedekte land STR_LAI_CLEAR_DESCRIPTION_DESERT :Woestyn -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} spoor -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} spoor met blok seine -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} spoor met voor-seine -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} spoor met uitgang-seine -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} spoor met kombinasie-seine -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} spoor met roete seine -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} spoor met een-rigting pad seine -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} spoor met blok en voor-seine -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} spoor met blok en uitgang-seine -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} spoor met blok en kombinasie-seine -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} spoor met blok en pad seine -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} spoor met blok en een-rigting pad seine -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} spoor met voor en uitgang seine -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} spoor met voor en kombinasie-seine -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} spoor met voor en pad-seine -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} spoor met voor en een-rigting pad seine -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} spoor met uitgang en kombinasie-seine -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} spoor met uitgang en pad-seine -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} spoor met uitgang en een-rigting pad seine -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} spoor met kombinasie en pad seine -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} spoor met kombinasie en eenrigting-pad seine -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} spoor met pad en een-rigting pad seine -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} trein diensstasie +STR_LAI_RAIL_DESCRIPTION_TRACK :Spoorweg spoor +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Spoorweg spoor met blok seine +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Spoorweg spoor met voor-seine +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Spoorweg spoor met uitgang-seine +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Spoorweg spoor met kombinasie-seine +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Spoorweg spoor met roete seine +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Spoorweg spoor met een-rigting pad seine +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Spoorweg spoor met blok en voor-seine +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Spoorweg spoor met blok en uitgang-seine +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Spoorweg spoor met blok en kombinasie-seine +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Spoorweg spoor met blok en pad seine +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Spoorweg spoor met blok en een-rigting pad seine +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Spoorweg spoor met voor en uitgang seine +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Spoorweg spoor met voor en kombinasie-seine +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Spoorweg spoor met voor en pad-seine +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Spoorweg spoor met voor en een-rigting pad seine +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Spoorweg spoor met uitgang en kombinasie-seine +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Spoorweg spoor met uitgang en pad-seine +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Spoorweg spoor met uitgang en een-rigting pad seine +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Spoorweg spoor met kombinasie en pad seine +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Spoorweg spoor met kombinasie en eenrigting-pad seine +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Spoorweg spoor met pad en een-rigting pad seine +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Spoorweg trein diensstasie STR_LAI_ROAD_DESCRIPTION_ROAD :Pad STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Pad met straatligte @@ -2688,7 +2681,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Maatskappy-besi STR_ABOUT_OPENTTD :{WHITE}Oor OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Oorspronklike kopiereg {COPYRIGHT} 1995 Chris Sawyer, Alle regte voorbehou STR_ABOUT_VERSION :{BLACK}OpenTTD uitgawe {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 Die OpenTTD span +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 @@ -2907,8 +2907,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Poging on 'n on STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} bevat 'n korrupte prent. Korrupte prente sal as 'n rooi vraagteken gewys word (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Bevat veelvoudige Aksie 8 inskrywings (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Lees verby die einde van die pseudo-sprite (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :WHITE}Die huidige basis-grafikastel ontbreek sommige sprites.{}Opdateer die basis-grafikastel. -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Die huidige basis-grafikastel ontbreek sommige sprites.{}Opdateer die basis-grafikastel.{}Aangesien jy 'n {YELLOW}ontwikkelingsweergawe van OpenTTD{WHITE} het, mag jy dalk 'n {YELLOW}ontwikkelingsweergawe{WHITE} van die basis-grafikastel benodig{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Aangevraagde GRF hulpbronne is nie beskikbaar nie (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} was gedeaktiveer deur {2:STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Ongeldige/onbekende sprite uitleg formaat (sprite {3:NUM}) @@ -2983,8 +2981,6 @@ STR_TOWN_POPULATION :{BLACK}Wêreldb STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (City) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Bevolking: {ORANGE}{COMMA}{BLACK} Huise: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Passasiers verlede maand: {ORANGE}{COMMA}{BLACK} maks: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Pos verlede maand: {ORANGE}{COMMA}{BLACK} maks: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Vrag nodig om dorp te laat groei: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} vereis STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} vereis in winter @@ -3115,8 +3111,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Aanvaar STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Wys lys van aanvaarde vrag STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Aanvaar: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Die stasie het eksklusiewe vervoer regte vir die dorp -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} het eksklusiewe vervoer regte in die dorp gekoop. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Die stasie het eksklusiewe vervoer regte vir die dorp +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} het eksklusiewe vervoer regte in die dorp gekoop. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Graderings STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Toon stasie graderings @@ -3295,9 +3291,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Vereis: STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Vereis: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Vrag wag om geprosesseer te word: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produseer: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Produseer: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3364,6 +3359,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Verwyder alle v STR_GROUP_RENAME_CAPTION :{BLACK}Hernoem 'n groep + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nuwe treine STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nuwe Elektries Spoor Voertuie @@ -3528,10 +3524,7 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :maglev lokomoti STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Koste: {CURRENCY_LONG} Massa: {WEIGHT_SHORT}{}Spoed: {VELOCITY} Krag: {POWER}{}Loopkoste: {CURRENCY_LONG}/jr{}Kapasitiet: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Koste: {CURRENCY_LONG} Gewig: {WEIGHT_SHORT}{}Spoed: {VELOCITY} Krag: {POWER} Maks. Treg Krag: {6:FORCE}{}Lopende Koste: {4:CURRENCY_LONG}/jaar{}Kapasitiet: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Koste: {CURRENCY_LONG} Maks. Spoed: {VELOCITY}{}Kapasiteit: {CARGO_LONG}, {CARGO_LONG}{}Lopende Koste: {CURRENCY_LONG}/jaar -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Koste: {CURRENCY_LONG} Maks. Spoed: {VELOCITY}{}Kapasiteit: {CARGO_LONG}{}Lopende Koste: {CURRENCY_LONG}/jaar -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Koste: {CURRENCY_LONG} Max. Spoed: {VELOCITY} Afstand: {COMMA} teëls{}Kapasiteit: {CARGO_LONG}, {CARGO_LONG}{}Hardloop Koste: {CURRENCY_LONG}/jaar -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Koste: {CURRENCY_LONG} Max. Spoed: {VELOCITY} Afstand: {COMMA} teels{}Kapasiteit: {CARGO_LONG}{}Hardloop Koste: {CURRENCY_LONG}/jaar +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Koste: {CURRENCY_LONG} Maks. Spoed: {VELOCITY}{}Kapasiteit: {CARGO_LONG}{}Lopende Koste: {CURRENCY_LONG}/jaar # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Vervang {STRING} - {STRING} @@ -3558,7 +3551,6 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} waneer STR_REPLACE_VEHICLES_STOP :{BLACK}Staak vervanging STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Druk om die vervanging van die linker gekose enjin tipe te stop -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Vervang: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Skakel tussen enjin en wa vervang vensters STR_REPLACE_ENGINES :Enjin STR_REPLACE_WAGONS :Waens @@ -3654,7 +3646,6 @@ STR_VEHICLE_INFO_AGE :{COMMA} ja{P ar STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} ja{P ar re} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Maks. spoed: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Max. spoed: {LTBLUE}{VELOCITY} {BLACK}Afstand: {LTBLUE}{COMMA} teëls STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Gewig: {LTBLUE}{WEIGHT_SHORT} {BLACK}Krag: {LTBLUE}{POWER}{BLACK} Maks. spoed: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Massa: {LTBLUE}{WEIGHT_SHORT} {BLACK}Krag: {LTBLUE}{POWER}{BLACK} Maks. spoed: {LTBLUE}{VELOCITY} {BLACK}Maks. T.E.: {LTBLUE}{FORCE} @@ -4213,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 ae35c69c97..8c4c06b55b 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -644,10 +644,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}اختي STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}تشغيل / ايقاف العشوائي STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}اظهار اطار اختيار الموسيقى -STR_ERROR_NO_SONGS :{WHITE}لا تحتوى قاعده الموسيقى المُختاره على اى اغانى. لن تُعزَف اى اغانى - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}برنامج اختيار الموسيقى STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}قائمة المعزوفات STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}برنامج - '{STRING}' @@ -942,8 +939,8 @@ STR_GAME_OPTIONS_RESOLUTION :{BLACK}دقة STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}اختر دقة الشاشة STR_GAME_OPTIONS_RESOLUTION_OTHER :اخرى -STR_GAME_OPTIONS_GUI_ZOOM_FRAME :حجم اللوحة -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :حدد العنصر المطلوب +STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}حجم اللوحة +STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}حدد العنصر المطلوب STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :تقريب عادي STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :تقريب ×2 @@ -1051,9 +1048,9 @@ STR_CITY_APPROVAL_HOSTILE :معاد STR_WARNING_NO_SUITABLE_AI :{WHITE}لايوجد ذكاء اصطناعي متاح ...{}تستطيع تجميل العديد من الذكاء الاصطناعي عن طريق اللانترنت # Settings tree window -STR_CONFIG_SETTING_TREE_CAPTION :الإعدادات -STR_CONFIG_SETTING_EXPAND_ALL :مدد الكل -STR_CONFIG_SETTING_COLLAPSE_ALL :إسحب الكل +STR_CONFIG_SETTING_TREE_CAPTION :{WHITE}الإعدادات +STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}مدد الكل +STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}إسحب الكل STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK} فئة: STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}نوع: @@ -1177,7 +1174,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR :لون الار 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_REVERSE_SCROLLING :عكس تحريك الشاشة : {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING :تحريك سلس في نوافذ المشاهدة: {STRING} STR_CONFIG_SETTING_MEASURE_TOOLTIP :عرض المقاسات عند استخدام ادوات البناء المختلفة: {STRING} STR_CONFIG_SETTING_LIVERIES :عرض لون و شعار الشركة: {STRING} @@ -1196,7 +1192,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :الأوامر STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :للتحكم STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :عدم استخدام -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :تصفح بالزر الايسر: {STRING} STR_CONFIG_SETTING_AUTOSAVE :حفظ تلقائي : {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :اختر الوقت بين كل عملية حفظ اتوماتيكية @@ -1408,7 +1403,7 @@ STR_INTRO_MULTIPLAYER :{BLACK}لعب STR_INTRO_GAME_OPTIONS :{BLACK}إعدادات اللعبه STR_INTRO_HIGHSCORE :{BLACK}قائمه المتفوقين -STR_INTRO_CONFIG_SETTINGS_TREE :الاعدادات +STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}الاعدادات STR_INTRO_NEWGRF_SETTINGS :{BLACK} اعدادات NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK} إبحث عن المحتوى عبر الشبكه العنكبوتيه STR_INTRO_SCRIPT_SETTINGS :{BLACK}إعدادات الذكاء الصناعى @@ -1427,7 +1422,7 @@ STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}اختي STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}اختيار نمط الألعاب STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}عرض خيارات اللعبة -STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :إعدادات العرض +STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}إعدادات العرض STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}عرض إعدادات اﻹضافات STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK} ابحث عن محتوى جديد او تحديث STR_INTRO_TOOLTIP_QUIT :{BLACK}اغلاق'OpenTTD' @@ -2234,29 +2229,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :حقول STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :ارض ثلجية STR_LAI_CLEAR_DESCRIPTION_DESERT :صحراء -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} مسار -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} مسار مع اشارة اغلاق -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} مسار مع اشارة مبتدئة -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} سكة حديد مع اشارة خروج -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} سكة حديد مع اشارة مزدوجة -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} سكة حديد مع اشارة طريق -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} سكة حديد مع اشارة اتجاة واحد -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} سكة حديد مع اشارة توقف و اشارة مبتدئة -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} سكة حديد مع اشارة توقف و خروج -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} سكة حديد مع اشارة توقف و مزدوجة -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} سكة حديد مع اشارة اغلاق و طريق -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} سكة حديد مع اشارة اغلاق و طريق باتجاة واحد -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} سكة حديد مع اشارة مبدئية و اشارة خروج -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} سكة حديد مع اشارة مبدئية و اشارة مزدوجة -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} سكة حديد مع اشارة مبدئية و طريق -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} سكة حديد مع اشارة مبدئية و اتجاة و احد -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} سكة حديد مع اشارة خروج و مزدوجة -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} سكة حديد مع اشارة خروج و طريق -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} سكة حديد مع اشارة خروج و اتجاة واحد -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} سكة حديد مع اشارة مزدوجة و طريق -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} سكة حديد مع اشارة مزدوجة و طريق باتجاه واحد -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} سكة حديد مع اشارة طريق و اتجاة و احد -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} مستودع صيانة قطارات +STR_LAI_RAIL_DESCRIPTION_TRACK :سكة حديد مسار +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :سكة حديد مسار مع اشارة اغلاق +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :سكة حديد مسار مع اشارة مبتدئة +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :سكة حديد سكة حديد مع اشارة خروج +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :سكة حديد سكة حديد مع اشارة مزدوجة +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :سكة حديد سكة حديد مع اشارة طريق +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :سكة حديد سكة حديد مع اشارة اتجاة واحد +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :سكة حديد سكة حديد مع اشارة توقف و اشارة مبتدئة +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :سكة حديد سكة حديد مع اشارة توقف و خروج +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :سكة حديد سكة حديد مع اشارة توقف و مزدوجة +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :سكة حديد سكة حديد مع اشارة اغلاق و طريق +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :سكة حديد سكة حديد مع اشارة اغلاق و طريق باتجاة واحد +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :سكة حديد سكة حديد مع اشارة مبدئية و اشارة خروج +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :سكة حديد سكة حديد مع اشارة مبدئية و اشارة مزدوجة +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :سكة حديد سكة حديد مع اشارة مبدئية و طريق +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :سكة حديد سكة حديد مع اشارة مبدئية و اتجاة و احد +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :سكة حديد سكة حديد مع اشارة خروج و مزدوجة +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :سكة حديد سكة حديد مع اشارة خروج و طريق +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :سكة حديد سكة حديد مع اشارة خروج و اتجاة واحد +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :سكة حديد سكة حديد مع اشارة مزدوجة و طريق +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :سكة حديد سكة حديد مع اشارة مزدوجة و طريق باتجاه واحد +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :سكة حديد سكة حديد مع اشارة طريق و اتجاة و احد +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :سكة حديد مستودع صيانة قطارات STR_LAI_ROAD_DESCRIPTION_ROAD :طريق STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :طريق مضاء @@ -2320,7 +2315,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :ارض مملو STR_ABOUT_OPENTTD :{WHITE}حول النسخة المفتوحة STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}الحقوق الاصلية {COPYRIGHT} كريس سوير 1995 , جميع الحقوق محفوظة STR_ABOUT_VERSION :{BLACK}النسخة المفتوحة رقم {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}النسخة المفتوحة {COPYRIGHT}2002-2015 فريق النسخة المفتوحة +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}حفظ اللعبة @@ -2383,7 +2385,7 @@ STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}اسم STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}الحجم: STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} * {NUM} -STR_MAPGEN_MAX_HEIGHTLEVEL_QUERY_CAPT :تغيير أعلى ارتفاع للخريطة +STR_MAPGEN_MAX_HEIGHTLEVEL_QUERY_CAPT :{WHITE}تغيير أعلى ارتفاع للخريطة STR_MAPGEN_SNOW_LINE_QUERY_CAPT :{WHITE}غير مستوى خط الثلج STR_MAPGEN_START_DATE_QUERY_CAPT :{WHITE}غير سنة البداية @@ -2463,7 +2465,7 @@ STR_NEWGRF_SETTINGS_DISABLED :{RED}معطل STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}متعارض مع هذا اللإصدار من Openttd # NewGRF save preset window -STR_SAVE_PRESET_CAPTION :{BLACK}حفظ الإعداد المسبق +STR_SAVE_PRESET_CAPTION :{WHITE}حفظ الإعداد المسبق STR_SAVE_PRESET_LIST_TOOLTIP :{BLACK}لائحة الإعدادات المسبقة. اختر واحدة لنسخها للإسم المحفوظ بالإسفل STR_SAVE_PRESET_TITLE :{BLACK}أدخل اسم للإعداد المسبق STR_SAVE_PRESET_EDITBOX_TOOLTIP :{BLACK}الإسم المختار لحفظ الإعداد المسبق @@ -2524,7 +2526,6 @@ STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :تم تصميم STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :العديد من NewGRF تم تحميلها STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :تحميل {1:STRING}كملف ثابت مع NewGRF {STRING}قد يتسبب بمشكلة توافق. STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} يحتوي على خصائص غير صالحة. جميع الخصائص الغير صالحة سوف يشار لها بعلامة استفهام حمراء. -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}ملف الرسوم المستخدم حاليا يفتقد لبعض الرسوم الاساسية.{}الرجاء حدث ملف الرسوم. STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING}تم تعطيلة بواسطة{STRING} # NewGRF related 'general' warnings @@ -2595,8 +2596,6 @@ 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_PASSENGERS_LAST_MONTH_MAX :{BLACK}الركاب الشهر الماضي: {ORANGE}{COMMA}{BLACK} الأقصى: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}طرود البريد الشهر الماضي: {ORANGE}{COMMA}{BLACK} الأقصى: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK} نمو المدينة يتطلب بضائع STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} مطلوب STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK}مطلوب في الشتاء @@ -2819,9 +2818,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}يحتا STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}يحتاج: {YELLOW}{STRING}{STRING}, {STRING}{STRING} , {STRING}{STRING} ############ range for requires ends + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}البضاعة تنتظر التعامل معها: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}ينتج: {YELLOW}{STRING} {STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}ينتج: {YELLOW}{STRING} {STRING}, {STRING} {STRING} ############ range for produces ends @@ -2888,6 +2886,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :أزل جميع STR_GROUP_RENAME_CAPTION :{BLACK}إعادة تسمية مجموعة + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :عربات قطار جديدة STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :عربات قطار كهربائية جديدة @@ -3039,8 +3038,7 @@ 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: {POWER}قوة السحب {6:FORCE}{}التكلفة التشغيلية {4:CURRENCY_LONG}/سنة{}السعة: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK} التكلفة {CURRENCY_LONG} السرعة القصوى {VELOCITY}{}Capacity السعة {CARGO_LONG} {CARGO_LONG}{} كلفة التشغيل {CURRENCY_LONG} / سنة -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK} التكلفة {CURRENCY_LONG} السرعة القصوى {VELOCITY}{} السعة {CARGO_LONG}{} كلفة التشغيل {CURRENCY_LONG} / سنة +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK} التكلفة {CURRENCY_LONG} السرعة القصوى {VELOCITY}{} السعة {CARGO_LONG}{} كلفة التشغيل {CURRENCY_LONG} / سنة # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}تبديل {STRING} - {STRING} @@ -3060,7 +3058,6 @@ STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED :{BLACK}لم ي STR_REPLACE_VEHICLES_STOP :{BLACK} اوقف تبديل العربات STR_REPLACE_HELP_STOP_BUTTON :{BLACK} اضغط لايقاف تبديل المحركات المختارة في اليسار -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK} تبديل: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK} بدل بين نافذة استبدال المحركات و العربات STR_REPLACE_ENGINES :محركات STR_REPLACE_WAGONS :عربات @@ -3670,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}تعذر إعاده تسميه المحطه... @@ -3874,7 +3870,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}لا ي STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... العربة تحطمت STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}لن تتوافر اى وسائل نقل على اﻹطلاق -STR_ERROR_NO_VEHICLES_AVAILABLE_YET :لا تتوافر اى آليه نقل بعد +STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}لا تتوافر اى آليه نقل بعد # Specific vehicle errors STR_ERROR_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}لا يمكن السماح للقطار بالعبور من الاشارة في وضع الخطر diff --git a/src/lang/basque.txt b/src/lang/basque.txt index d5f6717a3d..d5511050b1 100644 --- a/src/lang/basque.txt +++ b/src/lang/basque.txt @@ -319,6 +319,7 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Subsidio STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Erakutsi konpainien geltokien zerrenda STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Erakutsi konpaniaren finantza informazioa STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Erakutsi konpaniaren informazio generala +STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Helburu zerrenda erakutsi STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Grafikoak erakutsi STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Erakutsi konpanien ligako taula STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Eraiki industria berria edo industri guztien zerrenda erakutsi @@ -662,10 +663,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}'Pertson STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Programa zorizko moduan jarri/kendu STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Erakutsi kanten selekzio leihoa -STR_ERROR_NO_SONGS :{WHITE}Kantarik gabeko musika paketea aukeratua. Ez dago kantarik entzuteko - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Musika Programen Selekzioa STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Pistaren Indizea STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Programatu - '{STRING}' @@ -871,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 @@ -1097,6 +1095,8 @@ STR_CONFIG_SETTING_RESTRICT_ALL :Aditua (ezarpen STR_CONFIG_SETTING_RESTRICT_CHANGED_AGAINST_DEFAULT :Ezarpenak lehenetsitakoen balio ezberdinarekin STR_CONFIG_SETTING_RESTRICT_CHANGED_AGAINST_NEW :Balio ezberdinak dituzten ezarpenak zure joko berriaren ezarpenekin alderatuta +STR_CONFIG_SETTING_TYPE_DROPDOWN_CLIENT :Bezero ezarpenak (ez dira partidatan gordetzen; joko guztiei eragiten die) +STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Enpresa ezarpenak (partidan gordeta; bakarrik uneko enpresari eragiten dio) STR_CONFIG_SETTINGS_NONE :{WHITE}- Ezer ez - STR_CONFIG_SETTING_OFF :Itzalita @@ -1262,6 +1262,7 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Grafikoen marre STR_CONFIG_SETTING_LAND_GENERATOR :Lur sortzailea: {STRING} STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Jatorrizkoa STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis +STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(TerraGenesis bakarrik) Maparen menditsutasuna STR_CONFIG_SETTING_INDUSTRY_DENSITY :Industria dentsitatea: {STRING} STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Petroleo findegietatik maparen ertzera dagoen gehienezko distantzia: {STRING} STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Petroleo findegiak bakarrik maparen ertzatik hurbil eraiki daitezke, kostan irla mapetan @@ -1278,6 +1279,7 @@ STR_CONFIG_SETTING_TREE_PLACER_NONE :Ezer ez STR_CONFIG_SETTING_TREE_PLACER_ORIGINAL :Jatorrizkoa STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Hobetua STR_CONFIG_SETTING_ROAD_SIDE :Errepideko garraioak: {STRING} +STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Gidatzeko aldea aukeratu STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Garaiera maparen norabidea: {STRING} STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Erlojuko orratzen kontrara STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Erlojuko orratzen erara @@ -1296,8 +1298,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Mapa txikiaren STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Berdea STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Berde iluna STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Bioleta -STR_CONFIG_SETTING_REVERSE_SCROLLING :Leihoa mapan zehar mugitzeko sagua mugitzeko era aldrebes jarri: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Mapan zehar saguaren eskuineko botoiarekin mugitzerakoan izango duen portaera. Desgaitua badago, saguak kamera mugituko du. Gaitua dagoenean, saguak mapa mugituko du STR_CONFIG_SETTING_SMOOTH_SCROLLING :Mapan zehar mugitzerakoan, abiadura moteltzea: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Kontrolatu nola mugituko den ikuspegia lehio nagusitik zehar, puntu jakin batera joateko mapa txikian sakatzen denean edo objektu zehatz batera joateko agintzen denean STR_CONFIG_SETTING_MEASURE_TOOLTIP :Eraikitze tresna ezberdinak erabiltzerakoan neurtresna erakutsi: {STRING} @@ -1329,10 +1329,9 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Komandoa+Klik STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Klik STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Itzalita -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Saguaren ezkerreko botoiarekin mapan zehar mugitzea: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Gaitu mapatik zehar mugitzea saguaren ezkerreko botoia mapan arrastratzerakoan. Oso erabilgarria da ukipen pantailak erabiltzerakoan STR_CONFIG_SETTING_AUTOSAVE :Auto-gordea: {STRING} +STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Partida gordetze automatikoaren bitartea aukeratu STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Gordetako jokoen izenetan {STRING} data fomatua erabili STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Gordetako fitxeroen dataren formatoa @@ -1373,7 +1372,9 @@ STR_CONFIG_SETTING_EXPENSES_LAYOUT_HELPTEXT :Konpainiako gas STR_CONFIG_SETTING_SOUND_NEWS :Periodikoa: {STRING} STR_CONFIG_SETTING_SOUND_NEW_YEAR :Amaiera urtea: {STRING} STR_CONFIG_SETTING_SOUND_CONFIRM :Eraikuntza: {STRING} +STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT :Eraikuntza arrakastatsua edo beste akzioekin soinu bat egin STR_CONFIG_SETTING_SOUND_DISASTER :Desastreak/istripuak: {STRING} +STR_CONFIG_SETTING_SOUND_DISASTER_HELPTEXT :Istripu edo desastreen soinu efektuak aktibatu STR_CONFIG_SETTING_SOUND_VEHICLE :Garraioak: {STRING} STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING :Azpiturak eraikitzea debekatu ibilgailu egokiak ez daudenean eskuragarri: {STRING} @@ -2105,6 +2106,7 @@ STR_CONTENT_SELECT_UPDATES_CAPTION :{BLACK}Egunerak STR_CONTENT_SELECT_UPDATES_CAPTION_TOOLTIP :{BLACK}Haukeratu dituzun edukiak berrituko dituzten edukiak deskargatuak izateko STR_CONTENT_UNSELECT_ALL_CAPTION :{BLACK}Guztia desmarkatu STR_CONTENT_UNSELECT_ALL_CAPTION_TOOLTIP :{BLACK}Dekargatuak izango ez diren eduki guztiak markatu +STR_CONTENT_SEARCH_EXTERNAL :{BLACK}Kanpoko webguneak bilatu STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}OpenTTD uzten zaude! STR_CONTENT_FILTER_TITLE :{BLACK}Etiketa/izen iragazkia: STR_CONTENT_OPEN_URL :{BLACK}Webgunera joan @@ -2484,6 +2486,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Aireport STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Onartutako zama: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Errail mota: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Trenbidearen abiadura muga: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Bideko abiadura muga: {LTBLUE}{VELOCITY} @@ -2496,29 +2499,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Eremuak STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Elurrez estalitako paisaia STR_LAI_CLEAR_DESCRIPTION_DESERT :Desertua -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} Trenbidea -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} Trenbidea blokeo seinalearekin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} trenbidea aurre-seinalekin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} trenbidea irteera seinaleekin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} trenbidea konbo seinaleekin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} trenbidea bide seinaleekin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} trenbidea norabide bakarreko bide seinaleekin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} trenbidea blokeo seinale eta aurre-seinaleekin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} trenbidea blokeo seinale eta irteera seinaleekin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} trenbidea blokeo seinalea eta konbo seinaleekin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} trenbidea blokeo seinaleekin eta bide seinaleekin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} Trenbidea blokeo eta norabide bakarreko bide seinaleekin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} trenbidea aurre-seinale eta irteera seinaleekin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} trenbidea aurre-seinale eta konbo seinaleekin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} trenbidea aurre-seinale eta bide seinaleekin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} trenbidea aurre-seinale eta norabide bakarreko bide seinaleekin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} trenbidea irteera seinale eta konbo seinaleekin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} trenbidea irteera seinale eta bide seinaleekin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} trenbidea irteera seinale eta norabide bakarreko bide seinaleekin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} trenbidea konbo seinale eta bide seinaleekin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} trenbide konbo seinale eta norabide bakarreko bide seinaleekin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} trenbidea bide seinale eta norabide bakarreko seinaleekina -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} tren gordailua +STR_LAI_RAIL_DESCRIPTION_TRACK :Trenbidea +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Trenbidea Trenbidea blokeo seinalearekin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Trenbidea trenbidea aurre-seinalekin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Trenbidea trenbidea irteera seinaleekin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Konbo-seinaledun trenbidea +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Trenbidea trenbidea bide seinaleekin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Trenbidea trenbidea norabide bakarreko bide seinaleekin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Trenbidea trenbidea blokeo seinale eta aurre-seinaleekin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Trenbidea trenbidea blokeo seinale eta irteera seinaleekin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Trenbidea trenbidea blokeo seinalea eta konbo seinaleekin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Trenbidea trenbidea blokeo seinaleekin eta bide seinaleekin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Trenbidea Trenbidea blokeo eta norabide bakarreko bide seinaleekin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Trenbidea trenbidea aurre-seinale eta irteera seinaleekin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Trenbidea trenbidea aurre-seinale eta konbo seinaleekin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Trenbidea trenbidea aurre-seinale eta bide seinaleekin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Trenbidea trenbidea aurre-seinale eta norabide bakarreko bide seinaleekin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Trenbidea trenbidea irteera seinale eta konbo seinaleekin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Trenbidea trenbidea irteera seinale eta bide seinaleekin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Trenbidea trenbidea irteera seinale eta norabide bakarreko bide seinaleekin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Trenbidea trenbidea konbo seinale eta bide seinaleekin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Konbo-seinale eta norabide bakarreko bide seinaledun trenbidea +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Trenbidea trenbidea bide seinale eta norabide bakarreko seinaleekina +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Trenbidea tren gordailua STR_LAI_ROAD_DESCRIPTION_ROAD :errepidea STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Errepidea farolekin @@ -2582,7 +2585,16 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Konpainia jabe STR_ABOUT_OPENTTD :{WHITE}OpenTTD-ri buruz STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original copyright {COPYRIGHT} 1995 Chris Sawyer, All rights reserved STR_ABOUT_VERSION :{BLACK}OpenTTD bertsioa {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 The OpenTTD team +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 @@ -2724,6 +2736,7 @@ STR_NEWGRF_SETTINGS_DISABLED :{RED}Desgaitua STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}OpenTTD-ren bertsio honekin bateraezina # NewGRF save preset window +STR_SAVE_PRESET_CANCEL_TOOLTIP :{BLACK}Ez aldatu berezko balioa # NewGRF parameters window STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}NewGRF parametroak aldatu @@ -2786,8 +2799,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Identifikazio b STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} sprite baliogabea dauka. Sprite baliogabeak galdera ikur gorria bezala ikusiko dira (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Action 8 sarrera asko ditu (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Pseudo spritea baino hurrunago irakurri (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Aukeratuta daukazun oinarrizko grafiko paketean "sprite" batzuk falta dira.{}Mesedez eguneratu oinarrizko grafiko paketea -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Erabiltzen ari den grafiko baseari sprite batzuk falta zaizkio.{}Mesedez zure grafiko basea eguneratu ezazu.{}OpenTTD-ren {YELLOW}garapen bertsio bat erabiltzen ari zarenez{WHITE}, grafiko basearen {YELLOW}garapen bertsio bat behar izango duzu{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Eskatutako GRFa ez dago eskuragarri (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} desgaitua izan da {STRING}(en)gatik STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Grafiko deseinu formatu ezezaguna/baliogabea (sprite {3:NUM}) @@ -2861,8 +2872,6 @@ STR_TOWN_POPULATION :{BLACK}Munduko STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Hiria) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Biztanleria: {ORANGE}{COMMA}{BLACK} Etxe kopurua: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Bidaiari kopurua aurreko hilabetean: {ORANGE}{COMMA}{BLACK} gehienez: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Posta kopurua aurreko hilabetean: {ORANGE}{COMMA}{BLACK} gehienez: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Beharrezko zama herri hazkunderako: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} beharrezkoa STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} Neguan beharrezkoa @@ -2986,13 +2995,14 @@ STR_STATION_LIST_NO_WAITING_CARGO :{BLACK}Ez dago STR_STATION_VIEW_CAPTION :{WHITE}{STATION} {STATION_FEATURES} STR_STATION_VIEW_WAITING_CARGO :{WHITE}{CARGO_LONG} STR_STATION_VIEW_EN_ROUTE_FROM :{YELLOW}({CARGO_SHORT} {STATION}-(e)tik garraiatua) +STR_STATION_VIEW_RESERVED :{YELLOW}({CARGO_SHORT} kargarako erreserbatua) STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Onartu STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Onartzen diren zamen zerrenda STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Onartzen da: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Geltoki honek herriko garraio eskubide esklusiboa dauka. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} garraioaren eskubide esklusiboak erosi ditu +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Geltoki honek herriko garraio eskubide esklusiboa dauka. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} garraioaren eskubide esklusiboak erosi ditu STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Zama balorazioak STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Geltokiaren zama balorazioak erakutsi @@ -3001,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 @@ -3168,9 +3179,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Beharrez STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Beharrezkoa du: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Prosezatzeko zain dagoen zama: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Ekoizpena: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Ekoizpena: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3236,6 +3246,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Ibilgailu guzti STR_GROUP_RENAME_CAPTION :{BLACK}Taldea berrizendatu + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Tren berriak STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Tren elektriko berriak @@ -3396,10 +3407,7 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :Lokomotora magn STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Kostea: {CURRENCY_LONG} Pisua: {WEIGHT_SHORT}{}Pisua: {VELOCITY} Potentzia: {POWER}{}Mantenimendua: {CURRENCY_LONG}/urtero{}Edukiera: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Kostua: {CURRENCY_LONG} Pisua: {WEIGHT_SHORT}{}Abiadura: {VELOCITY} Potentzia: {POWER} Gehienezko trakzioa: {6:FORCE}{}Mantinemendua: {4:CURRENCY_LONG}/urtero{}Edukiera: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Kostea: {CURRENCY_LONG} Gehienezko abiadura: {VELOCITY}{}Edukiera: {CARGO_LONG}, {CARGO_LONG}{}Mantenimendua: {CURRENCY_LONG}/urtero -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Kostea: {CURRENCY_LONG} Gehienezko abiadura: {VELOCITY}{}Edukiera: {CARGO_LONG}{}Mantenimendua: {CURRENCY_LONG}/urtero -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Kostea: {CURRENCY_LONG} Gehienezko abiadura: {VELOCITY} Irismena: {COMMA} tiles{}Edukiera: {CARGO_LONG}, {CARGO_LONG}{}Mantenimendua: {CURRENCY_LONG}/urtero -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Kostea: {CURRENCY_LONG} Gehienezko abiadura: {VELOCITY} Irismena: {COMMA} tiles{}Edukiera: {CARGO_LONG}{}Mantenimendua: {CURRENCY_LONG}/urtero +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Kostea: {CURRENCY_LONG} Gehienezko abiadura: {VELOCITY}{}Edukiera: {CARGO_LONG}{}Mantenimendua: {CURRENCY_LONG}/urtero # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Ordezkatu {STRING} - {STRING} @@ -3424,7 +3432,6 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} zaharr STR_REPLACE_VEHICLES_STOP :{BLACK}Ibilgailuak ordezkatzen gelditu STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Klikatu ezkerrean aukeratutako motore motaren ordezkapena gelditzeko -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Ordezkatzen: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Aldatu motore pantaila eta bagoi paintailaren artean STR_REPLACE_ENGINES :Motoreak STR_REPLACE_WAGONS :Bagoiak @@ -3520,7 +3527,6 @@ STR_VEHICLE_INFO_AGE :{COMMA} urte ({ STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} urte ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Gehienezko abiadura: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Gehienezko abiadura: {LTBLUE}{VELOCITY} {BLACK}Irismena: {LTBLUE}{COMMA} lauki STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Pisua: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potentzia: {LTBLUE}{POWER}{BLACK} Gehienezko abiadura: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Pisua: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potentzia: {LTBLUE}{POWER}{BLACK} Gehienezko abiadura: {LTBLUE}{VELOCITY} {BLACK}Gehienezko trakzio indarra: {LTBLUE}{FORCE} @@ -4053,6 +4059,7 @@ STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... Baso STR_ERROR_CAN_ONLY_BE_BUILT_ABOVE_SNOW_LINE :{WHITE}... bakarrik elur garaieratik gora eraiki daiteke STR_ERROR_CAN_ONLY_BE_BUILT_BELOW_SNOW_LINE :{WHITE}... bakarrik elur garaieratik behera eraiki daiteke +STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES :{WHITE}Ez dago leku aproposik '{STRING}' industriarako # Station construction related errors STR_ERROR_CAN_T_BUILD_RAILROAD_STATION :{WHITE}Ezin da tren gordailua hemen eraiki... @@ -4069,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... @@ -4318,7 +4324,11 @@ STR_ERROR_CAN_T_DELETE_SIGN :{WHITE}Ezin da STR_DESKTOP_SHORTCUT_COMMENT :Transport Tycoon Deluxe-ren simulazio bat # Translatable descriptions in media/baseset/*.ob* files +STR_BASEGRAPHICS_DOS_DESCRIPTION :Transport Tycoon Deluxe originaleko DOS edizioko grafikoak. +STR_BASESOUNDS_DOS_DESCRIPTION :Transport Tycoon Deluxe originaleko DOS edizioko soinuak. +STR_BASESOUNDS_WIN_DESCRIPTION :Transport Tycoon Deluxe originaleko Windows edizioko grafikoak. STR_BASESOUNDS_NONE_DESCRIPTION :Soinurik gabeko soinu pakete bat +STR_BASEMUSIC_NONE_DESCRIPTION :Musika gabeko musika paketea. ##id 0x2000 # Town building names diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index 52019447b0..819bce4a2b 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -598,7 +598,7 @@ STR_SORT_BY_TYPE :Тып STR_SORT_BY_TRANSPORTED :Вывезена STR_SORT_BY_NUMBER :Нумар STR_SORT_BY_PROFIT_LAST_YEAR :Прыбытак летась -STR_SORT_BY_PROFIT_THIS_YEAR :Прыбытак у бягучым годзе +STR_SORT_BY_PROFIT_THIS_YEAR :Прыбытак сёлета STR_SORT_BY_AGE :Узрост STR_SORT_BY_RELIABILITY :Надзейнасьць STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :Умяшчальнасьць грузу @@ -963,6 +963,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}Назва @@ -982,15 +983,15 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Выбр STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Уключыць/выключыць выпадковы выбар трэкаў STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Паказаць вакно выбару трэкаў -STR_ERROR_NO_SONGS :{WHITE}У выбранай праґраме адсутнічае музыка - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Выбар музычнай праґрамы +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}Programme — «{STRING}» STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Ачысьціць +STR_PLAYLIST_CHANGE_SET :{BLACK}Зьмяніць набор STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Ачысьціць сьпіс уласнай праґрамы +STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Змяніць выбар музычнага афармлення на іншы ўсталяваны набор STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Клікніце па назьве трэка, каб дадаць яго ва ўласную праґраму STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Клікніце па назьве трэка, каб выдаліць яго з уласнай праґрамы @@ -1195,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 @@ -1432,7 +1433,7 @@ STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME :Наладкі STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Наладкі кампаніі (запісваюцца ў захаваньні; уплываюць толькі на новыя гульні) STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Наладкі кампаніі (запісваюцца ў захаваньне; уплываюць толькі на бягучую кампанію) STR_CONFIG_SETTING_CATEGORY_HIDES :{BLACK}Паказаць усе вынікі пошуку па наладках{}{SILVER}Катэґорыя {BLACK}да {WHITE}{STRING} -STR_CONFIG_SETTING_TYPE_HIDES :{BLACK}Паказаць усе вынікі пошуку па наладках{}{SILVER}Тып BLACK}да {WHITE}Усе тыпы наладак +STR_CONFIG_SETTING_TYPE_HIDES :{BLACK}Паказаць усе вынікі пошуку па наладках{}{SILVER}Тып {BLACK}да {WHITE}Усе тыпы наладак STR_CONFIG_SETTING_CATEGORY_AND_TYPE_HIDES :{BLACK}Паказаць усе вынікі пошуку па наладках{}{SILVER}Катэґорыя {BLACK}да {WHITE}{STRING} {BLACK}і {SILVER}Тып {BLACK}да {WHITE}Усе тыпы наладак STR_CONFIG_SETTINGS_NONE :{WHITE}- Няма - @@ -1650,8 +1651,12 @@ 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_REVERSE_SCROLLING :Перавярнуць напрамак зрушэньня прагляду мышшу: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Паводзіны пры пракручваньні мапы правай кнопкай мышы. Калі адключана, мыш перамяшчае кропку позірку. Калі ўключана, мыш перамяшчае мапу. +STR_CONFIG_SETTING_SCROLLMODE :Перамяшчэнне агляду: {STRING} +STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Спосаб перамяшчэння па гульнёваму полю +STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Перамяшчаць з дапамогай ПКМ, зафіксаваўшы курсор +STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Перамяшчаць з дапамогай ПКМ, зафіксаваўшы курсор +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} @@ -1683,8 +1688,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :каманда+ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+клік STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :выключана -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Скролінг па кліку левай кнопкай мышы: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Уключыць пракручваньне мапы цягненьнем з націснутай левай кнопкай мышы. Гэта асабліва зручна пры выкарыстоўваньні сэнсарнага экрана. +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 :Азначце інтэрвал паміж аўтаматычнымі захаваньнямі @@ -2074,6 +2079,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Прав STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Зьмяніць наладкі ШІ ды гульнёвага скрыпту STR_INTRO_TOOLTIP_QUIT :{BLACK}Выйсьці з OpenTTD +STR_INTRO_BASESET :{BLACK}У абраным наборы базавай графікі адсутнічае {NUM} спрайт{P "" а аў}. Калі ласка, абнавіце набор графікі. STR_INTRO_TRANSLATION :{BLACK}На гэту мову не перакладзен{P 0 ы ы а} {NUM} рад{P ок кі коў}. Вы можаце дапамагчы праекту, калi зарэґіструецеся як перакладчык. Інструкцыі ў файле readme.txt. # Quit window @@ -2611,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}нявыкарыст. @@ -2922,6 +2929,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Зона STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Прымае: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Тып чыгуначнага палатна: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Макс. хуткасьць чыгункi: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Макс. хуткасьць аўтамабіляў: {LTBLUE}{VELOCITY} @@ -2934,29 +2942,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Палi STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Засьнежаная зямля STR_LAI_CLEAR_DESCRIPTION_DESERT :Пустэльня -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} рэйкi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} рэйкi са звычайнымі сыґналамi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} рэйкi з уваходнымі прэсыґналамi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} рэйкi з выхаднымi сыґналамi (прэсыґналамі) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} рэйкi з камбiнаванымi сыґналамi (прэсыґналамі) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} рэйкi з маршрутнымi (PMS) сыґналамi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} рэйкi з аднабаковымi маршрутнымi (PMS) сыґналамi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} рэйкi са звычайнымi й уваходнымі прэсыґналамi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} рэйкi са звычайнымi й выхаднымi сыґналамi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} рэйкi са звычайнымi й камбiнаванымi сыґналамi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} рэйкi са звычайнымi й маршрутнымi (PMS) сыґналамi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} рэйкi са звычайнымi й аднабаковымi маршрутнымi (PMS) сыґналамi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} рэйкi з уваходнымi (прэcыгналамi) ды выхаднымi сыґналамi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} рэйкi з уваходнымi (прэсыґналамi) ды камбiнаванымi сыґналамi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} рэйкi з уваходнымi (прэсыґналамi) ды маршрутнымi (PMS) сыґналамi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} рэйкi з уваходнымi (прэсыґналамi) ды аднабаковымi маршрутнымi (PMS) сыґналамi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} рэйкi з выхаднымi й камбінаванымі прэсыґналамі -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} рэйкі з выхаднымі (прэсыґналамі) ды маршрутнымі (PMS) сыґналамі -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} рэйкі з выхаднымі (прэсыґналамі) ды аднабаковымі маршрутнымі (PMS) сыґналамі -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} рэйкі з камбінаванымі (прэсыґналамі) ды маршрутнымі (PMS) сыґналамі -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} рэйкі з камбінаванымі (прэсыґналамі) ды аднабаковымі маршрутнымі (PMS) сыґналамі -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} рэйкі з маршрутнымі (PMS) ды аднабаковымі маршрутнымі сыґналамі -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} чыгуначнае дэпо +STR_LAI_RAIL_DESCRIPTION_TRACK :Чыгуначны пуць +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Чыгуначны пуць з сігналамі +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Чыгуначны пуць з уваходнымі сігналамі +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Чыгуначны пуць з выходнымі сігналамі +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Чыгуначны пуць з камбінаванымі сігналамі +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Чыгуначны пуць з маршрутнымі сігналамі +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Чыгуначны пуць з аднабаковымі маршрутнымі сігналамі +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Чыгуначны пуць са звычайным і ўваходным сігналамі +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Чыгуначны пуць са звычайным і выходным сігналамі +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Чыгуначны пуць са звычайнымі й камбінаванымі сігналамі +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Чыгуначны пуць са звычайнымі і маршрутнымі сігналамі +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Чыгуначны пуць са звычайным і аднабаковым маршрутным сігналамі +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Чыгуначны пуць з уваходным і выходным сігналамі +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Чыгуначны пуць з уваходным і камбінаваным сігналамі +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Чыгуначны пуць з выходным і маршрутным сігналамі +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Чыгуначны пуць з уваходным і аднабаковым маршрутным сігналамі +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Чыгуначны пуць з выходнымі й камбінаванымі сігналамі +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Чыгуначны пуць з выходным і маршрутным сігналамі +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Чыгуначны пуць з выходным і аднабаковым маршрутным сігналамі +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Чыгуначны пуць з камбінаваным і маршрутным сігналамі +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Чыгуначны пуць з камбінаваным і аднабаковым маршрутным сігналамі +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Чыгуначны пуць з маршрутным і аднабаковым маршрутным сігналамі +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Чыгуначнае дэпо STR_LAI_ROAD_DESCRIPTION_ROAD :Дарога STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Дарога з вулічным асьвятленьнем @@ -3020,7 +3028,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Зямля на STR_ABOUT_OPENTTD :{WHITE}Аб OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Арыґінальныя аўтарскія правы {COPYRIGHT} 1995 Chris Sawyer. Усе правы абароненыя. STR_ABOUT_VERSION :{BLACK}OpenTTD вэрсія {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002–2015 Каманда распрацоўнікаў OpenTTD +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}Захаваць гульню @@ -3207,7 +3222,7 @@ STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Пера STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Папярэдні спрайт STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Перайсьці да папярэдняга звычайнага спрайта, прапускаючы змяняючыя колер, шрыфтавыя, псэўдаспрайты. Пераход з пачатку сьпісу да апошняга спрайта. STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Прадстаўленьне выбранага спрайта. Выраўноўваньне не ўлічваецца пры прарысоўцы гэтага спрайта. -STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Рухайце спрайт, зьмяняючы зрушэньне па X і па Y +STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Рухайце спрайт, зьмяняючы зрушэньне па X і па Y. Ctrl+пстрычка, каб зрушыць спрайт на восем адзінак за раз STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Скід зрушэння STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Скінуць значэнні адноснага зрушэння STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Зрушэнне X: {NUM}; зрушэнне Y: {NUM} (абсалютнае) @@ -3239,8 +3254,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Спроба в STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} утрымлiвае пашкоджаны спрайт. Усе пашкоджаныя спрайты будуць паказаны чырвоным знакам пытаньня (?). STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Утрымлiвае некалькі блёкаў «Action 8» (спрайт {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Чытаньне па-за канцом псэўда-спрайту (спрайт {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}У бягучым наборы базавай ґрафікі адсутнічаюць выявы некаторых аб'ектаў.{}Калі ласка, абнавіце модуль базавай ґрафікі. -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}У выкарыстаным наборы базавай ґрафікі адсутнічаюць некаторыя малюнкі.{}Калі ласка, абнавіце набор малюнкаў.{}Вам можа спатрэбіцца {YELLOW}тэставая вэрсія ґрафічнага набору{WHITE}, таму што ў вас {YELLOW}тэставая вэрсія OpenTTD{WHITE}. STR_NEWGRF_ERROR_GRM_FAILED :Запытаныя рэсурсы GRF недаступныя (спрайт {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} быў адключаны з-за {2:STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Недапушчальны/невядомы фармат размяшчэньня спрайтаў (спрайт {3:NUM}) @@ -3308,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} @@ -3315,8 +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_PASSENGERS_LAST_MONTH_MAX :{BLACK}Пасажыраў за мінулы месяц: {ORANGE}{COMMA}{BLACK} Макс.: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{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 ю}цца ўзімку @@ -3447,8 +3460,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Прым STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Паказаць сьпіс прымаемых грузаў STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Прымае: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Гэта станцыя мае эксклюзыўныя транспартныя правы ў гэтым населеным пункце. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} набыў эксклюзыўныя транспартныя правы ў гэтым населеным пункце. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Гэта станцыя мае эксклюзыўныя транспартныя правы ў гэтым населеным пункце. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} набыў эксклюзыўныя транспартныя правы ў гэтым населеным пункце. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Рэйтынґ STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Паказаць рэйтынґ станцыі @@ -3627,9 +3640,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Патр STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Патрабуецца: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Патрабуецца: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} чакае{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Груз, які чакае перапрацоўкі: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Вырабляе: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Вырабляе: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3648,7 +3663,7 @@ STR_VEHICLE_LIST_ROAD_VEHICLE_TOOLTIP :{BLACK}Аўта STR_VEHICLE_LIST_SHIP_TOOLTIP :{BLACK}Караблi: клікніце для атрыманьня даведкі STR_VEHICLE_LIST_AIRCRAFT_TOOLTIP :{BLACK}Самалёты: клікніце для атрыманьня даведкі -STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Прыбытак у гэтым годзе: {CURRENCY_LONG} (летась: {CURRENCY_LONG}) +STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Прыбытак сёлета: {CURRENCY_LONG} (летась: {CURRENCY_LONG}) STR_VEHICLE_LIST_AVAILABLE_TRAINS :Даступныя цягнiкi STR_VEHICLE_LIST_AVAILABLE_ROAD_VEHICLES :Даступныя аўтамабiлi @@ -3696,6 +3711,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Выдаліц 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 STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Новы цягнік STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Новы электрычны цягнік @@ -3727,6 +3747,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Усе тыпы STR_PURCHASE_INFO_ALL_BUT :Усё, акрамя {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Макс. цягавае намаганьне: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Далёкасьць: {GOLD}{COMMA} клет{P ка кi ак} +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Тып паветр. судна: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Сьпіс лакаматываў і вагонаў - пстрыкніце для атрыманьня інфармацыі. Ctrl+пстрычка схавае/пакажа ТС. STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Сьпіс аўтатранспарту - пстрыкніце для атрыманьня інфармацыі. Ctrl+пстрычка схавае/пакажа выбраны аўтамабіль. @@ -3872,10 +3893,11 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE.acc :магніта 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_CAPACITY_CAPACITY_RUNCOST :{BLACK}Кошт: {CURRENCY_LONG} Макс. хуткасьць: {VELOCITY}{}Ёмістасьць: {CARGO_LONG}, {CARGO_LONG}{}Кошт абслуг.: {CURRENCY_LONG}/год -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Кошт: {CURRENCY_LONG} Макс. хуткасьць: {VELOCITY}{}Ёмістасьць: {CARGO_LONG}{}Кошт абслуг.: {CURRENCY_LONG}/год -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Кошт: {CURRENCY_LONG} Макс. хуткасьць: {VELOCITY} Далёкасьць: {COMMA} клетк{P а i ак}{}Умяшчальнасьць: {CARGO_LONG}, {CARGO_LONG}{}Кошт абслугоўваньня: {CURRENCY_LONG}/год -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Кошт: {CURRENCY_LONG} Макс. хуткасьць: {VELOCITY} Далёкасьць: {COMMA} клет{P ка кi ак}{}Умяшчальнасьць: {CARGO_LONG}{}Кошт абслугоўваньня: {CURRENCY_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.gen} — {STRING} @@ -3910,10 +3932,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} кал STR_REPLACE_VEHICLES_STOP :{BLACK}Спыніць замену STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Спыніць замену транспарту -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Замяняем: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Пераключэньне паміж вокнамі замены лякаматываў і ваґонаў STR_REPLACE_ENGINES :Лякаматывы STR_REPLACE_WAGONS :Ваґоны +STR_REPLACE_ALL_RAILTYPE :Увесь чыгуначны транспарт STR_REPLACE_HELP_RAILTYPE :{BLACK}Выберыце тып чыгуначнага транспарту, цягнікі якога жадаеце замяніць STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}На які транспарт адбываецца замена @@ -4006,11 +4028,12 @@ STR_VEHICLE_INFO_AGE :{COMMA} г{P о STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} г{P од ады адоў} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Макс. хуткасьць: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Макс. хуткасьць: {LTBLUE}{VELOCITY} {BLACK}Далёкасьць: {LTBLUE}{COMMA} клетк{P а i ак} +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Макс. хуткасць: {LTBLUE}{VELOCITY} {BLACK}Тып паветр. судна: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Макс. хуткасць: {LTBLUE}{VELOCITY} {BLACK}Тып: {LTBLUE}{STRING} {BLACK}Далёкасць: {LTBLUE}{COMMA} клетак STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Вага: {LTBLUE}{WEIGHT_SHORT} {BLACK}Магутнасьць: {LTBLUE}{POWER}{BLACK} Макс. хуткасьць: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Вага: {LTBLUE}{WEIGHT_SHORT} {BLACK}Магутнасьць: {LTBLUE}{POWER}{BLACK} Макс. хуткасьць: {LTBLUE}{VELOCITY} {BLACK}Макс. ЦН: {LTBLUE}{FORCE} -STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Прыбытак ў гэтым годзе: {LTBLUE}{CURRENCY_LONG} (летась: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Прыбытак сёлета: {LTBLUE}{CURRENCY_LONG} (летась: {CURRENCY_LONG}) STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Надзейнасьць: {LTBLUE}{COMMA}% {BLACK}Паломак з апошняга агляду: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Пабудаваны ў: {LTBLUE}{NUM} г.{BLACK} Кошт: {LTBLUE}{CURRENCY_LONG} @@ -4565,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}Немагчыма перайменаваць станцыю... @@ -4573,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... @@ -4824,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 545a2339db..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 @@ -670,15 +672,15 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Selecion STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Alternar programa misturado em ligado/desligado STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Exibir janela de seleção de faixas de música -STR_ERROR_NO_SONGS :{WHITE}Um conjunto de músicas sem canções foi selecionado. Nenhuma música será tocada - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Seleção de Programa de Música +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) @@ -814,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}! @@ -881,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 @@ -926,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 @@ -1090,7 +1094,7 @@ STR_CITY_APPROVAL_HOSTILE :Hostil STR_WARNING_NO_SUITABLE_AI :{WHITE}Não há IA compatíveis disponíveis...{}Você pode baixar várias IA's pelo sistema de 'Conteúdo Online' # Settings tree window -STR_CONFIG_SETTING_TREE_CAPTION :[WHITE}Configurações +STR_CONFIG_SETTING_TREE_CAPTION :{WHITE}Configurações STR_CONFIG_SETTING_FILTER_TITLE :{BLACK}Filtro: STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Maximizar tudo STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Minimizar tudo @@ -1286,8 +1290,8 @@ STR_CONFIG_SETTING_HOVER_DELAY_VALUE :Aguardar {COMMA STR_CONFIG_SETTING_HOVER_DELAY_DISABLED :Botão direito STR_CONFIG_SETTING_POPULATION_IN_LABEL :Exibir população da cidade na janela da cidade: {STRING} STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Exibe a população das cidades nos nomes, no mapa -STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Grossura das linhas nos gráficos: {STRING} -STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Grossura da linha nos gráficos. Linhas finas são mais precisas, enquanto linhas grossas são mais fáceis de distinguir. +STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Espessura das linhas nos gráficos: {STRING} +STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Espessura da linha nos gráficos. Linhas finas são mais precisas, enquanto linhas grossas são mais fáceis de distinguir. STR_CONFIG_SETTING_LANDSCAPE :Terreno: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :O terreno define a jogabilidade básica com diferentes cargas e requerimentos para o crescimento das cidades. NewGRF's e Scripts de Jogo permitem um controle mais fino @@ -1338,10 +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_REVERSE_SCROLLING :Rolar a tela no sentido oposto ao movimento do mouse: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Comportamento quando rolar o mapa com o botão direito. Quando desativado, o mouse move a câmera. Ativado, o mouse move o mapa. +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} @@ -1371,8 +1379,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Clique de coman STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Clique de controle STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Desligado -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Mover a tela com o botão esquerdo: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Ativa rolamento do mapa por clique e arraste com o botão esquerdo. Especialmente útil ao usar um touchscreen para o rolamento +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Fechar janela com botão direito do mouse: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Fecha uma janela ao clicar com o botão direito do mouse nela. Desativa o tooltip com o botão direito! STR_CONFIG_SETTING_AUTOSAVE :Auto-salvar: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Selecione intervalo entre jogos salvos automaticamente @@ -1536,12 +1544,12 @@ STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI_HELPTEXT :Exibe uma janel STR_CONFIG_SETTING_DEFAULT_SIGNAL_TYPE :Tipo de sinal a ser construído: {STRING} STR_CONFIG_SETTING_DEFAULT_SIGNAL_TYPE_HELPTEXT :Tipo padrão de sinal a se utilizar STR_CONFIG_SETTING_DEFAULT_SIGNAL_NORMAL :Normal -STR_CONFIG_SETTING_DEFAULT_SIGNAL_PBS :Avançado -STR_CONFIG_SETTING_DEFAULT_SIGNAL_PBSOWAY :Avançado de mão única +STR_CONFIG_SETTING_DEFAULT_SIGNAL_PBS :De trajeto +STR_CONFIG_SETTING_DEFAULT_SIGNAL_PBSOWAY :De trajeto de mão única STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Tipo de sinal a ser exibido: {STRING} STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Seleciona quais tipos de sinal a exibir, quando Ctrl+Clicar em Construir Sinais com a ferramenta Sinal STR_CONFIG_SETTING_CYCLE_SIGNAL_NORMAL :Normal apenas -STR_CONFIG_SETTING_CYCLE_SIGNAL_PBS :Avançados apenas +STR_CONFIG_SETTING_CYCLE_SIGNAL_PBS :De trajeto apenas STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Todos STR_CONFIG_SETTING_TOWN_LAYOUT :Disposição de ruas para novas cidades: {STRING} @@ -1762,6 +1770,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Checar p STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Exibe configurações de IA e script do jogo STR_INTRO_TOOLTIP_QUIT :{BLACK}Sair do 'OpenTTD' +STR_INTRO_BASESET :{BLACK}Faltam {NUM} "sprite{P "" s}" no conjunto de gráficos base selecionado. Por favor verifique se há atualizações para ele. STR_INTRO_TRANSLATION :{BLACK}Faltam {NUM} string{P "" s} nessa tradução. Por favor faça o OpenTTD melhor se inscrevendo como tradutor. Leia Readme.txt para mais detalhes. # Quit window @@ -2283,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 @@ -2358,14 +2368,14 @@ STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Sinais p STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Sinal de Entrada (semáforo){}Verde enquanto haja um ou mais sinais de saída verdes na atual seção dos trilhos. Do contrário, mostra vermelho STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Sinal de saída (semáforo){}Funciona como um sinal normal, porém é necessário para o funcionamento correto do sistema de pré-sinais combo ou de entrada STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TOOLTIP :{BLACK}Sinal combo (semáforo){}O sinal combo funciona tanto como um sinal de entrada quanto de saída. Permite construir várias ramificações -STR_BUILD_SIGNAL_SEMAPHORE_PBS_TOOLTIP :{BLACK}Sinal avançado(Semáforo){}Um sinal avançado permite mais de um trem em um bloco de ferrovia, Se o trem no bloco puder reservar um local seguro para parar, o sinal avançado já permite a passada do próximo -STR_BUILD_SIGNAL_SEMAPHORE_PBS_OWAY_TOOLTIP :{BLACK}Sinal avançado de mão única(Semáforo){}Um sinal avançado permite mais de um trem em um bloco de ferrovia, Se o trem no bloco puder reservar um local seguro para parar, o sinal avançado já permite a passada do próximo, porém não permite a passagem na via contrária +STR_BUILD_SIGNAL_SEMAPHORE_PBS_TOOLTIP :{BLACK}Sinal de trajeto(Semáforo){}Um sinal de trajeto permite mais de um trem em um bloco de ferrovia, Se o trem no bloco puder reservar um local seguro para parar, o sinal de trajeto já permite a passada do próximo +STR_BUILD_SIGNAL_SEMAPHORE_PBS_OWAY_TOOLTIP :{BLACK}Sinal de trajeto de mão única(Semáforo){}Um sinal de trajeto permite mais de um trem em um bloco de ferrovia, Se o trem no bloco puder reservar um local seguro para parar, o sinal de trajeto já permite a passada do próximo, porém não permite a passagem na via contrária STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP :{BLACK}Sinal Padrão (elétrico){}Sinais são necessários para impedir que trens batam em redes de ferrovias com mais de uma máquina STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP :{BLACK}Sinal de Entrada (elétrico){}Verde enquanto haja um ou mais sinais de saída verdes na atual seção dos trilhos. Do contrário, mostra vermelho STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Sinal de saída(elétrico){}Funciona como um sinal normal, porém é necessário para o funcionamento correto do sistema de pré-sinais combo ou de entrada STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Sinal Combo (elétrico){}O sinal combo funciona tanto como um sinal de entrada quanto de saída. Permite construir várias ramificações de pré-sinais -STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Sinal de trajeto(Elétrico){}Um sinal de trajeto permite mais de um trem entrar em um bloco de sinal ao mesmo tempo, se o trem puder reservar um trajeto para um ponto seguro de parada. Sinais de trajeto padrões podem ser passados pelo lado de trás -STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Sinal avançado de mão única(Elétrico){}Um sinal avançado permite mais de um trem em um bloco de ferrovia, Se o trem no bloco puder reservar um local seguro para parar, o sinal avançado já permite a passada do próximo, porém não permite a passagem na via contrária +STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Sinal de trajeto (Elétrico){}Um sinal de trajeto permite mais de um trem entrar em um bloco de sinal ao mesmo tempo, se o trem puder reservar um trajeto para um ponto seguro de parada. Sinais de trajeto padrões podem ser passados pelo lado de trás +STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Sinal avançado de mão única(Elétrico){}Um sinal de trajeto permite mais de um trem em um bloco de ferrovia, Se o trem no bloco puder reservar um local seguro para parar, o sinal de trajeto já permite a passada do próximo, porém não permite a passagem na via contrária STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Converter sinal{}Quando selecionado, clicar num sinal existente converte-o para o tipo selecionado e suas variantes. Ctrl+Clique muda a variante atual. Shift+Clique mostra o preço estimado da conversão STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}Densidade dos sinais ao clicar e arrastar STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}Diminuir a densidade dos sinais @@ -2590,6 +2600,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Nome da STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Carga aceita: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Tipo de ferrovia: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Velocidade limite do trilho: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Limite de velocidade da rua: {LTBLUE}{VELOCITY} @@ -2602,29 +2613,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Campos STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Neve STR_LAI_CLEAR_DESCRIPTION_DESERT :Deserto -STR_LAI_RAIL_DESCRIPTION_TRACK :Trilho de {STRING} -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Trilho de {STRING} com sinais normais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Trilho de {STRING} com pré-sinais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Trilho de {STRING} com sinais de saída -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Trilho de {STRING} com sinais-combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Trilho de {STRING} com sinais avançados -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Trilhos de {STRING} com sinais avançados de mão única -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Trilho de {STRING} com sinais normais e pré-sinais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Trilho de {STRING} com sinais normais e pré-sinais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Trilho de {STRING} com sinais normais e sinais-combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Trilho de {STRING} com sinais normais e avançados -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Trilho de {STRING} com sinais normais e avançados de mão única -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Trilho de {STRING} com pré-sinais e de saída -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Trilho de {STRING} com pré-sinais e sinais-combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Trilho de {STRING} com pré-sinais e sinais avançados -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Trilho de {STRING} com pré-sinais e avançados de mão única -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Trilho de {STRING} com sinais de saída e sinais-combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Trilho de {STRING} com sinais de saída e avançados -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Trilho de {STRING} com sinais de saída e avançados de mão única -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Trilho de {STRING} com sinais-combo e avançados -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Trilho de {STRING} com sinais-combo e avançados de mão única -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Trilho de {STRING} com sinais avançados e avançados de mão única -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Depósito de {STRING} +STR_LAI_RAIL_DESCRIPTION_TRACK :Trilho de ferrovia +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Trilho de ferrovia com sinais normais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Trilho de ferrovia com pré-sinais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Trilho de ferrovia com sinais de saída +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Trilho de ferrovia com sinais-combo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Trilho de ferrovia com sinais de trajeto +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Trilhos de Ferrovia com sinais de trajeto de mão única +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Trilho de ferrovia com sinais normais e pré-sinais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Trilho de ferrovia com sinais normais e pré-sinais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Trilho de ferrovia com sinais normais e sinais-combo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Trilho de ferrovia com sinais normais e de trajeto +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Trilho de ferrovia com sinais normais e de trajeto de mão única +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Trilho de ferrovia com pré-sinais e de saída +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Trilho de ferrovia com pré-sinais e sinais-combo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Trilho de ferrovia com pré-sinais e sinais de trajeto +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Trilho de ferrovia com pré-sinais de trajeto e de mão única +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Trilho de ferrovia com sinais de saída e sinais-combo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Trilho de ferrovia com sinais de saída e de trajeto +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Trilho de ferrovia com sinais de saída de trajeto e de mão única +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Trilho de ferrovia com sinais-combo e de trajeto +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Trilho de ferrovia com sinais-combo de trajeto e de mão única +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Trilho de ferrovia com sinais de trajeto normais e de mão única +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Depósito de ferrovia STR_LAI_ROAD_DESCRIPTION_ROAD :Rodovia STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Rodovia iluminada @@ -2688,7 +2699,53 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :O terreno é pr STR_ABOUT_OPENTTD :{WHITE}Sobre o OpenTTD... STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyright original {COPYRIGHT} 1995 Chris Sawyer, Todos os direitos reservados STR_ABOUT_VERSION :{BLACK}OpenTTD versão {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 A equipe do OpenTTD +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 @@ -2875,7 +2932,7 @@ STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Vai para STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}"Sprite" anterior STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Retorna ao "sprite" normal anterior, pulando quaisquer "sprites" falsos, recoloridos ou de fontes, e junta tudo do primeiro ao último STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Representação do "sprite" atualmente selecionado. O alinhamento é ignorado ao desenhar esse "sprite" -STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Move o "sprite", alterando os offsets X e Y +STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Move o "sprite", alterando os offsets X e Y. Ctrl+Clique para mover o sprite 8 unidades por vez STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Resetar relativo STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Reseta os offsets relativos atuais STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X offset: {NUM}, Y offset: {NUM} (Absoluto) @@ -2907,8 +2964,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Tentativa de us STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} contém um sprite corrupto. Todos os sprites corruptos serão exibidos como um "?" vermelho STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Contém multiplas entradas de Ação 8 (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Leitura após o final do pseudo-sprite (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Estão faltando alguns sprites na base de gráficos em uso.{}Por favor atualize a base de gráficos -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}O pacote de gráficos base atuais está faltando alguns sprites.{}Favor atualizar o pacote de gráficos base.{}Já que você está usando um {YELLOW}snapshot em desenvolvimento do OpenTTD{WHITE}, você também precisa do {YELLOW}Snapshot do pacote de gráficos base em desenvolvimento{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Recursos GRF requeridos indisponíveis (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} foi desativado por {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Formato de layout de sprite inválido/desconhecido (sprite {3:NUM}) @@ -2976,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} @@ -2983,8 +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_PASSENGERS_LAST_MONTH_MAX :{BLACK}Passageiros no mês passado: {ORANGE}{COMMA}{BLACK} máx: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Cartas no mês passado: {ORANGE}{COMMA}{BLACK} máx: {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 @@ -3115,8 +3170,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Aceita STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Exibir lista de carga aceita STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Aceita: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Essa estação tem direitos de transporte exclusivos nessa cidade. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} adquiriu direitos exclusivos de transporte nessa cidade. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Essa estação tem direitos de transporte exclusivos nessa cidade. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} adquiriu direitos exclusivos de transporte nessa cidade. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Avaliações STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Exibir avaliações da estação @@ -3295,9 +3350,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Requer: STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Requer: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Necessita: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} aguardando{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Carga aguardando processamento -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produz: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Produz: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3364,6 +3421,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Remover todos o STR_GROUP_RENAME_CAPTION :{BLACK}Renomear um grupo +STR_GROUP_PROFIT_THIS_YEAR :Lucros deste ano: +STR_GROUP_PROFIT_LAST_YEAR :Lucros do ano passado: +STR_GROUP_OCCUPANCY :Uso atual: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Novos Veículos Ferroviários STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nova Locomotiva Elétrica @@ -3395,6 +3457,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Todos as cargas STR_PURCHASE_INFO_ALL_BUT :Todas menos {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Tração máx : {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Alcance: {GOLD}{COMMA} quadrados +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Tipo de aeronave: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista de trens - clique num trem para informações. Cltr+Clique para alterar a visibilidade do tipo de trem STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Lista de automóveis - clique num automóvel para informações. Cltr+Clique para alterar a visibilidade do tipo de automóvel @@ -3528,10 +3591,11 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :locomotiva magl STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Preço: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocidade: {VELOCITY} Potência: {POWER}{}Custo de manutenção: {CURRENCY_LONG}/ano{}Capacidade: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Preço: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Vel.: {VELOCITY} Potência: {POWER} Tração Máx: {6:FORCE}{}Custo de manutenção: {4:CURRENCY_LONG}/yr{}Capacidade: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Preço: {CURRENCY_LONG} Vel. Max.: {VELOCITY}{}Capacidade: {CARGO_LONG}, {CARGO_LONG}{}Custo de manutenção: {CURRENCY_LONG}/ano -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Preço: {CURRENCY_LONG} Vel. Max.: {VELOCITY}{}Capacidade: {CARGO_LONG}{}Custo de manuteção: {CURRENCY_LONG}/ano -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Preço: {CURRENCY_LONG} Vel. Máx.: {VELOCITY} Alcance: {COMMA} quadrados{}Capacidade: {CARGO_LONG}, {CARGO_LONG}{}Cust de manut.: {CURRENCY_LONG}/ano -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Vel. Máx.: {VELOCITY} Alcance: {COMMA} quadrados{}Capacidade: {CARGO_LONG}{}Custo de manut.: {CURRENCY_LONG}/ano +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Preço: {CURRENCY_LONG} Vel. Max.: {VELOCITY}{}Capacidade: {CARGO_LONG}{}Custo de manuteção: {CURRENCY_LONG}/ano +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Vel Máx.: {VELOCITY}{}Tipo de aeronave: {STRING}{}Capacidade: {CARGO_LONG}, {CARGO_LONG}{}Custo de oper.: {CURRENCY_LONG}/ano +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Vel Máx.: {VELOCITY}{}Tipo de aeronave: {STRING}{}Capacidade: {CARGO_LONG}{}Custo de oper.: {CURRENCY_LONG}/ano +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Vel. Máx.: {VELOCITY}{}Tipo de aeronave: {STRING} Alcance: {COMMA} quadrados{}Capacidade: {CARGO_LONG}, {CARGO_LONG}{}Custo de oper.: {CURRENCY_LONG}/ano +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Vel. Máx.: {VELOCITY}{}Tipo de aeronave: {STRING} Alcance: {COMMA} quadrados{}Capacidade: {CARGO_LONG}{}Custo de oper.: {CURRENCY_LONG}/ano # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Substituir {STRING} - {STRING} @@ -3558,10 +3622,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} quando STR_REPLACE_VEHICLES_STOP :{BLACK}Parar Substituição STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Pressione para parar a subsituição do tipo de motor que selecionou à esquerda -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Substituindo: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Troca entre substituir máquinas e substituir vagões STR_REPLACE_ENGINES :Motores STR_REPLACE_WAGONS :Vagões +STR_REPLACE_ALL_RAILTYPE :Todos os veículos ferroviários STR_REPLACE_HELP_RAILTYPE :{BLACK}Escolha o tipo de ferrovia para o qual deseja efetuar a substituição dos motores STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Exibe o tipo de motor que substituirá o que está selecionado à esquerda, se algum @@ -3654,7 +3718,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} ano{P " STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} ano{P "" s} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Velocidade Max: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{G=f}{BLACK}Vel. máx.: {LTBLUE}{VELOCITY} {BLACK}Alcance: {LTBLUE}{COMMA} quadrados +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Vel. Máx.: {LTBLUE}{VELOCITY} {BLACK}Tipo de aeronave: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Vel. Máx.: {LTBLUE}{VELOCITY} {BLACK}Tipo de aeronave: {LTBLUE}{STRING} {BLACK}Alcance: {LTBLUE}{COMMA} quadrados STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Força: {LTBLUE}{POWER}{BLACK} Velocidade Max: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Força: {LTBLUE}{POWER}{BLACK} Velocidade Max: {LTBLUE}{VELOCITY} {BLACK}Max. T.E.: {LTBLUE}{FORCE} @@ -3785,7 +3850,7 @@ STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE :Percentual carr STR_ORDER_CONDITIONAL_RELIABILITY :Confiabilidade STR_ORDER_CONDITIONAL_MAX_SPEED :Velocidade máxima STR_ORDER_CONDITIONAL_AGE :Idade (anos) -STR_ORDER_CONDITIONAL_REQUIRES_SERVICE :Necessia de manutenção +STR_ORDER_CONDITIONAL_REQUIRES_SERVICE :Necessita de manutenção STR_ORDER_CONDITIONAL_UNCONDITIONALLY :Sempre STR_ORDER_CONDITIONAL_REMAINING_LIFETIME :Tempo de vida restante (anos) @@ -4213,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... @@ -4221,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... @@ -4289,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... @@ -4472,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 a131edb04f..d085371987 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -473,9 +473,9 @@ STR_ABOUT_MENU_SCREENSHOT :Screenshot STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Напълно увеличен в кадъра. STR_ABOUT_MENU_DEFAULTZOOM_SCREENSHOT :Увеличение по подразбиране STR_ABOUT_MENU_GIANT_SCREENSHOT :Огромен Screenshot -STR_ABOUT_MENU_ABOUT_OPENTTD :За 'OpenTTD' +STR_ABOUT_MENU_ABOUT_OPENTTD :Относно 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Подравнител на спрайтове -STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Превключва слепване на прозците +STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Активиране слепване на прозорците STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Превключва оцветяване на замърсените блокове ############ range ends here @@ -667,10 +667,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Избе STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Активирай/деактивирай разместване на парчетата STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Покажи прозореца за избор на музикални парчета -STR_ERROR_NO_SONGS :{WHITE}Музикален пакет без песни е избран. Няма да се пускат песни. - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Избор на музикалната програма STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Номер на песен STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Програма - '{STRING}' @@ -755,6 +752,7 @@ STR_SMALLMAP_TOOLTIP_ENABLE_ALL_INDUSTRIES :{BLACK}Пока STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Показване/скриване на височинна карта STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}Скриване на собствеността на компанията от картата STR_SMALLMAP_TOOLTIP_ENABLE_ALL_COMPANIES :{BLACK}Показване на цялата собственост на компанията на картата +STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Покажи всички товари на картата # Status bar messages STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Покажи последното съобщение или отчет на новините @@ -1282,6 +1280,7 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Показва STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Дебелина на линиите в графиките: {STRING} STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Дебелина на линиите в графиките. Тънките линии са по-лесни за разчитане, но по-дебелите се забелязват и разграничават по-лесно. +STR_CONFIG_SETTING_LANDSCAPE :Пейзаж: {STRING} STR_CONFIG_SETTING_LAND_GENERATOR :Генератор на земя: {STRING} STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :оригинален STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :тера-генезис @@ -1293,6 +1292,7 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :много по STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :полегат STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :стръмен STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :много стръмен +STR_CONFIG_SETTING_RIVER_AMOUNT :Количество на реките: {STRING} STR_CONFIG_SETTING_TREE_PLACER :Алгоритъм за поставяне на дървета: {STRING} STR_CONFIG_SETTING_TREE_PLACER_NONE :без дървета STR_CONFIG_SETTING_TREE_PLACER_ORIGINAL :оригинален @@ -1317,8 +1317,6 @@ 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_REVERSE_SCROLLING :Обърната посока на преместване: {STRING.n} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Когато опцията бъде активирана, когато "скролвате" картата с десния бутон на мишката ще местите картата, когато опцията не е активирана, мишката ще мести камерата STR_CONFIG_SETTING_SMOOTH_SCROLLING :Плавно местене на камера: {STRING.n} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Ако опцията е активирана, когато натиснете на малката карта камерата ще се придвижи до там плавно, ако не е активирана камерата ще отиде там директно STR_CONFIG_SETTING_MEASURE_TOOLTIP :Подсказка за разстояние при строене: {STRING.f} @@ -1350,8 +1348,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Команда- STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Контрол-щракане STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Изключен -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Скролиране с ляв бутон: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Позволява да "скролнете" картата, чрез влачене на левия бутон на мишката. Това и изключително полезно ако ползвате тъч-скрийн STR_CONFIG_SETTING_AUTOSAVE :Автоматично запазване: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Изберете интервал между автоматично запаметяване на играта @@ -1584,6 +1580,7 @@ STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Без STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Множител за големината на града: {STRING} STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Относителен размер на мегаполисите в сравнение с градовете в началото на играта +STR_CONFIG_SETTING_DEMAND_SIZE :Количество на връщания товар при симетричнен режим: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :Единици за скорост: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Всеки път при показване на скорости, да бъдат изписвани в избраните мерни единици @@ -1624,9 +1621,11 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) STR_CONFIG_SETTING_LOCALISATION :{ORANGE}Позициониране STR_CONFIG_SETTING_SOUND :{ORANGE}Звукови ефекти STR_CONFIG_SETTING_INTERFACE :{ORANGE}Интерфейс +STR_CONFIG_SETTING_INTERFACE_GENERAL :{ORANGE}Основни STR_CONFIG_SETTING_INTERFACE_CONSTRUCTION :{ORANGE}Строене STR_CONFIG_SETTING_VEHICLES :{ORANGE}Автомобили STR_CONFIG_SETTING_VEHICLES_ROUTING :{ORANGE}Маршрутизация +STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :{ORANGE}Права STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :{ORANGE}Градове STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}Индустрии STR_CONFIG_SETTING_AI :{ORANGE}Съперници @@ -2530,6 +2529,7 @@ STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Приет товар: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Ограничение на скоростта на линията: {LTBLUE}{VELOCITY} +STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Макс. скорост на пътя: {LTBLUE}{VELOCITY} # Description of land area of different tiles STR_LAI_CLEAR_DESCRIPTION_ROCKS :Скали @@ -2540,29 +2540,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Поля STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Заснежена земя STR_LAI_CLEAR_DESCRIPTION_DESERT :Пустиня -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} линия -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} линия с блокиращи сигнали -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} линия с пре-сигнали -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} линия с изходни сигнали -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} линия с комбо сигнали -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} линия с насочващи сигнали -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} линия с еднопосочни сигнали -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} линия с блокиращи и пре-сигнали -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} линия с блокиращи и изходни сигнали -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} линия с блокиращи и комбо сигнали -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} линия с блокиращи и насочващи сигнали -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} линия с блокиращи и еднопосочни сигнали -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} линия с пред и изходни сигнали -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} линя с пред и комбо сигнали -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} линия с пред и насочващи сигнали -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} линия с пред и еднопосочни сигнали -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} линия с изходни и комбо сигнали -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} линия с изходни и насочващи сигнали -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} линия с изходни и еднопосочни сигнали -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} линия с комбо и насочващи сигнали -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} линия с комбо и еднопосочни сигнали -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} линия с насочващи и еднопосочни сигнали -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} влаково депо +STR_LAI_RAIL_DESCRIPTION_TRACK :ЖП път линия +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :ЖП път линия с блокиращи сигнали +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :ЖП път линия с пре-сигнали +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :ЖП път линия с изходни сигнали +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :ЖП път линия с комбо сигнали +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :ЖП път линия с насочващи сигнали +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :ЖП път линия с еднопосочни сигнали +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :ЖП път линия с блокиращи и пре-сигнали +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :ЖП път линия с блокиращи и изходни сигнали +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :ЖП път линия с блокиращи и комбо сигнали +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :ЖП път линия с блокиращи и насочващи сигнали +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :ЖП път линия с блокиращи и еднопосочни сигнали +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :ЖП път линия с пред и изходни сигнали +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :ЖП път линя с пред и комбо сигнали +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :ЖП път линия с пред и насочващи сигнали +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :ЖП път линия с пред и еднопосочни сигнали +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :ЖП път линия с изходни и комбо сигнали +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :ЖП път линия с изходни и насочващи сигнали +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :ЖП път линия с изходни и еднопосочни сигнали +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :ЖП път линия с комбо и насочващи сигнали +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :ЖП път линия с комбо и еднопосочни сигнали +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :ЖП път линия с насочващи и еднопосочни сигнали +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :ЖП път влаково депо STR_LAI_ROAD_DESCRIPTION_ROAD :път STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Асфалтов път с улично осветление @@ -2626,7 +2626,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Земя, пр STR_ABOUT_OPENTTD :{WHITE}Относно OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Авторски права {COPYRIGHT} 1995 Крис Сойер (Chris Sawyer), Всички права са запазени STR_ABOUT_VERSION :{BLACK}OpenTTD версия {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2015 The OpenTTD team +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}Запази играта @@ -2776,7 +2783,7 @@ STR_NEWGRF_SETTINGS_INCOMPATIBLE :{G=n}{RED}Не # NewGRF save preset window STR_SAVE_PRESET_TITLE :{BLACK}Въведи име за шаблона STR_SAVE_PRESET_EDITBOX_TOOLTIP :{BLACK}Текущо избраното име за именуване на шаблона -STR_SAVE_PRESET_CANCEL :Отказ +STR_SAVE_PRESET_CANCEL :{BLACK}Отказ STR_SAVE_PRESET_CANCEL_TOOLTIP :{BLACK}Не променяй шаблона STR_SAVE_PRESET_SAVE :{BLACK}Запис STR_SAVE_PRESET_SAVE_TOOLTIP :{BLACK}Запази шаблона за текущо избраното име @@ -2838,8 +2845,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Опит за STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} съдържа повреден обект. Вскички повредени обекти ще бъдат показани като червена въпросителна (?). STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Contains multiple Action 8 entries (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Read past end of pseudo-sprite (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Текущите основни графики имат празни картинки.{}Моля обновете си основните графики. -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Текущо използвания графичен сет има липсващи спрайтове.{}Моля обновете графичния сет.{}Тъй като играете {YELLOW}версия на OpenTTD в процес на разработка{WHITE}, може да се нуждаете и от {YELLOW}версията на графичния сет, която е в разработка{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Изискваните GRF resources не са на разположение (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} беше изключено от {2:STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Invalid/unknown sprite layout format (sprite {3:NUM}) @@ -2913,8 +2918,6 @@ 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_PASSENGERS_LAST_MONTH_MAX :{BLACK}Пътници през последния месец: {ORANGE}{COMMA}{BLACK} максимум: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Поща през последния месец: {ORANGE}{COMMA}{BLACK} максимум: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Товар нужен за растеж на града: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} необходим STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} необходим през зимата @@ -3012,6 +3015,7 @@ STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Натисни върху услугата за да се фокусира върху индустрията/града. Ctrl отваря нов изглед към индустрията/града # Story book window +STR_STORY_BOOK_SEL_PAGE_TOOLTIP :{BLACK}Прескочи до определена страница чрез избирането й в дроп-даун листата. STR_STORY_BOOK_NEXT_PAGE :{BLACK}Следваща STR_STORY_BOOK_NEXT_PAGE_TOOLTIP :{BLACK}Отиди на следващата страница STR_STORY_BOOK_INVALID_GOAL_REF :{RED}Невалидна цел @@ -3037,8 +3041,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Прие STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Покажи списък с приетите товари STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Приема: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Тази станция има специални транспортни привилегии за града -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} закупи специални транспортни привилегии за града. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Тази станция има специални транспортни привилегии за града +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} закупи специални транспортни привилегии за града. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Рейтинги STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Покажи нивото на обслужване @@ -3216,9 +3220,9 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Нужд STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Нуждае се от: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} чакащ{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Товар чакащ до бъде преработен: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Произвежда: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Произвежда: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3277,12 +3281,17 @@ STR_GROUP_DELETE_TOOLTIP :{BLACK}Изтр STR_GROUP_RENAME_TOOLTIP :{BLACK}Преименувай избраната група STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Щракни да защитиш тази група от глобална автоматична замяна +STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Изтрий група +STR_GROUP_DELETE_QUERY_TEXT :{WHITE}Сигурен ли си, че искаш да изтриеш тази група и нейните производни? STR_GROUP_ADD_SHARED_VEHICLE :Добави споделени превозни средства STR_GROUP_REMOVE_ALL_VEHICLES :Премахни всички превозни средсва STR_GROUP_RENAME_CAPTION :{BLACK}Преименовай група +STR_GROUP_OCCUPANCY :Използва се за: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Нови Машини за Двурелсов път STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Нови електрически влакове @@ -3447,10 +3456,8 @@ 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_CAPACITY_CAPACITY_RUNCOST :{BLACK}Цена: {CURRENCY_LONG} Макс. Скорост: {VELOCITY}{}Вместимост: {CARGO_LONG}, {CARGO_LONG}{}Експлоатационни разходи: {CURRENCY_LONG}/год. -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Цена: {CURRENCY_LONG} Макс. Скорост: {VELOCITY}{}Вместимост: {CARGO_LONG}{}Експлоатационни разходи: {CURRENCY_LONG}/год. -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Цена: {CURRENCY_LONG} Макс. Скорост: {VELOCITY} Обхват: {COMMA} полета{}Капацитет: {CARGO_LONG}, {CARGO_LONG}{}Транспортни разходи: {CURRENCY_LONG}/година -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Цена: {CURRENCY_LONG} Макс. Скорост: {VELOCITY} Обхват: {COMMA} полета{}Капацитет: {CARGO_LONG}{}Транспортни разходи: {CURRENCY_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_RUNCOST :{BLACK}Цена: {CURRENCY_LONG} Макс.скорост: {VELOCITY}{}Тип самолет: {STRING}{}Вместимост: {CARGO_LONG}{}Оперативни разходи: {CURRENCY_LONG}/yr # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Замяна {STRING} - {STRING} @@ -3477,10 +3484,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} ког STR_REPLACE_VEHICLES_STOP :{BLACK}Спиране на замяната STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Натиснете за спиране подновяването на избрания в ляво двигател -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Замяна: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Превключване между замяна на локомотиви и вагони STR_REPLACE_ENGINES :Двигатели STR_REPLACE_WAGONS :Вагони +STR_REPLACE_ALL_RAILTYPE :Всички ЖП композиции STR_REPLACE_HELP_RAILTYPE :{BLACK}Избор на ЖП линия с която да се заменят локомотивите STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Показване с кой двигател се заменя ляво избрания, ако има @@ -3573,7 +3580,6 @@ STR_VEHICLE_INFO_AGE :{COMMA} год STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} годин{P а и} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Макс. скорост: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Макс. скорост: {LTBLUE}{VELOCITY} {BLACK}Обхват: {LTBLUE}{COMMA} полета STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Тегло: {LTBLUE}{WEIGHT_SHORT} {BLACK}Мощност: {LTBLUE}{POWER}{BLACK} Макс. Скорост: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Тегло: {LTBLUE}{WEIGHT_SHORT} {BLACK}Мощност: {LTBLUE}{POWER}{BLACK} Макс. Скорост: {LTBLUE}{VELOCITY} {BLACK}Макс. Т.С.: {LTBLUE}{FORCE} @@ -4127,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}Станцията не може да бъде преименувана... @@ -4275,6 +4280,7 @@ STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... ви STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Групата неможе да бъде създадена... STR_ERROR_GROUP_CAN_T_DELETE :{WHITE}Тази група неможе да бъде изтрита... STR_ERROR_GROUP_CAN_T_RENAME :{WHITE}Групата неможе да бъде преименована... +STR_ERROR_GROUP_CAN_T_SET_PARENT :{WHITE}Не може да избере горна група.... STR_ERROR_GROUP_CAN_T_REMOVE_ALL_VEHICLES :{WHITE}Всички превозни средства немогат да бъдат премахнати от тази група... STR_ERROR_GROUP_CAN_T_ADD_VEHICLE :{WHITE}Превозното средство неможе да се добави към тази група... STR_ERROR_GROUP_CAN_T_ADD_SHARED_VEHICLE :{WHITE}Поделени превозни средсва немогат да бъдат добавени към групата... diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index 8d28a391da..cc641141af 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -326,8 +326,8 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Mostra l STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Mostra la informació general de la companyia STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Mostra el llibre de partida STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Mostra la llista d'objectius -STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Mostra gràfics de les empreses -STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Mostra la taula de la lliga d'empreses +STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Mostra gràfics de l'evolució de les companyies i les tarifes de transport. +STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Mostra la taula de la lliga de companyies. STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Finança la construcció d'una nova indústria STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Mostra la llista de trens de la companyia. Ctrl+Clic commuta l'obertura de la llista de grups/vehicles. STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Mostra la llista de vehicles de la companyia. Ctrl+Clic commuta l'obertura de la llista de grups/vehicles. @@ -416,12 +416,12 @@ STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH :Gràfic de bene STR_GRAPH_MENU_INCOME_GRAPH :Gràfic d'ingressos STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH :Gràfic d'entrega de càrrega STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH :Gràfic històric de rendiment -STR_GRAPH_MENU_COMPANY_VALUE_GRAPH :Gràfic del valor de les empreses +STR_GRAPH_MENU_COMPANY_VALUE_GRAPH :Gràfic del valor de les companyies STR_GRAPH_MENU_CARGO_PAYMENT_RATES :Tarifes de pagament per càrrega ############ range ends here ############ range for company league menu starts -STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE :Taula de la lliga d'empreses +STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE :Taula de la lliga de companyies STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING :Detall de ratis de rendiment STR_GRAPH_MENU_HIGHSCORE :Taula de puntuacions ############ range ends here @@ -436,7 +436,7 @@ STR_INDUSTRY_MENU_FUND_NEW_INDUSTRY :Finança una no STR_RAIL_MENU_RAILROAD_CONSTRUCTION :Construcció de ferrocarril STR_RAIL_MENU_ELRAIL_CONSTRUCTION :Construcció de ferrocarril elèctric STR_RAIL_MENU_MONORAIL_CONSTRUCTION :Construcció de monorail -STR_RAIL_MENU_MAGLEV_CONSTRUCTION :Construcció de Maglev +STR_RAIL_MENU_MAGLEV_CONSTRUCTION :Construcció de maglev ############ range ends here ############ range for road construction menu starts @@ -476,8 +476,9 @@ 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 d'sprites +STR_ABOUT_MENU_SPRITE_ALIGNER :Alineador de sprites STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Commuta les caixes delimitadores STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Commuta l'acoloriment de blocs bruts ############ range ends here @@ -593,7 +594,7 @@ STR_GRAPH_KEY_CAPTION :{WHITE}Llegenda STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Clica aquí per mostrar/amagar la companyia al gràfic # Company league window -STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Taula de la lliga d'empreses +STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Taula de la lliga de companyies STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPANY} {BLACK}{COMPANY_NUM} «{STRING}» STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER :Enginyer STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER :Director de trànsit @@ -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 @@ -670,21 +672,21 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Seleccio STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Habilita/deshabilita la reproducció en ordre aleatori STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Mostra la finestra de selecció de pistes -STR_ERROR_NO_SONGS :{WHITE}S'ha seleccionat un conjunt de música sense peces. No es reproduirà res. - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Selecció de les peces de la llista +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) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Principals empreses en arribar al {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Taula de la lliga d'empreses a {NUM} +STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Principals companyies que han arribat al {NUM} +STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Taula de la lliga de companyies a {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Empresari STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Emprenedor @@ -802,9 +804,9 @@ STR_NEWS_DISASTER_BIG_UFO :{BIG_FONT}{BLAC STR_NEWS_DISASTER_COAL_MINE_SUBSIDENCE :{BIG_FONT}{BLACK}L'enfonsament d'una mina de carbó deixa un rastre de destrucció prop de {TOWN}! STR_NEWS_DISASTER_FLOOD_VEHICLE :{BIG_FONT}{BLACK}Inundacions{}Almenys {COMMA} desapareguts, possiblement morts, després de les inundacions! -STR_NEWS_COMPANY_IN_TROUBLE_TITLE :{BIG_FONT}{BLACK}Empresa de transport en dificultats! +STR_NEWS_COMPANY_IN_TROUBLE_TITLE :{BIG_FONT}{BLACK}Companyia de transport en dificultats! STR_NEWS_COMPANY_IN_TROUBLE_DESCRIPTION :{BIG_FONT}{BLACK}{STRING} ha de ser venuda o declarar-se en fallida a menys que el seu rendiment incrementi aviat! -STR_NEWS_COMPANY_MERGER_TITLE :{BIG_FONT}{BLACK}Fusió d'empreses de transport +STR_NEWS_COMPANY_MERGER_TITLE :{BIG_FONT}{BLACK}Fusió de companyies de transport STR_NEWS_COMPANY_MERGER_DESCRIPTION :{BIG_FONT}{BLACK}{STRING} s'ha venut a {STRING} per {CURRENCY_LONG}! STR_NEWS_COMPANY_BANKRUPT_TITLE :{BIG_FONT}{BLACK}Fallida! STR_NEWS_COMPANY_BANKRUPT_DESCRIPTION :{BIG_FONT}{BLACK}{STRING} ha estat tancada pels creditors i s'han venut tots els seus actius @@ -881,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 @@ -975,7 +977,7 @@ STR_GAME_OPTIONS_LANGUAGE :{BLACK}Idioma STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Selecciona l'idioma de la interfície STR_GAME_OPTIONS_FULLSCREEN :{BLACK}Pantalla completa -STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP :{BLACK}Marca la casella per tenir l'OpenTTD en pantalla completa +STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP :{BLACK}Marqueu la casella per mostrar l'OpenTTD a pantalla completa. STR_GAME_OPTIONS_RESOLUTION :{BLACK}Resolució de pantalla STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Selecciona la resolució de pantalla @@ -1119,9 +1121,9 @@ STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_MENU :Paràmetres de STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME :Paràmetres de la partida (emmagatzemats a la partida actual; només afecten la partida actual) STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Paràmetres de la companyia (emmagatzemats a les partides desades; només afectaran les partides noves) STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Paràmetres de la companyia (emmagatzemats a la partida actual; només afecten la companyia actual) -STR_CONFIG_SETTING_CATEGORY_HIDES :{BLACK}Mostra tots els resultats de la cerca filtrada de {WHITE}{STRING} +STR_CONFIG_SETTING_CATEGORY_HIDES :{BLACK}Mostra tots els resultats establint {SILVER}«Categoria» {BLACK}a {WHITE}«{STRING}»{BLACK}. STR_CONFIG_SETTING_TYPE_HIDES :{BLACK}Mostrar tots els resultats de la cerca filtrada amb {WHITE}tots els tipus de paràmetres -STR_CONFIG_SETTING_CATEGORY_AND_TYPE_HIDES :{BLACK}Mostra tots els resultats de la cerca filtrada de {WHITE}{STRING} {BLACK}i {WHITE}tots els tipus d'ajustaments +STR_CONFIG_SETTING_CATEGORY_AND_TYPE_HIDES :{BLACK}Mostra tots els resultats de la cerca establint {SILVER}«Categoria» {BLACK}a {WHITE}«{STRING}» {BLACK}i {SILVER}«Tipus» {BLACK}a {WHITE}«Tots els paràmetres»{BLACK}. STR_CONFIG_SETTINGS_NONE :{WHITE}- Cap - STR_CONFIG_SETTING_OFF :Inactiu @@ -1129,8 +1131,8 @@ STR_CONFIG_SETTING_ON :Actiu STR_CONFIG_SETTING_DISABLED :Desactivat STR_CONFIG_SETTING_COMPANIES_OFF :Inactiu -STR_CONFIG_SETTING_COMPANIES_OWN :Pròpia companyia -STR_CONFIG_SETTING_COMPANIES_ALL :Totes les companyies +STR_CONFIG_SETTING_COMPANIES_OWN :Només de la companyia pròpia +STR_CONFIG_SETTING_COMPANIES_ALL :De totes les companyies STR_CONFIG_SETTING_NONE :Cap STR_CONFIG_SETTING_ORIGINAL :Original @@ -1160,16 +1162,16 @@ STR_CONFIG_SETTING_TRAIN_REVERSING :No permetis que STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Si està actiu, els trens no canviaran de sentit a les estacions no-finals, inclús si hi ha un camí més curt al seu proper destí en cas de canviar de sentit. STR_CONFIG_SETTING_DISASTERS :Catàstrofes: {STRING} STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Permet o no que passin catàstrofes que puguin bloquejar o destruir ocasionalment vehicles o infraestructures -STR_CONFIG_SETTING_CITY_APPROVAL :Actitud de l'alcaldia de la població davant de reestructuracions a la zona: {STRING} -STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Estableix quin nivell de soroll i de danys ambientals fets per les companyies afecten al seu prestigi davant de la població i futures accions de construcció a la zona +STR_CONFIG_SETTING_CITY_APPROVAL :Actitud de l'alcaldia de la població enfront les reestructuracions a la zona: {STRING} +STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Establiu com afecta al prestigi de les companyies el soroll i els danys ambientals que provoquen. Aquest prestigi influirà en la futura acceptació o denegació d'accions de construcció a la zona. STR_CONFIG_SETTING_MAX_HEIGHTLEVEL :Alçada màxima del mapa: {STRING} STR_CONFIG_SETTING_MAX_HEIGHTLEVEL_HELPTEXT :Estableix l'alçada màxima permesa del terreny en el mapa STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}No es pot escollir aquesta alçada màxima del mapa: hi ha alguna zona del mapa actual que és més alta. STR_CONFIG_SETTING_AUTOSLOPE :Permet la modificació del terreny sota edificis, rails, etc.: {STRING} -STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Permet modelar el terreny sota edificis i rails, sense eliminar-los +STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Permet modelar el terreny sota les vies, els edificis i altres elements sense eliminar-los. STR_CONFIG_SETTING_CATCHMENT :Estableix una mida més real de l'àrea d'influència: {STRING} -STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Permet tenir diferents mides de zones de captació per a diferents tipus d'estacions i aeroports +STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Permet tenir diferents mides de zones de captació de càrrega per diferents tipus d'estacions (aeroports, estacions de tren, etc.). STR_CONFIG_SETTING_EXTRADYNAMITE :Permet l'esborrat de carreteres, ponts i túnels propietat de les poblacions: {STRING} STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT :Aquesta opció permet fer més fàcil l'esborrat d'infraestructures i construccions propietat de la població STR_CONFIG_SETTING_TRAIN_LENGTH :Longitud màxima dels trens: {STRING} @@ -1214,7 +1216,7 @@ STR_CONFIG_SETTING_SIGNALSIDE_DRIVING_SIDE :Al costat de co STR_CONFIG_SETTING_SIGNALSIDE_RIGHT :A la dreta STR_CONFIG_SETTING_SHOWFINANCES :Mostra la finestra de balanç al finalitzar cada any: {STRING} STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :Si el paràmetre està activat, la finestra de finances apareix al final de cada any per permetre una inspecció fàcil de l'estat financer de la companyia. -STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :«Sense parada» per defecte a les noves ordres : {STRING} +STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :«Sense parada» per defecte a les ordres noves: {STRING} STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normalment, un vehicle para a cada estació per la que passa. Activant aquest paràmetre, no pararà a cap estació fins arribar al seu destí. Nota: aquest paràmetre només defineix el valor predeterminat per a les noves ordres. Un cop creada una ordre, aquesta es pot establir manualment al comportament desitjat. STR_CONFIG_SETTING_STOP_LOCATION :Noves ordres de trens: parar per defecte {STRING} de la plataforma STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Estableix en quin lloc de la plataforma els trens pararan per defecte. «Extrem més proper» significa a prop del punt d'entrada, «Al mig» significa al mig de la plataforma, i «Extrem més llunyà» significa lluny del punt d'entrada. Nota: aquest paràmetre només defineix el valor predeterminat per les noves ordres. Un cop creada una ordre, es pot modificar el comportament de forma manual. @@ -1222,7 +1224,7 @@ STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :A l'extrem més STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :Al mig STR_CONFIG_SETTING_STOP_LOCATION_FAR_END :A l'extrem més llunyà STR_CONFIG_SETTING_AUTOSCROLL :Desplaça la finestra quan el ratolí sigui prop de la vora: {STRING} -STR_CONFIG_SETTING_AUTOSCROLL_HELPTEXT :Quan està activat, l'àrea de visualització començarà a desplaçar-se quan el ratolí sigui prop de la vora de la finestra. +STR_CONFIG_SETTING_AUTOSCROLL_HELPTEXT :Si s'activa aquesta opció, l'àrea de visualització començarà a desplaçar-se quan el ratolí sigui prop de la vora de la finestra. STR_CONFIG_SETTING_AUTOSCROLL_DISABLED :Desactivat STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT_FULLSCREEN :Vista principal (només pantalla completa) STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT :Vista principal @@ -1232,11 +1234,11 @@ STR_CONFIG_SETTING_BRIBE_HELPTEXT :Permet a les co STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Permet comprar els drets del transport en exclusiva: {STRING} STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Si una companyia compra els drets de transport en exclusiva d'una població, les estacions dels oponents (passatgers i càrrega) no rebran cap càrrega durant un any sencer. STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Permet finançar edificis: {STRING} -STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :Permet a les companyies donar diners a les poblacions per finançar nous edificis +STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :Permet a les companyies donar diners a les poblacions per finançar nous edificis. STR_CONFIG_SETTING_ALLOW_FUND_ROAD :Permet finançar la reconstrucció dels carrers locals: {STRING} STR_CONFIG_SETTING_ALLOW_FUND_ROAD_HELPTEXT :Permet a les companyies donar diners a les poblacions per la reconstrucció de carrers i sabotejar la circulació de vehicles. STR_CONFIG_SETTING_ALLOW_GIVE_MONEY :Permet enviar diners a altres companyies: {STRING} -STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :Permet transferir diners entre companyies en el mode multijugador +STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :Permet transferir diners entre companyies en el mode multijugador. STR_CONFIG_SETTING_FREIGHT_TRAINS :Multiplicador de pes per simular trens pesats: {STRING} STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :Estableix l'impacte de transportar contenidors en trens. Els valors alts fan que transportar contenidors sigui més exigent amb els trens, especialment als turons. STR_CONFIG_SETTING_PLANE_SPEED :Factor de velocitat dels avions: {STRING} @@ -1270,13 +1272,13 @@ STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Quan està acti STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Els vehicles mai caduquen: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Quan està activat, tots els models de vehicles continuen disponibles per sempre després de la seva introducció STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Autorenova el vehicle quan sigui vell: {STRING} -STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Quan està activat, un vehicle que arriba al final de la seva vida útil és automàticament substituït quan es compleixen les condicions d'autorenovació -STR_CONFIG_SETTING_AUTORENEW_MONTHS :Autorenova el vehicle {STRING} de la seva edat màxima -STR_CONFIG_SETTING_AUTORENEW_MONTHS_HELPTEXT :Edat relativa a partir de la qual s'ha de considerar l'autorenovació del vehicle +STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Quan està activat, un vehicle que arriba al final de la seva vida útil és automàticament substituït quan es compleixen les condicions d'autorenovació. +STR_CONFIG_SETTING_AUTORENEW_MONTHS :Autorenova el vehicle {STRING} de la seva edat màxima. +STR_CONFIG_SETTING_AUTORENEW_MONTHS_HELPTEXT :Edat a partir de la qual s'ha de considerar l'autorenovació del vehicle. STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_BEFORE :{COMMA} mes{P 0 "" os} abans STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_AFTER :{COMMA} mes{P 0 "" os} després STR_CONFIG_SETTING_AUTORENEW_MONEY :Mínim de diners per a renovacions automàtiques: {STRING} -STR_CONFIG_SETTING_AUTORENEW_MONEY_HELPTEXT :Quantitat mínima de diners que han de quedar al banc abans de considerar l'autorenovació de vehicles +STR_CONFIG_SETTING_AUTORENEW_MONEY_HELPTEXT :Estableix la quantitat mínima de diners que han de quedar al banc abans de considerar l'autorenovació de vehicles. STR_CONFIG_SETTING_ERRMSG_DURATION :Duració del missatge d'error: {STRING} STR_CONFIG_SETTING_ERRMSG_DURATION_HELPTEXT :Duració dels missatges d'error mostrats en finestres vermelles. Alguns missatges d'error (crítics) no es tanquen automàticament i s'han de tancar manualment STR_CONFIG_SETTING_ERRMSG_DURATION_VALUE :{COMMA} segon{P 0 "" s} @@ -1338,8 +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_REVERSE_SCROLLING :En desplaçar la pantalla amb el ratolí mou la vista en la direcció contrària: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Comportament quan es desplaci el mapa amb el botó dret del ratolí. Quan està desactivat, el ratolí mou la càmera. Quan està activat, el ratolí mou el mapa +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} @@ -1371,11 +1377,11 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command-clic STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Control-clic STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Desactivat -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Desplaçament amb el botó esquerre: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Activa el desplaçament del mapa arrossegant-lo amb el botó esquerre del ratolí. Això és especialment útil quan s'utilitzen pantalles tàctils +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Tanca la finestra amb un clic dret del ratolí: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Tanca una finestra fent-hi un clic amb el botó dret del ratolí. Aquesta opció desactiva els indicadors de funció amb el mateix botó. STR_CONFIG_SETTING_AUTOSAVE :Desada automàtica: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Selecciona l'interval entre desades automàtiques de les partides +STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Selecciona l'interval entre desades automàtiques de les partides. STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Utilitza el format de data {STRING} per a guardar partides STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Format de la data en els noms dels arxius de les partides que es guardin @@ -1385,14 +1391,14 @@ STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_ISO :ISO (2008-12-31 STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME :Posa en pausa automàticament quan comenci una nova partida: {STRING} STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME_HELPTEXT :Quan està activat, el joc es posa en pausa automàticament quan es comenci una partida nova, permetent a l'usuari estudiar el mapa més detalladament -STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL :Quan s'estigui en pausa permet: {STRING} -STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_HELPTEXT :Selecciona quines accions poden fer-se quan la partida està en pausa -STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_NO_ACTIONS :Sense accions -STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_CONSTRUCTION :Totes les accions no-constructores -STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_LANDSCAPING :Tot menys les accions modificadores del paisatge -STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_ACTIONS :Totes les accions +STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL :Accions permeses mentre s'està fent una pausa a la partida: {STRING} +STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_HELPTEXT :Seleccioneu quines accions es poden realitzar mentre s'està fent una pausa a la partida. +STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_NO_ACTIONS :Cap +STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_CONSTRUCTION :Totes, excepte les de construcció +STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_LANDSCAPING :Totes, excepte les que modifiquen el paisatge +STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_ACTIONS :Totes STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS :Mostra els grups en el llistat de vehicles de la companyia: {STRING} -STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Activa la utilització de llistes de vehicles avançades per agrupar vehicles +STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Activa la utilització de llistes avançades de vehicles per agrupar vehicles. STR_CONFIG_SETTING_LOADING_INDICATORS :Utilitza indicadors de càrrega: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Selecciona si els indicadors de càrrega seran mostrats sobre els vehicles en càrrega o descàrrega STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Mostra horaris amb marques en lloc de dies: {STRING} @@ -1407,7 +1413,7 @@ STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :El més antic d STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_LAST :El més modern disponible STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_MOST_USED :El més utilitzat disponible STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION :Mostra els camins reservats: {STRING} -STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT :Dóna a les vies reservades un color diferent per ajudar en problemes de trens que refusen entrar en blocs basats en camí +STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT :Dóna a les vies reservades un color diferent per visualitzar problemes d'encaminament de trens STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Mantingues les eines de construcció actives després del seu ús: {STRING} STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT :Mantingues les eines de construcció pels ponts, túnels, etc. obertes després d'utilitzar-les STR_CONFIG_SETTING_EXPENSES_LAYOUT :Agrupa les despeses a la finestra de finances de la companyia: {STRING} @@ -1418,7 +1424,7 @@ STR_CONFIG_SETTING_SOUND_TICKER_HELPTEXT :Reprodueix un s STR_CONFIG_SETTING_SOUND_NEWS :Notícies: {STRING} STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT :Reprodueix un so quan apareix una notícia STR_CONFIG_SETTING_SOUND_NEW_YEAR :Cap d'any: {STRING} -STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :Reprodueix un efecte de so al final de l'any quan apareix el resum financer de l'any de l'empresa en comparació amb l'anterior +STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :Reprodueix un efecte de so al final de l'any quan apareix el resum financer de l'any de la companyia en comparació amb l'anterior STR_CONFIG_SETTING_SOUND_CONFIRM :Construcció: {STRING} STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT :Reprodueix un efecte de so quan es realitzin amb èxit construccions o altres accions STR_CONFIG_SETTING_SOUND_CLICK :Botons: {STRING} @@ -1441,23 +1447,23 @@ STR_CONFIG_SETTING_MAX_AIRCRAFT_HELPTEXT :Màxim nombre d STR_CONFIG_SETTING_MAX_SHIPS :Màxim nombre de vaixells per companyia: {STRING} STR_CONFIG_SETTING_MAX_SHIPS_HELPTEXT :Màxim nombre de vaixells que pot tenir una companyia -STR_CONFIG_SETTING_AI_BUILDS_TRAINS :Desactiva trens per a les IA de l'ordinador: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_TRAINS_HELPTEXT :Activant aquesta opció fa que sigui impossible construir trens als jugadors IA de l'ordinador -STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES :Desactiva automòbils per a les IA de l'ordinador: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES_HELPTEXT :Activant aquesta opció fa que sigui impossible construir automòbils als jugadors IA de l'ordinador -STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT :Desactiva avions per a les IA de l'ordinador: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT_HELPTEXT :Activant aquesta opció fa que sigui impossible construir avions als jugadors IA de l'ordinador -STR_CONFIG_SETTING_AI_BUILDS_SHIPS :Desactiva vaixells per a les IA de l'ordinador: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_SHIPS_HELPTEXT :Activant aquesta opció fa que sigui impossible construir vaixells als jugadors IA de l'ordinador +STR_CONFIG_SETTING_AI_BUILDS_TRAINS :Desactiva els trens per a les IA: {STRING} +STR_CONFIG_SETTING_AI_BUILDS_TRAINS_HELPTEXT :Activant aquesta opció fa que sigui impossible construir trens i altres vehicles que utilitzen rails als jugadors IA. +STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES :Desactiva els vehicles de carretera per a les IA: {STRING} +STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES_HELPTEXT :Activant aquesta opció fa que sigui impossible construir automòbils i altres vehicles de carretera als jugadors IA. +STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT :Desactiva les aeronaus per a les IA: {STRING} +STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT_HELPTEXT :Activant aquesta opció fa que sigui impossible construir aeronaus als jugadors IA. +STR_CONFIG_SETTING_AI_BUILDS_SHIPS :Desactiva els vaixells per a les IA: {STRING} +STR_CONFIG_SETTING_AI_BUILDS_SHIPS_HELPTEXT :Activant aquesta opció fa que sigui impossible construir vaixells als jugadors IA. STR_CONFIG_SETTING_AI_PROFILE :Perfil de paràmetres predeterminat: {STRING} -STR_CONFIG_SETTING_AI_PROFILE_HELPTEXT :Escull quin perfil de paràmetres utilitzar per les IA aleatòries o com a valors inicials quan s'afegeix una nova IA o Script de la partida +STR_CONFIG_SETTING_AI_PROFILE_HELPTEXT :Escolliu quin perfil de paràmetres utilitzar per les IA aleatòries o com a valors inicials quan s'afegeix una nova IA o script de la partida. STR_CONFIG_SETTING_AI_PROFILE_EASY :Fàcil STR_CONFIG_SETTING_AI_PROFILE_MEDIUM :Mitjà STR_CONFIG_SETTING_AI_PROFILE_HARD :Difícil STR_CONFIG_SETTING_AI_IN_MULTIPLAYER :Permet IA en multijugador: {STRING} -STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :Permet a les IA de l'ordinador participar en partides multijugador +STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :Permet a les IA participar en partides multijugador. STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :#opcodes abans de suspendre els scripts: {STRING} STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :Màxim nombre de passos de càlcul que un script pot fer en un torn @@ -1486,7 +1492,7 @@ STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER :Arribada del pr STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER_HELPTEXT :Mostra les notícies quan arribi el primer vehicle a una estació d'un competidor STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :Accidents / desastres: {STRING} STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS_HELPTEXT :Mostra un diari quan passin accidents i desastres -STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Informació de l'empresa: {STRING} +STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Informació de la companyia: {STRING} STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Mostra les notícies de companyies noves que es creen i de companyies en risc de fer fallida STR_CONFIG_SETTING_NEWS_INDUSTRY_OPEN :Obertura d'indústries: {STRING} STR_CONFIG_SETTING_NEWS_INDUSTRY_OPEN_HELPTEXT :Mostra les notícies d'aparicions d'indústries noves @@ -1516,12 +1522,12 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_SUMMARY :Resum STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Complet STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Les notícies en color apareixen el: {STRING} -STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Any en què els diaris comencen a fer els anunciaments impresos en color. Abans d'aquest any, s'utilitza el blanc i negre +STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Any en què els diaris comencen a fer anuncis en color. Abans d'aquest any, imprimiran en blanc i negre. STR_CONFIG_SETTING_STARTING_YEAR :Any d'inici: {STRING} STR_CONFIG_SETTING_SMOOTH_ECONOMY :Activa economia suau (més canvis però més petits): {STRING} STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Quan està activat, els canvis de producció de la indústria són més habituals, i en passos més petits. Aquest paràmetre usualment no té efecte, si el tipus d'indústria estan proveïts per un NewGRF -STR_CONFIG_SETTING_ALLOW_SHARES :Permet comprar participacions d'altres empreses: {STRING} -STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Quan està activat, permet comprar i vendre accions de les companyis. Les accions només estan disponibles per companyies d'una certa edat +STR_CONFIG_SETTING_ALLOW_SHARES :Permet comprar participacions d'altres companyies: {STRING} +STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Permet comprar i vendre accions de les companyies. Les accions només estan disponibles per companyies d'una certa edat. STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Percentatge del benefici total a pagar en transferències: {STRING} STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Percentatge del benefici donat a branques intermediàries dins els sistemes, donant més control sobre els beneficis STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :En arrossegar, col·locar senyals cada: {STRING} @@ -1552,9 +1558,9 @@ STR_CONFIG_SETTING_TOWN_LAYOUT_2X2_GRID :graella 2x2 STR_CONFIG_SETTING_TOWN_LAYOUT_3X3_GRID :graella 3x3 STR_CONFIG_SETTING_TOWN_LAYOUT_RANDOM :Aleatori STR_CONFIG_SETTING_ALLOW_TOWN_ROADS :Les poblacions poden construir carreteres: {STRING} -STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Permet a les poblacions construir carreteres per créixer. Desactiva-ho per prevenir que les autoritats de la població construeixin carreteres -STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Les poblacions tenen permís per construir passos a nivell: {STRING} -STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Activant aquesta opció es permet a les poblacions construir passos a nivell +STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Permet a les poblacions construir carreteres per créixer. Desactiveu aquesta opció per evitar que les poblacions construeixin carreteres. +STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Les poblacions poden construir passos a nivell: {STRING} +STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Activant aquesta opció, les poblacions podran construir passos a nivell. STR_CONFIG_SETTING_NOISE_LEVEL :Permet a la ciutat controlar el nivell de soroll dels aeroports: {STRING} STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Amb aquesta opció desactivada, no podran haver-hi més de dos aeroports en una mateixa població. Amb aquesta opció activada, el nombre d'aeroports en cada població està limitat pel límit d'acceptació de soroll de la població, que depèn de la mida de l'aeroport i de la distància STR_CONFIG_SETTING_TOWN_FOUNDING :Fundar poblacions durant la partida: {STRING} @@ -1603,7 +1609,7 @@ STR_CONFIG_SETTING_LARGER_TOWNS_HELPTEXT :Proporció de p STR_CONFIG_SETTING_LARGER_TOWNS_VALUE :1 de cada {COMMA} STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Cap STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Multiplicador de mida inicial de ciutats: {STRING} -STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :La grandària mitjana de les ciutats en relació als pobles a l'inici de la partida +STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :La grandària mitjana de les ciutats en relació als pobles a l'inici de la partida. STR_CONFIG_SETTING_LINKGRAPH_INTERVAL :Actualitza el graf de distribució cada {STRING}{NBSP}di{P 0:2 a es} STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT :Temps entre recàlculs successius del graf de distribució. Cada recàlcul calcula els plans per un component del graf. Això significa que un valor X per aquest paràmetre no implica que tot el graf serà actualitzat cada X dies. Només alguns components ho seran. Com més curt el valor, més temps de processador es requerirà per calcular-ho. Com més llarg, més temps passarà fins que la distribució de càrregues comenci en noves rutes. @@ -1687,7 +1693,7 @@ STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :{ORANGE}Poblaci STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}Indústries STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}Distribució de la càrrega STR_CONFIG_SETTING_AI :{ORANGE}Competidors -STR_CONFIG_SETTING_AI_NPC :{ORANGE}Jugadors de l'ordinador (IA) +STR_CONFIG_SETTING_AI_NPC :{ORANGE}Jugadors IA STR_CONFIG_SETTING_PATHFINDER_OPF :Original STR_CONFIG_SETTING_PATHFINDER_NPF :NPF @@ -1707,39 +1713,39 @@ STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Canvia e # Config errors STR_CONFIG_ERROR :{WHITE}S'ha produït un error en l'arxiu de configuració... STR_CONFIG_ERROR_ARRAY :{WHITE}...error en la matriu «{STRING}». -STR_CONFIG_ERROR_INVALID_VALUE :{WHITE}... valor invàlid '{STRING}' per '{STRING}' -STR_CONFIG_ERROR_TRAILING_CHARACTERS :{WHITE}... caràcters de fi al final de la configuració '{STRING}' +STR_CONFIG_ERROR_INVALID_VALUE :{WHITE}...valor «{STRING}» invàlid per a «{STRING}». +STR_CONFIG_ERROR_TRAILING_CHARACTERS :{WHITE}...caràcters finals (espai, nova línia...) al final de la configuració de l'opció «{STRING}». STR_CONFIG_ERROR_DUPLICATE_GRFID :{WHITE}...s'ignorarà l'arxiu NewGRF «{STRING}» perquè l'identificador del GRF és el mateix que el de «{STRING}». STR_CONFIG_ERROR_INVALID_GRF :{WHITE}...s'ignorarà l'arxiu NewGRF invàlid «{STRING}»: {STRING} STR_CONFIG_ERROR_INVALID_GRF_NOT_FOUND :no s'ha trobat. -STR_CONFIG_ERROR_INVALID_GRF_UNSAFE :insegur per a ús estàtic +STR_CONFIG_ERROR_INVALID_GRF_UNSAFE :insegur per a ús estàtic. STR_CONFIG_ERROR_INVALID_GRF_SYSTEM :arxiu NewGRF compatible només amb el TTDPatch. STR_CONFIG_ERROR_INVALID_GRF_INCOMPATIBLE :no és compatible amb aquesta versió de l'OpenTTD. -STR_CONFIG_ERROR_INVALID_GRF_UNKNOWN :desconegut -STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_LEVEL :{WHITE}... el nivell de compressió '{STRING}' no és vàlid -STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_ALGORITHM :{WHITE}... el format de partida '{STRING}' no està disponible. Tornant a '{STRING}' +STR_CONFIG_ERROR_INVALID_GRF_UNKNOWN :desconegut. +STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_LEVEL :{WHITE}...el nivell de compressió «{STRING}» no és vàlid. +STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_ALGORITHM :{WHITE}...el format de partida «{STRING}» no està disponible. Es revertirà a «{STRING}». STR_CONFIG_ERROR_INVALID_BASE_GRAPHICS_NOT_FOUND :{WHITE}...s'ignorarà el conjunt de gràfics base «{STRING}» perquè no s'ha trobat. STR_CONFIG_ERROR_INVALID_BASE_SOUNDS_NOT_FOUND :{WHITE}...s'ignorarà el conjunt de sons base «{STRING}» perquè no s'ha trobat. STR_CONFIG_ERROR_INVALID_BASE_MUSIC_NOT_FOUND :{WHITE}...s'ignorarà el conjunt de peces de música «{STRING}» perquè no s'ha trobat. STR_CONFIG_ERROR_OUT_OF_MEMORY :{WHITE}Memòria exhaurida -STR_CONFIG_ERROR_SPRITECACHE_TOO_BIG :{WHITE}L'assignació de {BYTES} de la memòria cau d'sprites ha fallat. La memòria cau d'sprites s'ha reduït a {BYTES}. Això reduirà el rendiment d'OpenTTD. Per reduir els requeriments de memòria pots probar a desactivar els gràfics de 32bpp i/o els nivells amb zoom +STR_CONFIG_ERROR_SPRITECACHE_TOO_BIG :{WHITE}L'assignació de {BYTES} de memòria cau de sprites ha fallat. S'ha reduït aquest tipus de memòria a {BYTES}. Això reduirà el rendiment de l'OpenTTD. Per reduir els requeriments de memòria, proveu de desactivar els gràfics de 32bpp i/o els nivells extra de zoom. # Intro window STR_INTRO_CAPTION :{WHITE}OpenTTD {REV} -STR_INTRO_NEW_GAME :{BLACK}Nova Partida -STR_INTRO_LOAD_GAME :{BLACK}Carrega una Partida -STR_INTRO_PLAY_SCENARIO :{BLACK}Juga un Escenari -STR_INTRO_PLAY_HEIGHTMAP :{BLACK}Juga un Mapa d'Alçades -STR_INTRO_SCENARIO_EDITOR :{BLACK}Editor d'Escenaris +STR_INTRO_NEW_GAME :{BLACK}Nova partida +STR_INTRO_LOAD_GAME :{BLACK}Carrega una partida +STR_INTRO_PLAY_SCENARIO :{BLACK}Juga un escenari +STR_INTRO_PLAY_HEIGHTMAP :{BLACK}Juga un mapa d'alçades +STR_INTRO_SCENARIO_EDITOR :{BLACK}Editor d'escenaris STR_INTRO_MULTIPLAYER :{BLACK}Multijugador -STR_INTRO_GAME_OPTIONS :{BLACK}Opcions del Joc +STR_INTRO_GAME_OPTIONS :{BLACK}Opcions del joc STR_INTRO_HIGHSCORE :{BLACK}Taula de rècords STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Configuració STR_INTRO_NEWGRF_SETTINGS :{BLACK}Extensions NewGRF -STR_INTRO_ONLINE_CONTENT :{BLACK}Contingut en Línia -STR_INTRO_SCRIPT_SETTINGS :{BLACK}Paràmetres de les IA/Script de la Partida +STR_INTRO_ONLINE_CONTENT :{BLACK}Contingut en línia +STR_INTRO_SCRIPT_SETTINGS :{BLACK}Paràmetres de les IA/script de la partida STR_INTRO_QUIT :{BLACK}Surt STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Comença una partida nova. Ctrl+Clic salta la configuració del mapa @@ -1760,13 +1766,14 @@ STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Mostra l STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Mostra la configuració de les extensions NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Comprova si hi ha continguts nous i actualitzats per a descarregar STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Mostra els paràmetres de les IA/Script de la partida -STR_INTRO_TOOLTIP_QUIT :{BLACK}Surt d'OpenTTD +STR_INTRO_TOOLTIP_QUIT :{BLACK}Surt de l'OpenTTD. -STR_INTRO_TRANSLATION :{BLACK}A aquesta traducció li falten {NUM} caden{P a es}. Si us plau ajuda a fer millor OpenTTD unint-te com a traductor. Veure readme.txt per més detalls. +STR_INTRO_BASESET :{WHITE}Al joc de gràfics base seleccionat li falten {NUM} sprite{P "" s}.{}Si us plau, comproveu-ne si hi ha actualitzacions disponibles. +STR_INTRO_TRANSLATION :{BLACK}A aquesta traducció li falten {NUM} caden{P a es}. Si us plau, ajudeu a fer millor l'OpenTTD unint-vos com a traductor. Vegeu el fitxer readme.txt per més detalls. # Quit window STR_QUIT_CAPTION :{WHITE}Surt -STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD :{YELLOW}Estàs segur que vols abandonar aquesta partida i tornar a {STRING}? +STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD :{YELLOW}Esteu segur que voleu abandonar aquesta partida i tornar a {STRING}? STR_QUIT_YES :{BLACK}Sí STR_QUIT_NO :{BLACK}No @@ -1822,15 +1829,15 @@ STR_LIVERY_DEFAULT :Decoració est STR_LIVERY_STEAM :Locomotora a Vapor STR_LIVERY_DIESEL :Locomotora Dièsel STR_LIVERY_ELECTRIC :Locomotora Elèctrica -STR_LIVERY_MONORAIL :Locomotora Monorail -STR_LIVERY_MAGLEV :Locomotora Maglev +STR_LIVERY_MONORAIL :Locomotora monorail +STR_LIVERY_MAGLEV :Locomotora maglev STR_LIVERY_DMU :DMU STR_LIVERY_EMU :EMU -STR_LIVERY_PASSENGER_WAGON_STEAM :Vagó de passatgers (Vapor) -STR_LIVERY_PASSENGER_WAGON_DIESEL :Vagó de passatgers (Dièsel) -STR_LIVERY_PASSENGER_WAGON_ELECTRIC :Vagó de passatgers (Elèctric) -STR_LIVERY_PASSENGER_WAGON_MONORAIL :Vagó de Passatgers (Monorail) -STR_LIVERY_PASSENGER_WAGON_MAGLEV :Vagó de Passatgers (Maglev) +STR_LIVERY_PASSENGER_WAGON_STEAM :Vagó de passatgers (vapor) +STR_LIVERY_PASSENGER_WAGON_DIESEL :Vagó de passatgers (dièsel) +STR_LIVERY_PASSENGER_WAGON_ELECTRIC :Vagó de passatgers (elèctric) +STR_LIVERY_PASSENGER_WAGON_MONORAIL :Vagó de passatgers (monorail) +STR_LIVERY_PASSENGER_WAGON_MAGLEV :Vagó de passatgers (maglev) STR_LIVERY_FREIGHT_WAGON :Vagó de càrrega STR_LIVERY_BUS :Autobús STR_LIVERY_TRUCK :Camió @@ -1852,7 +1859,7 @@ STR_FACE_MALE_BUTTON :{BLACK}Home STR_FACE_MALE_TOOLTIP :{BLACK}Selecciona cares d'home STR_FACE_FEMALE_BUTTON :{BLACK}Dona STR_FACE_FEMALE_TOOLTIP :{BLACK}Selecciona cares de dona -STR_FACE_NEW_FACE_BUTTON :{BLACK}Nova Cara +STR_FACE_NEW_FACE_BUTTON :{BLACK}Nova cara STR_FACE_NEW_FACE_TOOLTIP :{BLACK}Genera una nova cara aleatòria STR_FACE_ADVANCED :{BLACK}Avançat STR_FACE_ADVANCED_TOOLTIP :{BLACK}Selecció de cara avançada @@ -1860,7 +1867,7 @@ STR_FACE_SIMPLE :{BLACK}Simple STR_FACE_SIMPLE_TOOLTIP :{BLACK}Selecció de cara simple STR_FACE_LOAD :{BLACK}Carrega STR_FACE_LOAD_TOOLTIP :{BLACK}Carrega la cara preferida -STR_FACE_LOAD_DONE :{WHITE}S'ha carregat la cara personalitzada des de l'arxiu de configuració de l'OpenTTD +STR_FACE_LOAD_DONE :{WHITE}S'ha carregat la cara personalitzada des de l'arxiu de configuració de l'OpenTTD. STR_FACE_FACECODE :{BLACK}Número de la cara STR_FACE_FACECODE_TOOLTIP :{BLACK}Veure i/o assigna el número de la cara del president STR_FACE_FACECODE_CAPTION :{WHITE}Veure i/o assigna el número de la cara del president @@ -1868,7 +1875,7 @@ STR_FACE_FACECODE_SET :{WHITE}El núme STR_FACE_FACECODE_ERR :{WHITE}No s'ha pogut assignar el número de cara del president - ha de ser un nombre entre 0 i 4,294,967,295! STR_FACE_SAVE :{BLACK}Desa STR_FACE_SAVE_TOOLTIP :{BLACK}Desa la cara preferida -STR_FACE_SAVE_DONE :{WHITE}Es desarà aquesta cara personalitzada a l'arxiu de configuració de l'OpenTTD +STR_FACE_SAVE_DONE :{WHITE}Es desarà aquesta cara personalitzada a l'arxiu de configuració de l'OpenTTD. STR_FACE_EUROPEAN :{BLACK}Europea STR_FACE_SELECT_EUROPEAN :{BLACK}Selecciona cares europees STR_FACE_AFRICAN :{BLACK}Africana @@ -1915,7 +1922,7 @@ STR_NETWORK_SERVER_LIST_GENERAL_ONLINE :{BLACK}{COMMA}/ STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION :{BLACK}Clients STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION_TOOLTIP :{BLACK}Clients en línia / clients màx.{}Companyies en línia / companyies màx. STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT :{BLACK}{COMMA}x{COMMA} -STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Mida del Mapa +STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Mida del mapa STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Mida del mapa de la partida{}Clica per ordenar per àrea STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Data STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Data actual @@ -2024,9 +2031,9 @@ STR_NETWORK_LANG_LATVIAN :Letó STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Lobby de partida multijugador STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Preparant per connectar: {ORANGE}{STRING} -STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Una llista de totes les empreses actuals en aquesta partida. Pots utilitzar-ne una o bé iniciar-ne una de nova si hi ha algun lloc lliure +STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Una llista de totes les companyies actuals en aquesta partida. Podeu utilitzar-ne una o bé iniciar-ne una de nova si hi ha algun lloc lliure. -STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}INFORMACIÓ DE L'EMPRESA +STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}INFORMACIÓ DE LA COMPANYIA STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Nom companyia: {WHITE}{STRING} STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Inauguració: {WHITE}{NUM} STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Valor de la companyia: {WHITE}{CURRENCY_LONG} @@ -2038,8 +2045,8 @@ STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Vehicle STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Estacions: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Jugadors: {WHITE}{STRING} -STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nova Empresa -STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Obre una nova Empresa +STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Crea companyia nova +STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Obre una nova companyia. STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Espectador STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Veure la partida com a espectador STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Uneix-te a la companyia @@ -2065,11 +2072,11 @@ STR_NETWORK_CONNECTING_DOWNLOADING_2 :{BLACK}{BYTES} STR_NETWORK_CONNECTION_DISCONNECT :{BLACK}Desconnecta -STR_NETWORK_NEED_GAME_PASSWORD_CAPTION :{WHITE}Servidor protegit. Entra la contrasenya -STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}Empresa protegida. Entra la contrasenya +STR_NETWORK_NEED_GAME_PASSWORD_CAPTION :{WHITE}Servidor protegit: escriviu-ne la contrasenya +STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}Companyia protegida: escriviu-ne la contrasenya # Network company list added strings -STR_NETWORK_COMPANY_LIST_CLIENT_LIST :{WHITE}Llista de Clients +STR_NETWORK_COMPANY_LIST_CLIENT_LIST :{WHITE}Llista de clients STR_NETWORK_COMPANY_LIST_SPECTATE :{WHITE}Espectador STR_NETWORK_COMPANY_LIST_NEW_COMPANY :{WHITE}Nova companyia @@ -2078,7 +2085,7 @@ STR_NETWORK_CLIENTLIST_KICK :Breu STR_NETWORK_CLIENTLIST_BAN :Prohibit STR_NETWORK_CLIENTLIST_GIVE_MONEY :Entrega diners STR_NETWORK_CLIENTLIST_SPEAK_TO_ALL :Parla a tothom -STR_NETWORK_CLIENTLIST_SPEAK_TO_COMPANY :Parla a l'Empresa +STR_NETWORK_CLIENTLIST_SPEAK_TO_COMPANY :Parla amb la companyia STR_NETWORK_CLIENTLIST_SPEAK_TO_CLIENT :Missatge Privat STR_NETWORK_SERVER :Servidor @@ -2206,9 +2213,9 @@ STR_CONTENT_SELECT_UPDATES_CAPTION_TOOLTIP :{BLACK}Marca to STR_CONTENT_UNSELECT_ALL_CAPTION :{BLACK}Deselecciona tot STR_CONTENT_UNSELECT_ALL_CAPTION_TOOLTIP :{BLACK}Marca tots els continguts a no ser descarregats STR_CONTENT_SEARCH_EXTERNAL :{BLACK}Cerca en webs externes -STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Cerca contingut no disponible al servei de continguts d'OpenTTD en webs no associades amb OpenTTD -STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}Estàs sortint d'OpenTTD! -STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}Els termes i condicions per descarregar contingut des de webs externes varia.{}Hauràs d'adreçar-te a les webs externes per trobar instruccions sobre com instal·lar contingut a OpenTTD.{}Vols continuar? +STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Cerca contingut no disponible al servei de continguts de l'OpenTTD en webs no associades. +STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}Esteu sortint de l'OpenTTD. +STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}Els termes i condicions per descarregar contingut des de webs externes varia.{}Haureu d'adreçar-vos a les webs externes per trobar instruccions sobre com instal·lar contingut a l'OpenTTD.{}Voleu continuar? STR_CONTENT_FILTER_TITLE :{BLACK}Marca/anomena filtre: STR_CONTENT_OPEN_URL :{BLACK}Visita la web STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Visita la web per accedir a aquest contingut @@ -2261,9 +2268,9 @@ STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_FILE_NOT_WRITABLE :{WHITE}... no e STR_CONTENT_ERROR_COULD_NOT_EXTRACT :{WHITE}No s'han pogut descomprimir els arxius descarregats STR_MISSING_GRAPHICS_SET_CAPTION :{WHITE}Gràfics que falten -STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD necessita gràfics per funcionar però no se n'ha trobat cap. Vols permetre a OpenTTD descarregar i instal·lar aquests gràfics? +STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}L'OpenTTD necessita gràfics per funcionar, però no se n'han trobat. Voleu permetre a l'OpenTTD descarregar i instal·lar aquests gràfics? STR_MISSING_GRAPHICS_YES_DOWNLOAD :{BLACK}Sí, descarregar els gràfics -STR_MISSING_GRAPHICS_NO_QUIT :{BLACK}No, surt d'OpenTTD +STR_MISSING_GRAPHICS_NO_QUIT :{BLACK}No, surt de l'OpenTTD. # Transparency settings window STR_TRANSPARENCY_CAPTION :{WHITE}Opcions de transparència @@ -2283,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 @@ -2306,10 +2314,10 @@ STR_JOIN_WAYPOINT_CAPTION :{WHITE}Uneix pu STR_JOIN_WAYPOINT_CREATE_SPLITTED_WAYPOINT :{YELLOW}Construeix un punt de pas separat # Rail construction toolbar -STR_RAIL_TOOLBAR_RAILROAD_CONSTRUCTION_CAPTION :Construcció de Ferrocarril -STR_RAIL_TOOLBAR_ELRAIL_CONSTRUCTION_CAPTION :Construcció de Ferrocarril Elèctric -STR_RAIL_TOOLBAR_MONORAIL_CONSTRUCTION_CAPTION :Construcció de Monorail -STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Construcció de Maglev +STR_RAIL_TOOLBAR_RAILROAD_CONSTRUCTION_CAPTION :Construcció de ferrocarril +STR_RAIL_TOOLBAR_ELRAIL_CONSTRUCTION_CAPTION :Construcció de ferrocarril elèctric +STR_RAIL_TOOLBAR_MONORAIL_CONSTRUCTION_CAPTION :Construcció de monorail +STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Construcció de maglev STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construeix vies de tren. Ctrl canvia entre contrueix/treu la construcció de vies. Shift commuta construeix/mostra el cost estimat STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Construeix vies de tren utilitzant el mode Autorail. Ctrl canvia entre construeix/treu la construcció de vies de tren. Shift commuta construeix/mostra el cost estimat @@ -2333,7 +2341,7 @@ STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP :{BLACK}Seleccio # Rail waypoint construction window STR_WAYPOINT_CAPTION :{WHITE}Punt de pas -STR_WAYPOINT_GRAPHICS_TOOLTIP :{BLACK}Selecciona tipus de punt de control +STR_WAYPOINT_GRAPHICS_TOOLTIP :{BLACK}Selecciona el tipus de punt de pas. # Rail station construction window STR_STATION_BUILD_RAIL_CAPTION :{WHITE}Estacions de Tren @@ -2433,8 +2441,8 @@ STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Construe STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Construeix un port. Ctrl permet ajuntar estacions. Shift commuta construeix/mostra el cost estimat STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Situa una boia que pot ser útil per fer punts de control addicionals. Shift commuta construeix/mostra el cost estimat STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK} Construeix aqüeducte. Shift commuta construeix/mostra el cost estimat -STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Defineix l'àrea d'aigua.{}Fa un canal, excepte si CTRL està polsat al nivell de mar, llavors s'inundaran els voltants -STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Situa rius +STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Defineix caselles com a canals d'aigua.{}Amb Ctrl+Clic a nivell de mar, es defineix una casella de mar i s'inundaran els seus voltants. +STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Crea rius i caselles d'aigua. # Ship depot construction window STR_DEPOT_BUILD_SHIP_CAPTION :{WHITE}Drassanes @@ -2450,7 +2458,7 @@ STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP :{BLACK}Construe # Airport construction window STR_STATION_BUILD_AIRPORT_CAPTION :{WHITE}Aeroports STR_STATION_BUILD_AIRPORT_TOOLTIP :{BLACK}Selecciona mida/tipus d'aeroport -STR_STATION_BUILD_AIRPORT_CLASS_LABEL :{BLACK}Classe d'Aeroport +STR_STATION_BUILD_AIRPORT_CLASS_LABEL :{BLACK}Classe d'aeroport STR_STATION_BUILD_AIRPORT_LAYOUT_NAME :{BLACK}Disposició {NUM} STR_AIRPORT_SMALL :Petit @@ -2590,6 +2598,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Nom de l STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Càrrega acceptada: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Tipus de via: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Límit de velocitat de la via: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Límit de velocitat de la carretera: {LTBLUE}{VELOCITY} @@ -2602,29 +2611,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Camps de conreu STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Terreny nevat STR_LAI_CLEAR_DESCRIPTION_DESERT :Desert -STR_LAI_RAIL_DESCRIPTION_TRACK :Via de {STRING} -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} via amb senyals de bloc -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} via amb pre-senyals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} via amb senyals de sortida -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} via amb senyals combinats -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} via amb senyals de camí -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} via amb senyals de camí d'un sentit -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING}via amb senyals de bloc i pre-senyals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} via amb senyals de bloc i de sortida -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} via amb senyals de bloc i combinats -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} via amb senyals de bloc i de camí -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} via amb senyals de bloc i de camí d'un sentit -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} via amb pre-senyals i senyals de sortida -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} via amb pre-senyals i senyals combinats -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} via amb pre-senyals i senyals de camí -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} via amb pre-senyals i senyals de camí d'un sentit -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} via amb senyals de sortida i combinats -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} via amb senyals de sortida i de camí -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} via amb senyals de sortida i de camí d'un sentit -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} via amb senyals combinats i de camí -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} via amb senyals combinats i de camí d'un sentit -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} via amb senyals de camí i de camí d'un sentit -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} cotxeres de tren +STR_LAI_RAIL_DESCRIPTION_TRACK :Via ferroviària +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Via ferroviària amb senyals de secció +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Via ferroviària amb senyals d'entrada +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Via ferroviària amb senyals de sortida +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Via ferroviària amb senyals combinats +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Ferrocarril via amb senyals de ruta +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Via ferroviària amb senyals de ruta d'un sentit +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Via ferroviària amb senyals de secció i d'entrada +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Via ferroviària amb senyals de secció i de sortida +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Via ferroviària amb senyals de secció i combinats +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Via ferroviària amb senyals de secció i de ruta +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Via ferroviària amb senyals de secció i de ruta d'un sentit +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Via ferroviària amb senyals d'entrada i de sortida +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Via ferroviària amb senyals d'entrada i combinats +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Via ferroviària amb senyals d'entrada i senyals de ruta +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Via ferroviària amb senyals d'entrada i de ruta d'un sentit +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Via ferroviària amb senyals combinats i de sortida +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Via ferroviària amb senyals de sortida i de ruta +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Via ferroviària amb senyals de sortida i de ruta d'un sentit +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Via ferroviària amb senyals combinats i de ruta +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Via ferroviària amb senyals combinats i de ruta d'un sentit +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Via ferroviària amb senyals de ruta i de ruta d'un sentit +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Cotxeres de vehicles ferroviaris STR_LAI_ROAD_DESCRIPTION_ROAD :Carretera STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Carretera amb fanals @@ -2681,22 +2690,72 @@ STR_LAI_BRIDGE_DESCRIPTION_AQUEDUCT :Aqüeducte STR_LAI_OBJECT_DESCRIPTION_TRANSMITTER :Repetidor STR_LAI_OBJECT_DESCRIPTION_LIGHTHOUSE :Far -STR_LAI_OBJECT_DESCRIPTION_COMPANY_HEADQUARTERS :Seu de l'Empresa -STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :terreny propietat de l'Empresa +STR_LAI_OBJECT_DESCRIPTION_COMPANY_HEADQUARTERS :Seu de la companyia +STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :terreny propietat de l'empresa # About OpenTTD window STR_ABOUT_OPENTTD :{WHITE}Quant a l'OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyright original {COPYRIGHT} 1995 Chris Sawyer. Tots els drets reservats. -STR_ABOUT_VERSION :{BLACK}OpenTTD versió {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 L'equip de l'OpenTTD +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 -STR_SAVELOAD_SAVE_SCENARIO :{WHITE}Desa l'Escenari -STR_SAVELOAD_LOAD_SCENARIO :{WHITE}Carrega un Escenari -STR_SAVELOAD_LOAD_HEIGHTMAP :{WHITE}Carrega un Mapa d'alçades -STR_SAVELOAD_SAVE_HEIGHTMAP :{WHITE}Desa Mapa d'alçades +STR_SAVELOAD_SAVE_SCENARIO :{WHITE}Desa l'escenari +STR_SAVELOAD_LOAD_SCENARIO :{WHITE}Carrega un escenari +STR_SAVELOAD_LOAD_HEIGHTMAP :{WHITE}Carrega un mapa d'alçades +STR_SAVELOAD_SAVE_HEIGHTMAP :{WHITE}Desa el mapa d'alçades STR_SAVELOAD_HOME_BUTTON :{BLACK}Clica aquí per anar a la carpeta predeterminada de desa/carrega actual STR_SAVELOAD_BYTES_FREE :{BLACK}{BYTES} lliures STR_SAVELOAD_LIST_TOOLTIP :{BLACK}Llista de dispositius de disc, carpetes i arxius de partides desades @@ -2773,7 +2832,7 @@ STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_QUERY_CAPT :{WHITE}Canvia l # Map generation progress STR_GENERATION_WORLD :{WHITE}Generant món... STR_GENERATION_ABORT :{BLACK}Avorta -STR_GENERATION_ABORT_CAPTION :{WHITE}Avorta la Generació del Món +STR_GENERATION_ABORT_CAPTION :{WHITE}Avorta la generació del mapa STR_GENERATION_ABORT_MESSAGE :{YELLOW}Realment vols avortar la generació? STR_GENERATION_PROGRESS :{WHITE}{NUM}% complet STR_GENERATION_PROGRESS_NUM :{BLACK}{NUM} / {NUM} @@ -2834,7 +2893,7 @@ STR_NEWGRF_SETTINGS_PARAMETER :{BLACK}Paràmet STR_NEWGRF_SETTINGS_NO_INFO :{BLACK}No hi ha informació disponible STR_NEWGRF_SETTINGS_NOT_FOUND :{RED}No s'ha trobat cap arxiu coincident STR_NEWGRF_SETTINGS_DISABLED :{RED}Desactivat -STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}Versió incompatible amb aquesta versió de OpenTTD +STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}Versió incompatible amb aquesta versió de l'OpenTTD. # NewGRF save preset window STR_SAVE_PRESET_CAPTION :{WHITE}Guardar configuració NewGRF @@ -2907,15 +2966,13 @@ STR_NEWGRF_ERROR_INVALID_ID :Intent d'utilit STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} conté un sprite corrupte. Tots els sprites corruptes seran mostrats amb un interrogant vermell (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Conté múltiples entrades d'acció 8 (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :S'ha llegit després del final d'un pseudo-sprite (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Al joc de gràfics base establert actualment li falten un nombre d'sprites.{}Si us plau actualitza el joc de gràfics base -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Als gràfics base actualment utilitzats els hi falta un nombre d'sprites.{}Si us plau actualitza el conjunt de gràfics base.{}Com que estàs jugant amb una {YELLOW}versió de desenvolupament d'OpenTTD{WHITE}, pot ser que necessitis una {YELLOW}versió de desenvolupament dels gràfics base{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Els recursos GRF demanats no estan disponibles (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} ha estat desactivat per {STRING} -STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Format de disposició d'sprite invàlid/desconegut (sprite {3:NUM}) +STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Format de disposició de sprite no vàlid o desconegut (sprite {3:NUM}). # NewGRF related 'general' warnings STR_NEWGRF_POPUP_CAUTION_CAPTION :{WHITE}Alerta! -STR_NEWGRF_CONFIRMATION_TEXT :{YELLOW}Esteu a punt de fer canvis en una partida activa. Això pot fer que l'OpenTTD falli. No envieu cap informe d'error sobre això.{}Esteu completament segur que voleu fer-los? +STR_NEWGRF_CONFIRMATION_TEXT :{YELLOW}Esteu a punt de fer canvis en una partida activa que poden fer que l'OpenTTD falli. No envieu cap informe d'error produït després d'efectuar aquests canvis crítics.{}Esteu completament segur que voleu fer-los? STR_NEWGRF_DUPLICATE_GRFID :{WHITE}No es pot afegir l'arxiu: ID GRF duplicada STR_NEWGRF_COMPATIBLE_LOADED :{ORANGE}No s'ha trobat un arxiu coincident (els GRF compatibles s'han carregat) @@ -2937,7 +2994,7 @@ STR_NEWGRF_BROKEN :{WHITE}El compo STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}Un vehicle '{1:ENGINE}' ha canviat el seu estat de vagó amb potència mentre estava fora de la cotxera STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}Un vehicle '{1:ENGINE}' ha canviat la seva llargada mentre estava fora del dipòsit STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Un vehicle '{1:ENGINE}' ha canviat la seva capacitat mentre estava fora del dipòsit o no s'estava canviant el tipus de càrrega a transportar -STR_BROKEN_VEHICLE_LENGTH :{WHITE}El tren '{VEHICLE}' de '{COMPANY}' té una llargada invàlida, probablement a causa de problemes amb els NewGRF. La partida podria dessincronitzar-se o fallar. +STR_BROKEN_VEHICLE_LENGTH :{WHITE}El tren «{VEHICLE}» propietat de «{COMPANY}» té una llargada invàlida, probablement a causa de problemes amb els NewGRF. La partida podria dessincronitzar-se o fallar. STR_NEWGRF_BUGGY :{WHITE}El NewGRF '{0:STRING}' està donant informació incorrecta STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}La informació de càrrega/remodelació per '{1:ENGINE}' no encaixa amb la llista de compres després de la construcció. Això podria causar un mal funcionament de autorenova/-substitueix @@ -2976,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} @@ -2983,8 +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_PASSENGERS_LAST_MONTH_MAX :{BLACK}Passatgers el darrer mes: {ORANGE}{COMMA}{BLACK} màx: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Correu el darrer mes: {ORANGE}{COMMA}{BLACK} màx: {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 @@ -3009,7 +3066,7 @@ STR_TOWN_VIEW_RENAME_TOWN_BUTTON :Canvia el nom d # Town local authority window STR_LOCAL_AUTHORITY_CAPTION :{WHITE}{TOWN} autoritat local -STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}Ratis de l'Empresa de Transports: +STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}Ratis de la companyia de transports: STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING} STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}Accions disponibles: STR_LOCAL_AUTHORITY_ACTIONS_TOOLTIP :{BLACK}Llista de coses per fer en aquesta població - clica en un ítem per més detalls @@ -3115,8 +3172,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Accepta STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Mostra la llista de càrregues admeses STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Accepta: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Aquesta estació té els drets exclusius de transport en aquesta ciutat. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} ha comprat els drets exclusius de transport en aquesta ciutat. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Aquesta estació té els drets exclusius de transport en aquesta ciutat. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} ha comprat els drets exclusius de transport en aquesta ciutat. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Ratis STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Mostra els ratis de l'estació @@ -3172,12 +3229,12 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Evita qu # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} -STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centra la vista principal al lloc del punt de control. Ctrl+Clic obre una nova vista al lloc del punt de control -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Canvia el nom del punt de trobada +STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centra la vista principal al lloc del punt de pas. Amb Ctrl+Clic, obre una nova vista al lloc del punt de pas. +STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Canvia el nom del punt de pas STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centra la vista principal en la boia. Amb Ctrl+Clic, obre una nova vista centrada en la boia. STR_BUOY_VIEW_CHANGE_BUOY_NAME :{BLACK}Canvia el nom de la boia -STR_EDIT_WAYPOINT_NAME :{WHITE}Edita nom del punt de pas +STR_EDIT_WAYPOINT_NAME :{WHITE}Edita el nom del punt de pas # Finances window STR_FINANCES_CAPTION :{WHITE}Finances de {COMPANY} {BLACK}{COMPANY_NUM} @@ -3295,21 +3352,23 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Necessit STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Necessita: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Necessita: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} esperant{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Càrrega en espera de ser processada: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produeix: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Produeix: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends -STR_CONFIG_GAME_PRODUCTION :{WHITE}Canvia producció (múltiple de 8, fins a 2040) -STR_CONFIG_GAME_PRODUCTION_LEVEL :{WHITE}Canvia el nivell de producció (percentatge, fins al 800%) +STR_CONFIG_GAME_PRODUCTION :{WHITE}Canvia la producció (múltiple de 8, fins a 2040) +STR_CONFIG_GAME_PRODUCTION_LEVEL :{WHITE}Canvia el nivell de producció (en percentatge, fins a 800%) # Vehicle lists -STR_VEHICLE_LIST_TRAIN_CAPTION :{WHITE}{STRING} - {COMMA} Trens -STR_VEHICLE_LIST_ROAD_VEHICLE_CAPTION :{WHITE}{STRING} - {COMMA} Vehicles -STR_VEHICLE_LIST_SHIP_CAPTION :{WHITE}{STRING} - {COMMA} Vaixells -STR_VEHICLE_LIST_AIRCRAFT_CAPTION :{WHITE}{STRING} - {COMMA} Avions +STR_VEHICLE_LIST_TRAIN_CAPTION :{WHITE}{STRING} - {COMMA} tren{P "" s} +STR_VEHICLE_LIST_ROAD_VEHICLE_CAPTION :{WHITE}{STRING} - {COMMA} vehicle{P "" s} +STR_VEHICLE_LIST_SHIP_CAPTION :{WHITE}{STRING} - {COMMA} vaixell{P "" s} +STR_VEHICLE_LIST_AIRCRAFT_CAPTION :{WHITE}{STRING} - {COMMA} aeronau{P "" s} STR_VEHICLE_LIST_TRAIN_LIST_TOOLTIP :{BLACK}Trens - clica al tren per més informació STR_VEHICLE_LIST_ROAD_VEHICLE_TOOLTIP :{BLACK}Automòbils - clica en un vehicle per més informació @@ -3318,26 +3377,26 @@ STR_VEHICLE_LIST_AIRCRAFT_TOOLTIP :{BLACK}Avió - STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Benefici enguany: {CURRENCY_LONG} (darrer any: {CURRENCY_LONG}) -STR_VEHICLE_LIST_AVAILABLE_TRAINS :Trens Disponibles -STR_VEHICLE_LIST_AVAILABLE_ROAD_VEHICLES :Vehicles Disponibles -STR_VEHICLE_LIST_AVAILABLE_SHIPS :Vaixells Disponibles -STR_VEHICLE_LIST_AVAILABLE_AIRCRAFT :Avions Disponibles +STR_VEHICLE_LIST_AVAILABLE_TRAINS :Trens disponibles +STR_VEHICLE_LIST_AVAILABLE_ROAD_VEHICLES :Vehicles disponibles +STR_VEHICLE_LIST_AVAILABLE_SHIPS :Vaixells disponibles +STR_VEHICLE_LIST_AVAILABLE_AIRCRAFT :Avions disponibles STR_VEHICLE_LIST_AVAILABLE_ENGINES_TOOLTIP :{BLACK}Veure una llista dels models disponibles per aquest tipus de vehicle -STR_VEHICLE_LIST_MANAGE_LIST :{BLACK}Administra llista +STR_VEHICLE_LIST_MANAGE_LIST :{BLACK}Administra la llista STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Envia instruccions a tots els vehicles de la llista -STR_VEHICLE_LIST_REPLACE_VEHICLES :Substitueix Vehicles -STR_VEHICLE_LIST_SEND_FOR_SERVICING :Enviar a fer Revisió +STR_VEHICLE_LIST_REPLACE_VEHICLES :Substitueix vehicles +STR_VEHICLE_LIST_SEND_FOR_SERVICING :Envia a fer revisió -STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Enviar a la Cotxera -STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Enviar a la Cotxera -STR_VEHICLE_LIST_SEND_SHIP_TO_DEPOT :Enviar a la Drassana -STR_VEHICLE_LIST_SEND_AIRCRAFT_TO_HANGAR :Enviar a l'Hangar +STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Envia a la cotxera +STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Envia a la cotxera +STR_VEHICLE_LIST_SEND_SHIP_TO_DEPOT :Envia a la drassana +STR_VEHICLE_LIST_SEND_AIRCRAFT_TO_HANGAR :Envia a l'hangar STR_VEHICLE_LIST_MASS_STOP_LIST_TOOLTIP :{BLACK}Clica per parar tots els vehicles de la llista STR_VEHICLE_LIST_MASS_START_LIST_TOOLTIP :{BLACK}Clica per engegar tots els vehicles de la llista -STR_VEHICLE_LIST_SHARED_ORDERS_LIST_CAPTION :{WHITE}Ordres compartides de {COMMA} Vehicle{P "" s} +STR_VEHICLE_LIST_SHARED_ORDERS_LIST_CAPTION :{WHITE}Ordres compartides de {COMMA} vehicle{P "" s} # Group window STR_GROUP_ALL_TRAINS :Tots els trens @@ -3364,6 +3423,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Treu tots els v STR_GROUP_RENAME_CAPTION :{BLACK}Canvia de nom el grup +STR_GROUP_PROFIT_THIS_YEAR :Benefici d'enguany: +STR_GROUP_PROFIT_LAST_YEAR :Benefici de l'any passat: +STR_GROUP_OCCUPANCY :Ocupació actual: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Compra de nous vehicles ferroviaris STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Compra de nous vehicles ferroviaris per vies electrificades @@ -3384,7 +3448,7 @@ STR_PURCHASE_INFO_RUNNINGCOST :{BLACK}Cost d'u STR_PURCHASE_INFO_CAPACITY :{BLACK}Capacitat: {GOLD}{CARGO_LONG} {STRING} STR_PURCHASE_INFO_REFITTABLE :(remodelable) STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Dissenyat: {GOLD}{NUM}{BLACK} Vida: {GOLD}{COMMA} any{P "" s} -STR_PURCHASE_INFO_RELIABILITY :{BLACK}Màx. Fiabilitat: {GOLD}{COMMA}% +STR_PURCHASE_INFO_RELIABILITY :{BLACK}Fiabilitat màxima: {GOLD}{COMMA}% STR_PURCHASE_INFO_COST :{BLACK}Cost: {GOLD}{CURRENCY_LONG} STR_PURCHASE_INFO_WEIGHT_CWEIGHT :{BLACK}Pes: {GOLD}{WEIGHT_SHORT} ({WEIGHT_SHORT}) STR_PURCHASE_INFO_COST_SPEED :{BLACK}Cost: {GOLD}{CURRENCY_LONG}{BLACK} Velocitat: {GOLD}{VELOCITY} @@ -3392,14 +3456,15 @@ STR_PURCHASE_INFO_AIRCRAFT_CAPACITY :{BLACK}Capacita STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK}Vagons Automotrius: {GOLD}+{POWER}{BLACK} Pes: {GOLD}+{WEIGHT_SHORT} STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Remodelable a: {GOLD}{STRING} STR_PURCHASE_INFO_ALL_TYPES :Totes les càrregues -STR_PURCHASE_INFO_ALL_BUT :Tots menys {CARGO_LIST} -STR_PURCHASE_INFO_MAX_TE :{BLACK}Màx. Esforç de Tracció: {GOLD}{FORCE} +STR_PURCHASE_INFO_ALL_BUT :Qualsevol excepte {CARGO_LIST} +STR_PURCHASE_INFO_MAX_TE :{BLACK}Esforç de tracció màxim: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Abast: {GOLD}{COMMA} cel·les +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Tipus d'aeronau: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Llista de selecció de trens i vagons. Clica al vehicle per més informació. Ctrl+Click per a alternar entre mostrar/ocultar el vehicle ferroviari STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Llista de models de vehicles de carretera. Clica sobre el model per més informació. Amb Ctrl+Clic, commuta entre mostrar o ocultar el model. STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Llista de models de vaixells. Clica sobre el model per més informació. Amb Ctrl+Clic, commuta entre mostrar o ocultar el model. -STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Llista de selecció d'aeronaus. Clica sobre l'aeronau per més informació. Amb Ctrl+Clic, commuta entre mostrar o ocultar l'aeronau. +STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Llista de models d'aeronaus. Cliqueu sobre l'aeronau per més informació. Amb Ctrl+Clic, commuta entre mostrar o ocultar l'aeronau. STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_BUTTON :{BLACK}Compra el tren/vagó STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_BUTTON :{BLACK}Compra el vehicle @@ -3409,7 +3474,7 @@ STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Compra l STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Compra el tren/vagó seleccionat. Amb Maj+Clic, mostra el cost estimat sense comprar-lo. STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Compra el vehicle marcat. Amb Maj+Clic, mostra el cost estimat sense comprar-lo. STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Compra el vaixell seleccionat. Amb Maj+Clic, mostra el cost estimat sense comprar-lo. -STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Compra l'avió marcat. Amb Maj+Clic, mostra el cost estimat sense comprar-lo. +STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Compra l'aeronau marcada. Amb Maj+Clic, mostra el cost estimat sense comprar-la. STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Canvia el nom STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_BUTTON :{BLACK}Canvia el nom @@ -3528,10 +3593,11 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :{G=Femenin}loco STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Cost: {CURRENCY_LONG} Pes: {WEIGHT_SHORT}{}Velocitat: {VELOCITY} Potència: {POWER}{}Cost de circulació: {CURRENCY_LONG}/any{}Capacitat: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cost: {CURRENCY_LONG} Pes: {WEIGHT_SHORT}{}Velocitat: {VELOCITY} Potència: {POWER} Màx. E.T.: {6:FORCE}{}Cost d'utilització: {4:CURRENCY_LONG}/any{}Capacitat: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Vel. Màx: {VELOCITY}{}Capacitat: {CARGO_LONG}, {CARGO_LONG}{}Cost d'utilització: {CURRENCY_LONG}/any -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Vel. Màx: {VELOCITY}{}Capacitat: {CARGO_LONG}{}Cost d'utilització: {CURRENCY_LONG}/any -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Cost: {CURRENCY_LONG} Vel. màx.: {VELOCITY} Abast: {COMMA} cel·les{}Capacitat: {CARGO_LONG}, {CARGO_LONG}{}Cost d'utilització: {CURRENCY_LONG}/any -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Vel. màx.: {VELOCITY} Abast: {COMMA} cel·les{}Capacitat: {CARGO_LONG}{}Cost d'utilització: {CURRENCY_LONG}/any +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Vel. Màx: {VELOCITY}{}Capacitat: {CARGO_LONG}{}Cost d'utilització: {CURRENCY_LONG}/any +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Velocitat màx.: {VELOCITY}{}Tipus d'aeronau: {STRING}{}Capacitat: {CARGO_LONG}, {CARGO_LONG}{}Cost de circulació: {CURRENCY_LONG} per any +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Velocitat màx.: {VELOCITY}{}Tipus d'aeronau: {STRING}{}Capacitat: {CARGO_LONG}{}Cost de circulació: {CURRENCY_LONG} per any +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Velocitat màx.: {VELOCITY}{}Tipus d'aeronau: {STRING} Abast: {COMMA} caselles{}Capacitat: {CARGO_LONG}, {CARGO_LONG}{}Cost de circulació: {CURRENCY_LONG} per any +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Velocitat màx.: {VELOCITY}{}Tipus d'aeronau: {STRING} Abast: {COMMA} caselles{}Capacitat: {CARGO_LONG}{}Cost de circulació: {CURRENCY_LONG} per any # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Substitueix {STRING} - {STRING} @@ -3558,17 +3624,17 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} quan s STR_REPLACE_VEHICLES_STOP :{BLACK}Para de substituir STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Prem per aturar el reemplaçament del model seleccionat a l'esquerra -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Substituint: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Canvia entre finestres de substitució de vagons i de motors STR_REPLACE_ENGINES :Motors STR_REPLACE_WAGONS :Vagons +STR_REPLACE_ALL_RAILTYPE :Tots els vehicles ferroviaris STR_REPLACE_HELP_RAILTYPE :{BLACK}Tria el tipus de via dels models de vehicle que vols substituir STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Mostra quin model dels seleccionats a l'esquerra es substitueix, si n'hi ha STR_REPLACE_RAIL_VEHICLES :Trens de Vapor i Dièsel STR_REPLACE_ELRAIL_VEHICLES :Trens Elèctrics -STR_REPLACE_MONORAIL_VEHICLES :Trens Monorail -STR_REPLACE_MAGLEV_VEHICLES :Trens Maglev +STR_REPLACE_MONORAIL_VEHICLES :Trens monorail +STR_REPLACE_MAGLEV_VEHICLES :Trens maglev STR_REPLACE_REMOVE_WAGON :{BLACK}Treure vagons: {ORANGE}{STRING} STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Fer que la substitució automàtica mantingui la llargada del tren eliminant vagons (començant pel front), si substituint la màquina el tren es fa més llarg @@ -3653,10 +3719,11 @@ STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Anys: {L STR_VEHICLE_INFO_AGE :{COMMA} any{P "" s} ({COMMA}) STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} any{P "" s} ({COMMA}) -STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Vel. Màx.: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Vel. màx: {LTBLUE}{VELOCITY} {BLACK}Abast: {LTBLUE}{COMMA} cel·les +STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Vel. màx.: {LTBLUE}{VELOCITY} +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Velocitat màx.: {LTBLUE}{VELOCITY} {BLACK}Tipus d'aeronau: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Velocitat màx.: {LTBLUE}{VELOCITY} {BLACK}Tipus d'aeronau: {LTBLUE}{STRING} {BLACK}Abast: {LTBLUE}{COMMA} caselles STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Pes: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potència: {LTBLUE}{POWER}{BLACK} Vel. Màx: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Pes: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potència: {LTBLUE}{POWER}{BLACK} Vel. Màx: {LTBLUE}{VELOCITY} {BLACK}Màx. E.T.: {LTBLUE}{FORCE} +STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Pes: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potència: {LTBLUE}{POWER}{BLACK} Vel. màx: {LTBLUE}{VELOCITY} {BLACK}E.T. màx.: {LTBLUE}{FORCE} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Benefici d'aquest any: {LTBLUE}{CURRENCY_LONG} (darrer any: {CURRENCY_LONG}) STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Fiabilitat: {LTBLUE}{COMMA}% {BLACK}Avaries des de la darrera revisió: {LTBLUE}{COMMA} @@ -3667,7 +3734,7 @@ STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacita STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacitat: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Capacitat: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} -STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Transferir Crèdits: {LTBLUE}{CURRENCY_LONG} +STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Transferir crèdits: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS :{BLACK}Interval de les revisions: {LTBLUE}{COMMA}{NBSP}dies{BLACK} Darrera revisió: {LTBLUE}{DATE_LONG} STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Interval de les revisions: {LTBLUE}{COMMA}%{BLACK} Darrera revisió: {LTBLUE}{DATE_LONG} @@ -3884,7 +3951,7 @@ STR_ORDER_CONDITIONAL_UNCONDITIONAL :salta a l'ordre STR_ORDER_CONDITIONAL_NUM :Salta a l'ordre {COMMA} quan {STRING} {STRING} {COMMA} STR_ORDER_CONDITIONAL_TRUE_FALSE :Salta a l'ordre {COMMA} quan {STRING} {STRING} -STR_INVALID_ORDER :{RED} (Ordre incorrecte) +STR_INVALID_ORDER :{RED} (Ordre incorrecta) # Time table window STR_TIMETABLE_TITLE :{WHITE}{VEHICLE} (Horari) @@ -3976,8 +4043,8 @@ STR_AI_GAME_SCRIPT :{BLACK}Script d STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}Mostra el registre de l'script de partida. STR_ERROR_AI_NO_AI_FOUND :No s'ha trobat una IA adequada per carregar.{}Aquesta IA és una IA falsa i no farà res.{}Pots descarregar diverses IA via el sistema de "Contingut en línia" -STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Un dels scripts executant-se s'ha penjat. Si us plau, reporta això a l'autor de l'script amb una captura de pantalla de la finestra de depuració IA/Script de la Partida -STR_ERROR_AI_DEBUG_SERVER_ONLY :{WHITE}Configuració de les IA/Script de la Partida +STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Un dels scripts executant-se s'ha penjat. Si us plau, informeu-ne a l'autor de l'script amb una captura de pantalla de la finestra de depuració IA/script de la partida. +STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}La finestra de depuració de les IA i l'script de la partida només està disponible al servidor. # AI configuration window STR_AI_CONFIG_CAPTION :{WHITE}Configuració de la IA/script de partida @@ -4094,7 +4161,7 @@ STR_ERROR_BMPMAP_IMAGE_TYPE :{WHITE}... no s STR_ERROR_HEIGHTMAP_TOO_LARGE :{WHITE}... l'imatge és massa gran STR_WARNING_HEIGHTMAP_SCALE_CAPTION :{WHITE}Alerta d'escala -STR_WARNING_HEIGHTMAP_SCALE_MESSAGE :{YELLOW}No es recomana redimensionar massa el mapa d'origen. Vols continuar amb la generació? +STR_WARNING_HEIGHTMAP_SCALE_MESSAGE :{YELLOW}No es recomana redimensionar massa el mapa d'origen. Voleu continuar amb la generació? # Soundset messages STR_WARNING_FALLBACK_SOUNDSET :{WHITE}Només s'ha trobat el conjunt de sons buit. Si vols sons al joc, instal·la un conjunt de sons amb el sistema de descàrregues de continguts en línia @@ -4113,7 +4180,7 @@ STR_ERROR_MESSAGE_CAPTION_OTHER_COMPANY :{YELLOW}Missatg # Generic construction errors STR_ERROR_OFF_EDGE_OF_MAP :{WHITE}Fora del marc del mapa STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP :{WHITE}Massa prop del marc del mapa -STR_ERROR_NOT_ENOUGH_CASH_REQUIRES_CURRENCY :{WHITE}No tens prou diners - et fan falta {CURRENCY_LONG} +STR_ERROR_NOT_ENOUGH_CASH_REQUIRES_CURRENCY :{WHITE}...no teniu prou diners - us fan falta {CURRENCY_LONG}. STR_ERROR_FLAT_LAND_REQUIRED :{WHITE}Es necessita un terreny pla STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION :{WHITE}Terreny inclinat en direcció incorrecta STR_ERROR_CAN_T_DO_THIS :{WHITE}Això no es pot fer... @@ -4126,9 +4193,9 @@ STR_ERROR_AREA_IS_OWNED_BY_ANOTHER :{WHITE}... l'à STR_ERROR_TERRAFORM_LIMIT_REACHED :{WHITE}... s'ha arribat al límit de neteja de paisatge STR_ERROR_CLEARING_LIMIT_REACHED :{WHITE}... s'ha arribat al límit de neteja de cel·les STR_ERROR_TREE_PLANT_LIMIT_REACHED :{WHITE}... s'ha arribat al límit de plantat d'arbres -STR_ERROR_NAME_MUST_BE_UNIQUE :{WHITE}El nom ha de ser únic +STR_ERROR_NAME_MUST_BE_UNIQUE :{WHITE}...el nom ha de ser únic. STR_ERROR_GENERIC_OBJECT_IN_THE_WAY :{WHITE}{1:STRING} en el camí -STR_ERROR_NOT_ALLOWED_WHILE_PAUSED :{WHITE}No està permès mentre s'està en pausa +STR_ERROR_NOT_ALLOWED_WHILE_PAUSED :{WHITE}...no està permès mentre s'està en pausa. # Local authority errors STR_ERROR_LOCAL_AUTHORITY_REFUSES_TO_ALLOW_THIS :{WHITE}Les autoritats locals de {TOWN} no permeten fer això @@ -4170,7 +4237,7 @@ STR_ERROR_CAN_T_EXPAND_TOWN :{WHITE}No es po STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... massa prop del límit del mapa STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... massa prop d'una altra població STR_ERROR_TOO_MANY_TOWNS :{WHITE}... massa poblacions -STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... no queda espai al mapa +STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}...no queda espai al mapa. STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}La població no construirà carrers. Pots activar la construcció de carrers via Configuració->Interacció amb l'entorn->Poblacions STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Obres en progrés STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}No es pot eliminar aquesta població...{}Hi ha una estació, un dipòsit o una cel·la pertanyent a la població que no pot ser eliminada @@ -4182,7 +4249,7 @@ STR_ERROR_CAN_T_GENERATE_INDUSTRIES :{WHITE}No es po STR_ERROR_CAN_T_BUILD_HERE :{WHITE}Aquí no es pot construir {STRING}... STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY :{WHITE}Aquí no es pot construir aquest tipus d'indústria... STR_ERROR_INDUSTRY_TOO_CLOSE :{WHITE}... massa prop d'altres indústries -STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}... primer has de construir la població +STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}...abans s'ha de fundar una població. STR_ERROR_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}... només un permès per població STR_ERROR_CAN_ONLY_BE_BUILT_IN_TOWNS_WITH_POPULATION_OF_1200 :{WHITE}... només es pot construir en poblacions de més de 1200 hab. STR_ERROR_CAN_ONLY_BE_BUILT_IN_RAINFOREST :{WHITE}... només es pot construir en àrees de selva tropical @@ -4213,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ó... @@ -4221,24 +4287,25 @@ 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ó... -STR_ERROR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}Primer has de treure la via de l'estació +STR_ERROR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}...abans s'ha de treure l'estació de rail. STR_ERROR_CAN_T_REMOVE_BUS_STATION :{WHITE}No es pot treure l'estació d'autobusos... STR_ERROR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}No es pot treure l'estació de camions... STR_ERROR_CAN_T_REMOVE_PASSENGER_TRAM_STATION :{WHITE}No puc treure l'estació de tramvies de passatgers STR_ERROR_CAN_T_REMOVE_CARGO_TRAM_STATION :{WHITE}No puc treure l'estació de tramvies de mercaderies -STR_ERROR_MUST_REMOVE_ROAD_STOP_FIRST :{WHITE}Primer has de treure la parada +STR_ERROR_MUST_REMOVE_ROAD_STOP_FIRST :{WHITE}...abans s'ha de treure la parada. STR_ERROR_THERE_IS_NO_STATION :{WHITE}... aquí no hi ha estació -STR_ERROR_MUST_DEMOLISH_RAILROAD :{WHITE}Primer has d'enderrocar l'estació de tren -STR_ERROR_MUST_DEMOLISH_BUS_STATION_FIRST :{WHITE}Primer has d'enderrocar la parada d'autobús -STR_ERROR_MUST_DEMOLISH_TRUCK_STATION_FIRST :{WHITE}Primer has d'enderrocar l'estació de mercaderies -STR_ERROR_MUST_DEMOLISH_PASSENGER_TRAM_STATION_FIRST :{WHITE}Primer has de demolir l'estació de tramvies de passatgers -STR_ERROR_MUST_DEMOLISH_CARGO_TRAM_STATION_FIRST :{WHITE}Primer has de demolir l'estació de tramvies de mercaderies -STR_ERROR_MUST_DEMOLISH_DOCK_FIRST :{WHITE}Primer has d'enderrocar el moll -STR_ERROR_MUST_DEMOLISH_AIRPORT_FIRST :{WHITE}Primer has d'enderrocar l'aeroport +STR_ERROR_MUST_DEMOLISH_RAILROAD :{WHITE}...primer s'ha d'enderrocar l'estació de tren. +STR_ERROR_MUST_DEMOLISH_BUS_STATION_FIRST :{WHITE}...abans s'ha d'enderrocar la parada d'autobús. +STR_ERROR_MUST_DEMOLISH_TRUCK_STATION_FIRST :{WHITE}...abans s'ha d'enderrocar l'estació de mercaderies. +STR_ERROR_MUST_DEMOLISH_PASSENGER_TRAM_STATION_FIRST :{WHITE}...abans s'ha d'enderrocar l'estació de tramvia de passatgers. +STR_ERROR_MUST_DEMOLISH_CARGO_TRAM_STATION_FIRST :{WHITE}...abans s'ha d'enderrocar l'estació de tramvia de mercaderies. +STR_ERROR_MUST_DEMOLISH_DOCK_FIRST :{WHITE}...abans s'ha d'enderrocar el moll. +STR_ERROR_MUST_DEMOLISH_AIRPORT_FIRST :{WHITE}...abans s'ha d'enderrocar l'aeroport. # Waypoint related errors STR_ERROR_WAYPOINT_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}Més d'un punt de pas existent adjunt @@ -4246,10 +4313,10 @@ STR_ERROR_TOO_CLOSE_TO_ANOTHER_WAYPOINT :{WHITE}Massa pr STR_ERROR_CAN_T_BUILD_TRAIN_WAYPOINT :{WHITE}Aquí no es pot construir un punt de pas de tren... STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Aquí no es pot situar una boia... -STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}No es pot canviar el nom del punt de control... +STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}No es pot canviar el nom del punt de pas... STR_ERROR_CAN_T_REMOVE_TRAIN_WAYPOINT :{WHITE}Aquí no es pot treure un punt de pas de tren... -STR_ERROR_MUST_REMOVE_RAILWAYPOINT_FIRST :{WHITE}Primer s'ha de treure la via punt de control +STR_ERROR_MUST_REMOVE_RAILWAYPOINT_FIRST :{WHITE}...abans s'ha de treure el punt de pas. STR_ERROR_BUOY_IN_THE_WAY :{WHITE}... boia en el camí STR_ERROR_BUOY_IS_IN_USE :{WHITE}... boia en ús per una altra companyia! @@ -4286,9 +4353,9 @@ STR_ERROR_AUTOREPLACE_MONEY_LIMIT :(límit de dine # Rail construction errors STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION :{WHITE}Combinació de vies impossible -STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Abans s'han de treure els senyals +STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}...abans s'han de treure els senyals. STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Via de tren no apropiada -STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}S'ha de treure la via primer +STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}...abans s'ha de treure la via. STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}La carretera és un d'un sol sentit o està bloquejada STR_ERROR_CROSSING_DISALLOWED :{WHITE}Els passos a nivell no estan permesos en aquest tipus de via STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Aquí no es poden construir senyals... @@ -4302,7 +4369,7 @@ STR_ERROR_THERE_ARE_NO_SIGNALS :{WHITE}... no h STR_ERROR_CAN_T_CONVERT_RAIL :{WHITE}Aquí no es pot convertir el tipus de via... # Road construction errors -STR_ERROR_MUST_REMOVE_ROAD_FIRST :{WHITE}S'ha de treure la carretera primer +STR_ERROR_MUST_REMOVE_ROAD_FIRST :{WHITE}...abans s'ha de treure la carretera. STR_ERROR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION :{WHITE}... les carreteres de sentit únic no poden tenir encreuaments STR_ERROR_CAN_T_BUILD_ROAD_HERE :{WHITE}Aquí no es pot construir una carretera... STR_ERROR_CAN_T_BUILD_TRAMWAY_HERE :{WHITE}No puc construir la via de tramvia aquí... @@ -4315,12 +4382,12 @@ STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}... no h STR_ERROR_CAN_T_BUILD_CANALS :{WHITE}Aquí no es poden construir canals... STR_ERROR_CAN_T_BUILD_LOCKS :{WHITE}Aquí no es pot construir una resclosa... STR_ERROR_CAN_T_PLACE_RIVERS :{WHITE}Aquí no es poden posar rius... -STR_ERROR_MUST_BE_BUILT_ON_WATER :{WHITE}... s'han de construir sobre l'aigua +STR_ERROR_MUST_BE_BUILT_ON_WATER :{WHITE}...s'ha de construir sobre l'aigua. STR_ERROR_CAN_T_BUILD_ON_WATER :{WHITE}... no es pot construir sobre l'aigua STR_ERROR_CAN_T_BUILD_ON_SEA :{WHITE}... no es pot construir a mar obert STR_ERROR_CAN_T_BUILD_ON_CANAL :{WHITE}... no es pot construir sobre el canal STR_ERROR_CAN_T_BUILD_ON_RIVER :{WHITE}... no es pot construir sobre el riu -STR_ERROR_MUST_DEMOLISH_CANAL_FIRST :{WHITE}Has de demolir el canal primer +STR_ERROR_MUST_DEMOLISH_CANAL_FIRST :{WHITE}...abans s'ha d'enderrocar el canal. STR_ERROR_CAN_T_BUILD_AQUEDUCT_HERE :{WHITE}Aquí no es pot construir un aqüeducte... # Tree related errors @@ -4330,7 +4397,7 @@ STR_ERROR_CAN_T_PLANT_TREE_HERE :{WHITE}Aquí no # Bridge related errors STR_ERROR_CAN_T_BUILD_BRIDGE_HERE :{WHITE}Aquí no es pot construir el pont... -STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Primer has d'enderrocar el pont +STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}...abans s'ha d'enderrocar el pont. STR_ERROR_CAN_T_START_AND_END_ON :{WHITE}No es pot començar i acabar a la mateixa posició STR_ERROR_BRIDGEHEADS_NOT_SAME_HEIGHT :{WHITE}Les capçaleres del pont no són al mateix nivell STR_ERROR_BRIDGE_TOO_LOW_FOR_TERRAIN :{WHITE}El pont és massa baix pel terreny @@ -4343,7 +4410,7 @@ STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}El pont # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Aquí no es pot construir el túnel... STR_ERROR_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Lloc inadequat per l'entrada del túnel -STR_ERROR_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Primer has d'enderrocar el túnel +STR_ERROR_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}...abans s'ha d'enderrocar el túnel. STR_ERROR_ANOTHER_TUNNEL_IN_THE_WAY :{WHITE}Un altre túnel en el camí STR_ERROR_TUNNEL_THROUGH_MAP_BORDER :{WHITE}El túnel acabarà fora del mapa STR_ERROR_UNABLE_TO_EXCAVATE_LAND :{WHITE}Impossible excavar la terra a l'altre extrem del túnel @@ -4432,7 +4499,7 @@ STR_ERROR_CAN_T_MAKE_ROAD_VEHICLE_TURN :{WHITE}No s'ha STR_ERROR_AIRCRAFT_IS_IN_FLIGHT :{WHITE}L'avió està volant # Order related errors -STR_ERROR_NO_MORE_SPACE_FOR_ORDERS :{WHITE}No hi ha més espai per ordres +STR_ERROR_NO_MORE_SPACE_FOR_ORDERS :{WHITE}...no hi ha més espai disponible per ordres. STR_ERROR_TOO_MANY_ORDERS :{WHITE}Massa ordres STR_ERROR_CAN_T_INSERT_NEW_ORDER :{WHITE}No es pot afegir una nova ordre... STR_ERROR_CAN_T_DELETE_THIS_ORDER :{WHITE}No es pot esborrar aquesta ordre... @@ -4472,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 @@ -4487,9 +4556,9 @@ STR_TOWN_BUILDING_NAME_STATUE_1 :Estàtua STR_TOWN_BUILDING_NAME_FOUNTAIN_1 :Font STR_TOWN_BUILDING_NAME_PARK_1 :Parc STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_2 :Bloc d'oficines -STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1 :Botigues i Oficines +STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1 :Botigues i oficines STR_TOWN_BUILDING_NAME_MODERN_OFFICE_BUILDING_1 :Edifici d'oficines modern -STR_TOWN_BUILDING_NAME_WAREHOUSE_1 :Gran Magatzem +STR_TOWN_BUILDING_NAME_WAREHOUSE_1 :Magatzem gran STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_3 :Bloc d'oficines STR_TOWN_BUILDING_NAME_STADIUM_1 :Estadi STR_TOWN_BUILDING_NAME_OLD_HOUSES_1 :Cases velles @@ -4504,11 +4573,11 @@ STR_TOWN_BUILDING_NAME_STADIUM_2 :Estadi STR_TOWN_BUILDING_NAME_OFFICES_1 :Oficines STR_TOWN_BUILDING_NAME_HOUSES_2 :Cases STR_TOWN_BUILDING_NAME_CINEMA_1 :Cine -STR_TOWN_BUILDING_NAME_SHOPPING_MALL_1 :Grans Magatzems +STR_TOWN_BUILDING_NAME_SHOPPING_MALL_1 :Grans magatzems STR_TOWN_BUILDING_NAME_IGLOO_1 :Iglú STR_TOWN_BUILDING_NAME_TEPEES_1 :Tipis -STR_TOWN_BUILDING_NAME_TEAPOT_HOUSE_1 :Casa-Tetera -STR_TOWN_BUILDING_NAME_PIGGY_BANK_1 :Banc-Guardiola Porquet +STR_TOWN_BUILDING_NAME_TEAPOT_HOUSE_1 :Casa-tetera +STR_TOWN_BUILDING_NAME_PIGGY_BANK_1 :Banc-guardiola porquet ##id 0x4800 # industry names @@ -4554,7 +4623,7 @@ STR_INDUSTRY_NAME_SUGAR_MINE :{G=Femenin}Mina ############ These strings may never get a new id, or savegames will break! ##id 0x6000 STR_SV_EMPTY : -STR_SV_UNNAMED :Sense Nom +STR_SV_UNNAMED :Sense nom STR_SV_TRAIN_NAME :{G=Masculin}Tren {COMMA} STR_SV_ROAD_VEHICLE_NAME :{G=Masculin}Automòbil {COMMA} STR_SV_SHIP_NAME :{G=Masculin}Vaixell {COMMA} @@ -4619,95 +4688,95 @@ STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_30_ELECTRIC :SH '30' (Elèct STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_40_ELECTRIC :SH '40' (Elèctrica) STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_T_I_M_ELECTRIC :'T.I.M.' (Elèctrica) STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_ASIASTAR_ELECTRIC :'AsiaStar' (Elèctrica) -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PASSENGER_CAR :{G=Masculin}Vagó per Passatgers -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_MAIL_VAN :{G=Masculin}Vagó per Correu -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COAL_CAR :{G=Masculin}Vagó per Carbó -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_OIL_TANKER :{G=Masculin}Tanc de Petroli -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_LIVESTOCK_VAN :{G=Masculin}Vagó per Bestiar -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_GOODS_VAN :{G=Masculin}Vagó de Mercaderies -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_GRAIN_HOPPER :{G=Masculin}Vagó per Gra -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_WOOD_TRUCK :{G=Masculin}Vagó per Fusta -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_IRON_ORE_HOPPER :{G=Masculin}Vagó per Mineral de Ferro -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_STEEL_TRUCK :{G=Masculin}Vagó per Acer -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_ARMORED_VAN :{G=Masculin}Vagó Blindat -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FOOD_VAN :{G=Masculin}Vagó per Queviures -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PAPER_TRUCK :{G=Masculin}Vagó per Paper -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COPPER_ORE_HOPPER :{G=Masculin}Vagó per Mineral de Coure -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_WATER_TANKER :{G=Masculin}Tanc d'Aigua -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FRUIT_TRUCK :{G=Masculin}Vagó per Fruita -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_RUBBER_TRUCK :{G=Masculin}Vagó per Cautxú -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_SUGAR_TRUCK :{G=Masculin}Vagó per Sucre -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COTTON_CANDY_HOPPER :{G=Masculin}Vagó per Cotó de Sucre -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_TOFFEE_HOPPER :{G=Masculin}Vagó per Caramels -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_BUBBLE_VAN :{G=Masculin}Vagó per Bombolles -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COLA_TANKER :{G=Masculin}Tanc per Refresc -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_CANDY_VAN :{G=Masculin}Vagó per Dolços -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_TOY_VAN :{G=Masculin}Vagó per Joguines -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_BATTERY_TRUCK :{G=Masculin}Vagó per Piles -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FIZZY_DRINK_TRUCK :{G=Masculin}Vagó per Begudes Gasoses -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PLASTIC_TRUCK :{G=Masculin}Vagó per Plàstic +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PASSENGER_CAR :{G=Masculin}Vagó de passatgers +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_MAIL_VAN :{G=Masculin}Vagó de correu +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COAL_CAR :{G=Masculin}Vagó de carbó +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_OIL_TANKER :{G=Masculin}Tanc de petroli +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_LIVESTOCK_VAN :{G=Masculin}Vagó de bestiar +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_GOODS_VAN :{G=Masculin}Vagó de mercaderies +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_GRAIN_HOPPER :{G=Masculin}Vagó de gra +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_WOOD_TRUCK :{G=Masculin}Vagó de fusta +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_IRON_ORE_HOPPER :{G=Masculin}Vagó de mineral de ferro +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_STEEL_TRUCK :{G=Masculin}Vagó d'acer +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_ARMORED_VAN :{G=Masculin}Vagó blindat +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FOOD_VAN :{G=Masculin}Vagó de queviures +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PAPER_TRUCK :{G=Masculin}Vagó de paper +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COPPER_ORE_HOPPER :{G=Masculin}Vagó de mineral de coure +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_WATER_TANKER :{G=Masculin}Tanc d'aigua +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FRUIT_TRUCK :{G=Masculin}Vagó de fruita +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_RUBBER_TRUCK :{G=Masculin}Vagó de cautxú +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_SUGAR_TRUCK :{G=Masculin}Vagó de sucre +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COTTON_CANDY_HOPPER :{G=Masculin}Vagó de cotó de sucre +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_TOFFEE_HOPPER :{G=Masculin}Vagó de caramels +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_BUBBLE_VAN :{G=Masculin}Vagó de bombolles +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COLA_TANKER :{G=Masculin}Tanc de refresc +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_CANDY_VAN :{G=Masculin}Vagó de dolços +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_TOY_VAN :{G=Masculin}Vagó de joguines +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_BATTERY_TRUCK :{G=Masculin}Vagó de piles +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FIZZY_DRINK_TRUCK :{G=Masculin}Vagó de begudes gasoses +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PLASTIC_TRUCK :{G=Masculin}Vagó de plàstic STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_X2001_ELECTRIC :'X2001' (Elèctrica) STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_MILLENNIUM_Z1_ELECTRIC :'Millennium Z1' (Elèctrica) STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_WIZZOWOW_Z99 :Wizzowow Z99 -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_PASSENGER_CAR :{G=Masculin}Vagó de Passatgers -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_MAIL_VAN :{G=Masculin}Vagó per Correu -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COAL_CAR :{G=Masculin}Vagó per Carbó -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_OIL_TANKER :{G=Masculin}Tanc de Petroli -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_LIVESTOCK_VAN :{G=Masculin}Vagó per Bestiar -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_GOODS_VAN :{G=Masculin}Vagó de Mercaderies -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_GRAIN_HOPPER :{G=Masculin}Vagó per Gra -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_WOOD_TRUCK :{G=Masculin}Vagó per Fusta -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_IRON_ORE_HOPPER :{G=Masculin}Vagó per Mineral de Ferro -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_STEEL_TRUCK :{G=Masculin}Vagó per Acer -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_ARMORED_VAN :{G=Masculin}Vagó Blindat -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_FOOD_VAN :{G=Masculin}Vagó per Queviures -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_PAPER_TRUCK :{G=Masculin}Vagó per Paper -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COPPER_ORE_HOPPER :{G=Masculin}Vagó per Mineral de Coure -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_WATER_TANKER :{G=Masculin}Tanc d'Aigua -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_FRUIT_TRUCK :{G=Masculin}Vagó per Fruita -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_RUBBER_TRUCK :{G=Masculin}Vagó per Cautxú -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_SUGAR_TRUCK :{G=Masculin}Vagó per Sucre -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COTTON_CANDY_HOPPER :{G=Masculin}Vagó per Cotó de Sucre -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_TOFFEE_HOPPER :{G=Masculin}Vagó per Caramels -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_BUBBLE_VAN :{G=Masculin}Vagó per Bombolles -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COLA_TANKER :{G=Masculin}Tanc per Refresc -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_CANDY_VAN :{G=Masculin}Vagó per Dolços -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_TOY_VAN :{G=Masculin}Vagó per Joguines -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_BATTERY_TRUCK :{G=Masculin}Vagó per Piles -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_FIZZY_DRINK_TRUCK :{G=Masculin}Vagó per Begudes Gasoses -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_PLASTIC_TRUCK :{G=Masculin}Vagó per Plàstic +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_PASSENGER_CAR :{G=Masculin}Vagó de passatgers +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_MAIL_VAN :{G=Masculin}Vagó de correu +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COAL_CAR :{G=Masculin}Vagó de carbó +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_OIL_TANKER :{G=Masculin}Tanc de petroli +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_LIVESTOCK_VAN :{G=Masculin}Vagó de bestiar +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_GOODS_VAN :{G=Masculin}Vagó de mercaderies +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_GRAIN_HOPPER :{G=Masculin}Vagó de gra +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_WOOD_TRUCK :{G=Masculin}Vagó de fusta +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_IRON_ORE_HOPPER :{G=Masculin}Vagó de mineral de ferro +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_STEEL_TRUCK :{G=Masculin}Vagó d'acer +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_ARMORED_VAN :{G=Masculin}Vagó blindat +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_FOOD_VAN :{G=Masculin}Vagó de queviures +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_PAPER_TRUCK :{G=Masculin}Vagó de paper +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COPPER_ORE_HOPPER :{G=Masculin}Vagó de mineral de coure +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_WATER_TANKER :{G=Masculin}Tanc d'aigua +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_FRUIT_TRUCK :{G=Masculin}Vagó de fruita +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_RUBBER_TRUCK :{G=Masculin}Vagó de cautxú +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_SUGAR_TRUCK :{G=Masculin}Vagó de sucre +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COTTON_CANDY_HOPPER :{G=Masculin}Vagó de cotó de sucre +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_TOFFEE_HOPPER :{G=Masculin}Vagó de caramels +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_BUBBLE_VAN :{G=Masculin}Vagó de bombolles +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COLA_TANKER :{G=Masculin}Tanc de refresc +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_CANDY_VAN :{G=Masculin}Vagó de dolços +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_TOY_VAN :{G=Masculin}Vagó de joguines +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_BATTERY_TRUCK :{G=Masculin}Vagó de piles +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_FIZZY_DRINK_TRUCK :{G=Masculin}Vagó de begudes gasoses +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_PLASTIC_TRUCK :{G=Masculin}Vagó de plàstic STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV1_LEVIATHAN_ELECTRIC :Lev1 'Leviathan' (Elèctrica) STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV2_CYCLOPS_ELECTRIC :Lev2 'Cíclope' (Elèctrica) STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV3_PEGASUS_ELECTRIC :Lev3 'Pegasus' (Elèctrica) STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV4_CHIMAERA_ELECTRIC :Lev4 'Quimera' (Elèctrica) STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_WIZZOWOW_ROCKETEER :Wizzowow Rocketeer -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_PASSENGER_CAR :{G=Masculin}Vagó de Passatgers -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_MAIL_VAN :{G=Masculin}Vagó per Correu -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COAL_CAR :{G=Masculin}Vagó per Carbó -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_OIL_TANKER :{G=Masculin}Tanc de Petroli -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_LIVESTOCK_VAN :{G=Masculin}Vagó per Bestiar -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_GOODS_VAN :{G=Masculin}Vagó de Mercaderies -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_GRAIN_HOPPER :{G=Masculin}Vagó per Gra -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_WOOD_TRUCK :{G=Masculin}Vagó per Fusta -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_IRON_ORE_HOPPER :{G=Masculin}Vagó per Mineral de Ferro -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_STEEL_TRUCK :{G=Masculin}Vagó per Acer -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_ARMORED_VAN :{G=Masculin}Vagó Blindat -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_FOOD_VAN :{G=Masculin}Vagó per Queviures -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_PAPER_TRUCK :{G=Masculin}Vagó per Paper -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COPPER_ORE_HOPPER :{G=Masculin}Vagó per Mineral de Coure -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_WATER_TANKER :{G=Masculin}Tanc d'Aigua -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_FRUIT_TRUCK :{G=Masculin}Vagó per Fruita -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_RUBBER_TRUCK :{G=Masculin}Vagó per Cautxú -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_SUGAR_TRUCK :{G=Masculin}Vagó per Sucre -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COTTON_CANDY_HOPPER :{G=Masculin}Vagó per Cotó de Sucre -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_TOFFEE_HOPPER :{G=Masculin}Vagó per Caramels -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_BUBBLE_VAN :{G=Masculin}Vagó per Bombolles -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COLA_TANKER :{G=Masculin}Tanc per Refresc -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_CANDY_VAN :{G=Masculin}Vagó per Dolços -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_TOY_VAN :{G=Masculin}Vagó per Joguines -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_BATTERY_TRUCK :{G=Masculin}Vagó per Piles -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_FIZZY_DRINK_TRUCK :{G=Masculin}Vagó per Begudes Gasoses -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_PLASTIC_TRUCK :{G=Masculin}Vagó per Plàstic +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_PASSENGER_CAR :{G=Masculin}Vagó de passatgers +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_MAIL_VAN :{G=Masculin}Vagó de correu +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COAL_CAR :{G=Masculin}Vagó de carbó +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_OIL_TANKER :{G=Masculin}Tanc de petroli +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_LIVESTOCK_VAN :{G=Masculin}Vagó de bestiar +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_GOODS_VAN :{G=Masculin}Vagó de mercaderies +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_GRAIN_HOPPER :{G=Masculin}Vagó de gra +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_WOOD_TRUCK :{G=Masculin}Vagó de fusta +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_IRON_ORE_HOPPER :{G=Masculin}Vagó de mineral de ferro +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_STEEL_TRUCK :{G=Masculin}Vagó d'acer +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_ARMORED_VAN :{G=Masculin}Vagó blindat +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_FOOD_VAN :{G=Masculin}Vagó de queviures +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_PAPER_TRUCK :{G=Masculin}Vagó de paper +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COPPER_ORE_HOPPER :{G=Masculin}Vagó de mineral de coure +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_WATER_TANKER :{G=Masculin}Tanc d'aigua +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_FRUIT_TRUCK :{G=Masculin}Vagó de fruita +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_RUBBER_TRUCK :{G=Masculin}Vagó de cautxú +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_SUGAR_TRUCK :{G=Masculin}Vagó de sucre +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COTTON_CANDY_HOPPER :{G=Masculin}Vagó de cotó de sucre +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_TOFFEE_HOPPER :{G=Masculin}Vagó de caramels +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_BUBBLE_VAN :{G=Masculin}Vagó de bombolles +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COLA_TANKER :{G=Masculin}Tanc de refresc +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_CANDY_VAN :{G=Masculin}Vagó de dolços +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_TOY_VAN :{G=Masculin}Vagó de joguines +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_BATTERY_TRUCK :{G=Masculin}Vagó de piles +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_FIZZY_DRINK_TRUCK :{G=Masculin}Vagó de begudes gasoses +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_PLASTIC_TRUCK :{G=Masculin}Vagó de plàstic STR_VEHICLE_NAME_ROAD_VEHICLE_MPS_REGAL_BUS :{G=Masculin}Autobús MPS Regal STR_VEHICLE_NAME_ROAD_VEHICLE_HEREFORD_LEOPARD_BUS :{G=Masculin}Autobús Hereford Leopard STR_VEHICLE_NAME_ROAD_VEHICLE_FOSTER_BUS :{G=Masculin}Autobús Foster diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index d335c7fc0e..fc7a6a53bb 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -200,7 +200,7 @@ STR_QUANTITY_GRAIN :{WEIGHT_LONG} STR_QUANTITY_WOOD :{WEIGHT_LONG} drveta STR_QUANTITY_IRON_ORE :{WEIGHT_LONG} željezne rude STR_QUANTITY_STEEL :{WEIGHT_LONG} čelika -STR_QUANTITY_VALUABLES :{COMMA}{NBSP}vreć{P a e a} s vrijednosnicama +STR_QUANTITY_VALUABLES :{COMMA}{NBSP}vreć{P a e a} s dragocjenostima STR_QUANTITY_COPPER_ORE :{WEIGHT_LONG} bakrene rude STR_QUANTITY_MAIZE :{WEIGHT_LONG} kukuruza STR_QUANTITY_FRUIT :{WEIGHT_LONG} voća @@ -242,7 +242,7 @@ STR_ABBREV_FRUIT :{TINY_FONT}VĆ STR_ABBREV_DIAMONDS :{TINY_FONT}DM STR_ABBREV_FOOD :{TINY_FONT}HN STR_ABBREV_PAPER :{TINY_FONT}PR -STR_ABBREV_GOLD :{TINY_FONT}AU +STR_ABBREV_GOLD :{TINY_FONT}ZL STR_ABBREV_WATER :{TINY_FONT}VO STR_ABBREV_WHEAT :{TINY_FONT}PŠ STR_ABBREV_RUBBER :{TINY_FONT}GM @@ -571,8 +571,9 @@ 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 :Poravnjanje sprite-a +STR_ABOUT_MENU_SPRITE_ALIGNER :Poravnanje spritea STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Odaberi granične okvire STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Mijenjaj boju blatnih blokova ############ range ends here @@ -746,6 +747,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}Nema dostupne muzike STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}" STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Traka STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Naslov @@ -765,20 +767,20 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Odaberi STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Uključi/isključi miješanje programa STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Pokaži prozor za izbor glazbenih traka -STR_ERROR_NO_SONGS :{WHITE}Odabran je set glazbe bez pjesama. Ne će se puštati nikakve pjesme - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Izbor glazbenog programa +STR_PLAYLIST_MUSIC_SELECTION_SETNAME :{WHITE}Program muzike - '{STRING}' STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Popis traka STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Program- '{STRING}' STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Obriši +STR_PLAYLIST_CHANGE_SET :{BLACK}Promijeni set STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Obriši aktivni program (samo Proizvoljno 1 ili Proizvoljno 2) +STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Promijeni odabir muzike na neki drugi instalirani set STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klikni na glazbenu traku za dodavanje u aktivni program (samo Proizvoljno 1 ili Proizvoljno 2) STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klikni na glazbenu traku kako bi ju uklonio iz trenutnog programa (samo Proizvoljno 1 ili Proizvoljno 2) # Highscore window -STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Najbolje tvrtke koje su dosigle razinu {NUM} +STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Najbolje tvrtke do {NUM}. godine STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Tablica tvrtki u {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Privrednik @@ -909,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! @@ -962,13 +965,13 @@ STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_OR_CARGO :{WHITE}{STATION STR_NEWS_STATION_NOW_ACCEPTS_CARGO :{WHITE}{STATION} od sada prihvaća {STRING.aku} STR_NEWS_STATION_NOW_ACCEPTS_CARGO_AND_CARGO :{WHITE}{STATION} od sada prihvaća {STRING.aku} i {STRING.aku} -STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Istekla je ponuda subvencije:{}{}prijevoz {STRING.gen} od {STRING} do {STRING} više neće biti subvencioniran +STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Istekla je ponuda za poticaje:{}{}prijevoz {STRING.gen} od {STRING} do {STRING} više neće biti potican STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Subvencija je povučena:{}{}prijevoz {STRING.gen} od {STRING} do {STRING} više nije subvencioniran -STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Ponuđena je subvencija:{}{}Prvi koji preveze {STRING.aku} od {STRING} do {STRING} primat će jednogodišnju subvenciju od lokalne samouprave! +STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Ponuđen je poticaj:{}{}Prvi koji preveze {STRING.aku} od {STRING} do {STRING} primat će jednogodišnji poticaj lokalne samouprave! STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}Subvencija je dodijeljena tvrtki {STRING}!{}{}Prijevoz {STRING.gen} od postaje {STRING} do postaje {STRING} plaćat će se 50% više sljedećih godinu dana! STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}Subvencija je dodijeljena tvrtki {STRING}!{}{}Prijevoz {STRING.gen} od postaje {STRING} do postaje {STRING} plaćat će se dvostruko sljedećih godinu dana! -STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Subvencija je dodijeljena tvrtki {STRING}!{}{}Prijevoz {STRING.gen} od postaje {STRING} do postaje {STRING} plaćat će se trostruko sljedećih godinu dana! -STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Subvencija je dodijeljena tvrtki {STRING}!{}{}Prijevoz {STRING.gen} od postaje {STRING} do postaje {STRING} plaćat će se četverostruko sljedećih godinu dana! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Poticaj je dodijeljen tvrtki {STRING}!{}{}Prijevoz {STRING.gen} od postaje {STRING} do postaje {STRING} plaćat će se trostruko sljedećih godinu dana! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Poticaj je dodijeljen tvrtki {STRING}!{}{}Prijevoz {STRING.gen} od postaje {STRING} do postaje {STRING} plaćat će se četverostruko sljedećih godinu dana! STR_NEWS_ROAD_REBUILDING :{BIG_FONT}{BLACK}Grad {TOWN} zahvatio je prometni kaos!{}{}Program rekonstrukcije cesta koji financira tvrtka {STRING} sljedećih će 6 mjeseci zadavati glavobolje motoriziranima! STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Monopol transporta! @@ -976,10 +979,10 @@ STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLAC # Extra view window STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Mini pogled {COMMA} -STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Kopiraj u mini pogled +STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Promijeni pogled STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Kopiraj lokaciju globalnog pogleda u ovaj mini pogled -STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Zalijepi iz mini pogleda -STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Zalijepi lokaciju ovog mini pogleda u globalni pogled +STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Promijeni glavni pogled +STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Kopiraj lokaciju ovog mini pogleda u glavni pogled # Game options window STR_GAME_OPTIONS_CAPTION :{WHITE}Postavke igre @@ -1021,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 @@ -1245,7 +1249,7 @@ STR_CONFIG_SETTING_CONSTRUCTION_SPEED :Brzina gradnje: STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :Limitiraj količinu građevinskih akcija za UI-je STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :Kvarovi vozila: {STRING} STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :Kontroliraj kako često se mogu pokvariti loše servisirana vozila -STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER :Množitelj za subvencije: {STRING} +STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER :Množitelj za poticaje: {STRING} STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :Postavi koliko se plaća za subvencionirane veze STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Građevinski troškovi: {STRING} STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Postavi razinu građevinskih troškova i troškova kupnje @@ -1385,9 +1389,9 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Debljina linija STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Debljina linije u grafikonima. Tanja linija je preciznija za čitanje, deblja linija je lakša za vidjeti i boje su lakše za razabrati STR_CONFIG_SETTING_LANDSCAPE :Krajolik: {STRING} -STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Tereni definiraju osnovne scenarije za igru sa različitim teretima i preduvjetima za rast gradova. NewGRF-ovi i Skripte Igre dozvoljavaju detaljnije kontrole i postavke. +STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Tereni određuju osnovne scenarije za igru s različitim teretima i preduvjetima za rast gradova. NewGRF-ovi i Skripte Igre omogućavaju detaljnije kontrole i postavke. STR_CONFIG_SETTING_LAND_GENERATOR :Generator zemlje: {STRING} -STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT :Originalni generator ovisi o baznom grafičkom setu i stvara fiksne oblike u terenu. TerraGenesis je generator baziran na Perlinu sa detaljnijim kontrolama i postavkama. +STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT :Izvorni generator ovisi o osnovnom grafičkom setu i stvara fiksne oblike terena. TerraGenesis je generator temeljen na Perlinovom šumu s detaljnijim kontrolama i postavkama. STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Izvorni STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_TERRAIN_TYPE :Vrsta terena: {STRING} @@ -1433,8 +1437,12 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Boja terena na STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :{G=female}Zelena STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :{G=female}Tamno zelena STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :{G=female}Ljubičasta -STR_CONFIG_SETTING_REVERSE_SCROLLING :Promijeni smjer klizanja: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Ponašanje kod pomicanja karte desnim gumbom miša. Kada je isključeno, miš pomiče kameru. Kada je uključeno, miš pomiče kartu +STR_CONFIG_SETTING_SCROLLMODE :Ponašanje klizanja kroz mini pogled: {STRING} +STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Ponašanje kod klizanja kroz mapu +STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Pomiči mini pogled sa desnom tipkom miša, pozicija miša zaključana +STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Pomiči mapu sa desnom tipkom miša, pozicija miša zaključana +STR_CONFIG_SETTING_SCROLLMODE_RMB :Pomiči mapu sa desnom tipkom miša +STR_CONFIG_SETTING_SCROLLMODE_LMB :Pomiči mapu sa lijevom tipkom miša STR_CONFIG_SETTING_SMOOTH_SCROLLING :Glatko klizanje kroz mini pogled: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Odredi kako se glavni prikaz pomiče na određeno mjesto kada se klikne na malu kartu ili kada se izda naredba za pomicanje na određeni objekt na karti. Ako je uključeno, prikaz se pomiče glatko, ako je isključeno, prikaz izravno skače na ciljnu lokaciju STR_CONFIG_SETTING_MEASURE_TOOLTIP :Pokaži mjerni naputak prilikom korištenja raznih alata za izgradnju: {STRING} @@ -1466,8 +1474,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+klik STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Control+klik STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Isključeno -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Skrolanje lijevim klikom: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Uključi pomicanje karte povlačenjem pomoću lijevog gumba miša. Ovo je posebno korisno kada se koristi zaslon osjetljiv na dodir +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Zatvori prozor nakon desnog klika: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Zatvara prozor nakon desnog klika unutar prozora. S desnim klikom zatvaraju se i upute alata! STR_CONFIG_SETTING_AUTOSAVE :Automatsko snimanje: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Odaberite interval između automatskog snimanja igre @@ -1578,17 +1586,17 @@ STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT :Uključivanjem STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN :Dolazak prvog vozila na postaju igrača: {STRING} STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN_HELPTEXT :Prikaži novine kada prvo vozilo dođe na stanicu novog igrača STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER :Dolazak prvog vozila na postaju suparnika: {STRING} -STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER_HELPTEXT :Prikaži novine kada prvo vozilo dođe na suparnikovu stanicu +STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER_HELPTEXT :Prikaži novosti kada prvo vozilo dođe na protivničku postaju STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :Nesreće / katastrofe: {STRING} STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS_HELPTEXT :Prikaži novine kod nesreća ili katastrofa STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Podaci vezani za tvrtku: {STRING} -STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Prikaži novine kada se pojavi nova tvrtka ili kada tvrtke riskiraju bankrot +STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Prikaži novosti kada se pojavi nova tvrtka ili kada tvrtke riskiraju bankrot STR_CONFIG_SETTING_NEWS_INDUSTRY_OPEN :Otvaranje industrije: {STRING} STR_CONFIG_SETTING_NEWS_INDUSTRY_OPEN_HELPTEXT :Prikaži novine kada se nove industrije otvaraju STR_CONFIG_SETTING_NEWS_INDUSTRY_CLOSE :Zatvaranje industrije: {STRING} -STR_CONFIG_SETTING_NEWS_INDUSTRY_CLOSE_HELPTEXT :Prikaži novine kada se industrije zatvaraju -STR_CONFIG_SETTING_NEWS_ECONOMY_CHANGES :Promjene u gospodarstvu: {STRING} -STR_CONFIG_SETTING_NEWS_ECONOMY_CHANGES_HELPTEXT :Prikaži novine vezano za globalne promjene u ekonomiji +STR_CONFIG_SETTING_NEWS_INDUSTRY_CLOSE_HELPTEXT :Prikaži novosti kada se industrije zatvaraju +STR_CONFIG_SETTING_NEWS_ECONOMY_CHANGES :Gospodarske promjene: {STRING} +STR_CONFIG_SETTING_NEWS_ECONOMY_CHANGES_HELPTEXT :Prikaži novosti vezane za globalne gospodarske promjene STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY :Promjene u proizvodnji industrija koje opslužuje tvrtka: {STRING} STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY_HELPTEXT :Prikaži novine kod promjene proizvodnih razina industrija koje tvrtka opslužuje STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER :Promjene u proizvodnji industrija koje opslužuju suparnici: {STRING} @@ -1600,11 +1608,11 @@ STR_CONFIG_SETTING_NEWS_ADVICE_HELPTEXT :Prikaži poruke STR_CONFIG_SETTING_NEWS_NEW_VEHICLES :Nova vozila: {STRING} STR_CONFIG_SETTING_NEWS_NEW_VEHICLES_HELPTEXT :Prikaži novine kada neki novi tip vozila postane dostupan STR_CONFIG_SETTING_NEWS_CHANGES_ACCEPTANCE :Promjene u prihvaćanju tereta: {STRING} -STR_CONFIG_SETTING_NEWS_CHANGES_ACCEPTANCE_HELPTEXT :Prikaži poruke o stanicama koje mijenjaju prihvaćanje nekih tereta +STR_CONFIG_SETTING_NEWS_CHANGES_ACCEPTANCE_HELPTEXT :Prikaži poruke o postajama koje mijenjaju prihvaćanje nekih tereta STR_CONFIG_SETTING_NEWS_SUBSIDIES :Subvencije: {STRING} -STR_CONFIG_SETTING_NEWS_SUBSIDIES_HELPTEXT :Prikaži novine vezano za događaje o subvencijama +STR_CONFIG_SETTING_NEWS_SUBSIDIES_HELPTEXT :Prikaži novosti vezane za poticaje STR_CONFIG_SETTING_NEWS_GENERAL_INFORMATION :Opće informacije: {STRING} -STR_CONFIG_SETTING_NEWS_GENERAL_INFORMATION_HELPTEXT :Prikaži novine vezano za opće događaje kao za kupnju ekskluzivnih prava ili financiranje rekonstrukcije cesta +STR_CONFIG_SETTING_NEWS_GENERAL_INFORMATION_HELPTEXT :Prikaži novosti vezane za opće događaje kao što su kupnja ekskluzivnih prava ili financiranje rekonstrukcije cesta STR_CONFIG_SETTING_NEWS_MESSAGES_OFF :Isključeno STR_CONFIG_SETTING_NEWS_MESSAGES_SUMMARY :Sažetak @@ -1613,7 +1621,7 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Sve STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Vijesti u boji pojavljuju se: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Godina u kojoj će se novine početi izdavati u boji. Prije ove godine, koriste se crno/bijele novine STR_CONFIG_SETTING_STARTING_YEAR :Početna godina: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :Uključi tečnu ekonomiju (više manjih izazova): {STRING} +STR_CONFIG_SETTING_SMOOTH_ECONOMY :Uključi stabilno gospodarstvo (više manjih izazova): {STRING} STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Kada je uključeno, promjene u industrijskoj proizvodnji su češće ali u manjim rasponima. Ova postavka obično nema efekta ukoliko su industrije postavljene iz nekog NewGRF-a STR_CONFIG_SETTING_ALLOW_SHARES :Dopusti kupovanje udjela u drugim tvrtkama: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Kada je uključeno, dopušta se kupnja i prodaja dionica tvrtki. Dionice će postati dostupne samo za tvrtke određene starosti @@ -1649,11 +1657,11 @@ STR_CONFIG_SETTING_TOWN_LAYOUT_RANDOM :Nasumično STR_CONFIG_SETTING_ALLOW_TOWN_ROADS :Gradovi mogu graditi ceste: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Dopusti gradovima građenje cesta u svrhu rasta. Isključi za sprečavanje gradskih vlasti u samostalnoj gradnji cesta STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Gradovi smiju graditi pružne prijelaze: {STRING} -STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Uključivanje ove postavke dozvoljava se gradovima da grade cestovno-pružne prijelaze +STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Uključivanje ove postavke dopušta gradovima izgradnju cestovno-pružnih prijelaza STR_CONFIG_SETTING_NOISE_LEVEL :Omogući određivanje razine buke za zračne luke od strane gradova: {STRING} STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Kada je ova postavka isključena, mogu postojati dvije zračne luke u svakom gradu. Kada je ova postavka uključena, broj zračnih luka u nekom gradu je ograničen količinom dopuštene buke u gradu, koja ovisi o broju stanovnika i udaljenosti i veličini zračne luke STR_CONFIG_SETTING_TOWN_FOUNDING :Osnivanje gradova tijekom igre: {STRING} -STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Uklučivanje ove postavke dozvoljava igračima osnivanje novih gradova tijekom igre +STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Uklučivanje ove postavke dopušta igračima osnivanje novih gradova tijekom igre STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN :Zabranjeno STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :Dopušteno STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED_CUSTOM_LAYOUT :Dopušteno, proizvoljan raspored grada @@ -1712,7 +1720,7 @@ STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"Simetrično" z STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Način distribucije pošte: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :"Simetrično" znači da će se otprilike ista količina pošte slati od stanice A prema stanici B ako od B prema A. "Asimetrično" znači da će se proizvoljne količine pošte slati u oba smjera. "Ručno" znači da se distribucija neće vršiti automatski. STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Način distribucije za OKLOPLJENU klasu tereta: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :OKLOPLJENA klasa tereta sadrži vrijednosnice u umjerenoj klimi, dijamante u subtropskoj klimi ili zlato u subarktičkoj klimi. NewGFR-ovi bi mogli ovo izmijeniti. "Simetrično" znači da će se otprilike ista količina tereta slati od stanice A prema stanici B kao od B prema A. "Asimetrično" znači da će se proizvoljne količine tereta slati u oba smjera. "Ručno" znači da se distribucija tih tereta neće vršiti automatski. Preporučljivo je namjestiti ovu postavku na "asimetrično" ili "ručno" kod subarktičke klime jer banke neće slati zlato natrag prema rudnicima zlata. Za umjerenu i subtropsku klimu možete namjestiti i "simetrično" jer će banke slati neke vrijednosnice natrag prema izvorišnoj banci. +STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :OKLOPLJENA klasa tereta sadrži dragocjenosti u umjerenoj klimi, dijamante u subtropskoj klimi ili zlato u subarktičkoj klimi. NewGFR-ovi bi mogli ovo izmijeniti. "Simetrično" znači da će se otprilike ista količina tereta slati od stanice A prema stanici B kao od B prema A. "Asimetrično" znači da će se proizvoljne količine tereta slati u oba smjera. "Ručno" znači da se distribucija tih tereta neće vršiti automatski. Preporučljivo je namjestiti ovu postavku na "asimetrično" ili "ručno" kod subarktičke klime jer banke neće slati zlato natrag prema rudnicima zlata. Za umjerenu i subtropsku klimu možete namjestiti i "simetrično" jer će banke slati neke dragocjenosti natrag prema izvorišnoj banci. STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Način distribucije za ostale klase tereta: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"Asimetrično" znači da će se proizvoljna količina tereta slati u bilo kojem smjeru. "Ručno" znači da neće biti nikakve automatske distribucije za te terete. STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Točnost distribucije: {STRING} @@ -1857,6 +1865,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Provjeri STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Prikaži postavke UI-ja/Skripte igre STR_INTRO_TOOLTIP_QUIT :{BLACK}Izzađi it 'OpenTTD'-a +STR_INTRO_BASESET :{BLACK}Trenutno odabranom osnovnom grafičkom setu nedostaje {NUM} sprite{P "" a a}. Potražite nadogradnju grafičkog seta. STR_INTRO_TRANSLATION :{BLACK}Ovom prijevodu nedostaje {NUM} slijed. Molimo, pomognite učiniti OpenTTD boljim tako da se prijavite kao prevoditelj. Pogledajte readme.txt za detalje. # Quit window @@ -1879,8 +1888,8 @@ STR_OSNAME_SUNOS :SunOS # Abandon game STR_ABANDON_GAME_CAPTION :{WHITE}Napusti igru -STR_ABANDON_GAME_QUERY :{YELLOW}Jesi li siguran da želiš napustiti ovu igru? -STR_ABANDON_SCENARIO_QUERY :{YELLOW}Jesi li siguran da želiš napustiti ovaj scenarij? +STR_ABANDON_GAME_QUERY :{YELLOW}Doista želiš napustiti ovu igru? +STR_ABANDON_SCENARIO_QUERY :{YELLOW}Doista želiš napustiti ovaj scenarij? # Cheat window STR_CHEATS :{WHITE}Varanje @@ -2374,10 +2383,11 @@ STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Namjesti STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Učini objekte nevidljivima umjesto prozirnima # Linkgraph legend window -STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Legenda protoka tereta +STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Kazalo protoka tereta STR_LINKGRAPH_LEGEND_ALL :{BLACK}Sve STR_LINKGRAPH_LEGEND_NONE :{BLACK}Ništa STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Odaberi tvrtke koje će se prikazati +STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY} # Linkgraph legend window and linkgraph legend in smallmap STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}nekorišten @@ -2449,13 +2459,13 @@ STR_STATION_CLASS_WAYP :Čvorišta # Signal window STR_BUILD_SIGNAL_CAPTION :{WHITE}Izbornik signala -STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Standardni signal (semafor){}Ovo je najosnovnija vrsta signala, dozvoljava istovremeno samo jedan vlak u bloku +STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Standardni signal (semafor){}Ovo je najosnovnija vrsta signala, dopušta istovremeno samo jedan vlak u bloku STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Ulazni signal (semafor){}Zeleno sve dok je jedan ili više zelenih izlaznih signala na sljedećem dijelu pruge. U protivnom pokazuje crveno STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Izlazni signal (semafor){}Ponaša se na isti način kao i normalni signali, ali je nužno pogoditi točnu boju na ulaznim i kombo pred-signalima STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TOOLTIP :{BLACK}Kombo signal (semafor){}Kombo signal jednostavno radi kao ulazni i izlazni signal. Ovo omogućava izgradnju velike "mreže" pred-signala. STR_BUILD_SIGNAL_SEMAPHORE_PBS_TOOLTIP :{BLACK}Putni signal (semafor){}Putni signal omogućava da više od jednog vlaka uđe istovremeno u signalni blok, ako vlak može rezervirati putanju do sigurnog zaustavnog mjesta. Standardne putne signale moguće je proći iz suprotnog smjera. STR_BUILD_SIGNAL_SEMAPHORE_PBS_OWAY_TOOLTIP :{BLACK}Jednosmjerni putni signal (semafor){}Putni signal omogućava da više od jednog vlaka uđe istovremeno u signalni blok, ako vlak može rezervirati putanju do sigurnog zaustavnog mjesta. Jednosmjerne putne signale nije moguće proći iz suprotnog smjera -STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP :{BLACK}Standardni signal (električni){}Ovo je najosnovnija vrsta signala, dozvoljava istovremeno samo jedan vlak u bloku +STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP :{BLACK}Standardni signal (električni){}Ovo je najosnovnija vrsta signala, istovremeno dopušta samo jedan vlak u bloku STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP :{BLACK}Ulazni signal (električni){}Zeleno sve dok je jedan ili više zelenih izlaznih signala na sljedećem dijelu pruge. U protivnom pokazuje crveno STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Izlazni signal (električni){}Ponaša se na isti način kao i normalni signali, ali je nužno pogoditi točnu boju na ulaznim i kombo pred-signalima. STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Kombo signal (električni){}Kombo signal jednostavno radi kao ulazni i izlazni signal. Ovo omogućava izgradnju velike "mreže" pred-signala. @@ -2569,7 +2579,7 @@ STR_STATION_BUILD_NOISE :{BLACK}Proizved STR_LANDSCAPING_TOOLBAR :{WHITE}Uređivanje krajolika STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Snizi jedan kut zemlje. Povlačenje snižava prvi odabrani kut i poravnava selektirano područje na novu visinu prvog kuta. Ctrl selektira područje dijagonalno. Shift mijenja prikaz građenje/procjena troškova. STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Podigni jedan kut zemlje. Povlačenje podiže prvi odabrani kut i poravnava selektirano područje na novu visinu prvog kuta. Ctrl selektira područje dijagonalno. Shift mijenja prikaz građenje/procjena troškova. -STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Poravnaj područje zemlje na visinu prvog odabranog kuta. Ctrl selektira područje dijagonalno. Shift mijenja prikaz građenje/procjena troškova. +STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Izravnaj zemlju na visinu prvog odabranog kuta. Ctrl odabire područje dijagonalno. Shift mijenja prikaz građenje/procjena troškova. STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Kupi zemlju za buduću uporabu. Shift mijenja prikaz građenje/procjena troškova. # Object construction window @@ -2685,6 +2695,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Naziv po STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Prihvaćeni teret: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Vrsta željeznice: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Najveća brzina željeznice: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Ograničenje brzine na cesti: {LTBLUE}{VELOCITY} @@ -2697,29 +2708,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Polja STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Zemlja pokrivena snijegom STR_LAI_CLEAR_DESCRIPTION_DESERT :Pustinja -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} pruga -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} pruga sa blok-signalima -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} pruga sa pred-signalima -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} pruga sa izlaznim signalima -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} pruga sa kombiniranim signalima -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} pruga sa putnim signalima -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} pruga sa jednosmjernim putnim signalima -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} pruga sa blok-signalima i pred-signalima -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} pruga sa blok-signalima i izlaznim signalima -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} pruga sa blok-signalima i kombiniranim signalima -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} pruga sa blok-signalima i putnim signalima -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} pruga sa blok-signalima i jednosmjernim putnim signalima -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} pruga sa pred-signalima i izlaznim signalima -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} pruga sa pred-signalima i kombiniranim signalima -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} pruga sa pred-signalima i putnim signalima -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} pruga sa pred-signalima i jednosmjernim putnim signalima -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} pruga sa izlaznim i kombiniranim signalima -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} pruga sa izlaznim i putnim signalima -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} pruga sa izlaznim i jednosmjernim putnim signalima -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} pruga sa kombiniranim i putnim signalima -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} pruga sa kombiniranim i jednosmjernim putnim signalima -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} pruga sa putnim i jednosmjernim putnim signalima -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} spremište vlaka +STR_LAI_RAIL_DESCRIPTION_TRACK :Pruga +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Pruga sa blok-signalima +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Pruga sa pred-signalima +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Pruga sa izlaznim signalima +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Pruga sa kombiniranim signalima +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Pruga sa putnim signalima +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Pruga sa jednosmjernim putnim signalima +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Pruga sa blok-signalima i pred-signalima +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Pruga sa blok-signalima i izlaznim signalima +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Pruga sa blok-signalima i kombiniranim signalima +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Pruga sa blok-signalima i putnim signalima +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Pruga sa blok-signalima i jednosmjernim putnim signalima +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Pruga sa pred-signalima i izlaznim signalima +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Pruga sa pred-signalima i kombiniranim signalima +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Pruga sa pred-signalima i putnim signalima +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Pruga sa pred-signalima i jednosmjernim putnim signalima +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Pruga sa izlaznim i kombiniranim signalima +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Pruga sa izlaznim i putnim signalima +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Pruga sa izlaznim i jednosmjernim putnim signalima +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Pruga sa kombiniranim i putnim signalima +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Pruga sa kombiniranim i jednosmjernim putnim signalima +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Pruga sa putnim i jednosmjernim putnim signalima +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Spremište vlakova STR_LAI_ROAD_DESCRIPTION_ROAD :Cesta STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Cesta s javnom rasvjetom @@ -2783,7 +2794,57 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Zemlja u posjed STR_ABOUT_OPENTTD :{WHITE}O OpenTTD-u STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Izvorno autorsko pravo {COPYRIGHT} 1995 Chris Sawyer, sva prava pridržana STR_ABOUT_VERSION :{BLACK}OpenTTD verzija {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 OpenTTD tim +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 @@ -2807,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 @@ -3002,11 +3064,11 @@ STR_NEWGRF_ERROR_INVALID_ID :Pokušaj koriš STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} sadrži neispravan sprite. Svi neispravni grafički znakovi bit će pokazani kao crveni upitnik (?). STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Sadrži višestruke unose za Action 8 (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Pročitaj nakon kraja od pseudo-sprite (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Baznom grafičkom setu u uporabi nedostaju neki spriteovi.{}Ažurirajte bazni grafički set -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Trenutno korištenom osnovnom grafičkom setu nedostaju pojedini crteži.{}Molimo da nadogradite osnovni grafički set.{}Pošto igrate {YELLOW}razvojnu inačicu OpenTTD-a{WHITE}, možda će vam trebati i {YELLOW}razvojna inačica osnovnog grafičkog seta{WHITE} 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! @@ -3071,6 +3133,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Unesi im STR_TOWN_DIRECTORY_CAPTION :{WHITE}Gradovi STR_TOWN_DIRECTORY_NONE :{ORANGE}- Ništa - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Grad){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Imena gradova - klikni na ime kako bi centrirao pogled na grad. Ctrl+klik otvara novi prozor sa lokacijom grada STR_TOWN_POPULATION :{BLACK}Svjetsko stanovništvo: {COMMA} @@ -3078,8 +3141,7 @@ STR_TOWN_POPULATION :{BLACK}Svjetsko STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Metropola) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Stanovništvo: {ORANGE}{COMMA}{BLACK} Kuće: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Putnika prošli mjesec: {ORANGE}{COMMA}{BLACK} najviše: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Pošte prošli mjesec: {ORANGE}{COMMA}{BLACK} najviše: {ORANGE}{COMMA} +STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} prošli mjesec: {ORANGE}{COMMA}{BLACK} maks: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Potrebno tereta za rast grada: 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 @@ -3210,8 +3272,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Prihvać STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Pokaži popis tereta koji se prihvaća STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Prihvaća: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Ova stanica ima ekskluzivna prava trasnporta u ovom gradu. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} kupljena ekskluzivna prava transporta u ovom gradu. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Ova stanica ima ekskluzivna prava trasnporta u ovom gradu. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} kupljena ekskluzivna prava transporta u ovom gradu. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Ocjene STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Pokaži ocjene postaje @@ -3390,9 +3452,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Treba: { STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Treba: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Treba: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} čeka{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Teret koji čeka obradu: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Proizvodi: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Proizvodi: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3459,6 +3523,11 @@ 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 uporaba: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nova željeznička vozila STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nova električna pružna vozila @@ -3490,6 +3559,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Sve vrste teret STR_PURCHASE_INFO_ALL_BUT :Sve osim {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK} Najveća vučna sila: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Domet: {GOLD}{COMMA} polja +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Vrsta zrakoplova: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Popis vlakova za odabir. Klikni na vozilo za informacije. Ctrl+klik za uključivanje ili isključivanje prikaza vrste vozila STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Popis cestovnih vozila za odabir. Klikni na vozilo za informacije. Ctrl+klik za uključivanje ili isključivanje prikaza vrste cestovnog vozila @@ -3623,10 +3693,11 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :maglev lokomoti STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Cijena: {CURRENCY_LONG} Težina: {WEIGHT_SHORT}{}Brzina: {VELOCITY} Snaga: {POWER}{}Trošak uporabe: {CURRENCY_LONG}/god{}Kapacitet: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Trošak: {CURRENCY_LONG} Težina: {WEIGHT_SHORT}{}Brzina: {VELOCITY} Snaga: {POWER} Maks. T.E.: {6:FORCE}{}Trošak uporabe: {4:CURRENCY_LONG}/god{}Nosivost: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Trošak: {CURRENCY_LONG} Maks. brzina: {VELOCITY}{}Nosivost: {CARGO_LONG}, {CARGO_LONG}{}Trošak uporabe: {CURRENCY_LONG}/god -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Trošak: {CURRENCY_LONG} Maks. brzina: {VELOCITY}{}Nosivost: {CARGO_LONG}{}Trošak uporabe: {CURRENCY_LONG}/god -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Cijena: {CURRENCY_LONG} Maks. brzina: {VELOCITY} Domet: {COMMA} tiles{}Kapacitet: {CARGO_LONG}, {CARGO_LONG}{}Trošak vožnje: {CURRENCY_LONG}/god -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Cijena: {CURRENCY_LONG} Maks. Brzina: {VELOCITY} Domet: {COMMA} tiles{}Kapacitet: {CARGO_LONG}{}Trošak vožnje: {CURRENCY_LONG}/god +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Trošak: {CURRENCY_LONG} Maks. brzina: {VELOCITY}{}Nosivost: {CARGO_LONG}{}Trošak uporabe: {CURRENCY_LONG}/god +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Trošak: {CURRENCY_LONG} Maks. brzina: {VELOCITY}{}Vrsta zrakoplova: {STRING}{}Kapacitet: {CARGO_LONG}, {CARGO_LONG}{}Trošak uporabe: {CURRENCY_LONG}/god +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Trošak: {CURRENCY_LONG} Maks. brzina: {VELOCITY}{}Vrsta zrakoplova: {STRING}{}Kapacitet: {CARGO_LONG}{}Trošak uporabe: {CURRENCY_LONG}/god +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Trošak: {CURRENCY_LONG} Maks. brzina: {VELOCITY}{}Vrsta zrakoplova: {STRING} Doseg: {COMMA} polja{}Kapacitet: {CARGO_LONG}, {CARGO_LONG}{}Trošak uporabe: {CURRENCY_LONG}/god +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Trošak: {CURRENCY_LONG} Maks. brzina: {VELOCITY}{}Vrsta zrakoplova: {STRING} Doseg: {COMMA} polja{}Kapacitet: {CARGO_LONG}{}Trošak uporabe: {CURRENCY_LONG}/god # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Zamijeni {STRING} - {STRING} @@ -3653,10 +3724,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} kada j STR_REPLACE_VEHICLES_STOP :{BLACK}Prestani zamijenjivati vozila STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Klikni za zaustavljanje zamjene lijevo odabrane vrste lokomotive -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Zamjenjujem:{ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Prebaci između prozora za izmjenu lokomotiva i vagona STR_REPLACE_ENGINES :Lokomotive STR_REPLACE_WAGONS :Vagoni +STR_REPLACE_ALL_RAILTYPE :Sva pružna vozila STR_REPLACE_HELP_RAILTYPE :{BLACK}Odaberite vrstu željeznice za koju želite zamijeniti lokomotive STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Prikazuje sa kojom se lokomotivom zamjenjuje lijevo odabrana lokomotiva, ako postoji koji @@ -3749,7 +3820,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_RANGE :{BLACK}Najveća brzina: {LTBLUE}{VELOCITY} {BLACK}Domet: {LTBLUE}{COMMA} polj{P e a a} +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Maks. brzina: {LTBLUE}{VELOCITY} {BLACK}Vrsta zrakoplova: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Maks. brzina: {LTBLUE}{VELOCITY} {BLACK}Vrsta zrakoplova: {LTBLUE}{STRING} {BLACK}Doseg: {LTBLUE}{COMMA} polja 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 sila: {LTBLUE}{FORCE} @@ -4308,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... @@ -4316,6 +4387,7 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... ovo STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... cesta je orijentirana u krivom smjeru STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... prolazne postaje ne mogu imati zavoje STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... prolazne postaje ne mogu imati raskrižja +STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... cesta je jednosmjerna ili je blokirana # Station destruction related errors STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Nije moguće ukloniti dio postaje... @@ -4567,6 +4639,8 @@ STR_BASESOUNDS_DOS_DESCRIPTION :Originalni zvuk STR_BASESOUNDS_WIN_DESCRIPTION :Originalni zvukovi za Transport Tycoon Deluxe Windows izdanje. STR_BASESOUNDS_NONE_DESCRIPTION :Zvučni paket bez ikakvih zvukova. STR_BASEMUSIC_WIN_DESCRIPTION :Originalna glazba za Transport Tycoon Deluxe Windows izdanje. +STR_BASEMUSIC_DOS_DESCRIPTION :Originalna glazba za Transport Tycoon Deluxe DOS izdanje. +STR_BASEMUSIC_TTO_DESCRIPTION :Originalna glazba za Transport Tycoon (original/editor svijeta) DOS izdanje. STR_BASEMUSIC_NONE_DESCRIPTION :Glazbeni paket bez ikakve glazbe. ##id 0x2000 diff --git a/src/lang/czech.txt b/src/lang/czech.txt index 68d635d29d..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 @@ -756,15 +758,13 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Zvolit p STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Zapnout/vypnout náhodné opakování skladeb STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Ukaž skladbu ve výběrovém okně -STR_ERROR_NO_SONGS :{WHITE}Byl vybrán hudební set bez písní. Nebudou přehrány žádné písně - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Volba programu hudby STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Index skladeb 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 @@ -900,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}! @@ -969,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 @@ -1012,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í @@ -1424,8 +1426,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Barva terénu n STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :zelená STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :tmavě zelená STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :fialová -STR_CONFIG_SETTING_REVERSE_SCROLLING :Posouvat pohled opačným směrem: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Chování při posouvání mapy pomocí stisku pravého tlačítka myši. Pokud vypnuto, myš pohybuje kamerou. Pokud zapnuto, myš pohybuje mapou STR_CONFIG_SETTING_SMOOTH_SCROLLING :Plynulé posouvání po mapě: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Ovládá jak se hlavní pohled posouvá na specifické místo na mapě, kliknutím na minimapu nebo spuštěním příkazu na posun na specifický objekt na mapě. Pokud zapnuto, pohled se posouvá plynule, pokud vypnuto, skáče pohled přímo na cílové místo STR_CONFIG_SETTING_MEASURE_TOOLTIP :Ukázat rozměry při použití stavebních nástrojů: {STRING} @@ -1457,8 +1457,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command + klikn STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Control + kliknutí STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :vypnutá -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Posouvání levým tlačítkem: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Povolit posouvání mapy chycením pomocí levého tlačítka myši. Toto je velmi užitečné hlavně při použití s dotykovou obrazovkou. +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Zavírat okno kliknutím pravým tlačítkem myši: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Zavírat okno kliknutím pravým tlačítkem na něj. Znemožňuje využívat nápovědu zobrazující se při stisknutí pravého tlačítka myši! STR_CONFIG_SETTING_AUTOSAVE :Automaticky ukládat: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Zvol frekvenci automatického ukládání @@ -1848,6 +1848,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Ukázat, STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Zobrazit nastavení AI a hry STR_INTRO_TOOLTIP_QUIT :{BLACK}Ukončit 'OpenTTD' +STR_INTRO_BASESET :{BLACK}V aktuálně zvolené základní sadě grafiky chybí {NUM} sprit{P "" y ů}. Zkuste, prosím, vyhledat aktualizovanou základní sadu. STR_INTRO_TRANSLATION :{BLACK}Tento překlad postrádá {NUM} řetěz{P ec ce ců}. Prosím pomozte OpenTTD udělat lepším a přihlaste se jako překladatel. Pro více informací, čtěte readme.txt. # Quit window @@ -1883,7 +1884,7 @@ STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Magick STR_CHEAT_CROSSINGTUNNELS :{LTBLUE}Tunely se mohou křížit: {ORANGE}{STRING} STR_CHEAT_NO_JETCRASH :{LTBLUE}Letadla nebudou na malých letištích havarovat (tak často): {ORANGE}{STRING} STR_CHEAT_EDIT_MAX_HL :{LTBLUE}Upravit maximální výšku mapy: {ORANGE}{NUM} -STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{BLACK}Upravit maximální výšku hor na mapě +STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}Upravit maximální výšku hor na mapě STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :krajina mírného pásma STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :subarktická krajina STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :subtropická kraina @@ -2369,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ý @@ -2682,6 +2684,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Název d STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Přijímané zboží: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Druh kolejí: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Rychlostní omezení tratě: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Rychlostní omezení silnice: {LTBLUE}{VELOCITY} @@ -2694,29 +2697,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Pole STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Zasněžená země STR_LAI_CLEAR_DESCRIPTION_DESERT :Poušť -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} trať -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} trať s obyčejným návěstidlem -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} trať s vjezdovým návěstidlem -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} trať s výjezdovým návěstidlem -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} trať s kombinovaným návěstidlem -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} trať s dokonalejším (PBS) návěstidlem -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} trať s dokonalejším (PBS) jednosměrným návěstidlem -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} trať s obyčejným a vjezdovým návěstidlem -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} trať s obyčejným a odjezdovým návěstidlem -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} trať s obyčejným a kombinovaným návěstidlem -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} trať s obyčejným a cestovým návěstidlem -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} trať s obyčejným a jednosměrným cestovým návěstidlem -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} trať s vjezdovým a odjezdovým návěstidlem -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} trať s vjezdovým a kombinovaným návěstidlem -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} trať s vjezdovým a cestovým návěstidlem -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} trať s vjezdovým a jednosměrným cestovým návěstidlem -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} trať s výjezdovým a kombinovaným návěstidlem -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} trať s výjezdovým a cestovým návěstidlem -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} trať s výjezdovým a jednosměrným cestovým návěstidlem -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} trať s kombinovaným a cestovým návěstidlem -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} trať s kombinovaným a jednosměrným cestovým návěstidlem -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} trať s cestovým a jednosměrným cestovým návěstidlem -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} železniční depo +STR_LAI_RAIL_DESCRIPTION_TRACK :Železniční trať +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Železniční trať s obyčejnými návěstidly +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Železniční trať s vjezdovými návěstidly +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Železniční trať s odjezdovými návěstidly +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Železniční trať s kombinovanými návěstidly +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Železniční trať s dokonalejšími (PBS) návěstidly +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Železniční trať s jednosměrnými cestovými návěstidly +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Železniční trať s obyčejnými a vjezdovými návěstidly +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Železniční trať s obyčejnými a odjezdovými návěstidly +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Železniční trať s obyčejnými a kombinovanými návěstidly +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Železniční trať s obyčejnými a cestovými návěstidly +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Železniční trať s obyčejnými a jednosměrnými cestovými návěstidly +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Železniční trať s vjezdovými a odjezdovými návěstidly +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Železniční trať s vjezdovými a kombinovanými návěstidly +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Železniční trať s vjezdovými a cestovými návěstidly +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Železniční trať s vjezdovými a jednosměrnými cestovými návěstidly +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Železniční trať s odjezdovými a kombinovanými návěstidly +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Železniční trať s odjezdovými a cestovými návěstidly +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Železniční trať s odjezdovými a jednosměrnými cestovými návěstidly +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Železniční trať s kombinovanými a cestovými návěstidly +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Železniční trať s kombinovanými a jednosměrnými cestovými návěstidly +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Železniční trať s cestovými a jednosměrnými cestovými návěstidly +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Železniční depo STR_LAI_ROAD_DESCRIPTION_ROAD :Silnice STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Silnice s pouličním osvětlením @@ -2780,7 +2783,29 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Půda vlastněn STR_ABOUT_OPENTTD :{WHITE}O OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Původní copyright: {COPYRIGHT} 1995 Chris Sawyer, všechna práva vyhrazena STR_ABOUT_VERSION :{BLACK}OpenTTD verze {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 Tým OpenTTD +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 @@ -2999,8 +3024,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Pokus o použit STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} obsahuje poškozený sprite. Všechny takové se zobrazí jako červený otazník (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Obsahuje vícero Akce 8 záznamů (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Čtení konce pseudo-spritu (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Právě používanému základnímu grafickému setu chybí obrázky.{}Prosím, updatujte ho -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Aktuálnímu grafickému setu chybí nějaké části.{}Aktualizuj prosím grafický set.{}Pokud hraješ{YELLOW}vývojovou verzi OpenTTD{WHITE}, možná potřebuješ {YELLOW}vývojovou verzi základních grafik{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Požadované zdroje GRF nejsou dostupné (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} byla vypnuta {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Neplatný/neznámý sprite layout formát (sprite {3:NUM}) @@ -3068,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} @@ -3075,8 +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_PASSENGERS_LAST_MONTH_MAX :{BLACK}Cestujících minulý měsíc: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Pošta za minulý měsíc: {ORANGE}{COMMA}{BLACK} max: {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ě @@ -3207,8 +3230,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Přijím STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Ukázat seznam přijímaného nákladu STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Přijímá: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Tato stanice má v tomto městě výhradní přepravní práva. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :Společnost {YELLOW}{COMPANY}{BLACK} koupila v tomto městě výhradní přepravní práva. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Tato stanice má v tomto městě výhradní přepravní práva. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :Společnost {YELLOW}{COMPANY}{BLACK} koupila v tomto městě výhradní přepravní práva. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Hodnocení STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Ukázat hodnocení společností @@ -3225,7 +3248,7 @@ STR_STATION_VIEW_VIA :{YELLOW}{CARGO_ STR_STATION_VIEW_TO :{YELLOW}{CARGO_SHORT} do {STATION} STR_STATION_VIEW_FROM_ANY :{RED}{CARGO_SHORT} z neznámé stanice STR_STATION_VIEW_TO_ANY :{RED}{CARGO_SHORT} do kterékoliv stanice -STR_STATION_VIEW_VIA_ANY :{GREEN}{CARGO_SHORT} přes jakoukoliv stanici +STR_STATION_VIEW_VIA_ANY :{RED}{CARGO_SHORT} přes jakoukoliv stanici STR_STATION_VIEW_FROM_HERE :{GREEN}{CARGO_SHORT} z této stanice STR_STATION_VIEW_VIA_HERE :{GREEN}{CARGO_SHORT} zastavuje v této stanici STR_STATION_VIEW_TO_HERE :{GREEN}{CARGO_SHORT} do této stanice @@ -3387,9 +3410,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Vyžaduj STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Vyžaduje: {YELLOW}{STRING.acc}{STRING}, {STRING.acc}{STRING}, {STRING.acc}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Vyžaduje: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} ček{P á ají á}{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Náklad čekající na zpracování: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produkuje: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Produkuje: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3456,6 +3481,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Odstranit všec STR_GROUP_RENAME_CAPTION :{BLACK}Přejmenovat skupinu +STR_GROUP_PROFIT_THIS_YEAR :Letošní zisk: +STR_GROUP_PROFIT_LAST_YEAR :Loňský zisk: +STR_GROUP_OCCUPANCY :Současné využití: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nové lokomotivy a vagony STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nové elektrické lokomotivy a vagony @@ -3487,6 +3517,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Všechny druhy STR_PURCHASE_INFO_ALL_BUT :Všechny kromě {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Max. tažná síla: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Dosah: {GOLD}{COMMA} polí +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Typ letadla: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Seznam vlaků - pro informace klikni na vlak. Ctrl+kliknutí způsobí přepínání skrytí typů lokomotiv a vagónů. STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Seznam silničních vozidel - klikni na vozidlo pro informace. Ctrl+kliknutí způsobí přepínání skrytí typu silničního vozidla. @@ -3623,10 +3654,11 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE.acc :lokomotivu Magl STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Cena: {CURRENCY_LONG} Hmotnost: {WEIGHT_SHORT}{}Rychlost: {VELOCITY} Výkon: {POWER}{}Cena provozu: {CURRENCY_LONG} ročně{}Kapacita: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cena: {CURRENCY_LONG} Váha: {WEIGHT_SHORT}{}Rychlost: {VELOCITY} Síla: {POWER} Maximální tažná síla: {6:FORCE}{}Provozní náklady: {4:CURRENCY_LONG}/rok{}Kapacita: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Max. rychlost: {VELOCITY}{}Kapacita: {CARGO_LONG}, {CARGO_LONG}{}Cena provozu: {CURRENCY_LONG} ročně -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Max. rychlost: {VELOCITY}{}Kapacita: {CARGO_LONG}{}Cena provozu: {CURRENCY_LONG} ročně -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Cena {CURRENCY_LONG} Max. Rychlost: {VELOCITY} Dosah: {COMMA} polí{}Kapacita: {CARGO_LONG}, {CARGO_LONG}{}Provozní náklady: {CURRENCY_LONG}/rok -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Cena {CURRENCY_LONG} Max. Rychlost {VELOCITY} Dosah: {COMMA} polí{}Kapacita: {CARGO_LONG}{}Provozní náklady: {CURRENCY_LONG}/rok +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Max. rychlost: {VELOCITY}{}Kapacita: {CARGO_LONG}{}Cena provozu: {CURRENCY_LONG} ročně +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Max. rychlost: {VELOCITY}{}Typ letadla: {STRING}{}Kapacita: {CARGO_LONG}, {CARGO_LONG}{}Provozní náklady: {CURRENCY_LONG}/rok +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Max. rychlost: {VELOCITY}{}Typ letadla: {STRING}{}Kapacita: {CARGO_LONG}{}Provozní náklady: {CURRENCY_LONG}/rok +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Max. rychlost: {VELOCITY}{}Typ letadla: {STRING} Dosah: {COMMA} políč{P ko ka ek}{}Kapacita: {CARGO_LONG}, {CARGO_LONG}{}Provozní náklady: {CURRENCY_LONG}/rok +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Max. rychlost: {VELOCITY}{}Typ letadla: {STRING} Dosah: {COMMA} políč{P ko ka ek}{}Kapacita: {CARGO_LONG}{}Provozní náklady: {CURRENCY_LONG}/rok # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Vyměňování {STRING} - {STRING} @@ -3653,10 +3685,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} když STR_REPLACE_VEHICLES_STOP :{BLACK}Vypnout vyměňování STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Zmáčkni toto tlačítko, když nechceš vyměňovat typ lokomotivy vybraný v levém seznamu -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Vyměňování: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Přepne mezi okny na výměnu lokomotiv a vagonů STR_REPLACE_ENGINES :lokomotivy STR_REPLACE_WAGONS :vagony +STR_REPLACE_ALL_RAILTYPE :Všechna drážní vozidla STR_REPLACE_HELP_RAILTYPE :{BLACK}Vyber typ kolejí, pro které chceš měnit lokomotivy STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Tady je zobrazeno, za jakou lokomotivu se ta v levém seznamu vyměňuje @@ -3749,7 +3781,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} {P rok STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} {P rok roky let} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Max. rychlost: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Max. rychlost: {LTBLUE}{VELOCITY} {BLACK}Dosah: {LTBLUE}{COMMA} polí +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Max. rychlost: {LTBLUE}{VELOCITY} {BLACK}Typ letadla: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Max. rychlost: {LTBLUE}{VELOCITY} {BLACK}Typ letadla: {LTBLUE}{STRING} {BLACK}Dosah: {LTBLUE}{COMMA} políč{P ko ka ek} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Hmotnost: {LTBLUE}{WEIGHT_SHORT} {BLACK}Výkon: {LTBLUE}{POWER}{BLACK} Max. rychlost: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Hmotnost: {LTBLUE}{WEIGHT_SHORT} {BLACK}Výkon: {LTBLUE}{POWER}{BLACK} Max. rychlost: {LTBLUE}{VELOCITY} {BLACK}Max. tažná síla: {LTBLUE}{FORCE} @@ -4189,7 +4222,7 @@ STR_ERROR_BMPMAP_IMAGE_TYPE :{WHITE}... nelz STR_ERROR_HEIGHTMAP_TOO_LARGE :{WHITE}... obrázek je příliš velký STR_WARNING_HEIGHTMAP_SCALE_CAPTION :{WHITE}Varování kvůli velikosti -STR_WARNING_HEIGHTMAP_SCALE_MESSAGE :{YELLOW}Tak velká zmena velikosti zdrojové mapy není doporučena. Pokračovat s generováním? +STR_WARNING_HEIGHTMAP_SCALE_MESSAGE :{YELLOW}Tak velká změna velikosti zdrojové mapy není doporučena. Pokračovat v generování? # Soundset messages STR_WARNING_FALLBACK_SOUNDSET :{WHITE}Byl nalezen pouze nouzový zvukový soubor. Pokud chcete zvuky, nainstalujte prosim zvukové soubory skrze systém stahování obsahu @@ -4308,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... @@ -4316,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... @@ -4574,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 c9af6e3c86..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 @@ -669,15 +670,13 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Select ' STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Tilfældig afspilning til/fra STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Vis vinduet med musiknummervalg -STR_ERROR_NO_SONGS :{WHITE}Det valgte musik sæt er uden sange. Der kan ikke afspilles musik. - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Musikprogram Valg STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Nummerliste 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) @@ -1337,8 +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_REVERSE_SCROLLING :Flyt i modsat retning ved scroll med musen: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Adfærd når kortet rulles med højre museknap. Hvis deaktiveret, bevæger musen kameraet. Når funktionen er aktiveret, flytter musen kortet +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} @@ -1370,8 +1371,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Kommandoklik STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Kontrolklik STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Fra -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Venstreklik-scrolling: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Aktiver rulle kortet ved at trække den med venstre museknap. Dette er især nyttigt, når du bruger en touch-screen til at rulle +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Luk vindue ved højre-klik: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Lukker vinduet ved at højreklikke inde i det. Deaktiverer værktøjstip ved at højreklikke! STR_CONFIG_SETTING_AUTOSAVE :Auto gem: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Vælg interval mellem automatisk gemte spil @@ -1761,6 +1762,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Tjek for STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Vis computerspiller/spilscript indstillinger STR_INTRO_TOOLTIP_QUIT :{BLACK}Afslut 'OpenTTD' +STR_INTRO_BASESET :{BLACK} Det aktuelt valgte base grafiksæt mangler {NUM} sprite {P "" s}. Se venligst efter opdateringer til basesættet. STR_INTRO_TRANSLATION :{BLACK}Denne oversættelse mangler {NUM} streng{P "" e}. Hjælp venligst med at gøre OpenTTD bedre ved at tilmelde dig som oversætter. Se readme.txt for detaljer. # Quit window @@ -2589,6 +2591,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Lufthavn STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Accepteret last: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Tog type: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Togspors hastighedsgrænse: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Vej hastighedsbegrænsning: {LTBLUE}{VELOCITY} @@ -2601,29 +2604,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Marker STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Snedækket land STR_LAI_CLEAR_DESCRIPTION_DESERT :Ørken -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} spor -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} spor med bloksignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} spor med with pre-signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} spor med udgangssignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} spor med kombinerede signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} spor med rute-signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} spor med en-vejs-signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} spor med blok- og pre-signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} spor med blok- og udgangs-signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} spor med blok og kombinerede signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} spor med blok- og rute-signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} spor med blok og en-vejs rute-signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} spor med pre- og udgangs-signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} spor med pre- og kombinerede signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} spor med pre- og rute-signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} spor med pre- og en-vejs rute-signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} spor med udgangs- og kombinerede signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} spor med udgangs- og rute-signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} spor med udgangs- og en-vejs rute-signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} spor med kombinerede og rute-signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} spor med kombinerede og en-vejs rute-signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} spor med rute- og en-vejs rute-signaler -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} togdepot +STR_LAI_RAIL_DESCRIPTION_TRACK :Jernbane spor +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Jernbane spor med bloksignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Jernbane spor med with pre-signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Jernbane spor med udgangs-signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Jernbane spor med kombinerede signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Jernbane spor med rute-signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Jernbane spor med en-vejs-signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Jernbane spor med blok- og pre-signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Jernbane spor med blok- og udgangs-signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Jernbane spor med blok- og kombinerede signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Jernbane spor med blok- og rute-signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Jernbane spor med blok og en-vejs rute-signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Jernbane spor med pre- og udgangs-signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Jernbane spor med pre- og kombinerede signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Jernbane spor med pre- og rute-signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Jernbane spor med pre- og en-vejs rute-signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Jernbane spor med udgangs- og kombinerede signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Jernbane spor med udgangs- og rute-signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Jernbane spor med udgangs- og en-vejs rute-signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Jernbane spor med kombinerede og rute-signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Jernbane spor med kombinationede- og en-vejs rute-signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Jernbane spor med rute- og en-vejs rute-signaler +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Jernbane togdepot STR_LAI_ROAD_DESCRIPTION_ROAD :Vej STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Vej med gadelygter @@ -2687,7 +2690,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Land ejet af se STR_ABOUT_OPENTTD :{WHITE}Om OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original copyright {COPYRIGHT} 1995 Chris Sawyer, Alle rettigheder reserveret STR_ABOUT_VERSION :{BLACK}OpenTTD version {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 OpenTTD teamet +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 @@ -2874,7 +2884,7 @@ STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Gå til STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Tidligere grafikelement STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Fortsæt til den forrige normal sprite, springe over nogen pseudo / recolour / FONT sprites og indpakning rundt fra den første sprite til det sidste STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Repræsentation af den markerede sprite. Justeringen ignoreres når denne sprite tegnes. -STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Flyt spriten rundt for at ændre X- og Y-forskydningen +STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Flyt spriten rundt for at ændre X- og Y-forskydningen. Ctrl+Klik for at flytte spriten otte enheder af gangen STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Nulstil relativ STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Nulstil den nuværende relative forskydning STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X-forskydning: {NUM}, Y-forskydning: {NUM} (Absolut) @@ -2906,8 +2916,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Forsøg på at STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} indeholder en ødelagt sprite. Alle ødelagte sprites vil blive vist som et rødt spørgsmålstegn (?). STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Indeholder adskillige handling 8 indgange (grafikelement {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Læs forbi slutningen af pseudo-grafikelement (grafikelement {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Det brugte basis grafiksæt mangler en række elementer.{}Opdater venligst grafiksættet. -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Den grafikpakke som bruges er ufuldstændig.{}Opdater venligst grafikpakken.{}eftersom du spiller et{YELLOW} development snapshot of OpenTTD{WHITE},får du måske også brug for er{YELLOW}development snapshot of the base graphics{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :De ønskede GRF ressourcer er ikke tilgængelige (grafikelement {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} blev deaktiveret af {2:STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Ugyldigt / ukendt grafikelement layoutformat (grafikelement {3:NUM}) @@ -2982,8 +2990,6 @@ STR_TOWN_POPULATION :{BLACK}Verdens STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (by) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Indbyggere: {ORANGE}{COMMA}{BLACK} Huse: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Passagerer sidste måned: {ORANGE}{COMMA}{BLACK} maks.: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Post sidste måned: {ORANGE}{COMMA}{BLACK} maks.: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Nødvendig godsmængde for at byen kan vokse: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} krævet STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} kræves om vinteren @@ -3114,8 +3120,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Accepter STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Vis liste over accepteret last STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Accepterer: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK} Denne station har eksklusive transport rettigheder i denne by. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW} {COMPANY} {BLACK} købte eksklusive transport rettigheder i denne by. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK} Denne station har eksklusive transport rettigheder i denne by. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW} {COMPANY} {BLACK} købte eksklusive transport rettigheder i denne by. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Bedømmelse STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Vis stationens bedømmelse @@ -3294,9 +3300,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Kræver: STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Kræver: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Kræver: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} venter{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Fragt der venter på forarbejdning: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Producerer: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Producerer: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3363,6 +3371,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Fjern alle kør STR_GROUP_RENAME_CAPTION :{BLACK}Omdøb en gruppe +STR_GROUP_PROFIT_THIS_YEAR :Afkast i år: +STR_GROUP_PROFIT_LAST_YEAR :Afkast sidste år: +STR_GROUP_OCCUPANCY :Nuværende brug: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nye jernbanekøretøjer STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nyt elektrisk lokomotiv @@ -3394,6 +3407,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Alle lasttyper STR_PURCHASE_INFO_ALL_BUT :Alle undtagen {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Maks. trækkraft: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Rækkevidde: {GOLD}{COMMA} felter +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Fly type: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Togvalgsliste - klik på et køretøj for mere information STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Liste over køretøjstyper - klik på køretøj for information @@ -3527,10 +3541,11 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :magnetskinnelok STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Pris: {CURRENCY_LONG} Vægt: {WEIGHT_SHORT}{}Hastighed: {VELOCITY} Styrke: {POWER}{}Driftsomkostninger: {CURRENCY_LONG}/år{}Kapacitet: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Pris: {CURRENCY_LONG} Vægt: {WEIGHT_SHORT}{}Hastighed: {VELOCITY} Hestekræfter: {POWER} Maks. Trækkraft: {6:FORCE}{}Driftsomkostning: {4:CURRENCY_LONG}/år{}Kapacitet: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Pris: {CURRENCY_LONG} Maks. hast.: {VELOCITY}{}Kapacitet: {CARGO_LONG}, {CARGO_LONG}{}Driftsomkostninger: {CURRENCY_LONG}/år -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Pris: {CURRENCY_LONG} Maks. hast.: {VELOCITY}{}Kapacitet: {CARGO_LONG}{}Driftsomkostninger: {CURRENCY_LONG}/år -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Pris: {CURRENCY_LONG} Max. hastighed: {VELOCITY} Rækkevidde: {COMMA} felter{}Kapacitet: {CARGO_LONG}, {CARGO_LONG}{}Faste udgifter: {CURRENCY_LONG}/år -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Pris: {CURRENCY_LONG} Max. hastighed: {VELOCITY} Rækkevidde: {COMMA} felter{}Capacity: {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Pris: {CURRENCY_LONG} Maks. hast.: {VELOCITY}{}Kapacitet: {CARGO_LONG}{}Driftsomkostninger: {CURRENCY_LONG}/år +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Pris: {CURRENCY_LONG} Max. Hastighed: {VELOCITY}{}Aircraft type: {STRING}{}Kapacitet: {CARGO_LONG}, {CARGO_LONG}{}Omkostninger: {CURRENCY_LONG}/år +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Pris: {CURRENCY_LONG} Max. Hastighed: {VELOCITY}{}Fly type: {STRING}{}Kapacitet: {CARGO_LONG}{}Omkostninger: {CURRENCY_LONG}/år +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Pris: {CURRENCY_LONG} Max. Hastighed: {VELOCITY}{}Fly type: {STRING} Rækkevidde: {COMMA} felter{}Kapacitet: {CARGO_LONG}, {CARGO_LONG}{}Omkostninger: {CURRENCY_LONG}/år +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Pris: {CURRENCY_LONG} Max. Hastighed{VELOCITY}{}Fly type: {STRING} Rækkevidde: {COMMA} felter{}Kapacitet: {CARGO_LONG}{}Omkostninger: {CURRENCY_LONG}/år # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Udskift {STRING} - {STRING} @@ -3557,10 +3572,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} når d STR_REPLACE_VEHICLES_STOP :{BLACK}Stop udskiftning STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Tryk for at stoppe udskiftningen at den køretøjstype, som du har valgt til venstre -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Udskifter: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Skift imellem lokomotiv- og vognudskiftningsvindue STR_REPLACE_ENGINES :Lokomotiver STR_REPLACE_WAGONS :Vogne +STR_REPLACE_ALL_RAILTYPE :Alle jernbanevogne STR_REPLACE_HELP_RAILTYPE :{BLACK}Vælg den skinne type, du ønsker at udskifte lokomotiver til STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Viser hvilket køretøj det valgte køretøj til venstre bliver udskiftet med, hvis det udskiftes @@ -3653,7 +3668,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} år ({C STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} år ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Maks. hast.: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Max. hastighed: {LTBLUE}{VELOCITY} {BLACK}Rækkevidde: {LTBLUE}{COMMA} felter +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Max. hastighed: {LTBLUE}{VELOCITY} {BLACK}Fly type: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Max. hastighed: {LTBLUE}{VELOCITY} {BLACK}Fly type: {LTBLUE}{STRING} {BLACK}Rækkevidde: {LTBLUE}{COMMA} felter STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Vægt: {LTBLUE}{WEIGHT_SHORT} {BLACK}Effekt: {LTBLUE}{POWER}{BLACK} Maks. hast.: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Vægt: {LTBLUE}{WEIGHT_SHORT} {BLACK}Effekt: {LTBLUE}{POWER}{BLACK} Maks. hast.: {LTBLUE}{VELOCITY} {BLACK}Maks. trækkraft: {LTBLUE}{FORCE} @@ -4212,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... @@ -4220,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 70fa1011f6..4598851f64 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -53,7 +53,7 @@ STR_CARGO_PLURAL_TOYS :Speelgoed STR_CARGO_PLURAL_CANDY :Snoep STR_CARGO_PLURAL_COLA :Cola STR_CARGO_PLURAL_COTTON_CANDY :Suikerspinnen -STR_CARGO_PLURAL_BUBBLES :Bubbels +STR_CARGO_PLURAL_BUBBLES :Bellen STR_CARGO_PLURAL_TOFFEE :Toffee STR_CARGO_PLURAL_BATTERIES :Batterijen STR_CARGO_PLURAL_PLASTIC :Plastic @@ -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 @@ -255,14 +255,14 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_SHIP :{BLACK}Toon ver STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT :{BLACK}Toon verborgen STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN_TOOLTIP :{BLACK}Door het inschakelen van deze knop, worden de verborgen treinen ook weergegeven -STR_SHOW_HIDDEN_ENGINES_VEHICLE_ROAD_VEHICLE_TOOLTIP :Door het inschakelen van deze knop, worden de verborgen wegvoertuigen ook weergegeven +STR_SHOW_HIDDEN_ENGINES_VEHICLE_ROAD_VEHICLE_TOOLTIP :{BLACK}Door het inschakelen van deze knop, worden de verborgen wegvoertuigen ook weergegeven STR_SHOW_HIDDEN_ENGINES_VEHICLE_SHIP_TOOLTIP :{BLACK}Door het inschakelen van deze knop, worden de verborgen schepen ook weergegeven STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}Door het inschakelen van deze knop, worden de verborgen vliegtuig ook weergegeven # Query window STR_BUTTON_DEFAULT :{BLACK}Standaard STR_BUTTON_CANCEL :{BLACK}Annuleren -STR_BUTTON_OK :{BLACK}OK +STR_BUTTON_OK :{BLACK}Oké # On screen keyboard window STR_OSK_KEYBOARD_LAYOUT :`1234567890-=\qwertyuiop[]asdfghjkl;' zxcvbnm,./ . @@ -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,8 +475,9 @@ 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_SPRITE_ALIGNER :Sprite-uitlijner STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Schakel selectiekaders STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Schakel kleuren van braakliggende grond aan/uit ############ range ends here @@ -597,7 +598,7 @@ STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPAN STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER :Ingenieur STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER :Verkeersleider STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR :Transportcoördinator -STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ROUTE_SUPERVISOR :Route-opzichter +STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ROUTE_SUPERVISOR :Routeopzichter STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_DIRECTOR :Onderdirecteur STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHIEF_EXECUTIVE :Directeur STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHAIRMAN :Voorzitter @@ -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,21 +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 -STR_ERROR_NO_SONGS :{WHITE}Er is een muziek set zonder liedjes gekozen. Er zal geen muziek worden gespeeld - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Muziekprogrammakeuze +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) @@ -705,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. @@ -737,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 @@ -765,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 @@ -844,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 @@ -874,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 @@ -925,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 @@ -1140,14 +1143,14 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_CENTER :Midden STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Rechts STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maximale beginlening: {STRING} -STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximale bedrag een bedrijf kan lenen (zonder rekening te houden met de inflatie) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximaal bedrag dat een bedrijf kan lenen (zonder rekening te houden met de inflatie) STR_CONFIG_SETTING_INTEREST_RATE :Rente van lening: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Percentage rente op lening; bepaald ook het inflatiecijfer wanneer ingeschakeld STR_CONFIG_SETTING_RUNNING_COSTS :Onderhoudskosten: {STRING} STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT :Het niveau van onderhoud en bedrijfskosten van voertuigen en infrastuctuur STR_CONFIG_SETTING_CONSTRUCTION_SPEED :Bouwsnelheid: {STRING} STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :Beperk de hoeveelheid bouwactiviteiten voor computerspeler -STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :Voertuig storingen: {STRING} +STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :Voertuigstoringen: {STRING} STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :Controle hoe vaak onvoldoende onderhouden voertuigen kapot kunnen gaan STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER :Subsidie indicator: {STRING} STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :Instellen hoeveel wordt betaald voor gesubsidieerde verbindingen @@ -1158,15 +1161,15 @@ STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Wanneer ingesch STR_CONFIG_SETTING_TRAIN_REVERSING :Niet toestaan dat treinen keren in stations: {STRING} STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Indien ingeschakeld zullen treinen niet omkeren in niet-eind stations, zelfs als er een kortere weg naar hun volgende bestemming is bij omkeren STR_CONFIG_SETTING_DISASTERS :Rampen: {STRING} -STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Schakel rampen die af en toe voertuigen of infrastructuur kunnen blokkeren of vernietigen -STR_CONFIG_SETTING_CITY_APPROVAL :Gemeenteraad's houding ten opzichte van herstructurering gebied: {STRING} +STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Schakel rampen die af en toe voertuigen of infrastructuur kunnen blokkeren of vernietigen in/uit +STR_CONFIG_SETTING_CITY_APPROVAL :De houding van de gemeenteraad ten opzichte van herstructurering gebied: {STRING} STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Kies hoeveel lawaai en schade aan het milieu door bedrijven de stadswaardering en hun acties beïnvloeden in hun bouwgebied STR_CONFIG_SETTING_MAX_HEIGHTLEVEL :Maximum kaarthoogte: {STRING} -STR_CONFIG_SETTING_MAX_HEIGHTLEVEL_HELPTEXT :Stel de maximum toegestande hoogte voor bergen op de kaart in +STR_CONFIG_SETTING_MAX_HEIGHTLEVEL_HELPTEXT :Stel de maximum toegestane hoogte voor bergen op de kaart in STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}Je kunt de maximum kaarthoogte niet in deze waarde wijzigen. Minstens één berg op de kaart is hoger STR_CONFIG_SETTING_AUTOSLOPE :Omgeving aanpassen onder gebouwen, spoorwegen, enz. toestaan: {STRING} -STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Laat het aanpassen van funderingne onder gebouwen en spoor toe zonder deze te verwijderen +STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Staat het aanpassen van funderingen onder gebouwen en sporen toe zonder deze te verwijderen STR_CONFIG_SETTING_CATCHMENT :Gebruik meer realistische handelsgebieden: {STRING} STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Heb verschillende grootte verzorgingsgebied voor verschillende typen stations en luchthavens STR_CONFIG_SETTING_EXTRADYNAMITE :Sta verwijderen van meer stedelijke wegen, bruggen en tunnels toe: {STRING} @@ -1186,16 +1189,16 @@ STR_CONFIG_SETTING_PERCENTAGE :{COMMA}% STR_CONFIG_SETTING_ROAD_VEHICLE_SLOPE_STEEPNESS :Hellingsterkte voor wegvoertuigen: {STRING} STR_CONFIG_SETTING_ROAD_VEHICLE_SLOPE_STEEPNESS_HELPTEXT :Steilheid van een schuine tegel voor een wegvoertuig. Hogere waarden maken het moeilijker om een heuvel te beklimmen STR_CONFIG_SETTING_FORBID_90_DEG :Verbied treinen en schepen om 90° te draaien: {STRING} -STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :90 graden draaien treden op wanneer een horizontale baan direct gevolgd door een verticale baan stuk op de aangrenzende tegel, waardoor de trein daarna 90 graad wanneer het doorlopen van de tegel rand plaats van de gebruikelijke 45 graden voor andere spoor combinaties. Dit geldt ook voor de draaicirkel van schepen -STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS :Sta het samenvoegen van niet direct aaneensluitende stations toe: {STRING} -STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Sta toe dat er aanvullende onderdelen aan een station worden geplaatst, zonder dat reed bestaande onderdelen beïnvloed worden. Gebruikt Ctrl+Click tijdens het plaatsen van nieuwe onderdelen. +STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :Draaiingen met 90° treden op wanneer een horizontale baan direct gevolgd wordt door een verticaal baanstuk op de aangrenzende tegel, waardoor de trein daarna 90 graden draait wanneer de tegelrand wordt overgestoken in plaats van de gebruikelijke 45 graden voor andere spoorcombinaties. Dit geldt ook voor de draaicirkel van schepen +STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS :Sta het samenvoegen van indirect aansluitende stations toe: {STRING} +STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Sta toe dat er aanvullende onderdelen aan een station worden geplaatst zonder dat reeds bestaande onderdelen beïnvloed worden. Ctrl+klik is vereist tijdens het plaatsen van nieuwe onderdelen. STR_CONFIG_SETTING_INFLATION :Inflatie: {STRING} -STR_CONFIG_SETTING_INFLATION_HELPTEXT :Schakel de inflatie in de economie in, waar de kosten iets sneller stijgen dan de betalingen -STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH :Maximum brug lengte: {STRING} +STR_CONFIG_SETTING_INFLATION_HELPTEXT :Schakel inflatie in de economie in, waardoor de kosten iets sneller stijgen dan de betalingen +STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH :Maximum bruglengte: {STRING} STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH_HELPTEXT :Maximum lengte voor te bouwen bruggen STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT :Maximum brughoogte: {STRING} -STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT_HELPTEXT :Maximum hoogte ombruggen te bouwen -STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH :Maximum tunnel lengte: {STRING} +STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT_HELPTEXT :Maximum hoogte om bruggen te bouwen +STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH :Maximum tunnellengte: {STRING} STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH_HELPTEXT :Maximum lengte voor te bouwen tunnels STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD :Handmatige bouwmethode voor primaire industrieën: {STRING} STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_HELPTEXT :Wijze van financiering van een primaire industrie. 'geen' betekent dat het niet mogelijk is om te financieren, 'prospectie' betekent dat financiering mogelijk is, maar de bouw vindt plaats in een willekeurige plek op de kaart en kan mislukken ook, "als andere bedrijfstakken": ruwe industrieën kan worden geconstrueerd door bedrijven als verwerkende industrie in elke positie zij willen @@ -1223,19 +1226,19 @@ STR_CONFIG_SETTING_STOP_LOCATION_FAR_END :aan het einde STR_CONFIG_SETTING_AUTOSCROLL :Verschuif scherm als muis aan de rand is: {STRING} STR_CONFIG_SETTING_AUTOSCROLL_HELPTEXT :Wanneer aan, start een subvenster met scrollen wanneer de muis vlak bij de rand van het venster komt STR_CONFIG_SETTING_AUTOSCROLL_DISABLED :Uitgeschakeld -STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT_FULLSCREEN :Hoofd kijkvenster, alleen volledigscherm -STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT :Hoofd kijkvenster +STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT_FULLSCREEN :Hoofdkijkvenster, alleen volledig scherm +STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT :Hoofdkijkvenster STR_CONFIG_SETTING_AUTOSCROLL_EVERY_VIEWPORT :Elk kijkvenster STR_CONFIG_SETTING_BRIBE :Omkopen van de gemeente toestaan: {STRING} -STR_CONFIG_SETTING_BRIBE_HELPTEXT :Toestaan dat bedrijven mogen proberen de plaatselijke gemeente autoriteit om te kopen. Als de omkoping wordt opgemerkt door een inspecteur, zal de onderneming niet in staat zijn om in de stad actie te ondernemen voor zes maanden +STR_CONFIG_SETTING_BRIBE_HELPTEXT :Toestaan dat bedrijven mogen proberen de plaatselijke autoriteiten om te kopen. Als de omkoping wordt opgemerkt door een inspecteur, zal de onderneming niet in staat zijn om in de stad actie te ondernemen voor zes maanden STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Kopen van exclusieve transportrechten toestaan: {STRING} -STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Wanneer een bedrijf de exclusieve transportrechten van een stad koopt, ontvangen de stations (zowel passagiers als vracht) van tegenstander geen vracht voor één heel jaar. +STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Wanneer een bedrijf de exclusieve transportrechten van een stad koopt, ontvangen de stations (zowel passagiers als vracht) van de tegenstanders geen vracht voor één heel jaar. STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Financiering van gebouwen toestaan: {STRING} STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :Deze optie staat bedrijven toe meer geld te geven aan steden voor de financiering van nieuwe huizen. -STR_CONFIG_SETTING_ALLOW_FUND_ROAD :Financieren van lokale wegreconstructie toestaan: {STRING} +STR_CONFIG_SETTING_ALLOW_FUND_ROAD :Financieren van lokale wegherbouwing toestaan: {STRING} STR_CONFIG_SETTING_ALLOW_FUND_ROAD_HELPTEXT :Deze optie staat bedrijven toe geld te geven aan steden voor het herbouwen van wegen, zodat op wegbedrijven gesaboteerd worden. STR_CONFIG_SETTING_ALLOW_GIVE_MONEY :Geld geven aan andere bedrijven toestaan: {STRING} -STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :Sta toe dat bedrijven geld naar elkaar overmaken in een multiplayer spel. +STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :Sta toe dat bedrijven geld naar elkaar overmaken in een multiplayerspel. STR_CONFIG_SETTING_FREIGHT_TRAINS :Gewichtsfactor voor vracht om zware treinen te simuleren: {STRING} STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :Stel de impact van het vervoer van vracht bij treinen. Een hogere waarde maakt het vervoer van vracht veeleisender voor treinen, met name in heuvels STR_CONFIG_SETTING_PLANE_SPEED :Vliegtuig snelheidsfactor: {STRING} @@ -1252,7 +1255,7 @@ STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD :Sta doorrijhalt STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT :Laat het bouwen van doorrijhaltes toe op wegen van andere bedrijven STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}Deze instelling kan niet gewijzigd worden als er voertuigen zijn STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE :Onderhoud infrastructuur: {STRING} -STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Wanneer ingeschakeld, infrastructuur veroorzaakt onderhoudskosten. De kosten groeit boven-proportioneel met de grootte van het netwerk, hetgeen van hogere invloed is op grotere bedrijven dan kleinere +STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Wanneer dit is ingeschakeld, veroorzaakt de infrastructuur onderhoudskosten. De kosten groeien boven-proportioneel met de grootte van het netwerk, waardoor grotere bedrijven hierdoor meer worden beïnvloed dan kleinere STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Vliegvelden verlopen niet: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Het inschakelen van deze instelling zorgt ervoor dat elke luchthaven soort altijd beschikbaar blijft na de introductie @@ -1277,26 +1280,26 @@ STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_AFTER :{COMMA} maand{P STR_CONFIG_SETTING_AUTORENEW_MONEY :Minimum benodigd geld voor automatisch vernieuwen: {STRING} STR_CONFIG_SETTING_AUTORENEW_MONEY_HELPTEXT :Minimale hoeveelheid geld die op de bank moet blijven alvorens automatisch vernieuwen voertuigen te starten STR_CONFIG_SETTING_ERRMSG_DURATION :Duur van foutbericht: {STRING} -STR_CONFIG_SETTING_ERRMSG_DURATION_HELPTEXT :Duur voor het weergeven van foutmeldingen in een rood venster. Merk op dat sommige (kritische) foutmeldingen niet automatisch wordt gesloten na deze tijd, deze moeten handmatig worden gesloten +STR_CONFIG_SETTING_ERRMSG_DURATION_HELPTEXT :Duur voor het weergeven van foutberichten in een rood venster. Merk op dat sommige (kritische) foutmeldingen niet automatisch worden gesloten na deze tijd, deze moeten handmatig worden gesloten STR_CONFIG_SETTING_ERRMSG_DURATION_VALUE :{COMMA} seconde{P 0 "" n} STR_CONFIG_SETTING_HOVER_DELAY :Toon tooltips: {STRING} -STR_CONFIG_SETTING_HOVER_DELAY_HELPTEXT :Vertraging voordat tooltips worden weergegeven wanneer de muis over een interface-element. Als alternatief kunnen tooltips worden gebonden aan de rechter muisknop wanneer de waarde 0 is. +STR_CONFIG_SETTING_HOVER_DELAY_HELPTEXT :Vertraging voordat tooltips worden weergegeven wanneer de muis over een interface-element. Als alternatief kunnen tooltips worden gebonden aan de rechtermuisknop wanneer de waarde 0 is. STR_CONFIG_SETTING_HOVER_DELAY_VALUE :Wijs aan voor {COMMA} seconde{P 0 "" n} STR_CONFIG_SETTING_HOVER_DELAY_DISABLED :Rechtsklik STR_CONFIG_SETTING_POPULATION_IN_LABEL :Geef het inwoneraantal bij een stad weer: {STRING} STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Toon de populatie van een stad in hun tekst op de kaart STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Dikte van de lijnen in grafieken: {STRING} -STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Breedte van de lijnen in de grafiek. Een dunne lijn is preciezer leesbaar, een dikke lijn is makkelijker te zien en kleuren zijn gemakkelijker herkenbaar.e lijn +STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Breedte van de lijnen in de grafiek. Een dunne lijn is preciezer leesbaar, een dikke lijn is makkelijker te zien en kleuren zijn makkelijker om te onderscheiden STR_CONFIG_SETTING_LANDSCAPE :Landschap: {STRING} -STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Landschappen definiëren basis gameplay scenario's met verschillende vracht en stadsgroei eisen. NewGRF en Game Scripts kunnen fijne instellingen hebben +STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Landschappen definiëren standaard gameplayscenario's met verschillende vracht- en stadsgroei-eisen. NewGRF en spelscripts kunnen daarentegen fijnere controle bieden STR_CONFIG_SETTING_LAND_GENERATOR :Landgenerator: {STRING} -STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT :De originele generator afhankelijk van de basis graphics set, en composeert vaste landschap vormen. TerraGenesis is een Perlin-ruis gebaseerde generator met fijnere instellingen +STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT :De originele generator hangt af van de standaard graphicsset en stelt vaste landschapsvormen samen. TerraGenesis is een op Perlin noise gebaseerde generator met fijnere besturingsinstellingen STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Origineel STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_TERRAIN_TYPE :Terrein type: {STRING} STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(Alleen TerraGenesis) Heuvelachtigheid van het landschap -STR_CONFIG_SETTING_INDUSTRY_DENSITY :Industrie-dichtheid: {STRING} +STR_CONFIG_SETTING_INDUSTRY_DENSITY :Industriedichtheid: {STRING} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Stel in hoeveel industrieën moeten worden gegenereerd en welk niveau tijdens het spel moet worden gehandhaafd STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Maximum afstand van de rand voor Olierafinaderijen: {STRING} STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Olieraffinaderijen worden alleen gebouwd nabij de kaart grens, dat is aan de kust van eiland kaarten @@ -1323,8 +1326,8 @@ STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Draaiing van ho STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Tegen de klok in STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Met de klok mee STR_CONFIG_SETTING_SE_FLAT_WORLD_HEIGHT :De hoogte van een plat scenario wordt: {STRING} -STR_CONFIG_SETTING_EDGES_NOT_EMPTY :{WHITE}Een of meer vakjes aan de noordelijke rand zijn niet leeg -STR_CONFIG_SETTING_EDGES_NOT_WATER :{WHITE}Een of meer vakjes aan de rand zijn geen water +STR_CONFIG_SETTING_EDGES_NOT_EMPTY :{WHITE}Eén of meer vakjes aan de noordelijke rand zijn niet leeg +STR_CONFIG_SETTING_EDGES_NOT_WATER :{WHITE}Eén of meer vakjes aan de rand zijn geen water STR_CONFIG_SETTING_STATION_SPREAD :Maximale stationsgrootte: {STRING} STR_CONFIG_SETTING_STATION_SPREAD_HELPTEXT :Maximum gebied waar onderdelen van één station op verspreid mogen zijn. Grotere gebieden vertragen het spel! @@ -1337,12 +1340,16 @@ 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_REVERSE_SCROLLING :Omgekeerde scrollrichting: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Gedrag wanneer gescrolld wordt door de map met de rechter muisknop. Indien uitgeschakeld bestuurd de muis de camera. Indien ingeschakeld bestuurd de muis de kaart. +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 tegel-afstanden en hoogteverschillen bij het slepen tijdens de bouw werkzaamheden +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} STR_CONFIG_SETTING_LIVERIES_HELPTEXT :Beheer het gebruik van voertuigspecifieke levering voor voertuigen (in tegenstelling tot bedrijfsspecifieke leveringen). STR_CONFIG_SETTING_LIVERIES_NONE :Niets @@ -1370,14 +1377,14 @@ 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 :Uit -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Scrollen met linkermuisknop: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Schakel scrollen met de linkermuis knop in door te slepen. Dit is vooral handig bij het gebruik van een touch-screen voor scrollen +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Sluit window met rechts-klik: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Sluit een venster door met de rechtermuisknop erin te klikken. Schakelt de tooltip uit met de rechtermuisknop! STR_CONFIG_SETTING_AUTOSAVE :Automatisch opslaan: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Kies interval tussen automatische spelopslag STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Gebruik {STRING} datumformaat voor naamgeving van opgeslagen spellen -STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Formaat van de datum in op te slaan spel bestandsnamen +STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Formaat van de datum in savegamebestandsnamen STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_LONG :lang (31e dec 2008) STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_SHORT :kort (31-12-2008) STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_ISO :ISO (2008-12-31) @@ -1387,13 +1394,13 @@ STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME_HELPTEXT :Wanneer ingesch STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL :Toestaan wanneer gepauzeerd: {STRING} STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_HELPTEXT :Selecteer welke acties kunnen worden uitgevoerd terwijl het spel is gepauzeerd STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_NO_ACTIONS :Geen mogelijkheden -STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_CONSTRUCTION :Alle niet-constructie mogelijkheden +STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_CONSTRUCTION :Alle niet-constructiemogelijkheden STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_LANDSCAPING :Alles behalve landschapsaanpassingen STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_ACTIONS :Alle mogelijkheden STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS :Gebruik groepen voor voertuigenlijst: {STRING} STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Schakel het gebruik van de geavanceerde voertuigenlijsten in voor het groeperen van voertuigen STR_CONFIG_SETTING_LOADING_INDICATORS :Gebruik laadindicatoren: {STRING} -STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Geef aan of laad indicatoren worden weergegeven boven ladende of lossende voertuigen +STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Geef aan of laadindicatoren worden weergegeven boven ladende of lossende voertuigen STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Toon dienstregeling in tikken ipv in dagen: {STRING} STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Toon reistijden in tijdtabellen in het spelticks in plaats van dagen STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Toon aankomst- en vertrektijden in dienstregeling: {STRING} @@ -1401,7 +1408,7 @@ STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Geef de verwach STR_CONFIG_SETTING_QUICKGOTO :Snel voertuigorders maken: {STRING} STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT :Pre-selecteer de 'Ga naar cursor' bij het openen van de orders venster STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE :Standaard spoorsoort (bij nieuw of opgeslagen spel): {STRING} -STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Rail type om te selecteren na het starten of het laden van een spel. 'eerst beschikbare' selecteert de oudste vorm van tracks, 'laatst beschikbare' het nieuwste type van tracks selecteert, en 'meest gebruikte' selecteert het type die op dit moment het meest in gebruik is +STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Spoortype om te selecteren na het starten of het laden van een spel. 'eerst beschikbare' selecteert de oudste vorm van sporen, 'laatst beschikbare' selecteert het nieuwste type van sporen, en 'meest gebruikte' selecteert het type dat op dit moment het meest in gebruik is STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :Eerst beschikbare STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_LAST :Laatst beschikbare STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_MOST_USED :Meest gebruikte @@ -1410,7 +1417,7 @@ STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT :Geef gereservee STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Hou bouwgereedschappen actief na gebruik: {STRING} STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT :Houd de bouwhulpmiddelen voor bruggen, tunnels, enz. open na gebruik STR_CONFIG_SETTING_EXPENSES_LAYOUT :Groepeer uitgaven in bedrijfsfinanciënscherm: {STRING} -STR_CONFIG_SETTING_EXPENSES_LAYOUT_HELPTEXT :Definieer de lay-out voor het bedrijf uitgaven venster +STR_CONFIG_SETTING_EXPENSES_LAYOUT_HELPTEXT :Definieer de lay-out voor het bedrijfsuitgavenvenster STR_CONFIG_SETTING_SOUND_TICKER :Nieuwsticker: {STRING} STR_CONFIG_SETTING_SOUND_TICKER_HELPTEXT :Speel geluidseffect voor samenvatting nieuwsberichten @@ -1430,33 +1437,33 @@ STR_CONFIG_SETTING_SOUND_AMBIENT :Omgeving: {STRI STR_CONFIG_SETTING_SOUND_AMBIENT_HELPTEXT :Speel omgevingsgeluidseffecten van landschap, industrieën en steden STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING :Bouwen van infrastructuur uitschakelen wanneer geen geschikt voertuig beschikbaar is: {STRING} -STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING_HELPTEXT :Wanneer ingeschakeld, de infrastructuur is alleen beschikbaar als er ook voertuigen beschikbaar zijn, het voorkomen van verspilling van tijd en geld aan onbruikbare infrastructuur +STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING_HELPTEXT :Wanneer je dit inschakelt, is de infrastructuur alleen beschikbaar als er ook voertuigen beschikbaar zijn. Dit voorkomt verspilling van tijd en geld aan onbruikbare infrastructuur STR_CONFIG_SETTING_MAX_TRAINS :Maximum aantal treinen per bedrijf: {STRING} STR_CONFIG_SETTING_MAX_TRAINS_HELPTEXT :Maximum aantal treinen dat een bedrijf kan hebben STR_CONFIG_SETTING_MAX_ROAD_VEHICLES :Maximum aantal wegvoertuigen per bedrijf: {STRING} -STR_CONFIG_SETTING_MAX_ROAD_VEHICLES_HELPTEXT :Maximum aantal wegvoertuigen die een bedrijf kan hebben +STR_CONFIG_SETTING_MAX_ROAD_VEHICLES_HELPTEXT :Maximum aantal wegvoertuigen dat een bedrijf kan hebben STR_CONFIG_SETTING_MAX_AIRCRAFT :Maximum aantal vliegtuigen per bedrijf: {STRING} STR_CONFIG_SETTING_MAX_AIRCRAFT_HELPTEXT :Maximum aantal vliegtuigen dat een bedrijf kan hebben STR_CONFIG_SETTING_MAX_SHIPS :Maximum aantal schepen per bedrijf: {STRING} STR_CONFIG_SETTING_MAX_SHIPS_HELPTEXT :Maximum aantal schepen dat een bedrijf kan hebben STR_CONFIG_SETTING_AI_BUILDS_TRAINS :Treinen voor de computer uitschakelen: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_TRAINS_HELPTEXT :Het inschakelen van deze instelling maakt het bouwen van treinen onmogelijk voor een computer-speler +STR_CONFIG_SETTING_AI_BUILDS_TRAINS_HELPTEXT :Het inschakelen van deze instelling maakt het bouwen van treinen onmogelijk voor een computerspeler STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES :Wegvoertuigen voor de computer uitschakelen: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES_HELPTEXT :Het inschakelen van deze instelling maakt het bouwen van wegvoertuigen onmogelijk voor een computer-speler +STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES_HELPTEXT :Het inschakelen van deze instelling maakt het bouwen van wegvoertuigen onmogelijk voor een computerspeler STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT :Vliegtuigen voor de computer uitschakelen: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT_HELPTEXT :Het inschakelen van deze instelling maakt het het bouwen van vliegtuigen onmogelijk voor een computer-speler +STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT_HELPTEXT :Het inschakelen van deze instelling maakt het het bouwen van vliegtuigen onmogelijk voor een computerspeler STR_CONFIG_SETTING_AI_BUILDS_SHIPS :Schepen voor de computer uitschakelen: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_SHIPS_HELPTEXT :Het inschakelen van deze instelling maakt het het bouwen van schepen onmogelijk voor een computer-speler +STR_CONFIG_SETTING_AI_BUILDS_SHIPS_HELPTEXT :Het inschakelen van deze instelling maakt het het bouwen van schepen onmogelijk voor een computerspeler STR_CONFIG_SETTING_AI_PROFILE :Standaard instellingenprofiel: {STRING} -STR_CONFIG_SETTING_AI_PROFILE_HELPTEXT :Kies welk instellingsprofiel moet worden gebruikt bij willekeurige AI's of als startwaardes, wanneer een nieuwe AI of Game Script wordt toegevoegd +STR_CONFIG_SETTING_AI_PROFILE_HELPTEXT :Kies welk instellingsprofiel moet worden gebruikt bij willekeurige AI's of als startwaardes, wanneer een nieuwe AI of spelscript wordt toegevoegd STR_CONFIG_SETTING_AI_PROFILE_EASY :Makkelijk STR_CONFIG_SETTING_AI_PROFILE_MEDIUM :Gemiddeld STR_CONFIG_SETTING_AI_PROFILE_HARD :Moeilijk STR_CONFIG_SETTING_AI_IN_MULTIPLAYER :Laat computerspelers toe in netwerkspel: {STRING} -STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :Sta door computer gegenereerde speler toe deel te nemen in multiplayer spelen. +STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :Sta door computer gegenereerde speler toe deel te nemen in multiplayerspellen STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :#opcodes voordat scripts worden gestopt: {STRING} STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :Maximum aantal berekeningsstappen die een script kan maken in een beurt @@ -1508,37 +1515,37 @@ 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 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 aankondigingen in kleur worden afgedrukt. Voor dit jaar wordt zwart-wit gebruikt -STR_CONFIG_SETTING_STARTING_YEAR :Beginjaar: {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 :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} -STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Wanneer ingeschakeld, toestaan kopen en verkopen van bedrijfsaandelen. Aandelen zullen alleen beschikbaar zijn voor bedrijven die een bepaalde leeftijd hebben bereikt +STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Wanneer ingeschakeld is het toegestaan om bedrijfsaandelen te kopen en te verkopen. Aandelen zullen alleen beschikbaar zijn voor bedrijven die een bepaalde leeftijd hebben bereikt STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Percentage van routeopbrengst in overdrachtssysteem: {STRING} -STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Percentage van het inkomen besteed aan de intermediaire delen in feeder-systemen, waardoor meer controle over de inkomsten is +STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Percentage van het inkomen besteed aan de intermediaire delen in feedersystemen waardoor er meer controle over de inkomsten is STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Bij slepen, plaats seinen elke: {STRING} -STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Stel de afstand waarop signalen worden gebouwd op een spoor tot aan de volgende hindernis (signaal, kruising), als signalen worden gesleept +STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Stel de afstand waarop signalen worden gebouwd op een spoor in totaan de volgende hindernis (signaal, kruising) als signalen worden gesleept STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} tegel{P 0 "" s} STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Bij slepen, hou vaste afstand tussen seinen: {STRING} -STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Selecteer het gedrag van het sein plaatsing bij Ctrl + slepen seinen. Indien uitgeschakeld, worden seinen rondom tunnels of bruggen om lange stukken te vermijden, zonder seinen. Indien ingeschakeld, worden seinen geplaatst elke N tegels, waardoor de uitlijning van de seinen op parallelle sporen makkelijker is +STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Selecteer het gedrag van seinplaatsing wanneer je met Ctrl+slepen seinen plaatst. Indien dit uitgeschakeld is, dan worden seinen rondom tunnels of bruggen geplaatst om lange stukken te vermijden zonder seinen. Indien dit ingeschakeld is, dan worden seinen om de N tegels geplaatst, waardoor de uitlijning van de seinen op parallelle sporen makkelijker is STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Plaats automatisch armseinen voor: {STRING} STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Stel het jaar waarin elektrische seinen zal worden gebruikt voor sporen. Voor dit jaar zal niet-elektrische seinen worden gebruikt (die exact dezelfde functie hebben, maar verschillend uiterlijk) -STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI :Activeer sein-GUI: {STRING} -STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI_HELPTEXT :Toon een venster voor het kiezen van soorten seinen om te bouwen, in plaats van alleen window-loos sein-type rotatie met Ctrl + klikken op bouwen seinen +STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI :Activeer de seininterface: {STRING} +STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI_HELPTEXT :Toon een venster waar je de soorten seinen kunt kiezen om te bouwen in plaats van alleen vensterloze seintyperotatie met Ctrl+klikken op gebouwde seinen STR_CONFIG_SETTING_DEFAULT_SIGNAL_TYPE :Seintype dat standaard moet worden gebouwd: {STRING} STR_CONFIG_SETTING_DEFAULT_SIGNAL_TYPE_HELPTEXT :Standaard te gebruiken sein. STR_CONFIG_SETTING_DEFAULT_SIGNAL_NORMAL :Normale seinen STR_CONFIG_SETTING_DEFAULT_SIGNAL_PBS :Routeseinen STR_CONFIG_SETTING_DEFAULT_SIGNAL_PBSOWAY :Eenrichtingsrouteseinen -STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Blader door seintypen: {STRING} -STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Selecteer welke soorten seinen worden gebruikt, wanneer Ctrl + klikken op een buildsein met het sein gereedschap +STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Blader door seintypes: {STRING} +STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Selecteer welke soorten seinen worden gebruikt wanneer je Ctrl + klikt op een bouwsignaal met het seingereedschap STR_CONFIG_SETTING_CYCLE_SIGNAL_NORMAL :Alleen normaal STR_CONFIG_SETTING_CYCLE_SIGNAL_PBS :Alleen routeseinen STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Allemaal @@ -1598,69 +1605,69 @@ STR_CONFIG_SETTING_TOWN_GROWTH_NORMAL :Normaal STR_CONFIG_SETTING_TOWN_GROWTH_FAST :Snel STR_CONFIG_SETTING_TOWN_GROWTH_VERY_FAST :Heel snel STR_CONFIG_SETTING_LARGER_TOWNS :Verhouding van gemeenten die steden zullen worden: {STRING} -STR_CONFIG_SETTING_LARGER_TOWNS_HELPTEXT :Aantal steden dat een stad wordt, dus een stad die begint groter en groeit sneller +STR_CONFIG_SETTING_LARGER_TOWNS_HELPTEXT :Aantal steden die een stad worden, dus een stad die groter begint en sneller groeit STR_CONFIG_SETTING_LARGER_TOWNS_VALUE :1 op {COMMA} STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Geen -STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Stadsgroei-indicator: {STRING} +STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Stadsgroeiindicator: {STRING} STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Gemiddelde grootte van steden in vergelijking tot normale steden bij het begin van het spel. -STR_CONFIG_SETTING_LINKGRAPH_INTERVAL :Bijwerken distributie grafiek elke {STRING}{NBSP}dag{P 0:2 "" en} +STR_CONFIG_SETTING_LINKGRAPH_INTERVAL :Werk distributiegrafiek elke {STRING}{NBSP}dag{P 0:2 "" en} bij STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT :Tijd tussen opeenvolgende herberekeningen van de link grafiek. Elke herberekening berekent de plannen voor een component van de grafiek. Dat betekent dat een waarde X voor deze instelling betekent niet dat de hele grafiek wordt elke X dagen worden bijgewerkt. Slechts een component wil. Hoe korter u instellen hoe meer CPU-tijd nodig is om het te berekenen zal zijn. Hoe langer je instellen hoe langer het zal duren totdat de lading distributie start op nieuwe routes. STR_CONFIG_SETTING_LINKGRAPH_TIME :Neem {STRING}{NBSP}dag{P 0:2 "" en} voor de herberekening van de distributie grafiek STR_CONFIG_SETTING_LINKGRAPH_TIME_HELPTEXT :Tijd gebruikt voor elke herberekening van een link grafiek component. Wanneer een herberekening wordt gestart, wordt een thread voortgebracht die mag lopen voor dit aantal dagen. Hoe korter u dit instelt des te waarschijnlijker het is dat de draad niet is voltooid als het zou moeten. Dan stopt het spel totdat het is ("lag"). Hoe langer je instellen hoe langer het duurt voor de distributie aan te passen wanneer routes te wijzigen. STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :handmatig STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :asymmetrisch STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :symmetrisch -STR_CONFIG_SETTING_DISTRIBUTION_PAX :Distributie-modus voor passagiers: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_PAX :Distributiemodus voor passagiers: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"symmetrisch" betekent dat ongeveer hetzelfde aantal passagiers gaan van een station A naar station B als een van B naar A. "asymmetrische" betekent dat willekeurig aantal passagiers kunnen gaan in beide richtingen. "handmatig" betekent dat er geen automatische distributie zal plaatsvinden voor passagiers. -STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Distributie-modus voor post: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :"symmetrisch" betekent dat ongeveer dezelfde hoeveelheid e-mail wordt verzonden van een station A naar station B als een van B naar A. "asymmetrische" dat willekeurige hoeveelheden post in beide richtingen worden verzonden. "handmatig" betekent dat er geen automatische distributie zal plaatsvinden voor post. -STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Distributie-modus voor de GEPANTSERDE lading klasse: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :De GEPANTSERDE lading klasse bevat waardevolle spullen in het gematigde klimaat, diamanten in de subtropische of goud in subarctische klimaat. NewGRFs kan dat veranderen. "symmetrisch" betekent dat ongeveer dezelfde hoeveelheid lading die wordt verzonden van een station A naar station B als een van B naar A. "asymmetrische" dat willekeurige deze vracht kan in beide richtingen worden verzonden. "handmatig" betekent dat er geen automatische distributie zal plaatsvinden voor die lading. Het wordt aanbevolen om dit op asymmetrische of handmatig bij het spelen van subarctische, zoals banken zullen geen goud terug te sturen naar goudmijnen. Voor gematigde en subtropische kunt u ook kiezen symmetrische als banken zullen waardevolle spullen terugsturen naar de oorsprong bank van enkele lading van kostbaarheden. -STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Distributie-modus voor andere vrachtsoorten: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"symmetrisch" betekent dat willekeurige hoeveelheden lading in beide richtingen kan worden gestuurd. "manual" betekent dat er geen automatische distributie zal plaatsvinden voor die lading. +STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Distributiemodus voor post: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :"symmetrisch" betekent dat ongeveer dezelfde hoeveelheid post zal worden verzonden van een station A naar een station B als B naar A. "asymmetrisch" betekent dat willekeurige hoeveelheden post in beide richtingen worden verzonden. "handmatig" betekent dat er geen automatische distributie zal plaatsvinden voor post. +STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Distributiemodus voor de GEPANTSERDE ladingsklasse: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :De GEPANTSERDE ladingsklasse bevat waardevolle spullen in het gematigde klimaat, diamanten in het subtropische klimaat of goud in het subarctische klimaat. NewGRF's kunnen dat veranderen. "symmetrisch" betekent dat ongeveer dezelfde hoeveelheid lading wordt verzonden van een station A naar station B als een van B naar A. "asymmetrisch" betekent dat deze vracht willekeurig in beide richtingen kan worden verzonden. "handmatig" betekent dat er geen automatische distributie zal plaatsvinden voor die lading. Het wordt aanbevolen om dit op asymmetrisch of handmatig te zetten bij het spelen van subarctisch klimaat, omdat banken geen goud zullen terugsturen naar goudmijnen. Voor gematigde en subtropische klimaten kan je ook symmetrisch kiezen, omdat banken waardevolle spullen zullen terugsturen naar de oorspronkelijke bank. +STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Distributiemodus voor andere vrachtsoorten: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"symmetrisch" betekent dat willekeurige hoeveelheden lading in beide richtingen kunnen worden gestuurd. "handmatig" betekent dat er geen automatische distributie zal plaatsvinden voor die lading. STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Verdeelnauwkeurigheid: {STRING} -STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Hoe hoger de instelling des te meer CPU-tijd de berekening van de link grafiek zal gebruiken. Als het te lang duurt kan vertraging opleveren. Als u deze instelt op een lage waarde, echter, zal de verdeling onnauwkeurig zijn, en de lading zal niet altijd worden verzonden naar de plaatsen die u verwacht. +STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Hoe hoger de instelling, des te meer CPU-tijd de berekening van de linkgrafiek zal gebruiken. Als het te lang duurt, kan dan dat lag opleveren. Als je dit echter op een lage waarde instelt, zal de verdeling onnauwkeurig zijn, en kan het zijn dat vracht niet wordt gestuurd naar de plekken waar het naartoe moet gaan. STR_CONFIG_SETTING_DEMAND_DISTANCE :Effect van afstand op de vraag: {STRING} -STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Als je dit op een waarde hoger dan 0, de afstand tussen het station van herkomst A van enige vracht en een mogelijke bestemming B zal een effect hebben op de hoeveelheid lading verzonden van A naar B. Hoe verder weg B is van A des te minder lading wordt verzonden. Hoe hoger u deze instelt, zal het minder lading worden gezonden naar verder geleden stations en meer lading zal worden verzonden naar dichtbij gelegen stations. +STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Als je dit op een waarde hoger dan 0 zet, dan zal de afstand tussen het station van herkomst A met enige vracht en een mogelijke bestemming B effect hebben op de hoeveelheid lading verzonden van A naar B. Hoe verder weg B is van A, des te minder lading wordt verzonden. Hoe hoger je deze instelt, hoe minder lading wordt verzonden naar verder geleden stations en meer lading zal worden verzonden naar dichtbij gelegen stations. STR_CONFIG_SETTING_DEMAND_SIZE :Hoeveelheid van de kerende vracht voor symmetrische modus: {STRING} -STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Door dit op minder dan 100% te zetten lijkt de symmetrische verdeling meer op het asymmetrische verdeling. Minder vracht zal geforceerd worden teruggestuurd als er een bepaalde hoeveelheid wordt verzonden naar een station. Op 0% van de symmetrische verdeling gedraagt deze zicht als de asymmetrische verdeling. +STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Door dit op minder dan 100% te zetten lijkt de symmetrische verdeling meer op de asymmetrische verdeling. Minder vracht zal geforceerd worden om zich terug te sturen als er een bepaalde hoeveelheid wordt verzonden naar een station. Op 0% van de symmetrische verdeling gedraagt deze zicht als de asymmetrische verdeling. STR_CONFIG_SETTING_SHORT_PATH_SATURATION :Verzadiging van korte routes voor het gebruik van ruime routes: {STRING} STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :Vaak zijn er meerdere routes mogelijk tussen twee stations. Cargodist zal de kortste route eerst verzadigen, gebruik dan de tweede kortste route tot die verzadigd is en ga zo maar door. Verzadiging wordt bepaald door een schatting van de capaciteit en het geplande gebruik. Zodra alle routes verzadigd zijn, maar er is meer vraag, zal alle wegen overbelast worden, die met hoge capaciteit eerst. In veel gevallen zat het algoritme niet nauwkeurig de capaciteit inschatten, helaas. Met deze instelling kunt u aangeven tot welk percentage een korter pad moet worden verzadigd eer de eerst volgende langere route wordt gekozen. Zet deze op minder dan 100% om overvolle stations in geval van overschat capaciteit te voorkomen. -STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :Snelheid eenheden: {STRING} -STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Wanneer een snelheid wordt weergegeven in de gebruikersinterface, laten dat in de geselecteerde eenheden zien -STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Imperial (mph) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :Snelheidseenheden: {STRING} +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Wanneer een snelheid wordt weergegeven in de gebruikersinterface, dan moet het worden getoond in de geselecteerde eenheden +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Imperiaal (mph) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metrisch (km/h) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s) -STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Voertuig kracht eenheden: {STRING} -STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Als het verbruik van een voertuig wordt weergegeven in de gebruikersinterface, laten dat in de geselecteerde eenheden zien -STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_IMPERIAL :Imperial (hp) +STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Voertuigkrachteenheden: {STRING} +STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Als het verbruik van een voertuig wordt weergegeven in de gebruikersinterface, dan moet het worden getoond in de geselecteerde eenheden +STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_IMPERIAL :Imperiaal (hp) STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_METRIC :Metrisch (hp) STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_SI :SI (kW) -STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT :Gewichten eenheden: {STRING} -STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_HELPTEXT :Wanneer er gewichten worden weergegeven in de gebruikersinterface, laten dat in de geselecteerde eenheden zien -STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_IMPERIAL :Imperial (short t/ton) +STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT :Gewichtseenheden: {STRING} +STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_HELPTEXT :Wanneer er gewichten worden weergegeven in de gebruikersinterface, dan moeten ze worden getoond in de geselecteerde eenheden +STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_IMPERIAL :Imperiaal (short t/ton) STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_METRIC :Metrisch (t/ton) STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_SI :SI (kg) -STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME :Volume eenheden: {STRING} -STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_HELPTEXT :Wanneer volumes worden getoond in de gebruikersinterface, laten dat in de geselecteerde eenheden zien -STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_IMPERIAL :Imperial (gal) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME :Volume-eenheden: {STRING} +STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_HELPTEXT :Wanneer volumes worden getoond in de gebruikersinterface, dan moeten ze worden getoond in de geselecteerde eenheden +STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_IMPERIAL :Imperiaal (gal) STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_METRIC :Metrisch (l) STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_SI :SI (m³) -STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE :Trekkracht eenheden: {STRING} +STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE :Trekkrachteenheden: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_HELPTEXT :Wanneer trekkracht, wordt weergegeven in de gebruikersinterface, laten dat in de geselecteerde eenheden zien -STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_IMPERIAL :Imperial (lbf) +STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_IMPERIAL :Imperiaal (lbf) STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_METRIC :Metrisch (kgf) STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) -STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :hoogte eenheden: {STRING} -STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Wanneer hoogtes worden weergegeven in de gebruikersinterface, laten dat in de geselecteerde eenheden zien -STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (ft) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Hoogte-eenheden: {STRING} +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Wanneer hoogtes worden weergegeven in de gebruikersinterface, moet het worden getoond in de geselecteerde eenheden +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperiaal (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrisch (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -1679,7 +1686,7 @@ STR_CONFIG_SETTING_VEHICLES_PHYSICS :{ORANGE}Physics STR_CONFIG_SETTING_VEHICLES_ROUTING :{ORANGE}Routebepaling STR_CONFIG_SETTING_LIMITATIONS :{ORANGE}Beperkingen STR_CONFIG_SETTING_ACCIDENTS :{ORANGE}Rampen / Ongelukken -STR_CONFIG_SETTING_GENWORLD :{ORANGE}Wereld generatie +STR_CONFIG_SETTING_GENWORLD :{ORANGE}Wereldgeneratie STR_CONFIG_SETTING_ENVIRONMENT :{ORANGE}Omgeving STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :{ORANGE}Autoriteiten STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :{ORANGE}Steden @@ -1709,17 +1716,17 @@ STR_CONFIG_ERROR_ARRAY :{WHITE}... fout STR_CONFIG_ERROR_INVALID_VALUE :{WHITE}... ongeldige waarde '{STRING}' voor '{STRING}' STR_CONFIG_ERROR_TRAILING_CHARACTERS :{WHITE}... karakters gevonden aan het einde van instellingen '{STRING}' STR_CONFIG_ERROR_DUPLICATE_GRFID :{WHITE}... negeer NewGRF '{STRING}': dubbel GRF ID met '{STRING}' -STR_CONFIG_ERROR_INVALID_GRF :{WHITE}... negeer ongeldig NewGRF '{STRING}': {STRING} +STR_CONFIG_ERROR_INVALID_GRF :{WHITE}... negeer ongeldige NewGRF '{STRING}': {STRING} STR_CONFIG_ERROR_INVALID_GRF_NOT_FOUND :niet gevonden STR_CONFIG_ERROR_INVALID_GRF_UNSAFE :onveilig voor statisch gebruik STR_CONFIG_ERROR_INVALID_GRF_SYSTEM :systeem NewGRF STR_CONFIG_ERROR_INVALID_GRF_INCOMPATIBLE :niet compatibel met deze versie van OpenTTD STR_CONFIG_ERROR_INVALID_GRF_UNKNOWN :onbekend -STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_LEVEL :{WHITE}... compressie niveau '{STRING}' is niet geldig -STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_ALGORITHM :{WHITE}... savegame formaat '{STRING}' is niet beschikbaar. Valt terug naar '{STRING}' -STR_CONFIG_ERROR_INVALID_BASE_GRAPHICS_NOT_FOUND :{WHITE}... negeert Basis Grafische set '{STRING}': niet gevonden -STR_CONFIG_ERROR_INVALID_BASE_SOUNDS_NOT_FOUND :{WHITE}... negeert Basis Geluid set '{STRING}': niet gevonden -STR_CONFIG_ERROR_INVALID_BASE_MUSIC_NOT_FOUND :{WHITE}... negeert Basis Muziek set '{STRING}': niet gevonden +STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_LEVEL :{WHITE}... compressieniveau '{STRING}' is niet geldig +STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_ALGORITHM :{WHITE}... savegameformaat '{STRING}' is niet beschikbaar. Valt terug naar '{STRING}' +STR_CONFIG_ERROR_INVALID_BASE_GRAPHICS_NOT_FOUND :{WHITE}... negeert standaard graphicsset '{STRING}': niet gevonden +STR_CONFIG_ERROR_INVALID_BASE_SOUNDS_NOT_FOUND :{WHITE}... negeert standaard geluidsset '{STRING}': niet gevonden +STR_CONFIG_ERROR_INVALID_BASE_MUSIC_NOT_FOUND :{WHITE}... negeert standaard muziekset '{STRING}': niet gevonden STR_CONFIG_ERROR_OUT_OF_MEMORY :{WHITE}Geen geheugen meer STR_CONFIG_ERROR_SPRITECACHE_TOO_BIG :{WHITE}Toewijzen van {BYTES} van spritecache mislukt. De spritecache werd teruggebracht tot {BYTES}. Dit zal de prestaties van OpenTTD verlagen. Om het geheugen te verminderen kunt u proberen om 32bpp graphics en / of zoom-in levels uit te schakelen @@ -1734,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 @@ -1746,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 @@ -1754,13 +1761,14 @@ 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 STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Toon AI/Game script instellingen STR_INTRO_TOOLTIP_QUIT :{BLACK}Verlaat 'OpenTTD' +STR_INTRO_BASESET :{BLACK}De huidige gekozen graphics set mist {NUM} afbeelding{P "" en}. Controleer of er updates zijn voor deze basisset. STR_INTRO_TRANSLATION :{BLACK}Deze vertaling mist {NUM} tekst{P "" en}. Help aub om OpenTTD beter te maken door je al vertaler aan te melden. Zie readme.txt voor details. # Quit window @@ -1789,7 +1797,7 @@ STR_ABANDON_SCENARIO_QUERY :{YELLOW}Weet je # Cheat window STR_CHEATS :{WHITE}Cheats STR_CHEATS_TOOLTIP :{BLACK}Keuzevakjes geven aan of je deze cheat eerder hebt gebruikt -STR_CHEATS_WARNING :{BLACK}Waarschuwing! Je staat op het punt je medespelers te verraden. Bedenk dat zo'n schande eeuwig wordt onthouden +STR_CHEATS_WARNING :{BLACK}Waarschuwing! Je staat op het punt je medespelers te verraden. Onthoud dat zo'n schande eeuwig wordt onthouden STR_CHEAT_MONEY :{LTBLUE}Verhoog geld met {CURRENCY_LONG} STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Spelen als bedrijf: {ORANGE}{COMMA} STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Magische bulldozer (industrieën en andere onverplaatsbare objecten verwijderen): {ORANGE}{STRING} @@ -1813,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 @@ -1821,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) @@ -1902,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: @@ -1956,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 @@ -1977,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!! @@ -2013,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 @@ -2027,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} @@ -2051,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... @@ -2112,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 @@ -2134,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 @@ -2156,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 @@ -2171,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 @@ -2188,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 @@ -2260,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 @@ -2278,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 @@ -2307,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 @@ -2322,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 @@ -2353,33 +2362,33 @@ STR_STATION_CLASS_WAYP :Controleposten # Signal window STR_BUILD_SIGNAL_CAPTION :{WHITE}Seinkeuze -STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Bloksein (armsein){}Dit is het simpelste soort sein, dat slechts één trein tegelijk in hetzelfde blok toelaat +STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Bloksein (armsein){}Dit is het simpelste soort sein dat slechts één trein tegelijk in hetzelfde blok toelaat STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Ingangssein (semafoor){}Groen zolang als er één of meer groene uitgangsseinen zijn volgend na dit sein. Anders is deze rood STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Uitgangssein (armsein){}Gedraagt zich hetzelfde als een gewoon bloksein, maar is nodig om ingangs- en combinatieseinen te sturen 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_ENTRY_TOOLTIP :{BLACK}Ingangssein (electrisch){}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_COMBO_TOOLTIP :{BLACK}Combinatiesein (electric){}Het combinatiesein gedraagt zich als zowel ingangs- als uitgangs-sein. 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 -STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Sein ombouwen{}Indien geselecteerd, zal door te klikken op een bestaand sein deze worden omgebouwd naar het geselecteerde seintype en variant, Ctrl+klik verandert de bestaande variant (armsein/elektrisch). Shift+klik toont de geschatte ombouwkosten +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}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 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 +STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Sein ombouwen{}Als dit geselecteerd is, dan zal door te klikken op een bestaand sein deze worden omgebouwd naar het geselecteerde seintype en variant, Ctrl+klik verandert de bestaande variant (armsein/elektrisch). Shift+klik toont de geschatte ombouwkosten STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}Dichtheid van seinen bij het slepen STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}Verklein dichtheid van seinen bij het slepen STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Vergroot dichtheid van seinen bij het slepen # 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 :Hang, Staal +STR_BRIDGE_NAME_SUSPENSION_STEEL :Hangend, Staal STR_BRIDGE_NAME_GIRDER_STEEL :Koker, Staal -STR_BRIDGE_NAME_CANTILEVER_STEEL :Cantilever, Staal -STR_BRIDGE_NAME_SUSPENSION_CONCRETE :Hang, Beton +STR_BRIDGE_NAME_CANTILEVER_STEEL :Vrijdragend, Staal +STR_BRIDGE_NAME_SUSPENSION_CONCRETE :Hangend, Beton STR_BRIDGE_NAME_WOODEN :Hout STR_BRIDGE_NAME_CONCRETE :Beton STR_BRIDGE_NAME_TUBULAR_STEEL :Buis, Staal @@ -2388,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 @@ -2449,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 @@ -2465,7 +2474,7 @@ STR_AIRPORT_HELISTATION :Helikopterstati STR_AIRPORT_CLASS_SMALL :Kleine vliegvelden STR_AIRPORT_CLASS_LARGE :Grote vliegvelden STR_AIRPORT_CLASS_HUB :Centraal vliegveld -STR_AIRPORT_CLASS_HELIPORTS :Helikopter-vliegvelden +STR_AIRPORT_CLASS_HELIPORTS :Helikoptervliegvelden STR_STATION_BUILD_NOISE :{BLACK}Geluidsoverlast: {GOLD}{COMMA} @@ -2484,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 @@ -2576,20 +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_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 @@ -2601,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 :{STRING} spoor -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} spoor met blokseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} spoor met voorseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} spoor met exitseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} spoor met combo-seinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} spoor met routeseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} spoor met eenrichtingsseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} spoor met blok en voorseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} spoor met blok en exitseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} spoor met blok en combo-seinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} spoor met blok en routeseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} spoor met blok en eenrichtingsseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} spoor met voor- en exitseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} spoor met voor- en combo-seinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} spoor met voor- en routeseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} spoor met voor- en eenrichtingsseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} spoor met exit- en combo-seinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} spoor em exit- en routeseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} spoor met exit- en eenrichtingsseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} spoor met combo- en routeseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} Spoor met combo- en eenrichtingssein -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} spoor met route en eenrichtingssein -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} trein depot +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 :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 @@ -2660,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 @@ -2686,8 +2696,58 @@ 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_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 Het OpenTTD team +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 @@ -2706,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} @@ -2726,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: @@ -2756,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 @@ -2764,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 @@ -2788,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 @@ -2839,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} @@ -2861,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) @@ -2874,7 +2934,7 @@ STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Ga naar STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Vorige afbeelding STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Ga naar vorige normale afbeelding, sla alle pseudo/herkleur/lettertype afbeeldingen over en ga naar het einde bij het begin STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Voorbeeld van de huidige afbeelding. De uitlijning wordt genegeerd bij het weergeven van de afbeelding -STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Afbeelding verplaatsen, dit verandert X en Y offsets +STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Afbeelding verplaatsen, dit verandert X en Y offsets. Ctr+klik om de afbeelding 8 eenheden per keer te verplaatsen. STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Herstel relatief STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Herstel de huidige relative offsets STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X offset: {NUM}, Y offset: {NUM} (Absoluut) @@ -2896,21 +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_MISSING_SPRITES :{WHITE}De huidige basis graphics-set mist een aantal sprites..{}Werk de graphics-set bij aub -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}De momenteel gebruikte basis graphics set mist een aantal sprites.{} Werk de ingestelde basis graphics bij.{} Aangezien u een {YELLOW} ontwikkeling momentopname van OpenTTD{WHITE} speelt, heeft u ook een {YELLOW} ontwikkeling snapshot van de basis graphics set{WHITE} nodig -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! @@ -2918,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 @@ -2934,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 NewGRFs. Het spel kan desynchroniseren of vastlopen +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 @@ -2956,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 @@ -4096,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 @@ -4212,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... @@ -4220,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... @@ -4298,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 @@ -4471,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 @@ -4485,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 @@ -4506,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 @@ -4569,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 1c51c6d1c2..626a2bda0f 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 @@ -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}No music available STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{RAW_STRING}" STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Track STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Title @@ -669,15 +671,15 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Select ' STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Toggle programme shuffle on/off STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Show music track selection window -STR_ERROR_NO_SONGS :{WHITE}A music set without songs has been selected. No songs will be played - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Music Programme Selection +STR_PLAYLIST_MUSIC_SELECTION_SETNAME :{WHITE}Music Programme - '{RAW_STRING}' STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{RAW_STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Track Index STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Programme - '{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 programme (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 programme (Custom1 or Custom2 only) STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Click on music track to remove it from current programme (Custom1 or Custom2 only) @@ -813,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}! @@ -880,10 +883,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 @@ -925,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 @@ -1337,8 +1341,12 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Colour of the t 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 :Violet -STR_CONFIG_SETTING_REVERSE_SCROLLING :Reverse scroll direction: {STRING2} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Behaviour when scrolling the map with the right mouse button. When disabled, the mouse moves the camera. When enabled, the mouse moves the map +STR_CONFIG_SETTING_SCROLLMODE :Viewport scroll behaviour: {STRING2} +STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Behaviour 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: {STRING2} 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: {STRING2} @@ -1370,8 +1378,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+Click STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Click STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Off -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Left-click scrolling: {STRING2} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Enable scrolling the map by dragging it with the left mouse button. This is especially useful when using a touch-screen for scrolling +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Close window on right-click: {STRING2} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Closes a window by right-clicking inside it. Disables the tooltip on right-click! STR_CONFIG_SETTING_AUTOSAVE :Autosave: {STRING2} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Select interval between automatic game saves @@ -1761,6 +1769,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Check fo STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Display AI/Game script settings STR_INTRO_TOOLTIP_QUIT :{BLACK}Exit 'OpenTTD' +STR_INTRO_BASESET :{BLACK}The currently selected base graphics set is missing {NUM} sprite{P "" s}. Please check for updates for the baseset. STR_INTRO_TRANSLATION :{BLACK}This translation misses {NUM} string{P "" s}. Please help make OpenTTD better by signing up as translator. See readme.txt for details. # Quit window @@ -2282,6 +2291,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 @@ -2589,6 +2599,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Airport STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{RAW_STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Cargo accepted: {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}Rail speed limit: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Road speed limit: {LTBLUE}{VELOCITY} @@ -2601,29 +2612,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Fields STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Snow-covered land STR_LAI_CLEAR_DESCRIPTION_DESERT :Desert -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} track -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} track with block signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} track with pre-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} track with exit-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} track with combo-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} track with path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} track with one-way path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} track with block and pre-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} track with block and exit-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} track with block and combo-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} track with block and path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} track with block and one-way path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} track with pre- and exit-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} track with pre- and combo-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} track with pre- and path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} track with pre- and one-way path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} track with exit- and combo-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} track with exit- and path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} track with exit- and one-way path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} track with combo- and path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} track with combo- and one-way path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} track with path and one-way path signals -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} train depot +STR_LAI_RAIL_DESCRIPTION_TRACK :Railway track +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Railway track with block signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Railway track with pre-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Railway track with exit-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Railway track with combo-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Railway track with path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Railway track with one-way path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Railway track with block and pre-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Railway track with block and exit-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Railway track with block and combo-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Railway track with block and path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Railway track with block and one-way path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Railway track with pre- and exit-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Railway track with pre- and combo-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Railway track with pre- and path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Railway track with pre- and one-way path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Railway track with exit- and combo-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Railway track with exit- and path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Railway track with exit- and one-way path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Railway track with combo- and path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Railway track with combo- and one-way path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Railway track with path and one-way path signals +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Railway train depot STR_LAI_ROAD_DESCRIPTION_ROAD :Road STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Road with street lights @@ -2687,7 +2698,57 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Company-owned l STR_ABOUT_OPENTTD :{WHITE}About OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original copyright {COPYRIGHT} 1995 Chris Sawyer, All rights reserved STR_ABOUT_VERSION :{BLACK}OpenTTD version {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 The OpenTTD team +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 @@ -2711,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 @@ -2906,11 +2968,11 @@ STR_NEWGRF_ERROR_INVALID_ID :Attempt to use STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{RAW_STRING} contains a corrupt sprite. All corrupt sprites will be shown as a red question mark (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Contains multiple Action 8 entries (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Read past end of pseudo-sprite (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}The currently used base graphics set is missing a number of sprites.{}Please update the base graphics set -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}The currently used base graphics set is missing a number of sprites.{}Please update the base graphics set.{}Since you are playing a {YELLOW}development snapshot of OpenTTD{WHITE}, you might also need a {YELLOW}development snapshot of the base graphics{WHITE} 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! @@ -2975,6 +3037,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 centre main view on town. Ctrl+Click opens a new viewport on town location STR_TOWN_POPULATION :{BLACK}World population: {COMMA} @@ -2982,8 +3045,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_PASSENGERS_LAST_MONTH_MAX :{BLACK}Passengers last month: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Mail last month: {ORANGE}{COMMA}{BLACK} max: {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 @@ -3114,8 +3176,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Accepts STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Show list of accepted cargo STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Accepts: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}This station has exclusive transport rights in this town. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} bought exclusive transport rights in this town. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}This station has exclusive transport rights in this town. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} bought exclusive transport rights in this town. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Ratings STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Show station ratings @@ -3294,9 +3356,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Requires STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Requires: {YELLOW}{STRING}{RAW_STRING}, {STRING}{RAW_STRING}, {STRING}{RAW_STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Requires: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:RAW_STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} waiting{RAW_STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Cargo waiting to be processed: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{RAW_STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produces: {YELLOW}{STRING}{RAW_STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Produces: {YELLOW}{STRING}{RAW_STRING}, {STRING}{RAW_STRING} ############ range for produces ends @@ -3363,6 +3427,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Remove all vehi STR_GROUP_RENAME_CAPTION :{BLACK}Rename a group +STR_GROUP_PROFIT_THIS_YEAR :Profit this year: +STR_GROUP_PROFIT_LAST_YEAR :Profit last year: +STR_GROUP_OCCUPANCY :Current usage: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :New Rail Vehicles STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :New Electric Rail Vehicles @@ -3394,6 +3463,7 @@ STR_PURCHASE_INFO_ALL_TYPES :All cargo types STR_PURCHASE_INFO_ALL_BUT :All but {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Max. Tractive Effort: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Range: {GOLD}{COMMA} tiles +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Aircraft type: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Train vehicle selection list. Click on vehicle for information. Ctrl+Click for toggling hiding of the vehicle type STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Road vehicle selection list. Click on vehicle for information. Ctrl+Click for toggling hiding of the vehicle type @@ -3527,10 +3597,11 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :maglev locomoti STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Cost: {CURRENCY_LONG} Weight: {WEIGHT_SHORT}{}Speed: {VELOCITY} Power: {POWER}{}Running Cost: {CURRENCY_LONG}/yr{}Capacity: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cost: {CURRENCY_LONG} Weight: {WEIGHT_SHORT}{}Speed: {VELOCITY} Power: {POWER} Max. T.E.: {6:FORCE}{}Running Cost: {4:CURRENCY_LONG}/yr{}Capacity: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Capacity: {CARGO_LONG}, {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Capacity: {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY} Range: {COMMA} tiles{}Capacity: {CARGO_LONG}, {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY} Range: {COMMA} tiles{}Capacity: {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Capacity: {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Aircraft type: {STRING}{}Capacity: {CARGO_LONG}, {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Aircraft type: {STRING}{}Capacity: {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Aircraft type: {STRING} Range: {COMMA} tiles{}Capacity: {CARGO_LONG}, {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Aircraft type: {STRING} Range: {COMMA} tiles{}Capacity: {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Replace {STRING} - {STRING1} @@ -3557,10 +3628,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} when o STR_REPLACE_VEHICLES_STOP :{BLACK}Stop Replacing Vehicles STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Press to stop the replacement of the engine type selected on the left -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Replacing: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Switch between engine and wagon replacement windows STR_REPLACE_ENGINES :Engines STR_REPLACE_WAGONS :Wagons +STR_REPLACE_ALL_RAILTYPE :All rail vehicles STR_REPLACE_HELP_RAILTYPE :{BLACK}Choose the rail type you want to replace engines for STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Displays which engine the left selected engine is being replaced with, if any @@ -3653,7 +3724,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} year{P STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} year{P "" s} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Max. speed: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Max. speed: {LTBLUE}{VELOCITY} {BLACK}Range: {LTBLUE}{COMMA} tiles +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Max. speed: {LTBLUE}{VELOCITY} {BLACK}Aircraft type: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Max. speed: {LTBLUE}{VELOCITY} {BLACK}Aircraft type: {LTBLUE}{STRING} {BLACK}Range: {LTBLUE}{COMMA} tiles STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Weight: {LTBLUE}{WEIGHT_SHORT} {BLACK}Power: {LTBLUE}{POWER}{BLACK} Max. speed: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Weight: {LTBLUE}{WEIGHT_SHORT} {BLACK}Power: {LTBLUE}{POWER}{BLACK} Max. speed: {LTBLUE}{VELOCITY} {BLACK}Max. T.E.: {LTBLUE}{FORCE} @@ -3787,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_CARGO_WAITING :Waiting cargo STR_ORDER_CONDITIONAL_ACCEPTANCE_DROPDOWN :Accepted cargo STR_ORDER_CONDITIONAL_FREE_PLATFORMS :Free platforms @@ -4235,7 +4308,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... @@ -4243,6 +4315,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... @@ -4494,6 +4567,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/english_AU.txt b/src/lang/english_AU.txt index 6220846171..8e001d956a 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -660,10 +660,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Select ' STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Toggle programme shuffle on/off STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Show music track selection window -STR_ERROR_NO_SONGS :{WHITE}A music set without songs has been selected. No songs will be played - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Music Programme Selection 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}Programme - '{STRING}' @@ -1316,8 +1313,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Colour of the t 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 :Violet -STR_CONFIG_SETTING_REVERSE_SCROLLING :Reverse scroll direction: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Behaviour when scrolling the map with the right mouse button. When disabled, the mouse moves the camera. When enabled, the mouse moves the map 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} @@ -1349,8 +1344,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+Click STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Click STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Off -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Left-click scrolling: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Enable scrolling the map by dragging it with the left mouse button. This is especially useful when using a touch-screen for scrolling STR_CONFIG_SETTING_AUTOSAVE :Autosave: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Select interval between automatic game saves @@ -2576,29 +2569,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Fields STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Snow-covered land STR_LAI_CLEAR_DESCRIPTION_DESERT :Desert -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} track -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} track with block signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} track with pre-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} track with exit-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} track with combo-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} track with path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} track with one-way path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} track with block and pre-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} track with block and exit-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} track with block and combo-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} track with block and path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} track with block and one-way path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} track with pre- and exit-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} track with pre- and combo-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} track with pre- and path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} track with pre- and one-way path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} track with exit- and combo-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} track with exit- and path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} track with exit- and one-way path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} track with combo- and path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} track with combo- and one-way path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} track with path and one-way path signals -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} train depot +STR_LAI_RAIL_DESCRIPTION_TRACK :Railway track +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Railway track with block signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Railway track with pre-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Railway track with exit-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Railway track with combo-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Railway track with path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Railway track with one-way path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Railway track with block and pre-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Railway track with block and exit-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Railway track with block and combo-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Railway track with block and path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Railway track with block and one-way path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Railway track with pre- and exit-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Railway track with pre- and combo-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Railway track with pre- and path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Railway track with pre- and one-way path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Railway track with exit- and combo-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Railway track with exit- and path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Railway track with exit- and one-way path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Railway track with combo- and path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Railway track with combo- and one-way path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Railway track with path and one-way path signals +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Railway train depot STR_LAI_ROAD_DESCRIPTION_ROAD :Road STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Road with street lights @@ -2662,7 +2655,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Company-owned l STR_ABOUT_OPENTTD :{WHITE}About OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original copyright {COPYRIGHT} 1995 Chris Sawyer, All rights reserved STR_ABOUT_VERSION :{BLACK}OpenTTD version {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 The OpenTTD team +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 @@ -2873,8 +2873,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Attempt to use STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} contains a corrupt sprite. All corrupt sprites will be shown as a red question mark (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Contians multiple Action 8 entries (sprite{3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Read past end of psuedo-sprite (sprite{3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}The currently used base graphics set is missing a number of sprites.{}Please update the base graphics set -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}The currently used base graphics set is missing a number of sprites.{}Please update the base graphics set.{}Since you are playing a {YELLOW}development snapshot of OpenTTD{WHITE}, you might also need a {YELLOW}development snapshot of the base graphics{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Requested GRF resources not available (sprite{3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} was disabled by {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Invalid/unknown sprite layout format (sprite {3:NUM}) @@ -2949,8 +2947,6 @@ 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_PASSENGERS_LAST_MONTH_MAX :{BLACK}Passengers last month: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Mail 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 @@ -3081,8 +3077,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Accepts STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Show list of accepted cargo STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Accepts: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}This station has exclusive transport rights in this town. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} bought exclusive transport rights in this town. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}This station has exclusive transport rights in this town. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} bought exclusive transport rights in this town. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Ratings STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Show station ratings @@ -3261,9 +3257,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Requires STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Requires: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Cargo waiting to be processed: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produces: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Produces: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3330,6 +3325,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Remove all vehi STR_GROUP_RENAME_CAPTION :{BLACK}Rename a group + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :New Rail Vehicles STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :New Electric Rail Vehicles @@ -3482,10 +3478,7 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :maglev locomoti STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Cost: {CURRENCY_LONG} Weight: {WEIGHT_SHORT}{}Speed: {VELOCITY} Power: {POWER}{}Running Cost: {CURRENCY_LONG}/yr{}Capacity: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cost: {CURRENCY_LONG} Weight: {WEIGHT_SHORT}{}Speed: {VELOCITY} Power: {POWER} Max. T.E.: {6:FORCE}{}Running Cost: {4:CURRENCY_LONG}/yr{}Capacity: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Capacity: {CARGO_LONG}, {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Capacity: {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY} Range: {COMMA} tiles{}Capacity: {CARGO_LONG}, {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY} Range: {COMMA} tiles{}Capacity: {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Capacity: {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Replace {STRING} - {STRING} @@ -3508,7 +3501,6 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} when o STR_REPLACE_VEHICLES_STOP :{BLACK}Stop Replacing Vehicles STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Press to stop the replacement of the engine type selected on the left -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Replacing: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Switch between engine and wagon replacement windows STR_REPLACE_ENGINES :Engines STR_REPLACE_WAGONS :Wagons @@ -3604,7 +3596,6 @@ STR_VEHICLE_INFO_AGE :{COMMA} year{P STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} year{P "" s} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Max. speed: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Max. speed: {LTBLUE}{VELOCITY} {BLACK}Range: {LTBLUE}{COMMA} tiles STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Weight: {LTBLUE}{WEIGHT_SHORT} {BLACK}Power: {LTBLUE}{POWER}{BLACK} Max. speed: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Weight: {LTBLUE}{WEIGHT_SHORT} {BLACK}Power: {LTBLUE}{POWER}{BLACK} Max. speed: {LTBLUE}{VELOCITY} {BLACK}Max. T.E.: {LTBLUE}{FORCE} @@ -4162,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 2ee11838c0..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 @@ -669,15 +670,15 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Select ' STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Toggle program shuffle on/off STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Show music track selection window -STR_ERROR_NO_SONGS :{WHITE}A music set without songs has been selected. No songs will be played - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Music Program Selection +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) @@ -880,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 @@ -1337,8 +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_REVERSE_SCROLLING :Reverse scroll direction: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Behavior when scrolling the map with the right mouse button. When disabled, the mouse moves the camera. When enabled, the mouse moves the map +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} @@ -1370,8 +1375,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+Click STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Click STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Off -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Left-click scrolling: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Enable scrolling the map by dragging it with the left mouse button. This is especially useful when using a touch-screen for scrolling +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Close window on right-click: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Closes a window by right-clicking inside it. Disables the tooltip on right-click! STR_CONFIG_SETTING_AUTOSAVE :Autosave: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Select interval between automatic game saves @@ -1761,6 +1766,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Check fo STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Display AI/Game script settings STR_INTRO_TOOLTIP_QUIT :{BLACK}Quit 'OpenTTD' +STR_INTRO_BASESET :{BLACK}The currently selected base graphics set is missing {NUM} sprite{P "" s}. Please check for updates for the baseset. STR_INTRO_TRANSLATION :{BLACK}This translation misses {NUM} string{P "" s}. Please help make OpenTTD better by signing up as translator. See readme.txt for details. # Quit window @@ -2282,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 @@ -2589,6 +2596,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Airport STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Cargo accepted: {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}Rail speed limit: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Road speed limit: {LTBLUE}{VELOCITY} @@ -2601,29 +2609,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Fields STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Snow-covered land STR_LAI_CLEAR_DESCRIPTION_DESERT :Desert -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} track -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} track with block signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} track with pre-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} track with exit-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} track with combo-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} track with path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} track with one-way path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} track with block and pre-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} track with block and exit-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} track with block and combo-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} track with block and path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} track with block and one-way path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} track with pre- and exit-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} track with pre- and combo-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} track with pre- and path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} track with pre- and one-way path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} track with exit- and combo-signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} track with exit- and path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} track with exit- and one-way path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} track with combo- and path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} track with combo- and one-way path signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} track with path and one-way path signals -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} train depot +STR_LAI_RAIL_DESCRIPTION_TRACK :Railroad track +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Railroad track with block signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Railroad track with pre-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Railroad track with exit-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Railroad track with combo-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Railroad track with path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Railroad track with one-way path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Railroad track with block and pre-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Railroad track with block and exit-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Railroad track with block and combo-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Railroad track with block and path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Railroad track with block and one-way path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Railroad track with pre- and exit-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Railroad track with pre- and combo-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Railroad track with pre- and path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Railroad track with pre- and one-way path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Railroad track with exit- and combo-signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Railroad track with exit- and path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Railroad track with exit- and one-way path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Railroad track with combo- and path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Railroad track with combo- and one-way path signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Railroad track with path and one-way path signals +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Railroad train depot STR_LAI_ROAD_DESCRIPTION_ROAD :Road STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Road with street lights @@ -2687,7 +2695,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Company-owned l STR_ABOUT_OPENTTD :{WHITE}About OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original copyright {COPYRIGHT} 1995 Chris Sawyer, All rights reserved STR_ABOUT_VERSION :{BLACK}OpenTTD version {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 The OpenTTD team +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 @@ -2906,8 +2921,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Attempt to use STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} contains a corrupt sprite. All corrupt sprites will be shown as a red question mark (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Contains multiple Action 8 entries (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Read past end of pseudo-sprite (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}The currently used base graphics set is missing a number of sprites.{}Please update the base graphics set -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}The currently used base graphics set is missing a number of sprites.{}Please update the base graphics set.{}Since you are playing a {YELLOW}development snapshot of OpenTTD{WHITE}, you might also need a {YELLOW}development snapshot of the base graphics{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Requested GRF resources not available (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} was disabled by {2:STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Invalid/unknown sprite layout format (sprite {3:NUM}) @@ -2975,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} @@ -2982,8 +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_PASSENGERS_LAST_MONTH_MAX :{BLACK}Passengers last month: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Mail last month: {ORANGE}{COMMA}{BLACK} max: {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 @@ -3114,8 +3127,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Accepts STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Show list of accepted cargo STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Accepts: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}This station has exclusive transport rights in this town. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} bought exclusive transport rights in this town. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}This station has exclusive transport rights in this town. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} bought exclusive transport rights in this town. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Ratings STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Show station ratings @@ -3294,9 +3307,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Requires STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Requires: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Requires: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} waiting{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Cargo waiting to be processed: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produces: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Produces: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3363,6 +3378,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Remove all vehi STR_GROUP_RENAME_CAPTION :{BLACK}Rename a group +STR_GROUP_PROFIT_THIS_YEAR :Profit this year: +STR_GROUP_PROFIT_LAST_YEAR :Profit last year: +STR_GROUP_OCCUPANCY :Current usage: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :New Rail Vehicles STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :New Electric Rail Vehicles @@ -3394,6 +3414,7 @@ STR_PURCHASE_INFO_ALL_TYPES :All cargo types STR_PURCHASE_INFO_ALL_BUT :All but {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Max. Tractive Effort: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Range: {GOLD}{COMMA} tiles +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Aircraft type: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Train vehicle selection list. Click on vehicle for information. Ctrl+Click to toggle hiding of the vehicle type STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Road vehicle selection list. Click on vehicle for information. Ctrl+Click to toggle hiding of the vehicle type @@ -3527,10 +3548,11 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :maglev locomoti STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Cost: {CURRENCY_LONG} Weight: {WEIGHT_SHORT}{}Speed: {VELOCITY} Power: {POWER}{}Running Cost: {CURRENCY_LONG}/yr{}Capacity: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cost: {CURRENCY_LONG} Weight: {WEIGHT_SHORT}{}Speed: {VELOCITY} Power: {POWER} Max. T.E.: {6:FORCE}{}Running Cost: {4:CURRENCY_LONG}/yr{}Capacity: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Capacity: {CARGO_LONG}, {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Capacity: {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY} Range: {COMMA} tiles{}Capacity: {CARGO_LONG}, {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY} Range: {COMMA} tiles{}Capacity: {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Capacity: {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Aircraft type: {STRING}{}Capacity: {CARGO_LONG}, {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Aircraft type: {STRING}{}Capacity: {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Aircraft type: {STRING} Range: {COMMA} tiles{}Capacity: {CARGO_LONG}, {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Aircraft type: {STRING} Range: {COMMA} tiles{}Capacity: {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Replace {STRING} - {STRING} @@ -3557,10 +3579,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} when o STR_REPLACE_VEHICLES_STOP :{BLACK}Stop Replacing Vehicles STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Press to stop the replacement of the engine type selected on the left -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Replacing: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Switch between engine and car replacement windows STR_REPLACE_ENGINES :Engines STR_REPLACE_WAGONS :Cars +STR_REPLACE_ALL_RAILTYPE :All rail vehicles STR_REPLACE_HELP_RAILTYPE :{BLACK}Choose the rail type you want to replace engines for STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Displays which engine the left selected engine is being replaced with, if any @@ -3653,7 +3675,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} year{P STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} year{P "" s} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Max. speed: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Max. speed: {LTBLUE}{VELOCITY} {BLACK}Range: {LTBLUE}{COMMA} tiles +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Max. speed: {LTBLUE}{VELOCITY} {BLACK}Aircraft type: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Max. speed: {LTBLUE}{VELOCITY} {BLACK}Aircraft type: {LTBLUE}{STRING} {BLACK}Range: {LTBLUE}{COMMA} tiles STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Weight: {LTBLUE}{WEIGHT_SHORT} {BLACK}Power: {LTBLUE}{POWER}{BLACK} Max. speed: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Weight: {LTBLUE}{WEIGHT_SHORT} {BLACK}Power: {LTBLUE}{POWER}{BLACK} Max. speed: {LTBLUE}{VELOCITY} {BLACK}Max. T.E.: {LTBLUE}{FORCE} @@ -4212,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... @@ -4220,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... @@ -4471,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 dbfa50d6f0..49149b638f 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -472,6 +472,7 @@ STR_ABOUT_MENU_GIANT_SCREENSHOT :Tuta karto ekra STR_ABOUT_MENU_ABOUT_OPENTTD :Pri 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Bildeto-liniigilo STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Montri/ne montri limigujo +STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :(Mal)ŝalti la kolorigon de malpuraj blokoj ############ range ends here ############ range for ordinal numbers used for the place in the highscore window @@ -662,10 +663,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Elektu l STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Miksu/ne miksu STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Montru muziker-elektan fenestron -STR_ERROR_NO_SONGS :{WHITE}Senkanta muzikaro estas elektita. Neniu kanto ludos. - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Elekto de Muzikprogramo STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Numera Indekso STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Programo - '{STRING}' @@ -1198,7 +1196,6 @@ STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR :Ligu landaspekt STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Verda STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Malhele verda STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Viola -STR_CONFIG_SETTING_REVERSE_SCROLLING :Inversigu skroldirekton: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING :Glata rulumado de vidujo: {STRING} STR_CONFIG_SETTING_MEASURE_TOOLTIP :Montru mezuran konsilbalonon ĉe uzo de konstruiloj: {STRING} STR_CONFIG_SETTING_LIVERIES :Montru veturiltipe specifajn liverojn: {STRING} @@ -1222,7 +1219,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Komando+Klako STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Klako STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Ne -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Maldekstr-klak-rulumado: {STRING} STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Uzu la {STRING} datformon por nomoj de konservludoj. @@ -1280,6 +1276,7 @@ STR_CONFIG_SETTING_AI_IN_MULTIPLAYER :Permesu Artefar STR_CONFIG_SETTING_SERVINT_ISPERCENT :Prizorgintervala procentaĵo: {STRING} STR_CONFIG_SETTING_NOSERVICE :Malŝaltu prizorgadon se rompiĝoj ne okazas: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Aktivigu vagonajn rapideclimojn: {STRING} +STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Kiam ebligita, ankaŭ uzu rapideco-limigojn de vagonoj por decidi la maksimuman rapidecon de trajno STR_CONFIG_SETTING_DISABLE_ELRAILS :Malŝaltu elektrajn relojn: {STRING} STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN :Unua veturilo atingas propran stacion: {STRING} @@ -1349,6 +1346,7 @@ STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Komenca urbgran +STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_METRIC :Metriko (hp) @@ -2262,7 +2260,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Kompanie poseda STR_ABOUT_OPENTTD :{WHITE}Pri OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Origina kopirajto {COPYRIGHT} 1995 Chris Sawyer, Ĉiuj rajtoj rezervitaj STR_ABOUT_VERSION :{BLACK}OpenTTD-versio {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2015 La teamo de OpenTTD +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 @@ -2448,7 +2453,6 @@ STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} bezo STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :la GRF-dosiero estas farita por traduki STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Tro da NewGRF-oj estas ŝarĝataj STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} enhavas rompitan bildeton. Ĉiuj rompitaj bildetoj aspektos kiel ruĝaj demandsignoj (?) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}La nuntempe uza baza grafikaĵaro mankas kelkajn da bildetoj.{}Bonvolu renovigu la baza grafikaĵaro STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} estis malaktivata per {STRING} # NewGRF related 'general' warnings @@ -2512,8 +2516,6 @@ STR_TOWN_POPULATION :{BLACK}Monda en STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Urbo) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Enloĝantoj: {ORANGE}{COMMA}{BLACK} Domoj: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Pasaĝeroj lastmonate: {ORANGE}{COMMA}{BLACK} maksimume: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Poŝto lastmonate: {ORANGE}{COMMA}{BLACK} maksimume: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Kargo bezonata por kreskigi urbon: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} bezonatas STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} bezonatas en vintro @@ -2559,10 +2561,12 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Subaĉe # Goal window STR_GOALS_TEXT :{ORANGE}{STRING} +STR_GOALS_NONE :{ORANGE}- Nenia - # Goal question window ############ Start of Goal Question button list +STR_GOAL_QUESTION_BUTTON_CONTINUE :Daŭrigu ############ End of Goal Question button list # Subsidies window @@ -2727,9 +2731,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Bezonas: STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Bezonas: {YELLOW}{STRING.n}{STRING}, {STRING.n}{STRING}, {STRING.n}{STRING} ############ range for requires ends + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Kargo atendanta procedon: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produktas: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Produktas: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -2793,6 +2796,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Forigi ĉiujn v STR_GROUP_RENAME_CAPTION :{BLACK}Alinomi grupon + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Novaj Relaj Veturiloj STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Novaj Elektraj Relaj Veturiloj @@ -2951,8 +2955,7 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :magleva lokomot STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Kosto: {CURRENCY_LONG} Pezo: {WEIGHT_SHORT}{}Rapido: {VELOCITY} Forto: {POWER}{}Irkosto: po {CURRENCY_LONG} jare{}Kapablo: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Kosto: {CURRENCY_LONG} Pezo: {WEIGHT_SHORT}{}Rapido: {VELOCITY} Povo: {POWER} Maks. T.E.: {6:FORCE}{}Irkosto: {4:CURRENCY_LONG}/jaro{}Kapacito: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Kosto: {CURRENCY_LONG} Maks. Rapido: {VELOCITY}{}Kapacito: {CARGO_LONG}, {CARGO_LONG}{}Irkosto: {CURRENCY_LONG}/jaro -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Kosto: {CURRENCY_LONG} Maks. Rapido: {VELOCITY}{}Kapacito: {CARGO_LONG}{}Irkosto: {CURRENCY_LONG}/jaro +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Kosto: {CURRENCY_LONG} Maks. Rapido: {VELOCITY}{}Kapacito: {CARGO_LONG}{}Irkosto: {CURRENCY_LONG}/jaro # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Anstataŭu {STRING.n} - {STRING} @@ -2972,7 +2975,6 @@ STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED :{BLACK}Ne elekt STR_REPLACE_VEHICLES_STOP :{BLACK}Ĉesu Anstataŭi STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Premu por ĉesi anstataŭi la maldekstre elektitan maŝinon -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Anstataŭante: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Ŝaltu inter maŝina kaj vagona anstataŭigo STR_REPLACE_ENGINES :Maŝinoj STR_REPLACE_WAGONS :Vagonoj @@ -3365,12 +3367,14 @@ STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}Vidu for STR_AI_CONFIG_CAPTION :{WHITE}AI/Ludo Skripto Agordo STR_AI_CONFIG_HUMAN_PLAYER :Homa ludanto STR_AI_CONFIG_RANDOM_AI :Hazarda AI +STR_AI_CONFIG_NONE :(neniu) STR_AI_CONFIG_MOVE_UP :{BLACK}Movi supren STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Movi elektitan AI-on supren en la listo STR_AI_CONFIG_MOVE_DOWN :{BLACK}Movi suben STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Movi elektitan AI-on suben en la listo +STR_AI_CONFIG_AI :{SILVER}AIj STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CONFIGURE :{BLACK}Agordi @@ -3575,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 167b92a2dc..771994978b 100644 --- a/src/lang/estonian.txt +++ b/src/lang/estonian.txt @@ -726,10 +726,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Vali 'om STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Lülita lugude segamine sisse ja välja STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Näita muusikalugude valimise akent -STR_ERROR_NO_SONGS :{WHITE}Valitud muusikakomplekt ei sisalda ühtegi lugu. Ühtegi lugu ei esitata - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Muusikaprogrammi valimine STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Loo number STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Programm - '{STRING}' @@ -1394,8 +1391,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Maa värv väik STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Roheline STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Tumeroheline STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violetne -STR_CONFIG_SETTING_REVERSE_SCROLLING :Vaade liigub vastassuunas: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Vaate liigutamine parema hiireklahviga. Kui see on välja lülitatud, siis hiireosuti juhib vaatepunkti. Kui sisse, siis kaarti STR_CONFIG_SETTING_SMOOTH_SCROLLING :Vaade keskendatakse sujuvalt: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Vaateakna asukohale keskendamise viis, kui vajutatakse väikesele kaardile, või kui vaade keskendatakse mõnele rekvisiidile. Sisse lülitades on liikumine sujuv, välja lülitades läheb vaade kohe sihtpunkti STR_CONFIG_SETTING_MEASURE_TOOLTIP :Ehitamisel mõõtude arvesti näitamine: {STRING} @@ -1427,8 +1422,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+klõps STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+klõps STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Väljas -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Vaate liigutamine vasaku hiireklahviga: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Lubab kaardi liigutamise vasaku hiireklahvi abil. See lihtsustab mängimist puutetundlikul ekraanil STR_CONFIG_SETTING_AUTOSAVE :Automaatne salvestamine: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Vali automaatse salvestamise intervall @@ -2659,29 +2652,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Põllud STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Lumine maa STR_LAI_CLEAR_DESCRIPTION_DESERT :Kõrb -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} rööbas -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} rööpad koos blokksignaalidega -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} rööpad koos eelsignaalidega -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} rööpad väljasõidusignaalidega -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} rööpad kombineeritud signaalidega -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} rööpad koos täiustatud signaalidega -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} tööpad koos ühesuunaliste täiustatud signaalidega -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} rööpad koos blokk- ja eelsignaalidega -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} rööpad koos blokk- ja väljumissignaalidega -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} rööpad koos blokk- ja kombineeritud signaalidega -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} rööpad koos blokk- ja täiustatud signaalidega -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} rööpad koos blokksignaalidega ja ühesuunaliste täiustatud signaalidega -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} rööpad koos eel- ja väljumissignaalidega -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} rööpad koos eel- ja kombineeritud signaalidega -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} rööpad koos eel- ja täiustatud signaalidega -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} rööpad koos eel- ja ühesuunaliste täiustatud signaaligeda -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} rööpad koos väljumis- ja kombineeritud signaalidega -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} rööpad koos väljumis- ja täiustatud signaalidega -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} rööpad koos väljumis. ja ühesuunaliste täiustatud signaalidega -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} rööpad koos komineeriutd ja täiustatud signaalidega -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} rööpad koos komineeritud ja ühesuunaliste täiustatud signaalidega -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} rööpad koos täisutatud ja ühesuunaliste täiustatud signaalidega -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} Rongidepoo +STR_LAI_RAIL_DESCRIPTION_TRACK :Raudtee rööbas +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Raudtee rööpad koos blokksignaalidega +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Raudtee rööpad koos eelsignaalidega +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Raudtee rööpad väljasõidusignaalidega +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Raudtee rööpad kombineeritud signaalidega +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Raudtee rööpad koos täiustatud signaalidega +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Raudtee tööpad koos ühesuunaliste täiustatud signaalidega +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Raudtee rööpad koos blokk- ja eelsignaalidega +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Raudtee rööpad koos blokk- ja väljumissignaalidega +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Raudtee rööpad koos blokk- ja kombineeritud signaalidega +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Raudtee rööpad koos blokk- ja täiustatud signaalidega +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Raudtee rööpad koos blokksignaalidega ja ühesuunaliste täiustatud signaalidega +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Raudtee rööpad koos eel- ja väljumissignaalidega +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Raudtee rööpad koos eel- ja kombineeritud signaalidega +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Raudtee rööpad koos eel- ja täiustatud signaalidega +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Raudtee rööpad koos eel- ja ühesuunaliste täiustatud signaaligeda +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Raudtee rööpad koos väljumis- ja kombineeritud signaalidega +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Raudtee rööpad koos väljumis- ja täiustatud signaalidega +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Raudtee rööpad koos väljumis. ja ühesuunaliste täiustatud signaalidega +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Raudtee rööpad koos komineeriutd ja täiustatud signaalidega +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Raudtee rööpad koos komineeritud ja ühesuunaliste täiustatud signaalidega +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Raudtee rööpad koos täisutatud ja ühesuunaliste täiustatud signaalidega +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Raudtee Rongidepoo STR_LAI_ROAD_DESCRIPTION_ROAD :Sõidutee STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Valgustatud sõidutee @@ -2745,7 +2738,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Ettevõtte maa STR_ABOUT_OPENTTD :{WHITE}OpenTTD lisainfo STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Algne autorikaitse {COPYRIGHT} 1995 Chris Sawyer, kõik õigused kaitstud STR_ABOUT_VERSION :{BLACK}OpenTTD osa {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2015 OpenTTD meeskond +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 @@ -2964,8 +2964,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Kasutati kõlbm STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} sisaldab vigast pilti. Kõiki vigaseid pilte näidatakse punase küsimärgina (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Sisaldab mitut Action 8 kirjet (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Loe pseudo-sprite lõpust edasi (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Praegune alusgraafika kogu ei sisalda mitmeid spraite.{}Palun uuenda alusgraafika kogu -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Praegune alusgraafika kogu ei sisalda mitmeid spraite.{}Palun uuenda alusgraafika kogu.{}Kuna sa mängid {YELLOW}OpenTTD arendusversiooniga{WHITE}, siis ilmselt pead sa kasutama {YELLOW}alusgraafika kogu arendusversiooni{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Soovitud GRFi ressursid ei ole saadaval (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} blokeeriti {STRING} poolt STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :«Sprite» paigutus kõlbmatus vormis («sprite» {3:NUM}) @@ -3040,8 +3038,6 @@ STR_TOWN_POPULATION :{BLACK}Maailma STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Linn) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Rahvaarv: {ORANGE}{COMMA}{BLACK} Ehitisi: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Reisijaid eelmisel kuul: {ORANGE}{COMMA}{BLACK} Enim: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Posti eelmisel kuul: {ORANGE}{COMMA}{BLACK} Enim: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Veoseid linna kasvamiseks: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} vajalik STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} on talvel vajalik @@ -3172,8 +3168,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Võtab v STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Näita vastuvõetavate veoste nimistut STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Võtab vastu: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Antud jaamal on eksklusiivsed transpordiõigused selles linnas. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} ostis eksklusiivsed transpordiõigused antud linnas. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Antud jaamal on eksklusiivsed transpordiõigused selles linnas. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} ostis eksklusiivsed transpordiõigused antud linnas. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Hinnangud STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Näita jaamahinnangut @@ -3352,9 +3348,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Vajab: { STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Vajab: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Käitlust ootav kaup: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Toodab: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Toodab: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3421,6 +3416,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Eemalda kõik s STR_GROUP_RENAME_CAPTION :{BLACK}Rühma nime vahetamine + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Uued rööbassõidukid STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Uus elektriraudteesõiduk @@ -3585,10 +3581,7 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :magnethõljukve STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Hind: {CURRENCY_LONG} Tühimass: {WEIGHT_SHORT}{}Tippkiirus: {VELOCITY} Võimsus: {POWER}{}Käituskulud: {CURRENCY_LONG}/aastas{}Kandevõime: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Hind: {CURRENCY_LONG} Tühimass: {WEIGHT_SHORT}{}Kiirus: {VELOCITY} Võimsus: {POWER} Veojõud: {6:FORCE}{}Käituskulud: {4:CURRENCY_LONG}/aasta{}Mahutavus: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Hind: {CURRENCY_LONG} Tippkiirus: {VELOCITY}{}Kandevõime: {CARGO_LONG}, {CARGO_LONG}{}Käituskulud: {CURRENCY_LONG}/a -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Hind: {CURRENCY_LONG} Tippkiirus: {VELOCITY}{}Kandevõime: {CARGO_LONG}{}Käituskulud: {CURRENCY_LONG}/a -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Maksumus: {CURRENCY_LONG} Maksimaalne kiirus: {VELOCITY} Tegevusraadius: {COMMA} ruutu{}Mahutavus: {CARGO_LONG}, {CARGO_LONG}{}Kasutamise hind: {CURRENCY_LONG}/aastas -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Maksumus: {CURRENCY_LONG} Maksimaalne kiirus: {VELOCITY} Tegevusraadius: {COMMA} ruutu{}Mahutavus: {CARGO_LONG}{}Kasutamise kulu: {CURRENCY_LONG}/aastas +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Hind: {CURRENCY_LONG} Tippkiirus: {VELOCITY}{}Kandevõime: {CARGO_LONG}{}Käituskulud: {CURRENCY_LONG}/a # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Asenda {STRING} - {STRING} @@ -3615,7 +3608,6 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} kui va STR_REPLACE_VEHICLES_STOP :{BLACK}Lõpeta Sõidukite Asendamine STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Vajuta lõpetamaks vasakult valitud veduri asendust -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Asendamisel: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Vaheta aken mootori ja vaguni asendamise aknate vahel STR_REPLACE_ENGINES :Vedurid STR_REPLACE_WAGONS :Vaguneid @@ -3711,7 +3703,6 @@ STR_VEHICLE_INFO_AGE :{COMMA} aasta{P STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} aasta{P "" t} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Tippkiirus: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Maksimaalne kiirus: {LTBLUE}{VELOCITY} {BLACK}Tegevusraadius: {LTBLUE}{COMMA} ruutu STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Tühimass: {LTBLUE}{WEIGHT_SHORT} {BLACK}Võimsus: {LTBLUE}{POWER}{BLACK} Tippkiirus: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Tühimass: {LTBLUE}{WEIGHT_SHORT} {BLACK}Võimsus: {LTBLUE}{POWER}{BLACK} Tippkiirus: {LTBLUE}{VELOCITY} {BLACK}Veojõud: {LTBLUE}{FORCE} @@ -4270,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 7fc1313d5a..ae2729c216 100644 --- a/src/lang/faroese.txt +++ b/src/lang/faroese.txt @@ -647,10 +647,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Vel 'Sj STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Tendra/sløkk bland av skránni STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Vís tónleika spor úrvals glugga -STR_ERROR_NO_SONGS :{WHITE}Eitt tónleika sett uttan sangir er valt. Engir sangir vera spældir - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Úrval av tónleika skráðum STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Spor yvirlit STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Skrá - '{STRING}' @@ -1273,8 +1270,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Liturin av lend STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Grønt STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Myrka grønt STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Blákollulitur -STR_CONFIG_SETTING_REVERSE_SCROLLING :Umvend skrull ætt: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Atburður tá tú skrullar korti við høgra músa knøtti. Um ógilda flytir músin kamerai. Um gilda flytir músin korti. STR_CONFIG_SETTING_SMOOTH_SCROLLING :Mjúka sýnisglugga skrulling: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Stýr hvussu høvuðs sýni skrullar til eitt ávíst stað tá tú trýstir á lítlakorti ella tú tú gevur eini boð um at skrulla til ein ávísan lut á kortinum. Um gilda, skrullar sýni mjúgdliga, um ógilda leypur sýni beint til staði STR_CONFIG_SETTING_MEASURE_TOOLTIP :Vís eina mátingar vegleiðing tá tú brúkar ymisku byggji amboðini: {STRING} @@ -1306,8 +1301,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+trýst STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+trýst STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Sløkt -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Vinstra-trýst skrulling: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Gilda skrulling av kortinum við at toga ta við vinstra músa knøtti. Hetta er serstakliga hent um tú nýtur ein fingraskugga at skrulla vi STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Nýt {STRING} dato sniði til nøvnini á goymdum spølum @@ -2341,29 +2334,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Markir STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Kava-klætt lendi STR_LAI_CLEAR_DESCRIPTION_DESERT :Oyðimørk -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} breyt -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} breyt við blokk teknum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} breyt við for teknum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} breyt við útvegs teknum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} breyt við blandings teknum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} breyt við leið teknum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} breyt við einvegis leiðs teknum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} breyt við blokk og for teknum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} breyt við blokk og útvegs teknum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} breyt við block og blandings teknum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} breyt við blokk og leiðs teknum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} breyt við blokk og einvegis leiðs teknum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} breyt við for og útvegis teknum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} breyt við for og blandings teknum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} breyt við for og leiðs teknum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} breyt við for og einvegis leiðs teknum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} breyt við útvegs og blandings teknum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} breyt við útvegs og leiðs teknum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} breyt við útvegs og einvegis leiðs teknum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} breyt við blandings og leiðs teknum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} breyt við blandings og einvegis leiðs teknum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} breyt við leiðs og einvegis leiðs teknum -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} Tok goymsla +STR_LAI_RAIL_DESCRIPTION_TRACK :{G=m}Jarnbreyt breyt +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{G=m}Jarnbreyt breyt við blokk teknum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{G=m}Jarnbreyt breyt við for teknum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{G=m}Jarnbreyt breyt við útvegs teknum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{G=m}Jarnbreyt breyt við blandings teknum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{G=m}Jarnbreyt breyt við leið teknum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{G=m}Jarnbreyt breyt við einvegis leiðs teknum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{G=m}Jarnbreyt breyt við blokk og for teknum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{G=m}Jarnbreyt breyt við blokk og útvegs teknum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{G=m}Jarnbreyt breyt við block og blandings teknum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{G=m}Jarnbreyt breyt við blokk og leiðs teknum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{G=m}Jarnbreyt breyt við blokk og einvegis leiðs teknum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{G=m}Jarnbreyt breyt við for og útvegis teknum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{G=m}Jarnbreyt breyt við for og blandings teknum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{G=m}Jarnbreyt breyt við for og leiðs teknum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{G=m}Jarnbreyt breyt við for og einvegis leiðs teknum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{G=m}Jarnbreyt breyt við útvegs og blandings teknum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{G=m}Jarnbreyt breyt við útvegs og leiðs teknum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{G=m}Jarnbreyt breyt við útvegs og einvegis leiðs teknum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{G=m}Jarnbreyt breyt við blandings og leiðs teknum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{G=m}Jarnbreyt breyt við blandings og einvegis leiðs teknum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{G=m}Jarnbreyt breyt við leiðs og einvegis leiðs teknum +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{G=m}Jarnbreyt Tok goymsla STR_LAI_ROAD_DESCRIPTION_ROAD :Vegur STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Vegur við lyktapelum @@ -2427,7 +2420,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Ogn hjá fyrit STR_ABOUT_OPENTTD :{WHITE}Um OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Upprunalig upphavsrættindi {COPYRIGHT} 1995 Chris Sawyer, Øll rættindi umbiðin STR_ABOUT_VERSION :{BLACK}OpenTTD útgáva {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 OpenTTD toymi +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 @@ -2650,8 +2650,6 @@ STR_TOWN_POPULATION :{BLACK}Heims f STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Býur) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Fólkatal: {ORANGE}{COMMA}{BLACK} Hús: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Ferðafólk síðsta mánað: {ORANGE}{COMMA}{BLACK} maks: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Postur síðsta mánað: {ORANGE}{COMMA}{BLACK} maks: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Farmur ið tørvast fyri bygda menning: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} krevst STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} krevst um veturin @@ -2767,8 +2765,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Tekur í STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Vís lista yvir góðtiknan farm STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Tekur í móti: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Henda støðin hevur flutnings einkarættindi í hesari bygdini. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} keypti flutnings einkarættindi í hesi bygdini. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Henda støðin hevur flutnings einkarættindi í hesari bygdini. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} keypti flutnings einkarættindi í hesi bygdini. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Metingar STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Vís støð metingar @@ -2923,9 +2921,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Tørvar: STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Tørvar: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Farmur ið bíðar eftir at verða viðgjørdur: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Framleiður: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Framleiður: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -2990,6 +2987,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Bein øll flutn STR_GROUP_RENAME_CAPTION :{BLACK}Navngev ein bólk + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nýggj jarnbreyta flutningstól STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nýggj ravmagns jarnbreyta flutningstól @@ -3142,10 +3140,7 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :maglev lokomoti STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Kostnaður: {CURRENCY_LONG} Vekt: {WEIGHT_SHORT}{}Ferð: {VELOCITY} Megi: {POWER}{}Rakstrar kostnaður: {CURRENCY_LONG}/ár{}Pláss: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Kostnaður: {CURRENCY_LONG} Vekt: {WEIGHT_SHORT}{}Ferð: {VELOCITY} Megi: {POWER} Maks. D.Ó.: {6:FORCE}{}Rakstrar kostnaður: {4:CURRENCY_LONG}/ár{}Pláss: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Kostnaður: {CURRENCY_LONG} Maks. Ferð: {VELOCITY}{}Pláss: {CARGO_LONG}, {CARGO_LONG}{}Rakstrar kostnaður: {CURRENCY_LONG}/ár -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Kostnaður: {CURRENCY_LONG} Maks. Ferð: {VELOCITY}{}Pláss: {CARGO_LONG}{}Rakstrar kostnaður: {CURRENCY_LONG}/ár -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Kostnaður: {CURRENCY_LONG} Maks. Ferð: {VELOCITY} Vídd: {COMMA} puntar{}Pláss: {CARGO_LONG}, {CARGO_LONG}{}Rakstrar kostnaður: {CURRENCY_LONG}/ár -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Kostnaður: {CURRENCY_LONG} Maks. Ferð: {VELOCITY} Vídd: {COMMA} puntar{}Pláss: {CARGO_LONG}{}Rakstrar kostnaður: {CURRENCY_LONG}/ár +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Kostnaður: {CURRENCY_LONG} Maks. Ferð: {VELOCITY}{}Pláss: {CARGO_LONG}{}Rakstrar kostnaður: {CURRENCY_LONG}/ár # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Být um {STRING} - {STRING} @@ -3168,7 +3163,6 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} tá ga STR_REPLACE_VEHICLES_STOP :{BLACK}Steðga umbýting av flutningstólum STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Trýst fyri at steðga umbýtanini av motor slagnum tú valdi á vinstru síðu -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Býtur um: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Skift ímillum motor og vogna umbýtingar vindeyga STR_REPLACE_ENGINES :Motorar STR_REPLACE_WAGONS :Vognar @@ -3232,7 +3226,6 @@ STR_VEHICLE_INFO_AGE :{COMMA} ár ({C STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} ár ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Maks. ferð: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Maks. ferð: {LTBLUE}{VELOCITY} {BLACK}Vídd: {LTBLUE}{COMMA} puntar STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Vekt: {LTBLUE}{WEIGHT_SHORT} {BLACK}Megi: {LTBLUE}{POWER}{BLACK} Maks. ferð: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Vekt: {LTBLUE}{WEIGHT_SHORT} {BLACK}Megi: {LTBLUE}{POWER}{BLACK} Maks. ferð: {LTBLUE}{VELOCITY} {BLACK}Maks. D.Ó.: {LTBLUE}{FORCE} @@ -3730,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 c5026a1eb3..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 @@ -669,17 +671,15 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Valitse STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Sekoittaminen päälle/pois STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Näytä musiikkiraitojen valintaikkuna -STR_ERROR_NO_SONGS :{WHITE}Musiikkipaketti jossa ei ole kappaleita on valittu. Musiikkia ei soiteta - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Soittolistan valinta +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} @@ -714,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 @@ -780,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 @@ -809,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! @@ -834,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 @@ -868,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! @@ -876,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} @@ -895,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) @@ -912,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) @@ -925,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. @@ -951,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 @@ -989,7 +991,7 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Nelinkertainen STR_GAME_OPTIONS_BASE_GRF :{BLACK}Perusgrafiikat STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Valitse käytettävät perusgrafiikat -STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} puuttuva/korruptoitunut tiedosto{P "" ja} +STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} puuttuva{P "" a}/korruptoitunut{P "" ta} tiedosto{P "" a} STR_GAME_OPTIONS_BASE_GRF_DESCRIPTION_TOOLTIP :{BLACK}Lisätietoja perusgrafiikoista STR_GAME_OPTIONS_BASE_SFX :{BLACK}Perusäänet @@ -1096,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: @@ -1148,7 +1150,7 @@ STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT :Määritä kulk STR_CONFIG_SETTING_CONSTRUCTION_SPEED :Rakennusnopeus: {STRING} STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :Rajoita tekoälyn rakennustoimien määrää STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :Ajoneuvojen hajoaminen: {STRING} -STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :Määritä kuinka usein puutteellisesti huolletut ajoneuvot voivat hajota +STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :Määritä, kuinka usein puutteellisesti huolletut ajoneuvot voivat hajota STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER :Tukikerroin: {STRING} STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :Määritä kuinka paljon tuetuista yhteyksistä maksetaan STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Rakennuskustannukset: {STRING} @@ -1265,7 +1267,7 @@ STR_CONFIG_SETTING_ORDER_REVIEW_OFF :Ei STR_CONFIG_SETTING_ORDER_REVIEW_EXDEPOT :Kyllä, mutta ei pysäytetyille STR_CONFIG_SETTING_ORDER_REVIEW_ON :Kaikille ajoneuvoille STR_CONFIG_SETTING_WARN_INCOME_LESS :Varoita, jos kulkuneuvon tulos on negatiivinen: {STRING} -STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Mikäli käytössä, uutisviesti lähetetään jos kulkuneuvo ei ole tuottanut rahaa viimeisen kalenterivuoden aikana +STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Mikäli käytössä, uutisviesti lähetetään, jos kulkuneuvo ei ole tuottanut rahaa viimeisen kalenterivuoden aikana STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Ajoneuvot eivät vanhene: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Mikäli käytössä, kaikki kulkuneuvot ovat saatavilla ikuisesti niiden julkistamisen jälkeen STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Uudista ajoneuvo automaattisesti, kun se vanhenee: {STRING} @@ -1280,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} @@ -1337,8 +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_REVERSE_SCROLLING :Käänteinen vierityssuunta: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Käyttäytyminen siirrettäessä näkymää oikealla hiiren näppäimellä. Mikäli pois käytöstä, hiiri liikuttaa kameraa. Mikäli käytössä, hiiri liikuttaa karttaa +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} @@ -1360,18 +1366,18 @@ 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 -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Vasemmalla hiiren painikkeella liikkuminen: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Salli näkymän siirtäminen vetämällä hiiren vasemmalla näppäimellä. Hyödyllinen erityisesti kosketusnäyttöä käytettäessä +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Sulje ikkuna hiiren oikealla painikkeella napsauttamalla: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Ikkunat sulkeutuvat, kun niitä napsautetaan hiiren oikealla painikkeella. Tämä korvaa tavallisesti näkyvän työkaluvihjeen! STR_CONFIG_SETTING_AUTOSAVE :Automaattitallennus: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Valitse aikaväli automaattisille pelitallennuksille @@ -1384,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 @@ -1394,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} @@ -1420,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} @@ -1462,18 +1468,18 @@ STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :Suurin sallittu STR_CONFIG_SETTING_SERVINT_ISPERCENT :Huoltovälit ovat prosentteina: {STRING} STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Määritä, aiheuttaako edellisestä huollosta kulunut aika vai luotettavuuden laskeminen kulkuneuvon huoltamisen -STR_CONFIG_SETTING_SERVINT_TRAINS :Junien huoltoväli oletuksena: {STRING} -STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Määritä oletushuoltoväli uusille junille mikäli kulkuneuvolle ei ole määritelty erillistä huoltoväliä +STR_CONFIG_SETTING_SERVINT_TRAINS :Junien oletushuoltoväli: {STRING} +STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Määritä oletushuoltoväli uusille junille, mikäli kulkuneuvolle ei ole määritelty erillistä huoltoväliä STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}päivä{P 0 "" ä}/% STR_CONFIG_SETTING_SERVINT_DISABLED :Pois käytöstä -STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES :Ajoneuvojen huoltoväli oletuksena: {STRING} -STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES_HELPTEXT :Määritä oletushuoltoväli uusille ajoneuvoille mikäli kulkuneuvolle ei ole määritelty erillistä huoltoväliä -STR_CONFIG_SETTING_SERVINT_AIRCRAFT :Lentokoneiden huoltoväli oletuksena: {STRING} -STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :Määritä oletushuoltoväli uusille lentokoneille mikäli kulkuneuvolle ei ole määritelty erillistä huoltoväliä -STR_CONFIG_SETTING_SERVINT_SHIPS :Laivojen huoltoväli oletuksena: {STRING} -STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :Määritä oletushuoltoväli uusille laivoille mikäli kulkuneuvolle ei ole määritelty erillistä huoltoväliä +STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES :Ajoneuvojen oletushuoltoväli: {STRING} +STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES_HELPTEXT :Määritä oletushuoltoväli uusille ajoneuvoille, mikäli kulkuneuvolle ei ole määritelty erillistä huoltoväliä +STR_CONFIG_SETTING_SERVINT_AIRCRAFT :Lentokoneiden oletushuoltoväli: {STRING} +STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :Määritä oletushuoltoväli uusille lentokoneille, mikäli kulkuneuvolle ei ole määritelty erillistä huoltoväliä +STR_CONFIG_SETTING_SERVINT_SHIPS :Laivojen oletushuoltoväli: {STRING} +STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :Määritä oletushuoltoväli uusille laivoille, mikäli kulkuneuvolle ei ole määritelty erillistä huoltoväliä STR_CONFIG_SETTING_NOSERVICE :Poista huollot käytöstä kun ajoneuvojen rikkoutuminen on poistettu käytöstä: {STRING} -STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Mikäli käytössä, kulkuneuvoja ei huolleta jos ne eivät voi rikkoutua +STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Mikäli käytössä, kulkuneuvoja ei huolleta, jos ne eivät voi rikkoutua STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Ota käyttöön vaunujen nopeusrajoitukset: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Mikäli käytössä, vaunujen nopeusrajoitusta käytetään junan maksiminopeuden määrittämisessä STR_CONFIG_SETTING_DISABLE_ELRAILS :Poista sähköradat käytöstä: {STRING} @@ -1547,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 @@ -1569,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 "" ä} @@ -1598,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} @@ -1761,6 +1767,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Tarkista STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Näytä tekoäly/peliskriptiasetukset STR_INTRO_TOOLTIP_QUIT :{BLACK}Sulje OpenTTD. +STR_INTRO_BASESET :{BLACK}Valitusta perusgrafiikkapaketista puuttuu {NUM} sprite{P "" ä}. Tarkista, onko sille päivityksiä. STR_INTRO_TRANSLATION :{BLACK}Tästä käännöksestä puuttuu {NUM} merkkijono{P "" a}. Auta tekemään OpenTTD:stä parempi rekisteröitymällä kääntäjäksi. Lisätietoja tiedostossa readme.txt. # Quit window @@ -1782,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? @@ -1985,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 @@ -2012,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 @@ -2187,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ä... @@ -2197,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 @@ -2282,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 @@ -2310,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 @@ -2365,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ä @@ -2389,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 @@ -2426,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 @@ -2444,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 @@ -2471,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 @@ -2490,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 @@ -2511,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 @@ -2519,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 @@ -2536,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 @@ -2556,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 @@ -2589,6 +2597,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Lentoken STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Vastaanottaa rahtia: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Raidetyyppi: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Radan nopeusrajoitus: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Tien nopeusrajoitus: {LTBLUE}{VELOCITY} @@ -2601,29 +2610,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Peltoja STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Lumen peittämää maata STR_LAI_CLEAR_DESCRIPTION_DESERT :Aavikkoa -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} suojastusopastimilla -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} tulo-opastimilla -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} poistumisopastimilla -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} yhdistelmäopastimilla -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} reittiopastimilla -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} yksisuuntaisilla reittiopastimilla -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} suojastus- ja tulo-opastimilla -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} suojastus- ja poistumisopastimilla -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} suojastus- ja yhdistelmäopastimilla -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} suojastus- ja reittiopastimilla -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} suojastus- ja yksisuuntaisilla reittiopastimilla -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} tulo- ja poistumisopastimilla -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} tulo- ja yhdistelmäopastimilla -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} tulo- ja reittiopastimilla -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} tulo- ja yksisuuntaisilla reittiopastimilla -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} poistumis- ja yhdistelmäopastimilla -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} poistumis- ja reittiopastimilla -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} poistumis- ja yksisuuntaisilla opastimilla -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} yhdistelmä- ja reittiopastimilla -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} yhdistelmä- ja yksisuuntaisilla opastimilla -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} reitti- ja yksisuuntaisilla opastimilla -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} veturitalli +STR_LAI_RAIL_DESCRIPTION_TRACK :Rautatie +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Rautatie suojastusopastimilla +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Rautatie tulo-opastimilla +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Rautatie poistumisopastimilla +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Rautatie yhdistelmäopastimilla +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Rautatie reittiopastimilla +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Rautatie yksisuuntaisilla reittiopastimilla +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Rautatie suojastus- ja tulo-opastimilla +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Rautatie suojastus- ja poistumisopastimilla +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Rautatie suojastus- ja yhdistelmäopastimilla +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Rautatie suojastus- ja reittiopastimilla +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Rautatie suojastus- ja yksisuuntaisilla reittiopastimilla +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Rautatie tulo- ja poistumisopastimilla +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Rautatie tulo- ja yhdistelmäopastimilla +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Rautatie tulo- ja reittiopastimilla +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Rautatie tulo- ja yksisuuntaisilla reittiopastimilla +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Rautatie poistumis- ja yhdistelmäopastimilla +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Rautatie poistumis- ja reittiopastimilla +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Rautatie poistumis- ja yksisuuntaisilla opastimilla +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Rautatie yhdistelmä- ja reittiopastimilla +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Rautatie yhdistelmä- ja yksisuuntaisilla opastimilla +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Rautatie reitti- ja yksisuuntaisilla opastimilla +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Rautatie veturitalli STR_LAI_ROAD_DESCRIPTION_ROAD :Tie STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Tie katuvaloilla @@ -2687,7 +2696,37 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Yhtiön omistam STR_ABOUT_OPENTTD :{WHITE}Tietoja OpenTTD:stä STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Alkuperäiset oikeudet {COPYRIGHT} 1995 Chris Sawyer, kaikki oikeudet pidätetään STR_ABOUT_VERSION :{BLACK}OpenTTD-versio {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 The OpenTTD team +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 @@ -2711,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 @@ -2719,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ä @@ -2874,11 +2914,11 @@ STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Mene val STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Edelinen sprite STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Jatka edelliseen tavalliseen spriteen ja hyppää yli kaikki pseudo-/uudelleenväritetyt/fontti- spritet ja mene loppuun kun päästään ensimmäiseen STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Valitun spriten näyttö. Sijaintia ei huomioida spriteä piirrettäessä -STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Liikuta spriteä ympäriinsä, muuttaen X- ja Y-sijainteja +STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Liikuta spriteä ympäriinsä, muuttaen X- ja Y-sijainteja. Ctrl+Klik siirtää spriteä kahdeksan yksikköä kerralla STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Nollaa suhteelliset STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Nollaa suhteelliset erotukset -STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X-erotus: {NUM}, Y-erotus: {NUM} (Absoluuttinen) -STR_SPRITE_ALIGNER_OFFSETS_REL :{BLACK}X-erotus: {NUM}, Y-erotus: {NUM} (Suhteellinen) +STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X-erotus: {NUM}, Y-erotus: {NUM} (absoluuttinen) +STR_SPRITE_ALIGNER_OFFSETS_REL :{BLACK}X-erotus: {NUM}, Y-erotus: {NUM} (suhteellinen) STR_SPRITE_ALIGNER_PICKER_BUTTON :{BLACK}Valitse sprite STR_SPRITE_ALIGNER_PICKER_TOOLTIP :{BLACK}Valitse sprite ruudulta @@ -2897,7 +2937,7 @@ STR_NEWGRF_ERROR_INVALID_PARAMETER :Virheellinen pa STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} tulee ladata ennen kuin {STRING} STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} tulee ladata {STRING} jälkeen STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} vaatii OpenTTD:n version {STRING} tai uudemman -STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :GRF-tiedosto jonka se muuntaa +STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :GRF-tiedosto, jonka se muuntaa STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Liian monta NewGRF:ää on ladattu STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :NewGRF:n {1:STRING} lataaminen staattisena NewGRF:nä {STRING}:n kanssa saattaa aiheuttaa nykimistä STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Odottamaton sprite (sprite {3:NUM}) @@ -2906,8 +2946,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Yritys käyttä STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} sisältää korruptoituneen spriten. Kaikki korruptoituneet spritet näkyvät punaisina kysymysmerkkeinä (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Sisältää useita Action 8-merkintöjä (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Luku pseudo-spriten ohi (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Käytössä olevasta perusgrafiikkapaketista puuttuu spritejä.{}Ole hyvä ja päivitä perusgrafiikkapaketti -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Käytössä olevasta perusgrafiikkapaketista puuttuu spritejä.{}Päivitä perusgrafiikkapaketti.{}Koska pelaat {YELLOW}OpenTTD:n kehitysversiota{WHITE}, saatat myös tarvita {YELLOW}kehitysversion perusgrafiikkapaketista{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Pyydetyt GRF-resurssit eivät ole saatavilla (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{2:STRING} poisti käytöstä NewGRF:n {1:STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Virheellinen/tuntematon spriten asettelumuoto (sprite {3:NUM}) @@ -2921,7 +2959,7 @@ STR_NEWGRF_COMPATIBLE_LOADED :{ORANGE}Sopivaa STR_NEWGRF_TOO_MANY_NEWGRFS :{WHITE}Tiedostoa ei voida lisätä: NewGRF-tiedostojen raja saavutettu STR_NEWGRF_COMPATIBLE_LOAD_WARNING :{WHITE}Yhteensopivat GRF:t ladattu puuttuvien tiedostojen korvaamiseksi -STR_NEWGRF_DISABLED_WARNING :{WHITE}Puuttuvat GRF tiedostot ovat poistettu käytöstä +STR_NEWGRF_DISABLED_WARNING :{WHITE}Puuttuvat GRF-tiedostot on poistettu käytöstä STR_NEWGRF_UNPAUSE_WARNING_TITLE :{YELLOW}Puuttuva(t) GRF-tiedosto(t) STR_NEWGRF_UNPAUSE_WARNING :{WHITE}Taukotilasta poistuminen saattaa kaataa OpenTTD:n. Älä lähetä virheraportteja tämänjälkeisistä kaatumisista.{}Haluatko todella poistua taukotilasta? @@ -2975,15 +3013,14 @@ 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 STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (City) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Asukasluku: {ORANGE}{COMMA}{BLACK} Taloja: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Matkustajia viime kuussa: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Postia viime kuussa: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Kaupungin kasvuun tarvittava rahti: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} vaadittu STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} vaaditaan talvella @@ -3031,7 +3068,7 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Rahoita STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Rakenna patsas yhtiösi kunniaksi.{}Kustannus: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Rahoita uusien kaupparakennusten rakentamista kaupungissa.{}Kustannus: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Osta vuoden yksinoikeudet kaupungin liikennöintiin. Paikallisviranomaiset eivät salli muiden yhtiöiden kuljettaa matkustajia ja rahtia.{}Kustannus: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Lahjo viranomaisia lisätäksesi arviotasi; rangaistus voi olla kuitenkin suuri, jos jäät kiinni.{}Kulu: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Lahjo viranomaisia lisätäksesi arviotasi; rangaistus voi olla kuitenkin suuri, jos jäät kiinni.{}Kustannus: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Tavoitteet @@ -3043,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 @@ -3082,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} @@ -3114,8 +3151,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Ottaa va STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Näytä luettelo vastaanotettavasta rahdista. STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Vastaanottaa: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Tällä asemalla on kuljetusyksinoikeus tässä kaupungissa. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} osti tämän kaupungin kuljetusyksinoikeuden. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Tällä asemalla on kuljetusyksinoikeus tässä kaupungissa. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} osti tämän kaupungin kuljetusyksinoikeuden. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Arviot STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Näytä aseman arviot. @@ -3160,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. @@ -3200,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 @@ -3234,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ä @@ -3250,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 @@ -3259,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: @@ -3278,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} @@ -3294,28 +3331,30 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Tarvitse STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Tarvitsee: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Tarvitsee: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} odottamassa{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Käsittelyä odottava rahti: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Tuottaa: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Tuottaa: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ 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. STR_VEHICLE_LIST_SHIP_TOOLTIP :{BLACK}Laivat - napsauta laivaa saadaksesi tietoja. STR_VEHICLE_LIST_AIRCRAFT_TOOLTIP :{BLACK}Lentokoneet - napsauta lentokonetta saadaksesi tietoja. -STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Voittoa tänä vuonna: {CURRENCY_LONG} (viime vuonna: {CURRENCY_LONG}) +STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Tuotto tänä vuonna: {CURRENCY_LONG} (viime vuonna: {CURRENCY_LONG}) STR_VEHICLE_LIST_AVAILABLE_TRAINS :Käytettävissä olevat junat STR_VEHICLE_LIST_AVAILABLE_ROAD_VEHICLES :Käytettävissä olevat ajoneuvot @@ -3333,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ä @@ -3363,6 +3402,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Poista kaikki a STR_GROUP_RENAME_CAPTION :{BLACK}Nimeä ryhmä +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 STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Uusi juna STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Uusi sähköjuna @@ -3394,6 +3438,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Kaikki rahtityy STR_PURCHASE_INFO_ALL_BUT :Kaikki paitsi {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Suurin vetovoima: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Toimintasäde: {GOLD}{COMMA} ruutua +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Lentokonetyyppi: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Junien valintaluettelo. Lisää tietoja junaa napsauttamalla. Ctrl+Klik näyttää tai piilottaa kulkuneuvon tyypin STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Ajoneuvojen valintaluettelo. Napsauta ajoneuvoa saadaksesi lisää tietoja. Ctrl+Klik näyttää tai piilottaa ajoneuvon tyypin @@ -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? @@ -3526,11 +3571,12 @@ STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :yksiraiteisen v STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :maglev-veturin STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Hinta: {CURRENCY_LONG} Paino: {WEIGHT_SHORT}{}Nopeus: {VELOCITY} Teho: {POWER}{}Käyttökustannukset: {CURRENCY_LONG}/vuosi{}Kapasiteetti: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Hinta: {CURRENCY_LONG} Paino: {WEIGHT_SHORT}{}Nopeus: {VELOCITY} Teho: {POWER} Maks. Vetovoima: {6:FORCE}{}Käyttökustannukset: {4:CURRENCY_LONG}/v{}Kapasiteetti: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Hinta: {CURRENCY_LONG} Maks. Nopeus: {VELOCITY}{}Kapasiteetti: {CARGO_LONG}, {CARGO_LONG}{}Käyttökustannukset: {CURRENCY_LONG}/yr -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Hinta: {CURRENCY_LONG} Maks. Nopeus: {VELOCITY}{}Kapasiteetti: {CARGO_LONG}{}Käyttökustannukset: {CURRENCY_LONG}/yr -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Hinta: {CURRENCY_LONG} Suurin nopeus: {VELOCITY} Toimintasäde: {COMMA} ruutua{}Kapasiteetti: {CARGO_LONG}, {CARGO_LONG}{}Käyttökustannukset: {CURRENCY_LONG}/vuosi -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Hinta: {CURRENCY_LONG} Suurin nopeus: {VELOCITY} Toimintasäde: {COMMA} ruutua{}Kapasiteetti: {CARGO_LONG}{}Käyttökustannukset: {CURRENCY_LONG}/vuosi +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Hinta: {CURRENCY_LONG} Paino: {WEIGHT_SHORT}{}Nopeus: {VELOCITY} Teho: {POWER} Maks. vetovoima: {6:FORCE}{}Käyttökustannukset: {4:CURRENCY_LONG}/v{}Kapasiteetti: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Hinta: {CURRENCY_LONG} Maks. nopeus: {VELOCITY}{}Kapasiteetti: {CARGO_LONG}{}Käyttökustannukset: {CURRENCY_LONG}/v +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Hinta: {CURRENCY_LONG} Maks. nopeus: {VELOCITY}{}Lentokonetyyppi: {STRING}{}Kapasiteetti: {CARGO_LONG}, {CARGO_LONG}{}Käyttökustannukset: {CURRENCY_LONG}/v +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Hinta: {CURRENCY_LONG} Maks. nopeus: {VELOCITY}{}Lentokonetyyppi: {STRING}{}Kapasiteetti: {CARGO_LONG}{}Käyttökustannukset: {CURRENCY_LONG}/v +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Hinta: {CURRENCY_LONG} Maks. nopeus: {VELOCITY}{}Lentokonetyyppi: {STRING} Toimintamatka: {COMMA} ruutua{}Kapasiteetti: {CARGO_LONG}, {CARGO_LONG}{}Käyttökustannukset: {CURRENCY_LONG}/v +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Hinta: {CURRENCY_LONG} Maks. nopeus: {VELOCITY}{}Lentokonetyyppi: {STRING} Toimintamatka: {COMMA} ruutua{}Kapasiteetti: {CARGO_LONG}{}Käyttökustannukset: {CURRENCY_LONG}/v # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Korvaa {STRING} - {STRING} @@ -3557,10 +3603,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} kun va STR_REPLACE_VEHICLES_STOP :{BLACK}Lopeta ajoneuvojen korv. STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Napsauta pysäyttääksesi vasemmalta valitun veturityypin korvauksen. -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Korvataan: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Vaihda toiseen korvausikkunaan STR_REPLACE_ENGINES :Veturit STR_REPLACE_WAGONS :Vaunut +STR_REPLACE_ALL_RAILTYPE :Kaikki junat STR_REPLACE_HELP_RAILTYPE :{BLACK}Valitse rautatietyyppi, jolle veturikorvaukset tehdään. STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Näyttää, millä vasemmalta valittu veturi korvataan, jos millään. @@ -3585,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. @@ -3653,7 +3699,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} vuo{P s STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} vuo{P si tta} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Huippunopeus: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Suurin nopeus: {LTBLUE}{VELOCITY} {BLACK}Toimintasäde: {LTBLUE}{COMMA} ruutua +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Maks. nopeus: {LTBLUE}{VELOCITY} {BLACK}Lentokonetyyppi: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Maks. nopeus: {LTBLUE}{VELOCITY} {BLACK}Lentokonetyyppi: {LTBLUE}{STRING} {BLACK}Toimintamatka: {LTBLUE}{COMMA} ruutua STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Paino: {LTBLUE}{WEIGHT_SHORT} {BLACK}Teho: {LTBLUE}{POWER}{BLACK} Maks. nopeus: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Paino: {LTBLUE}{WEIGHT_SHORT} {BLACK}Teho: {LTBLUE}{POWER}{BLACK} Maks. nopeus: {LTBLUE}{VELOCITY} {BLACK}Maks. T.E.: {LTBLUE}{FORCE} @@ -3713,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 @@ -3743,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 @@ -3815,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 @@ -3824,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} @@ -3890,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) @@ -3905,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} @@ -3962,12 +4009,12 @@ STR_AI_DEBUG_SETTINGS :{BLACK}Asetukse STR_AI_DEBUG_SETTINGS_TOOLTIP :{BLACK}Muuta skriptin asetuksia STR_AI_DEBUG_RELOAD :{BLACK}Lataa tekoäly uudelleen STR_AI_DEBUG_RELOAD_TOOLTIP :{BLACK}Lopeta tekoäly, lataa skripti uudelleen ja käynnistä tekoäly uudelleen -STR_AI_DEBUG_BREAK_STR_ON_OFF_TOOLTIP :{BLACK}Pysäytetäänkö tekoäly kun tekoälyn lokiviesti on sama kuin pysäytysmerkkijono +STR_AI_DEBUG_BREAK_STR_ON_OFF_TOOLTIP :{BLACK}Pysäytetäänkö tekoäly, kun tekoälyn lokiviesti on sama kuin pysäytysmerkkijono STR_AI_DEBUG_BREAK_ON_LABEL :{BLACK}Pysäytä kun: -STR_AI_DEBUG_BREAK_STR_OSKTITLE :{BLACK}Pysäytä kun +STR_AI_DEBUG_BREAK_STR_OSKTITLE :{BLACK}Pysäytä, kun STR_AI_DEBUG_BREAK_STR_TOOLTIP :{BLACK}Kun tekoälyn lokiviesti täsmää tämän merkkijonon kanssa, peli pysäytetään STR_AI_DEBUG_MATCH_CASE :{BLACK}Kirjainkoon täsmäys -STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}Kytke kirjainkoon täsmäys kun verrataan tekoälyn viestejä pysäytysmerkkijonoon +STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}Kytke kirjainkoon täsmäys, kun verrataan tekoälyn viestejä pysäytysmerkkijonoon STR_AI_DEBUG_CONTINUE :{BLACK}Jatka STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}Jatka tekoälyn suorittamista STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}Näytä tämän tekoälyn virheenkorjaustiedot @@ -4212,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. @@ -4220,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... @@ -4248,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ä! @@ -4261,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 @@ -4471,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 @@ -4844,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 8ecc2db4ed..b7729e5067 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -167,7 +167,7 @@ STR_ABBREV_ALL :{TINY_FONT}ALL # 'Mode' of transport for cargoes STR_PASSENGERS :{COMMA}{NBSP}passager{P "" s} -STR_BAGS :{COMMA}{NBSP}sac{P "" s} +STR_BAGS :{COMMA}{NBSP}sac{P 0 "" s} STR_TONS :{COMMA}{NBSP}tonne{P "" s} STR_LITERS :{COMMA}{NBSP}litre{P "" s} STR_ITEMS :{COMMA}{NBSP}unité{P "" s} @@ -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 @@ -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}Aucune musique disponible STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}" STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Piste STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Titre @@ -664,21 +666,21 @@ STR_MUSIC_TOOLTIP_DRAG_SLIDERS_TO_SET_MUSIC :{BLACK}Faire gl STR_MUSIC_TOOLTIP_SELECT_ALL_TRACKS_PROGRAM :{BLACK}Choisir le programme «{NBSP}Tout{NBSP}» STR_MUSIC_TOOLTIP_SELECT_OLD_STYLE_MUSIC :{BLACK}Choisir le programme musical «{NBSP}Ancien style{NBSP}» STR_MUSIC_TOOLTIP_SELECT_NEW_STYLE_MUSIC :{BLACK}Choisir le programme musical «{NBSP}Nouveau style{NBSP}» -STR_MUSIC_TOOLTIP_SELECT_EZY_STREET_STYLE :{BLACK}Sélectionner le programme musical «{NBSP}Ezy Street{NBSP}» +STR_MUSIC_TOOLTIP_SELECT_EZY_STREET_STYLE :{BLACK}Choisir le programme musical «{NBSP}Ezy Street{NBSP}» STR_MUSIC_TOOLTIP_SELECT_CUSTOM_1_USER_DEFINED :{BLACK}Choisir le programme personnalisé «{NBSP}Personnalisé 1{NBSP}» STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Choisir le programme personnalisé «{NBSP}Personnalisé 2{NBSP}» STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Activer/Désactiver le mode aléatoire STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Afficher la fenêtre de sélection de pistes -STR_ERROR_NO_SONGS :{WHITE}Un ensemble de musique vide a été choisi. Aucune musique ne sera jouée. - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Sélection du programme musical -STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" +STR_PLAYLIST_MUSIC_SELECTION_SETNAME :{WHITE}Programme musical - «{NBSP}{STRING}{NBSP}» +STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} «{NBSP}{STRING}{NBSP}» STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Index des pistes -STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Programme - '{STRING}' +STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Programme - «{NBSP}{STRING}{NBSP}» STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Effacer +STR_PLAYLIST_CHANGE_SET :{BLACK}Changer d'ensemble STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Effacer le programme actuel (Personnalisé 1 ou Personnalisé 2 seulement) +STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Choisir un autre ensemble de musique STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Cliquer sur une piste pour l'ajouter au programme courant (Personnalisé 1 ou Personnalisé 2 seulement) STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Cliquer sur une piste pour la retirer du programme courant (Personnalisé 1 ou Personnalisé 2 seulement) @@ -815,8 +817,8 @@ STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDE STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}{STRING} a sponsorisé la construction de la nouvelle ville {TOWN}{NBSP}! -STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLACK}Un{G "" "" e} nouv{G eau el elle} {STRING} en construction près de {TOWN}{NBSP}! -STR_NEWS_INDUSTRY_PLANTED :{BIG_FONT}{BLACK}Un{G "" "" e} nouv{G eau el elle} {STRING} s'implante près de {TOWN}{NBSP}! +STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLACK}Un{G 0 "" "" e} nouv{G 0 eau el elle} {STRING} en construction près de {TOWN}{NBSP}! +STR_NEWS_INDUSTRY_PLANTED :{BIG_FONT}{BLACK}Un{G 0 "" "" e} nouv{G 0 eau el elle} {STRING} s'implante près de {TOWN}{NBSP}! STR_NEWS_INDUSTRY_CLOSURE_GENERAL :{BIG_FONT}{BLACK}{STRING} annonce une fermeture imminente{NBSP}! STR_NEWS_INDUSTRY_CLOSURE_SUPPLY_PROBLEMS :{BIG_FONT}{BLACK}Des problèmes d'approvisionnement obligent {STRING} à fermer bientôt{NBSP}! @@ -858,9 +860,9 @@ STR_NEWS_AIRCRAFT_DEST_TOO_FAR :{WHITE}{VEHICLE STR_NEWS_ORDER_REFIT_FAILED :{WHITE}L'échec du réaménagement a stoppé {VEHICLE} STR_NEWS_VEHICLE_AUTORENEW_FAILED :{WHITE}Le renouvellement automatique de {VEHICLE} a échoué{}{STRING} -STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLACK}Nouv{G eau el elle} {STRING} disponible{NBSP}! +STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLACK}Nouv{G 0 eau el elle} {STRING} disponible{NBSP}! STR_NEWS_NEW_VEHICLE_TYPE :{BIG_FONT}{BLACK}{ENGINE} -STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}Nouv{G eau el elle} {STRING} disponible{NBSP}! - {ENGINE} +STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}Nouv{G 0 eau el elle} {STRING} disponible{NBSP}! - {ENGINE} STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO :{WHITE}{STATION} n'accepte plus {STRING} STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_OR_CARGO :{WHITE}{STATION} n'accepte plus {STRING} ou {STRING} @@ -881,10 +883,10 @@ STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLAC # Extra view window STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Vue {COMMA} -STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Copier vers la vue -STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Copier l'emplacement de la vue principale vers cette vue-ci -STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Coller depuis la vue -STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Coller l'emplacement de cette vue-ci vers la vue principale +STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Modifier cette vue +STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Copier l'emplacement de la vue principale vers cette vue +STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Modifier la vue principale +STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Copier l'emplacement de cette vue vers la vue principale # Game options window STR_GAME_OPTIONS_CAPTION :{WHITE}Options @@ -926,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 @@ -1215,8 +1218,8 @@ STR_CONFIG_SETTING_SIGNALSIDE_RIGHT :à droite de la STR_CONFIG_SETTING_SHOWFINANCES :Afficher le bilan financier en fin d'année{NBSP}: {STRING} STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :Si activé, le bilan financier sera affiché à la fin de chaque année pour permettre un contrôle rapide de l'état de la compagnie. STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Les nouveaux ordres sont « sans arrêt » par défaut{NBSP}: {STRING} -STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normalement, un véhicule s'arrête dans chaque station qu'il traverse. En activant ce paramètre, il traversera toutes les stations sur le chemin de sa destination finale sans s'arrêter. Noter que ce paramètre défini uniquement une valeur par défaut pour les nouveaux ordres. Les ordres peuvent par ailleurs être réglés individuellement avec un autre comportement -STR_CONFIG_SETTING_STOP_LOCATION :Les nouveaux ordres arrêtent les trains {G 0:2 au au "à la"} {STRING} du quai par défaut +STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normalement, un véhicule s'arrête dans chaque station qu'il traverse. En activant ce paramètre, il traversera toutes les stations sur le chemin de sa destination finale sans s'arrêter. Noter que ce paramètre définit uniquement une valeur par défaut pour les nouveaux ordres. Les ordres peuvent par après être réglés individuellement avec un autre comportement +STR_CONFIG_SETTING_STOP_LOCATION :Les nouveaux ordres arrêtent les trains {G 0 au au "à la"} {STRING} du quai par défaut STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Endroit du quai où un train s'arrête par défaut. "queue" signifie proche du point d'entrée. "milieu" signifie au milieu du quai. "tête" signifie à l'opposé du point d'entrée. Noter que ce paramètre défini uniquement une valeur par défaut pour les nouveaux ordres. Les ordres peuvent par ailleurs être réglés individuellement avec un autre comportement STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :{G=f}queue STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :{G=m}milieu @@ -1338,8 +1341,12 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Couleur du terr STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Vert STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Vert foncé STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violet -STR_CONFIG_SETTING_REVERSE_SCROLLING :Inverser la direction lors du défilement avec la souris{NBSP}: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Comportement lors du défilement de la carte avec le bouton droit de la souris. Quand il est désactivé, la souris déplace la caméra. Quand il est activé, la souris déplace la carte +STR_CONFIG_SETTING_SCROLLMODE :Défilement de la vue{NBSP}: {STRING} +STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Comportement lors du défilement de la carte +STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Défilement de la vue par clic droit, position de la souris verrouillée +STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Défilement de la carte par clic droit, position de la souris verrouillée +STR_CONFIG_SETTING_SCROLLMODE_RMB :Défilement de la carte par clic droit +STR_CONFIG_SETTING_SCROLLMODE_LMB :Défilement de la carte par clic gauche STR_CONFIG_SETTING_SMOOTH_SCROLLING :Défilement régulier de la vue{NBSP}: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Contrôle comment la vue principale défile jusqu'à une position spécifique lors d'un clic sur la mini-carte ou pour atteindre un objet précis sur la carte. Si activé, la vue défile doucement, si désactivé elle saute directement à la cible STR_CONFIG_SETTING_MEASURE_TOOLTIP :Montrer une infobulle de mesure lors de l'utilisation de divers outils de construction{NBSP}: {STRING} @@ -1371,8 +1378,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Commande-clic STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl-clic STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Désactivé -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Défilement par clic gauche{NBSP}: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Active le défilement de la carte en la glissant avec le bouton gauche de la souris. C'est surtout utile pour les écrans tactiles +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Fermer une fenêtre en cliquant droit{NBSP}: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Fermer une fenêtre en cliquant droit à l’intérieur de celle-ci. Désactive l'infobulle sur clic droit{NBSP}! STR_CONFIG_SETTING_AUTOSAVE :Sauvegarde automatique{NBSP}: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Sélectionner l'intervalle de temps entre les sauvegardes automatiques @@ -1407,7 +1414,7 @@ STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :Premier disponi STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_LAST :Dernier disponible STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_MOST_USED :Le plus utilisé STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION :Afficher les réservations de chemin sur les voies{NBSP}: {STRING} -STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT :Donne une couleur différente aux voies réservées pour aider à résoudre les problèmes de trains refusant d'entrer dans des blocs basés sur le chemin +STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT :Donne une couleur différente aux voies réservées afin d'aider à résoudre les problèmes de trains refusant de s'engager dans des tronçons encadrés par des signaux de passage STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Conserver les outils de construction actifs après usage{NBSP}: {STRING} STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT :Garde les outils de construction de ponts, tunnels, etc. ouverts après usage STR_CONFIG_SETTING_EXPENSES_LAYOUT :Regrouper les dépenses dans la fenêtre des finances{NBSP}: {STRING} @@ -1464,15 +1471,15 @@ STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :Nombre maximum STR_CONFIG_SETTING_SERVINT_ISPERCENT :Les intervalles de service sont en pourcentage{NBSP}: {STRING} STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Choisir si l'entretien des véhicule est activé par le temps passé depuis le dernier entretien ou par la fiabilité passant sous un pourcentage de la fiabilité maximum STR_CONFIG_SETTING_SERVINT_TRAINS :Intervalle d'entretien par défaut pour les trains{NBSP}: {STRING} -STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Défini l'intervalle d'entretien par défaut des nouveaux véhicules ferroviaires, si aucun intervalle d'entretien n'est définit pour le véhicule +STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Définit l'intervalle d'entretien par défaut des nouveaux véhicules ferroviaires, si aucun intervalle d'entretien n'est défini pour le véhicule STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}jour{P 0 "" s}/% STR_CONFIG_SETTING_SERVINT_DISABLED :Désactivé STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES :Intervalle d'entretien par défaut pour les véhicules routiers{NBSP}: {STRING} -STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES_HELPTEXT :Défini l'intervalle d'entretien par défaut des nouveaux véhicules routiers, si aucun intervalle d'entretien n'est définit pour le véhicule +STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES_HELPTEXT :Définit l'intervalle d'entretien par défaut des nouveaux véhicules routiers, si aucun intervalle d'entretien n'est défini pour le véhicule STR_CONFIG_SETTING_SERVINT_AIRCRAFT :Intervalle d'entretien par défaut pour les aéronefs{NBSP}: {STRING} -STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :Défini l'intervalle d'entretien par défaut des nouveaux aéronefs, si aucun intervalle d'entretien n'est définit pour le véhicule +STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :Définit l'intervalle d'entretien par défaut des nouveaux aéronefs, si aucun intervalle d'entretien n'est défini pour le véhicule STR_CONFIG_SETTING_SERVINT_SHIPS :Intervalle d'entretien par défaut pour les navires{NBSP}: {STRING} -STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :Défini l'intervalle d'entretien par défaut des nouveaux navires, si aucun intervalle d'entretien n'est définit pour le véhicule +STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :Définit l'intervalle d'entretien par défaut des nouveaux navires, si aucun intervalle d'entretien n'est défini pour le véhicule STR_CONFIG_SETTING_NOSERVICE :Désactiver l'entretien quand les pannes sont inactives{NBSP}: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Lorsqu'il est activé, les véhicules ne sont pas entretenus s'ils ne peuvent pas tomber en panne STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Activer la vitesse limite des wagons{NBSP}: {STRING} @@ -1762,6 +1769,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Vérifie STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Afficher la configuration des scripts STR_INTRO_TOOLTIP_QUIT :{BLACK}Quitter OpenTTD +STR_INTRO_BASESET :{BLACK}{NUM} sprite{P "" s} manque{P "" "nt"} dans les graphiques de base actuellement sélectionnés. Veuillez vérifier les mises à jours pour les graphiques de base. STR_INTRO_TRANSLATION :{BLACK}Il manque {NUM} chaîne{P "" s} dans cette traduction. Merci d'aider à améliorer OpenTTD en vous inscrivant comme traducteur. Voir readme.txt pour les détails. # Quit window @@ -2221,7 +2229,7 @@ STR_CONTENT_DETAIL_SUBTITLE_SELECTED :{SILVER}Pré-s STR_CONTENT_DETAIL_SUBTITLE_AUTOSELECTED :{SILVER}Cette dépendance a été sélectionnée pour être téléchargée STR_CONTENT_DETAIL_SUBTITLE_ALREADY_HERE :{SILVER}Vous avez déjà ceci STR_CONTENT_DETAIL_SUBTITLE_DOES_NOT_EXIST :{SILVER}Ce module est inconnu et ne peut pas être téléchargé dans OpenTTD -STR_CONTENT_DETAIL_UPDATE :{SILVER}Ceci est un remplacement pour {G "un" "des" "une"} {STRING} existant{G 0 "" "s" "e"} +STR_CONTENT_DETAIL_UPDATE :{SILVER}Ceci est un remplacement pour {G 0 "un" "des" "une"} {STRING} existant{G 0 "" "s" "e"} STR_CONTENT_DETAIL_NAME :{SILVER}Nom{NBSP}: {WHITE}{STRING} STR_CONTENT_DETAIL_VERSION :{SILVER}Version{NBSP}: {WHITE}{STRING} STR_CONTENT_DETAIL_DESCRIPTION :{SILVER}Description{NBSP}: {WHITE}{STRING} @@ -2283,6 +2291,7 @@ STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Légende STR_LINKGRAPH_LEGEND_ALL :{BLACK}Toute STR_LINKGRAPH_LEGEND_NONE :{BLACK}Aucune STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Choisir les compagnies à afficher +STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY} # Linkgraph legend window and linkgraph legend in smallmap STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}inutilisé @@ -2322,7 +2331,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Construi STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Alterner entre construire et retirer des voies, des signaux, des points de contrôle et des gares.{}Ctrl pour retirer également la voie lors du retrait des points de contrôle et des gares. STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Convertir/Améliorer le type de rail.{}Shift pour afficher seulement le coût estimé. -STR_RAIL_NAME_RAILROAD :Voie ferrée simple +STR_RAIL_NAME_RAILROAD :Voie ferrée STR_RAIL_NAME_ELRAIL :Voie ferrée électrifiée STR_RAIL_NAME_MONORAIL :Monorail STR_RAIL_NAME_MAGLEV :Maglev @@ -2590,6 +2599,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Nom de l STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF{NBSP}: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Cargaison acceptée{NBSP}: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Type de rail{NBSP}: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Vitesse limite de la voie{NBSP}: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Vitesse limite de la route{NBSP}: {LTBLUE}{VELOCITY} @@ -2602,29 +2612,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Champs STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Terre enneigée STR_LAI_CLEAR_DESCRIPTION_DESERT :Désert -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING}{NBSP} -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} avec signaux de bloc -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} avec pré-signaux -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} avec signaux de sortie -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} avec signaux combinés -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} avec signaux de chemin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} avec signaux de chemin à sens unique -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} avec signal de bloc et pré-signaux -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} avec signal de bloc et signaux de sortie -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} avec signal de bloc et signaux combinés -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} avec signaux de bloc et de chemin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} avec signaux de bloc et de chemin à sens unique -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} avec pré-signal et signal de sortie -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} avec pré-signal et signal combiné -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} avec pré-signal et signal de chemin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} avec pré-signal et signal de chemin à sens unique -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} avec signal de sortie et signal combiné -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} avec signal de sortie et signal de chemin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} avec signal de sortie et signal de chemin à sens unique -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} avec signal combiné et signal de chemin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} avec signal combiné et signal de chemin à sens unique -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} avec signal de chemin et signal de chemin à sens unique -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Dépôt de trains de {STRING} +STR_LAI_RAIL_DESCRIPTION_TRACK :Voie ferrée +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Voie ferrée avec signaux de bloc +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Voie ferrée avec pré-signaux +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Voie ferrée avec signaux de sortie +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Voie ferrée avec signaux combinés +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Voie ferrée avec signaux de chemin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Voie ferrée avec signaux de chemin à sens unique +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Voie ferrée avec signal de bloc et pré-signaux +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Voie ferrée avec signal de bloc et signaux de sortie +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Voie ferrée avec signal de bloc et signaux combinés +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Voie ferrée avec signaux de bloc et de chemin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Voie ferrée avec signaux de bloc et de chemin à sens unique +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Voie ferrée avec pré-signal et signal de sortie +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Voie ferrée avec pré-signal et signal combiné +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Voie ferrée avec pré-signal et signal de chemin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Voie ferrée avec pré-signal et signal de chemin à sens unique +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Voie ferrée avec signal de sortie et signal combiné +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Voie ferrée avec signal de sortie et signal de chemin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Voie ferrée avec signal de sortie et signal de chemin à sens unique +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Voie ferrée avec signal combiné et signal de chemin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Voie ferrée avec signal combiné et signal de chemin à sens unique +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Voie ferrée avec signal de chemin et signal de chemin à sens unique +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Dépôt ferroviaire STR_LAI_ROAD_DESCRIPTION_ROAD :Route STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Route avec lampadaires @@ -2688,7 +2698,57 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Terrain apparte STR_ABOUT_OPENTTD :{WHITE}À propos de OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyright original {COPYRIGHT} 1995 Chris Sawyer, Tous droits réservés STR_ABOUT_VERSION :{BLACK}OpenTTD version {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 L'équipe OpenTTD +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 @@ -2907,8 +2967,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Tentative d'uti STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} contient un sprite corrompu. Tous les sprites corrompus seront remplacés par un point d'interrogation rouge (?). STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Présence multiple de l'Action 8 (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Lecture après la fin des pseudo-sprite (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Il manque certains sprites dans les graphiques de base actuellement utilisés.{}Veuillez mettre à jour les graphiques de base. -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Il manque un certain nombre de sprites dans les graphiques de base actuellement utilisés.{}Veuillez mettre à jour les graphiques de base.{}Comme vous jouez avec une {YELLOW}version de développement d'OpenTTD{WHITE}, vous devriez utiliser une {YELLOW}version de développement des graphiques de base{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Indisponibilité de la ressource demandée (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} a été désactivé par {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Format de sprite invalide ou inconnu (sprite {3:NUM}) @@ -2976,6 +3034,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Entrer u STR_TOWN_DIRECTORY_CAPTION :{WHITE}Villes STR_TOWN_DIRECTORY_NONE :{ORANGE}− Aucune − STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Métropole){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Noms des villes - Cliquer sur un nom pour centrer la vue principale sur la ville. Ctrl-clic pour ouvrir une nouvelle vue sur la ville. STR_TOWN_POPULATION :{BLACK}Population mondiale{NBSP}: {COMMA} @@ -2983,8 +3042,7 @@ STR_TOWN_POPULATION :{BLACK}Populati STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Métropole) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Population{NBSP}: {ORANGE}{COMMA}{BLACK} − Maisons{NBSP}: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Passagers le mois dernier{NBSP}: {ORANGE}{COMMA}{BLACK} − max.{NBSP}: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Courrier le mois dernier{NBSP}: {ORANGE}{COMMA}{BLACK} − max.{NBSP}: {ORANGE}{COMMA} +STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} le mois dernier{NBSP}: {ORANGE}{COMMA}{BLACK} - max.{NBSP}: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Cargaison nécessaire à la croissance de la ville{NBSP}: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} requis STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} requis en hiver @@ -3115,8 +3173,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Accepte STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Afficher les marchandises acceptées STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Accepte{NBSP}: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Cette station a les droits de transport exclusifs dans cette ville. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} a acheté les droits de transport exclusifs dans cette ville. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Cette station a les droits de transport exclusifs dans cette ville. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} a acheté les droits de transport exclusifs dans cette ville. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Qualité STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Afficher la qualité de service de la station @@ -3295,9 +3353,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Nécessi STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Nécessite{NBSP}: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Nécessite{NBSP}: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}{NBSP}: {CARGO_SHORT} en attente{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Marchandise en attente d'être utilisée{NBSP}: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produit{NBSP}: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Produit{NBSP}: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3364,6 +3424,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Retirer tous le STR_GROUP_RENAME_CAPTION :{BLACK}Renommer un groupe +STR_GROUP_PROFIT_THIS_YEAR :Profit cette année{NBSP}: +STR_GROUP_PROFIT_LAST_YEAR :Profit l'année précédente{NBSP}: +STR_GROUP_OCCUPANCY :Utilisation actuelle{NBSP}: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nouveaux véhicules ferroviaires STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nouveaux véhicules ferroviaires électriques @@ -3395,6 +3460,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Tous les types STR_PURCHASE_INFO_ALL_BUT :Tous sauf {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Effort de traction max.{NBSP}: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Rayon d'action{NBSP}: {GOLD}{COMMA}{NBSP}cases +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Type d'aéronef{NBSP}: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Choix du véhicule. Cliquer sur un véhicule pour obtenir des informations. Ctrl-clic pour basculer le masquage du type de véhicule STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Choix du véhicule routier. Cliquer sur un véhicule pour obtenir des informations. Ctrl-clic pour basculer le masquage du type de véhicule @@ -3528,10 +3594,11 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :{G=f}locomotive STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Prix{NBSP}: {CURRENCY_LONG} − Poids{NBSP}: {WEIGHT_SHORT}{}Vitesse{NBSP}: {VELOCITY} − Puissance{NBSP}: {POWER}{}Coûts d'entretien{NBSP}: {CURRENCY_LONG}/an{}Capacité{NBSP}: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Prix{NBSP}: {CURRENCY_LONG} − Poids{NBSP}: {WEIGHT_SHORT}{}Vitesse{NBSP}: {VELOCITY} − Puissance{NBSP}: {POWER}{}Effort de traction max.{NBSP}: {6:FORCE}{}Coûts d'entretien{NBSP}: {4:CURRENCY_LONG}/an{}Capacité{NBSP}: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Prix{NBSP}: {CURRENCY_LONG} − Vitesse max.{NBSP}: {VELOCITY}{}Capacité{NBSP}: {CARGO_LONG}, {CARGO_LONG}{}Coûts d'entretien{NBSP}: {CURRENCY_LONG}/an -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Prix{NBSP}: {CURRENCY_LONG} − Vitesse max.{NBSP}: {VELOCITY}{}Capacité{NBSP}: {CARGO_LONG}{}Coûts d'entretien{NBSP}: {CURRENCY_LONG}/an -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Coût{NBSP}: {CURRENCY_LONG} − Vitesse max.{NBSP}: {VELOCITY} − Rayon d'action{NBSP}: {COMMA} cases{}Capacité{NBSP}: {CARGO_LONG}, {CARGO_LONG}{}Coûts d'entretien{NBSP}: {CURRENCY_LONG}/an -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Coût{NBSP}: {CURRENCY_LONG} − Vitesse max.{NBSP}: {VELOCITY} − Rayon d'action{NBSP}: {COMMA} cases{}Capacité{NBSP}: {CARGO_LONG}{}Coûts d'entretien{NBSP}: {CURRENCY_LONG}/an +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Prix{NBSP}: {CURRENCY_LONG} − Vitesse max.{NBSP}: {VELOCITY}{}Capacité{NBSP}: {CARGO_LONG}{}Coûts d'entretien{NBSP}: {CURRENCY_LONG}/an +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Prix{NBSP}: {CURRENCY_LONG} - Vitesse max.{NBSP}: {VELOCITY}{}Type d'aéronef{NBSP}: {STRING}{}Capacité{NBSP}: {CARGO_LONG}, {CARGO_LONG}{}Coûts d'entretien{NBSP}: {CURRENCY_LONG}/an +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Prix{NBSP}: {CURRENCY_LONG} - Vitesse max.{NBSP}: {VELOCITY}{}Type d'aéronef{NBSP}: {STRING}{}Capacité{NBSP}: {CARGO_LONG}{}Coûts d'entretien{NBSP}: {CURRENCY_LONG}/an +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Prix{NBSP}: {CURRENCY_LONG} - Vitesse max.{NBSP}: {VELOCITY}{}Type d'aéronef{NBSP}: {STRING} - Rayon d'action{NBSP}: {COMMA} cases{}Capacité{NBSP}: {CARGO_LONG}, {CARGO_LONG}{}Coûts d'entretien{NBSP}: {CURRENCY_LONG}/an +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Prix{NBSP}: {CURRENCY_LONG} - Vitesse max.{NBSP}: {VELOCITY}{}Type d'aéronef{NBSP}: {STRING} - Rayon d'action{NBSP}: {COMMA} cases{}Capacité{NBSP}: {CARGO_LONG}{}Coûts d'entretien{NBSP}: {CURRENCY_LONG}/an # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Remplacer {STRING} - {STRING} @@ -3558,10 +3625,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} si vie STR_REPLACE_VEHICLES_STOP :{BLACK}Stopper le remplacement STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Appuyer sur ce bouton pour arrêter le remplacement du type de véhicule sélectionné à gauche -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}En remplacement{NBSP}: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Alterner entre les fenêtres de remplacement des locomotives ou des wagons STR_REPLACE_ENGINES :Locomotives STR_REPLACE_WAGONS :Wagons +STR_REPLACE_ALL_RAILTYPE :Tous le véhicules sur rail STR_REPLACE_HELP_RAILTYPE :{BLACK}Choisir un type de rail pour le remplacement de locomotives STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Ceci affiche par quel type de véhicule sera remplacé celui sélectionné à gauche, si possible @@ -3654,7 +3721,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} an{P "" STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} an{P "" nées} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Vitesse max.{NBSP}: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Vitesse max.{NBSP}: {LTBLUE}{VELOCITY}{BLACK} − Rayon d'action{NBSP}: {LTBLUE}{COMMA} cases +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Vitesse max.{NBSP}: {LTBLUE}{VELOCITY}{BLACK} - Type d'aéronef{NBSP}: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Vitesse max.{NBSP}: {LTBLUE}{VELOCITY}{BLACK} - Type d'aéronef{NBSP}: {LTBLUE}{STRING}{BLACK} - Rayon d'action{NBSP}: {LTBLUE}{COMMA} cases STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Poids{NBSP}: {LTBLUE}{NBSP}{WEIGHT_SHORT} − {BLACK}Puissance{NBSP}: {LTBLUE}{NBSP}{POWER}{BLACK} − Vitesse max.{NBSP}: {LTBLUE}{NBSP}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Poids{NBSP}: {LTBLUE}{WEIGHT_SHORT}{BLACK} − Puissance{NBSP}: {LTBLUE}{POWER}{BLACK} − Vitesse max.{NBSP}: {LTBLUE}{VELOCITY}{BLACK} − E.T. max.{NBSP}: {LTBLUE}{FORCE} @@ -4213,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... @@ -4221,6 +4288,7 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... cett STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... mauvaise orientation de la route STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... les arrêts ne peuvent pas avoir de virages STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... les arrêts ne peuvent pas avoir de jonctions +STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... la route est à sens unique ou bloquée # Station destruction related errors STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Impossible de supprimer une partie de la gare... @@ -4472,6 +4540,8 @@ STR_BASESOUNDS_DOS_DESCRIPTION :Sons originaux STR_BASESOUNDS_WIN_DESCRIPTION :Sons originaux de Transport Tycoon Deluxe (version Windows). STR_BASESOUNDS_NONE_DESCRIPTION :Un pack de sons sans sons. STR_BASEMUSIC_WIN_DESCRIPTION :Musiques originales de Transport Tycoon Deluxe (version Windows). +STR_BASEMUSIC_DOS_DESCRIPTION :Musiques originales de Transport Tycoon Deluxe (version DOS). +STR_BASEMUSIC_TTO_DESCRIPTION :Musiques originales de Transport Tycoon (version Originale/World Editor). STR_BASEMUSIC_NONE_DESCRIPTION :Un pack de musiques sans musiques. ##id 0x2000 diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt index ce342c7c60..139d775cd3 100644 --- a/src/lang/gaelic.txt +++ b/src/lang/gaelic.txt @@ -868,10 +868,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Tagh am STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Toglaich prògram air thuaiream air/dheth STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Seall uinneag taghadh tracaichean ciùil -STR_ERROR_NO_SONGS :{WHITE}Chaidh seata dhe cheòl às aonais òrain a thaghadh. Cha tèid òran sam bith a chluiche - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Taghadh prògram ciùil STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} “{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Clàr-amais nan traca STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Prògram - “{STRING}" @@ -1232,7 +1229,7 @@ STR_CURRENCY_PREVIEW :{LTBLUE}Ro-shea STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 not (£) san airgeadra agad STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Atharraich paramadair an airgeadra ghnàthaichte -STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Àireamh as motha dhe dh'fharpaisichean: {ORANGE}{COMMA} +STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Àireamh as motha dhe cho-fharpaisich: {ORANGE}{COMMA} STR_NONE :Chan eil gin STR_FUNDING_ONLY :Le maoineachadh a-mhàin @@ -1431,7 +1428,7 @@ STR_CONFIG_SETTING_AUTOSCROLL_EVERY_VIEWPORT :Na h-uile port- STR_CONFIG_SETTING_BRIBE :Ceadaich brìbeadh an ùghdarrais ionadail: {STRING} STR_CONFIG_SETTING_BRIBE_HELPTEXT :Faodaidh companaidhean feuchainn ri ùghdarras ionadail a' bhaile a bhrìbeadh. Ma mhothaicheas neach-sgrùdaidh am brìbeadh, chan fhaod a' chompanaidh dad a dhèanamh tuilleadh sa bhaile fad sia mìosan STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Ceadaich ceannach aig còirichean giùlain às-dùnach: {STRING} -STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Ma cheannaicheas companaidh còirichean giùlain às-dùnach airson baile, chan fhaigh stèiseanan (taistealaich no carago) nan co-fharpaisichean carago sam bith fad bliadhna +STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Ma cheannaicheas companaidh còirichean giùlain às-dùnach airson baile, chan fhaigh stèiseanan (taistealaich no carago) nan co-fharpaiseach carago sam bith fad bliadhna STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Ceadaich maoineachadh thogalaichean: {STRING} STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :Faodaidh companaidhean airgead a thoirt dha bhailtean ach an tog iad taighean ùra STR_CONFIG_SETTING_ALLOW_FUND_ROAD :Ceadaich maoineachadh ath-thogail rathaidean ionadail: {STRING} @@ -1539,8 +1536,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Dath na crutha- STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Uaine STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Dorch-uaine STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Purpaidh -STR_CONFIG_SETTING_REVERSE_SCROLLING :Comhair sgrolaidh chontrarra: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Giùlan nuair a thèid am mapa a sgroladh le putan deas na luchaige. Nuair a bhios seo air, gluaisidh an luchag am mapa STR_CONFIG_SETTING_SMOOTH_SCROLLING :Sgroladh mìn nam port-seallaidh: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Tagh mar a ghluaiseas am prìomh-shealladh gu ionad sònraichte. Ma tha seo dheth, thèid leum dhan ionad a chaidh a thaghadh sa bhad STR_CONFIG_SETTING_MEASURE_TOOLTIP :Seall gliocasan-sgrìn tomhais le innealan togail: {STRING} @@ -1566,14 +1561,14 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Briogadh dùbai STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Aon bhriogadh (le fòcas) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Aon bhriogadh (sa bhad) -STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Emulation a' bhriogaidh dheis: {STRING} -STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Tagh an dòigh sa thèid emulation a dhèanamh airson briogadh le putan deas na luchaige +STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Riochdachadh a' bhriogaidh dheis: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Tagh an dòigh sa thèid briogadh le putan deas na luchaige a riochdachadh STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+Briogadh STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Briogadh STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Dheth -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Sgroladh le briogadh clì: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Cuir an comas gun tèid am mapa a sgroladh le slaodadh le putan clì na luchaige. Tha seo feumail gu h-àraidh nuair a chleachdas tu sgrìn-shuathaidh airson sgroladh +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Dùin an uinneag le briogadh deas: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Dùinidh seo uinneag le briogadh deas ’na broinn. Cuiridh e à comas an gliocas-sgrìn le briogadh deas! STR_CONFIG_SETTING_AUTOSAVE :Fèin-sàbhaladh: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Tagh dè cho tric ’s a thèid geamannan a shàbhaladh gu fèin-obrachail @@ -1963,6 +1958,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Thoir s STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Seall roghainnean sgriobt IF/geama STR_INTRO_TOOLTIP_QUIT :{BLACK}Fàg “OpenTTD" +STR_INTRO_BASESET :{BLACK}Tha {NUM} {P sprìd sprìd sprìdean sprìd} a dhìth air an t-seata grafaigeachd bhunasach a thagh thu. Thoir sùil airson ùrachaidhean an t-seata bhunasaich. STR_INTRO_TRANSLATION :{BLACK}Tha {NUM} {P sreang shreang sreangan sreang} a dhìth air an eadar-theangachadh seo. Nach toir thu cuideachadh dhuinn gus piseach a thort air OpenTTD ’s tu a' clàradh mar eadar-theangaiche? Thoir sùil air readme.txt airson fiosrachaidh. # Quit window @@ -1991,14 +1987,14 @@ STR_ABANDON_SCENARIO_QUERY :{YELLOW}A bheil # Cheat window STR_CHEATS :{WHITE}Cealgaireachd STR_CHEATS_TOOLTIP :{BLACK}Is ciall dha bhogsaichean-cromaige gun deach a' chealgaireachd seo a chleachdadh roimhe -STR_CHEATS_WARNING :{BLACK}Rabhadh! Tha thu gu bhith a' mealladh na co-fharpaisichean agad. Thoir an aire gun cumar cuimhne air an tàmailt seo gu bràth tuilleadh +STR_CHEATS_WARNING :{BLACK}Rabhadh! Tha thu gu bhith a' mealladh nan co-fharpaiseach agad. Thoir an aire gun cumar cuimhne air an tàmailt seo gu bràth tuilleadh STR_CHEAT_MONEY :{LTBLUE}Meudaich an t-airgead le {CURRENCY_LONG} STR_CHEAT_CHANGE_COMPANY :{LTBLUE}A' cluich mar a' chompanaidh: {ORANGE}{COMMA} STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Bulldozer draoidheach (thoir air falbh gnìomhachasan, oibseactan do-ghluasad): {ORANGE}{STRING} STR_CHEAT_CROSSINGTUNNELS :{LTBLUE}Faodaidh tunailean dol tarsainn càch a chèile: {ORANGE}{STRING} STR_CHEAT_NO_JETCRASH :{LTBLUE}Cha tachair tubaist (gu tric) le steall-phlèan air port-adhair beag: {ORANGE}{STRING} STR_CHEAT_EDIT_MAX_HL :{LTBLUE}Deasaich àirde as motha a’ mhapa: {ORANGE}{NUM} -STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{BLACK}Deasaich an àirde as motha dhe bheanntan air a’ mhapa +STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}Deasaich an àirde as motha dhe bheanntan air a’ mhapa STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Cruth-tìre measarra STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Cruth-tìre fo-artach STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Cruth-tìre fo-thropaigeach @@ -2524,9 +2520,21 @@ STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Toglaich STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Iompaich/Àrdaich seòrsa na rèile. Toglaidh Shift togail/sealladh air tuairmse chosgaisean STR_RAIL_NAME_RAILROAD :Rathad-iarainn +STR_RAIL_NAME_RAILROAD.nom :rathad-iarainn +STR_RAIL_NAME_RAILROAD.gen :rathaid-iarainn +STR_RAIL_NAME_RAILROAD.dat :rathad-iarainn STR_RAIL_NAME_ELRAIL :Rathad-iarainn dealain +STR_RAIL_NAME_ELRAIL.nom :rathad-iarainn dealain +STR_RAIL_NAME_ELRAIL.gen :rathaid-iarainn dealain +STR_RAIL_NAME_ELRAIL.dat :rathad-iarainn dealain STR_RAIL_NAME_MONORAIL :Rathad-iarainn aona-rèile +STR_RAIL_NAME_MONORAIL.nom :rathad-iarainn aona-rèile +STR_RAIL_NAME_MONORAIL.gen :rathaid-iarainn aona-rèile +STR_RAIL_NAME_MONORAIL.dat :rathad-iarainn aona-rèile STR_RAIL_NAME_MAGLEV :Rathad-iarainn magnaiteach +STR_RAIL_NAME_MAGLEV.nom :rathad-iarainn magnaiteach +STR_RAIL_NAME_MAGLEV.gen :rathaid-iarainn mhagnaitich +STR_RAIL_NAME_MAGLEV.dat :rathad-iarainn magnaiteach # Rail depot construction window STR_BUILD_DEPOT_TRAIN_ORIENTATION_CAPTION :{WHITE}Comhair na trèan-lainn @@ -2800,6 +2808,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Ainm lea STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Carago air a ghabhail ris: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Seòrsa an rèile: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Crìoch-luaiths rèile: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Crìoch-astair rathaid: {LTBLUE}{VELOCITY} @@ -2812,29 +2821,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Achaidhean STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Tìr sneachdach STR_LAI_CLEAR_DESCRIPTION_DESERT :Fàsach -STR_LAI_RAIL_DESCRIPTION_TRACK :Slighe {STRING.gen} -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Slighe {STRING.gen} le comharran bacaidh -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Slighe {STRING.gen} le ro-chomharran -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Slighe {STRING.gen} le comharran a-mach -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Slighe {STRING.gen} le comharran aonaichte -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Slighe {STRING.gen} le comharran slighe -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Slighe {STRING.gen} le comharran aon-shligheach -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Slighe {STRING.gen} le comharran bacaidh is ro-chomharran -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Slighe {STRING.gen} le comharran-bacaidh is a-mach -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Slighe {STRING.gen} le comharran-bacaidh is aonaichte -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Slighe {STRING.gen} le comharran-bacaidh is slighe -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Slighe {STRING.gen} le comharran-bacaidh is aon-shligheach -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Slighe {STRING.gen} le ro-chomharran is comharran a-mach -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Slighe {STRING.gen} le ro-chomharran is comharran aonaichte -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Slighe {STRING.gen} le ro-chomharran is comharran slighe -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Slighe {STRING.gen} le ro-chomharran is comharran aon-shligheach -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Slighe {STRING.gen} le comharran a-mach is aonaichte -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Slighe {STRING.gen} le comharran a-mach is slighe -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Slighe {STRING.gen} le comharran a-mach is aon-shligheach -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Slighe {STRING.gen} le comharran aonaichte is slighe -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Slighe {STRING.gen} le comharran aonaichte is aon-shligheach -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Slighe {STRING.gen} le comharran slighe is aon-shligheach -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Trèan-lann {STRING} +STR_LAI_RAIL_DESCRIPTION_TRACK :Slighe rathaid-iarainn +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Slighe rathaid-iarainn le comharran bacaidh +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Slighe rathaid-iarainn le ro-chomharran +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Slighe rathaid-iarainn le comharran a-mach +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Slighe rathaid-iarainn le comharran aonaichte +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Slighe rathaid-iarainn le comharran slighe +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Slighe rathaid-iarainn le comharran aon-shligheach +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Slighe rathaid-iarainn le comharran bacaidh is ro-chomharran +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Slighe rathaid-iarainn le comharran-bacaidh is a-mach +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Slighe rathaid-iarainn le comharran-bacaidh is aonaichte +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Slighe rathaid-iarainn le comharran-bacaidh is slighe +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Slighe rathaid-iarainn le comharran-bacaidh is aon-shligheach +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Slighe rathaid-iarainn le ro-chomharran is comharran a-mach +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Slighe rathaid-iarainn le ro-chomharran is comharran aonaichte +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Slighe rathaid-iarainn le ro-chomharran is comharran slighe +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Slighe rathaid-iarainn le ro-chomharran is comharran aon-shligheach +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Slighe rathaid-iarainn le comharran a-mach is aonaichte +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Slighe rathaid-iarainn le comharran a-mach is slighe +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Slighe rathaid-iarainn le comharran a-mach is aon-shligheach +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Slighe rathaid-iarainn le comharran aonaichte is slighe +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Slighe rathaid-iarainn le comharran aonaichte is aon-shligheach +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Slighe rathaid-iarainn le comharran slighe is aon-shligheach +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Trèan-lann rathaid-iarainn STR_LAI_ROAD_DESCRIPTION_ROAD :Rathad STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Rathad le solasan-rathaid @@ -2916,7 +2925,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Tìr a' chompan STR_ABOUT_OPENTTD :{WHITE}Mu dheidhinn OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Còir-lethbhreac tùsail {COPYRIGHT} 1995 Chris Sawyer, a h-uile còir glèidhte STR_ABOUT_VERSION :{BLACK}OpenTTD tionndadh {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 An sgioba OpenTTD +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 @@ -3135,8 +3151,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Chaidh feuchain STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}Tha sprite coirbte am broinn {STRING.gen}. Thèid a h-uile sprite coirbte a shealltainn na comharradh-ceiste dhearg (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Tha iomadh innteart gnìomh 8 ann (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Chaidh leughadh thar deireadh a' sprite mas fhìor (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Tha sprite no dhà a dhìth air an t-seata ghrafaigeachd bhunasach a tha thu a' cleachdadh an-dràsta.{}Feuch an ùraich thu an seata grafaigeachd bunasach -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Tha sprite no dhà a dhìth air an t-seata ghrafaigeachd bhunasach a tha thu a' cleachdadh an-dràsta.{}Feuch an ùraich thu an seata grafaigeachd bunasach.{}Bhon a tha thu a' cluich le {YELLOW}snapshot leasachaidh aig OpenTTD{WHITE}, ’S dòcha gu bheil {YELLOW} snapshot leasachaidh dhen t-seata grafaigeachd bunasach{WHITE} a dhìth ort cuideachd STR_NEWGRF_ERROR_GRM_FAILED :Chan eil na goireasan GRF a chaidh iarraidh ri làimh (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :Chaidh {1:STRING} a chur à comas le {2:STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Fòrmat co-dhealbhachd sprite mì-dhligheach/neo-aithnichte (sprite {3:NUM}) @@ -3211,8 +3225,6 @@ STR_TOWN_POPULATION :{BLACK}Sluagh a STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Mòr-bhaile) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Sluagh: {ORANGE}{COMMA}{BLACK} Taighean: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Taistealaich am mìos mu dheireadh: {ORANGE}{COMMA}{BLACK} as motha: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Post am mìos mu dheireadh: {ORANGE}{COMMA}{BLACK} as motha: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Carago a tha a dhìth ach am fàs am baile: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{RED}Feum air {ORANGE}{STRING} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{BLACK}Feum air {ORANGE}{STRING}{BLACK} sa gheamhradh @@ -3343,8 +3355,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Na ghabh STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Seall liosta a' charago a thèid a ghabhail ris STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Gabhar ri: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Tha còirichean giùlain às-dùnach aig an stèisean seo sa bhaile seo. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{BLACK}Cheannaich {YELLOW}{COMPANY}{BLACK} còirichean giùlain às-dùnach sa bhaile seo. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Tha còirichean giùlain às-dùnach aig an stèisean seo sa bhaile seo. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{BLACK}Cheannaich {YELLOW}{COMPANY}{BLACK} còirichean giùlain às-dùnach sa bhaile seo. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Rangachaidhean STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Seall rangachaidhean nan stèiseanan @@ -3523,9 +3535,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Feum air STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Feum air: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Feum air: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} a' feitheamh{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Carago a' feitheamh air giullachd: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Toradh: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Toradh: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3592,6 +3606,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Thoir a h-uile STR_GROUP_RENAME_CAPTION :{BLACK}Thoir ainm ùr air buidheann +STR_GROUP_PROFIT_THIS_YEAR :Prothaid am bliadhna: +STR_GROUP_PROFIT_LAST_YEAR :Prothaid an-uiridh: +STR_GROUP_OCCUPANCY :Cleachdadh an-dràsta: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Carbadan-rèile ùra STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Carbadan-rèile dealain ùra @@ -3623,6 +3642,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Na h-uile seòr STR_PURCHASE_INFO_ALL_BUT :Na h-uile ach {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Spàirn tàirnge as motha: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Astar: {GOLD}{COMMA} {P leac leac leacan leac} +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Seòrsa a' charbaid-adhair: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Liosta airson carbadan-rèile a thaghadh. Briog air carbad airson fiosrachaidh. Ctrl+briog gus toglachadh an tèid seòrsa a’ charbaid fhalach gus nach tèid STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Liosta airson carbadan-rathaid a thaghadh. Briog air carbad airson fiosrachaidh. Ctrl+briog gus toglachadh an tèid seòrsa a’ charbaid fhalach gus nach tèid @@ -3756,10 +3776,11 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :einnsean magnai STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Cosgais: {CURRENCY_LONG} Cuideam: {WEIGHT_SHORT}{}Luaths: {VELOCITY} Cumhachd: {POWER}{}Cosgaisean ruith: {CURRENCY_LONG}/bliadhna{}Tomhas-lìonaidh: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cosgais: {CURRENCY_LONG} Cuideam: {WEIGHT_SHORT}{}Luaths: {VELOCITY} Cumhachd: {POWER} Neart: {6:FORCE}{}Cosgaisean ruith: {4:CURRENCY_LONG}/bliadhna{}Tomhas-lìonaidh: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Cosgais: {CURRENCY_LONG} Luaths as motha: {VELOCITY}{}Tomhas-lìonaidh: {CARGO_LONG}, {CARGO_LONG}{}Cosgaisean ruith: {CURRENCY_LONG}/bliadhna -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Cosgais: {CURRENCY_LONG} Luaths as motha: {VELOCITY}{}Tomhas-lìonaidh: {CARGO_LONG}{}Cosgaisean ruith: {CURRENCY_LONG}/bliadhna -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Cosgais: {CURRENCY_LONG} Luaths as motha: {VELOCITY} Astar: {COMMA} leacan{}Tomhas-lìonaidh: {CARGO_LONG}, {CARGO_LONG}{}Cosgaisean ruith: {CURRENCY_LONG}/bliadhna -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Cosgais: {CURRENCY_LONG} Luaths as motha: {VELOCITY} Astar: {COMMA} leacan{}Tomhas-lìonaidh: {CARGO_LONG}{}Cosgaisean ruith: {CURRENCY_LONG}/bliadhna +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Cosgais: {CURRENCY_LONG} Luaths as motha: {VELOCITY}{}Tomhas-lìonaidh: {CARGO_LONG}{}Cosgaisean ruith: {CURRENCY_LONG}/bliadhna +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Cogais: {CURRENCY_LONG} Luaths as motha: {VELOCITY}{}Seòrsa carbaid-adhair: {STRING}{}Tomhas-lìonaidh: {CARGO_LONG}, {CARGO_LONG}{}Cosgaisean ruith: {CURRENCY_LONG}/bliadhna +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Cogais: {CURRENCY_LONG} Astar as motha: {VELOCITY}{}Seòrsa carbaid-adhair: {STRING}{}Tomhas-lìonaidh: {CARGO_LONG}{}Cosgaisean ruith: {CURRENCY_LONG}/bliadhna +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Cogais: {CURRENCY_LONG} Luaths as motha: {VELOCITY}{}Seòrsa carbaid-adhair: {STRING} Astar: {COMMA} {P leacag leacag leacagan leacag}{}Tomhas-lìonaidh: {CARGO_LONG}, {CARGO_LONG}{}Cosgaisean ruith: {CURRENCY_LONG}/bliadhna +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Cosgais: {CURRENCY_LONG} Astar as motha: {VELOCITY}{}Seòrsa carbaid-adhair: {STRING} Astar: {COMMA} {P leacag leacag leacagan leacag}{}Capacity: {CARGO_LONG}{}Cosgaisean ruith: {CURRENCY_LONG}/bliadhna # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Leasaich {STRING} - {STRING} @@ -3786,10 +3807,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} nuair STR_REPLACE_VEHICLES_STOP :{BLACK}Sguir dhe leasachadh nan carbadan STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Briog air ach nach tèid einnseanan dhen t-seòrsa a thagh thu air an taobh chlì a leasachadh -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}A' leasachadh: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Gearr leum eadar uinneagan leasachadh nan einnseanan is nan carbadan STR_REPLACE_ENGINES :Einnseanan STR_REPLACE_WAGONS :Carbadan +STR_REPLACE_ALL_RAILTYPE :A h-uile carbad-rèile STR_REPLACE_HELP_RAILTYPE :{BLACK}Tagh an seòrsa dhe rèile is tu airson einnseanan a leasachadh air a shon STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Seallaidh seo an einnsean a tha ga chur an àite an einnsein a thagh thu air an taobh chlì, ma tha gin ann @@ -3882,7 +3903,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} {P bhli STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} {P bhliadhna bhliadhna bliadhna bliadhna} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Luaths as motha: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Luaths as motha: {LTBLUE}{VELOCITY} {BLACK}Astar: {LTBLUE}{COMMA} {P leac leac leacan leac} +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Luaths as motha: {LTBLUE}{VELOCITY} {BLACK}Seòrsa carbaid-adhair: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Luaths as motha: {LTBLUE}{VELOCITY} {BLACK}Seòrsa carbaid-adhair: {LTBLUE}{STRING} {BLACK}Astar: {LTBLUE}{COMMA} {P leacag leacag leacagan leacag} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Cuideam: {LTBLUE}{WEIGHT_SHORT} {BLACK}Cumhachd: {LTBLUE}{POWER}{BLACK} Luaths as motha: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Cuideam: {LTBLUE}{WEIGHT_SHORT} {BLACK}Cumhachd: {LTBLUE}{POWER}{BLACK} Luaths as motha: {LTBLUE}{VELOCITY} {BLACK}Neart as motha: {LTBLUE}{FORCE} @@ -4441,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 0dceb679d7..a40620073f 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -670,10 +670,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Seleccio STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Activar/desactivar programa aleatorio STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Amosar a fiestra de selección de pista musical -STR_ERROR_NO_SONGS :{WHITE}Seleccionouse unha lista de reprodución sen cancións. Non se reproducirá ningunha canción - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Selección do programa de música 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}' @@ -762,7 +759,7 @@ STR_SMALLMAP_TOOLTIP_ENABLE_ALL_INDUSTRIES :{BLACK}Mostrar STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Amosar/ocultar mapa de cotas do terreo STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}Non amosar as propiedades de ningunha compañía no mapa STR_SMALLMAP_TOOLTIP_ENABLE_ALL_COMPANIES :{BLACK}Amosar as propiedades de tódalas compañías no mapa -STR_SMALLMAP_TOOLTIP_DISABLE_ALL_CARGOS :BLACK}Non amosa ningunha carga no mapa +STR_SMALLMAP_TOOLTIP_DISABLE_ALL_CARGOS :{BLACK}Non amosa ningunha carga no mapa STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Amosa tódolas cargas no mapa # Status bar messages @@ -845,6 +842,7 @@ STR_NEWS_VEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}{VEHICLE STR_NEWS_VEHICLE_HAS_VOID_ORDER :{WHITE}{VEHICLE} ten unha orde nula STR_NEWS_VEHICLE_HAS_DUPLICATE_ENTRY :{WHITE}{VEHICLE} ten ordes duplicadas STR_NEWS_VEHICLE_HAS_INVALID_ENTRY :{WHITE}{VEHICLE} ten unha estación inválida nas súas ordes +STR_NEWS_PLANE_USES_TOO_SHORT_RUNWAY :{WHITE}{VEHICLE} ten nas súas ordes un aeroporto con unha pista moi corta STR_NEWS_VEHICLE_IS_GETTING_OLD :{WHITE}{VEHICLE} está a volverse vello STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE} está a volverse moi vello @@ -985,6 +983,7 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Selecion STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dobre tamaño +STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Tamaño do cadro STR_GAME_OPTIONS_BASE_GRF :{BLACK}Conxunto básico de gráficos STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Selecciona o conxunto de gráficos básico a empregar @@ -1101,6 +1100,8 @@ STR_CONFIG_SETTING_TYPE_GAME_INGAME :Configuración STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Configuración da compañía (almacénase nas partidas gravadas; afecta só ás novas partidas) STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Configuración da compañía (almacénase nas partidas gravadas; afecta só á partida actual) +STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK}Categoría: +STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}Tipo: STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}Restrinxe a seguinte lista amosando só os valores alterados STR_CONFIG_SETTING_RESTRICT_BASIC :Configuración básica STR_CONFIG_SETTING_RESTRICT_ADVANCED :Configuración avanzada @@ -1115,6 +1116,10 @@ STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_MENU :Configuración STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME :Configuración da partida (almacénase nas partidas gravadas; afecta só á partida actual) STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Configuración da compañía (almacénase nas partidas gravadas; afecta só ás novas partidas) STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Configuración da compañía (almacénase nas partidas gravadas; afecta só á partida actual) +STR_CONFIG_SETTING_CATEGORY_HIDES :{BLACK}Amosa todos os resultados da procura por configuración{}{SILVER}Categoría {BLACK}a {WHITE}{STRING} +STR_CONFIG_SETTING_TYPE_HIDES :{BLACK}Amosa todos os resultados da procura por opción{}{SILVER}Tipo {BLACK}a {WHITE}Todos os tipos de configuración +STR_CONFIG_SETTING_CATEGORY_AND_TYPE_HIDES :{BLACK}Amosa todos os resultados de procura por configuración{}{SILVER}Categoría {BLACK}a {WHITE}{STRING} {BLACK}e {SILVER}Tipo {BLACK}a {WHITE}Todos os tipos de configuración +STR_CONFIG_SETTINGS_NONE :{WHITE}- Ningún - STR_CONFIG_SETTING_OFF :Off STR_CONFIG_SETTING_ON :On @@ -1281,12 +1286,20 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Amosa a poboaci STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Grosor das liñas dos gráficos: {STRING} STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Ancho de liña nos gráficos. Unha liña fina lese con máis precisión, unha liña grosa é máis doada de ver e as cores son máis fáciles de distinguir +STR_CONFIG_SETTING_LANDSCAPE :Paisaxe: {STRING} +STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :As paisaxes definen escenarios de xogo con diferentes requirimentos de mercadorías e de crecemento da poboación. Ainda que os scripts de xogo e os NewGRF permiten máis control STR_CONFIG_SETTING_LAND_GENERATOR :Xerador de terreo: {STRING} +STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT :O xerador orixinal depende do conxunto base de gráficos, e compón formas fixas de paisaxe. TerraGenesis é un xerador baseado no Ruido Perlin con maiores opcións de control STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Orixinal STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis +STR_CONFIG_SETTING_TERRAIN_TYPE :Tipo de terreo: {STRING} +STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(TerraGenesis só) Cantidade de outeiros na paisaxe +STR_CONFIG_SETTING_INDUSTRY_DENSITY :Densidade industrial: {STRING} +STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Establece cantas industrias deben xerarse e que nivel se debe manter durante o xogo STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Distancia máxima das refinarías ao borde do mundo: {STRING} STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :As refinarías de petróleo só se constrúen preto do borde do mapa, isto é na costa para mapas de illas STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Cota de neve: {STRING} +STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Controla a que altitude comeza a nevar en paisaxes subárticas. A neve afecta tamén á xeración industrial e aos requirimentos de crecemento dos pobos STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Desigualdade do terreo (só TerraGenesis) : {STRING} STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(só TerraGenesis) Escolle a frequencia de montes: Suaviza as paisaxes tendo menos montes e máis espallados. Paisaxes escarpadas teñen moitos outos, que poderían semellar repetitivos STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Moi suave @@ -1322,8 +1335,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Cor do terreo n 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_REVERSE_SCROLLING :Inverti-la dirección de desprazamento: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Acción cando o mapa se despraza co botón dereito do rato. Cando se desactiva, o rato move a cámara. Cando se activa, o rato move o mapa STR_CONFIG_SETTING_SMOOTH_SCROLLING :Desprazamento de vista suave: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Controla como a vista principal se despraza a unah posición específica cando se fai clic no minimapa ou cando se emprega un comando para desprazarse a un obxecto específico sobre o mapa. Se se activa, a vista desprázase suavemente, se se desactiva salta directamente STR_CONFIG_SETTING_MEASURE_TOOLTIP :Mostrar medidas ao usar as ferramentas de construción: {STRING} @@ -1355,8 +1366,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Tecla Command+C STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Clic STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Apagado -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Desprazamento con click esquerdo: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Habilitar o desprazamento do mapa arrastrándoo co botón esquerdo do rato. Isto é especialmente útil se se emprega unha pantalla táctil para desprazarse +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Pechar a fiestra con click dereito: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Pecha a fiestra facendo botón dereito dentro de ela. Deshabilita a axuda contextual facendo click-dereito! STR_CONFIG_SETTING_AUTOSAVE :Autogravado: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Selecciona o intervalo entre gravados automáticos das partidas @@ -1589,9 +1600,21 @@ STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Ningunha STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Multiplicador inicial do tamaño da cidade: {STRING} STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Relación entre o tamaño medio das cidades e o dos pobos ao inicio da partida +STR_CONFIG_SETTING_LINKGRAPH_INTERVAL :Actualiza o gráfico de distribución cada {STRING}{NBSP}day{P 0:2 "" s} +STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT :Tempo entre recálculos subseguintes do gráfico de ligazóns. Cada recálculo calcula os plans para unha compoñente do gráfico. Isto non significa que un valor de X para esta opción supoña que o gráfico completo será actualizado cada X días. Só algunhas compoñentes o serán. Canto máis curto sexa, máis tempo de CPU será necesario para calculalo. Canto máis longo sexa, máis tempo levará ata que a distribución das mercadorías comeza para rutas novas. +STR_CONFIG_SETTING_LINKGRAPH_TIME :Leva {STRING}{NBSP}día{P 0:2 "" s} recalcular o gráfico de distribución +STR_CONFIG_SETTING_LINKGRAPH_TIME_HELPTEXT :Tempo empregado para cada recálculo dunha compoñente do gráfico de ligazóns. Cando comeza un recálculo, creáse un fío que funciona por este número de días. Canto máis pequeno sexa este, é máis probable que o fío non remate cando se supón. Nese intre o xogo para para compensar este retardo. Canto máis longo sexa, máis tempo leva actualizar a distribución cando cambian as rutas. STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :manual STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :asimétrica STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :simétrica +STR_CONFIG_SETTING_DISTRIBUTION_PAX :Modo de distribución para pasaxeiros: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"simétrico" singinfica que máis ou menos o mesmo número de pasaxeiros irán dende a estación A cada a estación B e tamén da B cara a A. "asimétrico" significa que calquera número de pasaxeiros pode ir en calquera dirección. "manual" significa que non haberá distribución automática para os pasaxeiros. +STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Modo de distribución para correo: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :"simétrico" significa que máis ou menos a mesma cantidade de correo vai ser enviada da estación A cara a estación B como da estación B cara a A. "asimétrico" signigica que calquera cantidade de correo pode ser enviado en calquera dirección. "manual" significa que non hai distribución automática para o correo. +STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Modo de disitribución para o tipo de mercadoría BLINDADO: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :A calse de mercadoría BLINDADA contén obxectos de valor nos clima morno, diamantes no subtropical ou ouro no clima subártico. Os NewGRFs poden cambiar isto. "simétrico" significa que máis ou menos a mesma cantidade de esta mercadoría será enviadas dende a estación A cara a estación B así como da estación B para a A. "asimétrico" significa que calquera cantidade de esta mercadoría pode ser enviada en calquera dirección. "manual" significa que non haberá distribución automática para esta mercadoría. Recoméndase elixir asimétrico ou manual cando se xoguen mapas subárticos, xa que os bancos non van enviar ouro de volta ás minas. Para climas mornos e subtropicais podes escoller tamén simétrico xa que os bancos retornan valores aos bancos de orixe dalgunha carga de valores. +STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Xeito de distribución para outros tipos de mercadoría: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"asimétrico" significa que calquera cantidade de mercadorías pode ser enviada en calquera dirección. "manual" significa que non haberá distribución automática para estas mercadorías. STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Precisión da distribución: {STRING} STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Canto máis alto sexa o valor, máis tempo de CPU levará o cálculo de distribución. Se leva demasiado tempo podes experimentar retraso. Se sen embargo o fixas nun valor baixo, a distribución será imprecisa, e pode que a carga non sexa enviada aos destinos que ti queres. STR_CONFIG_SETTING_DEMAND_DISTANCE :Efecto da distancia na demanda: {STRING} @@ -1638,11 +1661,23 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Métrico (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) STR_CONFIG_SETTING_LOCALISATION :{ORANGE}Localización +STR_CONFIG_SETTING_GRAPHICS :{ORANGE}Gráficos STR_CONFIG_SETTING_SOUND :{ORANGE}Efectos de son STR_CONFIG_SETTING_INTERFACE :{ORANGE}Interface +STR_CONFIG_SETTING_INTERFACE_GENERAL :{ORANGE}Xeral +STR_CONFIG_SETTING_INTERFACE_VIEWPORTS :{ORANGE}Fiestras de visualización STR_CONFIG_SETTING_INTERFACE_CONSTRUCTION :{ORANGE}Construción +STR_CONFIG_SETTING_ADVISORS :{ORANGE}Novas / Conselleiros +STR_CONFIG_SETTING_COMPANY :{ORANGE}Compañía +STR_CONFIG_SETTING_ACCOUNTING :{ORANGE}Contabilidade STR_CONFIG_SETTING_VEHICLES :{ORANGE}Vehículos +STR_CONFIG_SETTING_VEHICLES_PHYSICS :{ORANGE}Física STR_CONFIG_SETTING_VEHICLES_ROUTING :{ORANGE}Encamiñamento +STR_CONFIG_SETTING_LIMITATIONS :{ORANGE}Limitacións +STR_CONFIG_SETTING_ACCIDENTS :{ORANGE}Desastres / Accidentes +STR_CONFIG_SETTING_GENWORLD :{ORANGE}Xeración do mundo +STR_CONFIG_SETTING_ENVIRONMENT :{ORANGE}Contorno +STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :{ORANGE}Autoridades STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :{ORANGE}Cidades STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}Industrias STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}Distribución da carga @@ -1722,6 +1757,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Buscar c STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Motra-la configuración dos scripts de IA STR_INTRO_TOOLTIP_QUIT :{BLACK}Saír de 'OpenTTD' +STR_INTRO_BASESET :{BLACK}A base gráfica seleccionada actualmente está perdendo {NUM} sprite{P "" s}. Por favor comproba se hai actualizacións para o conxunto base. STR_INTRO_TRANSLATION :{BLACK}A ista tradución fáltanlle {NUM} string{P "" s}. Por favor, axúdanos a mellorar OpenTTD rexistrándote coma tradutor. Bótalle un ollo ao readme.txt para máis detalles. # Quit window @@ -2046,6 +2082,7 @@ STR_NETWORK_CLIENT :Cliente STR_NETWORK_SPECTATORS :Espectadores STR_NETWORK_GIVE_MONEY_CAPTION :{WHITE}Introduce a cantidade de cartos que queres dar +STR_NETWORK_TOOLBAR_LIST_SPECTATOR :{BLACK}Espectador # Network set password STR_COMPANY_PASSWORD_CANCEL :{BLACK}Non grava-lo contrasinal introducido @@ -2549,7 +2586,9 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Nome do STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Carga aceptada: {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 velocidade da vía: {LTBLUE}{VELOCITY} +STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Límite de velocidade da estrada: {LTBLUE}{VELOCITY} # Description of land area of different tiles STR_LAI_CLEAR_DESCRIPTION_ROCKS :Cons @@ -2560,29 +2599,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Leiras STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Terra cuberta de neve STR_LAI_CLEAR_DESCRIPTION_DESERT :Deserto -STR_LAI_RAIL_DESCRIPTION_TRACK :Vía de {STRING} -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Vía de {STRING} con sinais de bloqueo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Vía de {STRING} con sinais avanzados -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Vía de {STRING} con sinais de saída -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Vía de {STRING} con sinais combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Vía de {STRING} con sinais de ruta -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Vía de {STRING} con sinais de ruta monosentido -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Vía de {STRING} con sinais de bloqueo e avanzados -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Vía de {STRING} con sinais de bloqueo e saída -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Vía de {STRING} con sinais de bloqueo e combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Vía de {STRING} con sinais de bloqueo e de ruta -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Vía de {STRING} con sinais de bloqueo e de ruta monosentido -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Vía de {STRING} con sinais avanzados e de saída -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Vía de {STRING} con sinais avanzados e combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Vía de {STRING} con sinais avanzados e de ruta -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Vía de {STRING} con sinais avanzados e de ruta monosentido -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Vía de {STRING} con sinais de saída e combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Vía de {STRING} con sinais de saída e de ruta -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Vía de {STRING} con sinais de saída e de ruta monosentido -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Vía de {STRING} con sinais combo e de ruta -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Vía de {STRING} con sinais combo e de ruta monosentido -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Vía de {STRING} con sinais de ruta e de ruta monosentido -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Depósito ferroviario {STRING} +STR_LAI_RAIL_DESCRIPTION_TRACK :Vía de ferrocarril +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Vía de ferrocarril con sinais de bloqueo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Vía de ferrocarril con sinais avanzados +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Vía de Ferrocarril con sinais de saída +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Vía de Ferrocarril con sinais combo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Vía de ferrocarril con sinais de ruta +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Vía de ferrocarril con sinais de ruta monosentido +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Vía de Ferrocarril con sinais de bloqueo e pre-sinais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Vía de ferrocarril con sinais de bloqueo e saída +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Vía de ferrocarril con sinais de bloqueo e combo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Vía de ferrocarril con sinais de bloqueo e de ruta +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Vía de Ferrocarril con sinais de bloqueo e de ruta monosentido +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Vía de Ferrocarril con sinais avanzados e de saída +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Vía de Ferrocarril con sinais avanzados e combo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Vía de Ferrocarril con sinais avanzados e de ruta +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Vía de ferrocarril con sinais avanzados e de ruta monosentido +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Vía de ferrocarril con sinais de saída e combo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Vía de ferrocarril con sinais de saída e de ruta +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Vía de Ferrocarril con sinais de saída e de ruta monosentido +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Vía de ferrocarril con sinais combo e de ruta +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Vía de ferrocarril con sinais combo e de ruta monosentido +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Vía de ferrocarril con sinais de ruta e de ruta monosentido +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Depósito ferroviario de ferrocarril STR_LAI_ROAD_DESCRIPTION_ROAD :Estrada STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Estrada con iluminación @@ -2646,7 +2685,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Terreo propieda STR_ABOUT_OPENTTD :{WHITE}Acerca de OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyright orixinal {COPYRIGHT} 1995 Chris Sawyer, Tódolos dereitos reservados STR_ABOUT_VERSION :{BLACK}OpenTTD versión {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2015 O equipo de OpenTTD +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 @@ -2665,6 +2711,7 @@ STR_SAVELOAD_SAVE_BUTTON :{BLACK}Gravar STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}Salva-la partida actual, usando o nome seleccionado STR_SAVELOAD_LOAD_BUTTON :{BLACK}Cargar STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}Carga-la partida seleccionada +STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP :{BLACK}Carga o mapa de alturas seleccionado STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Detalles da partida STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Non hai información dispoñíbel STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING} @@ -2832,7 +2879,11 @@ STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Ir ao sp STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Sprite anterior STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Ir ao sprite anterior, ignorando pseudosprites, sprites recoloreados e sprites de fonte, e volvendo a empezar ao chegar ao inicio STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Representación do sprite seleccionado. A aliñación ignórase ao debuxar este sprite -STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Move-lo sprite, cambiando os valores de X e Y +STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Move-lo sprite, cambiando os valores de X e Y. Ctrl+Click para movelo sprite oito unidades de golpe. +STR_SPRITE_ALIGNER_RESET_BUTTON :Reinicio relativo +STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Restablecer a compensación actual +STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Compensación eixo X: {NUM}, Compensación eixo Y: {NUM} (Absoluta) +STR_SPRITE_ALIGNER_OFFSETS_REL :{BLACK}Compensación eixo X: {NUM}, Compensación eixo Y: {NUM} (Relativa) STR_SPRITE_ALIGNER_PICKER_BUTTON :{BLACK}Seleccionar sprite STR_SPRITE_ALIGNER_PICKER_TOOLTIP :{BLACK}Seleccionar un sprite en calquera parte da pantalla @@ -2860,8 +2911,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Intento de usar STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} contén un sprite corrupto. Tódolos sprites corruptos mostraranse coma unha interrogación vermella (?). STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Contén múltiples entradas de acción 8 (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Lectura máis aló da fin dun pseudo-sprite (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE} Ao conxunto de gráficos básicos empregado actualmente fáltalle un número de sprites.{}Por favor, actualiza o conxunto de gráficos básico -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE} Ao conxunto de gráficos básicos empregado actualmente fáltalle un número de sprites.{}Por favor, actualiza o conxunto de gráficos básico.{}Dado que estás a xogar unha {YELLOW}versión de desenrolo de OpenTTD{WHITE}, é posíbel que tamén necesites unha {YELLOW}versión de desenrolo do conjunto de gráficos base{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Os recursos GRF solicitados non están disponíbeis (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} foi desactivado por {2:STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Formato de colocación de sprites inválido ou descoñecido (sprite {3:NUM}) @@ -2889,7 +2938,8 @@ STR_NEWGRF_LIST_MISSING :{RED}Faltan arq STR_NEWGRF_BROKEN :{WHITE}O comportamento do NewGRF '{0:STRING}' pode causar desincronizacións e/ou colgues STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}Cambiou o estado 'vagón con potencia' para '{1:ENGINE}' fóra dun depósito STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}Cambiou a lonxitude do vehículo a '{1:ENGINE}' cando non está nun depósito -STR_BROKEN_VEHICLE_LENGTH :{WHITE}O tren '{VEHICLE}' pertencente a '{COMPANY}' ten unha lonxitude inválida. Esto está causado probabelmente por problemas con NewGRFs. O xogo pode desincronizarse ou colgarse +STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Cambiou a capacidade do vehículo en '{1:ENGINE}' cando non está nun depósito ou modificándose +STR_BROKEN_VEHICLE_LENGTH :{WHITE}O tren '{VEHICLE}' pertencente a '{COMPANY}' ten unha lonxitude inválida. Isto está causado probabelmente por problemas con NewGRFs. O xogo pode desincronizarse ou colgarse STR_NEWGRF_BUGGY :{WHITE}O NewGRF '{0:STRING}' proporciona información incorrecta. STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Información de carga/reforma para '{1:ENGINE}' difiire da lista de compra despois da construción. Isto pode causar que a renovación/reemprazo automáticos non reformen correctamente @@ -2904,6 +2954,7 @@ STR_NEWGRF_INVALID_ENGINE : # Placeholders for other invalid stuff, e.g. vehicles that have gone (Game Script). +STR_INVALID_VEHICLE : # NewGRF scanning window STR_NEWGRF_SCAN_CAPTION :{WHITE}Escaneando NewGRFs @@ -2934,8 +2985,6 @@ STR_TOWN_POPULATION :{BLACK}Poboaci STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Cidade) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Poboación: {ORANGE}{COMMA}{BLACK} Casas: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Pasaxeiros último mes: {ORANGE}{COMMA}{BLACK} máx: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Correo último mes: {ORANGE}{COMMA}{BLACK} máx: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Carga necesaria para o crecemento da cidade: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} necesario STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} necesarios en inverno @@ -3034,13 +3083,16 @@ STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Pincha no servizo para centrar a vista na industria/cidade. CTRL+Click abre unha nova fiestra na localización da industria/cidade # Story book window +STR_STORY_BOOK_CAPTION :{WHITE}{COMPANY} Historial STR_STORY_BOOK_SPECTATOR_CAPTION :{WHITE}Historial global STR_STORY_BOOK_TITLE :{YELLOW}{STRING} STR_STORY_BOOK_GENERIC_PAGE_ITEM :Páxina {NUM} +STR_STORY_BOOK_SEL_PAGE_TOOLTIP :{BLACK}Vai a unha páxina específica seleccionandoa nesta lista despregable. STR_STORY_BOOK_PREV_PAGE :{BLACK}Anterior STR_STORY_BOOK_PREV_PAGE_TOOLTIP :{BLACK}Ir á páxina anterior STR_STORY_BOOK_NEXT_PAGE :{BLACK}Seguinte STR_STORY_BOOK_NEXT_PAGE_TOOLTIP :{BLACK}Ir á páxina seguinte +STR_STORY_BOOK_INVALID_GOAL_REF :{RED}Referencia inválida de obxectivo # Station list window STR_STATION_LIST_TOOLTIP :{BLACK}Nomes das estacións - pincha nun nome para centrar a vista na estación. CTRL+Click abre unha nova fiestra na localización da estación @@ -3063,8 +3115,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Acepta STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Mostrar a lista da carga aceptada STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Acepta: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Esta estación ten dereitos de transporte exclusivos nesta cidade. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} comprou a exclusiva de dereitos de transporte nesta cidade. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Esta estación ten dereitos de transporte exclusivos nesta cidade. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} comprou a exclusiva de dereitos de transporte nesta cidade. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Puntuacións: STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Mostra-las puntuacións da estación @@ -3243,9 +3295,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Require: STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Require: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Require: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} agardando{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Carga esperando ser procesada: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produce: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Produce: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3304,12 +3358,19 @@ STR_GROUP_DELETE_TOOLTIP :{BLACK}Borrar o STR_GROUP_RENAME_TOOLTIP :{BLACK}Renomear o grupo seleccionado STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Pincha para protexer a este grupo da autosubstitución global +STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Borrar Grupo +STR_GROUP_DELETE_QUERY_TEXT :{WHITE}Seguro que queres borrar este grupo e calquera descendente? STR_GROUP_ADD_SHARED_VEHICLE :Engadir vehículos compartidos STR_GROUP_REMOVE_ALL_VEHICLES :Borrar tódolos vehículos STR_GROUP_RENAME_CAPTION :{BLACK}Renomear un grupo +STR_GROUP_PROFIT_THIS_YEAR :Beneficio este ano: +STR_GROUP_PROFIT_LAST_YEAR :Beneficio do último ano: +STR_GROUP_OCCUPANCY :Uso actual: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Novos vehículos ferroviarios STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Novos vehículos ferroviarios eléctricos @@ -3341,6 +3402,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Tódolos tipos STR_PURCHASE_INFO_ALL_BUT :Todos excepto {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Esforzo máximo de tracción: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Autonomía: {GOLD}{COMMA} cadros +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Tipo de aeronave: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista de selección de vehículos ferroviarios - pincha nun vehículo para obter información STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Lista de selección de vehículos de estrada - pincha nun vehículo para obter información @@ -3474,10 +3536,11 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :locomotora de m STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Custo: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocidade: {VELOCITY} Potencia: {POWER}{}Custo operativo: {CURRENCY_LONG}/ano{}Capacidade: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Custo: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocidade: {VELOCITY} Potencia: {POWER} Esforzo tractor máximo: {6:FORCE}{}Custo operativo: {4:CURRENCY_LONG}/ano{}Capacidade: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Velocidade máxima: {VELOCITY}{}Capacidade: {CARGO_LONG}, {CARGO_LONG}{}Custo operativo: {CURRENCY_LONG}/ano -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Velocidade máxima: {VELOCITY}{}Capacidade: {CARGO_LONG}{}Custo operativo: {CURRENCY_LONG}/ano -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Custo: {CURRENCY_LONG} Velocidade máxima: {VELOCITY} Autonomía: {COMMA} cadros{}Capacidade: {CARGO_LONG}, {CARGO_LONG}{}Custo operativo: {CURRENCY_LONG}/ano -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Velocidade máxima: {VELOCITY} Autonomía: {COMMA} cadros{}Capacidade: {CARGO_LONG}{}Custo operativo: {CURRENCY_LONG}/ano +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Velocidade máxima: {VELOCITY}{}Capacidade: {CARGO_LONG}{}Custo operativo: {CURRENCY_LONG}/ano +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Vel. Máxima: {VELOCITY}{}Tipo aeronave: {STRING}{}Capacidade: {CARGO_LONG}, {CARGO_LONG}{}Custo operativo: {CURRENCY_LONG}/ano +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Vel. Máxima: {VELOCITY}{}Tipo aeronave: {STRING}{}Capacidade: {CARGO_LONG}{}Custo operativo: {CURRENCY_LONG}/ano +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Vel. Máxima: {VELOCITY}{}Tipo aeronave: {STRING} Distancia: {COMMA} tiles{}Capacidade: {CARGO_LONG}, {CARGO_LONG}{}Custo operativo: {CURRENCY_LONG}/ano +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Vel. Máxima: {VELOCITY}{}Tipo Aeronave: {STRING} Autonomía: {COMMA} tiles{}Capacidade: {CARGO_LONG}{}Custo Operativo: {CURRENCY_LONG}/ano # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Substituír {STRING} - {STRING} @@ -3504,10 +3567,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} cando STR_REPLACE_VEHICLES_STOP :{BLACK}Parar de substituír vehículos STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Presiona para parar a substitución do tipo de máquina seleccionada na esquerda -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Substituíndo: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Cambia entre as fiestras de substitución de locomotoras e vagóns STR_REPLACE_ENGINES :Locomotoras STR_REPLACE_WAGONS :Vagóns +STR_REPLACE_ALL_RAILTYPE :Todos os vehículos sobre raíl STR_REPLACE_HELP_RAILTYPE :{BLACK}Selecciona o tipo de carril para o que queres substituír as locomotoras STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Mostra que máquina seleccionada á esquerda vai ser substituída, se é algunha. @@ -3600,7 +3663,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} ano{P " STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} ano{P "" s} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Velocidade máxima: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Velocidade máxima: {LTBLUE}{VELOCITY} {BLACK}Autonomía: {LTBLUE}{COMMA} cadros +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Vel. máxima: {LTBLUE}{VELOCITY} {BLACK}Tipo de aeronave: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Vel. máxima: {LTBLUE}{VELOCITY} {BLACK}Tipo de aeronave: {LTBLUE}{STRING} {BLACK}Alcance: {LTBLUE}{COMMA} cadros STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potencia: {LTBLUE}{POWER}{BLACK} Velocidade máxima: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potencia: {LTBLUE}{POWER}{BLACK} Velocidade máxima: {LTBLUE}{VELOCITY} {BLACK}T.E. máx.: {LTBLUE}{FORCE} @@ -3845,6 +3909,10 @@ STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :Viaxar (sen hor STR_TIMETABLE_TRAVEL_NOT_TIMETABLED_SPEED :Viaxar polo menos a {2:VELOCITY} (sen horarios) STR_TIMETABLE_TRAVEL_FOR :Viaxar durante {STRING} STR_TIMETABLE_TRAVEL_FOR_SPEED :Viaxar por {STRING} polo menos a {VELOCITY} +STR_TIMETABLE_TRAVEL_FOR_ESTIMATED :Viaxe (para {STRING}, non calendarizada) +STR_TIMETABLE_TRAVEL_FOR_SPEED_ESTIMATED :Viaxe (para {STRING}, non calendarizado) con como máximo {VELOCITY} +STR_TIMETABLE_STAY_FOR_ESTIMATED :(permanece por {STRING}, non calendarizado) +STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(viaxe para {STRING}, sen calendarizar) STR_TIMETABLE_STAY_FOR :e parar durante {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :e viaxar durante {STRING} STR_TIMETABLE_DAYS :{COMMA} día{P "" s} @@ -3915,7 +3983,7 @@ STR_AI_DEBUG_CONTINUE :{BLACK}Continua STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}Quita-la pausa e continua-la IA STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}Ve-la saída da depuración desta IA STR_AI_GAME_SCRIPT :{BLACK}Script do xogo -STR_AI_GAME_SCRIPT_TOOLTIP :BLACK}Comproba o log do script do xogo +STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}Comproba o log do script do xogo STR_ERROR_AI_NO_AI_FOUND :Non se atopou ningunha IA adecuada para cargar.{} Esta IA é parva e non vai facer nada.{}Podes descargar varias IAs no sistema de contidos online. STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Fallou unha das IA en execución. Por favor, informa ao autor desta IA cunha captura da Fiestra de Depuración de IA. @@ -3930,7 +3998,7 @@ STR_AI_CONFIG_RANDOM_AI :IA aleatoria STR_AI_CONFIG_NONE :(ningunha) STR_AI_CONFIG_MOVE_UP :{BLACK}Subir -STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Mover a IA seleccionada hacia arriba na lista +STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Mover a IA seleccionada cara arriba na lista STR_AI_CONFIG_MOVE_DOWN :{BLACK}Baixar STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Mover a IA seleccionada hacia abaixo na lista @@ -3974,6 +4042,8 @@ STR_AI_SETTINGS_START_DELAY :Número de día STR_TEXTFILE_README_CAPTION :{WHITE} "readme" de {STRING} {STRING} STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}Rexistro de cambios de {STRING} {STRING} STR_TEXTFILE_LICENCE_CAPTION :{WHITE} licenza de {STRING}{STRING} +STR_TEXTFILE_WRAP_TEXT :{WHITE}Axustar texto +STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Axusta o texto á fiestra de xeito que encaixa sen ter que facer scroll STR_TEXTFILE_VIEW_README :{BLACK}Ver "readme" STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Rexistro de cambios STR_TEXTFILE_VIEW_LICENCE :{BLACK}Licenza @@ -4153,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... @@ -4301,6 +4370,7 @@ STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... xa STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Non se pode crear o grupo... STR_ERROR_GROUP_CAN_T_DELETE :{WHITE}Non se pode eliminar este grupo... STR_ERROR_GROUP_CAN_T_RENAME :{WHITE}Non se pode renomear o grupo... +STR_ERROR_GROUP_CAN_T_SET_PARENT :{WHITE}Non se pode establecer o grupo superior... STR_ERROR_GROUP_CAN_T_REMOVE_ALL_VEHICLES :{WHITE}Non se pode borrar tódolos vehículos deste grupo... STR_ERROR_GROUP_CAN_T_ADD_VEHICLE :{WHITE}Non se pode engadir o vehículo a este grupo... STR_ERROR_GROUP_CAN_T_ADD_SHARED_VEHICLE :{WHITE}Non se poden engadir vehículos compartidos ó grupo... @@ -4356,6 +4426,8 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Non se p STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... o vehículo está destruído +STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Non haberá vehículos dispoñibles +STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Cambia a túa configuración NewGRF STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Aínda non hai vehículos dispoñíbeis STR_ERROR_NO_VEHICLES_AVAILABLE_YET_EXPLANATION :{WHITE}Comezar unha partida nova a partires de {DATE_SHORT} ou empregar un NewGRF que proporcione vehículos antigos diff --git a/src/lang/german.txt b/src/lang/german.txt index ac0dbe7e11..cd117258b4 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -670,10 +670,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Programm STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Zufällige Wiedergabe ein/aus STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Zeige Musiktitelauswahl -STR_ERROR_NO_SONGS :{WHITE}Ein Musikset ohne Musikdateien wurde ausgewählt. Es kann folglich nichts abgespielt werden. - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Musik-Programmauswahl STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Track Inhalt STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Programm - '{STRING}' @@ -1338,8 +1335,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Farbe von Landf STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Grün STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Dunkelgrün STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Lila -STR_CONFIG_SETTING_REVERSE_SCROLLING :Scrollrichtung invertieren: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Legt das Verhalten beim Scrollen der Karte mit der rechten Maustaste fest. Ist diese Option aktiviert, bewegt sich der sichtbare Kartenausschnitt in Mausrichtung. Ist sie deaktiviert, bewegt sich die Karte entgegen der Mausrichtung STR_CONFIG_SETTING_SMOOTH_SCROLLING :Weicher Bildlauf beim Springen zu einer Position: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Lege fest, auf welche Weise die Hauptansicht an eine bestimmte Position wechselt (z.B. wenn ein Punkt auf der Weltkarte angeklickt wird oder der Standort eines Bahnhofs angezeigt werden soll). Ist diese Option eingeschaltet, schwenkt die Ansicht über die Karte, bis sie am gewünschten Punkt angekommen ist. Ist sie ausgeschaltet, springt die Ansicht sofort an die gewünschte Position STR_CONFIG_SETTING_MEASURE_TOOLTIP :Beim Bauen Tooltip mit Abmessungen anzeigen: {STRING} @@ -1371,8 +1366,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Kommando+Klick STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Strg+Klick STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Aus -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Scrollen mit linker Maustaste: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Scrolle die Karte, indem mit der linken Maustaste gezogen wird. Dies ist besonders sinnvoll, wenn ein Touchscreen zum Scrollen genutzt wird +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Fenster mit Rechtsklick schließen: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Schließt ein Fenster mittels Rechts-Klick. Schaltet Tooltip mit Rechts-Klick ab! STR_CONFIG_SETTING_AUTOSAVE :Autosave: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Wähle das Interval zwischen automatischen Speicherungen @@ -1762,6 +1757,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Prüfe, STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Zeige KI- und Skripteinstellungen STR_INTRO_TOOLTIP_QUIT :{BLACK}OpenTTD beenden +STR_INTRO_BASESET :{BLACK}Dem momentan ausgewählten Basisgrafiken fehl{P 0 "t" "en"} {NUM} Sprite{P 0 "" s}. Bitte überprüfe, ob es Updates für die Basisgrafiken gibt. STR_INTRO_TRANSLATION :{BLACK}Dieser Übersetzung fehl{P 0 t en} {NUM} String{P "" s}. Bitte hilf, OpenTTD zu verbessern und melde Dich als Übersetzer an. Siehe readme.txt für weitere Details. # Quit window @@ -2590,6 +2586,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Name des STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Angenommene Frachtarten: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Gleistyp: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Höchstgeschwindigkeit Schiene: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Höchstgeschwindigkeit Straße: {LTBLUE}{VELOCITY} @@ -2602,29 +2599,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Ackerland STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Schneebedecktes Land STR_LAI_CLEAR_DESCRIPTION_DESERT :Wüste -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING}: Gleise -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING}: Gleise mit Blocksignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING}: Gleise mit Vorsignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING}: Gleise mit Ausfahrtsignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING}: Gleise mit Kombinationssignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING}: Gleise mit Pfadsignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING}: Gleise mit einseitigem Pfadsignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING}: Gleise mit Block- und Vorsignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING}: Gleise mit Block- und Ausfahrtsignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING}: Gleise mit Block- und Kombinationssignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING}: Gleise mit Block- und Pfadsignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING}: Gleise mit Blocksignal und einseitigem Pfadsignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING}: Gleise mit Vor- und Ausfahrtsignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING}: Gleise mit Vor- und Kombinationssignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING}: Gleise mit Vor- und Pfadsignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING}: Gleise mit Vorsignal und einseitigem Pfadsignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING}: Gleise mit Ausfahrts- und Kombinationssignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING}: Gleise mit Ausfahrts- und Pfadsignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING}: Gleise mit Ausfahrtssignal und einseitigem Pfadsignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING}: Gleise mit Kombinations- und Pfadsignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING}: Gleise mit Kombinationssignal und einseitigem Pfadsignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING}: Gleise mit Pfadsignal und einseitigem Pfadsignal -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING}: Zugdepot +STR_LAI_RAIL_DESCRIPTION_TRACK :Schienen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Schienen: Gleise mit Blocksignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Schienen: Gleise mit Vorsignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Schienen: Gleise mit Ausfahrtsignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Schienen: Gleise mit Kombinationssignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Schienen: Gleise mit Pfadsignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Schienen: Gleise mit einseitigem Pfadsignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Schienen: Gleise mit Block- und Vorsignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Schienen: Gleise mit Block- und Ausfahrtsignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Schienen: Gleise mit Block- und Kombinationssignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Schienen: Gleise mit Block- und Pfadsignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Schienen: Gleise mit Blocksignal und einseitigem Pfadsignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Schienen: Gleise mit Vor- und Ausfahrtsignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Schienen mit Vor- und Kombinationssignalen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Schienen: Gleise mit Vor- und Pfadsignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Schienen: Gleise mit Vorsignal und einseitigem Pfadsignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Schienen: Gleise mit Ausfahrts- und Kombinationssignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Schienen: Gleise mit Ausfahrts- und Pfadsignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Schienen: Gleise mit Ausfahrtssignal und einseitigem Pfadsignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Schienen: Gleise mit Kombinations- und Pfadsignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Schienen: Gleise mit Kombinationssignal und einseitigem Pfadsignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Schienen: Gleise mit Pfadsignal und einseitigem Pfadsignal +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Schienen: Zugdepot STR_LAI_ROAD_DESCRIPTION_ROAD :Straße STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Straße mit Laternen @@ -2688,7 +2685,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Firmeneigenes G STR_ABOUT_OPENTTD :{WHITE}OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Transport Tycoon-Urheberrecht {COPYRIGHT} 1995 Chris Sawyer, alle Rechte vorbehalten STR_ABOUT_VERSION :{BLACK}OpenTTD-Version {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 OpenTTD-Team +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 @@ -2876,6 +2880,7 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Vorherig STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Gehe zum vorherigen normalen Sprite und überspringe alle Pseudo-, Recolour- und Schriftsprites (springt ggf. vom letzten bis zum ersten Sprite) STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Darstellung des aktuellen Sprites. Die Ausrichtung wird beim Zeichnen des Sprites ignoriert STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Bewege die Sprites und ändere dadurch die X- und Y-Offsets. Drücke Strg+Click um die Sprites 8 Blöcke weit zu bewegen. +STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Setze zurück STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Setze die aktuelle Verschiebung zurück. STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X offset: {NUM}, Y offset: {NUM} (Absolut) STR_SPRITE_ALIGNER_OFFSETS_REL :{BLACK}X offset: {NUM}, Y offset: {NUM} (Relativ) @@ -2906,8 +2911,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Zugriff auf ein STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} enthält fehlerhafte Grafiken. Diese werden als Fragezeichen (?) dargestellt STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Enthält mehrere Action 8 - Einträge (Sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Lesezugriff über das Ende des Pseudosprites hinaus (Sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Den momentan verwendeten Basisgrafiken fehlen Sprites.{}Durch ein Update der Basisgrafiken kann dieser Fehler behoben werden -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Den momentan verwendeten Basisgrafiken fehlen einige Sprites.{}Bitte update die Basisgrafiken.{}Weil dieses eine {YELLOW}Entwickler-Version von OpenTTD{WHITE} ist, ist es möglich, dass auch eine {YELLOW}Entwickler-Version der Basisgrafiken{WHITE} benötigt wird. STR_NEWGRF_ERROR_GRM_FAILED :Die angeforderte GRF-Ressource ist nicht verfügbar (Sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} wurde von {STRING} deaktiviert STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Ungültiges oder unbekanntes Format für Spritelayout (Sprite {3:NUM}) @@ -2982,8 +2985,6 @@ STR_TOWN_POPULATION :{BLACK}Weltbev STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Großstadt) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Einwohner: {ORANGE}{COMMA}{BLACK} Häuser: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Passagiere im letzten Monat: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Postsäcke im letzten Monat: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Für Stadtwachstum benötigte Fracht: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} benötigt STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} im Winter benötigt @@ -3114,8 +3115,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Angenomm STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Zeige Liste der angenommenen Frachtarten STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Nimmt an: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Diese Station hat in der zugehörigen Stadt exklusive Transportrechte . -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} hat die exklusiven Transportrechte in dieser Stadt erworben. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Diese Station hat in der zugehörigen Stadt exklusive Transportrechte . +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} hat die exklusiven Transportrechte in dieser Stadt erworben. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Bewertung STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Stationsbewertung anzeigen @@ -3294,9 +3295,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Benötig STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Benötigt: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}benötigt: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} wartend{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Zur Verarbeitung bereitstehende Fracht: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produziert: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Produziert: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3363,13 +3366,18 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Liste leeren STR_GROUP_RENAME_CAPTION :{BLACK}Gruppe umbenennen +STR_GROUP_PROFIT_THIS_YEAR :Gewinn in diesem Jahr: +STR_GROUP_PROFIT_LAST_YEAR :Gewinn im letzten Jahr: +STR_GROUP_OCCUPANCY :Aktuelle Nutzung: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Neue Schienenfahrzeuge STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Neue elektrische Schienenfahrzeuge STR_BUY_VEHICLE_TRAIN_MONORAIL_CAPTION :Neue Einschienenbahnfahrzeuge STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :Neue Magnetbahnfahrzeuge -STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Neue Eisenbahnfahrzeuge +STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Neue Schienenfahrzeuge STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Neue Fahrzeuge STR_BUY_VEHICLE_SHIP_CAPTION :Neue Schiffe STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Neue Flugzeuge @@ -3394,6 +3402,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Alle Frachtarte STR_PURCHASE_INFO_ALL_BUT :Alles außer {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Max. Zugkraft: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Reichweite: {GOLD}{COMMA} Felder +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Flugzeugtyp: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Schienenfahrzeugsliste - Einzelheiten durch Anklicken des Fahrzeuges. Strg+Klick schaltet um zwischen Verstecken und Zeigen des Fahrzeugtyps STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Straßenfahrzeugsliste - Klicke auf ein Fahrzeug für Einzelheiten. Strg+Klick schaltet um zwischen Verstecken und Zeigen des Fahrzeugtyps @@ -3527,10 +3536,11 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :{G=w}Magnetschw STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Kosten: {CURRENCY_LONG} Gewicht: {WEIGHT_SHORT}{}Geschwindigk.: {VELOCITY} Leistung: {POWER}{}Betriebskosten: {CURRENCY_LONG} pro Jahr{}Kapazität: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Preis: {CURRENCY_LONG} Gewicht: {WEIGHT_SHORT}{}Max. Geschwindigkeit: {VELOCITY} Leistung: {POWER} Max. Zugkraft: {6:FORCE}{}Betriebskosten: {4:CURRENCY_LONG}/yr{}Kapazität: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Preis: {CURRENCY_LONG} Höchstgeschw.: {VELOCITY}{}Kapazität: {CARGO_LONG}, {CARGO_LONG}{}Betriebskosten: {CURRENCY_LONG}/yr -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Preis: {CURRENCY_LONG} Höchstgeschw.: {VELOCITY}{}Kapazität: {CARGO_LONG}{}Betriebskosten: {CURRENCY_LONG}/Jahr -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Kosten: {CURRENCY_LONG} Höchstgeschwindigkeit: {VELOCITY} Reichweite: {COMMA} Felder{}Kapazität: {CARGO_LONG}, {CARGO_LONG}{}Betriebskosten: {CURRENCY_LONG}/a -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Kosten: {CURRENCY_LONG} Höchstgeschwindigkeit: {VELOCITY} Reichweite: {COMMA} Felder{}Kapazität: {CARGO_LONG}{}Betriebskosten: {CURRENCY_LONG}/a +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Preis: {CURRENCY_LONG} Höchstgeschw.: {VELOCITY}{}Kapazität: {CARGO_LONG}{}Betriebskosten: {CURRENCY_LONG}/Jahr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Kosten: {CURRENCY_LONG} Max. Geschw.: {VELOCITY}{}Flugzeugtyp: {STRING}{}Kapazität: {CARGO_LONG}, {CARGO_LONG}{}Betriebskosten: {CURRENCY_LONG}/Jahr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Kosten: {CURRENCY_LONG} Max. Geschw.: {VELOCITY}{}Flugzeugtyp: {STRING}{}Kapazität: {CARGO_LONG}{}Betriebskosten: {CURRENCY_LONG}/Jahr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Kosten: {CURRENCY_LONG} Max. Geschw.: {VELOCITY}{}Flugzeugtyp: {STRING} Reichweite: {COMMA} Felder{}Capacity: {CARGO_LONG}, {CARGO_LONG}{}Betriebskosten: {CURRENCY_LONG}/Jahr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Kosten: {CURRENCY_LONG} Max. Geschw.: {VELOCITY}{}Flugzeugtyp: {STRING} Reichweite: {COMMA} tiles{}Kapazität: {CARGO_LONG}{}Laufende Kosten: {CURRENCY_LONG}/yr # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}{STRING} ersetzen - {STRING} @@ -3557,14 +3567,14 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} wenn a STR_REPLACE_VEHICLES_STOP :{BLACK}Fahrzeugersetzung aus STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Klick zum Abbrechen der Ersetzung des Fahrzeugtyps auf der linken Seite -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Ersetzen: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Umschalter für Lok- oder Waggonersetzung STR_REPLACE_ENGINES :Schienenfahrzeuge STR_REPLACE_WAGONS :Waggons +STR_REPLACE_ALL_RAILTYPE :Alle Schienenfahrzeuge STR_REPLACE_HELP_RAILTYPE :{BLACK}Gleistyp auswählen, für den Loks ersetzt werden sollen STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Hier wird angezeigt, gegen welches Fahrzeug das auf der linken Seite gewählte ersetzt wird -STR_REPLACE_RAIL_VEHICLES :Eisenbahn +STR_REPLACE_RAIL_VEHICLES :Schienenfahrzeuge STR_REPLACE_ELRAIL_VEHICLES :elektrische Schienenfahrzeuge STR_REPLACE_MONORAIL_VEHICLES :Einschienenbahn STR_REPLACE_MAGLEV_VEHICLES :Magnetschwebebahn @@ -3653,7 +3663,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} Jahr{P STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} Jahr{P "" e} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Max. Geschw.: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Max. Geschwindigkeit: {LTBLUE}{VELOCITY} {BLACK}Reichweite: {LTBLUE}{COMMA} Felder +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Max. Geschw.: {LTBLUE}{VELOCITY} {BLACK}Flugzeugtyp: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Max. Geschw.: {LTBLUE}{VELOCITY} {BLACK}Flugzeugtyp: {LTBLUE}{STRING} {BLACK}Reichweite: {LTBLUE}{COMMA} Felder STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Gewicht: {LTBLUE}{WEIGHT_SHORT} {BLACK}Leistung: {LTBLUE}{POWER}{BLACK} Max. Geschw.: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Gewicht: {LTBLUE}{WEIGHT_SHORT} {BLACK}Leistung: {LTBLUE}{POWER}{BLACK} Max. Geschw.: {LTBLUE}{VELOCITY} {BLACK}Max. Zugkraft: {LTBLUE}{FORCE} @@ -4212,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 73303c3396..5b5cd91621 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -31,11 +31,10 @@ STR_JUST_NOTHING :Τίποτα STR_CARGO_PLURAL_NOTHING : STR_CARGO_PLURAL_PASSENGERS :{G=m}Επιβάτες STR_CARGO_PLURAL_PASSENGERS.geniki :Επιβάτη -STR_CARGO_PLURAL_COAL :{G=m}Άνθρακες -STR_CARGO_PLURAL_COAL.geniki :Άνθρακων +STR_CARGO_PLURAL_COAL :{G=m}Άνθρακας STR_CARGO_PLURAL_MAIL :{G=f}Αλληλογραφία STR_CARGO_PLURAL_MAIL.geniki :Αλληλογραφίας -STR_CARGO_PLURAL_OIL :{G=n}Πετρέλαια +STR_CARGO_PLURAL_OIL :{G=n}Πετρέλαιo STR_CARGO_PLURAL_OIL.geniki :Πετρελαίου STR_CARGO_PLURAL_LIVESTOCK :{G=n}Ζώα STR_CARGO_PLURAL_LIVESTOCK.geniki :Ζώων @@ -97,7 +96,6 @@ STR_CARGO_SINGULAR_NOTHING : STR_CARGO_SINGULAR_PASSENGER :{G=m}Επιβάτης STR_CARGO_SINGULAR_PASSENGER.subs :Επιβάτες STR_CARGO_SINGULAR_COAL :{G=m}Άνθρακας -STR_CARGO_SINGULAR_COAL.subs :Άνθρακες STR_CARGO_SINGULAR_MAIL :{G=f}Αλληλογραφία STR_CARGO_SINGULAR_MAIL.subs :Αλληλογραφία STR_CARGO_SINGULAR_OIL :{G=n}Πετρέλαιο @@ -348,7 +346,7 @@ STR_SORT_BY_TYPE :Τύπος STR_SORT_BY_TRANSPORTED :Μεταφέρθηκαν STR_SORT_BY_NUMBER :Αριθμός STR_SORT_BY_PROFIT_LAST_YEAR :Κέρδος προηγούμενου χρόνου -STR_SORT_BY_PROFIT_THIS_YEAR :Κέρδος αυτού του χρόνου +STR_SORT_BY_PROFIT_THIS_YEAR :Κέρδος τρέχοντος έτους STR_SORT_BY_AGE :Ηλικία STR_SORT_BY_RELIABILITY :Αξιοπιστία STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :Συνολική χωρητικότητα ανά τύπο φορτίου @@ -371,7 +369,7 @@ STR_SORT_BY_INTRO_DATE :Ημερομη STR_SORT_BY_RUNNING_COST :Λειτουργικό κόστος STR_SORT_BY_POWER_VS_RUNNING_COST :Ισχύς/Λειτουργικό κόστος STR_SORT_BY_CARGO_CAPACITY :Χωρητικότητα φορτίου -STR_SORT_BY_RANGE :Εύρος +STR_SORT_BY_RANGE :Εμβέλεια STR_SORT_BY_POPULATION :Πληθυσμός STR_SORT_BY_RATING :Εκτίμηση @@ -413,7 +411,7 @@ STR_SCENEDIT_TOOLBAR_OPENTTD :{YELLOW}OpenTTD STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR :{YELLOW}Πρόγραμμα Επεξεργασίας Σεναρίου STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD :{BLACK}Μετακίνηση ημ/νίας εκκίνησης 1 χρόνο πίσω STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD :{BLACK}Μετακινήστε την ημερομηνία εκκίνησης 1 χρόνο μπροστά -STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE :{BLACK}Κάντε κλικ εδώ για να εισάγετε την χρονιά έναρξης +STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE :{BLACK}Πατήστε εδώ για να εισάγετε την χρονιά έναρξης STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Εμφάνιση χάρτη, καταλόγου πόλεων STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Δημιουργία τοπίου STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Δημιουργία πόλης @@ -698,7 +696,7 @@ STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Εμφά # Graph key window STR_GRAPH_KEY_CAPTION :{WHITE}Γραφήματα κλειδιού εταιρίας -STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Κάντε κλικ εδώ για εναλλαγή εμφάνισης της εταιρίας στο γράφημα +STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Πατήστε εδώ για εναλλαγή εμφάνισης της εταιρίας στο γράφημα # Company league window STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Πίνακας Πρωταθλήματος Εταιριών @@ -733,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 τριμήνων @@ -759,6 +757,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}Τίτλος @@ -778,17 +777,17 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Επιλ STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Εναλλαγή τυχαίας αναπαραγωγής on/off στο πρόγραμμα STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Εμφάνιση παραθύρου επιλογής μουσικού κομματιού -STR_ERROR_NO_SONGS :{WHITE}Επιλέχτηκε σετ μουσικής χωρίς τραγούδια. Κανένα τραγούδι δεν θα παιχτεί - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Επιλογή Μουσικού Προγράμματος +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}' STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Καθαρισμός +STR_PLAYLIST_CHANGE_SET :{BLACK}Αλλαγή σετ STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Καθαρισμός τρέχοντος προγράμματος (μόνο Προσαρμοσμένο 1 ή Προσαρμοσμένο 2) -STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Κάντε κλικ στο μουσικό κομμάτι για προσθήκη στο τρέχον πρόγραμμα (Προσαρμοσμένο1 ή Προσαρμοσμένο2 μόνο) -STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Κάντε κλικ στο τραγούδι για να το αφαιρέσετε από το πρόγραμμα (Προσαρμοσμένο 1 ή 2 μόνο) +STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Αλλαγή μουσικής επιλογής σε άλλο εγκατεστημένο σετ +STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Πατήστε στο μουσικό κομμάτι για προσθήκη στο τρέχον πρόγραμμα (Προσαρμοσμένο1 ή Προσαρμοσμένο2 μόνο) +STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Πατήστε στο τραγούδι για να το αφαιρέσετε από το πρόγραμμα (Προσαρμοσμένο 1 ή 2 μόνο) # Highscore window STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Οι καλύτερες εταιρίες που έφτασαν το {NUM} @@ -989,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 @@ -1280,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} @@ -1325,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 :μακρινό άκρο @@ -1346,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} @@ -1446,8 +1445,12 @@ 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_REVERSE_SCROLLING :Ανάποδη μετακίνηση οθόνης: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Συμπεριφορά όταν κυλίεται ο χάρτης με το δεξί κουμπί του ποντικιού. Όταν είναι απενεργοποιημένη, το ποντίκι μετακινεί την κάμερα. Όταν είναι ενεργοποιημένη, το ποντίκι μετακινεί τον χάρτη +STR_CONFIG_SETTING_SCROLLMODE :Συμπεριφορά κύλισης του παραθύρου εμφάνισης: {STRING} +STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Συμπεριφορά κατά την κύλιση του χάρτη +STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Μετακίνηση μικρού χάρτη με ΔΠΠ, θέση ποντικιού κλειδωμένη +STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Μετακίνηση χάρτη με ΔΠΠ, θέση ποντικιού κλειδωμένη +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} @@ -1479,8 +1482,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+Κλι STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Control+Κλικ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Απενεργοποιημένος -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Μετάβαση με αριστερό κλικ: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Ενεργοποίηση της κύλισης του χάρτη σύροντας τον με το αριστερό κουμπί του ποντικιού. Αυτό είναι ιδιαίτερα χρήσιμο για την κύλιση όταν χρησιμοποιείται οθόνη αφής +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 :Επιλέξτε το διάστημα ανάμεσα σε δυο διαδοχικά σωσίματα του παιχνιδιου @@ -1504,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} @@ -1514,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} @@ -1541,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} @@ -1550,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} @@ -1571,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} @@ -1584,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 :Ενεργοποιώντας αυτήν την ρύθμιση απενεργοποιείται η ανάγκη ηλεκτροδότησης των σιδηροτροχιών για να μπορέσουν σε αυτές να λειτουργήσουν οι ηλεκτρικές μηχανές @@ -1647,7 +1650,7 @@ STR_CONFIG_SETTING_DEFAULT_SIGNAL_NORMAL :Σηματοδ STR_CONFIG_SETTING_DEFAULT_SIGNAL_PBS :Σηματοδότες τροχιάς STR_CONFIG_SETTING_DEFAULT_SIGNAL_PBSOWAY :Σηματοδότες μονόδρομης τροχιάς STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Περιήγηση στους τύπους σηματοδότησης: {STRING} -STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Επιλέξτε τους τύπους σημάτων μεταξύ των οποίων θα γίνονται οι αλλαγές, όταν κάνετε κλικ σε ένα τοποθετημένο σήμα κρατώντας πατημένο το Ctrl +STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Επιλέξτε τους τύπους σημάτων μεταξύ των οποίων θα γίνονται οι αλλαγές, όταν πατάτε σε ένα τοποθετημένο σήμα κρατώντας πατημένο το Ctrl STR_CONFIG_SETTING_CYCLE_SIGNAL_NORMAL :Μόνο σηματοδότες τμήματος STR_CONFIG_SETTING_CYCLE_SIGNAL_PBS :Μόνο σηματοδότες τροχιάς STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Όλοι @@ -1802,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}Αλλαγή τιμής ρύθμισης @@ -1870,6 +1873,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Έλεγ STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Εμφάνιση ρυθμίσεων για AI και της δέσμης ενεργειών του παιχνιδιού STR_INTRO_TOOLTIP_QUIT :{BLACK}Έξοδος από το «OpenTTD» +STR_INTRO_BASESET :{BLACK}Λείπουν {NUM} sprite{P "" s} από το επιλεγμένο βασικό σετ γραφικών. Παρακαλούμε ελέγξτε για ενημερώσεις του βασικού σετ. STR_INTRO_TRANSLATION :{BLACK}Λείπουν {NUM} παράμετροι από τη μετάφραση. Παρακαλούμε βοηθήστε να κάνουμε το OpenTTD καλύτερο εγγραφόμενοι ως μεταφραστές. Δείτε το αρχείο readme.txt για λεπτομέρειες. # Quit window @@ -1924,7 +1928,7 @@ STR_LIVERY_SHIP_TOOLTIP :{BLACK}Εμφά STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Εμφάνιση χρωματικών μοτίβων αεροσκαφών STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Επιλογή του βασικού χρώματος για το επιλεγμένο θέμα. Με Ctrl+Κλικ ορίζεται το χρώμα σε κάθε θέμα STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Επιλογή του δευτερεύοντος χρώματος για το επιλεγμένο μοτίβο. Με Ctrl+Κλικ ορίζεται το χρώμα για κάθε θέμα -STR_LIVERY_PANEL_TOOLTIP :{BLACK}Επιλέξτε το χρωματικό μοτίβο για αλλαγή ή πολλαπλά μοτίβα με Ctrl+Κλικ. Κάντε κλικ στο κουτάκι για να επιλέξετε τη χρήση του μοτίβου +STR_LIVERY_PANEL_TOOLTIP :{BLACK}Επιλέξτε το χρωματικό μοτίβο για αλλαγή ή πολλαπλά μοτίβα με Ctrl+Κλικ. Πατήστε στο κουτάκι για να επιλέξετε τη χρήση του μοτίβου STR_LIVERY_DEFAULT :Πρότυπο Μοτίβου Χρωμάτων STR_LIVERY_STEAM :Ατμοκίνητη Μηχανή @@ -1984,8 +1988,8 @@ STR_FACE_SELECT_AFRICAN :{BLACK}Επιλ STR_FACE_YES :Ναι STR_FACE_NO :Όχι STR_FACE_MOUSTACHE_EARRING_TOOLTIP :{BLACK}Ενεργοποίηση μουστακιού ή σκουλαρικιού -STR_FACE_HAIR :Μαλλί: -STR_FACE_HAIR_TOOLTIP :{BLACK}Αλλάξτε μαλλί +STR_FACE_HAIR :Μαλλιά: +STR_FACE_HAIR_TOOLTIP :{BLACK}Αλλάξτε μαλλιά STR_FACE_EYEBROWS :Φρύδια: STR_FACE_EYEBROWS_TOOLTIP :{BLACK}Αλλάξτε φρύδια STR_FACE_EYECOLOUR :Χρώμα ματιών: @@ -2024,16 +2028,16 @@ STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION :{BLACK}Συμμ STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION_TOOLTIP :{BLACK}Συμμετέχοντες συνδεδεμένοι / μέγιστος αριθμός συμμετεχόντων{}Εταιρίες συνδεδεμένες / μέγιστος αριθμός εταιριών STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT :{BLACK}{COMMA}x{COMMA} STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Μέγεθος χάρτη -STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Μέγεθος χάρτη του παιχνιδιού{}Κάντε κλικ για ταξινόμηση ανά περιοχή +STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Μέγεθος χάρτη του παιχνιδιού{}Πατήστε για ταξινόμηση ανά περιοχή STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Ημερομηνία STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Τρέχουσα ημερομηνία STR_NETWORK_SERVER_LIST_YEARS_CAPTION :{BLACK}Χρόνια STR_NETWORK_SERVER_LIST_YEARS_CAPTION_TOOLTIP :{BLACK}Αριθμός χρόνων{}που τρέχει το παιχνίδι STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Γλώσσα, έκδοση διακομιστή, κλπ. -STR_NETWORK_SERVER_LIST_CLICK_GAME_TO_SELECT :{BLACK}Κάντε κλικ σε ένα παιχνίδι από τη λίστα για το επιλέξετε +STR_NETWORK_SERVER_LIST_CLICK_GAME_TO_SELECT :{BLACK}Πατήστε σε ένα παιχνίδι από τη λίστα για το επιλέξετε STR_NETWORK_SERVER_LIST_LAST_JOINED_SERVER :{BLACK}Ο διακομιστής που συμμετείχατε την τελευταία φορά: -STR_NETWORK_SERVER_LIST_CLICK_TO_SELECT_LAST :{BLACK}Κάντε κλικ για να επιλέξετε το διακομιστή που συμμετείχατε την τελευταία φορά +STR_NETWORK_SERVER_LIST_CLICK_TO_SELECT_LAST :{BLACK}Πατήστε για να επιλέξετε το διακομιστή που συμμετείχατε την τελευταία φορά STR_NETWORK_SERVER_LIST_GAME_INFO :{SILVER}ΠΛΗΡΟΦΟΡΙΕΣ ΠΑΙΧΝΙΔΙΟΥ STR_NETWORK_SERVER_LIST_CLIENTS :{SILVER}Συμμετέχοντες:: {WHITE}{COMMA} / {COMMA} - {COMMA} / {COMMA} @@ -2306,7 +2310,7 @@ STR_CONTENT_TYPE_CAPTION :{BLACK}Τύπο STR_CONTENT_TYPE_CAPTION_TOOLTIP :{BLACK}Τύπος περιεχόμενου STR_CONTENT_NAME_CAPTION :{BLACK}Όνομα STR_CONTENT_NAME_CAPTION_TOOLTIP :{BLACK}Το όνομα του περιεχομένου -STR_CONTENT_MATRIX_TOOLTIP :{BLACK}Κάντε κλικ σε μια γραμμή για να δείτε λεπτομέρειες{}Κάντε κλικ στο κουτάκι για το επιλέξετε για κατέβασμα +STR_CONTENT_MATRIX_TOOLTIP :{BLACK}Πατήστε σε μια γραμμή για να δείτε λεπτομέρειες{}Πατήστε στο κουτάκι για το επιλέξετε για κατέβασμα STR_CONTENT_SELECT_ALL_CAPTION :{BLACK}Επιλογή όλων STR_CONTENT_SELECT_ALL_CAPTION_TOOLTIP :{BLACK}Μαρκάρισμα όλων των περιεχομένων για κατέβασμα STR_CONTENT_SELECT_UPDATES_CAPTION :{BLACK}Επιλέξτε αναβαθμίσεις @@ -2391,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}μη χρησιμοποιημένο @@ -2474,7 +2479,7 @@ STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Σημα STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Συνδυαστικός Σηματοδότης (ηλεκτρικός){}Ο συνδυαστικός σηματοδότης δουλεύει απλά ως σηματοδότης εισόδου και εξόδου ταυτόχρονα. Αυτό σας επιτρέπει το κτίσιμο μεγάλων «δέντρων» με προ-σηματοδότες STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Σηματοδότης Τροχιάς (ηλεκτρικός){}Ένας σηματοδότης τροχιάς επιτρέπει σε περισσότερα από ένα τρένο να είναι σε ένα κομμάτι ελέγχου την ίδια στιγμή, εάν το τρένο μπορεί να δεσμεύσει τροχιά σε ασφαλές σημείο στάσης. Κανονικοί σηματοδότες τροχιάς μπορούν να περαστούν από την πίσω πλευρά STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Μονόδρομος Σηματοδότης Τροχιάς (ηλεκτρικός){}Ένας σηματοδότης τροχιάς επιτρέπει σε περισσότερα από ένα τρένο να είναι σε ένα κομμάτι ελέγχου την ίδια στιγμή, εάν το τρένο μπορεί να δεσμεύσει τροχιά σε ασφαλές σημείο στάσης. Μονόδρομοι σηματοδότες τροχιάς δεν μπορούν να περαστούν από την πίσω πλευρά -STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Μετατροπέας Σηματοδότη{}Όταν επιλέγεται, κάνοντας κλικ σε έναν υπάρχον σηματοδότη θα τον μετατρέψει στον επιλεγμένο τύπο και παραλλαγή σηματοδότη. Με Ctrl+Κλικ εναλλάσσεται με την υπάρχουσα παραλλαγή. Με Shift+Κλικ εμφανίζεται το εκτιμώμενο κόστος μετατροπής +STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Μετατροπέας Σηματοδότη{}Όταν επιλέγεται, πατώντας σε έναν υπάρχωντα σηματοδότη θα τον μετατρέψει στον επιλεγμένο τύπο και παραλλαγή σηματοδότη. Με Ctrl+Κλικ εναλλάσσεται με την υπάρχουσα παραλλαγή. Με Shift+Κλικ εμφανίζεται το εκτιμώμενο κόστος μετατροπής STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}Πυκνότητα σηματοδοτών με σύρσιμο STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}Μείωση πυκνότητας σηματοδοτών με σύρσιμο STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Αύξηση πυκνότητας σηματοδοτών με σύρσιμο @@ -2482,7 +2487,7 @@ STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Αύξη # Bridge selection window STR_SELECT_RAIL_BRIDGE_CAPTION :{WHITE}Επιλογή Γέφυρας STR_SELECT_ROAD_BRIDGE_CAPTION :{WHITE}Επιλογή Γέφυρας Δρόμου -STR_SELECT_BRIDGE_SELECTION_TOOLTIP :{BLACK}Επιλογή γέφυρας - κάντε κλικ στην γέφυρα της προτίμησής σας για κατασκευή +STR_SELECT_BRIDGE_SELECTION_TOOLTIP :{BLACK}Επιλογή γέφυρας - πατήστε στην γέφυρα της προτίμησής σας για κατασκευή STR_SELECT_BRIDGE_INFO :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY_LONG} STR_SELECT_BRIDGE_SCENEDIT_INFO :{GOLD}{STRING},{} {VELOCITY} STR_BRIDGE_NAME_SUSPENSION_STEEL :Ατσάλινη, με Αναρτήσεις @@ -2628,7 +2633,7 @@ STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP :{BLACK}Κάλυ STR_FOUND_TOWN_NAME_TITLE :{YELLOW}Όνομα πόλης: STR_FOUND_TOWN_NAME_EDITOR_TITLE :{BLACK}Εισάγετε το όνομα της πόλης -STR_FOUND_TOWN_NAME_EDITOR_HELP :{BLACK}Κλικ για να δώσετε το όνομα της πόλης +STR_FOUND_TOWN_NAME_EDITOR_HELP :{BLACK}Πατήστε για να δώσετε το όνομα της πόλης STR_FOUND_TOWN_NAME_RANDOM_BUTTON :{BLACK}Τυχαίο όνομα STR_FOUND_TOWN_NAME_RANDOM_TOOLTIP :{BLACK}Δημιουργία ενός τυχαίου ονόματος @@ -2665,8 +2670,8 @@ STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Αλυσ STR_INDUSTRY_CARGOES_PRODUCERS :{WHITE}Βιομηχανίες που παράγουν STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Βιομηχανίες που δέχονται STR_INDUSTRY_CARGOES_HOUSES :{WHITE}Σπιτιά -STR_INDUSTRY_CARGOES_INDUSTRY_TOOLTIP :{BLACK}Κάντε κλικ στη βιομηχανία για να δείτε τους προμηθευτές και τους πελάτες της -STR_INDUSTRY_CARGOES_CARGO_TOOLTIP :{BLACK}{STRING}{}Κάντε κλικ στο εμπόρευμα για να δείτε τους προμηθευτές και τους πελάτες +STR_INDUSTRY_CARGOES_INDUSTRY_TOOLTIP :{BLACK}Πατήστε στη βιομηχανία για να δείτε τους προμηθευτές και τους πελάτες της +STR_INDUSTRY_CARGOES_CARGO_TOOLTIP :{BLACK}{STRING}{}Πατήστε στο εμπόρευμα για να δείτε τους προμηθευτές και τους πελάτες STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Εμφάνιση αλυσίδας STR_INDUSTRY_DISPLAY_CHAIN_TOOLTIP :{BLACK}Εμφάνιση βιομηχανιών προμήθειας και αποδοχής για το εμπόρευμα STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP :{BLACK}Σύνδεση στο μικρό χάρτη @@ -2698,6 +2703,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Όνομ STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Αποδεκτά εμπορεύματα: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Τύπος σιδηροτροχιάς: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Όριο ταχύτητας σιδηροτροχιάς: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Όριο ταχύτητας δρόμου: {LTBLUE}{VELOCITY} @@ -2710,29 +2716,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Χωράφια STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Χιονισμένο έδαφος STR_LAI_CLEAR_DESCRIPTION_DESERT :Έρημος -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} σιδηροτροχιά -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} σιδηροτροχιά με σήματα τμήματος -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} σιδηροτροχιά με σήματα ειδοποίησης -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} σιδηροτροχιά με σήματα εξόδου -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} σιδηροτροχιά με συνδυαστικά σήματα -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} σιδηροτροχιά με σήματα διαδρομής -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} σιδηροτροχιά με σήματα μονόδρομους διαδρομής -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} σιδηροτροχιά με σήματα τμήματος και ειδοποίησης -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} σιδηροτροχιά με σήματα τμήματος και εξόδου -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} σιδηροτροχιά με σήματα τμήματος και συνδυαστικά -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} σιδηροτροχιά με σήματα τμήματος και διαδρομής -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} σιδηροτροχιά με σήματα τμήματος και μονόδρομους διαδρομής -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} σιδηροτροχιά με σήματα ειδοποίησης και εξόδου -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} σιδηροτροχιά με σήματα ειδοποίησης και συνδυαστικά -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} σιδηροτροχιά με σήματα ειδοποίησης και διαδρομής -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} σιδηροτροχιά με σήματα ειδοποίησης και μονόδρομους διαδρομής -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} σιδηροτροχιά με σήματα εξόδου και συνδυαστικά -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} σιδηροτροχιά με σήματα εξόδου και διαδρομής -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} σιδηροτροχιά με σήματα εξόδου και μονόδρομους διαδρομής -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} σιδηροτροχιά με σήματα διαδρομής και συνδυαστικά -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} σιδηροτροχιά σήματα μονόδρομους διαδρομής και συνδυαστικά -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} σιδηροτροχιά με σήματα διαδρομής και μονόδρομους διαδρομής -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} αμαξοστάσιο τρένων +STR_LAI_RAIL_DESCRIPTION_TRACK :Σιδηροδρομική τροχιά +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Σιδηροδρομική τροχιά με σήματα τμήματος +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Σιδηροδρομική τροχιά με σήματα ειδοποίησης +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Σιδηροδρομική τροχιά με σήματα εξόδου +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Σιδηροδρομική τροχιά με συνδυαστικά σήματα +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Σιδηροδρομική τροχιά με σήματα διαδρομής +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Σιδηροδρομική τροχιά με σήματα μονόδρομης διαδρομής +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Σιδηροδρομική τροχιά με σήματα τμήματος και ειδοποίησης +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Σιδηροδρομική τροχιά με σήματα τμήματος και εξόδου +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Σιδηροδρομική τροχιά με σήματα τμήματος και συνδυαστικά +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Σιδηροδρομική τροχιά με σήματα τμήματος και διαδρομής +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Σιδηροδρομική τροχιά με σήματα τμήματος και μονόδρομους διαδρομής +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Σιδηροδρομική τροχιά με σήματα ειδοποίησης και εξόδου +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Σιδηροδρομική τροχιά με σήματα ειδοποίησης και συνδυαστικά +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Σιδηροδρομική τροχιά με σήματα ειδοποίησης και διαδρομής +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Σιδηροδρομική τροχιά με σήματα ειδοποίησης και μονόδρομης διαδρομής +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Σιδηροδρομική τροχιά με σήματα εξόδου και συνδυαστικά +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Σιδηροδρομική τροχιά με σήματα εξόδου και διαδρομής +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Σιδηροδρομική τροχιά με σήματα εξόδου και μονόδρομης διαδρομής +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Σιδηρόδρομος με σήματα διαδρομής και συνδυαστικά +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Σιδηροδρομική τροχιά με σήματα μονόδρομης διαδρομής και συνδυαστικά +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Σιδηροδρομική τροχιά με σήματα διαδρομής και μονόδρομης διαδρομής +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Αμαξοστάσιο σιδηροδρομικών τρένων STR_LAI_ROAD_DESCRIPTION_ROAD :Δρόμος STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Δρόμος με φωτισμό @@ -2796,7 +2802,38 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Ιδιοκτη STR_ABOUT_OPENTTD :{WHITE}Σχετικά με το OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Αρχικά Πνευματικά Δικαιώματα {COPYRIGHT} 1995 Chris Sawyer, Όλα τα δικαιώματα διατηρούνται STR_ABOUT_VERSION :{BLACK}Έκδοση OpenTTD{REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2016 Η ομάδα του OpenTTD +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}Αποθήκευση Παιχνιδιού @@ -2805,7 +2842,7 @@ STR_SAVELOAD_SAVE_SCENARIO :{WHITE}Αποθ STR_SAVELOAD_LOAD_SCENARIO :{WHITE}Φόρτωση Σεναρίου STR_SAVELOAD_LOAD_HEIGHTMAP :{WHITE}Φόρτωση Χάρτη Υψομετρίας STR_SAVELOAD_SAVE_HEIGHTMAP :{WHITE}Αποθήκευση Χάρτη Υψομετρίας -STR_SAVELOAD_HOME_BUTTON :{BLACK}Κάντε κλικ εδώ για να πάτε στον τρέχων φάκελο αποθήκευσης +STR_SAVELOAD_HOME_BUTTON :{BLACK}Πατήστε εδώ για να πάτε στον τρέχων φάκελο αποθήκευσης STR_SAVELOAD_BYTES_FREE :{BLACK}{BYTES} ελεύθερα STR_SAVELOAD_LIST_TOOLTIP :{BLACK}Λίστα δισκών, φακέλων και αποθηκευμένων παιχνιδιών STR_SAVELOAD_EDITBOX_TOOLTIP :{BLACK}Τρέχον επιλεγμένο όνομα για το αποθηκευμένο παιχνίδι @@ -3015,8 +3052,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Προσπάθ STR_NEWGRF_ERROR_CORRUPT_SPRITE :Το {YELLOW}{STRING} περιέχει ένα αλλοιωμένο sprite. Όλα τα αλλοιωμένα sprites θα εμφανίζονται ως κόκκινα ερωτηματικά (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Περιέχει πολλαπλές καταχωρήσεις Action 8 (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Διάβασε πέρα από το τέλος του ψευδό-sprite (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Λείπουν μερικά sprites από το τρέχον βασικό σετ γραφικών.{}Παρακαλώ ενημερώστε το βασικό σετ γραφικών -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Λείπουν μερικά sprites από το τρέχον βασικό σετ γραφικών.{}Παρακαλώ ενημερώστε το βασικό σετ γραφικών{}Επειδή παίζετε {YELLOW}δοκιμαστική έκδοση του OpenTTD{WHITE}, μπορεί να χρειάζεται να έχετε εγκατεστημένη {YELLOW}δοκιμαστική έκδοση των βασικών γραφικών{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Οι ζητημένοι πόροι GRF δεν είναι διαθέσιμοι (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :Το {1:STRING} απενεργοποιήθηκε από το {2:STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Άκυρη/άγνωστη μορφή σχεδίου sprite (sprite {3:NUM}) @@ -3084,15 +3119,15 @@ 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 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_PASSENGERS_LAST_MONTH_MAX :{BLACK}Επιβάτες τον προηγούμενο μήνα: {ORANGE}{COMMA}{BLACK} μεγ: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{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} απαιτείται STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} απαιτείται τον χειμώνα @@ -3120,7 +3155,7 @@ STR_LOCAL_AUTHORITY_CAPTION :{WHITE}Τοπι STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}Ποσοστά εταιρίας μεταφορών: STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING} STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}Διαθέσιμες πράξεις: -STR_LOCAL_AUTHORITY_ACTIONS_TOOLTIP :{BLACK}Λίστα πραγμάτων που πρέπει να γίνουν σε αυτήν την πόλη - κάντε κλικ στο αντικείμενο για πληροφορίες +STR_LOCAL_AUTHORITY_ACTIONS_TOOLTIP :{BLACK}Λίστα πραγμάτων που πρέπει να γίνουν σε αυτήν την πόλη - πατήστε στο αντικείμενο για πληροφορίες STR_LOCAL_AUTHORITY_DO_IT_BUTTON :{BLACK}Κάντε το STR_LOCAL_AUTHORITY_DO_IT_TOOLTIP :{BLACK}Διενέργεια της επιλεγμένης πράξης στην παραπάνω λίστα @@ -3144,7 +3179,7 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Δωρ # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Στόχοι: -STR_GOALS_SPECTATOR_CAPTION :{BLACK}Καθολικοί στόχοι: +STR_GOALS_SPECTATOR_CAPTION :{WHITE}Καθολικοί στόχοι: STR_GOALS_GLOBAL_TITLE :{BLACK}Καθολικοί στόχοι: STR_GOALS_TEXT :{ORANGE}{STRING} STR_GOALS_NONE :{ORANGE}- Κανένας - @@ -3152,7 +3187,7 @@ STR_GOALS_SPECTATOR_NONE :{ORANGE}- Μη STR_GOALS_PROGRESS :{ORANGE}{STRING} STR_GOALS_PROGRESS_COMPLETE :{GREEN}{STRING} STR_GOALS_COMPANY_TITLE :{BLACK}Εταιρικοί στόχοι: -STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Κάνετε κλικ στον στόχο για να επικεντρωθεί η οθόνη στη βιομηχανία/πόλη/τετραγωνίδιο. Με Ctrl+Κλικ ανοίγει το παράθυρο θέασης στην τοποθεσία της βιομηχανίας/πόλης/τετραγωνίδιου +STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Πατήστε στον στόχο για να επικεντρωθεί η οθόνη στη βιομηχανία/πόλη/τετραγωνίδιο. Με Ctrl+Κλικ ανοίγει το παράθυρο θέασης στην τοποθεσία της βιομηχανίας/πόλης/τετραγωνίδιου # Goal question window STR_GOAL_QUESTION_CAPTION_QUESTION :Ερώτηση @@ -3188,7 +3223,7 @@ STR_SUBSIDIES_OFFERED_FROM_TO :{ORANGE}{STRING STR_SUBSIDIES_NONE :{ORANGE}- Καμία - STR_SUBSIDIES_SUBSIDISED_TITLE :{BLACK}Υπηρεσίες που έχουν χρηματοδοτηθεί: STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING} από τον σταθμό {STRING} προς τον σταθμό {STRING}{YELLOW} ({COMPANY}{YELLOW}, έως τις {DATE_SHORT}) -STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Κάνετε κλικ στην υπηρεσία για κεντράρισμα στην βιομηχανία/πόλη. Με Ctrl+Κλικ ανοίγει νέο παράθυρο προβολής στην τοποθεσία της βιομηχανίας/πόλης +STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Πατήστε στην υπηρεσία για κεντράρισμα στην βιομηχανία/πόλη. Με Ctrl+Κλικ ανοίγει νέο παράθυρο προβολής στην τοποθεσία της βιομηχανίας/πόλης # Story book window STR_STORY_BOOK_CAPTION :{WHITE}{COMPANY} Βιβλίο Ιστορίας @@ -3203,7 +3238,7 @@ STR_STORY_BOOK_NEXT_PAGE_TOOLTIP :{BLACK}Μετα STR_STORY_BOOK_INVALID_GOAL_REF :{RED}Μη έγκυρη αναφορά στόχου # Station list window -STR_STATION_LIST_TOOLTIP :{BLACK}Ονόματα σταθμών - κάνετε κλικ στο όνομα για κεντράρισμα στο σταθμό. Με Ctrl+Κλικ ανοίγει νέο παράθυρο προβολής στην τοποθεσία του σταθμού +STR_STATION_LIST_TOOLTIP :{BLACK}Ονόματα σταθμών - πατήστε στο όνομα για κεντράρισμα στο σταθμό. Με Ctrl+Κλικ ανοίγει νέο παράθυρο προβολής στην τοποθεσία του σταθμού STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE :{BLACK}Κρατήστε πατημένο το Ctrl για να επιλέξετε περισσότερο από ένα αντικείμενο STR_STATION_LIST_CAPTION :{WHITE}{COMPANY} - {COMMA} Σταθμ{P ός οί} STR_STATION_LIST_STATION :{YELLOW}{STATION} {STATION_FEATURES} @@ -3223,8 +3258,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Δέχε STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Εμφάνιση λίστας αποδεκτών φορτίων STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Δέχεται: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Αυτός ο σταθμός έχει αποκλειστικά δικαιώματα μεταφοράς σε αυτήν την πόλη. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :Η {YELLOW}{COMPANY}{BLACK} αγόρασε αποκλειστικά δικαιώματα για αυτήν την πόλη. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Αυτός ο σταθμός έχει αποκλειστικά δικαιώματα μεταφοράς σε αυτήν την πόλη. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :Η {YELLOW}{COMPANY}{BLACK} αγόρασε αποκλειστικά δικαιώματα για αυτήν την πόλη. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Βαθμολογίες STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Εμφάνιση στατιστικών σταθμού @@ -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}Λειτουργικά Έξοδα Πλοίων @@ -3387,7 +3422,7 @@ STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Τί STR_INDUSTRY_DIRECTORY_ITEM :{ORANGE}{INDUSTRY}{BLACK} ({CARGO_LONG}{STRING}){YELLOW} ({COMMA}% μεταφέρθηκαν) STR_INDUSTRY_DIRECTORY_ITEM_TWO :{ORANGE}{INDUSTRY}{BLACK} ({CARGO_LONG}{STRING}/{CARGO_LONG}{STRING}){YELLOW} ({COMMA}%/{COMMA}% μεταφέρθηκαν) STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY} -STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Ονόματα βιομηχανιών - κάνετε κλικ στο όνομα για κεντράρισμα στην βιομηχανία. Με Ctrl+Κλικ ανοίγει νέο παράθυρο προβολής στην τοποθεσία της βιομηχανίας +STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Ονόματα βιομηχανιών - πατήστε στο όνομα για κεντράρισμα στη βιομηχανία. Με Ctrl+Κλικ ανοίγει νέο παράθυρο προβολής στην τοποθεσία της βιομηχανίας # Industry view STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY} @@ -3403,9 +3438,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Απαι STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Απαιτεί: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Απαιτεί: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} σε αναμονή{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Εμπόρευματα σε αναμονή: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Παράγει: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Παράγει: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3419,10 +3456,10 @@ STR_VEHICLE_LIST_ROAD_VEHICLE_CAPTION :{WHITE}{STRING} STR_VEHICLE_LIST_SHIP_CAPTION :{WHITE}{STRING} - {COMMA} Πλοί{P ο α} STR_VEHICLE_LIST_AIRCRAFT_CAPTION :{WHITE}{STRING} - {COMMA} Αεροσκάφ{P ος η} -STR_VEHICLE_LIST_TRAIN_LIST_TOOLTIP :{BLACK}Τρένα - κάντε κλικ στο τρένο για πληροφορίες -STR_VEHICLE_LIST_ROAD_VEHICLE_TOOLTIP :{BLACK}Οχήματα δρόμου - κάντε κλικ στο όχημα για πληροφορίες -STR_VEHICLE_LIST_SHIP_TOOLTIP :{BLACK}Πλοία - κάντε κλικ στο πλοίο για πληροφορίες -STR_VEHICLE_LIST_AIRCRAFT_TOOLTIP :{BLACK}Αεροσκάφη - κάντε κλικ στο αεροσκάφος για πληροφορίες +STR_VEHICLE_LIST_TRAIN_LIST_TOOLTIP :{BLACK}Τρένα - πατήστε στο τρένο για πληροφορίες +STR_VEHICLE_LIST_ROAD_VEHICLE_TOOLTIP :{BLACK}Οχήματα δρόμου - πατήστε στο όχημα για πληροφορίες +STR_VEHICLE_LIST_SHIP_TOOLTIP :{BLACK}Πλοία - πατήστε στο πλοίο για πληροφορίες +STR_VEHICLE_LIST_AIRCRAFT_TOOLTIP :{BLACK}Αεροσκάφη - πατήστε στο αεροσκάφος για πληροφορίες STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Κέρδος αυτό το έτος: {CURRENCY_LONG} (προηγούμενο έτος: {CURRENCY_LONG}) @@ -3442,8 +3479,8 @@ STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Στείλτε STR_VEHICLE_LIST_SEND_SHIP_TO_DEPOT :Στείλε στο Ναυπηγείο STR_VEHICLE_LIST_SEND_AIRCRAFT_TO_HANGAR :Στείλε στο Υπόστεγο -STR_VEHICLE_LIST_MASS_STOP_LIST_TOOLTIP :{BLACK}Κάντε κλικ για να σταματήσουν όλα τα οχήματα στη λίστα -STR_VEHICLE_LIST_MASS_START_LIST_TOOLTIP :{BLACK}Κάντε κλικ για να ξεκινήσουν όλα τα οχήματα στη λίστα +STR_VEHICLE_LIST_MASS_STOP_LIST_TOOLTIP :{BLACK}Πατήστε για να σταματήσουν όλα τα οχήματα στη λίστα +STR_VEHICLE_LIST_MASS_START_LIST_TOOLTIP :{BLACK}Πατήστε για να ξεκινήσουν όλα τα οχήματα στη λίστα STR_VEHICLE_LIST_SHARED_ORDERS_LIST_CAPTION :{WHITE}Κοινές εντολές {P 0 του των} {COMMA} {P Οχήματος Οχημάτων} @@ -3458,20 +3495,25 @@ STR_GROUP_DEFAULT_ROAD_VEHICLES :Μη ομαδο STR_GROUP_DEFAULT_SHIPS :Μη ομαδοποιημένα πλοία STR_GROUP_DEFAULT_AIRCRAFTS :Μη ομαδοποιημένα αεροσκάφη -STR_GROUPS_CLICK_ON_GROUP_FOR_TOOLTIP :{BLACK}Ομάδες - κάντε κλικ σε μία ομάδα για να δείτε όλα τα οχήματα που της ανήκουν. Σύρρτε ομάδες για να ρυθμίσετα την ιεραρχία. -STR_GROUP_CREATE_TOOLTIP :{BLACK}Κάντε κλικ για δημιουργήσετε ομάδα +STR_GROUPS_CLICK_ON_GROUP_FOR_TOOLTIP :{BLACK}Ομάδες - πατήστε σε μία ομάδα για να δείτε όλα τα οχήματα που της ανήκουν. Σύρετε ομάδες για να ρυθμίσετε την ιεραρχία. +STR_GROUP_CREATE_TOOLTIP :{BLACK}Πατήστε για δημιουργήσετε ομάδα STR_GROUP_DELETE_TOOLTIP :{BLACK}Διαγραφή της επιλεγμένης ομάδας STR_GROUP_RENAME_TOOLTIP :{BLACK}Μετονομασία της επιλεγμένης ομάδας -STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Κάντε κλικ για προστατέψετε αυτήν την ομάδα από την γενική αυτόματη αντικατάσταση +STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Πατήστε για προστατέψετε αυτήν την ομάδα από την γενική αυτόματη αντικατάσταση STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Διαγραφή ομάδας -STR_GROUP_DELETE_QUERY_TEXT :Είστε σίγουροι ότι θέλετε να διαγράψετε αυτή την ομάδα και οποιουσδήποτε απογόνους; +STR_GROUP_DELETE_QUERY_TEXT :{WHITE}Είστε σίγουροι ότι θέλετε να διαγράψετε αυτή την ομάδα και οποιουσδήποτε απογόνους; STR_GROUP_ADD_SHARED_VEHICLE :Προσθήκη κοινόχρηστων οχημάτων STR_GROUP_REMOVE_ALL_VEHICLES :Αφαίρεση όλων των οχημάτων 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 STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Νέα Οχήματα Σιδηρόδρομου STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Νέα Οχήματα Ηλεκτροδοτουμένου Σιδηρόδρομου @@ -3503,11 +3545,12 @@ STR_PURCHASE_INFO_ALL_TYPES :Όλοι οι STR_PURCHASE_INFO_ALL_BUT :Όλοι εκτός από {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Μέγ. Δύναμη Έλξης: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Εύρος: {GOLD}{COMMA} τετραγωνίδια +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Τύπος αεροσκάφους: {GOLD}{STRING} -STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Λίστα επιλογής βαγονιού τρένου. Κάντε κλικ σε ένα βαγόνι για πληροφορίες. Ctrl+Click για εμφάνιση/απόκρυψη του τύπου βαγονιού -STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Λίστα επιλογής οχήματος δρόμου. Κάντε κλικ σε ένα όχημα για πληροφορίες. Ctrl+Click για εμφάνιση/απόκρυψη του τύπου οχήματος -STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Λίστα επιλογής πλοίου. Κάντε κλικ σε ένα πλοίο για πληροφορίες. Ctrl+Click για εμφάνιση/απόκρυψη του τύπου πλοίου -STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Λίστα επιλογής αεροσκάφους. Κάντε κλικ σε ένα αεροσκάφος για πληροφορίες. Ctrl+Click για εμφάνιση/απόκρυψη του τύπου αεροσκάφους +STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Λίστα επιλογής βαγονιού τρένου. Πατήστε σε ένα βαγόνι για πληροφορίες. Ctrl+Click για εμφάνιση/απόκρυψη του τύπου βαγονιού +STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Λίστα επιλογής οχήματος δρόμου. Πατήστε σε ένα όχημα για πληροφορίες. Ctrl+Click για εμφάνιση/απόκρυψη του τύπου οχήματος +STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Λίστα επιλογής πλοίου. Πατήστε σε ένα πλοίο για πληροφορίες. Ctrl+Click για εμφάνιση/απόκρυψη του τύπου πλοίου +STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Λίστα επιλογής αεροσκάφους. Πατήστε σε ένα αεροσκάφος για πληροφορίες. Ctrl+Click για εμφάνιση/απόκρυψη του τύπου αεροσκάφους STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_BUTTON :{BLACK}Αγορά Οχήματος STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_BUTTON :{BLACK}Αγορά Οχήματος @@ -3597,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+Κλικ εμφανίζεται το εκτιμώμενο κόστος χωρίς να γίνει η αγορά @@ -3612,15 +3655,15 @@ STR_DEPOT_VEHICLE_ORDER_LIST_ROAD_VEHICLE_TOOLTIP :{BLACK}Παίρ STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TOOLTIP :{BLACK}Παίρνετε μια λίστα με όλα τα πλοία με το επιλεγμένο ναυπηγείο στις εντολές τους STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TOOLTIP :{BLACK}Παίρνετε μια λίστα με όλα τα αεροσκάφη που έχουν οποιοδήποτε υπόστεγο αυτού του αεροδρομίου στις εντολές τους -STR_DEPOT_MASS_STOP_DEPOT_TRAIN_TOOLTIP :{BLACK}Κάντε κλικ για να σταματήσουν όλα τα τρένα μέσα στο αμαξοστάσιο -STR_DEPOT_MASS_STOP_DEPOT_ROAD_VEHICLE_TOOLTIP :{BLACK}Κάντε κλικ για να σταματήσουν όλα τα οχήματα μέσα στο αμαξοστάσιο -STR_DEPOT_MASS_STOP_DEPOT_SHIP_TOOLTIP :{BLACK}Κάντε κλικ για να σταματήσουν όλα τα πλοία μέσα στο ναυπηγείο -STR_DEPOT_MASS_STOP_HANGAR_TOOLTIP :{BLACK}Κάντε κλικ για να σταματήσουν όλα τα αεροσκάφη μέσα στο υπόστεγο +STR_DEPOT_MASS_STOP_DEPOT_TRAIN_TOOLTIP :{BLACK}Πατήστε για να σταματήσουν όλα τα τρένα μέσα στο αμαξοστάσιο +STR_DEPOT_MASS_STOP_DEPOT_ROAD_VEHICLE_TOOLTIP :{BLACK}Πατήστε για να σταματήσουν όλα τα οχήματα μέσα στο αμαξοστάσιο +STR_DEPOT_MASS_STOP_DEPOT_SHIP_TOOLTIP :{BLACK}Πατήστε για να σταματήσουν όλα τα πλοία μέσα στο ναυπηγείο +STR_DEPOT_MASS_STOP_HANGAR_TOOLTIP :{BLACK}Πατήστε για να σταματήσουν όλα τα αεροσκάφη μέσα στο υπόστεγο -STR_DEPOT_MASS_START_DEPOT_TRAIN_TOOLTIP :{BLACK}Κάντε κλικ για να ξεκινήσουν όλα τα τρένα μέσα στο αμαξοστάσιο -STR_DEPOT_MASS_START_DEPOT_ROAD_VEHICLE_TOOLTIP :{BLACK}Κάντε κλικ για να ξεκινήσουν όλα τα οχήματα μέσα στο αμαξοστάσιο -STR_DEPOT_MASS_START_DEPOT_SHIP_TOOLTIP :{BLACK}Κάντε κλικ για να ξεκινήσουν όλα τα πλοία μέσα στο ναυπηγείο -STR_DEPOT_MASS_START_HANGAR_TOOLTIP :{BLACK}Κάντε κλικ για να ξεκινήσουν όλα τα αεροσκάφη μέσα στο υπόστεγο +STR_DEPOT_MASS_START_DEPOT_TRAIN_TOOLTIP :{BLACK}Πατήστε για να ξεκινήσουν όλα τα τρένα μέσα στο αμαξοστάσιο +STR_DEPOT_MASS_START_DEPOT_ROAD_VEHICLE_TOOLTIP :{BLACK}Πατήστε για να ξεκινήσουν όλα τα οχήματα μέσα στο αμαξοστάσιο +STR_DEPOT_MASS_START_DEPOT_SHIP_TOOLTIP :{BLACK}Πατήστε για να ξεκινήσουν όλα τα πλοία μέσα στο ναυπηγείο +STR_DEPOT_MASS_START_HANGAR_TOOLTIP :{BLACK}Πατήστε για να ξεκινήσουν όλα τα αεροσκάφη μέσα στο υπόστεγο STR_DEPOT_SELL_CONFIRMATION_TEXT :{YELLOW}Πρόκειται να πουλήσετε όλα τα οχήματα στο αμαξοστάσιο. Είσαστε σίγουροι; @@ -3640,12 +3683,13 @@ STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE.geniki :μηχανής STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :{G=f}μηχανής maglev STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE.geniki :μηχανής maglev -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 :{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_CAPACITY_CAPACITY_RUNCOST :{BLACK}Κόστος: {CURRENCY_LONG} Μέγ. Ταχύτητα: {VELOCITY}{}Χωρητικότητα: {CARGO_LONG}, {CARGO_LONG}{}Κόστος Λειτουργίας: {CURRENCY_LONG}/έτος -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Κόστος: {CURRENCY_LONG} Μέγ. Ταχύτητα: {VELOCITY}{}Χωρητικότητα: {CARGO_LONG}{}Κόστος Λειτουργίας: {CURRENCY_LONG}/έτος -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Κόστος: {CURRENCY_LONG} Μέγ. Ταχύτητα: {VELOCITY} Εμβέλεια: {COMMA} τετραγωνίδια{}Χωρητικότητα: {CARGO_LONG}, {CARGO_LONG}{}Κόστος Λειτουργίας: {CURRENCY_LONG}/έτος -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Κόστος: {CURRENCY_LONG} Μέγ. Ταχύτητα: {VELOCITY} Εμβέλεια: {COMMA} τετραγωνίδια{}Χωρητικότητα: {CARGO_LONG}{}Κόστος Λειτουργίας: {CURRENCY_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} tiles{}Χωρητικότητα: {CARGO_LONG}, {CARGO_LONG}{}Running Κόστος: {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} @@ -3672,10 +3716,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} ότα STR_REPLACE_VEHICLES_STOP :{BLACK}Διακοπή Αντικατάστασης Οχημάτων STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Πατήστε για να σταματήσει η αντικατάσταση του τύπου μηχανής επιλεγμένος στα αριστερά -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Αντικατάσταση: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Εναλλαγή μεταξύ των παραθύρων αντικατάστασης μηχανών και βαγονιών STR_REPLACE_ENGINES :Μηχανές STR_REPLACE_WAGONS :Βαγόνια +STR_REPLACE_ALL_RAILTYPE :Όλα τα οχήματα σιδηρόδρομου STR_REPLACE_HELP_RAILTYPE :{BLACK}Επιλέξτε τον τύπο σιδηροδρόμου για τον οποίο θέλετε να γίνει η αντικατάσταση των μηχανών STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Εμφανίζει ποια μηχανή αυτή στα αριστερά θα αντικατασταθεί, εάν υπάρχει @@ -3725,10 +3769,10 @@ STR_VEHICLE_VIEW_ROAD_VEHICLE_SHOW_DETAILS_TOOLTIP :{BLACK}Εμφά STR_VEHICLE_VIEW_SHIP_SHOW_DETAILS_TOOLTIP :{BLACK}Εμφάνιση λεπτομερειών πλοίου STR_VEHICLE_VIEW_AIRCRAFT_SHOW_DETAILS_TOOLTIP :{BLACK}Εμφάνιση λεπτομερειών αεροσκάφους -STR_VEHICLE_VIEW_TRAIN_STATE_START_STOP_TOOLTIP :{BLACK}Τρέχουσα ενέργεια τρένου - κάντε κλικ εδώ για ξεκινήσετε/σταματήσετε το τρένο. Με Ctrl+Κλικ πηγαίνετε στον προορισμό -STR_VEHICLE_VIEW_ROAD_VEHICLE_STATE_START_STOP_TOOLTIP :{BLACK}Τρέχουσα ενέργεια οχήματος - κάντε κλικ εδώ για ξεκινήσετε/σταματήσετε το όχημα. Με Ctrl+Κλικ πηγαίνετε στον προορισμό -STR_VEHICLE_VIEW_SHIP_STATE_START_STOP_TOOLTIP :{BLACK}Τρέχουσα ενέργεια πλοίου - κάντε κλικ εδώ για ξεκινήσετε/σταματήσετε το πλοίο. Με Ctrl+Κλικ πηγαίνετε στον προορισμό -STR_VEHICLE_VIEW_AIRCRAFT_STATE_START_STOP_TOOLTIP :{BLACK}Τρέχουσα ενέργεια αεροσκάφους - κάντε κλικ εδώ για ξεκινήσετε/σταματήσετε το πλοίο. Με Ctrl+Κλικ πηγαίνετε στον προορισμό +STR_VEHICLE_VIEW_TRAIN_STATE_START_STOP_TOOLTIP :{BLACK}Τρέχουσα ενέργεια τρένου - πατήστε εδώ για ξεκινήσετε/σταματήσετε το τρένο. Με Ctrl+Κλικ πηγαίνετε στον προορισμό +STR_VEHICLE_VIEW_ROAD_VEHICLE_STATE_START_STOP_TOOLTIP :{BLACK}Τρέχουσα ενέργεια οχήματος - πατήστε εδώ για ξεκινήσετε/σταματήσετε το όχημα. Με Ctrl+Κλικ πηγαίνετε στον προορισμό +STR_VEHICLE_VIEW_SHIP_STATE_START_STOP_TOOLTIP :{BLACK}Τρέχουσα ενέργεια πλοίου - πατήστε εδώ για ξεκινήσετε/σταματήσετε το πλοίο. Με Ctrl+Κλικ πηγαίνετε στον προορισμό +STR_VEHICLE_VIEW_AIRCRAFT_STATE_START_STOP_TOOLTIP :{BLACK}Τρέχουσα ενέργεια αεροσκάφους - πατήστε εδώ για ξεκινήσετε/σταματήσετε το πλοίο. Με Ctrl+Κλικ πηγαίνετε στον προορισμό # Messages in the start stop button in the vehicle view STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Φόρτωση / Εκφόρτωση @@ -3768,7 +3812,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} χρό STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} χρόν{P ος ια} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Μέγ. ταχύτητα: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Μέγ. ταχύτητα: {LTBLUE}{VELOCITY} {BLACK}Εμβέλεια: {LTBLUE}{COMMA} τετραγωνίδια +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Μεγ. ταχύτητα: {LTBLUE}{VELOCITY} {BLACK}Τύπος αεροσκάφους: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Μεγ. ταχύτητα: {LTBLUE}{VELOCITY} {BLACK}Τύπος αεροσκάφους: {LTBLUE}{STRING} {BLACK}Εμβέλεια: {LTBLUE}{COMMA} τετραγωνίδια STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Βάρος: {LTBLUE}{WEIGHT_SHORT} {BLACK}Δύναμη Κινητήρα: {LTBLUE}{POWER}{BLACK} Μέγ. Ταχύτητα: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Βάρος: {LTBLUE}{WEIGHT_SHORT} {BLACK}Δύναμη Κινητήρα: {LTBLUE}{POWER}{BLACK} Μέγ. Ταχύτητα: {LTBLUE}{VELOCITY} {BLACK}Μέγ. Ε.Δ: {LTBLUE}{FORCE} @@ -3828,7 +3873,7 @@ STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Νέα STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}Νέα χωρητικότητα: {GOLD}{CARGO_LONG}{}{BLACK}Κέρδος από τη μετατροπή: {GREEN}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Νέα χωρητικότητα: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Κόστος μετατροπής: {RED}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Νέα χωρητικότητα: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Κέρδος από τη μετατροπή: {GREEN}{CURRENCY_LONG} -STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Επιλέξτε τα οχήματα για μετατροπή. Σύροντας με το ποντίκι επιτρέπει την επιλογή πολλαπλών οχημάτων. Κάνοντας κλικ σε άδειο χώρο θα επιλέξει ολόκληρο το όχημα. Με Ctrl+Κλικ θα γίνει επιλογή του οχήματος και της ακολουθούμενης αλυσίδας. +STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Επιλέξτε τα οχήματα για μετατροπή. Σύροντας με το ποντίκι επιτρέπει την επιλογή πολλαπλών οχημάτων. Πατώντας σε άδειο χώρο θα επιλέξει ολόκληρο το όχημα. Με Ctrl+Κλικ θα γίνει επιλογή του οχήματος και της ακολουθούμενης αλυσίδας. STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Επιλέξτε τον τύπο εμπορεύματος που θα μεταφέρει το τρένο STR_REFIT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Επιλέξτε τον τύπο εμπορεύματος που θα μεταφέρει το όχημα @@ -3850,7 +3895,7 @@ STR_ORDERS_CAPTION :{WHITE}{VEHICLE STR_ORDERS_TIMETABLE_VIEW :{BLACK}Δρομολόγια STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Αλλαγή σε προβολή δρομολογίων -STR_ORDERS_LIST_TOOLTIP :{BLACK}Λίστα εντολών - κάντε κλικ σε μια εντολή για να την επιλέξετε. Με Ctrl+Κλικ γίνεται μετακίνηση στον προορισμό της οδηγίας +STR_ORDERS_LIST_TOOLTIP :{BLACK}Λίστα εντολών - πατήστε σε μια εντολή για να την επιλέξετε. Με Ctrl+Κλικ γίνεται μετακίνηση στον προορισμό της οδηγίας STR_ORDER_INDEX :{COMMA}:{NBSP} STR_ORDER_TEXT :{STRING} {STRING} {STRING} @@ -4005,7 +4050,7 @@ STR_TIMETABLE_TITLE :{WHITE}{VEHICLE STR_TIMETABLE_ORDER_VIEW :{BLACK}Εντολές STR_TIMETABLE_ORDER_VIEW_TOOLTIP :{BLACK}Αλλαγή στην προβολή εντολών -STR_TIMETABLE_TOOLTIP :{BLACK}Δρομολόγια - κάντε κλικ σε μια εντολή για την επιλέξετε +STR_TIMETABLE_TOOLTIP :{BLACK}Δρομολόγια - πατήστε σε μια εντολή για την επιλέξετε STR_TIMETABLE_NO_TRAVEL :Μην ταξιδέψεις STR_TIMETABLE_NOT_TIMETABLEABLE :Ταξίδι (αυτόματα· με δρομολόγιο στην επόμενη μη αυτόματη εντολή) @@ -4121,7 +4166,7 @@ STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Ρύθμ STR_AI_LIST_CAPTION :{WHITE}Διαθέσιμη {STRING} STR_AI_LIST_CAPTION_AI :AI STR_AI_LIST_CAPTION_GAMESCRIPT :Δέσμες Ενεργειών -STR_AI_LIST_TOOLTIP :{BLACK}Κάντε κλικ για επιλέξετε μία δέσμη ενεργειών +STR_AI_LIST_TOOLTIP :{BLACK}Πατήστε για να επιλέξετε μία δέσμη ενεργειών STR_AI_LIST_AUTHOR :{LTBLUE}Δημιουργός: {ORANGE}{STRING} STR_AI_LIST_VERSION :{LTBLUE}Έκδοση: {ORANGE}{NUM} @@ -4271,7 +4316,7 @@ STR_ERROR_CURRENCY_REQUIRED :{WHITE}... απ STR_ERROR_CAN_T_REPAY_LOAN :{WHITE}Αδύνατη η αποπληρωμή του δανείου... STR_ERROR_INSUFFICIENT_FUNDS :{WHITE}Δεν είναι δυνατό να δοθούν χρήματα που είναι δανεισμένα από τη τράπεζα... STR_ERROR_CAN_T_BUY_COMPANY :{WHITE}Αδύνατη η εξαγορά της εταιρίας... -STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS :{WHITE}Αδύνατο να κτιστεί αρχηγείο εταιρίας... +STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS :{WHITE}Δεν μπορεί να κτιστεί αρχηγείο εταιρίας... STR_ERROR_CAN_T_BUY_25_SHARE_IN_THIS :{WHITE}Αδύνατη η αγορά μεριδίου 25% της εταιρίας... STR_ERROR_CAN_T_SELL_25_SHARE_IN :{WHITE}Αδύνατη η πώληση μεριδίου 25% της εταιρίας... STR_ERROR_PROTECTED :{WHITE}Αυτή η εταιρία δεν είναι αρκετά παλιά για συναλλαγή μετοχών... @@ -4293,7 +4338,7 @@ STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... δε # Industry related errors STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... πάρα πολλές βιομηχανίες STR_ERROR_CAN_T_GENERATE_INDUSTRIES :{WHITE}Δε γίνεται να δημιουργηθούν βιομηχανίες... -STR_ERROR_CAN_T_BUILD_HERE :{WHITE}Δεν είναι δυνατό να κτιστεί {G ο η το} {STRING} εδώ... +STR_ERROR_CAN_T_BUILD_HERE :{WHITE}Δεν μπορεί να κτιστεί {G ο η το} {STRING} εδώ... STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY :{WHITE}Δεν είναι δυνατό να κτιστεί αυτός ο τύπος βιομηχανίας εδώ... STR_ERROR_INDUSTRY_TOO_CLOSE :{WHITE}... πολύ κοντά σε άλλη βιομηχανία STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}... πρέπει να κτιστεί πόλη πρώτα @@ -4314,8 +4359,8 @@ STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION :{WHITE}Αλλα # Station construction related errors STR_ERROR_CAN_T_BUILD_RAILROAD_STATION :{WHITE}Δεν μπορεί να κτιστεί σταθμός τρένων εδώ... -STR_ERROR_CAN_T_BUILD_BUS_STATION :{WHITE}Αδύνατο να κτιστεί στάση λεωφορείων... -STR_ERROR_CAN_T_BUILD_TRUCK_STATION :{WHITE}Αδύνατο να κτιστεί στάση φορτηγών... +STR_ERROR_CAN_T_BUILD_BUS_STATION :{WHITE}Δεν μπορεί να κτιστεί στάση λεωφορείων... +STR_ERROR_CAN_T_BUILD_TRUCK_STATION :{WHITE}Δεν μπορεί να κτιστεί στάση φορτηγών... STR_ERROR_CAN_T_BUILD_PASSENGER_TRAM_STATION :{WHITE}Δεν μπορεί να κτιστεί επιβατικός σταθμός τραμ... STR_ERROR_CAN_T_BUILD_CARGO_TRAM_STATION :{WHITE}Δεν μπορεί να κτιστεί σταθμός τραμ... STR_ERROR_CAN_T_BUILD_DOCK_HERE :{WHITE}Δεν μπορεί να κτιστεί λιμένας εδώ... @@ -4327,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}Δεν μπορεί να μετονομαστεί ο σταθμός... @@ -4335,6 +4379,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}Δεν μπορεί να αφαιρεθεί μέρος του σταθμού... @@ -4358,7 +4403,7 @@ STR_ERROR_MUST_DEMOLISH_AIRPORT_FIRST :{WHITE}Πρέπ STR_ERROR_WAYPOINT_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}Προστίθεται σε περισσότερο από ένα υπάρχον σημείο καθοδήγησης STR_ERROR_TOO_CLOSE_TO_ANOTHER_WAYPOINT :{WHITE}Πολύ κοντά σε άλλο σημείο καθοδήγησης -STR_ERROR_CAN_T_BUILD_TRAIN_WAYPOINT :{WHITE}Αδύνατο να χτιστεί σημείο καθοδήγησης τρένου εδώ... +STR_ERROR_CAN_T_BUILD_TRAIN_WAYPOINT :{WHITE}Δεν μπορεί να χτιστεί σημείο καθοδήγησης τρένου εδώ... STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Δεν μπορεί να τοποθετηθεί σημαδούρα εδώ... STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Αδύνατο να αλλαχτεί το όνομα του σημείου καθοδήγησης... @@ -4368,8 +4413,8 @@ STR_ERROR_BUOY_IN_THE_WAY :{WHITE}... ση STR_ERROR_BUOY_IS_IN_USE :{WHITE}... σημαδούρα σε χρήση από άλλη εταιρία! # Depot related errors -STR_ERROR_CAN_T_BUILD_TRAIN_DEPOT :{WHITE}Αδύνατο να κτιστεί αμαξοστάσιο εδώ... -STR_ERROR_CAN_T_BUILD_ROAD_DEPOT :{WHITE}Αδύνατο να κτιστεί σταθμός οχημάτων εδώ... +STR_ERROR_CAN_T_BUILD_TRAIN_DEPOT :{WHITE}Δεν μπορεί να κτιστεί αμαξοστάσιο εδώ... +STR_ERROR_CAN_T_BUILD_ROAD_DEPOT :{WHITE}Δεν μπορεί να κτιστεί σταθμός οχημάτων εδώ... STR_ERROR_CAN_T_BUILD_TRAM_DEPOT :{WHITE}Δεν μπορεί να κτιστεί σταθμαρχείο τραμ εδώ... STR_ERROR_CAN_T_BUILD_SHIP_DEPOT :{WHITE}Δεν μπορεί να κτιστεί ναυπηγείο πλοίων εδώ... @@ -4405,7 +4450,7 @@ STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Μη σ STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Πρέπει να αφαιρεθεί ο σιδηρόδρομος πρώτα STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Η δρόμος είναι μονόδρομος ή μπλοκαρισμένος STR_ERROR_CROSSING_DISALLOWED :{WHITE}Δεν επιτρέπονται ισόπεδες διασταυρώσεις για αυτόν τον τύπο σιδηροδρόμου -STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Δεν μπορούν να κτιστούν σηματοδότες εδώ... +STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Δεν μπορούν να τοποθετοηθούν σηματοδότες εδώ... STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Δεν μπορεί να κτιστεί σιδηρόδρομος εδώ... STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Δεν μπορεί να αφαιρεθεί σιδηρόδρομος από εδώ... STR_ERROR_CAN_T_REMOVE_SIGNALS_FROM :{WHITE}Αδύνατο να αφαιρεθούν σηματοδότες από εδώ... @@ -4418,7 +4463,7 @@ STR_ERROR_CAN_T_CONVERT_RAIL :{WHITE}Δε γ # Road construction errors STR_ERROR_MUST_REMOVE_ROAD_FIRST :{WHITE}Πρέπει πρώτα να αφαιρεθεί ο δρόμος STR_ERROR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION :{WHITE}... οι μονόδρομοι δεν μπορούν να έχουν διασταυρώσεις -STR_ERROR_CAN_T_BUILD_ROAD_HERE :{WHITE}Αδύνατο να κτιστεί δρόμος εδώ... +STR_ERROR_CAN_T_BUILD_ROAD_HERE :{WHITE}Δεν μπορεί να κτιστεί δρόμος εδώ... STR_ERROR_CAN_T_BUILD_TRAMWAY_HERE :{WHITE}Δεν μπορεί να κτιστεί τροχιοδρόμος εδώ... STR_ERROR_CAN_T_REMOVE_ROAD_FROM :{WHITE}Αδύνατο να αφαιρεθεί δρόμος από εδώ... STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}Δεν μπορεί να αφαιρεθεί τροχιόδρομος από εδώ... @@ -4431,7 +4476,7 @@ STR_ERROR_CAN_T_BUILD_LOCKS :{WHITE}Δεν STR_ERROR_CAN_T_PLACE_RIVERS :{WHITE}Δεν μπορούν να τοποθετηθούν ποτάμια εδώ... STR_ERROR_MUST_BE_BUILT_ON_WATER :{WHITE}... πρέπει να κτιστεί στο νερό STR_ERROR_CAN_T_BUILD_ON_WATER :{WHITE}... αδύνατο να κτιστεί στο νερό -STR_ERROR_CAN_T_BUILD_ON_SEA :{WHITE}... δε μπορεί να κτιστεί στην ανοικτή θάλασσα +STR_ERROR_CAN_T_BUILD_ON_SEA :{WHITE}... αδύνατο να κτιστεί στην ανοικτή θάλασσα STR_ERROR_CAN_T_BUILD_ON_CANAL :{WHITE}... αδύνατο να κτιστεί σε κανάλι STR_ERROR_CAN_T_BUILD_ON_RIVER :{WHITE}... αδύνατο να κτιστεί σε ποτάμι STR_ERROR_MUST_DEMOLISH_CANAL_FIRST :{WHITE}Πρέπει να κατεδαφιστεί το κανάλι πρώτα @@ -4539,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}Δεν γίνεται να αλλάξει πορεία το όχημα... @@ -4562,7 +4607,7 @@ STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}Αδύν STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}Δεν μπορεί να σταματήσει να μοιράζεται η λίστα εντολών... STR_ERROR_CAN_T_COPY_ORDER_LIST :{WHITE}Αδύνατο να αντιγραφεί η λίστα εντολών... STR_ERROR_TOO_FAR_FROM_PREVIOUS_DESTINATION :{WHITE}... πολύ μακριά από τον προηγούμενο προορισμό -STR_ERROR_AIRCRAFT_NOT_ENOUGH_RANGE :{WHITE}... δεν αρκεί η εμβέλεια του αεροσκάφους +STR_ERROR_AIRCRAFT_NOT_ENOUGH_RANGE :{WHITE}... δεν επαρκεί η εμβέλεια του αεροσκάφους # Timetable related errors STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Δεν μπορεί να δρομολογηθεί το όχημα... @@ -4586,6 +4631,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 (Αρχικός Επεξεργαστής Κόσμου) έκδοση DOS. STR_BASEMUSIC_NONE_DESCRIPTION :Ένα πάκετο μουσικής χωρίς πραγματική μουσική. ##id 0x2000 diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt index 93498c7ac7..8f15c95ef6 100644 --- a/src/lang/hebrew.txt +++ b/src/lang/hebrew.txt @@ -263,7 +263,15 @@ STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}פס ה STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}הסרת בניינים וכו' במשבצת קרקע. מקש Ctrl מסמן את האזור באופן אלכנסוני. מקש Shift מעביר בין בנייה לבין הצגה של הערכת העלות # Show engines button +STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN :{BLACK}הצגת מוסתרים +STR_SHOW_HIDDEN_ENGINES_VEHICLE_ROAD_VEHICLE :{BLACK}הצג מוסתרים +STR_SHOW_HIDDEN_ENGINES_VEHICLE_SHIP :{BLACK}הצג מוסתרים +STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT :{BLACK}הצגת מוסתרים +STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN_TOOLTIP :{BLACK}על ידי אפשור כפתור זה, רכבות מוסתרות יוצגו גם +STR_SHOW_HIDDEN_ENGINES_VEHICLE_ROAD_VEHICLE_TOOLTIP :{BLACK}על ידי אפשור כפתור זה, כלי רכב מוסתרים יוצגו גם +STR_SHOW_HIDDEN_ENGINES_VEHICLE_SHIP_TOOLTIP :{BLACK}על ידי אפשור כפתור זה, ספינות מוסתרות יוצגו גם +STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}על ידי אפשור כפתור זה, כלי טיס מוסתרים יוצגו גם # Query window STR_BUTTON_DEFAULT :{BLACK}בחירת מחדל @@ -329,7 +337,7 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}הצג STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}הצג רשימת תחנות החברה STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}הצג מידע כספי על החברה STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}הצג מידע כללי על החברה -STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}הצג את סיפור החברה +STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}הצג סיפור חברה STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}הצג רשימת מטרות STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}הצג גרפים STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}הצג את טבלת ליגת החברות @@ -378,6 +386,7 @@ STR_SCENEDIT_FILE_MENU_QUIT :יציאה ############ range for settings menu starts STR_SETTINGS_MENU_GAME_OPTIONS :אפשרויות המשחק +STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :הגדרות STR_SETTINGS_MENU_SCRIPT_SETTINGS :הגדרות סקריפטים של משחק/שחקני מחשב STR_SETTINGS_MENU_NEWGRF_SETTINGS :הגדרות GRF חדש STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :אפשרויות שקיפות @@ -480,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 :הדלק/כבה הצגת תיבות גבול של ספרייטים @@ -655,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}כותרת @@ -674,10 +685,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}(בחר STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}עירבוב תוכניות פועל/כבוי STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}הצג את חלון בחירת המנגינה -STR_ERROR_NO_SONGS :{WHITE}נבחרה ערכת מוזיקה ללא שירים. לא יושמעו שירים - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}בחירת תכנית מנגינה STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}רשימת רצועות STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}תוכנית- '{STRING}' @@ -849,6 +857,7 @@ STR_NEWS_VEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}ל{VEHIC STR_NEWS_VEHICLE_HAS_VOID_ORDER :{WHITE}ל{VEHICLE} יעד שאינו קיים עוד עבור STR_NEWS_VEHICLE_HAS_DUPLICATE_ENTRY :{WHITE}ל{VEHICLE} כפילות ברשימת היעדים של STR_NEWS_VEHICLE_HAS_INVALID_ENTRY :{WHITE}{VEHICLE} יעד בלתי חוקי במסלול הנסיעה של +STR_NEWS_PLANE_USES_TOO_SHORT_RUNWAY :ל{WHITE}{VEHICLE} יש בהוראות שדה תעופה בעל מסלול קצר מידי STR_NEWS_VEHICLE_IS_GETTING_OLD :{WHITE}מתיישן {VEHICLE} STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}מתיישן מאוד {VEHICLE} @@ -929,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}רכבי כביש @@ -984,7 +994,12 @@ STR_GAME_OPTIONS_RESOLUTION :{BLACK}רזלו STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}בחר את רזולוציית המסך STR_GAME_OPTIONS_RESOLUTION_OTHER :אחר +STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}גודל ממשק +STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}בחר את ממשק גודל העצם לשימוש +STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :רגיל +STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :גודל כפול +STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :גודל מרובע STR_GAME_OPTIONS_BASE_GRF :{BLACK}ערכת גרפיקה בסיסית STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}בחר בערכת גרפיקה בסיסית לשימוש @@ -1079,6 +1094,7 @@ STR_TERRAIN_TYPE_VERY_FLAT :שטוח ביו STR_TERRAIN_TYPE_FLAT :שטוח STR_TERRAIN_TYPE_HILLY :נוף גבעות STR_TERRAIN_TYPE_MOUNTAINOUS :הררי +STR_TERRAIN_TYPE_ALPINIST :מטפס הרים STR_CITY_APPROVAL_PERMISSIVE :מתירני STR_CITY_APPROVAL_TOLERANT :סביר @@ -1087,6 +1103,7 @@ STR_CITY_APPROVAL_HOSTILE :עויין STR_WARNING_NO_SUITABLE_AI :{WHITE}אין בינות מלאכותיות מתאימות...{}באפשרותך להוריד בינות מלאכותיות בעזרת מערכת ה'תוכן המקוון' # Settings tree window +STR_CONFIG_SETTING_TREE_CAPTION :{WHITE}הגדרות STR_CONFIG_SETTING_FILTER_TITLE :{BLACK}מחרוזת סינון: STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}הרחב הכל STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}צמצם הכל @@ -1190,6 +1207,8 @@ STR_CONFIG_SETTING_INFLATION :אנפלציה: STR_CONFIG_SETTING_INFLATION_HELPTEXT :אפשר אינפלציה בכלכלה, כך שהעלויות עולות מעט מהר יותר מאשר התשלומים STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH :אורך גשר מירבי: {STRING} STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH_HELPTEXT :אורך מירבי לבניית גשרים +STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT :גובה גשר מקסימלי: {STRING} +STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT_HELPTEXT :גובה מקסימלי לבניית גשרים STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH :אורך מנהרה מירבי: {STRING} STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH_HELPTEXT :אורך מירבי לבניית מנהרות STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD :{STRING} :שיטת היצירה של משאבי טבע חדשים @@ -1283,6 +1302,8 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :הצג את א STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :עובי קווים בגרפים: {STRING} STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :עובי הקו בגרפים. קו דק ניתן לקריאה באופן מדויק יותר, אולם קל יותר לראות קו עבה ולהבחין בין הצבעים של קוים עבים +STR_CONFIG_SETTING_LANDSCAPE :תמונת נוף: {STRING} +STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :תוואי נוף מגדירים תרחישי משחק עם דרישות מטען וצמיחת ערים שונות. NewGRF וסקריפטים של המשחק מאפשרים שליטה עדיין יותר STR_CONFIG_SETTING_LAND_GENERATOR :מחולל פני שטח: {STRING} STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT :המחולל המקורי מבוסס על הגרפיקה הבסיסית, ויוצר פני שטח אחידים. בורא הקרקע מבוסס על אלגוריתם רעש פרלין עם אפשרויות עריכה עדינות STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :מקורי @@ -1330,8 +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_REVERSE_SCROLLING :{STRING} :היפוך כיוון הגלילה של התצוגה -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :התנהגות בעת גלילת המפה באמצעות כפתור העכבר האמצעי. כאשר מבוטל, העכבר מזיז את המצלמה. כאשר מאופשר, העכבר מזיז את המפה +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} :'הצג מידות בעת בניית כבישים/מסילות וכיוב @@ -1363,8 +1384,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command-click STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Control-click STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :כבוי -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :גלילה בלחיצה שמאלית: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :אפשר גלילת המפה באמצעות גרירתה עם כפתור העכבר השמאלי. אפשרות זו שימושית במיוחד בעת שימוש במסך מגע לצורך גלילה +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 :בחר פרק זמן בין שמירות אוטומטיות @@ -1613,6 +1634,13 @@ STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :מחלקה מש STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :אופן החלוקה עבור מטענים אחרים: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"אסימטרי" הכוונה שכמויות מטען שרירותיות יכולות להישלח לכל אחד מהכיוונים. "ידני" הכוונה שאין חלוקה אוטומטית עבור המטען. STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :דיוק החלוקה: {STRING} +STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :ככל שתקבע ערך גבוה יותר כך ייארך זמן עיבוד במעד של גרף הקישור. אם זה ייארך זמן רב מידי אתה עלול לראות תקיעות. אולם אם תקבע ערך זה להיות נמוך, החלוקה לא תהיה מדוייקת, ואתה עלול לראות שהמטען לא יישלח למקומות שאתה מצפה שישלח. +STR_CONFIG_SETTING_DEMAND_DISTANCE :השפעת המרחק על ביקושים: {STRING} +STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :אם תקבע ערך זה ליותר מ-0, המרחק בין תחנת מקור A של מטען מסויים ויעד אפשרי B ישפיע על כמות המטען שנשלח מ-A ל-B. ככל ש-B מרוחקת מ-A כך פחות מטען יישלח. כלל שתקבע ערך גבוה יותר, כך פחות מטען יישלח לתחנות מרוחקות ויותר מטען יישלח לתחנות קרובות. +STR_CONFIG_SETTING_DEMAND_SIZE :כמות המטען החוזר עבור מצב סימטרי: {STRING} +STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :קביעת ערך זה לקטן מ-100% יגרום לחלוקה הסימטרית להתנהג יותר כמו חלוקה אסימטרית. פחות מטען יישלח בעל כורחו חזרה אם כמות מסויימת נשלחת לתחנה. אם ערך זה ייקבע ל-0%, החלוקה הסימטרית תהיה חלוקה אסימטרית. +STR_CONFIG_SETTING_SHORT_PATH_SATURATION :הרוויה של מסלולים קצרים לפני שימוש במסלולי קיבולת גבוהה: {STRING} +STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :לעיתים קרובות יש מספר מסלולים בין שתי תחנות נתונות. אלגוריתם מרחק-מטען יגרום לרוויה במסלול הקצר ביותר תחילה, אחר כך ישתמש במסלול הקצר הבא אחריו עד שהוא יהיה רווי וכן הלאה. רוויה נקבעת על ידי הערכת הקיבולת והשימוש המתוכנן. ברגע שכל המסלולים רוויים, אם עדיין נותר ביקוש, הוא יעמיס על כל המסלולים, תוך כדי העדפת המסלולים עם קיבולת גבוהה. רוב הזמן האלגוריתם לא יעריך את הקיבלת במדוייק. הגדרה זאת מאפשרת לך לציין עד לאיזה אחוז יש לגרום למסלול קצר לרוויה בפעם הראשונה לפני שייבחר המסלול הבא הארוך ממנו. קבע הגדרה זו לערך קטן מ-100% כדי למנוע תחנות צפופות במקרה של הערכת יתר של הקיבולת. STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :יחידות מהירות: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :כאשר מוצגת מהירות השתמש ביחידות הנבחרות @@ -1651,11 +1679,23 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :מטרי (מט STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (מטר) STR_CONFIG_SETTING_LOCALISATION :{ORANGE}הגדרות מיקום +STR_CONFIG_SETTING_GRAPHICS :{ORANGE}גרפיקה STR_CONFIG_SETTING_SOUND :{ORANGE}צלילים STR_CONFIG_SETTING_INTERFACE :{ORANGE}ממשק חזותי +STR_CONFIG_SETTING_INTERFACE_GENERAL :{ORANGE}כללי +STR_CONFIG_SETTING_INTERFACE_VIEWPORTS :{ORANGE}נקודות מבט STR_CONFIG_SETTING_INTERFACE_CONSTRUCTION :{ORANGE}בנייה +STR_CONFIG_SETTING_ADVISORS :{ORANGE}חדשות / יועצים +STR_CONFIG_SETTING_COMPANY :{ORANGE}חברה +STR_CONFIG_SETTING_ACCOUNTING :{ORANGE}חשבונאות STR_CONFIG_SETTING_VEHICLES :{ORANGE}כלי תחבורה +STR_CONFIG_SETTING_VEHICLES_PHYSICS :{ORANGE}פיזיקה STR_CONFIG_SETTING_VEHICLES_ROUTING :{ORANGE}ניתוב +STR_CONFIG_SETTING_LIMITATIONS :{ORANGE}מגבלות +STR_CONFIG_SETTING_ACCIDENTS :{ORANGE}אסונות / תאונות +STR_CONFIG_SETTING_GENWORLD :{ORANGE}יצירת עולם +STR_CONFIG_SETTING_ENVIRONMENT :{ORANGE}סביבה +STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :{ORANGE}רשויות STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :{ORANGE}ערים STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}תעשיות STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}התפלגות המטען @@ -1694,6 +1734,8 @@ STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_ALGORITHM :{WHITE}... פו STR_CONFIG_ERROR_INVALID_BASE_GRAPHICS_NOT_FOUND :{WHITE}... מתעלם מערכת גרפיקה בסיסית '{STRING}': לא נמצאה STR_CONFIG_ERROR_INVALID_BASE_SOUNDS_NOT_FOUND :{WHITE}... מתעלם מערכת צלילים בסיסית '{STRING}': לא נמצאה STR_CONFIG_ERROR_INVALID_BASE_MUSIC_NOT_FOUND :{WHITE}... מתעלם מערכת מוסיקה בסיסית '{STRING}': לא נמצאה +STR_CONFIG_ERROR_OUT_OF_MEMORY :{WHITE}הזיכרון התמלא +STR_CONFIG_ERROR_SPRITECACHE_TOO_BIG :{WHITE} הקצאת {BYTES} בתים של מטמון נכשלה. המטמון הופחת ל-{BYTES} בתים. דבר זה יפחית את הביצועים של OpenTTD. כדי להפחית את דרישות הזיכרון ניתן לנסות לבטל את הגרפיקה ב-32bbp ו/או רמות ה-זום-אין # Intro window STR_INTRO_CAPTION :{WHITE}OpenTTD {REV} @@ -1707,10 +1749,11 @@ STR_INTRO_MULTIPLAYER :{BLACK}משחק STR_INTRO_GAME_OPTIONS :{BLACK}אפשרויות STR_INTRO_HIGHSCORE :{BLACK}טבלת ניקוד מירבי +STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}הגדרות STR_INTRO_NEWGRF_SETTINGS :{BLACK}(NewGRF)הגדרות שדרוג גראפי STR_INTRO_ONLINE_CONTENT :{BLACK} בדוק תוכן מקוון STR_INTRO_SCRIPT_SETTINGS :{BLACK}הגדרות סקריפטים של משחק/שחקני מחשב -STR_INTRO_QUIT :{BLACK}צא +STR_INTRO_QUIT :{BLACK}יציאה STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}התחל משחק חדש. Ctrl+לחיצה מדלג על תצורת מפה STR_INTRO_TOOLTIP_LOAD_GAME :{BLACK}טען משחק שמור @@ -1726,11 +1769,13 @@ STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}ארץ STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}הצג הגדרות משחק STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}הצג טבלת ניקוד מירבי +STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}הצגת הגדרות STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}הצג הגדרות שדרוג גראפי STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK} חפש תוכן חדש/מעודכן להורדה STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK} הצג הגדרות סקריפטים של משחק/שחקני מחשב STR_INTRO_TOOLTIP_QUIT :{BLACK}צא מ-'OpenTTD' +STR_INTRO_BASESET :{BLACK}חסרים {NUM} ספרייט עבור גרפיקות הבסיס שנבחרו. אנא בדוק עדכונים לערכה זו. STR_INTRO_TRANSLATION :{BLACK}בתרגום זה חסרים {P 0 "מחרוזת " ""}{NUM}{P "" " מחרוזות"}. אנא עזור לשפר את OpenTTD ע"י הצטרפות כמתרגם. קרא בקובץ readme.txt לפרטים. # Quit window @@ -1752,7 +1797,7 @@ STR_OSNAME_OS2 :מערכת הפ STR_OSNAME_SUNOS :סולריס # Abandon game -STR_ABANDON_GAME_CAPTION :{WHITE}עזוב משחק +STR_ABANDON_GAME_CAPTION :{WHITE}עזיבת משחק STR_ABANDON_GAME_QUERY :{YELLOW}?האם אתה בטוח שברצונך לעזוב את המשחק STR_ABANDON_SCENARIO_QUERY :{YELLOW}האם אתה בטוח שברצונך לצאת משלב זה? @@ -1766,7 +1811,7 @@ STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}טרק STR_CHEAT_CROSSINGTUNNELS :{ORANGE}{STRING}{LTBLUE} :מנהרות יכולות לחצות זו את זו STR_CHEAT_NO_JETCRASH :{LTBLUE}מטוסי סילון לא יתרסקו (לעיתים קרובות) בשדות תעופה קטנים: {ORANGE}{STRING} STR_CHEAT_EDIT_MAX_HL :{LTBLUE}ערוך את הגובה המקסימלי במפה: {ORANGE}{NUM} -STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :ערוך את הגובה המקסימלי של הרים במפה +STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}ערוך את הגובה המקסימלי של הרים במפה STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :אקלים ממוזג STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :אקלים קר STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :אקלים טרופי @@ -1871,6 +1916,10 @@ STR_FACE_TIE_EARRING_TOOLTIP :{BLACK} שנה # Network server list STR_NETWORK_SERVER_LIST_CAPTION :{WHITE}משחק רשת +STR_NETWORK_SERVER_LIST_ADVERTISED :{BLACK}מפורסם +STR_NETWORK_SERVER_LIST_ADVERTISED_TOOLTIP :{BLACK}בחר בין משחק מפורסם (אינטרנטי) ומשחק לא מפורסם (רשת מקומית, LAN) +STR_NETWORK_SERVER_LIST_ADVERTISED_NO :לא +STR_NETWORK_SERVER_LIST_ADVERTISED_YES :כן STR_NETWORK_SERVER_LIST_PLAYER_NAME :{BLACK} :שם השחקן STR_NETWORK_SERVER_LIST_ENTER_NAME_TOOLTIP :{BLACK}זהו שמך כפי שיצפה ע"י המשתתפים האחרים @@ -1929,6 +1978,8 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}השם STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}קבע סיסמה STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}הגן על המשחק שלך עם סיסמה אם אתה לא רוצה שהוא יהיה זמין לכולם +STR_NETWORK_START_SERVER_UNADVERTISED :לא +STR_NETWORK_START_SERVER_ADVERTISED :כן STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} לקוח{P "" "ות"} STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}מספר מקסימלי של לקוחות: STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK} :מספר משתתפים מירבי @@ -2168,6 +2219,10 @@ STR_CONTENT_SELECT_UPDATES_CAPTION :{BLACK} בחר STR_CONTENT_SELECT_UPDATES_CAPTION_TOOLTIP :{BLACK} בחר את כל התכנים המהווים שדרוג לבחירה קיימת STR_CONTENT_UNSELECT_ALL_CAPTION :{BLACK} בטל בחירה STR_CONTENT_UNSELECT_ALL_CAPTION_TOOLTIP :{BLACK} בטל את כל הבחירות להורדה +STR_CONTENT_SEARCH_EXTERNAL :{BLACK}חפש באתרים חיצוניים +STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}חיפוש תוכן שלא זמין בשירות התוכן של OpenTTD באתרים שלא משוייכים לפרויקט OpenTTD +STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}אתה עומד לצאת מ-OpenTTD! +STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE} התנאים להורדת תוכן מאתר חיצוני השתנו.{}עלייך לפנות לאתרים חיצוניים להנחיות כיצד להתקין את התוכן לתוך OpenTTD.{}האם ברצונך להמשיך? STR_CONTENT_FILTER_TITLE :{BLACK}סינון תוית\שם: STR_CONTENT_OPEN_URL :{BLACK}בקר באתר האינטרנט STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}בקר באתר האינטרנט עבור התוכן הזה @@ -2239,8 +2294,14 @@ STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}הסתר # Linkgraph legend window STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}מקרא זרימת מטענים +STR_LINKGRAPH_LEGEND_ALL :{BLACK}הכל +STR_LINKGRAPH_LEGEND_NONE :{BLACK}ללא +STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}בחר חברות להצגה # Linkgraph legend window and linkgraph legend in smallmap +STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}לא בשימוש +STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLACK}רווי +STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}העמסת יתר # Base for station construction window(s) STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}הדגשת שטח הכיסוי @@ -2543,6 +2604,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}שם מ STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}{LTBLUE}{STRING}: שדרוג גראפי STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK} :מקבל {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({1:STRING} {0:COMMA}/8 ) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}סוג מסילה: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}מגבלת מהירות על המסילה: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}הגבלת מהירות בכביש: {LTBLUE}{VELOCITY} @@ -2555,29 +2617,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :שדות STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :אדמה מכוסה בשלג STR_LAI_CLEAR_DESCRIPTION_DESERT :מדבר -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} מסילה -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} מסילה עם רמזורים חוסמים -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} מסילה עם רמזורים מקדימים -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} מסילה עם רמזורי יציאה -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} מסילה עם רמזורים משולבים -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} מסילה עם רמזורי נתיב -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} מסילה עם רמזורי נתיב חד-סטריים -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} מסילה עם רמזורים חוסמים ומקדימים -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} מסילה עם רמזורים חוסמים ורמזורי יציאה -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} מסילה עם רמזורים חוסמים ורמזורים משולבים -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} מסילה עם רמזורים חוסמים ורמזורי נתיב -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} מסילה עם רמזורים חוסמים ורמזורי נתיב חד-סטריים -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} מסילה עם רמזורים מקדימים ורמזורי יציאה -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} מסילה עם רמזורים מקדימים ורמזורים משולבים -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} מסילה עם רמזורים מקדימים ורמזורי נתיב -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} מסילה עם רמזורים מקדימים ורמזורי נתיב חד-סטריים -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} מסילה עם רמזורי יציאה ורמזורים משולבים -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} מסילה עם רמזורי יציאה ורמזורי נתיב -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} מסילה עם רמזורי יציאה ורמזורי נתיב חד-סטריים -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} מסילה עם רמזורים משולבים ורמזורי נתיב -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} מסילה עם רמזורים משולבים ורמזורי נתיב חד-סטריים -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} מסילה עם רמזורי נתיב ורמזורי נתיב חד-סטריים -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} מוסך רכבות +STR_LAI_RAIL_DESCRIPTION_TRACK :מסילת ברזל +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :מסילת ברזל עם רמזורים חוסמים +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :מסילת ברזל עם רמזורים מקדימים +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :מסילת ברזל מסילה עם רמזורי יציאה +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :מסילת ברזל עם רמזורים משולבים +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :מסילת ברזל עם רמזורי נתיב +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :מסילת ברזל עם רמזורי נתיב חד-סטריים +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :מסילת ברזל מסילה עם רמזורים חוסמים ומקדימים +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :מסילת ברזל עם רמזורים חוסמים ורמזורי יציאה +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :מסילת ברזל עם רמזורים חוסמים ורמזורים משולבים +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :מסילת ברזל עם רמזורים חוסמים ורמזורי נתיב +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :מסילת ברזל עם רמזורים חוסמים ורמזורי נתיב חד-סטריים +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :מסילת ברזל עם רמזורים מקדימים ורמזורי יציאה +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :מסילת ברזל עם רמזורים מקדימים ורמזורים משולבים +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :מסילת ברזל מסילה עם רמזורים מקדימים ורמזורי נתיב +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :מסילת ברזל עם רמזורים מקדימים ורמזורי נתיב חד-סטריים +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :מסילת ברזל עם רמזורי יציאה ורמזורים משולבים +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :מסילת ברזל עם רמזורי יציאה ורמזורי נתיב +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :מסילת ברזל עם רמזורי יציאה ורמזורי נתיב חד-סטריים +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :מסילת ברזל עם רמזורים משולבים ורמזורי נתיב +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :מסילת ברזל עם רמזורים משולבים ורמזורי נתיב חד-סטריים +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :מסילת ברזל עם רמזורי נתיב ורמזורי נתיב חד-סטריים +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :מוסך רכבות STR_LAI_ROAD_DESCRIPTION_ROAD :כביש STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :כביש עם תאורת רחוב @@ -2639,9 +2701,30 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :שטח בבעל # About OpenTTD window STR_ABOUT_OPENTTD :{WHITE}OpenTTD אודות -STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}כל הזכויות שמורות , {COPYRIGHT}1995 כריס סויר - {NBSP}זכויות יוצרים מקוריות +STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}כל הזכויות שמורות , {COPYRIGHT}1995 כריס סויר - זכויות יוצרים מקוריות STR_ABOUT_VERSION :{BLACK}{REV} גירסה , OpenTTD -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2015 The OpenTTD team +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}שמור משחק @@ -2669,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}* @@ -2828,7 +2911,11 @@ STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}עבור STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}הספרייט הקודם STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}עבור לספרייט הקודם, כאשר נדלג על כל הספרייטים המיוחדים ונחזור מתחילת הרשימה לסופה STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}הייצוג של הספרייט הנבחר. בעת ציור הספרייט, נתעלם מהיישור שלו -STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}הזז את הספרייט, תוך שינוי מיקום על צירי ה-X וה-Y +STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}הזז את הספרייט, תוך שינוי ההיסט של צירי ה-X וה-Y. לחץ עם ctrl כדי להזיז את הספרייט שמונה יחידות בבת אחת +STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}איפוס יחסית +STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}איפוס ההיסטים היחסיים הנוכחיים +STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}היסט X: {NUM}, היסט Y: {NUM} (מוחלט) +STR_SPRITE_ALIGNER_OFFSETS_REL :{BLACK}היסט X: {NUM}, היסט Y: {NUM} (יחסית) STR_SPRITE_ALIGNER_PICKER_BUTTON :{BLACK}בחר ספרייט STR_SPRITE_ALIGNER_PICKER_TOOLTIP :{BLACK}בחר ספרייט מנקודה כלשהיא במסך @@ -2856,8 +2943,6 @@ STR_NEWGRF_ERROR_INVALID_ID :ניסיון ש STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} מכיל אלמנט גרפי שגוי. כל האלמנטים הגרפיים השגויים יוצגו כסימן שאלה אדום (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :מכיל מספר רשומות Action 8 (ספרייט {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :קראת אחר סוף הפסאודו-ספרייט (ספרייט {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}בערכת גרפיקה הבסיסית חסרים מספר ספרייטים.{}אנא עדכן את הערכה הגרפית הבסיסית -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}בערכת גרפיקה הבסיסית חסרים מספר ספרייטים.{}אנא עדכן את הערכה הגרפית הבסיסית.{}מכיוון שהינך משחק {YELLOW}גרסת פיתוח של OpenTTD{WHITE}, אולי תצטרך {YELLOW}גרסת פיתוח של ערכת הגרפיקה הבסיסית{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :משאב GRF המבוקש אינו זמין (ספרייט {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} נהפך ללא זמין ע"י {2:STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :מבנה פורמט ספרייט לא תקין/לא ידוע (ספרייט {3:NUM}) @@ -2885,6 +2970,7 @@ STR_NEWGRF_LIST_MISSING :{RED}חסרים STR_NEWGRF_BROKEN :{WHITE}התנהגות ה-NewGRF '{STRING}' עלולה לגרום לקריסה ו/או חוסר סנכרון STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}שינה את מצב קרון מונע עבור '{1:ENGINE}' כאשר לא נמצא במוסך STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}זה שינה את אורך הרכב ל'{1:ENGINE}' כאשר לא במוסך +STR_NEWGRF_BROKEN_CAPACITY :{WHITE}זה שינה את קיבולת כלי הרכב של '{1:ENGINE}' כשלא בתוך מוסך או תיקון STR_BROKEN_VEHICLE_LENGTH :{WHITE}רכבת '{VEHICLE}' השייכת לחברת '{COMPANY}' בעלת אורך לא חוקי. דבר זה נגרם ככל הנראה בעקבות בעיות ב-NEWGRF. המשחק עלול לצאת מסנכרון או לקרוס STR_NEWGRF_BUGGY :{WHITE}NewGRF '{0:STRING}' סיפק מידע לא נכון @@ -2924,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} @@ -2931,8 +3018,6 @@ STR_TOWN_POPULATION :{BLACK}אוכל STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (עיר) STR_TOWN_VIEW_POPULATION_HOUSES :{ORANGE}{1:COMMA}{BLACK} :בתים {ORANGE}{0:COMMA}{BLACK} :אוכלוסיה -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{ORANGE}{1:COMMA}{BLACK} :מספר מירבי {ORANGE}{0:COMMA}{BLACK} :נוסעים בחודש שעבר -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{ORANGE}{1:COMMA}{BLACK} :מספר מירבי {ORANGE}{0:COMMA}{BLACK} :שקי דואר בחודש שעבר STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}המטען שצריך בשביל גידול עיר STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} דרוש STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} דרוש בחורף @@ -2989,6 +3074,8 @@ STR_GOALS_GLOBAL_TITLE :{BLACK}מטרו STR_GOALS_TEXT :{ORANGE}{STRING} STR_GOALS_NONE :{ORANGE}- אין - STR_GOALS_SPECTATOR_NONE :{ORANGE}- לא זמין - +STR_GOALS_PROGRESS :{ORANGE}{STRING} +STR_GOALS_PROGRESS_COMPLETE :{GREEN}{STRING} STR_GOALS_COMPANY_TITLE :{BLACK}מטרות חברה: STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}הקלק על מטרה כדי למרכז את התצוגה הראשית על תעשיה/עיירה/משבצת. קליק תוך כדי לחיצה על מקש Ctrl פותח חלון תצוגה חדש במיקום התעשיה/העיירה/המשבצת @@ -3029,6 +3116,15 @@ STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}לחץ על שירות כדי להתמקד על עיר/תעשייה. Ctrl+לחיצה פותח חלונית תצוגה חדשה על מיקום העיר/תעשייה # Story book window +STR_STORY_BOOK_CAPTION :ספר סיפור {WHITE}{COMPANY} +STR_STORY_BOOK_SPECTATOR_CAPTION :{WHITE}ספר סיפור כללי +STR_STORY_BOOK_TITLE :{YELLOW}{STRING} +STR_STORY_BOOK_GENERIC_PAGE_ITEM :עמוד {NUM} +STR_STORY_BOOK_SEL_PAGE_TOOLTIP :{BLACK}קפוץ לדף מסויים באמצעות בחירתו ברשימה נפתחת זו. +STR_STORY_BOOK_PREV_PAGE :{BLACK}קודם +STR_STORY_BOOK_PREV_PAGE_TOOLTIP :{BLACK}עבור לעמוד קודם +STR_STORY_BOOK_NEXT_PAGE :{BLACK}הבא +STR_STORY_BOOK_NEXT_PAGE_TOOLTIP :{BLACK}עבור לעמוד הבא STR_STORY_BOOK_INVALID_GOAL_REF :{RED}מטרה לא תקינה # Station list window @@ -3046,16 +3142,19 @@ STR_STATION_LIST_NO_WAITING_CARGO :{BLACK}שום STR_STATION_VIEW_CAPTION :{WHITE}{STATION} {STATION_FEATURES} STR_STATION_VIEW_WAITING_CARGO :{WHITE}{CARGO_LONG} STR_STATION_VIEW_EN_ROUTE_FROM :{YELLOW}({CARGO_SHORT} בדרך מ{STATION}) +STR_STATION_VIEW_RESERVED :{YELLOW}({CARGO_SHORT} שמור לטעינה) STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}מקבל STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}הצג רשימת סוגי המטען שהתחנה מקבלת STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}מקבלת: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}לתחנה זו זכויות תעבורה בלעדיות בעיירה זו. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} רכשה זכויות תעבורה בלעדיות בעיירה זו. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}לתחנה זו זכויות תעבורה בלעדיות בעיירה זו. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} רכשה זכויות תעבורה בלעדיות בעיירה זו. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}דירוג STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}הצג את דירוג השירות +STR_STATION_VIEW_SUPPLY_RATINGS_TITLE :{BLACK}אספקה חודשית ודירוג מקומי: +STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}: {YELLOW}{COMMA} / {STRING} ({COMMA}%) STR_STATION_VIEW_GROUP :{BLACK}קבץ לפי STR_STATION_VIEW_WAITING_STATION :תחנה: בהמתנה @@ -3221,6 +3320,7 @@ STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK} :תפו STR_INDUSTRY_VIEW_TRANSPORTED :{BLACK}(הובלו {NBSP}{2:COMMA}%) {YELLOW}{1:STRING}{0:CARGO_LONG} STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}מקד את התצוגה הראשית על מיקום התעשייה. Ctrl+לחיצה פותח חלונית תצוגה חדשה על מיקום התעשייה STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}רמת הפקה: {YELLOW}{COMMA}% +STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}התעשייה הכריזה על סגירה מתקרבת! ############ range for requires starts STR_INDUSTRY_VIEW_REQUIRES_CARGO :{YELLOW}{1:STRING}{0:STRING}{BLACK} : דורש @@ -3228,9 +3328,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{YELLOW}{3:STRI STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{YELLOW}{5:STRING}{4:STRING},{3:STRING}{2:STRING},{1:STRING}{0:STRING}{BLACK} :דורש ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}דורש: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} ממתין{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}סחורה שמחכה לעיבוד: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{YELLOW}{1:STRING}{0:STRING}{BLACK} :מייצר STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{YELLOW}{3:STRING}{2:STRING},{1:STRING}{0:STRING}{BLACK} :מייצר ############ range for produces ends @@ -3289,12 +3391,19 @@ STR_GROUP_DELETE_TOOLTIP :{BLACK}מחק STR_GROUP_RENAME_TOOLTIP :{BLACK}שנה את שם הקבוצה STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}לחץ על מנת להגן על הכלים בקבוצה בפני החלפה אוטומטית +STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}מחק קבוצה +STR_GROUP_DELETE_QUERY_TEXT :{WHITE}אתה בטוח שברצונך למחוק את הקבוצה הזאת ואת הקשורים אליה? STR_GROUP_ADD_SHARED_VEHICLE :הוסף כלים STR_GROUP_REMOVE_ALL_VEHICLES :הסר את כל הכלים מהקבוצה 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 STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :רכבות חדשות STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :רכבות חשמליות חדשות @@ -3326,6 +3435,7 @@ STR_PURCHASE_INFO_ALL_TYPES :כל סוגי STR_PURCHASE_INFO_ALL_BUT :{CARGO_LIST} כל סוגי המטען למעט STR_PURCHASE_INFO_MAX_TE :{BLACK}כוח סחיבה מקסימלי: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}טווח: {GOLD}{COMMA} משבצות +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}סוג כלי טיס: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK} בחירת קרונות - לחץ על קרון לקבלת מידע STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}רשימת כלי הרכב - בחר כלי רכב למידע @@ -3352,9 +3462,19 @@ STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_TOOLTIP :{BLACK}שנה STR_BUY_VEHICLE_SHIP_RENAME_TOOLTIP :{BLACK}החלף שם סוג כלי השייט STR_BUY_VEHICLE_AIRCRAFT_RENAME_TOOLTIP :{BLACK}החלף שם סוג כלי הטיס +STR_BUY_VEHICLE_TRAIN_HIDE_TOGGLE_BUTTON :{BLACK}הסתר +STR_BUY_VEHICLE_ROAD_VEHICLE_HIDE_TOGGLE_BUTTON :{BLACK}הסתר +STR_BUY_VEHICLE_SHIP_HIDE_TOGGLE_BUTTON :{BLACK}הסתר +STR_BUY_VEHICLE_AIRCRAFT_HIDE_TOGGLE_BUTTON :{BLACK}הסתר +STR_BUY_VEHICLE_TRAIN_SHOW_TOGGLE_BUTTON :{BLACK}תצוגה +STR_BUY_VEHICLE_ROAD_VEHICLE_SHOW_TOGGLE_BUTTON :{BLACK}תצוגה +STR_BUY_VEHICLE_SHIP_SHOW_TOGGLE_BUTTON :{BLACK}תצוגה +STR_BUY_VEHICLE_AIRCRAFT_SHOW_TOGGLE_BUTTON :{BLACK}תצוגה -STR_BUY_VEHICLE_SHIP_HIDE_SHOW_TOGGLE_TOOLTIP :הסתר/הצג סוג של כלי שיט +STR_BUY_VEHICLE_TRAIN_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}החלף בין הסתרה/הצגה של סוג רכבת +STR_BUY_VEHICLE_ROAD_VEHICLE_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}החלף בין הסתרה/הצגה של סוג רכב כביש +STR_BUY_VEHICLE_SHIP_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}הסתר/הצג סוג של כלי שיט STR_BUY_VEHICLE_AIRCRAFT_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}הסתר/הצג סוג של כלי טיס STR_QUERY_RENAME_TRAIN_TYPE_CAPTION :{WHITE}שנה את שם סוג קרון הרכבת @@ -3449,10 +3569,11 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :קטר פס מ STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}{1:WEIGHT_SHORT} :משקל {NBSP}{0:CURRENCY_LONG} :מחיר{} {NBSP}{3:POWER} :עצמת מנוע {NBSP}{2:VELOCITY} :מהירות {NBSP}{}{5:CARGO_LONG} : קיבולת {NBSP} לשנה {NBSP}{4:CURRENCY_LONG} :עלות תפעולית STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}עלות: {CURRENCY_LONG} משקל: {WEIGHT_SHORT}{}מהירות: {VELOCITY} הספק: {POWER} מקסימלי T.E.: {6:FORCE}{}עלות תפעולית: {4:CURRENCY_LONG}/לשנה{}קיבולת: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}עלות: {CURRENCY_LONG} מהירות מקסימלית: {VELOCITY}{}קיבולת: {CARGO_LONG}, {CARGO_LONG}{}עלות שוטפת: {CURRENCY_LONG}/לשנה -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}עלות: {CURRENCY_LONG} מהירות מקסימלית: {VELOCITY}{}קיבולת: {CARGO_LONG}{}הוצאה שוטפת: {CURRENCY_LONG}/לשנה -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}עלות: {CURRENCY_LONG} מהירות מירבית: {VELOCITY} טווח: {COMMA} משבצות{}קיבולת: {CARGO_LONG}, {CARGO_LONG}{}עלות תפעול: {CURRENCY_LONG}/שנה -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}עלות: {CURRENCY_LONG} מהירות מירבית: {VELOCITY} טווח: {COMMA} משבצות{}קיבולת: {CARGO_LONG}{}עלות תפעול: {CURRENCY_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} @@ -3461,6 +3582,10 @@ STR_REPLACE_VEHICLE_ROAD_VEHICLE :רכב STR_REPLACE_VEHICLE_SHIP :כלי שייט STR_REPLACE_VEHICLE_AIRCRAFT :כלי טייס +STR_REPLACE_VEHICLE_VEHICLES_IN_USE :{YELLOW}כלי רכב בשימוש +STR_REPLACE_VEHICLE_VEHICLES_IN_USE_TOOLTIP :{BLACK}עמודה עם כלי רכב בבעלותך +STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES :{YELLOW}כלי רכב זמינים +STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES_TOOLTIP :{BLACK}עמודה עם כלי רכב זמינים להחלפה STR_REPLACE_HELP_LEFT_ARRAY :{BLACK}בחר את סוג המנוע/קטר שברצונך להחליף STR_REPLACE_HELP_RIGHT_ARRAY :{BLACK}בחר את הקטר/מנוע שברצונך לבנות במקום הקטר/מנוע הקיים @@ -3475,10 +3600,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} כאש STR_REPLACE_VEHICLES_STOP :{BLACK}הפסק את החלפת הכלים STR_REPLACE_HELP_STOP_BUTTON :{BLACK}לחץ כאן להפסיק את ההחלפה -STR_REPLACE_ENGINE_WAGON_SELECT :{ORANGE}{STRING}{BLACK} : מחליף STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}החלף בין חלונות החלפת קרון וקטר STR_REPLACE_ENGINES :מנועים/קטרים STR_REPLACE_WAGONS :קרונות +STR_REPLACE_ALL_RAILTYPE :כלל הרכבות STR_REPLACE_HELP_RAILTYPE :{BLACK}בחר את סוג המסילה עבורה ברצונך להחליף קטרים STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK} מציג אילו קטרים מוחלפים זה בזה @@ -3571,7 +3696,8 @@ STR_VEHICLE_INFO_AGE :({1:COMMA}) ש STR_VEHICLE_INFO_AGE_RED :{RED}({1:COMMA}) שנים {NBSP}{0:COMMA} STR_VEHICLE_INFO_MAX_SPEED :{BLACK}מהירות מקסימלית: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}מהירות מירבית: {LTBLUE}{VELOCITY} {BLACK}טווח: {LTBLUE}{COMMA} משבצות +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}מהירות מקס.: {LTBLUE}{VELOCITY} {BLACK}סוג כלי טיס: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}מהירות מקסימלית: {LTBLUE}{VELOCITY} {BLACK}סוג כלי טיס: {LTBLUE}{STRING} {BLACK}טווח: {LTBLUE}{COMMA} משבצות STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}משקל: {LTBLUE}{WEIGHT_SHORT} {BLACK}הספק: {LTBLUE}{POWER}{BLACK} מהירות מקסימלית: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}משקל: {LTBLUE}{WEIGHT_SHORT} {BLACK}הספק: {LTBLUE}{POWER}{BLACK} מהירות מקסימלית: {LTBLUE}{VELOCITY} {BLACK}T.E. מקסימלי: {LTBLUE}{FORCE} @@ -3591,6 +3717,10 @@ STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{LTBLUE}{1:DATE STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}הגדל את מרווח הזמן עד קבלת שירות ב-10. Ctrl+לחיצה מגדיל את המרווח ב-5 STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}הקטן את מרווח הזמן עד קבלת שירות ב-10. Ctrl+לחיצה מקטינה את המרווח ב-5 +STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}שנה סוג מרווח שירות +STR_VEHICLE_DETAILS_DEFAULT :ברירת מחדל +STR_VEHICLE_DETAILS_DAYS :ימים +STR_VEHICLE_DETAILS_PERCENT :אחוז STR_QUERY_RENAME_TRAIN_CAPTION :{WHITE}תן שם לרכבת STR_QUERY_RENAME_ROAD_VEHICLE_CAPTION :{WHITE}תן שם לכלי הרכב @@ -3812,6 +3942,10 @@ STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :(מסע (ללא STR_TIMETABLE_TRAVEL_NOT_TIMETABLED_SPEED :סע במהירות שהיא לכל היותר {2:VELOCITY} (ללא לוח זמנים) STR_TIMETABLE_TRAVEL_FOR :{STRING} ערוך מסע ל STR_TIMETABLE_TRAVEL_FOR_SPEED :סע למשך {STRING} במהירות שהיא לכל היותר {VELOCITY} +STR_TIMETABLE_TRAVEL_FOR_ESTIMATED :מסע (עבור {STRING}, לא מתוזמן) +STR_TIMETABLE_TRAVEL_FOR_SPEED_ESTIMATED :מסע (עבור {STRING}, לא מתוזמן) במהירות שיא של {VELOCITY} +STR_TIMETABLE_STAY_FOR_ESTIMATED :(נשאר ל-{STRING}, לא מתוזמן) +STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(מסע עבור {STRING} ללא טבלת זמנים) STR_TIMETABLE_STAY_FOR :{STRING} והמתן למשך STR_TIMETABLE_AND_TRAVEL_FOR :{STRING} וערוך מסע ל STR_TIMETABLE_DAYS :{P 0 "יום " ""}{COMMA}{P "" " ימים"} @@ -3965,6 +4099,10 @@ STR_INCOME_FLOAT_INCOME_SMALL :{TINY_FONT}{GRE STR_INCOME_FLOAT_INCOME :{GREEN} {CURRENCY_LONG} :הכנסה STR_FEEDER_TINY :{TINY_FONT}{YELLOW}העברה: {CURRENCY_LONG} STR_FEEDER :{YELLOW}העברה: {CURRENCY_LONG} +STR_FEEDER_INCOME_TINY :{TINY_FONT}{YELLOW}העברה: {CURRENCY_LONG}{WHITE} / {GREEN}הכנסה:{CURRENCY_LONG} +STR_FEEDER_INCOME :{YELLOW}העברה: {CURRENCY_LONG}{WHITE} / {GREEN}הכנסה: {CURRENCY_LONG} +STR_FEEDER_COST_TINY :{TINY_FONT}{YELLOW}העברה: {CURRENCY_LONG}{WHITE} / {RED}עלות: {CURRENCY_LONG} +STR_FEEDER_COST :{YELLOW}העברה: {CURRENCY_LONG}{WHITE} / {RED}עלות: {CURRENCY_LONG} STR_MESSAGE_ESTIMATED_COST :{WHITE}{CURRENCY_LONG} :מחיר משוער STR_MESSAGE_ESTIMATED_INCOME :{WHITE}{CURRENCY_LONG} :הכנסה משוערת @@ -4049,6 +4187,7 @@ STR_ERROR_EXCAVATION_WOULD_DAMAGE :{WHITE}חפיר STR_ERROR_ALREADY_AT_SEA_LEVEL :{WHITE}... כבר בגובה ים STR_ERROR_TOO_HIGH :{WHITE}... גבוה מידי STR_ERROR_ALREADY_LEVELLED :{WHITE}... הקרקע כבר שטוחה +STR_ERROR_BRIDGE_TOO_HIGH_AFTER_LOWER_LAND :{WHITE}אחרי הגשר שלמעלה זה יהיה גבוה מידי. # Company related errors STR_ERROR_CAN_T_CHANGE_COMPANY_NAME :{WHITE}לא ניתן לשנות את שם החברה... @@ -4099,6 +4238,8 @@ STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... יע STR_ERROR_CAN_ONLY_BE_BUILT_ABOVE_SNOW_LINE :{WHITE}... ניתן/ת לבנייה רק מעל לקו השלג STR_ERROR_CAN_ONLY_BE_BUILT_BELOW_SNOW_LINE :{WHITE}... ניתן/ת לבנייה רק מתחת לקו השלג +STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES :{WHITE}אין מיקומים מתאימים לתעשיות '{STRING}' +STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION :{WHITE}שנה את פרמטרי יצירת המפה לקבלת מפה טובה יותר # Station construction related errors STR_ERROR_CAN_T_BUILD_RAILROAD_STATION :{WHITE}לא ניתן לבנות תחנת רכבת כאן... @@ -4115,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}לא ניתן לשנות שם תחנה... @@ -4123,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}... לא ניתן לבטל חלק מהתחנה @@ -4263,6 +4404,7 @@ STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... שט STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}לא ניתן ליצור קבוצה... STR_ERROR_GROUP_CAN_T_DELETE :{WHITE}לא ניתן למחוק קבוצה זו... STR_ERROR_GROUP_CAN_T_RENAME :{WHITE}לא ניתן לשנות שם קבוצה... +STR_ERROR_GROUP_CAN_T_SET_PARENT :{WHITE}לא ניתן לקבוע קבוצת-אב... STR_ERROR_GROUP_CAN_T_REMOVE_ALL_VEHICLES :{WHITE}לא ניתן למחוק את כל הכלים מקבוצה זו... STR_ERROR_GROUP_CAN_T_ADD_VEHICLE :{WHITE}לא ניתן להוסיף כלי זה לקבוצה זו... STR_ERROR_GROUP_CAN_T_ADD_SHARED_VEHICLE :{WHITE}לא ניתן להוסיף כלים משותפים לרשימה זו... @@ -4366,6 +4508,15 @@ STR_ERROR_CAN_T_DELETE_SIGN :{WHITE}לא נ STR_DESKTOP_SHORTCUT_COMMENT :משחק סימולציה המבוסס על תחבורה, הון ופאר # Translatable descriptions in media/baseset/*.ob* files +STR_BASEGRAPHICS_DOS_DESCRIPTION :גרפיקות Transport Tycoon Deluxe המקורי בגרסת DOS. +STR_BASEGRAPHICS_DOS_DE_DESCRIPTION :גרפיקות Transport Tycoon Deluxe המקורי בגרסת DOS (גרמנית). +STR_BASEGRAPHICS_WIN_DESCRIPTION :גרפיקות Transport Tycoon Deluxe המקורי בגרסת Windows. +STR_BASESOUNDS_DOS_DESCRIPTION :צלילי Transport Tycoon Deluxe המקורי בגרסת DOS. +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 # Town building names diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index fa5cad44b1..f9f2e19a2b 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -732,10 +732,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}A 'Sajá STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Véletlen sorrendű lejátszás be/ki STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}A számkiválasztó ablak megjelenítése -STR_ERROR_NO_SONGS :{WHITE}Egy zeneszámokat nem tartalmazó zenei alapcsomag lett kiválasztva. A játékban nem lesz zene - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Zenei műsor kiválasztása STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Számlista STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}"{STRING}" Műsora @@ -1401,8 +1398,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Talaj színe a STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Zöld STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Sötétzöld STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Sötétkék -STR_CONFIG_SETTING_REVERSE_SCROLLING :Inverz görgetési irány: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :A térkép jobb gombbal történő görgetésének viselkedése. Kikapcsolva az egér mozgatja a kamerát. Bekapcsolva az egér a térképet mozgatja STR_CONFIG_SETTING_SMOOTH_SCROLLING :Finomított nézőpont-görgetés: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Beállítható, hogy a fő nézet hogyan mozogjon egy adott pozícióra a térképre kattintáskor ha egy adott objektumra történik mozgás. Bekapcsolva a nézet egyenletesen mozog, kikapcsolva közvetlenül a kijelölt helyre ugrik STR_CONFIG_SETTING_MEASURE_TOOLTIP :Területinformációk mutatása építési eszközök használatakor: {STRING} @@ -1434,8 +1429,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Parancs+Kattint STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+kattintás STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Kikapcsolva -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Bal gombos térképmozgatás: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Bal egérgombbal történő térképmozgatás engedélyezése. Különösen hasznos érintőképernyős mozgatás használata esetén +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Ablakok bezárása jobb gombbal: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :A jobb gombbal való kattintás az ablak területén bezárja az ablakot. Ez a beállítás kikapcsolja a segédletek jobb gombbal való megjelenítését! STR_CONFIG_SETTING_AUTOSAVE :Automatikus mentés: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Az automatikus mentések között eltelő idő @@ -1825,6 +1820,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Új és STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}MI és játékszkript beállítások megjelenítése STR_INTRO_TOOLTIP_QUIT :{BLACK}Kilépés az OpenTTD-ből +STR_INTRO_BASESET :{BLACK}A jelenleg kiválasztott grafikus alapcsomagból {NUM} sprite hiányzik. Frissítsd a grafikus alapcsomagot! STR_INTRO_TRANSLATION :{BLACK}Ebből a fordításból {NUM} sor hiányzik. Segíts Te is jobbá tenni az OpenTTD-t és jelentkezz fordítónak! További részletekért lásd a readme.txt-t. # Quit window @@ -2653,6 +2649,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Repülő STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Elfogad: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Vasút típusa: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Vasúti pályasebesség: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Közúti sebességkorlátozás: {LTBLUE}{VELOCITY} @@ -2665,29 +2662,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Szántóföld STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Havas föld STR_LAI_CLEAR_DESCRIPTION_DESERT :Sivatag -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} vasúti pálya -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} vasúti pálya normál jelzőkkel -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} vasúti pálya előjelzőkkel -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} vasúti pálya kijárati jelzőkkel -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} vasúti pálya kombinált jelzőkkel -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} vasúti pálya irányjelzőkkel -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} vasúti pálya egyirányú irányjelzőkkel -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} vasúti pálya normál- és előjelzőkkel -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} vasúti pálya normál- és kijárati jelzőkkel -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} vasúti pálya normál- és kombinált jelzőkkel -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} vasúti pálya normál- és irányjelzőkkel -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} vasúti pálya normál- és egyirányú irányjelzőkkel -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} vasúti pálya elő- és kijárati jelzőkkel -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} vasúti pálya elő- és kombinált jelzőkkel -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} vasúti pálya elő- és irányjelzőkkel -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} vasúti pálya elő- és egyirányú irányjelzőkkel -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} vasúti pálya kijárati- és kombinált jelzőkkel -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} vasúti pálya kijárati- és irányjelzőkkel -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} vasúti pálya kijárati- és egyirányú irányjelzőkkel -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} vasúti pálya kombinált- és irányjelzőkkel -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} vasúti pálya kombinált- és egyirányú irányjelzőkkel -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} vasúti pálya irány- és egyirányú irányjelzőkkel -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} járműtelep +STR_LAI_RAIL_DESCRIPTION_TRACK :Vasúti pálya +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Vasúti pálya normál jelzőkkel +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Vasúti pálya előjelzőkkel +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Vasúti pálya kijárati jelzőkkel +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Vasúti pálya kombinált jelzőkkel +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Vasúti pálya irányjelzőkkel +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Vasúti pálya egyirányú irányjelzőkkel +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Vasúti pálya normál- és előjelzőkkel +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Vasúti pálya normál- és kijárati jelzőkkel +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Vasúti pálya normál- és kombinált jelzőkkel +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Vasúti pálya normál- és irányjelzőkkel +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Vasúti pálya normál- és egyirányú irányjelzőkkel +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Vasúti pálya elő- és kijárati jelzőkkel +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Vasúti pálya elő- és kombinált jelzőkkel +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Vasúti pálya elő- és irányjelzőkkel +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Vasúti pálya elő- és egyirányú irányjelzőkkel +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Vasúti pálya kijárati- és kombinált jelzőkkel +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Vasúti pálya kijárati- és irányjelzőkkel +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Vasúti pálya kijárati- és egyirányú irányjelzőkkel +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Vasúti pálya kombinált- és irányjelzőkkel +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Vasúti pálya kombinált- és egyirányú irányjelzőkkel +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Vasúti pálya irány- és egyirányú irányjelzőkkel +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Vasúti járműtelep STR_LAI_ROAD_DESCRIPTION_ROAD :Út STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Út közvilágítással @@ -2751,7 +2748,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Vállalat álta STR_ABOUT_OPENTTD :{WHITE}Az OpenTTD-ről STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Eredeti copyright {COPYRIGHT} 1995 Chris Sawyer, Minden jog fenntartva STR_ABOUT_VERSION :{BLACK}OpenTTD {REV} verzió -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2015 Az OpenTTD csapat +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 @@ -2970,8 +2974,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Érvénytelen I STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} hibás sprite-ot tartalmaz. Minden hibás sprite piros kérdőjellel (?) kerül jelölésre STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Több Action 8 bejegyzést tartalmaz (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Ál-sprite távoli végének olvasása (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}A jelenleg használt grafikus alapcsomagból hiányzik számos sprite.{}Kérlek frissítsd a grafikus alapcsomagot -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}A használt alap grafikus csomagból néhány egység hiányzik.{}Kérjük frissítsd az alap grafikus csomagot.{}Mivel az {YELLOW}OpenTTD fejlesztői változatát{WHITE} használod, lehet, hogy a {YELLOW}fejlesztői alap grafikus csomagot{WHITE} kellene használnod STR_NEWGRF_ERROR_GRM_FAILED :Kért GRF források nem elérhetőek (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} kikapcsolva {STRING} által STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Érvénytelen/ismeretlen sprite szerkezet formátum (sprite {3:NUM}) @@ -3046,8 +3048,6 @@ STR_TOWN_POPULATION :{BLACK}Világn STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Város) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Lakosság: {ORANGE}{COMMA}{BLACK} Házak: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Utasok az előző hónapban: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Levélcsomagok az előző hónapban: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}A város növekedéséhez szükséges rakomány: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} szükséges STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} szükséges télen @@ -3178,8 +3178,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Elfogad STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Az elfogadott áruk listájának mutatása STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Elfogad:{WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Ez az állomás kizárólagos szállítási jogokkal rendelkezik ezen a településen. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} kizárólagos szállítási jogokat vásárolt a településen. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Ez az állomás kizárólagos szállítási jogokkal rendelkezik ezen a településen. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} kizárólagos szállítási jogokat vásárolt a településen. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Vélemény STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Vélemény megmutatása az állomásról @@ -3358,9 +3358,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Felhaszn STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Felhasznál: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Elfogad: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} várakozik{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Feldolgozásra váró rakomány: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Gyárt: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Gyárt: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3427,6 +3429,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Összes jármű STR_GROUP_RENAME_CAPTION :{BLACK}Csoport átnevezése +STR_GROUP_PROFIT_THIS_YEAR :Idei nyereség: +STR_GROUP_PROFIT_LAST_YEAR :Tavalyi nyereség: +STR_GROUP_OCCUPANCY :Jelenlegi kihasználtság: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Új vasúti járművek STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Új villamos vasúti járművek @@ -3458,6 +3465,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Minden rakomán STR_PURCHASE_INFO_ALL_BUT :Mindenre, kivéve {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Maximális vonóerő: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Hatótávolság: {GOLD}{COMMA} mező +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Típus: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Vasúti jármű kiválasztása - kattints egy járműre az adataihoz. Ctrl+kattintással a járműtípus elrejthető/felfedhető STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Közúti jármű kiválasztása - kattints egy járműre az adataihoz. Ctrl+kattintással a járműtípus elrejthető/felfedhető @@ -3591,10 +3599,11 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :Maglev mozdony STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Ár: {CURRENCY_LONG} Súly: {WEIGHT_SHORT}{}Sebesség: {VELOCITY} Teljesítmény: {POWER}{}Üzemeltetés: {CURRENCY_LONG}/év{}Kapacitás: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Ár: {CURRENCY_LONG} Súly: {WEIGHT_SHORT}{}Sebesség: {VELOCITY} Teljesítmény: {POWER} Maximális vonóerő: {6:FORCE}{}Üzemeltetés: {4:CURRENCY_LONG}/év{}Kapacitás: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Ár: {CURRENCY_LONG} Végsebesség: {VELOCITY}{}Kapacitás: {CARGO_LONG}, {CARGO_LONG}{}Üzemeltetés: {CURRENCY_LONG}/év -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Ár: {CURRENCY_LONG} Végsebesség: {VELOCITY}{}Kapacitás: {CARGO_LONG}{}Üzemeltetés: {CURRENCY_LONG}/év -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Ár: {CURRENCY_LONG} Végsebesség: {VELOCITY} Hatótávolság: {COMMA} mező{}Kapacitás: {CARGO_LONG}, {CARGO_LONG}{}Üzemeltetés: {CURRENCY_LONG}/év -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Ár: {CURRENCY_LONG} Végsebesség: {VELOCITY} Hatótávolság: {COMMA} mező{}Kapacitás: {CARGO_LONG}{}Üzemeltetés: {CURRENCY_LONG}/év +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Ár: {CURRENCY_LONG} Végsebesség: {VELOCITY}{}Kapacitás: {CARGO_LONG}{}Üzemeltetés: {CURRENCY_LONG}/év +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Ár: {CURRENCY_LONG} Sebesség: {VELOCITY}{}Típus: {STRING}{}Kapacitás: {CARGO_LONG}, {CARGO_LONG}{}Üzemeltetés: {CURRENCY_LONG}/év +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Ár: {CURRENCY_LONG} Sebesség: {VELOCITY}{}Típus: {STRING}{}Kapacitás: {CARGO_LONG}{}Üzemeltetés: {CURRENCY_LONG}/év +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Ár: {CURRENCY_LONG} Sebesség: {VELOCITY}{}Típus: {STRING} Hatótávolság: {COMMA} mező{}Kapacitás: {CARGO_LONG}, {CARGO_LONG}{}Üzemeltetés: {CURRENCY_LONG}/év +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Ár: {CURRENCY_LONG} Sebesség: {VELOCITY}{}Típus: {STRING} Hatótávolság: {COMMA} mező{}Kapacitás: {CARGO_LONG}{}Üzemeltetés: {CURRENCY_LONG}/év # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}{STRING} lecserélése - {STRING} @@ -3621,10 +3630,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} - csak STR_REPLACE_VEHICLES_STOP :{BLACK}Járműcsere befejezése STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Nyomd meg ezt a gombot, ha be akarod fejezni a bal oldalon kiválasztott járművek cseréjét -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Lecserél: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Váltás a mozdony és a vagoncserélő ablak között STR_REPLACE_ENGINES :Mozdonyok STR_REPLACE_WAGONS :Vagonok +STR_REPLACE_ALL_RAILTYPE :Minden vasúti jármű STR_REPLACE_HELP_RAILTYPE :{BLACK}Cserélendő egységek vasúttípusának kiválasztása STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Megmutatja, hogy melyik bal oldali egységet akarod kicserélni @@ -3717,7 +3726,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} év ({C STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} év ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Végsebesség: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Végsebesség: {LTBLUE}{VELOCITY} {BLACK}Hatótávolság: {LTBLUE}{COMMA} mező +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Sebesség: {LTBLUE}{VELOCITY} {BLACK}Típus: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Sebesség: {LTBLUE}{VELOCITY} {BLACK}Típus: {LTBLUE}{STRING} {BLACK}Hatótávolság: {LTBLUE}{COMMA} mező STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Súly: {LTBLUE}{WEIGHT_SHORT} {BLACK}Teljesítmény: {LTBLUE}{POWER}{BLACK} Végsebesség: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Súly: {LTBLUE}{WEIGHT_SHORT} {BLACK}Teljesítmény: {LTBLUE}{POWER}{BLACK} Végsebesség: {LTBLUE}{VELOCITY} {BLACK}Vonóerő: {LTBLUE}{FORCE} @@ -4276,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 0ff5e8fd8d..31c6ff796b 100644 --- a/src/lang/icelandic.txt +++ b/src/lang/icelandic.txt @@ -647,10 +647,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Velja 'S STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Kveikja/slökkva á stokkun STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Sýna lagalista -STR_ERROR_NO_SONGS :{WHITE}Tómur lagalisti hefur verið valinn. Engin lög verða spiluð - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Lagalistar STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Laganúmer STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Listi - '{STRING}' @@ -1273,8 +1270,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Litur á landsl STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Grænn STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Dökkgrænn STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Fjólublátt -STR_CONFIG_SETTING_REVERSE_SCROLLING :Færa sjónarhorn í öfuga átt miðað við mús: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Hegðun þegar sjónarhornið er fært með hægri músartakkanum. Þegar stillingin er óvirk færir músin myndavélina. Þegar stillingin er virk færir músin sjónarhornið STR_CONFIG_SETTING_SMOOTH_SCROLLING :Mjúkt skrun í skjágluggum: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Stýrir hvernig aðalsjónarhornið færist á ákveðna staði þegar smellt er á þá á litla kortinu eða þegar ákveðinn hlutur er valin á kortinu. Ef stillingin er virk færist aðalsjónarhornið rólega, ef stillingin er óvirk fer aðalsjónarhornið beint á ákveðna staðinn STR_CONFIG_SETTING_MEASURE_TOOLTIP :Sýna mælingar þegar verið er að byggja og breyta landslagi: {STRING} @@ -1306,8 +1301,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+smella STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+smella STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Af -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Skrun með hægri músarhnappi: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Virkja að hægt sé að færa sjónarhornið með því að færa það með vinstri músar takkanum. Þetta er sérstaklega gott þegar notast er við snerti-skjá til að færa sjónarhornið STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Nota dagsetningar á {STRING} formi fyrir vistaða leiki. @@ -2450,29 +2443,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Akur STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Snjóþekið land STR_LAI_CLEAR_DESCRIPTION_DESERT :Eyðimörk -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} spor -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} spor með hefðbundnum umferðarmerkjum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} spor með for-merkjum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} spor með frámerkjum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} spor með tvívirkum merkjum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} spor með leiðarmerkjum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} spor með einstefnu leiðarmerkjum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} spor með hefðbundnum- og formerkjum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} spor með hefðbundnum- og frámerkjum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} spor með hefðbundnum- tvívirkum merkjum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} spor með hefðbundnum- og leiðarmerkjum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} spor með hefðbundnum- og einstefnu leiðarmerkjum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} spor með for- og frámerkjum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} spor með for- og tvívirkum merkjum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} spor með for- og leiðarmerkjum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} spor með for- og einstefnu leiðarmerkjum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} spor með frá- og tvívirkum merkjum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} spor með frá- og leiðarmerkjum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} spor með frá- og einstefnu leiðarmerkjum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} spor með tvívirkum- og leiðarmerkjum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} spor með tvívirkum- og einstefnu leiðarmerkjum -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} spor með leiðarmerkjum og einstefnu leiðarmerkjum -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} lestarskýli +STR_LAI_RAIL_DESCRIPTION_TRACK :Járnbrautarspor spor +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Járnbrautarspor spor með hefðbundnum umferðarmerkjum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Járnbrautarspor spor með for-merkjum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Járnbrautarspor spor með frámerkjum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Járnbrautarspor spor með tvívirkum merkjum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Járnbrautarspor spor með leiðarmerkjum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Járnbrautarspor spor með einstefnu leiðarmerkjum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Járnbrautarspor spor með hefðbundnum- og formerkjum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Járnbrautarspor spor með hefðbundnum- og frámerkjum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Járnbrautarspor spor með hefðbundnum- tvívirkum merkjum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Járnbrautarspor spor með hefðbundnum- og leiðarmerkjum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Járnbrautarspor spor með hefðbundnum- og einstefnu leiðarmerkjum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Járnbrautarspor spor með for- og frámerkjum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Járnbrautarspor spor með for- og tvívirkum merkjum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Járnbrautarspor spor með for- og leiðarmerkjum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Járnbrautarspor spor með for- og einstefnu leiðarmerkjum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Járnbrautarspor spor með frá- og tvívirkum merkjum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Járnbrautarspor spor með frá- og leiðarmerkjum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Járnbrautarspor spor með frá- og einstefnu leiðarmerkjum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Járnbrautarspor spor með tvívirkum- og leiðarmerkjum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Járnbrautarspor spor með tvívirkum- og einstefnu leiðarmerkjum +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Járnbrautarspor spor með leiðarmerkjum og einstefnu leiðarmerkjum +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Járnbrautarspor lestarskýli STR_LAI_ROAD_DESCRIPTION_ROAD :Vegur STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Vegur með götuljósum @@ -2536,7 +2529,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Land í eigu fy STR_ABOUT_OPENTTD :{WHITE}Um OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Upphaflegur höfundarréttur {COPYRIGHT} 1995 Chris Sawyer, Öll réttindi áskilin STR_ABOUT_VERSION :{BLACK}OpenTTD útgáfa {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2015 OpenTTD hópurinn +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 @@ -2736,8 +2736,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Verið að reyn STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} inniheldur gallaða mynd. Allar gallaðar myndir munu birtast sem rauð spurningamerki (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Inniheldur margþættar aðgerðir, 8 innkomur (hreyfimynd {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Les fyrir endan af gervi-hreyfimynd (hreyfimynd {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Grunnteiknisafnið sem er í notkun vantar hluta af hreyfimyndunum.{}Vinsamlegast uppfærðu grunnteiknisafnið -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Í Grafíska safnið sem nú er í notkun vantar nokkrar myndir.{}Vinsamlegast uppfærið grafíska safnið.{}Þar sem þú ert að spila {YELLOW}þróunar útgáfu af OpenTTD{WHITE}, gæti verið að þú þyrftir líka {YELLOW} þróunar útgáfu af grafíska safninu{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Umbeðin GRF gögn ekki tiltæk (hreyfimynd {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} var óvirkjað af {2:STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Rangt/óþekkt hreyfimyndar snið (hreyfimynd {3:NUM}) @@ -2810,8 +2808,6 @@ STR_TOWN_POPULATION :{BLACK}Heildar STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Borg) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Íbúafjöldi: {ORANGE}{COMMA}{BLACK} Hús: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Farþegar síðasta mánaðar: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Póstur síðasta mánaðar: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Nauðsynlegur farmur fyrir stækkun bæjarins: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} nauðsynlegt STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} nauðsynlegt á veturnar @@ -2927,8 +2923,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Tekur vi STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Sýna lista yfir móttækilegan varning STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Móttekur: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Þessi stöð er með sérleyfi til flutninga í þessum bæ. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} keypti sérleyfi til flutninga í þessum bæ. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Þessi stöð er með sérleyfi til flutninga í þessum bæ. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} keypti sérleyfi til flutninga í þessum bæ. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Einkunn STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Sýna einkunn stöðvar @@ -3085,9 +3081,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Þarf: { STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Þarf: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Farmur sem bíður verkunar: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Framleiðir: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Framleiðir: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3152,6 +3147,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Fjarlægja öll STR_GROUP_RENAME_CAPTION :{BLACK}Endurnefna hóp + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Lestaúrval STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nýjir rafdrifnir lestarvagnar @@ -3304,10 +3300,7 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :Segulsvifvagn STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Verð: {CURRENCY_LONG} Þyngd: {WEIGHT_SHORT}{}Hraði: {VELOCITY} Afl: {POWER}{}Rekstrarkostnaður: {CURRENCY_LONG} á ári{}Burðargeta: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Verð: {CURRENCY_LONG} Þyngd: {WEIGHT_SHORT}{}Hámarskhraði: {VELOCITY} Afl: {POWER} Hámarks kraftur: {6:FORCE}{}Running Cost: {4:CURRENCY_LONG}/ári{}Burðargeta: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Verð: {CURRENCY_LONG} Hámarkshraði: {VELOCITY}{}Burðargeta: {CARGO_LONG}, {CARGO_LONG}{}Rekstrarkostnaður: {CURRENCY_LONG} á ári -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Verð: {CURRENCY_LONG} Hámarkshraði: {VELOCITY}{}Burðargeta: {CARGO_LONG}{}Rekstrarkostnaður: {CURRENCY_LONG} á ári -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Verð: {CURRENCY_LONG} Hámarkshraði: {VELOCITY} Drægni: {COMMA} reitir{}Capacity: {CARGO_LONG}, {CARGO_LONG}{}Rekstrarkosnaður: {CURRENCY_LONG} á ári -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Verð: {CURRENCY_LONG} Hámarkshraði: {VELOCITY} Drægni: {COMMA} reitir{}Burðargeta: {CARGO_LONG}{}Rekstrarkostnaður: {CURRENCY_LONG} á ári +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Verð: {CURRENCY_LONG} Hámarkshraði: {VELOCITY}{}Burðargeta: {CARGO_LONG}{}Rekstrarkostnaður: {CURRENCY_LONG} á ári # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Endurnýja {STRING} - {STRING} @@ -3330,7 +3323,6 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} ef gö STR_REPLACE_VEHICLES_STOP :{BLACK}Stöðva skipti STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Smelltu til að stöðva skipti á vagntegundinni sem valin er vinstra megin -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Skipti út: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Skipta á milli útskiptiglugga dráttar- og flutningavagna STR_REPLACE_ENGINES :Dráttarvagnar STR_REPLACE_WAGONS :Vagnar @@ -3426,7 +3418,6 @@ STR_VEHICLE_INFO_AGE :{COMMA} ár ({C STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} ár ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Hámarkshraði: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Hámarkshraði: {LTBLUE}{VELOCITY} {BLACK}Drægni: {LTBLUE}{COMMA} reitir STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Þyngd: {LTBLUE}{WEIGHT_SHORT} {BLACK}Afl: {LTBLUE}{POWER}{BLACK} Hámarkshraði: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Þyngd: {LTBLUE}{WEIGHT_SHORT} {BLACK}Afl: {LTBLUE}{POWER}{BLACK} Hámarkshraði: {LTBLUE}{VELOCITY} {BLACK}Hámarks dráttarafl.: {LTBLUE}{FORCE} @@ -3975,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 193029cbc2..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 @@ -669,14 +670,13 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Pilih 'B STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Acak/Urut program STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Tampilkan jendela pemilihan judul musik -STR_ERROR_NO_SONGS :{WHITE}Set Musik tanpa lagu telah dipilih. Tidak ada lagu yang akan dimainkan. - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Pilihan program Musik +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) @@ -813,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}! @@ -898,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) @@ -912,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) @@ -925,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 @@ -941,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 @@ -951,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 @@ -1337,8 +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_REVERSE_SCROLLING :Berbalik Arah: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Untuk menggeser peta berlawanan arah dengan klik kanan. Ketika dimatikan, mouse menggeser kamera. Ketika dinyalakan, mouse menggeser peta +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} @@ -1370,8 +1374,7 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Perintah-klik STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Kontrol-klik STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Non-aktifkan -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Geser dgn klik-kiri: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Aktifkan penggeseran peta dengan menyeret menggunakan tombol kiri mouse. Hal ini sangat berguna apabila menggunakan layar sentuh. +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Tutup jendela dengan klik kanan: {STRING} STR_CONFIG_SETTING_AUTOSAVE :Simpan otomatis: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Memilih jarak waktu antara menyimpan data game @@ -1988,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 @@ -2003,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 @@ -2282,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 @@ -2589,6 +2593,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Nama are STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Muatan diterima: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Tipe Rel: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Batasan kecepatan rel: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Batasan kecepatan jalan: {LTBLUE}{VELOCITY} @@ -2601,29 +2606,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Ladang STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Daerah tertutup salju STR_LAI_CLEAR_DESCRIPTION_DESERT :Gurun Pasir -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} track -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} Lintasan dengan "block signals" -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} lintasan dengan "pre-signals" -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} lintasan dengan "exit-signals" -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING}lintasan dengan "combo-signals" -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} lintasan dengan "path signals" -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} lintasan dengan sinyal satu arah -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} lintasan dengan "block and pre-signals" -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} lintasan dengan "block and exit-signals" -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} lintasan dengan "block and combo-signals" -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} lintasan dengan "block and path signals" -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} lintasan dengan "block and one-way path signals" -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} lintasan dengan "pre- and exit-signals" -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} lintasan dengan "pre- and combo-signals" -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} lintasan dengan "pre- and path signals" -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} lintasan dengan "pre- and one-way path signals" -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} lintasan dengan "exit- and combo-signals" -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} lintasan dengan "exit- and path signals" -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} lintasan dengan "exit- and one-way path signals" -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} lintasan dengan "combo- and path signals" -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} lintasan dengan "combo- and one-way path signals" -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} lintasan dengan "path and one-way path signals" -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} depo kereta +STR_LAI_RAIL_DESCRIPTION_TRACK :Rel Kereta track +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Rel Kereta Lintasan dengan "block signals" +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Rel Kereta lintasan dengan "pre-signals" +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Rel Kereta lintasan dengan "exit-signals" +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Rel Keretalintasan dengan "combo-signals" +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Rel Kereta lintasan dengan "path signals" +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Rel Kereta lintasan dengan sinyal satu arah +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Rel Kereta lintasan dengan "block and pre-signals" +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Rel Kereta lintasan dengan "block and exit-signals" +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Rel Kereta lintasan dengan "block and combo-signals" +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Rel Kereta lintasan dengan "block and path signals" +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Rel Kereta lintasan dengan "block and one-way path signals" +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Rel Kereta lintasan dengan "pre- and exit-signals" +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Rel Kereta lintasan dengan "pre- and combo-signals" +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Rel Kereta lintasan dengan "pre- and path signals" +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Rel Kereta lintasan dengan "pre- and one-way path signals" +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Rel Kereta lintasan dengan "exit- and combo-signals" +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Rel Kereta lintasan dengan "exit- and path signals" +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Rel Kereta lintasan dengan "exit- and one-way path signals" +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Rel Kereta lintasan dengan "combo- and path signals" +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Rel Kereta lintasan dengan "combo- and one-way path signals" +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Rel Kereta lintasan dengan "path and one-way path signals" +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Rel Kereta depo kereta STR_LAI_ROAD_DESCRIPTION_ROAD :Jalan STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Jalan raya dengan lampu @@ -2687,7 +2692,39 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Tanah milik Per STR_ABOUT_OPENTTD :{WHITE}Tentang OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Hak Cipta asli {COPYRIGHT} 1995 Chris Sawyer, Hak Cipta dilindungi STR_ABOUT_VERSION :{BLACK}OpenTTD versi {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 Tim OpenTTD +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 @@ -2902,8 +2939,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Mencoba menggun STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} terdapat sprite yang rusak. Semua sprite rusak akan ditandai dengan tanda tanya merah (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Memuat beberapa entri Action 8 (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Baca akhir sprite palsu (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Beberapa 'sprite' tidak terdapat pada Set Grafik Dasar yang sedang digunakan.{}Silahkan update Set Grafik Dasar -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Set grafis dasar kekurangan beberapa sprite.{}Tolong perbarui set grafis dasar.{}Karena anda memainkan {YELLOW}snapshot pengembangan OpenTTD{WHITE}, anda mungkin memerlukan{YELLOW}snapshot pengembangan set grafis dasar{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Sumber GRF yang diminta tidak tersedia (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} dinonaktifkan oleh {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Format sprite salah/tidak diketahui (sprite {3:NUM}) @@ -2978,8 +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_PASSENGERS_LAST_MONTH_MAX :{BLACK}Penumpang bulan lalu: {ORANGE}{COMMA}{BLACK} maks: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Surat bulan lalu: {ORANGE}{COMMA}{BLACK} maks: {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 @@ -3110,8 +3144,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Menerima STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Tampilkan daftar kargo yang bisa diterima STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Menerima: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Stasiun memiliki hak transportasi eksklusif di kota ini -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} beli hak transportasi eksklusif di kota ini +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Stasiun memiliki hak transportasi eksklusif di kota ini +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} beli hak transportasi eksklusif di kota ini STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Peringkat STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Tampilkna peringkat dari stasiun @@ -3290,9 +3324,10 @@ 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_WAITING_FOR_PROCESSING :{BLACK}Kargo yang sedang menunggu di proses: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Menghasilkan: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Menghasilkan: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3359,13 +3394,18 @@ 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 STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Kereta listrik baru 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 @@ -3390,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 @@ -3523,10 +3564,11 @@ 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_CAPACITY_CAPACITY_RUNCOST :{BLACK}Biaya: {CURRENCY_LONG} Kec. Max: {VELOCITY}{}Kapasitas: {CARGO_LONG}, {CARGO_LONG}{}Bea Berjalan: {CURRENCY_LONG}/thn -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Biaya: {CURRENCY_LONG} Kec. Max: {VELOCITY}{}Kapasitas: {CARGO_LONG}{}Bea Berjalan: {CURRENCY_LONG}/thn -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Biaya: {CURRENCY_LONG} Kecepatan Max.: {VELOCITY} Jangkauan: {COMMA} kotak{}Kapasitas: {CARGO_LONG}, {CARGO_LONG}{}Biaya Operasi: {CURRENCY_LONG}/thn -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Biaya: {CURRENCY_LONG} Kecepatan Max.: {VELOCITY} Jangkauan: {COMMA} kotak{}Kapasitas: {CARGO_LONG}{}Biaya Operasi: {CURRENCY_LONG}/thn +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} @@ -3553,10 +3595,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} saat t STR_REPLACE_VEHICLES_STOP :{BLACK}Berhenti Mengganti STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Tekan untuk menghentikan penggantian jenis kendaraan terpilih di sisi kiri -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Mengganti: {ORANGE}{STRING} 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 @@ -3649,7 +3691,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} tahun ( STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} tahun ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Kec. Max: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Kecepatan Max.: {LTBLUE}{VELOCITY} {BLACK}Jangkauan: {LTBLUE}{COMMA} kotak +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} @@ -4208,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... @@ -4216,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... @@ -4284,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 @@ -4467,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 5300a104c4..0ea266d541 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -669,10 +669,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Roghnaig STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Scoránaigh ord randamach clár air/as STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Taispeáin an fhuinneogh chun rianta ceoil a roghnú -STR_ERROR_NO_SONGS :{WHITE}Roghnaíodh sraith ceoil gan aon amhrán ann. Ní sheinnfear aon amhrán - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Clár Ceoil a Roghnú STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Innéacs na Rianta STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Clár - '{STRING}' @@ -1337,8 +1334,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Dath an tír-ra STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Uaine STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Ciaruaine STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Corcairghorm -STR_CONFIG_SETTING_REVERSE_SCROLLING :Aisiompaigh an treo scrollaithe: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :An méid a tharlaíonn agus an léarscáil á scrollú leis an gcnaipe luchóige deas. Má bhíonn sé díchumasaithe, bogann an luchóg leis an gceamara. Má bhíonn sé cumasaithe, bogann an luchóg an léarscáil STR_CONFIG_SETTING_SMOOTH_SCROLLING :Scrollú mín do na fuinneoga amhairc: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Roghnaigh an chaoi a scrollóidh an príomhamharc chuig suíomh ar leith má chliceálann tú ar an léarscáil bheag nó má thugann tú ordú scrollú chuig oibiacht ar leith ar an léarscáil. Má tá sé cumasaithe, scrollóidh an fhuinneog amhairc go mín, má tá sé díchumasaithe léimfidh sé go díreach chuig an suíomh sin. STR_CONFIG_SETTING_MEASURE_TOOLTIP :Taispeáin leid uirlise tomhais agu uirlisí tógála áirithe in úsáid: {STRING} @@ -1370,8 +1365,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Ordú+Cliceáil STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Cliceáil STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :As -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Scrollú le cléchliceáil: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Cumasaigh scrollú an léarscáil trí bheith ag tarraingt le cnaipe clé na luiche. Tá sé seo thar a bheith úsáideach don scrollú nuair atá scáileán tadhaill á úsáid STR_CONFIG_SETTING_AUTOSAVE :Uathshábháil: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Roghnaigh an t-eatramh idir uathshábhálacha cluichí @@ -2601,29 +2594,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Garrantaí STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Talamh faoi shneachta STR_LAI_CLEAR_DESCRIPTION_DESERT :Fásach -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} ráille -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} ráille ar a bhfuil comharthaí bloc -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} ráille ar a bhfuil réamhchomharthaí -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} ráille ar a bhfuil comharthaí amach -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} ráille ar a bhfuil comharthaí teaglama -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} ráille ar a bhfuil comharthaí cosáin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} ráille ar a bhfuil comharthaí cosáin aonbhealaigh -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} ráille ar a bhfuil comharthaí bloic agus réamhchomharthaí -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} ráille ar a bhfuil comharthaí bloic agus amach -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} ráille ar a bhfuil comharthaí bloic agus teaglama -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} ráille ar a bhfuil comharthaí bloic agus cosáin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} ráille ar a bhfuil comharthaí bloic agus cosáin aonbhealaigh -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} ráille ar a bhfuil réamhchomharthaí agus comharthaí amach -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} ráille ar a bhfuil réamhchomharthaí agus comharthaí teaglama -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} ráille ar a bhfuil réamhchomharthaí agus comharthaí cosáin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} ráille ar a bhfuil réamhchomharthaí agus comharthaí cosáin aonbhealaigh -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} ráille ar a bhfuil comharthaí amach agus teaglama -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} ráille ar a bhfuil comharthaí amach agus cosáin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} ráille ar a bhfuil comharthaí amach agus cosáin aonbhealaigh -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} ráille ar a bhfuil comharthaí teaglama agus cosáin -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} ráille ar a bhfuil comharthaí teaglama agus cosáin aonbhealaigh -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} ráille ar a bhfuil comharthaí cosáin agus cosáin aonbhealaigh -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} iosta traenach +STR_LAI_RAIL_DESCRIPTION_TRACK :Iarnród ráille +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Iarnród ráille ar a bhfuil comharthaí bloc +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Iarnród ráille ar a bhfuil réamhchomharthaí +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Iarnród ráille ar a bhfuil comharthaí amach +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Iarnród ráille ar a bhfuil comharthaí teaglama +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Iarnród ráille ar a bhfuil comharthaí cosáin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Iarnród ráille ar a bhfuil comharthaí cosáin aonbhealaigh +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Iarnród ráille ar a bhfuil comharthaí bloic agus réamhchomharthaí +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Iarnród ráille ar a bhfuil comharthaí bloic agus amach +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Iarnród ráille ar a bhfuil comharthaí bloic agus teaglama +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Iarnród ráille ar a bhfuil comharthaí bloic agus cosáin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Iarnród ráille ar a bhfuil comharthaí bloic agus cosáin aonbhealaigh +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Iarnród ráille ar a bhfuil réamhchomharthaí agus comharthaí amach +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Iarnród ráille ar a bhfuil réamhchomharthaí agus comharthaí teaglama +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Iarnród ráille ar a bhfuil réamhchomharthaí agus comharthaí cosáin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Iarnród ráille ar a bhfuil réamhchomharthaí agus comharthaí cosáin aonbhealaigh +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Iarnród ráille ar a bhfuil comharthaí amach agus teaglama +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Iarnród ráille ar a bhfuil comharthaí amach agus cosáin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Iarnród ráille ar a bhfuil comharthaí amach agus cosáin aonbhealaigh +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Iarnród ráille ar a bhfuil comharthaí teaglama agus cosáin +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Iarnród ráille ar a bhfuil comharthaí teaglama agus cosáin aonbhealaigh +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Iarnród ráille ar a bhfuil comharthaí cosáin agus cosáin aonbhealaigh +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Iarnród iosta traenach STR_LAI_ROAD_DESCRIPTION_ROAD :Bóthair STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Bóthair le soilse sráide @@ -2687,7 +2680,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Talamh faoi úi STR_ABOUT_OPENTTD :{WHITE}Maidir le OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Cóipcheart bunaidh {COPYRIGHT} 1995 Chris Sawyer, Gach ceart ar cosaint STR_ABOUT_VERSION :{BLACK}OpenTTD leagan {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 An fhoireann OpenTTD +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 @@ -2906,8 +2906,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Iarracht ID nea STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}Tá sprite truaillithe in {STRING}. Taispeánfar gach sprite truaillithe mar chomhartha ceiste (?) dearg. STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Tá iontrálacha iolraccha Ghníomhaíocht 8 ann (sprid {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Léadh tar éis deireadh an pseudo-sprid (sprid {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Tá roinnt sprite in easnamh sa tsraith bhunúsach grafaicí atá in úsáid faoi láthair.{}Déan úasghrádú ar an tsraith bhunúsach grafaicí le do thoil -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Tá roinnt sprideanna in easnamh sa tacar bunghraificí atá in úsáid faoi láthair.{}Nuashonraigh an tacar bunghraificí.{}Toisc go bhfuil tú ag imirt ar {YELLOW}roghbhlúire forbróirí (development snapshot) OpenTTD{WHITE}, seans go mbeidh {YELLOW}roghbhlúire forbróirí de na bunghraificí{WHITE} ag teastáil uait STR_NEWGRF_ERROR_GRM_FAILED :Níl na hacmhainní GRF a iarradh ar fáil (sprid {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :Bhí {1:STRING} díchumasaithe ag {2:STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Formáid neamhbhailí/anaithnid do leagan amach na spride (sprid {3:NUM}) @@ -2982,8 +2980,6 @@ STR_TOWN_POPULATION :{BLACK}Daonra d STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Cathair) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Daonra: {ORANGE}{COMMA}{BLACK} Tithe: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Paisinéirí an mhí seo caite: {ORANGE}{COMMA}{BLACK} Uasmhéid: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Post an mhí seo caite: {ORANGE}{COMMA}{BLACK} uasmhéid: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Lastas atá ag teastáil le go bhfásfaidh an baile: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} ag teastáil STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} ag teastáil sa Gheimhreadh @@ -3114,8 +3110,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Glactar STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Taispeáin liosta den lastas a ghlactar leis STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Glactar le: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Tá cearta eisiacha iompair ag an stáisiún seo sa bhaile seo. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{BLACK}Cheannaigh {YELLOW}{COMPANY}{BLACK} cearta eisiacha iompair sa bhaile seo.. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Tá cearta eisiacha iompair ag an stáisiún seo sa bhaile seo. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{BLACK}Cheannaigh {YELLOW}{COMPANY}{BLACK} cearta eisiacha iompair sa bhaile seo.. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Rátálacha STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Taispeáin rátálacha na stáisiún @@ -3294,9 +3290,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Teastaí STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Teastaíonn: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Lastas ag fanacht le próiseáil: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Táirgtear: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Táirgtear: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3363,6 +3358,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Bain gach feith STR_GROUP_RENAME_CAPTION :{BLACK}Athainmnigh grúpa + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Feithiclí Iarnróid Nua STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Feithiclí Iarnróid Leictreacha Nua @@ -3527,10 +3523,7 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :inneall gluaist STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Costas {CURRENCY_LONG} Meáchan: {WEIGHT_SHORT}{}Luas: {VELOCITY} Cumhacht: {POWER}{}Costas Coinneála {CURRENCY_LONG}/bl{}Toilleadh: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Costas: {CURRENCY_LONG} Meáchan: {WEIGHT_SHORT}{}Luas: {VELOCITY} Cumhacht: {POWER} T.E. uasta: {6:FORCE}{}Costas Coinneála: {4:CURRENCY_LONG}/bl{}Toilleadh: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Costas: {CURRENCY_LONG} Luas Uasta: {VELOCITY}{}Toilleadh: {CARGO_LONG}, {CARGO_LONG}{}Costas Coinneála: {CURRENCY_LONG}/bl -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Costas: {CURRENCY_LONG} Luas Uasta: {VELOCITY}{}Toilleadh: {CARGO_LONG}{}Costas Coinneála: {CURRENCY_LONG}/bl -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Costas: {CURRENCY_LONG} Luas uasta: {VELOCITY} Raon: {COMMA} tíl{}Toilleadh: {CARGO_LONG}, {CARGO_LONG}{}Costas Coinneála: {CURRENCY_LONG}/bl -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Costas: {CURRENCY_LONG} Luas uasta: {VELOCITY} Raon: {COMMA} tíleanna{}Toilleadh: {CARGO_LONG}{}Costas Coinneála: {CURRENCY_LONG}/yr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Costas: {CURRENCY_LONG} Luas Uasta: {VELOCITY}{}Toilleadh: {CARGO_LONG}{}Costas Coinneála: {CURRENCY_LONG}/bl # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Ionadaigh{STRING} - {STRING} @@ -3557,7 +3550,6 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} má t STR_REPLACE_VEHICLES_STOP :{BLACK}Stad ag athsholáthar Feithiclí STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Brúigh chun deireadh a chur le hathsholáthar den chineál innill atá roghnaithe ar chlé -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Ag athsholáthar: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Athraigh idir na fuinneoga athsholáthair innill agus vaigíní STR_REPLACE_ENGINES :Innill STR_REPLACE_WAGONS :Vaigíní @@ -3653,7 +3645,6 @@ STR_VEHICLE_INFO_AGE :{COMMA} {P bhli STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} {P bhliain bhliain bliana mbliana bliana} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Luas uasta: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Luas uasta: {LTBLUE}{VELOCITY} {BLACK}Raon: {LTBLUE}{COMMA} {P th th th dt t}íl STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Meáchan: {LTBLUE}{WEIGHT_SHORT} {BLACK}Cumhacht: {LTBLUE}{POWER}{BLACK}Luas uasta: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Meáchan: {LTBLUE}{WEIGHT_SHORT} {BLACK}Cumhacht: {LTBLUE}{POWER}{BLACK} Uas-luas: {LTBLUE}{VELOCITY} {BLACK}T.E. Uasta: {LTBLUE}{FORCE} @@ -4212,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 5fa8f11ccf..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 @@ -652,6 +653,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}Musica non disponibile STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}" STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Brano STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Titolo @@ -671,15 +673,15 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Selezion STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Attiva/disattiva la riproduzione in ordine casuale STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Mostra la finestra di selezione dei brani musicali -STR_ERROR_NO_SONGS :{WHITE}È stato selezionato un pacchetto musicale senza brani. Non sarà possibile avviare la musica. - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Selezione programma musicale +STR_PLAYLIST_MUSIC_SELECTION_SETNAME :{WHITE}Programma musicale - '{STRING}' STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Indice brani STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Programma - '{STRING}' STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Elimina +STR_PLAYLIST_CHANGE_SET :{BLACK}Cambia pacchetto STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Elimina il programma corrente (solo Personale1 e Personale2) +STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Seleziona un altro pacchetto musicale installato STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Fare clic su un brano per aggiungerlo al programma corrente (solo Personale1 o Personale2) STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Fare clic su un brano per rimuoverlo dal programma corrente (solo Personale1 o Personale2) @@ -815,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}! @@ -882,9 +885,9 @@ STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLAC # Extra view window STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Mini visuale {COMMA} -STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Copia nella mini visuale +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}Copia dalla mini visuale +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 @@ -927,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 @@ -1361,8 +1365,12 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Colore del terr STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Verde STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Verde scuro STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Viola -STR_CONFIG_SETTING_REVERSE_SCROLLING :Inverti direzione di scorrimento della mappa: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Comportamento dello scorrimento della mappa con il tasto destro del mouse. Se disabilitata, il mouse muove l'inquadratura. Se abilitata, il mouse muove la mappa +STR_CONFIG_SETTING_SCROLLMODE :Scorrimento delle visuali: {STRING} +STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Comportamento dello scorrimento della mappa +STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Muovi visuale col pulsante destro, puntatore bloccato +STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Muovi mappa col pulsante destro, puntatore bloccato +STR_CONFIG_SETTING_SCROLLMODE_RMB :Muovi mappa col pulsante destro +STR_CONFIG_SETTING_SCROLLMODE_LMB :Muovi mappa col pulsante sinistro STR_CONFIG_SETTING_SMOOTH_SCROLLING :Scorrimento morbido delle visuali: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Controlla il modo in cui la visuale principale scorre verso una specifica posizione quando si fa clic sulla minimappa o si ordina di visualizzare un oggetto specifico sulla mappa. Se abilitata, la visuale scorre in modo morbido. Se disabilitata, salta direttamente al punto prescelto STR_CONFIG_SETTING_MEASURE_TOOLTIP :Mostra un tooltip di misura durante la costruzione: {STRING} @@ -1394,8 +1402,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :COMANDO+clic STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :CTRL+clic STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Nessuna -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Scorrimento con clic sinistro: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Abilita lo scorrimento della mappa trascinandola con il pulsante sinistro del mouse. Questa impostazione è utile quando si utilizza un touch-screen +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Chiudi finestra con clic destro: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Consente di chiudere una finestra facendo clic col pulsante destro al suo interno. Disabilita i suggerimenti attivati al clic col pulsante destro! STR_CONFIG_SETTING_AUTOSAVE :Salvataggi automatici: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Seleziona l'intervallo fra i salvataggi automatici della partita @@ -1424,11 +1432,11 @@ STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Mostra gli arri STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Mostra gli orari di arrivo e partenza previsti nelle tabelle orarie STR_CONFIG_SETTING_QUICKGOTO :Creazione rapida degli ordini dei veicoli: {STRING} STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT :Pre-seleziona il comando 'Vai a' quando si apre la finestra degli ordini -STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE :Ferrovia predefinita (a inizio/ripresa partita): {STRING} -STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Tipo di ferrovia da selezionare dopo l'inizio o il caricamento di una partita. 'La prima disponibile' seleziona il tipo più vecchio di binari, 'L'ultima disponibile' seleziona il tipo più vecchio di binari, e 'La più usata' seleziona il tipo più utilizzato al momento -STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :La prima disponibile -STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_LAST :L'ultima disponibile -STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_MOST_USED :La più usata +STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE :Tipo di rotaie predefinito (a inizio/ripresa partita): {STRING} +STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Tipo di rotaie da selezionare dopo l'inizio o il caricamento di una partita. 'Il primo disponibile' seleziona il tipo più vecchio di binari, 'L'ultimo disponibile' seleziona il tipo più nuovo di binari, e 'Il più usato' seleziona il tipo più utilizzato al momento +STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :Il primo disponibile +STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_LAST :L'ultimo disponibile +STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_MOST_USED :Il più usato STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION :Mostra i percorsi riservati sui binari: {STRING} STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT :Dà ai binari riservati un colore differente, aiutando a correggere problemi di treni che si rifiutano di entrare in blocchi protetti con segnali a percorso STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Mantieni aperte le finestre di costruzione dopo l'uso: {STRING} @@ -1785,6 +1793,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Controll STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Mostra le impostazioni delle IA e degli Script STR_INTRO_TOOLTIP_QUIT :{BLACK}Esci da 'OpenTTD' +STR_INTRO_BASESET :{BLACK}Nel pacchetto grafico di base attualmente selezionato mancano {NUM} sprite. È consigliabile controllare gli aggiornamenti del pacchetto. STR_INTRO_TRANSLATION :{BLACK}A questa traduzione mancano {NUM} string{P a he}. Aiutaci a migliorare OpenTTD iscrivendoti come traduttore. Vedi readme.txt per dettagli. # Quit window @@ -2308,6 +2317,7 @@ STR_LINKGRAPH_LEGEND_NONE :{BLACK}Nessuno STR_LINKGRAPH_LEGEND_NONE.ms :{BLACK}Nessuno STR_LINKGRAPH_LEGEND_NONE.fs :{BLACK}Nessuna STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Seleziona le compagnie da mostrare +STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY} # Linkgraph legend window and linkgraph legend in smallmap STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}inutilizzata @@ -2619,6 +2629,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Nome blo STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Carichi accettati: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Tipo di rotaie: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Limite di velocità rotaie: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Limite di velocità strada: {LTBLUE}{VELOCITY} @@ -2631,29 +2642,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Campi STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Terreno innevato STR_LAI_CLEAR_DESCRIPTION_DESERT :Deserto -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} con segnali di blocco -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} con pre-segnali -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} con segnali di uscita -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} con segnali combinati -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} con segnali a percorso -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} con segnali a percorso s.u. -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} con segnali di blocco e pre-segnali -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} con segnali di blocco e di uscita -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} con segnali di blocco e combinati -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} con segnali di blocco e a percorso -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} con segnali di blocco e a percorso s.u. -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} con pre-segnali e segnali di uscita -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} con pre-segnali e segnali combinati -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} con pre-segnali e segnali a percorso -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} con pre-segnali e segnali a percorso s.u. -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} con segnali di uscita e combinati -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} con segnali di uscita e a percorso -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} con segnali di uscita e a percorso s.u. -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} con segnali combinati e a percorso -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} con segnali combinati e a percorso s.u. -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} con segnali a percorso e a percorso s.u. -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Deposito {STRING.ms} +STR_LAI_RAIL_DESCRIPTION_TRACK :Ferrovia +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Ferrovia con segnali di blocco +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Ferrovia con pre-segnali +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Ferrovia con segnali di uscita +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Ferrovia con segnali combinati +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Ferrovia con segnali a percorso +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Ferrovia con segnali a percorso s.u. +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Ferrovia con segnali di blocco e pre-segnali +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Ferrovia con segnali di blocco e di uscita +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Ferrovia con segnali di blocco e combinati +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Ferrovia con segnali di blocco e a percorso +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Ferrovia con segnali di blocco e a percorso s.u. +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Ferrovia con pre-segnali e segnali di uscita +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Ferrovia con pre-segnali e segnali combinati +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Ferrovia con pre-segnali e segnali a percorso +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Ferrovia con pre-segnali e segnali a percorso s.u. +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Ferrovia con segnali di uscita e combinati +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Ferrovia con segnali di uscita e a percorso +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Ferrovia con segnali di uscita e a percorso s.u. +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Ferrovia con segnali combinati e a percorso +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Ferrovia con segnali combinati e a percorso s.u. +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Ferrovia con segnali a percorso e a percorso s.u. +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Deposito ferroviario STR_LAI_ROAD_DESCRIPTION_ROAD :Strada STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Strada con lampioni @@ -2717,7 +2728,57 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Terreno possedu STR_ABOUT_OPENTTD :{WHITE}Informazioni su OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyright originale {COPYRIGHT} 1995 Chris Sawyer, Tutti i diritti riservati STR_ABOUT_VERSION :{BLACK}OpenTTD versione {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 Il team OpenTTD +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 @@ -2741,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 @@ -2891,7 +2953,7 @@ STR_NEWGRF_INSPECT_PARENT_TOOLTIP :{BLACK}Ispezion STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT :{STRING} a {HEX} STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_OBJECT :Oggetto -STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_RAIL_TYPE :Tipo rotaia +STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_RAIL_TYPE :Tipo di rotaie STR_NEWGRF_INSPECT_QUERY_CAPTION :{WHITE}Parametro variabile NewGRF 60+x (esadecimale) @@ -2936,11 +2998,11 @@ STR_NEWGRF_ERROR_INVALID_ID :Tentativo di ut STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} contiene degli sprite corrotti. Tutti gli sprite corrotti saranno mostrati come punti interrogativi (?) rossi STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Contiene occorrenze multiple dell'azione 8 (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Lettura oltre la fine dello pseudo-sprite (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Nel pacchetto grafico di base attualmente in uso mancano alcuni sprite.{}È consigliabile aggiornare il pacchetto grafico di base -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Nel pacchetto grafico di base attualmente in uso mancano alcuni sprite.{}È consigliabile aggiornare il pacchetto grafico di base.{}Poiché si sta giocando con uno {YELLOW}snapshot di sviluppo di OpenTTD{WHITE}, potrebbe essere necessario uno {YELLOW}snapshot di sviluppo del pacchetto grafico di base{WHITE} 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! @@ -3005,6 +3067,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Inserire STR_TOWN_DIRECTORY_CAPTION :{WHITE}Città STR_TOWN_DIRECTORY_NONE :{ORANGE}- Nessuna - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Metropoli){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Nomi delle città - fare clic su un nome per centrare la visuale principale sulla città. CTRL+clic la mostra in una mini visuale. STR_TOWN_POPULATION :{BLACK}Popolazione mondiale: {COMMA} @@ -3012,8 +3075,7 @@ STR_TOWN_POPULATION :{BLACK}Popolazi STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Metropoli) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Popolazione: {ORANGE}{COMMA}{BLACK} Case: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Passeggeri il mese scorso: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Posta il mese scorso: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} +STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} il mese scorso: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Carichi richiesti per la crescita della città: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} richiest{G 0 o o a} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} richiest{G 0 o o a} in inverno @@ -3144,8 +3206,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Accetta STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Mostra la lista dei carichi accettati STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Accetta: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Questa stazione gode di diritti di trasporto esclusivi in questa città. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}La {COMPANY}{BLACK} ha acquistato diritti di trasporto esclusivi in questa città. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Questa stazione gode di diritti di trasporto esclusivi in questa città. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}La {COMPANY}{BLACK} ha acquistato diritti di trasporto esclusivi in questa città. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Valutazione STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Mostra la valutazione della stazione @@ -3324,9 +3386,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Richiede STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Richiede: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Richiede: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} in attesa{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Carico in attesa di lavorazione: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produce: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Produce: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3393,6 +3457,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Rimuovi tutti i STR_GROUP_RENAME_CAPTION :{BLACK}Rinomina un gruppo +STR_GROUP_PROFIT_THIS_YEAR :Profitto quest'anno: +STR_GROUP_PROFIT_LAST_YEAR :Profitto anno scorso: +STR_GROUP_OCCUPANCY :Utilizzo corrente: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nuovi veicoli ferroviari STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nuovi veicoli ferroviari elettrici @@ -3424,6 +3493,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Tutti i tipi di STR_PURCHASE_INFO_ALL_BUT :Tutto tranne {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Sforzo di trazione massimo: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Autonomia: {GOLD}{COMMA} riquadr{P o i} +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Tipo di aeromobile: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Elenco di selezione dei veicoli ferroviari - fare clic su un veicolo per informazioni. CTRL+clic mostra/nasconde il tipo di veicolo STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Elenco selezione automezzi - fare clic su un veicolo per informazioni. CTRL+clic mostra/nasconde il tipo di automezzo @@ -3557,10 +3627,11 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :{G=f}motrice ma STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Costo: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocità: {VELOCITY} Potenza: {POWER}{}Costo d'esercizio: {CURRENCY_LONG}/anno{}Capacità: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Costo: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocità: {VELOCITY} Potenza: {POWER}{} S.T. max.: {6:FORCE}{}Costo d'esercizio: {4:CURRENCY_LONG}/anno{}Capacità: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Costo: {CURRENCY_LONG} Velocità max.: {VELOCITY}{}Capacità: {CARGO_LONG}, {CARGO_LONG}{}Costo d'esercizio: {CURRENCY_LONG}/anno -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Costo: {CURRENCY_LONG} Velocità max.: {VELOCITY}{}Capacità: {CARGO_LONG}{}Costo d'esercizio: {CURRENCY_LONG}/anno -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Costo: {CURRENCY_LONG} Velocità max.: {VELOCITY} Autonomia: {COMMA} riquadr{P o i}{}Capacità: {CARGO_LONG}, {CARGO_LONG}{}Costo d'esercizio: {CURRENCY_LONG}/anno -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Costo: {CURRENCY_LONG} Velocità max.: {VELOCITY} Autonomia: {COMMA} riquadr{P o i}{}Capacità: {CARGO_LONG}{}Costo d'esercizio: {CURRENCY_LONG}/anno +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Costo: {CURRENCY_LONG} Velocità max.: {VELOCITY}{}Capacità: {CARGO_LONG}{}Costo d'esercizio: {CURRENCY_LONG}/anno +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Costo: {CURRENCY_LONG} Velocità max.: {VELOCITY}{}Tipo aeromobile: {STRING}{}Capacità: {CARGO_LONG}, {CARGO_LONG}{}Costo d'esercizio: {CURRENCY_LONG}/anno +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Costo: {CURRENCY_LONG} Velocità max.: {VELOCITY}{}Tipo aeromobile: {STRING}{}Capacità: {CARGO_LONG}{}Costo d'esercizio: {CURRENCY_LONG}/anno +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Costo: {CURRENCY_LONG} Velocità max.: {VELOCITY}{}Tipo aeromobile: {STRING} Autonomia: {COMMA} riquadr{P o i}{}Capacità: {CARGO_LONG}, {CARGO_LONG}{}Costo d'esercizio: {CURRENCY_LONG}/anno +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Costo: {CURRENCY_LONG} Velocità max.: {VELOCITY}{}Tipo aeromobile: {STRING} Autonomia: {COMMA} riquadr{P o i}{}Capacità: {CARGO_LONG}{}Costo d'esercizio: {CURRENCY_LONG}/anno # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Rimpiazza {STRING} - {STRING} @@ -3587,12 +3658,12 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} una vo STR_REPLACE_VEHICLES_STOP :{BLACK}Interrompi rimpiazzamento STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Premere per interrompere il rimpiazzamento del modello di locomotiva selezionato a sinistra -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Rimpiazza: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Scambia tra loro le finestre di rimpiazzamento delle locomotive e dei vagoni STR_REPLACE_ENGINES :Locomotive STR_REPLACE_WAGONS :Vagoni +STR_REPLACE_ALL_RAILTYPE :Tutti i veicoli ferroviari -STR_REPLACE_HELP_RAILTYPE :{BLACK}Selezionare il tipo di rotaia per la quale si desidera rimpiazzare le locomotive +STR_REPLACE_HELP_RAILTYPE :{BLACK}Selezionare il tipo di rotaie per il quale si desidera rimpiazzare le locomotive STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Mostra con quale locomotiva sarà rimpiazzato il modello eventualmente selezionato a sinistra STR_REPLACE_RAIL_VEHICLES :Veicoli ferroviari STR_REPLACE_ELRAIL_VEHICLES :Veicoli ferroviari elettrici @@ -3683,7 +3754,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} ann{P o STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} ann{P o i} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Velocità max.: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Velocità max.: {LTBLUE}{VELOCITY} {BLACK}Autonomia: {LTBLUE}{COMMA} riquadr{P o i} +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Velocità max.: {LTBLUE}{VELOCITY} {BLACK}Tipo aeromobile: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}elocità max.: {LTBLUE}{VELOCITY} {BLACK}Tipo aeromobile: {LTBLUE}{STRING} {BLACK}Autonomia: {LTBLUE}{COMMA} riquadr{P o i} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potenza: {LTBLUE}{POWER}{BLACK} Velocità max.: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potenza: {LTBLUE}{POWER}{BLACK} Velocità max.: {LTBLUE}{VELOCITY} {BLACK}S.T. max.: {LTBLUE}{FORCE} @@ -4242,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... @@ -4250,6 +4321,7 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... ques STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... strada rivolta nella direzione sbagliata STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... le fermate passanti non possono trovarsi in curva STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... le fermate passanti non possono avere raccordi +STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... la strada è bloccata o a senso unico # Station destruction related errors STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Impossibile rimuovere parte della stazione... @@ -4501,6 +4573,8 @@ STR_BASESOUNDS_DOS_DESCRIPTION :Suoni originali STR_BASESOUNDS_WIN_DESCRIPTION :Suoni originali di Transport Tycoon Deluxe, edizione Windows. STR_BASESOUNDS_NONE_DESCRIPTION :Un pacchetto sonoro non contenente alcun suono. STR_BASEMUSIC_WIN_DESCRIPTION :Musica originale di Transport Tycoon Deluxe, edizione Windows. +STR_BASEMUSIC_DOS_DESCRIPTION :Musica originale di Transport Tycoon Deluxe, edizione DOS. +STR_BASEMUSIC_TTO_DESCRIPTION :Musica originale di Transport Tycoon (edizione Original/World). STR_BASEMUSIC_NONE_DESCRIPTION :Un pacchetto musicale non contenente alcuna musica. ##id 0x2000 diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index 1c5d731966..c1b2fb1e75 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -669,10 +669,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}プレ STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}プレイリストのシャッフルの有効/無効を切り替えます STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}曲選択のウィンドウを表示します -STR_ERROR_NO_SONGS :{WHITE}選択した音楽セットに曲がありません - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}プレイリストの選択 STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}楽曲索引 STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}プレイリスト - '{STRING}' @@ -1337,8 +1334,6 @@ 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_REVERSE_SCROLLING :スクロール方面を反転: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :マウス右ボタンで地図をスクロールする時の挙動を設定します。無効にした場合はマウスはカメラを動かします(マウスの移動方向に移動します)。有効にした場合は地図を動かします(マウスの移動方向と逆に移動します) STR_CONFIG_SETTING_SMOOTH_SCROLLING :画面のスムーズスクロール: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :ミニマップでの移動や「現在位置に移動」などのコマンドを使用した際にメイン画面がどのように移動するかを設定します。有効にした場合はスムーズにスクロールして移動します。無効の場合は目的地に直接ジャンプします STR_CONFIG_SETTING_MEASURE_TOOLTIP :測定ツールチップ表示: {STRING} @@ -1370,8 +1365,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :コマンド+ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+クリック (Win) STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :切 -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :左ドラッグスクロール: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :有効にすると左ドラッグでマップのスクロールができるようになります。特にタッチスクリーンを利用しているときに便利です STR_CONFIG_SETTING_AUTOSAVE :オートセーブ: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :オートセーブの間隔を設定します @@ -2589,6 +2582,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}空港 STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}受入れ貨物: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE : {BLACK}線路の種類: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}線路の制限速度: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}道路の最高速度: {LTBLUE}{VELOCITY} @@ -2601,29 +2595,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :耕作地 STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :積雪地帯 STR_LAI_CLEAR_DESCRIPTION_DESERT :砂漠 -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} 線路 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} 信号付線路 (閉塞) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} 信号付線路 (入口) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} 信号付線路 (出口) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} 信号付線路 (コンボ) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} 信号付線路 (パス) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} 信号付線路 (一方通行パス) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} 信号付線路 (閉塞+入口) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} 信号付線路 (閉塞+出口) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} 信号付線路 (閉塞+コンボ) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} 信号付線路 (閉塞+パス) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} 信号付線路 (閉塞+一方通行パス) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} 信号付線路 (入口+出口) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} 信号付線路 (入口+コンボ) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} 信号付線路 (入口+パス) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} 信号付線路 (入口+一方通行パス) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} 信号付線路 (出口+コンボ) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} 信号付線路 (出口+パス) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} 信号付線路 (出口+一方通行パス) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} 信号付線路 (コンボ+パス) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} 信号付線路 (コンボ+一方通行パス) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} 信号付線路 (パス+一方通行パス) -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} 列車庫 +STR_LAI_RAIL_DESCRIPTION_TRACK :鉄道 (非電化) 線路 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :鉄道 (非電化) 信号付線路 (閉塞) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :鉄道 (非電化) 信号付線路 (入口) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :鉄道 (非電化) 信号付線路 (出口) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :鉄道 (非電化) 信号付線路 (コンボ) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :鉄道 (非電化) 信号付線路 (パス) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :鉄道 (非電化) 信号付線路 (一方通行パス) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :鉄道 (非電化) 信号付線路 (閉塞+入口) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :鉄道 (非電化) 信号付線路 (閉塞+出口) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :鉄道 (非電化) 信号付線路 (閉塞+コンボ) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :鉄道 (非電化) 信号付線路 (閉塞+パス) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :鉄道 (非電化) 信号付線路 (閉塞+一方通行パス) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :鉄道 (非電化) 信号付線路 (入口+出口) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :鉄道 (非電化) 信号付線路 (入口+コンボ) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :鉄道 (非電化) 信号付線路 (入口+パス) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :鉄道 (非電化) 信号付線路 (入口+一方通行パス) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :鉄道 (非電化) 信号付線路 (出口+コンボ) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :鉄道 (非電化) 信号付線路 (出口+パス) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :鉄道 (非電化) 信号付線路 (出口+一方通行パス) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :鉄道 (非電化) 信号付線路 (コンボ+パス) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :鉄道 (非電化) 信号付線路 (コンボ+一方通行パス) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :鉄道 (非電化) 信号付線路 (パス+一方通行パス) +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :鉄道 (非電化) 列車庫 STR_LAI_ROAD_DESCRIPTION_ROAD :道路 STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :街灯付道路 @@ -2687,7 +2681,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :社有地 STR_ABOUT_OPENTTD :{WHITE}OpenTTDについて STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}オリジナル版権{COPYRIGHT} 1995 Chris Sawyer All rights reserved STR_ABOUT_VERSION :{BLACK}OpenTTD バージョン {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 The OpenTTD team +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}ゲームを保存 @@ -2875,6 +2876,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}前の STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}前のノーマルスプライトに戻ります。始端と終端は連続しているものとみなし、疑似/リカラー/フォントスプライトはスキップします STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}現在選択されているスプライトの代表絵を示します。この配列はスプライトを描画するときには無視されます STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}X・Yオフセットを変更し、スプライトを移動します +STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK} 相対値リセット +STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK} 現在の相対オフセットをリセットします。 +STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Xオフセット : {NUM},Yオフセット : {NUM} (絶対値) +STR_SPRITE_ALIGNER_OFFSETS_REL : {BLACK}X オフセット : {NUM}, Y オフセット : {NUM} (相対値) STR_SPRITE_ALIGNER_PICKER_BUTTON :{BLACK}スプライトを選ぶ STR_SPRITE_ALIGNER_PICKER_TOOLTIP :{BLACK}画面内からスプライトを選びます @@ -2902,8 +2907,6 @@ STR_NEWGRF_ERROR_INVALID_ID :不正なIDが STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING}には破損スプライトがあります。破損スプライトは赤疑問符({RED}?{YELLOW})として表示されます STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :アクション8のエントリが複数含まれています (スプライト {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :疑似スプライトのデータが十分にありません (スプライト {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}使用中の基本グラフィックセットから複数のスプライトが欠落しています。{}セットを更新して下さいますよう、お願いします -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}使用中の基本グラフィックセットから複数のスプライトが欠落しています。{}セットを更新して下さいますよう、お願いします{}{YELLOW}OpenTTDの速報開発版{WHITE}をお使いの際は、{YELLOW}速報開発版に即したグラフィックセット{WHITE}が必要となる場合があります STR_NEWGRF_ERROR_GRM_FAILED :要求されたGRFのリソースは使用できません (スプライト {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING}は{STRING}により無効にされました STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :不正なレイアウト書式です (スプライト {3:NUM}) @@ -2978,8 +2981,6 @@ 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_PASSENGERS_LAST_MONTH_MAX :{BLACK}旅客数(先月): {ORANGE}{COMMA}人{BLACK} 最大: {ORANGE}{COMMA}人 -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}郵便袋(先月): {ORANGE}{COMMA}袋{BLACK} 最大: {ORANGE}{COMMA}袋 STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}街の成長に必要な物資: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}が{RED}必要です STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}が{BLACK}冬に必要です @@ -3031,7 +3032,7 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}買収 # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} 目標 -STR_GOALS_SPECTATOR_CAPTION :{BLACK}大目標 +STR_GOALS_SPECTATOR_CAPTION :{WHITE}大目標 STR_GOALS_GLOBAL_TITLE :{BLACK}大目標: STR_GOALS_TEXT :{ORANGE}{STRING} STR_GOALS_NONE :{ORANGE}- なし - @@ -3110,8 +3111,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}受入 STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}受入れる貨物のリストを表示します STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}受入れ貨物: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}この停留施設は街の独占輸送契約の恩恵下にあります -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK}はこの街と独占輸送契約を締結しています +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}この停留施設は街の独占輸送契約の恩恵下にあります +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK}はこの街と独占輸送契約を締結しています STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}評価 STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}停留施設の評価を表示します @@ -3172,7 +3173,7 @@ STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}中継 STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}メイン画面をこのブイの場所に移動します。Ctrl+クリックでこのブイの場所を新たなビューポートに表示します STR_BUOY_VIEW_CHANGE_BUOY_NAME :{BLACK}ブイの名称を変更 -STR_EDIT_WAYPOINT_NAME :中継駅名を表示 +STR_EDIT_WAYPOINT_NAME :{WHITE}中継駅名を表示 # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} 経営状況 {BLACK}{COMPANY_NUM} @@ -3290,9 +3291,9 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}必要 STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}必要資源: {YELLOW}{STRING}{STRING}、{STRING}{STRING}、{STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES : {BLACK}必要物資: + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}加工待ちの貨物: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}生産品: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}生産品: {YELLOW}{STRING}{STRING}、{STRING}{STRING} ############ range for produces ends @@ -3359,6 +3360,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :全輸送機器 STR_GROUP_RENAME_CAPTION :{BLACK}グループ名を変更 + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :新規機関車(非電化) STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :新規機関車(電化)/電車 @@ -3523,10 +3525,7 @@ 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_CAPACITY_CAPACITY_RUNCOST :{BLACK}価格: {CURRENCY_LONG} 最高速度: {VELOCITY}{}収容量: {CARGO_LONG}、{CARGO_LONG}{}運用費: {CURRENCY_LONG}/年 -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}価格: {CURRENCY_LONG} 最高速度: {VELOCITY}{}収容量: {CARGO_LONG}{}運用費: {CURRENCY_LONG}/年 -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}価格: {CURRENCY_LONG} 最高速度: {VELOCITY} 航続距離: {COMMA}タイル{}収容量: {CARGO_LONG}、{CARGO_LONG}{}運用費: {CURRENCY_LONG}/年 -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}価格: {CURRENCY_LONG} 最高速度: {VELOCITY} 航続距離: {COMMA}タイル{}収容量: {CARGO_LONG}{}運用費: {CURRENCY_LONG}/年 +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}価格: {CURRENCY_LONG} 最高速度: {VELOCITY}{}収容量: {CARGO_LONG}{}運用費: {CURRENCY_LONG}/年 # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}{STRING}の自動置換 - {STRING} @@ -3553,10 +3552,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :老朽化した STR_REPLACE_VEHICLES_STOP :{BLACK}置換終了 STR_REPLACE_HELP_STOP_BUTTON :{BLACK}クリックすると選択した輸送機器の置換を終了します -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}置換対象: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}置換対象を機関車/貨車に切り替えます STR_REPLACE_ENGINES :機関車 STR_REPLACE_WAGONS :貨車 +STR_REPLACE_ALL_RAILTYPE :全ての鉄道車両 STR_REPLACE_HELP_RAILTYPE :{BLACK}置換対象となる線路種類を切り替えます STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}左で選択された機関車の置換対象を(あれば)表示します @@ -3649,7 +3648,6 @@ STR_VEHICLE_INFO_AGE :{COMMA}年({COM STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA}年({COMMA}年) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}最高速度: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}最高速度: {LTBLUE}{VELOCITY} {BLACK}航続距離: {LTBLUE}{COMMA}タイル STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}重量: {LTBLUE}{WEIGHT_SHORT} {BLACK}出力: {LTBLUE}{POWER}{BLACK} 最高速度: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}重量: {LTBLUE}{WEIGHT_SHORT} {BLACK}出力: {LTBLUE}{POWER}{BLACK} 最高速度: {LTBLUE}{VELOCITY} {BLACK}最大牽引力: {LTBLUE}{FORCE} @@ -4208,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 334b30e16a..ea66904cd8 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -316,7 +316,7 @@ STR_SORT_BY_RATING :등급 # Tooltips for the main toolbar STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}게임을 일시 정지합니다. STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}게임 시간을 빠르게 가도록 합니다. -STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}옵션을 엽니다. +STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}게임 기본 설정을 엽니다. STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}게임을 저장하거나, 그만두거나, 게임을 종료합니다 STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}지도, 외부 화면, 팻말 목록을 보여줍니다. STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}도시 메뉴를 표시합니다. @@ -372,7 +372,7 @@ STR_SCENEDIT_FILE_MENU_QUIT :게임 종료 ############ range for SE file menu starts ############ range for settings menu starts -STR_SETTINGS_MENU_GAME_OPTIONS :게임 옵션 +STR_SETTINGS_MENU_GAME_OPTIONS :게임 기본 설정 STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :설정 STR_SETTINGS_MENU_SCRIPT_SETTINGS :인공지능/게임 스크립트 설정 STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF 설정 @@ -476,10 +476,11 @@ 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 :박스 경계선 보기 전환 -STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :더러운 블록 색상 전환 +STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :시각적 업데이트 블록 표시 전환 ############ range ends here ############ range for ordinal numbers used for the place in the highscore window @@ -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}사용 가능한 음악 없음 STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}" STR_MUSIC_TRACK :{TINY_FONT}{BLACK}트랙 STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}제목 @@ -670,15 +672,15 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}'사용 STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}프로그램을 무작위 재생합니다. STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}배경 음악 트랙을 선택할 수 있는 창을 엽니다. -STR_ERROR_NO_SONGS :{WHITE}선택된 배경 음악 목록에 노래가 없습니다. 배경 음악이 재생 되지 않을 것입니다. - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}배경 음악 프로그램 선택 +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}' STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}초기화 +STR_PLAYLIST_CHANGE_SET :{BLACK}세트 변경 STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}현재 배경 음악 프로그램을 초기화합니다. (사용자1, 사용자2에서만 선택 가능) +STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}배경 음악 세트를 이미 설치된 다른 세트로 변경합니다. STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}배경 음악 목록에 음악을 추가하려면 클릭하세요. (사용자1, 사용자2에서만 사용 가능) STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}배경 음악 목록에서 음악을 제거하려면 클릭하세요. (사용자1, 사용자2에서만 사용 가능) @@ -715,7 +717,7 @@ STR_SMALLMAP_TOOLTIP_SHOW_LINK_STATS_ON_MAP :{BLACK}지도 STR_SMALLMAP_TOOLTIP_SHOW_TRANSPORT_ROUTES_ON :{BLACK}수송 기반시설과 경로를 지도에 표시합니다. STR_SMALLMAP_TOOLTIP_SHOW_VEGETATION_ON_MAP :{BLACK}초목을 지도에 표시합니다. STR_SMALLMAP_TOOLTIP_SHOW_LAND_OWNERS_ON_MAP :{BLACK}부지의 소유주를 지도에 표시합니다. -STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}산업 시설 타입 표시를 전환하려면 클릭하십시오. CTRL+클릭하면 선택한 산업시설을 제외한 모든 종류를 비활성화합니다. 다시 CTRL+클릭하면 모든 산업시설이 활성화됩니다. +STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}산업시설 종류 표시를 전환하려면 클릭하십시오. CTRL+클릭하면 선택한 산업시설을 제외한 모든 종류를 비활성화합니다. 다시 CTRL+클릭하면 모든 산업시설이 활성화됩니다. STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}회사 속성의 표시를 전환하려면 회사를 클릭하십시오. CTRL+클릭으로 선택한 회사를 제외한 모든 회사를 비활성화하십시오. 다시 CTRL+클릭하면 다시 모든 회사가 활성화됩니다. STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}해당 화물의 흐름도를 표시하려면 클릭하십시오. CTRL+클릭하면 선택한 화물만 표시합니다. @@ -814,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} 근처에서 자라나고 있습니다! @@ -881,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}외부 화면에 저장된 장소로 이동합니다. @@ -911,7 +914,7 @@ STR_GAME_OPTIONS_CURRENCY_ISK :아이슬란드 STR_GAME_OPTIONS_CURRENCY_ITL :이탈리아 리라 (ITL) STR_GAME_OPTIONS_CURRENCY_NLG :네덜란드 길더 (NLG) STR_GAME_OPTIONS_CURRENCY_NOK :노르웨이 크로네 (NOK) -STR_GAME_OPTIONS_CURRENCY_PLN :폴란드 즐로티 (PLN) +STR_GAME_OPTIONS_CURRENCY_PLN :폴란드 즈워티 (PLN) STR_GAME_OPTIONS_CURRENCY_RON :루마니아 레우 (RON) STR_GAME_OPTIONS_CURRENCY_RUR :러시아 루블 (RUR) STR_GAME_OPTIONS_CURRENCY_SIT :슬로바키아 톨라 (SIT) @@ -926,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}차량 통행 방식 @@ -1003,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 @@ -1155,11 +1159,11 @@ STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :보조금을 STR_CONFIG_SETTING_CONSTRUCTION_COSTS :건설 가격: {STRING} STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :건설 및 구매 가격의 수준을 설정하십시오. STR_CONFIG_SETTING_RECESSIONS :경제 불황: {STRING} -STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :이 옵션을 켜면 몇 년마다 경제 불황이 발생할 수 있습니다. 불황 기간 동안에는 모든 화물의 생산량이 확연히 줄어듭니다. (불황이 끝나면 이전 수준으로 회복) +STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :이 설정을 켜면, 몇 년마다 경제 불황이 발생할 수 있습니다. 불황 기간 동안에는 모든 화물의 생산량이 확연하게 줄어듭니다. (불황이 끝나면 이전 수준으로 회복됩니다.) STR_CONFIG_SETTING_TRAIN_REVERSING :열차가 역 내에서 회차하는 것을 금지: {STRING} -STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :이 옵션을 켜면 회차했을 때 다음 목적지까지 가는 더 짧은 경로가 있어도 열차가 비두단식 역에서 회차할 수 없게 됩니다. +STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :이 설정을 켜면. 열차가 뒤로 돌면 다음 목적지까지 더 짧은 경로로 갈 수 있다고 해도 열차가 비두단식 역에서 뒤로 돌 수 없게 됩니다. STR_CONFIG_SETTING_DISASTERS :재앙: {STRING} -STR_CONFIG_SETTING_DISASTERS_HELPTEXT :블록이나 차량, 기반시설을 간혹 파괴할 수도 있는 재앙 옵션을 켜거나 끕니다. +STR_CONFIG_SETTING_DISASTERS_HELPTEXT :일정 구역이나 차량, 기반시설을 간혹 파괴할 수도 있는 재앙을 켜거나 끕니다. STR_CONFIG_SETTING_CITY_APPROVAL :지역 개발에 대한 도시의 태도: {STRING} STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :회사가 유발하는 소음과 환경 파괴가 회사에 대한 도시의 평가치와 향후 해당 지역에서의 건설 행동에 얼마나 영향을 미칠지 선택하십시오. @@ -1187,7 +1191,7 @@ 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도로 회전할 수 있도록 허용합니다. 이 옵션은 선박의 회전 반경에도 적용됩니다. +STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :─ 모양의 수평 선로와 │ 모양의 수직 선로가 바로 이어져 만날 때 90도 회전이 발생합니다. 이 설정을 켜면, 열차가 칸 가장자리를 통과할 때 90도로 회전할 수 있도록 허용합니다. 이 설정은 선박의 회전 반경에도 적용됩니다. STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS :역이 같은 방향으로 붙어있지 않아도 같은 이름의 역 짓기 허용: {STRING} STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :이미 존재하는 역을 직접 건드리지 않고도 역의 일부분을 새로 추가/확장하는 것을 허용합니다. 인접한 칸에 기존과 다른 새로운 역을 놓을 때에는 CTRL+클릭해야 합니다. STR_CONFIG_SETTING_INFLATION :인플레이션(화폐 가치 하락) 사용: {STRING} @@ -1204,25 +1208,25 @@ STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE :건설 불가 STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_NORMAL :건설 가능 (위치 선택 가능, 7배 비용) STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_PROSPECTING :투자 (무작위 위치에 건설) STR_CONFIG_SETTING_INDUSTRY_PLATFORM :산업시설 주위의 평지: {STRING} -STR_CONFIG_SETTING_INDUSTRY_PLATFORM_HELPTEXT :산업시설 주변에 도로나 선로를 설치할 수 있는 평지 넓이를 설정합니다. 이 옵션을 통해 산업시설 주변에 선로나 역 등을 건설할 공간을 마련할 수 있습니다. +STR_CONFIG_SETTING_INDUSTRY_PLATFORM_HELPTEXT :산업시설 주변에 도로나 선로를 설치할 수 있는 평지 넓이를 설정합니다. 이 설정을 통해 산업시설 주변에 선로나 역 등을 건설할 공간을 마련할 수 있습니다. STR_CONFIG_SETTING_MULTIPINDTOWN :한 도시에 비슷한 산업시설을 여러 개 건설할 수 있게 허용: {STRING} -STR_CONFIG_SETTING_MULTIPINDTOWN_HELPTEXT :일반적으로, 도시에는 각 종류의 산업시설이 하나까지만 있을 수 있습니다. 이 옵션을 설정하면 한 도시 안에 같은 종류의 산업 시설을 여러 개 설치할 수 있게 됩니다. +STR_CONFIG_SETTING_MULTIPINDTOWN_HELPTEXT :일반적으로 도시에는 각 종류의 산업시설이 하나까지만 있을 수 있습니다. 이 설정을 켜면, 한 도시 안에 같은 종류의 산업시설을 여러 개 설치할 수 있게 됩니다. STR_CONFIG_SETTING_SIGNALSIDE :신호기 보이기: {STRING} STR_CONFIG_SETTING_SIGNALSIDE_HELPTEXT :선로의 어느 쪽에 신호기를 설치할 지 선택합니다. STR_CONFIG_SETTING_SIGNALSIDE_LEFT :왼쪽에 STR_CONFIG_SETTING_SIGNALSIDE_DRIVING_SIDE :진행 방향에 STR_CONFIG_SETTING_SIGNALSIDE_RIGHT :오른쪽에 STR_CONFIG_SETTING_SHOWFINANCES :연말에 자동으로 재정 창을 띄움: {STRING} -STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :이 옵션을 켜면 회사의 재정 상태를 확인하기 쉽도록 매년 말에 재정 창이 자동으로 뜹니다. +STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :이 설정을 켜면. 회사의 재정 상태를 확인하기 쉽도록 매년 말에 재정 창이 자동으로 뜹니다. STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :새로 지정하는 경로는 기본적으로 '직행'으로 처리: {STRING} -STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :일반적으로 차량은 경로 상에 있는 모든 역에 정차하게 되어있습니다. 이 옵션을 켜면 차량이 마지막 목적지까지 정차없이 모든 역을 통과할 것입니다. 이 옵션은 새로 경로를 지정하는 차량에만 적용되는 점을 알아두십시오. 하지만 각 차량의 경로는 두 가지 방법 중에 원하는 대로 다시 설정할 수 있습니다. +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 :먼쪽 STR_CONFIG_SETTING_AUTOSCROLL :가장자리에 마우스를 가져가면 화면 움직이기: {STRING} -STR_CONFIG_SETTING_AUTOSCROLL_HELPTEXT :이 옵션을 켜면, 마우스를 게임 및 외부 화면 창의 가장자리에 가까이 가져가면 화면을 이동시킵니다. +STR_CONFIG_SETTING_AUTOSCROLL_HELPTEXT :이 설정을 켜면, 마우스를 게임 및 외부 화면 창의 가장자리에 가까이 가져가면 화면을 이동시킵니다. STR_CONFIG_SETTING_AUTOSCROLL_DISABLED :사용 안 함 STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT_FULLSCREEN :전체 화면에서 주 게임 화면만 STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT :주 게임 화면만 @@ -1253,24 +1257,24 @@ STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD :경쟁자 소 STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT :다른 회사 소유의 도로 위에 버스 정류장을 건설하는 것을 허용합니다. STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}이미 차량이 존재하면 이 설정을 변경하실 수 없습니다. STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE :기반시설 유지비: {STRING} -STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :이 옵션을 활성화하면 기반시설 유지비가 발생합니다. 유지비는 교통망의 규모에 비례하며 대형 회사는 소형 회사보다 많은 유지비가 들어갑니다. +STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :이 설정을 켜면, 기반시설 유지비가 발생합니다. 유지비는 교통망의 규모에 비례하며 대형 회사는 소형 회사보다 많은 유지비가 들어갑니다. STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :옛날 공항을 사라지지 않고 계속 만들 수 있게 함: {STRING} -STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :이 옵션을 켜면 소형 공항을 포함한 모든 공항 종류를 도입 이후 계속 사용할 수 있게 됩니다. +STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :이 설정을 켜면, 소형 공항을 포함한 모든 공항 종류를 도입 이후에 계속 사용할 수 있게 됩니다. STR_CONFIG_SETTING_WARN_LOST_VEHICLE :차량이 길을 잃으면 경고: {STRING} STR_CONFIG_SETTING_WARN_LOST_VEHICLE_HELPTEXT :다음 목적지로 가기 위한 경로를 찾을 수 없는 차량이 있으면 뉴스 메시지로 알려줍니다. STR_CONFIG_SETTING_ORDER_REVIEW :차량의 경로를 검사: {STRING} -STR_CONFIG_SETTING_ORDER_REVIEW_HELPTEXT :이 옵션을 켜면 차량의 경로를 주기적으로 검사하여 문제가 발견되면 뉴스 메시지로 알려줍니다. +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_HELPTEXT :이 옵션을 켜면 지난 해에 수익이 없는 차량이 있으면 뉴스 메시지로 알려줍니다. +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 :이 옵션을 켜면 오래된 차량 모델을 포함하여 모든 차량 모델을 도입 이후 계속 사용할 수 있게 됩니다. +STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :이 설정을 켜면, 오래된 차량 모델을 포함하여 모든 차량 모델을 도입 이후에 계속 사용할 수 있게 됩니다. STR_CONFIG_SETTING_AUTORENEW_VEHICLE :차량이 낡으면 차량을 자동으로 교체: {STRING} -STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :이 옵션을 켜면 제한 수명에 다다른 차량이 교체 조건을 만족할 경우 자동으로 차량을 교체할 수 있게 됩니다. +STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :이 설정을 켜면, 제한 수명에 다다른 차량이 교체 조건을 만족할 경우 자동으로 차량을 교체할 수 있게 됩니다. STR_CONFIG_SETTING_AUTORENEW_MONTHS :차량이 최대 수명의 {STRING}이면 자동 교체 STR_CONFIG_SETTING_AUTORENEW_MONTHS_HELPTEXT :자동 교체가 필요한 차량의 상대적인 연령을 설정합니다. STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_BEFORE :{COMMA}개월 전 @@ -1310,7 +1314,7 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :부드럽게 STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :거칠게 STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :매우 거칠게 STR_CONFIG_SETTING_VARIETY :산세 험준도: {STRING} -STR_CONFIG_SETTING_VARIETY_HELPTEXT :(천지창조 전용) 지도가 산지와 평지를 모두 갖도록 만들 것인 지를 결정합니다. 이 옵션은 지형을 더 평평하게 만드므로, 다른 옵션은 '산'으로 설정하시기 바랍니다. +STR_CONFIG_SETTING_VARIETY_HELPTEXT :(천지창조 전용) 지도가 산지와 평지를 모두 갖도록 만들 것인 지를 결정합니다. 이 설정은 지형을 더 평평하게 만드므로, 다른 설정은 '산'으로 설정하시기 바랍니다. STR_CONFIG_SETTING_RIVER_AMOUNT :강의 양: {STRING} STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :강을 얼마나 만들지 선택하십시오. STR_CONFIG_SETTING_TREE_PLACER :나무 배치 알고리즘: {STRING} @@ -1338,11 +1342,15 @@ 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_REVERSE_SCROLLING :스크롤 방향 뒤집기: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :마우스 오른쪽 클릭으로 지도를 스크롤하는 방법을 선택합니다. 옵션을 끄면 마우스 방향과 화면의 스크롤 방향이 같아집니다. 옵션을 켜면 마우스 방향과 화면의 스크롤 방향이 반대가 됩니다. +STR_CONFIG_SETTING_SCROLLMODE :외부 화면 스크롤 행동: {STRING} +STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :지도를 스크롤 할 때의 행동을 선택합니다. +STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :마우스 오른쪽 클릭으로 외부 화면 이동 (마우스 위치는 고정) +STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :마우스 오른쪽 클릭으로 지도 이동 (마우스 위치는 고정) +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} +STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :소형 지도를 클릭하여 특정 지역으로 스크롤되거나 지도 상의 특정 장소로 이동하는 경우에 주 화면이 어떻게 스크롤 되는지를 설정합니다. 이 설정을 켜면, 화면이 목표 지점까지 부드럽게 이동하고, 설정을 끄면 목표 지점으로 곧바로 넘어가게 됩니다. +STR_CONFIG_SETTING_MEASURE_TOOLTIP :건설도구 사용시 거리 도움말 표시: {STRING} STR_CONFIG_SETTING_MEASURE_TOOLTIP_HELPTEXT :철도/도로 등의 기반시설을 건설할 때 거리와 높이 차이 등을 표시합니다. STR_CONFIG_SETTING_LIVERIES :차량 종류에 따라 회사의 색상을 구분하여 표시: {STRING} STR_CONFIG_SETTING_LIVERIES_HELPTEXT :회사 고유 색상을 따르지 않고 차량 종류에 따라 다른 차량 색상을 사용하는 것을 허용합니다. @@ -1350,16 +1358,16 @@ STR_CONFIG_SETTING_LIVERIES_NONE :없음 STR_CONFIG_SETTING_LIVERIES_OWN :내 회사 STR_CONFIG_SETTING_LIVERIES_ALL :모든 회사 STR_CONFIG_SETTING_PREFER_TEAMCHAT :엔터(ENTER) 키로 같은 팀끼리 채팅: {STRING} -STR_CONFIG_SETTING_PREFER_TEAMCHAT_HELPTEXT :이 옵션을 켜면 멀티 플레이시 같은 회사 간의 채팅을 키 대신 키로 할 수 있게 됩니다. +STR_CONFIG_SETTING_PREFER_TEAMCHAT_HELPTEXT :이 설정을 켜면, 멀티 플레이시 같은 회사 간의 채팅을 키 대신 키로 할 수 있게 됩니다. STR_CONFIG_SETTING_SCROLLWHEEL_SCROLLING :마우스 휠 동작: {STRING} -STR_CONFIG_SETTING_SCROLLWHEEL_SCROLLING_HELPTEXT :상하좌우로 회전 가능한 마우스 휠(2차원 마우스휠)로 지도를 스크롤할 수 있게 허용합니다. +STR_CONFIG_SETTING_SCROLLWHEEL_SCROLLING_HELPTEXT :상하좌우로 회전 가능한 마우스 휠(2차원 마우스 휠)로 지도를 스크롤할 수 있게 허용합니다. STR_CONFIG_SETTING_SCROLLWHEEL_ZOOM :화면 확대/축소 STR_CONFIG_SETTING_SCROLLWHEEL_SCROLL :지도 스크롤 STR_CONFIG_SETTING_SCROLLWHEEL_OFF :끄기 STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER :지도 스크롤 속도: {STRING} STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER_HELPTEXT :마우스 휠 스크롤의 민감도를 설정합니다. STR_CONFIG_SETTING_OSK_ACTIVATION :화상 키보드: {STRING} -STR_CONFIG_SETTING_OSK_ACTIVATION_HELPTEXT :마우스와 같은 장치만을 이용하여 입력 칸에 글자를 입력하기 위해 화상 키보드를 어떤 방식으로 띄울지 선택하십시오. 이 옵션은 스마트폰 등 실제 키보드가 없는 소형 기기를 사용하는 분을 위한 기능입니다. +STR_CONFIG_SETTING_OSK_ACTIVATION_HELPTEXT :마우스와 같은 장치만을 이용하여 입력 칸에 글자를 입력하기 위해 화상 키보드를 어떤 방식으로 띄울지 선택합니다. 이 설정은 실제 키보드가 없는 소형 기기를 사용하는 분을 위한 기능입니다. STR_CONFIG_SETTING_OSK_ACTIVATION_DISABLED :사용 안 함 STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :더블 클릭 STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :한 번 클릭 (커서가 활성화되어 있을 때) @@ -1371,8 +1379,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :커맨드 + 클 STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :CTRL + 클릭 STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :끄기 -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :마우스 왼쪽 버튼으로 스크롤: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :왼쪽 마우스 버튼을 드래그하여 지도를 스크롤 할 수 있도록 합니다. 터치 스크린 환경에서 이 옵션을 켜면 매우 유용합니다. +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 :게임을 자동으로 저장할 간격을 선택하십시오. @@ -1384,7 +1392,7 @@ STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_SHORT :짧은 (2012.01 STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_ISO :국제표준규격 (2012-01-01) STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME :게임 시작 시 자동으로 일시정지: {STRING} -STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME_HELPTEXT :이 옵션을 켜면, 새로은 게임을 시작할 때 지도를 더욱 살펴볼 수 있도록 게임을 자동으로 일시정시시킵니다. +STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME_HELPTEXT :이 설정을 켜면, 새로은 게임을 시작할 때 지도를 더욱 자세히 살펴볼 수 있도록 게임을 자동으로 일시정시합니다. STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL :일시 정지 상태에서 가능한 행동: {STRING} STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_HELPTEXT :게임이 일시 정지된 동안에 할 수 있는 행동을 선택합니다. STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_NO_ACTIONS :아무 것도 못 함 @@ -1431,7 +1439,7 @@ STR_CONFIG_SETTING_SOUND_AMBIENT :주변 소리: STR_CONFIG_SETTING_SOUND_AMBIENT_HELPTEXT :주변 풍경이나 산업시설, 도시의 효과음을 재생합니다. STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING :사용 가능한 차량이 없을 경우 해당 기반시설 비활성화: {STRING} -STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING_HELPTEXT :이 옵션을 켜면, 불필요하게 시간과 돈을 낭비하지 않도록 차량이 존재하지 않는 기반시설을 설치할 수 없게 됩니다. +STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING_HELPTEXT :이 설정을 켜면, 불필요하게 시간과 돈을 낭비하지 않도록 사용 가능한 차량이 없는 기반시설은 설치할 수 없게 됩니다. STR_CONFIG_SETTING_MAX_TRAINS :회사당 최대 열차 수: {STRING} STR_CONFIG_SETTING_MAX_TRAINS_HELPTEXT :한 회사가 소유할 수 있는 열차의 최대 수를 제한합니다. STR_CONFIG_SETTING_MAX_ROAD_VEHICLES :회사당 최대 자동차/전차 수: {STRING} @@ -1442,13 +1450,13 @@ 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_ROAD_VEHICLES_HELPTEXT :이 설정을 켜면, 컴퓨터 플레이어가 자동차나 전차를 사용할 수 없게 됩니다. STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT :컴퓨터의 항공기 사용을 허가하지 않음: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT_HELPTEXT :이 옵션을 켜면 컴퓨터 플레이어가 항공기를 사용할 수 없게 됩니다. +STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT_HELPTEXT :이 설정을 켜면, 컴퓨터 플레이어가 항공기를 사용할 수 없게 됩니다. STR_CONFIG_SETTING_AI_BUILDS_SHIPS :컴퓨터의 선박 사용을 허가하지 않음: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_SHIPS_HELPTEXT :이 옵션을 켜면 컴퓨터 플레이어가 선박을 사용할 수 없게 됩니다. +STR_CONFIG_SETTING_AI_BUILDS_SHIPS_HELPTEXT :이 설정을 켜면, 컴퓨터 플레이어가 선박을 사용할 수 없게 됩니다. STR_CONFIG_SETTING_AI_PROFILE :기본 설정 난이도: {STRING} STR_CONFIG_SETTING_AI_PROFILE_HELPTEXT :무작위 인공지능이 사용할 난이도 설정이나, 인공지능 또는 게임 스크립트를 추가할 때의 난이도 초기값을 고르십시오. @@ -1474,11 +1482,11 @@ STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :항공기에 STR_CONFIG_SETTING_SERVINT_SHIPS :선박에 대한 기본 점검 기준: {STRING} STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :선박에 따로 점검 기간이 설정되어있지 않은 경우에 사용할 기본 점검 기간을 설정합니다. STR_CONFIG_SETTING_NOSERVICE :차량 고장 설정이 비활성화된 경우 정비하지 않음: {STRING} -STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :'차량고장'이 비활성화되었을 때 이 옵션을 켜면, 차량 정비 설정을 무시합니다. +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 :이 옵션을 켜면 전기 기관차가 일반 철도에서도 달릴 수 있도록 요구사항을 제거합니다. +STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT :이 설정을 켜면, 전기 기관차가 일반 철도에서도 달릴 수 있도록 만듭니다. STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN :내 회사의 첫 차량 도착: {STRING} STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN_HELPTEXT :나의 새 역사에 처음으로 차량이 도착하면 메시지로 알려줍니다. @@ -1497,7 +1505,7 @@ STR_CONFIG_SETTING_NEWS_ECONOMY_CHANGES_HELPTEXT :거시적인 STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY :내 회사에 의한 산업시설의 생산량 변동: {STRING} STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY_HELPTEXT :내 회사가 수송하는 산업시설의 생산량이 변하면 소식으로 알려줍니다. STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER :경쟁사에 의한 산업시설의 생산량 변동: {STRING} -STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER_HELPTEXT :경쟁사가 수송하고 있는 산업 시설의 생산량이 변하면 메시지로 알려줍니다. +STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER_HELPTEXT :경쟁사가 수송하고 있는 산업시설의 생산량이 변하면 메시지로 알려줍니다. STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED :다른 산업 생산물 변화: {STRING} STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED_HELPTEXT :아무도 수송하지 않는 산업시설의 생산량이 변하면 소식으로 알려줍니다. STR_CONFIG_SETTING_NEWS_ADVICE :내 회사의 차량에 관한 권고 / 정보: {STRING} @@ -1518,21 +1526,21 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :전체 메시 STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :컬러로 된 뉴스가 시작되는 해: {STRING}년 STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :신문이 컬러로 나오게 되는 연도를 설정합니다. 이 연도 이전까지는 신문이 흑백으로 나옵니다. STR_CONFIG_SETTING_STARTING_YEAR :시작 연도: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY :부드러운 경제(더욱 작은 변화) 옵션 사용: {STRING} -STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :이 옵션을 활성화하면 1차 산업시설의 생산량이 좁은 폭으로 자주 변하게 됩니다. NewGRF로 추가한 산업시설에는 적용되지 않습니다. +STR_CONFIG_SETTING_SMOOTH_ECONOMY :부드러운 경제 변화 사용 (자주, 조금씩 변화): {STRING} +STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :이 설정을 켜면, 1차 산업시설의 생산량이 소량으로 자주 변하게 됩니다. NewGRF로 추가한 산업시설에는 적용되지 않습니다. STR_CONFIG_SETTING_ALLOW_SHARES :다른 회사의 지분을 사는 것을 허용: {STRING} -STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :이 옵션을 켜면, 회사의 지분을 거래할 수 있게 됩니다. 회사의 지분을 거래하려면 해당 회사가 어느 정도 오래되어야 합니다. +STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :이 설정을 켜면, 회사의 지분을 거래할 수 있게 됩니다. 회사의 지분을 거래하려면 해당 회사가 어느 정도 오래되어야 합니다. STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :환승시 벌어들이는 중간 수익의 비율: {STRING} STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :더 많은 수익을 내기 위해, 수송 관계상 중간 구간에게 주어진 수익의 비율을 설정합니다. STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :신호기를 드래그로 설치하는 경우: {STRING} STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :신호기를 드래그할 때, 다음 장애물(신호기, 분기점 등)을 만날 때까지 신호기가 설치될 간격을 설정합니다. STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA}칸 간격으로 설치 STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :드래그할 때, 신호기 사이의 거리를 계속 고정: {STRING} -STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :신호기를 CTRL+드래그 하여 설치할 때의 행동을 선택합니다. 이 옵션을 끄면, 신호기가 없는 긴 폐색을 만들지 않기 위해 터널이나 다리 주변에 먼저 신호기가 설치될 것입니다. 이 옵션을 켜면, 신호기는 터널/다리와 상관없이 매 n개의 칸마다 설치될 것입니다. +STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :신호기를 CTRL+드래그 하여 설치할 때의 행동을 선택합니다. 이 설정을 끄면, 신호기가 없는 긴 폐색을 만들지 않기 위해 터널이나 다리 주변에 먼저 신호기가 설치될 것입니다. 이 설정을 켜면, 신호기는 터널/다리와 상관없이 매 n개의 칸마다 설치될 것입니다. STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :전자식 신호기의 사용: {STRING}년 이후에 -STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :전자식 신호기를 사용할 수 있는 연도를 설정합니다. 이 이전에는 구식 신호기만 사용 가능합니다. (두 신호등은 기능적으로는 동일하고 모습만 다릅니다.) +STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :전자식 신호기를 사용할 수 있는 연도를 설정합니다. 이 이전에는 구식 신호기만 사용 가능합니다. (두 신호기는 기능적으로는 동일하고 모습만 다릅니다.) STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI :신호기 설치시 신호기 선택 창을 띄움: {STRING} -STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI_HELPTEXT :설치할 신호기 종류를 고를 수 있는 신호기 선택 창을 표시합니다. 이 옵션을 끄면 선택 창 없이 CTRL+클릭 만으로 신호기의 종류를 바꿔야 합니다. +STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI_HELPTEXT :설치할 신호기 종류를 고를 수 있는 신호기 선택 창을 표시합니다. 이 설정을 끄면, 신호기 선택 창 없이 CTRL+클릭 만으로 신호기의 종류를 바꿔야 합니다. STR_CONFIG_SETTING_DEFAULT_SIGNAL_TYPE :기본적으로 만들 신호기 종류: {STRING} STR_CONFIG_SETTING_DEFAULT_SIGNAL_TYPE_HELPTEXT :기본으로 설치할 신호기의 종류를 선택합니다. STR_CONFIG_SETTING_DEFAULT_SIGNAL_NORMAL :일반 신호기 @@ -1552,11 +1560,11 @@ STR_CONFIG_SETTING_TOWN_LAYOUT_2X2_GRID :2x2 칸 STR_CONFIG_SETTING_TOWN_LAYOUT_3X3_GRID :3x3 칸 STR_CONFIG_SETTING_TOWN_LAYOUT_RANDOM :무작위 STR_CONFIG_SETTING_ALLOW_TOWN_ROADS :도시 스스로의 도로 건설 허용: {STRING} -STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :도시가 성장하기 위해 도로를 건설할 수 있도록 허용합니다. 도시 당국이 스스로 성장하지 못하도록 하려면 이 옵션을 끄십시오. +STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :도시가 성장하기 위해 도로를 건설할 수 있도록 허용합니다. 도시 당국이 스스로 도로를 만들지 못하도록 하려면 이 설정을 끄십시오. STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :도시가 회사 소유의 선로에 건널목을 만드는 것을 허용: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :도시가 회사 소유의 선로에 건널목을 건설할 수 있도록 허용합니다. STR_CONFIG_SETTING_NOISE_LEVEL :도시가 공항에서 나오는 소음을 제한하도록 함: {STRING} -STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :이 옵션을 끄면, 한 도시에는 공항을 2개까지 지을 수 있습니다. 이 옵션을 켜면, 한 도시에 지을 수 있는 공항의 수는 도시가 허용 가능한 소음 기준에 따라 달라집니다. 소음 기준은 도시 인구, 공항의 크기와 거리에 따라 다릅니다. +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :이 설정을 끄면, 한 도시에는 공항을 2개까지 지을 수 있습니다. 이 설정을 켜면, 한 도시에 지을 수 있는 공항의 수는 도시가 허용 가능한 소음 기준에 따라 달라집니다. 소음 기준은 도시 인구, 공항의 크기와 거리에 따라 다릅니다. STR_CONFIG_SETTING_TOWN_FOUNDING :게임 도중에 도시 건설: {STRING} STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :플레이어가 게임 중에 새로운 도시를 설립하는 것을 허용합니다. STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN :금지 @@ -1564,7 +1572,7 @@ STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :허용 STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED_CUSTOM_LAYOUT :허용, 도시 구조 선택 가능 STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :게임 진행 중에 나무가 자동적으로 번식: {STRING} -STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :게임 중에 나무가 자동적으로 번식하는지 여부를 조절합니다. 이 옵션은 열대 우림의 벌목소처럼 나무의 성장에 의존하는 산업 시설에 영향을 끼칠 수 있습니다. +STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :게임 중에 나무가 자동적으로 번식하는지 여부를 조절합니다. 이 설정을 조정하면, 아열대 기후의 벌목소처럼 나무의 성장에 의존하는 산업시설에 영향을 끼칠 수 있습니다. STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NONE :자라지 않음 {RED}(제재소에 의해 벌목될 수 있음) STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_RAINFOREST :열대 우림 지역에서만 STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_ALL :어디서나 @@ -1708,7 +1716,7 @@ STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}설정 STR_CONFIG_ERROR :{WHITE}설정 파일에서 오류 발생 STR_CONFIG_ERROR_ARRAY :{WHITE}... 배열 '{STRING}'에서 오류 발생 STR_CONFIG_ERROR_INVALID_VALUE :{WHITE}... '{1:STRING}'에 잘못된 값('{0:STRING}')이 지정되었습니다. -STR_CONFIG_ERROR_TRAILING_CHARACTERS :{WHITE}... 설정 '{STRING}' 끝에 후행문자(??) +STR_CONFIG_ERROR_TRAILING_CHARACTERS :{WHITE}... '{STRING}' 설정의 끝에 후행 문자가 있습니다. STR_CONFIG_ERROR_DUPLICATE_GRFID :{WHITE}... NewGRF '{STRING}' 무시중: '{STRING}'{G 1 "과" "와"} GRF ID가 겹침 STR_CONFIG_ERROR_INVALID_GRF :{WHITE}... 유효하지 않은 NewGRF '{STRING}' 무시중: {STRING} STR_CONFIG_ERROR_INVALID_GRF_NOT_FOUND :찾을 수 없음 @@ -1722,7 +1730,7 @@ STR_CONFIG_ERROR_INVALID_BASE_GRAPHICS_NOT_FOUND :{WHITE}... 기 STR_CONFIG_ERROR_INVALID_BASE_SOUNDS_NOT_FOUND :{WHITE}... 기본 효과음 세트({STRING})가 무시되었습니다: 파일을 찾을 수 없습니다. STR_CONFIG_ERROR_INVALID_BASE_MUSIC_NOT_FOUND :{WHITE}... 기본 배경음 세트({STRING})가 무시되었습니다: 파일을 찾을 수 없습니다. STR_CONFIG_ERROR_OUT_OF_MEMORY :{WHITE}메모리 초과 -STR_CONFIG_ERROR_SPRITECACHE_TOO_BIG :{WHITE}{BYTES}의 스프라이트 캐시 할당에 실패하였습니다. 스프라이트 캐시는 {BYTES} 만큼으로 감소합니다. 이는 OpenTTD의 성능을 저하시킬 것입니다. 메모리 요구사항을 낮추려면 32bpp를 비활성화하거나 화면 확대 옵션을 기본값에 가깝게 조절하십시오. +STR_CONFIG_ERROR_SPRITECACHE_TOO_BIG :{WHITE}{BYTES}의 스프라이트 캐시 할당에 실패하였습니다. 스프라이트 캐시 용량이 {BYTES}로 감소합니다. 이는 OpenTTD의 성능을 저하시킬 것입니다. 메모리 요구사항을 낮추려면 32bpp를 비활성화하거나 화면 확대 설정을 기본값에 가깝게 조절하십시오. # Intro window STR_INTRO_CAPTION :{WHITE}OpenTTD {REV} @@ -1762,7 +1770,8 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}새로 STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}인공지능/게임 스크립트 설정창을 엽니다. STR_INTRO_TOOLTIP_QUIT :{BLACK}'OpenTTD'를 종료합니다. -STR_INTRO_TRANSLATION :{BLACK}이 버전의 OpenTTD는 {NUM}개의 문장이 한국어로 번역되지 않았습니다. 한국어 번역자에게 번역을 의뢰하십시오.{}텔크 (telk5093@gmail.com) +STR_INTRO_BASESET :{BLACK}현재 선택된 기본 그래픽 세트에는 {NUM}개의 스프라이트가 빠져있습니다. 기본 세트를 업데이트하세요. +STR_INTRO_TRANSLATION :{BLACK}이 버전의 OpenTTD는 {NUM}개의 문장이 한국어로 번역되지 않았습니다. OpenTTD가 더욱 발전할 수 있도록 번역에 참여하세요. 자세한 사항은 readme.txt를 참고하세요. # Quit window STR_QUIT_CAPTION :{WHITE}종료 @@ -2266,7 +2275,7 @@ STR_MISSING_GRAPHICS_YES_DOWNLOAD :{BLACK}예, 그 STR_MISSING_GRAPHICS_NO_QUIT :{BLACK}아니요, OpenTTD를 종료합니다. # Transparency settings window -STR_TRANSPARENCY_CAPTION :{WHITE}투명 옵션 +STR_TRANSPARENCY_CAPTION :{WHITE}투명 설정 STR_TRANSPARENT_SIGNS_TOOLTIP :{BLACK}역명판 투명 전환. 고정하려면 CTRL+클릭하세요. STR_TRANSPARENT_TREES_TOOLTIP :{BLACK}나무 투명 전환. 고정하려면 CTRL+클릭하세요. STR_TRANSPARENT_HOUSES_TOOLTIP :{BLACK}집 투명 전환. 고정하려면 CTRL+클릭하세요. @@ -2283,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}이용 없음 @@ -2367,9 +2377,9 @@ STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}복합 STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}경로 신호기 (전자식){}경로 신호기는 경로가 겹치지 않는 경우에 한 대 이상의 열차가 한 폐색 구간에 동시에 들어갈 수 있게 해줍니다. 경로 신호기는 반대편에서 통과가 가능합니다. STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}단방향 경로 신호기 (전자식){}경로 신호기는 경로가 겹치지 않는 경우에 한 대 이상의 열차가 한 폐색 구간에 동시에 들어갈 수 있게 해줍니다. 단방향 경로 신호기는 반대편에서 통과가 불가능합니다. STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}신호기 변환{}이 버튼을 선택한 뒤 이미 설치된 신호기를 클릭하면, 신호기의 종류(일반/입구/출구/복합/경로)와 형식(구식↔전자식)을 변경하고, CTRL+클릭하면 신호기의 형식을 변경합니다. SHIFT+클릭을 사용하면 예상 가격을 볼 수 있습니다. -STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}드래그시 신호기 간격 -STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}드래그시 신호기 간격 감소 -STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}드래그시 신호기 증가 +STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}드래그로 신호기를 설치하는 간격 +STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}드래그로 신호기를 설치하는 간격 감소 +STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}드래그로 신호기를 설치하는 간격 증가 # Bridge selection window STR_SELECT_RAIL_BRIDGE_CAPTION :{WHITE}철교 선택 @@ -2382,7 +2392,7 @@ STR_BRIDGE_NAME_GIRDER_STEEL :강철 거더 STR_BRIDGE_NAME_CANTILEVER_STEEL :강철 캔틸레버교 STR_BRIDGE_NAME_SUSPENSION_CONCRETE :콘크리트 현수교 STR_BRIDGE_NAME_WOODEN :나무 다리 -STR_BRIDGE_NAME_CONCRETE :콘트리트교 +STR_BRIDGE_NAME_CONCRETE :콘크리트교 STR_BRIDGE_NAME_TUBULAR_STEEL :강철 원통형 다리 STR_BRIDGE_TUBULAR_SILICON :실리콘 원통형 다리 @@ -2582,14 +2592,15 @@ STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}지역 STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :없음 STR_LAND_AREA_INFORMATION_LANDINFO_COORDS :{BLACK}좌표: {LTBLUE}{NUM} x {NUM} x {NUM} ({STRING}) STR_LAND_AREA_INFORMATION_BUILD_DATE :{BLACK}건설날짜: {LTBLUE}{DATE_LONG} -STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}정거장 등급: {LTBLUE}{STRING} -STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}정거장 종류: {LTBLUE}{STRING} +STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}역 분류: {LTBLUE}{STRING} +STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}역 종류: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_AIRPORT_CLASS :{BLACK}공항 등급: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_AIRPORT_NAME :{BLACK}공항 이름: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}공항 칸 이름: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}받을 수 있는 화물: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}철도 종류: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}선로의 제한 속력: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}도로 속도 제한: {LTBLUE}{VELOCITY} @@ -2602,29 +2613,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :들판 STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :눈덮인 땅 STR_LAI_CLEAR_DESCRIPTION_DESERT :사막 -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :일반 신호기가 설치된 {STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :입구 신호기가 설치된 {STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :출구 신호기가 설치된 {STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :복합 신호기가 설치된 {STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :경로 신호기가 설치된 {STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :단방향 경로 신호기가 설치된 {STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :일반 신호기와 입구 신호기가 설치된 {STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :일반 신호기와 출구 신호기가 설치된 {STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :일반 신호기와 복합 신호기가 설치된 {STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :일반 신호기와 경로 신호기가 설치된 {STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :일반 신호기와 단방향 경로 신호기가 설치된 {STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :입구 신호기와 출구 신호기가 설치된 {STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :입구 신호기와 복합 신호기가 설치된 {STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :입구 신호기와 경로 신호기가 설치된 {STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :입구 신호기와 단방향 경로 신호기가 설치된 {STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :출구 신호기와 복합 신호기가 설치된 {STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :출구 신호기와 경로 신호기가 설치된 {STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :출구 신호기와 단방향 경로 신호기가 설치된 {STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :복합 신호기와 경로 신호기가 설치된 {STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :복합 신호기와 단방향 경로 신호기가 설치된 {STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :경로 신호기와 단방향 경로 신호기가 설치된 {STRING} 선로 -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} 차량기지 +STR_LAI_RAIL_DESCRIPTION_TRACK :철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :일반 신호기가 설치된 철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :입구 신호기가 설치된 철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :출구 신호기가 설치된 철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :복합 신호기가 설치된 철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :경로 신호기가 설치된 철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :단방향 경로 신호기가 설치된 철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :일반 신호기와 입구 신호기가 설치된 철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :일반 신호기와 출구 신호기가 설치된 철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :일반 신호기와 복합 신호기가 설치된 철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :일반 신호기와 경로 신호기가 설치된 철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :일반 신호기와 단방향 경로 신호기가 설치된 철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :입구 신호기와 출구 신호기가 설치된 철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :입구 신호기와 복합 신호기가 설치된 철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :입구 신호기와 경로 신호기가 설치된 철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :입구 신호기와 단방향 경로 신호기가 설치된 철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :출구 신호기와 복합 신호기가 설치된 철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :출구 신호기와 경로 신호기가 설치된 철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :출구 신호기와 단방향 경로 신호기가 설치된 철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :복합 신호기와 경로 신호기가 설치된 철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :복합 신호기와 단방향 경로 신호기가 설치된 철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :경로 신호기와 단방향 경로 신호기가 설치된 철도 선로 +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :철도 차량기지 STR_LAI_ROAD_DESCRIPTION_ROAD :도로 STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :가로등이 있는 도로 @@ -2688,7 +2699,57 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :회사 소유 STR_ABOUT_OPENTTD :{WHITE}OpenTTD에 대해서 STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original copyright {COPYRIGHT} 1995 Chris Sawyer, All rights reserved STR_ABOUT_VERSION :{BLACK}OpenTTD 버전 {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 OpenTTD 개발팀 +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}게임 저장 @@ -2712,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}게임을 저장할 파일명을 입력하세요 @@ -2869,12 +2931,12 @@ STR_NEWGRF_INSPECT_QUERY_CAPTION :{WHITE}NewGRF # Sprite aligner window STR_SPRITE_ALIGNER_CAPTION :{WHITE}스프라이트 정렬 {COMMA} ({STRING}) STR_SPRITE_ALIGNER_NEXT_BUTTON :{BLACK}다음 스프라이트 -STR_SPRITE_ALIGNER_NEXT_TOOLTIP :{BLACK}(위조/재색상/글씨 스프라이트를 제외한) 다음 보통 스프라이트로 이동하고, 마지막 스프라이트에 다다르면 다시 처음으로 돌아갑니다. +STR_SPRITE_ALIGNER_NEXT_TOOLTIP :{BLACK}(유사/재색상/글씨 스프라이트를 제외한) 다음 보통 스프라이트로 이동하고, 마지막 스프라이트에 다다르면 다시 처음으로 돌아갑니다. STR_SPRITE_ALIGNER_GOTO_BUTTON :{BLACK}스프라이트 번호 입력 STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}입력한 스프라이트 번호로 이동합니다. 만약 입력한 번호의 스프라이트가 일반 스프라이트가 아닐경우, 그 다음으로 오는 일반 스프라이트로 이동합니다. STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}이전 스프라이트 -STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}(위조/재색상/글씨 스프라이트를 제외한) 이전 보통 스프라이트로 이동하고, 첫 번째 스프라이트에 다다르면 마지막으로 돌아갑니다. -STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}현재 선택된 스프라이트를 표시합니다. 이 스프라이트가 그려졌을때의 정렬은 무시합니다. +STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}(유사/재색상/글씨 스프라이트를 제외한) 이전 보통 스프라이트로 이동하고, 첫 번째 스프라이트에 다다르면 마지막으로 돌아갑니다. +STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}현재 선택된 스프라이트를 표현합니다. 이 스프라이트를 표현할 때, 정렬 상태는 무시하고 표현합니다. STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}X축이나 Y축 방향으로 스프라이트를 이동시킵니다. CTRL+클릭하면 한 번에 8씩 이동시킬 수 있습니다. STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}상대값 초기화 STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}현재 상대값 좌표를 초기화 @@ -2905,13 +2967,13 @@ STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :예기치 않 STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :알려지지 않은 액션 0 속성 {4:HEX} (스프라이트 {3:NUM}) STR_NEWGRF_ERROR_INVALID_ID :유효하지 않은 ID 사용 시도 (스프라이트 {3:NUM}) STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} 에 손상된 객체가 있습니다. 모든 손상된 객체는 붉은 물음표로 보일 것입니다. -STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :여러 개의 액션 8 엔트리 포함 (스프라이트 {3:NUM}) -STR_NEWGRF_ERROR_READ_BOUNDS :모조-스프라이트의 지나간 끝을 읽음 (스프라이트 {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}최근에 이용한 기본 그래픽 세트에 객체가 많이 손실되었습니다.{}기본 그래픽 세트를 업데이트 하십시오. -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}현재 사용중인 기본 그래픽에 그래픽이 다수 존재하지 않습니다.{}기본 그래픽 세트를 업데이트해 주십시오.{}현재 당신이 {YELLOW}OpenTTD의 개발 버전{WHITE}을 사용하고 있기 때문에, {YELLOW}기본 그래픽의 개발 버전{WHITE}이 필요할 수 있습니다. +STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :여러 개의 Action 8 엔트리 포함 (스프라이트 {3:NUM}) +STR_NEWGRF_ERROR_READ_BOUNDS :유사 스프라이트의 끝이었던 부분을 읽으려고 시도함 (스프라이트 {3:NUM}) 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}경고! @@ -2937,7 +2999,7 @@ STR_NEWGRF_BROKEN :{WHITE}'{0:STRI STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}차고지 안에 있지 않은 '{1:ENGINE}'에 대한 동력 차량 상태가 바뀌었습니다. STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}'{1:ENGINE}'{G 1 "이" "가"} 차고지 안에 있지 않으면 차량 길이가 바뀝니다. STR_NEWGRF_BROKEN_CAPACITY :{WHITE}차량이 기지 안에 있지 않거나 개조가 불가능한 상태에서 '{1:ENGINE}'의 수송량이 변경되었습니다. -STR_BROKEN_VEHICLE_LENGTH :{WHITE}'{1:COMPANY}'에 속한 열차 '{0:VEHICLE}'의 길이가 잘못된 값을 가지고 있습니다. NewGRF에 의한 문제로 추축됩니다. 게임이 비동기화 또는 충돌을 일으킬 수 있습니다. +STR_BROKEN_VEHICLE_LENGTH :{WHITE}'{1:COMPANY}'에 속한 열차 '{0:VEHICLE}'의 길이가 잘못된 값을 가지고 있습니다. NewGRF에 의한 문제로 보입니다. 게임이 비동기화 또는 충돌을 일으킬 수 있습니다. STR_NEWGRF_BUGGY :{WHITE}NewGRF '{STRING}' (이)가 잘못된 정보를 제공하고 있습니다. STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}{1:ENGINE}(을)를 만들기 이전과 이후의 화물/개조 정보가 현재의 구매 목록과 다릅니다. 이 경우 자동 교체시 열차 개조에 실패할 수도 있습니다. @@ -2976,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} @@ -2983,8 +3046,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_PASSENGERS_LAST_MONTH_MAX :{BLACK}지난 달 승객 수: {ORANGE}{COMMA}{BLACK} 최대: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{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 "이" "가"} 필요함 STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :겨울에는 {ORANGE}{STRING}{BLACK}{G 0 "이" "가"} 필요함 @@ -3012,7 +3074,7 @@ STR_LOCAL_AUTHORITY_CAPTION :{WHITE}{TOWN} STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}회사에 대한 이 도시의 평판: STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING} STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}가능한 행동: -STR_LOCAL_AUTHORITY_ACTIONS_TOOLTIP :{BLACK}이 도시에 할 수 있는 일 목록 - 상세 정보를 보시려면 클릭하세요 +STR_LOCAL_AUTHORITY_ACTIONS_TOOLTIP :{BLACK}이 도시에 할 수 있는 일 목록 - 상세 정보를 보시려면 클릭하세요. STR_LOCAL_AUTHORITY_DO_IT_BUTTON :{BLACK}실행 STR_LOCAL_AUTHORITY_DO_IT_TOOLTIP :{BLACK}선택된 항목을 실행에 옮깁니다 @@ -3115,8 +3177,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}받음 STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}받는 화물의 목록 표시 STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}받음: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}이 역은 도시의 수송권을 독점하고 있는 역입니다. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} 이(가) 이 도시의 수송 독점권을 구매하였습니다. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}이 역은 도시의 수송권을 독점하고 있는 역입니다. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} 이(가) 이 도시의 수송 독점권을 구매하였습니다. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}등급 STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}역의 등급 표시 @@ -3295,9 +3357,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}필요 STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}필요함: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}받는 화물: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} 대기중{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}생산되기 위해 대기 중인 화물량: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}생산: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}생산: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3364,6 +3428,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :모든 차량 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 STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :새 열차 STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :새 전기 열차 @@ -3395,6 +3464,7 @@ STR_PURCHASE_INFO_ALL_TYPES :모든 화물 STR_PURCHASE_INFO_ALL_BUT :{CARGO_LIST} 이외의 모든 화물 STR_PURCHASE_INFO_MAX_TE :{BLACK}최고 견인력: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}항속거리: {GOLD}{COMMA} 칸 +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}항공기 종류: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}열차 차량 구매 목록입니다. 차량의 정보를 보려면 클릭하세요. CTRL + 클릭하면 해당 차량을 숨김/표시 처리할 수 있습니다. STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}자동차/전차 구매 목록입니다. 차량의 정보를 보려면 클릭하세요. CTRL + 클릭하면 해당 차량을 숨김/표시 처리할 수 있습니다. @@ -3527,11 +3597,12 @@ STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :{G=f}모노레 STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :{G=f}자기부상열차 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} 최대 T.E.: {6:FORCE}{}유지비: {4:CURRENCY_LONG}/년{}용량: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}가격: {CURRENCY_LONG} 최고속력: {VELOCITY}{}수송량: {CARGO_LONG}, {CARGO_LONG}{}유지비: {CURRENCY_LONG}/년 -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}가격: {CURRENCY_LONG} 최고속력: {VELOCITY}{}수송량: {CARGO_LONG}{}유지비: {CURRENCY_LONG}/년 -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}가격: {CURRENCY_LONG} 최고 속력: {VELOCITY} 항속거리: {COMMA} 칸{}수용량: {CARGO_LONG}, {CARGO_LONG}{}유지비: {CURRENCY_LONG}/년 -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}가격: {CURRENCY_LONG} 최고 속력: {VELOCITY} 항속거리: {COMMA} 칸{}수용량: {CARGO_LONG}{}유지비: {CURRENCY_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} @@ -3558,10 +3629,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :낡으면 {ENGI STR_REPLACE_VEHICLES_STOP :{BLACK}차량 교체 중지 STR_REPLACE_HELP_STOP_BUTTON :{BLACK}왼쪽에서 선택한 기관차 종류의 차량교체를 중지하려면 이 버튼을 누르세요. -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}교체중: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}기관차/화물차 교체 창으로 전환합니다. STR_REPLACE_ENGINES :기관차 STR_REPLACE_WAGONS :화물차 +STR_REPLACE_ALL_RAILTYPE :모든 철도 차량 STR_REPLACE_HELP_RAILTYPE :{BLACK}교체할 기관차의 철도 종류를 고르세요 STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}왼쪽의 선택한 기관차가 어떤 기관차로 교체되고 있는지 표시합니다. @@ -3654,9 +3725,10 @@ STR_VEHICLE_INFO_AGE :{COMMA}년 ({CO STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA}년 ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}최고 속력: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}최고 속력: {LTBLUE}{VELOCITY} {BLACK}항속거리: {LTBLUE}{COMMA} 칸 -STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}무게: {LTBLUE}{WEIGHT_SHORT} {BLACK}힘: {LTBLUE}{POWER}{BLACK} 최고속력: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}무게: {LTBLUE}{WEIGHT_SHORT} {BLACK}힘: {LTBLUE}{POWER}{BLACK} 최고속력: {LTBLUE}{VELOCITY} {BLACK}최고 T.E.: {LTBLUE}{FORCE} +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}최고 속력: {LTBLUE}{VELOCITY} {BLACK}항공기 종류: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}최고 속력: {LTBLUE}{VELOCITY} {BLACK}항공기 종류: {LTBLUE}{STRING} {BLACK}항속거리: {LTBLUE}{COMMA}칸 +STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}무게: {LTBLUE}{WEIGHT_SHORT} {BLACK}힘: {LTBLUE}{POWER}{BLACK} 최고 속력: {LTBLUE}{VELOCITY} +STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}무게: {LTBLUE}{WEIGHT_SHORT} {BLACK}힘: {LTBLUE}{POWER}{BLACK} 최고 속력: {LTBLUE}{VELOCITY} {BLACK}최고 견인력: {LTBLUE}{FORCE} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}올해 수익: {LTBLUE}{CURRENCY_LONG} (작년: {CURRENCY_LONG}) STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}신뢰도: {LTBLUE}{COMMA}% {BLACK}최근 점검 이후의 고장: {LTBLUE}{COMMA} @@ -3670,7 +3742,7 @@ STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}수송 STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}환승 수익: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS :{BLACK}정비 간격: {LTBLUE}{COMMA}일마다{BLACK} 마지막 정비 날짜: {LTBLUE}{DATE_LONG} -STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}정비 간격: {LTBLUE}{COMMA}% 이하일 때 마지막 정비 날짜: {LTBLUE}{DATE_LONG} +STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}정비 간격: {LTBLUE}{COMMA}%{BLACK} 이하일 때 마지막 정비 날짜: {LTBLUE}{DATE_LONG} STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}점검 기준값을 10만큼 올립니다. CTRL+클릭하면 점검 기준값을 5만큼 올립니다. STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}점검 기준값을 10만큼 내립니다. CTRL+클릭하면 점검 기준값을 5만큼 내립니다. @@ -3796,8 +3868,8 @@ STR_ORDER_CONDITIONAL_COMPARATOR_LESS_THAN :< STR_ORDER_CONDITIONAL_COMPARATOR_LESS_EQUALS :≤ STR_ORDER_CONDITIONAL_COMPARATOR_MORE_THAN :> STR_ORDER_CONDITIONAL_COMPARATOR_MORE_EQUALS :≥ -STR_ORDER_CONDITIONAL_COMPARATOR_IS_TRUE :있을 때 -STR_ORDER_CONDITIONAL_COMPARATOR_IS_FALSE :없을 때 +STR_ORDER_CONDITIONAL_COMPARATOR_IS_TRUE :이 있을 때 +STR_ORDER_CONDITIONAL_COMPARATOR_IS_FALSE :이 없을 때 STR_ORDER_CONDITIONAL_VALUE_TOOLTIP :{BLACK}비교조건에 대한 입력값입니다. STR_ORDER_CONDITIONAL_VALUE_CAPT :{WHITE}비교할 값을 입력하세요. @@ -4213,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}역 이름을 바꿀 수 없습니다... @@ -4221,6 +4292,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}역의 일부를 제거할 수 없습니다... @@ -4468,10 +4540,12 @@ STR_DESKTOP_SHORTCUT_COMMENT :트랜스포트 STR_BASEGRAPHICS_DOS_DESCRIPTION :오리지널 트랜스포트 타이쿤 디럭스 도스 에디션의 그래픽입니다. STR_BASEGRAPHICS_DOS_DE_DESCRIPTION :오리지널 트랜스포트 타이쿤 디럭스 도스 에디션(독일)의 그래픽입니다. STR_BASEGRAPHICS_WIN_DESCRIPTION :오리지널 트랜스포트 타이쿤 디럭스 윈도 에디션의 그래픽입니다. -STR_BASESOUNDS_DOS_DESCRIPTION :오리지널 트랜스포트 타이쿤 도스 에디션의 효과음입니다. +STR_BASESOUNDS_DOS_DESCRIPTION :오리지널 트랜스포트 타이쿤 디럭스 도스 에디션의 효과음입니다. STR_BASESOUNDS_WIN_DESCRIPTION :오리지널 트랜스포트 타이쿤 디럭스 윈도 에디션의 효과음입니다. STR_BASESOUNDS_NONE_DESCRIPTION :아무런 효과음도 없는 효과음 팩입니다. STR_BASEMUSIC_WIN_DESCRIPTION :오리지널 트랜스포트 타이쿤 디럭스 윈도 에디션의 음악입니다. +STR_BASEMUSIC_DOS_DESCRIPTION :오리지널 트랜스포트 타이쿤 디럭스 DOS 에디션의 음악입니다. +STR_BASEMUSIC_TTO_DESCRIPTION :오리지널 트랜스포트 타이쿤 (오리지널/월드 에디터) DOS 에디션의 음악입니다. STR_BASEMUSIC_NONE_DESCRIPTION :실제 음악이 없는 음악 목록입니다. ##id 0x2000 diff --git a/src/lang/latin.txt b/src/lang/latin.txt index f1874e8de9..9fa9f87293 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -61,10 +61,10 @@ STR_CARGO_PLURAL_WOOD :{G=n}Lignum STR_CARGO_PLURAL_WOOD.gen :ligni STR_CARGO_PLURAL_WOOD.acc :Lignum STR_CARGO_PLURAL_WOOD.dat :Ligno -STR_CARGO_PLURAL_IRON_ORE :{G=n}Ferrum -STR_CARGO_PLURAL_IRON_ORE.gen :ferri -STR_CARGO_PLURAL_IRON_ORE.acc :Ferrum -STR_CARGO_PLURAL_IRON_ORE.dat :Ferro +STR_CARGO_PLURAL_IRON_ORE :{G=n}Ferrum Rude +STR_CARGO_PLURAL_IRON_ORE.gen :ferri rudis +STR_CARGO_PLURAL_IRON_ORE.acc :Ferrum Rude +STR_CARGO_PLURAL_IRON_ORE.dat :Ferro Rudi STR_CARGO_PLURAL_STEEL :{G=m}Chalybs STR_CARGO_PLURAL_STEEL.gen :chalybis STR_CARGO_PLURAL_STEEL.acc :Chalybem @@ -73,10 +73,10 @@ STR_CARGO_PLURAL_VALUABLES :{G=fp}Res Preti STR_CARGO_PLURAL_VALUABLES.gen :rerum pretiosarum STR_CARGO_PLURAL_VALUABLES.acc :Res Pretiosas STR_CARGO_PLURAL_VALUABLES.dat :Rebus Pretiosis -STR_CARGO_PLURAL_COPPER_ORE :{G=n}Aes -STR_CARGO_PLURAL_COPPER_ORE.gen :aeris -STR_CARGO_PLURAL_COPPER_ORE.acc :Aes -STR_CARGO_PLURAL_COPPER_ORE.dat :Aeri +STR_CARGO_PLURAL_COPPER_ORE :{G=n}Aes Rude +STR_CARGO_PLURAL_COPPER_ORE.gen :aeris rudis +STR_CARGO_PLURAL_COPPER_ORE.acc :Aes Rude +STR_CARGO_PLURAL_COPPER_ORE.dat :Aeri Rudi STR_CARGO_PLURAL_MAIZE :{G=n}Maizium STR_CARGO_PLURAL_MAIZE.gen :maizii STR_CARGO_PLURAL_MAIZE.acc :Maizium @@ -188,10 +188,10 @@ STR_CARGO_SINGULAR_WOOD :{G=n}Lignum STR_CARGO_SINGULAR_WOOD.gen :ligni STR_CARGO_SINGULAR_WOOD.acc :Lignum STR_CARGO_SINGULAR_WOOD.dat :Ligno -STR_CARGO_SINGULAR_IRON_ORE :{G=n}Ferrum -STR_CARGO_SINGULAR_IRON_ORE.gen :ferri -STR_CARGO_SINGULAR_IRON_ORE.acc :Ferrum -STR_CARGO_SINGULAR_IRON_ORE.dat :Ferro +STR_CARGO_SINGULAR_IRON_ORE :{G=n}Ferrum Rudum +STR_CARGO_SINGULAR_IRON_ORE.gen :ferri rudis +STR_CARGO_SINGULAR_IRON_ORE.acc :Ferrum Rude +STR_CARGO_SINGULAR_IRON_ORE.dat :Ferro Rudi STR_CARGO_SINGULAR_STEEL :{G=m}Chalybs STR_CARGO_SINGULAR_STEEL.gen :chalybis STR_CARGO_SINGULAR_STEEL.acc :Chalybem @@ -200,10 +200,10 @@ STR_CARGO_SINGULAR_VALUABLES :{G=fp}Res Preti STR_CARGO_SINGULAR_VALUABLES.gen :rerum pretiosarum STR_CARGO_SINGULAR_VALUABLES.acc :Res Pretiosas STR_CARGO_SINGULAR_VALUABLES.dat :Rebus Pretiosis -STR_CARGO_SINGULAR_COPPER_ORE :{G=n}Aes -STR_CARGO_SINGULAR_COPPER_ORE.gen :aeris -STR_CARGO_SINGULAR_COPPER_ORE.acc :Aes -STR_CARGO_SINGULAR_COPPER_ORE.dat :Aeri +STR_CARGO_SINGULAR_COPPER_ORE :{G=n}Aes Rude +STR_CARGO_SINGULAR_COPPER_ORE.gen :aeris rudis +STR_CARGO_SINGULAR_COPPER_ORE.acc :Aes Rude +STR_CARGO_SINGULAR_COPPER_ORE.dat :Aeri Rudi STR_CARGO_SINGULAR_MAIZE :{G=n}Maizium STR_CARGO_SINGULAR_MAIZE.gen :maizii STR_CARGO_SINGULAR_MAIZE.acc :Maizium @@ -291,10 +291,10 @@ STR_QUANTITY_LIVESTOCK :{G=np}{COMMA}{N STR_QUANTITY_GOODS :{G=fp}{COMMA}{NBSP}capsa{P "" e} mercium STR_QUANTITY_GRAIN :{WEIGHT_LONG} frumenti STR_QUANTITY_WOOD :{WEIGHT_LONG} ligni -STR_QUANTITY_IRON_ORE :{WEIGHT_LONG} ferri +STR_QUANTITY_IRON_ORE :{WEIGHT_LONG} ferri rudis STR_QUANTITY_STEEL :{WEIGHT_LONG} chalybis STR_QUANTITY_VALUABLES :{G=mp}{COMMA}{NBSP}sacc{P us i} rerum pretiosarum -STR_QUANTITY_COPPER_ORE :{WEIGHT_LONG} aeris +STR_QUANTITY_COPPER_ORE :{WEIGHT_LONG} aeris rudis STR_QUANTITY_MAIZE :{WEIGHT_LONG} maizii STR_QUANTITY_FRUIT :{WEIGHT_LONG} fructuum STR_QUANTITY_DIAMONDS :{G=mp}{COMMA}{NBSP}sacc{P us i} adamantum @@ -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 @@ -857,15 +858,15 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Eligere STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Incipere desinereve admixtionem carminum STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Monstrare fenestram electionis carminum -STR_ERROR_NO_SONGS :{WHITE}Compositio sine carminibus electa est. Nulla carmina canentur - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Electio Compositionis Musicae +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) @@ -1068,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 @@ -1525,9 +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_REVERSE_SCROLLING :Revertere cursum vagationis: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Quomodo tabula vagatur globulo dextri presso. Neglecta, mus conspectum movet. Electa, mus tabulam movet -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 @@ -1558,8 +1563,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Cmd+Premere STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Premere STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Neglecta -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Vagatio globuli sinistri: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Annuere tabulam vagari trahendo globuli sinistri. Magnopere utilis est cum tangendo navigas in scrinio +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Claudere fenestras globulo muris dextro: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Facit ut globulus muris dexter fenestras claudat. Cave: hac electa, non apparent nuntia adiuvantia globulo dextro. STR_CONFIG_SETTING_AUTOSAVE :Servare automatice: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Eligere crebritatem automatice ludum servandi @@ -1949,6 +1954,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Inspicer STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Monstrare optiones IA/Ludi scriptorum STR_INTRO_TOOLTIP_QUIT :{BLACK}Exire OpenTTD +STR_INTRO_BASESET :{BLACK}Hoc fundamento graphico desunt spiritus {NUM}. Quaere novam editionem huius fundamenti. STR_INTRO_TRANSLATION :{BLACK}In hac interpretatione, {NUM} series desunt. Quaesimus, iuva OpenTTD meliorari et dic te velle interpretem esse. Vide readme.txt in quo plura sunt. # Quit window @@ -2480,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 @@ -2791,6 +2798,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Nomen te STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Onera accepta: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Typus ferriviae: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Velocitas maxima ferriviae: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Velocitas maxima viae: {LTBLUE}{VELOCITY} @@ -2803,29 +2811,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Agri STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Terra Nivea STR_LAI_CLEAR_DESCRIPTION_DESERT :Deserta -STR_LAI_RAIL_DESCRIPTION_TRACK :Astarium {STRING.gen} -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Astarium {STRING.gen} cum signalibus zonalibus -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Astarium {STRING.gen} cum signalibus aditus -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Astarium {STRING.gen} cum signalibus exitus -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Astarium {STRING.gen} cum signalibus compositis -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Astarium {STRING.gen} cum signalibus itineris -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Astarium {STRING.gen} cum signalibus itineris unius cursus -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Astarium {STRING.gen} cum signalibus zonalibus et aditus -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Astarium {STRING.gen} cum signalibus zonalibus et exitus -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Astarium {STRING.gen} cum signalibus zonalibus et compositis -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Astarium {STRING.gen} cum signalibus zonalibus et itineris -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Astarium {STRING.gen} cum signalibus zonalibus et itineris unius cursus -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Astarium {STRING.gen} cum signalibus aditus et exitus -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Astarium {STRING.gen} cum signalibus aditus et compositis -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Astarium {STRING.gen} cum signalibus aditus et itineris -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Astarium {STRING.gen} cum signalibus aditus et itineris unius cursus -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Astarium {STRING.gen} cum signalibus exitus et compositis -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Astarium {STRING.gen} cum signalibus exitus et itineris -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Astarium {STRING.gen} cum signalibus exitus et itineris unius cursus -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Astarium {STRING.gen} cum signalibus compositis et itineris -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Astarium {STRING.gen} cum signalibus compositis et itineris unius cursus -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Astarium {STRING.gen} cum signalibus itineris et unius cursus itineris -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Receptaculum {STRING.gen} +STR_LAI_RAIL_DESCRIPTION_TRACK :Astarium Ferriviae +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Ferrivia cum signalibus zonalibus +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Ferrivia cum signalibus aditus +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Ferrivia cum signalibus exitus +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Ferrivia cum signalibus compositis +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Ferrivia cum signalibus itineris +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Ferrivia cum signalibus itineris unius cursus +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Ferrivia cum signalibus zonalibus et aditus +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Ferrivia cum signalibus zonalibus et exitus +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Ferrivia cum signalibus zonalibus et compositis +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Ferrivia cum signalibus zonalibus et itineris +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Ferrivia cum signalibus zonalibus et itineris unius cursus +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Ferrivia cum signalibus aditus et exitus +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Ferrivia cum signalibus aditus et compositis +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Ferrivia cum signalibus aditus et itineris +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Ferrivia cum signalibus aditus et itineris unius cursus +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Ferrivia cum signalibus exitus et compositis +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Ferrivia cum signalibus exitus et itineris +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Ferrivia cum signalibus exitus et itineris unius cursus +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Ferrivia cum signalibus compositis et itineris +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Ferrivia cum signalibus compositis et itineris unius cursus +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Ferrivia cum signalibus itineris et unius cursus itineris +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Receptaculum ferriviarium STR_LAI_ROAD_DESCRIPTION_ROAD :Via STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Via cum lampadibus @@ -2889,7 +2897,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Terra societati STR_ABOUT_OPENTTD :{WHITE}De OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Privilegium impressorium originale {COPYRIGHT} MCMXCV Chris Sawyer, Omnia proprietatis iura reservantur STR_ABOUT_VERSION :{BLACK}OpenTTD editio {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} MMII-MMXVI Manus OpenTTD +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 @@ -3108,8 +3123,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Conatus agnosca STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} spiritum corruptum habet. Omnes spiritus corrupti monstrabuntur forma rubro puncto interrogativo - ? STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Continet plures Actiones 8 (spiritus {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Lectio post terminum pseudospiritus (spiritus {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Fundamento graphico adhibito deest nonulli spiritus.{}Utinam arcessas novam editionem -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Fundamento graphico adhibito deest nonulli spiritus.{}Utinam arcessas novam editionem.{}Quoniam ludis {YELLOW}editionem OpenTTD adhuc in explicando{WHITE}, fortasse etiam tibi necesse est {YELLOW}editio fundamenti graphici OpenTTD in explicando{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Opes GRF desideratae non parabiles (spiritus {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} neglectus est a {2:STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Irrita/ignota dispositio spiritus (spiritus {3:NUM}) @@ -3177,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} @@ -3184,8 +3198,6 @@ STR_TOWN_POPULATION :{BLACK}Incolae STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Urbs) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Incolae: {ORANGE}{COMMA}{BLACK} Aedificia: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Vectores mensis prioris: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Epistulae mensis prioris: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Onera mandata ad oppidum crescendum: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} mandatur STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} hieme mandatur @@ -3316,8 +3328,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Accipit STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Monstrare index onerum acceptorum STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Onera accepta: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Haec statio monopolio benefit. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} monopolium emit in hoc oppido. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Haec statio monopolio benefit. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} monopolium emit in hoc oppido. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Censiones STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Monstrare censiones stationum @@ -3496,9 +3508,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Postulat STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Postulat: {YELLOW}{STRING.acc}{STRING}, {STRING.acc}{STRING}, {STRING.acc}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Postulat: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING.acc}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} manet{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Onera utenda manentia: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Efficit: {YELLOW}{STRING.acc}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Efficit: {YELLOW}{STRING.acc}{STRING}, {STRING.acc}{STRING} ############ range for produces ends @@ -3565,6 +3579,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Removere omnia STR_GROUP_RENAME_CAPTION :{BLACK}Renominare gregem +STR_GROUP_PROFIT_THIS_YEAR :Lucrum huius anni: +STR_GROUP_PROFIT_LAST_YEAR :Lucrum anni prioris: +STR_GROUP_OCCUPANCY :Usus currens: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Vehicula Ferriviaria Nova STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Vehicula Ferriviaria Electrica Nova @@ -3596,6 +3615,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Omnibus onerum STR_PURCHASE_INFO_ALL_BUT :Omnibus praeterquam {CARGO_LIST.dat} STR_PURCHASE_INFO_MAX_TE :{BLACK}Vis Tractionis Maxima: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Max. distantia volatus: {GOLD}{COMMA} tegulas +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Typus aeroplani: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Index electionis vehiculorum ferriviariorum. Preme in vehiculum ut plura indicia monstrentur. Ctrl+Preme ut typus vehiculi celetur STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Index electionis vehiculorum viariorum. Preme in vehiculum ut plura indicia monstrentur. Ctrl+Preme ut typus vehiculi celetur @@ -3729,10 +3749,11 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :{G=f}hamaxam ma STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Pretium: {CURRENCY_LONG} Pondus: {WEIGHT_SHORT}{}Velocitas: {VELOCITY} Potestas: {POWER}{}Pretium Operandi: {CURRENCY_LONG} per annum{}Capacitas: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Pretium: {CURRENCY_LONG} Pondus: {WEIGHT_SHORT}{}Velocitas: {VELOCITY} Potestas: {POWER} V.T. Max.: {6:FORCE}{}Pretium Operandi: {4:CURRENCY_LONG} per annum{}Capacitas: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Pretium: {CURRENCY_LONG} Velocitas Maxima: {VELOCITY}{}Capacitas: {CARGO_LONG}, {CARGO_LONG}{}Pretium Operandi: {CURRENCY_LONG} per annum -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Pretium: {CURRENCY_LONG} Velocitas Maxima: {VELOCITY}{}Capacitas: {CARGO_LONG}{}Pretium Operandi: {CURRENCY_LONG} per annum -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Pretium: {CURRENCY_LONG} Velocitas Maxima: {VELOCITY} Range: {COMMA} tiles{}Capacitas: {CARGO_LONG}, {CARGO_LONG}{}Pretium Operandi: {CURRENCY_LONG} per annum -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Pretium: {CURRENCY_LONG} Velocitas Maxima: {VELOCITY} Range: {COMMA} tiles{}Capacitas: {CARGO_LONG}{}Pretium Operandi: {CURRENCY_LONG} per annum +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Pretium: {CURRENCY_LONG} Velocitas Maxima: {VELOCITY}{}Capacitas: {CARGO_LONG}{}Pretium Operandi: {CURRENCY_LONG} per annum +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Pretium: {CURRENCY_LONG} Velocitas Maxima: {VELOCITY}{}Typus Aeroplani: {STRING}{}Capacitas: {CARGO_LONG}, {CARGO_LONG}{}Pretium Operandi: {CURRENCY_LONG} per annum +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Pretium: {CURRENCY_LONG} Velocitas Maxima: {VELOCITY}{}Typus Aeroplani: {STRING}{}Capacitas: {CARGO_LONG}{}Pretium Operandi: {CURRENCY_LONG} per annum +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Pretium: {CURRENCY_LONG} Velocitas Maxima: {VELOCITY}{}Typus Aeroplani: {STRING} Max. Distantia Volatus: {COMMA} tegulas{}Capacitas: {CARGO_LONG}, {CARGO_LONG}{}Pretium Operandi: {CURRENCY_LONG} per annum +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Pretium: {CURRENCY_LONG} Velocitas Maxima: {VELOCITY}{}Typus Aeroplani: {STRING} Max. Distantia Volatus: {COMMA} tegulas{}Capacitas: {CARGO_LONG}{}Pretium Operandi: {CURRENCY_LONG} per annum # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Mutare {STRING} - {STRING} @@ -3759,10 +3780,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} cum ve STR_REPLACE_VEHICLES_STOP :{BLACK}Consistere mutationem vehiculorum STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Preme ut mutatio vehiculi sinistri consistatur -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Mutatio: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Mutare inter mutationem hamaxarum curruumque STR_REPLACE_ENGINES :Hamaxarum STR_REPLACE_WAGONS :Curruum +STR_REPLACE_ALL_RAILTYPE :Omnia vehicula ferriviaria STR_REPLACE_HELP_RAILTYPE :{BLACK}Eligere typum astarii cui est hamaxas commutandas STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Haec monstrat novum vehiculum desideratum, si adest @@ -3855,7 +3876,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} ann{P u STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} ann{P us i} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Velocitas maxima: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Velocitas maxima: {LTBLUE}{VELOCITY} {BLACK}Max. distantia volatus: {LTBLUE}{COMMA} tegulas +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Velocitas maxima: {LTBLUE}{VELOCITY} {BLACK}Typus aeroplani: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Velocitas maxima: {LTBLUE}{VELOCITY} {BLACK}Typus aeroplani: {LTBLUE}{STRING} {BLACK}Max. distantia volatus: {LTBLUE}{COMMA} tegulas STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Pondus: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potestas: {LTBLUE}{POWER}{BLACK} Velocitas maxima: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Pondus: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potestas: {LTBLUE}{POWER}{BLACK} Velocitas maxima: {LTBLUE}{VELOCITY} {BLACK}V.T. Max.: {LTBLUE}{FORCE} @@ -4416,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... @@ -4424,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... @@ -4675,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 e30e6485a7..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 @@ -562,8 +563,8 @@ STR_MONTH_DEC :Decembris ############ range for months ends # Graph window -STR_GRAPH_KEY_BUTTON :{BLACK}Leģenda -STR_GRAPH_KEY_TOOLTIP :{BLACK}Diagrammās rādīt leģendas +STR_GRAPH_KEY_BUTTON :{BLACK}Apzīmējumu atslēga +STR_GRAPH_KEY_TOOLTIP :{BLACK}Diagrammās rādīt apzīmējumu atslēgas STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING} STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{}{NUM} STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING} @@ -577,7 +578,7 @@ STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Uzņēmu STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Kravas apmaksas cenas STR_GRAPH_CARGO_PAYMENT_RATES_X_LABEL :{TINY_FONT}{BLACK}Dienas pārvadājumos -STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Izmaksas par 10 vienību (vai 10,000 litru) kravas pārvadāšanu par 20mit lauciņiem +STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Izmaksas par 10 vienību (vai 10,000 litru) kravas pārvadāšanu par 20 lauciņiem STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Iespējot visu STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Atspējot visu STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Rādīt visas kravas samaksu salīdzināšanas diagrammā @@ -588,8 +589,8 @@ STR_GRAPH_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLA STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Rādīt detalizētus uzņēmējdarbības vērtējumus # Graph key window -STR_GRAPH_KEY_CAPTION :{WHITE}Leģendas uzņēmumu diagrammās -STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Klikšķināt šeit, lai izslēgtu/ieslēgtu uzņēmuma iekļaušanu diagrammā +STR_GRAPH_KEY_CAPTION :{WHITE}Apzīmējumu atslēgas uzņēmumu diagrammās +STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Klikšķināt šeit, lai ieslēgtu/izslēgtu uzņēmuma attēlošanu diagrammā # Company league window STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Uzņēmumu rangu saraksts @@ -669,10 +670,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Izvēlē STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Ieslēgt/izslēgt mūzikas saraksta jaukšanu STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Rādīt mūzikas celiņu atlases logu -STR_ERROR_NO_SONGS :{WHITE}Izvēlēts komplekts bez mūzikas. Mūzika netiks atskaņota - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Mūzikas programmas izvēle STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Celiņu rādītājs STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Programma - '{STRING}' @@ -703,6 +701,7 @@ STR_SMALLMAP_CAPTION :{WHITE}Karte - STR_SMALLMAP_TYPE_CONTOURS :kontūras STR_SMALLMAP_TYPE_VEHICLES :transportlīdzekļi STR_SMALLMAP_TYPE_INDUSTRIES :ražotnes +STR_SMALLMAP_TYPE_ROUTEMAP :kravas plūsma STR_SMALLMAP_TYPE_ROUTES :maršruti STR_SMALLMAP_TYPE_VEGETATION :augu valsts STR_SMALLMAP_TYPE_OWNERS :īpašnieki @@ -760,6 +759,7 @@ STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Pārslē STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}Nerādīt neviena uzņēmuma īpašumus uz kartes STR_SMALLMAP_TOOLTIP_ENABLE_ALL_COMPANIES :{BLACK}Rādīt visu uzņēmumu īpašumus uz kartes STR_SMALLMAP_TOOLTIP_DISABLE_ALL_CARGOS :{BLACK}Nerādīt kravas uz kartes +STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Rādīt visas kravas uz kartes # Status bar messages STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Rādīt pēdējo ziņojumu vai avīzes rakstu @@ -1274,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} @@ -1305,7 +1306,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Apvidus krāsa STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :zaļa STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :{G=f}tumši zaļa STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :{G=f}violeta -STR_CONFIG_SETTING_REVERSE_SCROLLING :Pretējs ritināšanas virziens: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING :Plūdena skatvietas ritināšana: {STRING} STR_CONFIG_SETTING_MEASURE_TOOLTIP :Rādīt mērījumu rīkjoslu, izmantojot dažādus būvniecības rīkus: {STRING} STR_CONFIG_SETTING_MEASURE_TOOLTIP_HELPTEXT :Rāda lauciņu attālumus un augstuma starpības, ar vilkšanu veicot būvniecības darbības @@ -1335,9 +1335,9 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Komanda+klikš STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+klikšķis STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Izslēgta -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Kreisā klikšķa ritināšana: {STRING} STR_CONFIG_SETTING_AUTOSAVE :Automātiskā saglabāšana: {STRING} +STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Izvēlēties spēles automātiskās saglabāšanas starplaikus STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Lietot {STRING} datuma formātu saglabāto spēļu nosaukumos STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Datuma formāts spēļu saglabājuma failu nosaukumos @@ -1563,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ā. @@ -2215,9 +2216,15 @@ STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Pārslē STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Caurspīdības vietā objektus padarīt neredzamus # Linkgraph legend window -STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Atzīmēt kompānijas kuras uzrādīt +STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Kravas plūsmas apzīmējumi +STR_LINKGRAPH_LEGEND_ALL :{BLACK}Visi +STR_LINKGRAPH_LEGEND_NONE :{BLACK}Neviens +STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Izvēlēties attēlojamos uzņēmumus # Linkgraph legend window and linkgraph legend in smallmap +STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}nelietots +STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLACK}piesātināts +STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}pārslogots # Base for station construction window(s) STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Pārklājuma iezīmēšana @@ -2533,29 +2540,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Lauki STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Apsnigusi zeme STR_LAI_CLEAR_DESCRIPTION_DESERT :Tuksnesis -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} sliedes -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} ceļš ar bloķēšanas signālierīcēm -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} sliedes ar pirmssignālierīcēm -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} sliedes ar izejas signālierīcēm -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} sliedes ar kombinētajām signālierīcēm -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} sliedes ar ceļa signālierīcēm -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} sliedes ar vienvirziena ceļa signālierīcēm -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} sliedes ar bloka un pirmssignālierīcēm -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} sliedes ar bloka un izejas signālierīcēm -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} sliedes ar bloka un kombinētajām signālierīcēm -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} sliedes ar bloka un ceļa signālierīcēm -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} sliedes ar bloka un vienvirziena ceļa signālierīcēm -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} sliedes ar izejas un pirmssignālierīcēm -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} sliedes ar kombinētajām un pirmssignālierīcēm -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} sliedes ar ceļu un pirmssignālierīcēm -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} sliedes ar vienvirziena ceļu un pirmssignālierīcēm -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} sliedes ar izejas un kombinētajām signālierīcēm -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} sliedes ar izejas un ceļa signālierīcēm -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} sliedes ar izejas un vienvirziena ceļa signālierīcēm -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} sliedes ar kombinētajām un ceļa signālierīcēm -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} sliedes ar kombinētajām un vienvirziena ceļa signālierīcēm -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} sliedes ar ceļa un vienvirziena ceļa signālierīcēm -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} vilcienu depo +STR_LAI_RAIL_DESCRIPTION_TRACK :Dzelzceļš sliedes +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Dzelzceļš ceļš ar bloķēšanas signālierīcēm +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Dzelzceļš sliedes ar pirmssignālierīcēm +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Dzelzceļš sliedes ar izejas signālierīcēm +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Dzelzceļš sliedes ar kombinētajām signālierīcēm +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Dzelzceļš sliedes ar ceļa signālierīcēm +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Dzelzceļš sliedes ar vienvirziena ceļa signālierīcēm +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Dzelzceļš sliedes ar bloka un pirmssignālierīcēm +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Dzelzceļš sliedes ar bloka un izejas signālierīcēm +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Dzelzceļš sliedes ar bloka un kombinētajām signālierīcēm +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Dzelzceļš sliedes ar bloka un ceļa signālierīcēm +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Dzelzceļš sliedes ar bloka un vienvirziena ceļa signālierīcēm +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Dzelzceļš sliedes ar izejas un pirmssignālierīcēm +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Dzelzceļš sliedes ar kombinētajām un pirmssignālierīcēm +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Dzelzceļš sliedes ar ceļu un pirmssignālierīcēm +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Dzelzceļš sliedes ar vienvirziena ceļu un pirmssignālierīcēm +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Dzelzceļš sliedes ar izejas un kombinētajām signālierīcēm +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Dzelzceļš sliedes ar izejas un ceļa signālierīcēm +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Dzelzceļš sliedes ar izejas un vienvirziena ceļa signālierīcēm +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Dzelzceļš sliedes ar kombinētajām un ceļa signālierīcēm +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Dzelzceļš sliedes ar kombinētajām un vienvirziena ceļa signālierīcēm +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Dzelzceļš sliedes ar ceļa un vienvirziena ceļa signālierīcēm +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Dzelzceļš vilcienu depo STR_LAI_ROAD_DESCRIPTION_ROAD :Ceļš STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Ceļš ar ielu apgaismojumu @@ -2619,7 +2626,17 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Uzņēmumam pie STR_ABOUT_OPENTTD :{WHITE}Par OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Oriģināla autortiesības {COPYRIGHT} 1995 Kriss Sojers. Visas tiesības paturētas STR_ABOUT_VERSION :{BLACK}OpenTTD versija {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 OpenTTD darba grupa +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 @@ -2740,6 +2757,7 @@ STR_NEWGRF_SETTINGS_MOVEUP :{BLACK}Uz augš STR_NEWGRF_SETTINGS_MOVEUP_TOOLTIP :{BLACK}Pārvietot atlasīto NewGRF failu saraksta augšā STR_NEWGRF_SETTINGS_MOVEDOWN :{BLACK}Uz leju STR_NEWGRF_SETTINGS_MOVEDOWN_TOOLTIP :{BLACK}Pārvietot atlasīto NewGRF failu saraksta apakšā +STR_NEWGRF_SETTINGS_UPGRADE :{BLACK}Atjaunināt STR_NEWGRF_SETTINGS_FILE_TOOLTIP :{BLACK}Instalēto NewGRF failu saraksts. STR_NEWGRF_SETTINGS_SET_PARAMETERS :{BLACK}Iestatīt parametrus @@ -2770,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 @@ -2830,8 +2849,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Mēģinājums i STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} satur bojātu gariņu. Visi bojātie gariņi tiks parādīti ar sarkanu jautājuma zīmi (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Satur vairākus Action 8 ierakstus (gariņš {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Lasīt aiz pseidogariņa beigām (gariņš {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Pašlaik lietotajai pamata grafikas kopai trūkst daļa gariņu.{}Lūdzu atjauniniet pamata grafikas kopu -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Pašlaik lietotajai pamata grafikas kopai trūkst daļa gariņu.{}Lūdzu atjauniniet pamata grafikas kopu.{}Tā kā jūs spēlējat {YELLOW}OpenTTD izstrādes momentuzņēmumu{WHITE}, jums varētu būt nepieciešams arī {YELLOW}pamata grafikas izstrādes momentuzņēmums{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Pieprasītie GRF resursi nav pieejami (gariņš {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} ar {2:STRING} tika atspējots STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Nederīgs/nezināms gariņa izkārtojuma formāts (gariņš {3:NUM}) @@ -2905,8 +2922,6 @@ STR_TOWN_POPULATION :{BLACK}Pasaules STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (lielpilsēta) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Iedzīvotāji: {ORANGE}{COMMA}{BLACK} Mājas: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Pasažieri pagājušajā mēnesī: {ORANGE}{COMMA}{BLACK} maksimāli: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Pasts pagājušajā mēnesī: {ORANGE}{COMMA}{BLACK} maksimāli: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Krava nepieciešama pilsētas attīstībai: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} nepieciešams STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} nepieciešams ziemā @@ -3007,6 +3022,7 @@ STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klikšķināt uz servisa, lai iecentrētu skatu uz rūpnīcu/pilsētu. Ctrl+klikšķis atvērs jaunu skatu lauku uz pilsētu/rūpnīcu # Story book window +STR_STORY_BOOK_CAPTION :{WHITE}{COMPANY} Stāstu grāmata STR_STORY_BOOK_SPECTATOR_CAPTION :{WHITE}Globālā stāstu grāmata STR_STORY_BOOK_TITLE :{YELLOW}{STRING} STR_STORY_BOOK_GENERIC_PAGE_ITEM :{NUM} lapa @@ -3037,8 +3053,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Pieņem STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Rādīt pieņemamo kravu sarakstu STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Pieņem: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Šai stacijai pieder izņēmuma pārvadājumu tiesības šajā pilsētā. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} ir nopirktas izņēmuma pārvadājumu tiesības šajā pilsētā. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Šai stacijai pieder izņēmuma pārvadājumu tiesības šajā pilsētā. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} ir nopirktas izņēmuma pārvadājumu tiesības šajā pilsētā. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Vērtējumi STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Rādīt stacijas vērtējumus @@ -3210,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} @@ -3217,9 +3234,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Nepiecie STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Nepieciešams: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Krava, kuru ir jāapstrādā: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Ražo: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Ražo: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3285,6 +3301,8 @@ 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 STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Jauni elektrificētā dzelzceļa transportlīdzekļi @@ -3449,10 +3467,7 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :magleva lokomot STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Cena: {CURRENCY_LONG} Svars: {WEIGHT_SHORT}{}Ātrums: {VELOCITY} Jauda: {POWER}{}Kārtējās izmaksas: {CURRENCY_LONG} gadā{}Ietilpība: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cena: {CURRENCY_LONG} Svars: {WEIGHT_SHORT}{}Ātrums: {VELOCITY} Jauda: {POWER} Maks. spēks: {6:FORCE}{}Kārtējās izmaksas: {4:CURRENCY_LONG} gadā{}Ietilpība: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Maks. ātrums: {VELOCITY}{}Ietilpība: {CARGO_LONG}, {CARGO_LONG}{}Kārtējās izmaksas: {CURRENCY_LONG} gadā -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Maks. ātrums: {VELOCITY}{}Ietilpība: {CARGO_LONG}{}Kārtējās izmaksas: {CURRENCY_LONG} gadā -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Cena: {CURRENCY_LONG} Maks. ātrums: {VELOCITY} Apgabals: {COMMA} lauciņi{}Ietilpība: {CARGO_LONG}, {CARGO_LONG}{}Kārtējās izmaksas: {CURRENCY_LONG} gadā -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Maks. ātrums: {VELOCITY} Apgabals: {COMMA} lauciņi{}Ietilpība: {CARGO_LONG}{} Kārtējās izmaksas : {CURRENCY_LONG} gadā +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Maks. ātrums: {VELOCITY}{}Ietilpība: {CARGO_LONG}{}Kārtējās izmaksas: {CURRENCY_LONG} gadā # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Nomainīt {STRING} - {STRING} @@ -3477,7 +3492,6 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} kad ve STR_REPLACE_VEHICLES_STOP :{BLACK}Pārtraukt transportlīdzekļu nomaiņu STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Nospiest, lai apturētu kreisajā pusē atlasītās lokomotīves aizstāšanu -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Nomainīt: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Parslēgties starp lokomotīves un vagona aizstāšanas logiem STR_REPLACE_ENGINES :Lokomotīves STR_REPLACE_WAGONS :Vagoni @@ -3573,7 +3587,6 @@ STR_VEHICLE_INFO_AGE :{COMMA} gad{P s STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} gad{P s i u} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Maks. ātrums: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Maks. ātrums: {LTBLUE}{VELOCITY} {BLACK}Apgabals: {LTBLUE}{COMMA} flīzes STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Svars: {LTBLUE}{WEIGHT_SHORT} {BLACK}Jauda: {LTBLUE}{POWER}{BLACK} Maks. ātrums: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Svars: {LTBLUE}{WEIGHT_SHORT} {BLACK}Jauda: {LTBLUE}{POWER}{BLACK} Maks. ātrums: {LTBLUE}{VELOCITY} {BLACK}Maks. spēks: {LTBLUE}{FORCE} @@ -3814,7 +3827,7 @@ STR_TIMETABLE_TOOLTIP :{BLACK}Saraksts STR_TIMETABLE_NO_TRAVEL :Bez braukšanas STR_TIMETABLE_NOT_TIMETABLEABLE :Ceļot (automātiski; pēc nākamā manuālā rīkojuma saraksta) -STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :Braukšana (nav pēc saraksta) +STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :Braukšana (nav sarakstā) STR_TIMETABLE_TRAVEL_NOT_TIMETABLED_SPEED :Braukt ar ne vairāk kā {2:VELOCITY} (nav sarakstā) STR_TIMETABLE_TRAVEL_FOR :Braukt līdz {STRING} STR_TIMETABLE_TRAVEL_FOR_SPEED :Braukt uz {STRING} ar ne vairāk kā {VELOCITY} @@ -4054,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... @@ -4120,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... @@ -4241,7 +4254,7 @@ STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Vispirms STR_ERROR_CAN_T_START_AND_END_ON :{WHITE}Nevar sākties un beigties tajā paša vietā STR_ERROR_BRIDGEHEADS_NOT_SAME_HEIGHT :{WHITE}Tilta gali nav vienā līmenī STR_ERROR_BRIDGE_TOO_LOW_FOR_TERRAIN :{WHITE}Tilts ir pārāk zems šim zemes apvidum -STR_ERROR_BRIDGE_TOO_HIGH_FOR_TERRAIN :{WHITE}Tilts ir pārāk augsts priekš šī vilciena. +STR_ERROR_BRIDGE_TOO_HIGH_FOR_TERRAIN :{WHITE}Tilts ir pārāk augsts šim zemes apvidum. STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Sākumam un beigām jābūt uz vienas līnijas STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... abiem tilta galiem jābūt uz zemes STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... tilts ir pārāk garš @@ -4268,7 +4281,8 @@ 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_REMOVE_ALL_VEHICLES :{WHITE}No šīs grupas nevar noņemt visus transportlīdzekļus... +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... @@ -4284,8 +4298,8 @@ STR_ERROR_CAN_T_REFIT_SHIP :{WHITE}Nevar pi STR_ERROR_CAN_T_REFIT_AIRCRAFT :{WHITE}Nevar pielāgot lidaparātu... STR_ERROR_CAN_T_RENAME_TRAIN :{WHITE}Nevar nosaukt vilcienu... -STR_ERROR_CAN_T_RENAME_ROAD_VEHICLE :{WHITE}Autotransporta līdzekli nevar nosaukt... -STR_ERROR_CAN_T_RENAME_SHIP :{WHITE}Nevar pārdēvēt kuģi... +STR_ERROR_CAN_T_RENAME_ROAD_VEHICLE :{WHITE}Nevar nosaukt autotransporta līdzekli... +STR_ERROR_CAN_T_RENAME_SHIP :{WHITE}Nevar nosaukt kuģi... STR_ERROR_CAN_T_RENAME_AIRCRAFT :{WHITE}Nevar nosaukt lidaparātu... STR_ERROR_CAN_T_STOP_START_TRAIN :{WHITE}Nevar apturēt/palaist vilcienu... @@ -4371,6 +4385,10 @@ STR_ERROR_CAN_T_DELETE_SIGN :{WHITE}Nevar dz STR_DESKTOP_SHORTCUT_COMMENT :Uz 'Transport Tycoon Deluxe' balstīta simulācijas spēle # Translatable descriptions in media/baseset/*.ob* files +STR_BASEGRAPHICS_DOS_DESCRIPTION :Oriģinālā Transport Tycoon Deluxe DOS izdevuma grafika. +STR_BASEGRAPHICS_DOS_DE_DESCRIPTION :Oriģinālā Transport Tycoon Deluxe DOS (vācu) izdevuma grafika. +STR_BASEGRAPHICS_WIN_DESCRIPTION :Oriģinālā Transport Tycoon Deluxe Windows izdevuma grafika. +STR_BASESOUNDS_NONE_DESCRIPTION :Skaņu kopa bez skaņas. STR_BASEMUSIC_WIN_DESCRIPTION :Oriģinālā Transport Tycoon Deluxe Windows izdevuma mūzika. STR_BASEMUSIC_NONE_DESCRIPTION :Mūzikas kopa bez mūzikas diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index ebc076ba13..163c90c70d 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -864,10 +864,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Parinkti STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Programos „Atsitiktiniai takeliai“ įj./išj. STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Rodyti muzikos takelių pasirinkimo langą -STR_ERROR_NO_SONGS :{WHITE}Pasirinktas muzikos rinkinys be dainų. Dainos nebus grojamos - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Muzikos programos pasirinkimas STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} „{STRING}“ STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Takelio numeris STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Programa - „{STRING}“ @@ -1542,8 +1539,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Reljefo spalva STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Žalia STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Tamsiai žalia STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violetinė -STR_CONFIG_SETTING_REVERSE_SCROLLING :Priešinga slinkties kryptis: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Vaizdo slinkties elgsena, laikant nuspaudus dešinįjį pelės klavišą: pasirinkus „ne“, judės stebėtojas. Pasirinkus „taip“, judės žemėlapis STR_CONFIG_SETTING_SMOOTH_SCROLLING :Tolydi vaizdo slinktis: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Įjungus šią nuostatą ir pakeitus pagrindinio lango rodomą vietą (pvz., spragtelėjus žemėlapyje), vaizdas slinksis tolydžiai. Priešingu atveju vaizdas pasikeis akimirksniu, šuoliškai. STR_CONFIG_SETTING_MEASURE_TOOLTIP :Rodyti matavimo pastabą, kai naudojami įvairūs statybų įrankiai: {STRING} @@ -1575,8 +1570,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+Click STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Click STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Išjungta -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Left-click scrolling: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Slinkti žemėlapį velkant jį nuspaudus kairįjį pelės klavišą. Naudinga, jei žaidžiama kompiuteriuose su lietimui jautriais ekranais STR_CONFIG_SETTING_AUTOSAVE :Automatinis saugojimas: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Laiko tarpsnis tarp automatinių žaidimo išsaugojimų @@ -2820,29 +2813,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Laukai STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Užpustyta žemė STR_LAI_CLEAR_DESCRIPTION_DESERT :Dykuma -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} bėgiai -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} bėgiai su paprastais šviesoforais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} ebgiai su prie signalais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} bėgiai su išvažiavimo signalais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} bėgiai su kombinuotais signalais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} bėgiai su trasos signalais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} bėgiai su vienpusiais trasos signalais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} begiai su paprastais ir prie signalais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} bėgiai su paprastais ir išvažiavimo signalais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} bėgiai su paprastais ir kombinuotais signalais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} bėgiai su paprastais ir trasos signalais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} bėgiai su paprastais ir vienpusiais trasos signalais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} bėgiai su pre ir išvažiavimo signalais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} bėgiai su prie ir kombinuotais signalais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} bėgiai su prie ir trasos signalais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} bėgiai su prie ir vienpusiais trasos signalais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} bėgiai su išvažiavimo ir kombinuotais signalais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} bėgiai su išvažiavimo ir trasos signalais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} bėgiai su išvažiavimo ir vienpusiais signalais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} bėgiai su kombinuotais ir trasos signalais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} bėgiai su kombinuotais ir vienpusiais signalais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} bėgiai su trasos ir vienpusiais signalais -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} traukinių depas +STR_LAI_RAIL_DESCRIPTION_TRACK :Geležinkelis bėgiai +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Geležinkelis bėgiai su paprastais šviesoforais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Geležinkelis ebgiai su prie signalais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Geležinkelis bėgiai su išvažiavimo signalais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Geležinkelis bėgiai su kombinuotais signalais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Geležinkelis bėgiai su trasos signalais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Geležinkelis bėgiai su vienpusiais trasos signalais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Geležinkelis begiai su paprastais ir prie signalais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Geležinkelis bėgiai su paprastais ir išvažiavimo signalais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Geležinkelis bėgiai su paprastais ir kombinuotais signalais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Geležinkelis bėgiai su paprastais ir trasos signalais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Geležinkelis bėgiai su paprastais ir vienpusiais trasos signalais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Geležinkelis bėgiai su pre ir išvažiavimo signalais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Geležinkelis bėgiai su prie ir kombinuotais signalais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Geležinkelis bėgiai su prie ir trasos signalais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Geležinkelis bėgiai su prie ir vienpusiais trasos signalais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Geležinkelis bėgiai su išvažiavimo ir kombinuotais signalais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Geležinkelis bėgiai su išvažiavimo ir trasos signalais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Geležinkelis bėgiai su išvažiavimo ir vienpusiais signalais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Geležinkelis bėgiai su kombinuotais ir trasos signalais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Geležinkelis bėgiai su kombinuotais ir vienpusiais signalais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Geležinkelis bėgiai su trasos ir vienpusiais signalais +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Geležinkelis traukinių depas STR_LAI_ROAD_DESCRIPTION_ROAD :Kelias STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Kelias su žibintais @@ -2906,7 +2899,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Kompanijos žem STR_ABOUT_OPENTTD :{WHITE}Apie OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Pradinės versijos teisės priklauso {COPYRIGHT} 1995 Chris Sawyer, Visos teisės saugomos STR_ABOUT_VERSION :{BLACK}OpenTTD versija {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2015 OpenTTD komanda +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ą @@ -3125,8 +3125,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Bandymas panaud STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} turi sugadintą spruklį. Visi sugadinti sprukliai bus rodomi kaip raudoni klaustukai (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Susideda iš keleto veiksmo 8 įrašų (spruklys {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Skaitymas už pseudospruklio pabaigos (spruklys {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Šiuo metu naudojamam grafikos rinkiniui trūksta keleto spruklių.{}Atnaujinkite pagrindinį grafikos rinkinį -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Šiuo metu naudojamam pagrindinės grafikos rinkiniui trūsta keleto spruklių.{}Atnaujinkite pagrindinės grafikos rinkinį.{} Kadangi žaidžiate {YELLOW} negalutinę, vis dar kuriamą OpenTTD versiją, {WHITE}, jums, ko gero, reikėtų įdiegti atitinkamą{YELLOW}naujausią, negalutinį pagrindinės grafikos rinkinį.{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Pageidautas GRF resursas yra neprieinamas (spruklys {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} buvo išjungtas {2:STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Neteisingas/nežinomas spruklio išdėstymo formatas (spruklys {3:NUM}) @@ -3201,8 +3199,6 @@ STR_TOWN_POPULATION :{BLACK}Pasaulio STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Miestas) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Populiacija: {ORANGE}{COMMA}{BLACK} Namų skaičius: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Praėjusio mėnesio keleivių sk.: {ORANGE}{COMMA}{BLACK} Daugiausia: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Praėjusio mėnesio pašto siuntų sk.: {ORANGE}{COMMA}{BLACK} Daugiausia: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Kad miestas augtų reikalingi kroviniai: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} reikia STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} reikalingas žiemą @@ -3333,8 +3329,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Priima STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Rodyti priimamų krovinių sąrašą STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Priima: {WHITE}{CARGO_LIST.ka} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Šiai stotelei priklauso išskirtinės šio miesto pervežimo teisės -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} įsigijo išskirtines pervežimo teises šiame mieste. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Šiai stotelei priklauso išskirtinės šio miesto pervežimo teisės +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} įsigijo išskirtines pervežimo teises šiame mieste. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Reitingai STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Rodyti stoties reitingus @@ -3513,9 +3509,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Reikalau STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Reikalauja: {YELLOW}{STRING.ko}{STRING}, {STRING.ko}{STRING}, {STRING.ko}{STRING} ############ range for requires ends + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Krovinys, kuris bus perdirbtas: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Gamina: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Gamina: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3582,6 +3577,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Iškelti visas STR_GROUP_RENAME_CAPTION :{BLACK}Pervadinti grupę + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nauji lokomotyvai STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nauji elektriniai lokomotyvai @@ -3782,10 +3778,7 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE.kur :„Maglev“ lo STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Kaina: {CURRENCY_LONG} Svoris: {WEIGHT_SHORT}{}Greitis: {VELOCITY} Galia: {POWER}{}Eksploatavimo išlaidos: {CURRENCY_LONG} per metus{}Talpa: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Kaina: {CURRENCY_LONG} Svoris: {WEIGHT_SHORT}{}Greitis: {VELOCITY} Galia: {POWER} Maks. T.E.: {6:FORCE}{}Einamosios išlaidos: {4:CURRENCY_LONG}/yr{}Talpa: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Kaina: {CURRENCY_LONG} Didž. greitis: {VELOCITY}{}Talpa: {CARGO_LONG}, {CARGO_LONG}{}Eksploatavimo išlaidos: {CURRENCY_LONG} per metus -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Kaina: {CURRENCY_LONG} Didž. Greitis: {VELOCITY}{}Talpa: {CARGO_LONG}{}Eksploatacijos išlaidos: {CURRENCY_LONG}/metams -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Kaina: {CURRENCY_LONG} Didž. greitis: {VELOCITY} Nuotolis: {COMMA} langeliai{}Talpa: {CARGO_LONG}, {CARGO_LONG}{}Eksploatavimo išlaidos: {CURRENCY_LONG} per metus -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Kaina: {CURRENCY_LONG} Didž. greitis: {VELOCITY} Nuotolis: {COMMA} langeliai{}Talpa: {CARGO_LONG}{}Eksploatavimo išlaidos: {CURRENCY_LONG} per metus +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Kaina: {CURRENCY_LONG} Didž. Greitis: {VELOCITY}{}Talpa: {CARGO_LONG}{}Eksploatacijos išlaidos: {CURRENCY_LONG}/metams # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Keisti tr. priemones {STRING} - {STRING} @@ -3797,7 +3790,7 @@ STR_REPLACE_VEHICLE_SHIP :Laivas STR_REPLACE_VEHICLE_AIRCRAFT :Lėktuvas STR_REPLACE_VEHICLE_VEHICLES_IN_USE :{YELLOW}Naudojamos transporto priemonės -STR_REPLACE_VEHICLE_VEHICLES_IN_USE_TOOLTIP :BLACK}Stulpelis su informacija apie transporto priemones, kurias šiuo metu naudojate +STR_REPLACE_VEHICLE_VEHICLES_IN_USE_TOOLTIP :{BLACK}Stulpelis su informacija apie transporto priemones, kurias šiuo metu naudojate STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES :{YELLOW}Galimos transporto priemonės STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES_TOOLTIP :{BLACK}Stulpelis su informacija apie transporto priemones, kuriomis galite pakeisti jau turimas @@ -3814,7 +3807,6 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} jei pa STR_REPLACE_VEHICLES_STOP :{BLACK}Stabdyti tr. priemonių keitimą STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Spustelk, jei nori sustabdyti šiuo metu vykdomą keitimo procedūrą -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Keičiama: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Pereidinėti tarp garvežių ir vagonų pakeitimo langų STR_REPLACE_ENGINES :Varikliai STR_REPLACE_WAGONS :Vagonai @@ -3910,7 +3902,6 @@ STR_VEHICLE_INFO_AGE :{COMMA} met{P a STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} met{P ai ai ų} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Didž. greitis: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Didž. greitis: {LTBLUE}{VELOCITY} {BLACK}Nuotolis: {LTBLUE}{COMMA} langeliai STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Svoris: {LTBLUE}{WEIGHT_SHORT} {BLACK}Galia: {LTBLUE}{POWER}{BLACK} Didž. greitis: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Svoris: {LTBLUE}{WEIGHT_SHORT} {BLACK}Galia: {LTBLUE}{POWER}{BLACK} Didž. greitis: {LTBLUE}{VELOCITY} {BLACK}Didž. traukos jėga: {LTBLUE}{FORCE} @@ -4487,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 42e59afba3..60ffaf64a3 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -669,10 +669,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Wielt de STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Schalt den "shuffle" un/aus STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Weis d'Fënster fir Musik ze wielen -STR_ERROR_NO_SONGS :{WHITE}E Music Set ouni Lidder gouf gewielt. Et wäerten keng Lidder gespillt ginn - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Musiksprogramm Auswiel STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Lidder Index STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Programm - '{STRING}' @@ -1119,7 +1116,7 @@ STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME :Spillastellunge STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Firmenastellungen (am Save gespäichert; betrëfft just nei Spiller) STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Firmenastellungen (am Save gespäichert; betrëfft just déi aktuell Firma) STR_CONFIG_SETTING_CATEGORY_HIDES :{BLACK}Weis all Sich-Resultater no der Astellung{}{SILVER}Kategorie {BLACK}bis {WHITE}{STRING} -STR_CONFIG_SETTING_TYPE_HIDES :Weis all Sich-Resultater no der Astellung{}{SILVER}Typ {BLACK}bis {WHITE}All Astellungstypen +STR_CONFIG_SETTING_TYPE_HIDES :{BLACK}Weis all Sich-Resultater no der Astellung{}{SILVER}Typ {BLACK}bis {WHITE}All Astellungstypen STR_CONFIG_SETTING_CATEGORY_AND_TYPE_HIDES :{BLACK}Weis all Sich-Resultater no der Astellung{}{SILVER}Kategorie {BLACK}bis {WHITE}{STRING} {BLACK}an {SILVER}Typ {BLACK}bis {WHITE}All Astellungstypen STR_CONFIG_SETTINGS_NONE :{WHITE}- Keng - @@ -1337,8 +1334,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Faarf vum Terra STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Gréng STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Donkelgréng STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Mof -STR_CONFIG_SETTING_REVERSE_SCROLLING :Deen anere Wee scrollen: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Verhalen beim Scrollen vun der Kaart mat der rietser Maustast. Wann ausgeschalt, beweegt d'Maus d'Kamera. Wann ugeschalt, beweegt d'Maus d'Kaart STR_CONFIG_SETTING_SMOOTH_SCROLLING :Feine Scrolling: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Kontrolléiert wéi d'Haptusiicht op eng bestëmmten Positioun scrollt, wann een op déi kléng Kaart klickt oder en Befehl fir ob en spezifescht Objet ze scrollen gëtt. Wann ugeschalt, gëtt bis dohin gescrollt, wann ausgeschalt, spréngt d'Vue op den Zielobjet STR_CONFIG_SETTING_MEASURE_TOOLTIP :Weis en Mooss-Tooltip wann verschidde Bau-Tools benotzt ginn: {STRING} @@ -1370,8 +1365,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :COMM+Klick STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :CTRL+Klick STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Aus -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Lénksklickscroll: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Schalt d'Scrollen vun der Kaart un, wann se mat der lénker Maustast gezunn gëtt +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Fënster mat rietsem Mausklick zouman: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Mécht eng Fenster mat engem Rietsklick zou, wann een an d'Fënster klickt. Schalt Tooltips aus déi per Rietsklick gemet ginn! STR_CONFIG_SETTING_AUTOSAVE :Autospäicheren: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Setz den Interval tëschend automateschen Späicherstänn @@ -1761,6 +1756,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Check op STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Weis KI an Spill-Script-Astellungen STR_INTRO_TOOLTIP_QUIT :{BLACK}Aus 'OpenTTD' eraus goen +STR_INTRO_BASESET :{BLACK}Dem grad ausgewielte Basis Grafikset fehlen {NUM} Srite{P "" s}. W.e.g. no Updates fir dëse Set sichen. STR_INTRO_TRANSLATION :{BLACK}Dës Iwwersetzung huet {NUM} String{P "" s}. Hëllef OpenTTD besser ze man andems du dech als Iwwersetzer mells! Lies readme.txt fir d'Detailer. # Quit window @@ -2589,6 +2585,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Fluchhaf STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Akzeptéiert Wuer: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Schinnentyp: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Schinne-Geschw.-Limit: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Stroosse-Geschw.-Limit: {LTBLUE}{VELOCITY} @@ -2601,29 +2598,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Felder STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Schnéibedeckt Land STR_LAI_CLEAR_DESCRIPTION_DESERT :Wüst -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} Schinn -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} Schinn mat Blocksignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} Schinn mat Presignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} Schinn mat Ausgangs-Signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} Schinn mat Kombo-Signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} Schinn mat Weesignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} Schinn mat Einbahnsignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} Schinn mat Block- an Presignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} Schinn mat Block- an Ausgangssignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} Schinn mat Block- a Kombosignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} Schinn mat Block- a Weesignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} Schinn mat Block- a Einbahnsignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} Schinn mat Pre- an Ausgangssignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} Schinn mat Pre- a Kombosignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} Schinn mat Pre- a Weesignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} Schinn mat Pre- an Einbahnweesignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} Schinn mat Ausgangs- a Kombosignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} Schinn mat Ausgangs- a Weesignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} Schinn mat Ausgang- an Einbahnweesignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} Schinn mat Kombo- an Weesignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} Schinn mat Kombo- an Einbahnweesignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} Schinn mat Wee- and Einbahnweesignaler -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} Zuchschapp +STR_LAI_RAIL_DESCRIPTION_TRACK :Schinn +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Schinn mat Blocksignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Schinn mat Presignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Schinn mat Ausgangs-Signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Schinn mat Kombo-Signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Schinn mat Weesignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Schinn mat Einbahnsignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Schinn mat Block- an Presignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Schinn mat Block- an Ausgangssignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Schinn mat Block- a Kombosignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Schinn mat Block- a Weesignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Schinn mat Block- a Einbahnsignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Schinn mat Pre- an Ausgangssignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Schinn mat Pre- a Kombosignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Schinn mat Pre- a Weesignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Schinn mat Pre- an Einbahnweesignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Schinn mat Ausgangs- a Kombosignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Schinn mat Ausgangs- a Weesignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Schinn mat Ausgang- an Einbahnweesignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Schinn mat Kombo- an Weesignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Schinn mat Kombo- an Einbahnweesignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Schinn mat Wee- and Einbahnweesignaler +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Zuchschapp STR_LAI_ROAD_DESCRIPTION_ROAD :Strooss STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Strooss mat Luuchten @@ -2687,7 +2684,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Land am Firmenb STR_ABOUT_OPENTTD :{WHITE}Iwwert OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original Copyright {COPYRIGHT} 1995 Chris Sawyer, All Rechter virbehalen STR_ABOUT_VERSION :{BLACK}OpenTTD Versioun {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 D'OpenTTD team +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 @@ -2874,7 +2878,7 @@ STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Géi op STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Viregt Sprite STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Géi weider op déi nächst normal Sprite, iwwersprang all pseudo/recolour/font Sprite an sprang zréck op den Ufank no der leschter. STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Representatioun vun der grad gewielter Sprite. Den Alignement gëtt ignoréiert wann d'Sprite gezun gëtt -STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Beweg Sprite, X an Y offsets enneren sech +STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Beweg Sprite, X an Y offsets enneren sech. Ctrl+Klick fir de Sprite8 Eenheete matenen ze bewegen. STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Relativ zerécksetzen STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Momentan relativ Offsets zerécksetzen STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X-Offset: {NUM}, Y-Offset: {NUM} (Absolut) @@ -2906,8 +2910,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Versicht invali STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} huet eng korrupt Sprite. All korrupt Sprites ginn als Fragezeichen (?) duergestallt STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Huet eng Rei Action 8 Einträg (Sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Lanscht d'Enn vum Pseudo-Sprite gelies (Sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}D'momentan benotzten Grafikset huet e puer Sprites ze mann.{}W.e.g d'Basisgrafikset updaten -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Am grad benotzten Basis-Grafikset fehlen e puer Sprites.{}W.e.g Basis-Grafikset updaten.{}Wellsde en {YELLOW}Development Snapshot vun OpenTTD spills{WHITE}, brauchsde och en {YELLOW}Development Snapshot vum Basis-Grafikset{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Ugefroten GRF Ressource net verfügbar (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} gouf ausgeschalt vun {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Invalid/onbekannten Sprite Layout Format (Sprite {3:NUM}) @@ -2982,8 +2984,6 @@ STR_TOWN_POPULATION :{BLACK}Weltbev STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Stad) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Awunner: {ORANGE}{COMMA}{BLACK} Haiser: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Passagéier leschte Mount: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Post leschte Mount: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Gidder gebraucht fir Stadwuesstem: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} gebraucht STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} gebraucht am Wanter @@ -3114,8 +3114,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Akzepté STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Weis d'Lëscht vun den akzptéierten Wueren STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Akzeptéiert: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Des Statioun huet exklusiv Transportrechter an deser Stad -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} huet exklusiv Transportrechter an deser Stad kaf. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Des Statioun huet exklusiv Transportrechter an deser Stad +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} huet exklusiv Transportrechter an deser Stad kaf. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Bewäertungen STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Weis d'Statiounsbewäertungen @@ -3294,9 +3294,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Brauch: STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Brauch: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Brauch: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} um waarden{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Luedunge déi nach verschafft musse ginn: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produzéiert: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Produzéiert: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3363,6 +3365,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :All Gefierer ew STR_GROUP_RENAME_CAPTION :{BLACK}Eng Grupp ëmbenennen +STR_GROUP_PROFIT_THIS_YEAR :Profit dëst Joer: +STR_GROUP_PROFIT_LAST_YEAR :Profit lescht Joer: +STR_GROUP_OCCUPANCY :Aktuell Benotzung: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nei Zich STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nei Elektrozich @@ -3394,6 +3401,7 @@ STR_PURCHASE_INFO_ALL_TYPES :All Wuerentyp STR_PURCHASE_INFO_ALL_BUT :Alles ausser {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Max. Zéikraaft: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Distanz: {GOLD}{COMMA} Felder +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Fliger Typ: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Zuchlëscht - klick op en Zuch fir Informatiounen. Ctrl+Klick fir tëscht dem Verstoppen hin an hier ze sprangen STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Stroossegefierlëscht - klick op en Gefier fir Informatiounen. Ctrl+Klick fir tëscht dem Verstoppen hin an hier ze sprangen @@ -3525,12 +3533,13 @@ STR_ENGINE_PREVIEW_SHIP :Schëff STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :Monorail Lokomotiv STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :Magnéitbunnlokomotiv -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Käschten: {CURRENCY_LONG} Gewiicht: {WEIGHT_SHORT}{}Geschwindegkeet: {VELOCITY} Kraaft: {POWER}{}Betribskäschten {CURRENCY_LONG}/Joer{}Kapazitéit: {CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Käschten: {CURRENCY_LONG} Gewiicht: {WEIGHT_SHORT}{}Geschwindegkeet: {VELOCITY} Kraaft: {POWER}{}Betribskäschten {CURRENCY_LONG}/Jr{}Kapazitéit: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Käschten: {CURRENCY_LONG} Gewicht: {WEIGHT_SHORT}{}Geschw.: {VELOCITY} Kraaft: {POWER} Max. T.E.: {6:FORCE}{}Betribskäschten: {4:CURRENCY_LONG}/Jr{}Kapazitéit: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Käschten: {CURRENCY_LONG} Max. Geschwindegkeet: {VELOCITY}{}Kapazitéit: {CARGO_LONG}, {CARGO_LONG}{}Betribskäschten {CURRENCY_LONG}/Joer -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Käschten: {CURRENCY_LONG} Max. Geschwindegkeet: {VELOCITY}{}Kapazitéit: {CARGO_LONG}{}Betribskäschten: {CURRENCY_LONG}/Joer -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Käschten: {CURRENCY_LONG} Max. Geschw.: {VELOCITY} Distanz: {COMMA} Felder{}Kapazitéit: {CARGO_LONG}, {CARGO_LONG}{}Betribskäschten: {CURRENCY_LONG}/Jr -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Käschten: {CURRENCY_LONG} Max. Geschw.: {VELOCITY} Distanz: {COMMA} Felder{}Kapazitéit: {CARGO_LONG}{}Betribskäschten: {CURRENCY_LONG}/Jr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Käschten: {CURRENCY_LONG} Max. Geschwindegkeet: {VELOCITY}{}Kapazitéit: {CARGO_LONG}{}Betribskäschten: {CURRENCY_LONG}/Jr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Käschten: {CURRENCY_LONG} Max. Geschw.: {VELOCITY}{}Fliger Typ: {STRING}{}Kapazitéit: {CARGO_LONG}, {CARGO_LONG}{}Betribskäschten: {CURRENCY_LONG}/Jr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Käschten: {CURRENCY_LONG} Max. Geschw.: {VELOCITY}{}Fliger Typ: {STRING}{}Kapazitéit: {CARGO_LONG}{}Betribskäschten: {CURRENCY_LONG}/Jr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Käschten: {CURRENCY_LONG} Max. Geschw.: {VELOCITY}{}Fliger Typ: {STRING} Reeschwäit: {COMMA} Felder{}Kapazitéit: {CARGO_LONG}, {CARGO_LONG}{}Betribskäschten: {CURRENCY_LONG}/Jr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Käschten: {CURRENCY_LONG} Max. Geschw.: {VELOCITY}{}Fliger Typ: {STRING} Reechwäit: {COMMA} Felder{}Kapazitéit: {CARGO_LONG}{}Betribskäschten: {CURRENCY_LONG}/Jr # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Ersetz {STRING} - {STRING} @@ -3557,10 +3566,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} wann a STR_REPLACE_VEHICLES_STOP :{BLACK}Stop Gefieraustosch STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Drécken fir den Austosch ze stoppen -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Tauschen aus: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Wiessel tëscht Maschin- an Waggonaustosch-Fënster STR_REPLACE_ENGINES :Lokomotiven STR_REPLACE_WAGONS :Waggonen +STR_REPLACE_ALL_RAILTYPE :All Zich STR_REPLACE_HELP_RAILTYPE :{BLACK}Wielt de Schinnentyp fir déi Lokomotiven ausgetosch ginn STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Weist un wellech Lokomotiv vun der lénks ugewielter Lokomotiv ausgetosch soll ginn, wann et zoutrëfft @@ -3653,7 +3662,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} Joer ({ STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} Joer ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Max. Geschwindegkeet: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Max. Geschw.: {LTBLUE}{VELOCITY} {BLACK}Distanz: {LTBLUE}{COMMA} Felder +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Max. Geschw.: {LTBLUE}{VELOCITY} {BLACK}Fliger Typ: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Max. Geschw.: {LTBLUE}{VELOCITY} {BLACK}Fliger Typ: {LTBLUE}{STRING} {BLACK}Reechwäit: {LTBLUE}{COMMA} Felder STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Gewiicht: {LTBLUE}{WEIGHT_SHORT} {BLACK}Kraaft: {LTBLUE}{POWER}{BLACK} Max. Geschwindegkeet: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Gewiicht: {LTBLUE}{WEIGHT_SHORT} {BLACK}Kraaft: {LTBLUE}{POWER}{BLACK} Max. Geschwindegkeet: {LTBLUE}{VELOCITY} {BLACK}Max. T.E.: {LTBLUE}{FORCE} @@ -4212,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 4dc0806dcc..e5ba9a2dc0 100644 --- a/src/lang/malay.txt +++ b/src/lang/malay.txt @@ -202,6 +202,7 @@ STR_UNITS_POWER_SI :{COMMA}kW STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg +STR_UNITS_WEIGHT_LONG_IMPERIAL :{COMMA}{NBSP}tan{P "" s} STR_UNITS_WEIGHT_LONG_METRIC :{COMMA} tan STR_UNITS_WEIGHT_LONG_SI :{COMMA} kg @@ -214,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 @@ -240,7 +242,9 @@ 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 # Query window STR_BUTTON_DEFAULT :{BLACK}Asal @@ -279,6 +283,7 @@ STR_SORT_BY_LENGTH :Panjang STR_SORT_BY_LIFE_TIME :Baki jangka hayat STR_SORT_BY_TIMETABLE_DELAY :Kelewatan jadual waktu STR_SORT_BY_FACILITY :Jenis stesen +STR_SORT_BY_WAITING_TOTAL :Jumlah kargo menunggu STR_SORT_BY_RATING_MAX :Penarafan kargo tertinggi STR_SORT_BY_RATING_MIN :Penarafan kargo terendah STR_SORT_BY_ENGINE_ID :ID Enjin (susunan klasik) @@ -450,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 @@ -607,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 @@ -646,10 +651,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Pilih ra STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Mainkan muzik secara rawak atau tidak STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Tunjukkan tetingkap pilihan lagu -STR_ERROR_NO_SONGS :{WHITE}Set muzik yang tidak mengandungi lagu telah dipilih. Tiada lagu yang akan dimainkan - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Pilihan Rancangan Muzik STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Indeks Lagu STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Program - '{STRING}' @@ -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 @@ -893,6 +896,7 @@ STR_GAME_OPTIONS_CURRENCY_LTL :Lithuanian Lita STR_GAME_OPTIONS_CURRENCY_KRW :South Korean Won (KRW) STR_GAME_OPTIONS_CURRENCY_ZAR :South African Rand (ZAR) STR_GAME_OPTIONS_CURRENCY_CUSTOM :Sesuaikan... +STR_GAME_OPTIONS_CURRENCY_GEL :Georgian Lari (GEL) ############ end of currency region STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Kenderaan Jalanraya @@ -1070,6 +1074,7 @@ STR_CONFIG_SETTING_TYPE_GAME_INGAME :Tetapan permain STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Tetapan syarikat (disimpan di simpanan; berkesan hanya permainan baru) STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Tetapan syarikat (disimpan di penyimpanan; hanya berkesan kepada syarikat semasa) +STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK}Kategori: STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}Hadkan senarai di bawah menggunakan penapis yang telah ditetapkan STR_CONFIG_SETTING_RESTRICT_BASIC :Asas (menunjukkan tetapan yang penting sahaja) STR_CONFIG_SETTING_RESTRICT_ADVANCED :Terperinci (tunjukkan kebanyakan tetapan) @@ -1077,6 +1082,7 @@ STR_CONFIG_SETTING_RESTRICT_ALL :Expert (memapar STR_CONFIG_SETTING_RESTRICT_CHANGED_AGAINST_DEFAULT :Tetapan dengan nilai berbeza dari yang lalai STR_CONFIG_SETTING_RESTRICT_CHANGED_AGAINST_NEW :Tetapan dengan nilai yang berbeza daripada tetapan baru permainananda +STR_CONFIG_SETTINGS_NONE :{WHITE}- Tiada - STR_CONFIG_SETTING_OFF :Matikan STR_CONFIG_SETTING_ON :Hidupkan @@ -1162,6 +1168,7 @@ STR_CONFIG_SETTING_INDUSTRY_PLATFORM_HELPTEXT :Jumlah ruang ra STR_CONFIG_SETTING_MULTIPINDTOWN :Benarkan pelbagai industri sejenis di setiap bandar: {STRING} STR_CONFIG_SETTING_MULTIPINDTOWN_HELPTEXT :Biasanya sebuah bandar tidak mahu lebih daripada beberapa industri. Dengan tetapan ini membolehakn beberapa industri di bandar yang sama STR_CONFIG_SETTING_SIGNALSIDE :Pamer isyarat: {STRING} +STR_CONFIG_SETTING_SIGNALSIDE_RIGHT :Di sebelah kanan STR_CONFIG_SETTING_SHOWFINANCES :Tunjukkan tetingkap kewangan setiap penghujung tahun: {STRING} STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Arahan baru ialah 'tanpa henti' secara lazim: {STRING} STR_CONFIG_SETTING_STOP_LOCATION :Arahan keretapi baru berhenti secara lazim di pletfom {STRING} @@ -1211,7 +1218,9 @@ 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} STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Ketebalan garisan di dalam graf: {STRING} @@ -1245,7 +1254,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR :Warna tanah yan 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 :Ungu -STR_CONFIG_SETTING_REVERSE_SCROLLING :Arah skrol terbalik: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING :Skrol tetingkap pemandangan yang licin: {STRING} STR_CONFIG_SETTING_MEASURE_TOOLTIP :Tunjukkan bantuan ukuran ketika menggunakan alat binaan: {STRING} STR_CONFIG_SETTING_LIVERIES :Tunjukkan seragam syarikat: {STRING} @@ -1258,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 @@ -1270,7 +1279,6 @@ 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 :Matikan -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Skrol klik-kiri: {STRING} STR_CONFIG_SETTING_AUTOSAVE :Simpanan automatik:{STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Pilih jarak waktu antara menyimpankan permainan automatik @@ -1290,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 @@ -1297,12 +1306,15 @@ 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} 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} @@ -1318,9 +1330,15 @@ STR_CONFIG_SETTING_AI_PROFILE_MEDIUM :Sederhana STR_CONFIG_SETTING_AI_PROFILE_HARD :Sukar STR_CONFIG_SETTING_AI_IN_MULTIPLAYER :Benarkan Kepintaran Tiruan dalam permainan pemain berbilang: {STRING} +STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :Benarkan AI komputer menyertai permainan berbilang pemain STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :#opcodes sebelum skrip adalah digantung: {STRING} 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} @@ -1329,15 +1347,19 @@ STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN :Ketibaan kender STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER :Ketibaan kenderaan di stesen pesaing: {STRING} STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :Kemalangan / bencana: {STRING} STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Maklumat syarikat: {STRING} +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} @@ -1350,6 +1372,7 @@ STR_CONFIG_SETTING_STARTING_YEAR :Tahun permulaan STR_CONFIG_SETTING_SMOOTH_ECONOMY :Gunakan ekonomi baik (perubahan yang lebih kecil): {STRING} STR_CONFIG_SETTING_ALLOW_SHARES :Benarkan membeli saham syarikat lain: {STRING} STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Bina semafor secara automatik sebelum: {STRING} +STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Tetapkan tahun apabila isyarat berjenis elektrik digunakan untuk landasan. Sebelum tahun ini, isyarat bukan elektrik akan digunakan (memiliki fungsi yang sama, tetapi berlainan reka bentuk) STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI :Gunakan GUI isyarat: {STRING} STR_CONFIG_SETTING_DEFAULT_SIGNAL_TYPE :Jenis isyarat yang dibina secara lazim: {STRING} STR_CONFIG_SETTING_DEFAULT_SIGNAL_NORMAL :Isyarat sekatan @@ -1396,19 +1419,29 @@ STR_CONFIG_SETTING_TOWN_GROWTH_SLOW :Lambat 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 STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :{ORANGE}Bandar-bandar STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}Industri-industri STR_CONFIG_SETTING_AI :{ORANGE}Pesaing @@ -1422,6 +1455,7 @@ STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS :Pencari laluan STR_CONFIG_SETTING_PATHFINDER_FOR_ROAD_VEHICLES :Pencari laluan untuk kenderaan jalanraya: {STRING} STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS :Pencari laluan untuk kapal: {STRING} STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Berundur secara automatik di isyarat: {STRING} +STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Benarkan keretapi berundur di lampu isyarat, jika ia menuggu lama STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Tukar nilai tetapan @@ -1485,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 @@ -1503,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) @@ -1679,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 @@ -1756,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... @@ -1917,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 @@ -1969,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 @@ -1989,6 +2025,7 @@ STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Ghaibkan # Linkgraph legend window # Linkgraph legend window and linkgraph legend in smallmap +STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLACK}tepu # Base for station construction window(s) STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Serlahan kawasan liputan @@ -2291,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 @@ -2302,29 +2340,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Ladang STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Tanah diliputi salji STR_LAI_CLEAR_DESCRIPTION_DESERT :Padang pasir -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} landasan -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} landasan dengan isyarat sekatan -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} landasan dengan pra-isyarat -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} landasan dengan isyarat keluar -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} landasan dengan isyarat kombo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} landasan dengan isyarat laluan -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} landasan dengan isyarat satu hala -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} landasan dengan isyarat sekatan dan pra-isyarat -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} landasan dengan isyarat sekatan dan keluar -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} landasan dengan isyarat sekatan dan kombo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} landasan dengan isyarat sekatan dan laluan -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} landasan dengan isyarat sekatan dan satu hala -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} landasan dengan isyarat pra- dan keluar -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} landasan dengan isyarat pra- dan kombo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} landasan dengan isyarat pra- dan laluan -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} landasan dengan isyarat pra- dan satu hala -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} landasan dengan isyarat keluar dan kombo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} landasan dengan isyarat keluar dan laluan -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} landasan dengan isyarat keluar dan satu hala -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} landasan dengan isyarat kombo dan laluan -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} landasan dengan isyarat kombo dan satu hala -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} landasan dengan isyarat laluan dan satu hala -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} depoh keretapi +STR_LAI_RAIL_DESCRIPTION_TRACK :Landasan keretapi +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 :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 :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 :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 :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 :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 @@ -2388,7 +2426,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Tanah dimiliki STR_ABOUT_OPENTTD :{WHITE}Tentang OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Hakcipta Asal {COPYRIGHT} 1995 Chris Sawyer, Hakcipta terpelihara STR_ABOUT_VERSION :{BLACK}OpenTTD versi {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2015 The OpenTTD team +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 @@ -2537,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 @@ -2568,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 @@ -2596,7 +2642,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Cubaan untuk me STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} mengandungi peperi yang rosak. Semua peperi yang rosak akan ditunjukkan menggunakan tanda soal (?) merah. STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Mengandungi pelbagai Tindakan 8 kemasukan (peperi {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Bacaan melepasi penghujung peperi-pseudo (peperi {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Set asas grafik yang sedang digunakan, hilang sebilangan sprites.{}Sila mengemaskini set asas grafik STR_NEWGRF_ERROR_GRM_FAILED :Sumber GRF yang diminta tidak diperolehi (peperi {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} telah dinyahaktifkan oleh {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Tidak sah/diketahui format susun atur (peperi {3:NUM}) @@ -2669,8 +2714,6 @@ STR_TOWN_POPULATION :{BLACK}Jumlah p STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Bandaraya) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Jumlah penduduk: {ORANGE}{COMMA}{BLACK} Rumah: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Penumpang bulan lalu: {ORANGE}{COMMA}{BLACK} maks: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Beg surat bulan lepas: {ORANGE}{COMMA}{BLACK} maks: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Kargi yang diperlukan untuk pembesaran bandar: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} diperlukan STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} diperlukan sewaktu musim sejuk @@ -2764,6 +2807,8 @@ STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klik di atas servis untuk memusatkan pemandangan kepada industri/bandar. Ctrl+Klik untuk membuka tetingkap pemandangan di lokasi bandar # 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 @@ -2788,7 +2833,12 @@ STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Menerima STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Penarafan 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 @@ -2806,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} @@ -2930,6 +2981,7 @@ STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Pengelua STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} ({COMMA}% dihantar) STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Pusatkan pemandangan utama ke lokasi industri. Ctrl+Klik untuk membuka tetingkap pemandangan di lokasi industri STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Tahap produksi: {YELLOW}{COMMA}% +STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW} Industri mengumumkan penutupan serta merta! ############ range for requires starts STR_INDUSTRY_VIEW_REQUIRES_CARGO :{BLACK}Memerlukan: {YELLOW}{STRING}{STRING} @@ -2937,9 +2989,9 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Memerluk STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Memerlukan: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Diperlukan: + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Kargo yang sedang menunggu untuk diproses: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Mengeluarkan: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Mengeluarkan: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -2992,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 @@ -3004,6 +3056,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Buang semua ken STR_GROUP_RENAME_CAPTION :{BLACK}Namakan semula kenderaan + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Keretapi Baru STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Keretapi Elektrik Baru @@ -3168,10 +3221,7 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :keretapi maglev STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Kos: {CURRENCY_LONG} Berat: {WEIGHT_SHORT}{}Kelajuan: {VELOCITY} Kuasa: {POWER}{}Kos Pengendalian: {CURRENCY_LONG}/thn{}Kapasiti: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Kos: {CURRENCY_LONG} Berat: {WEIGHT_SHORT}{}Kelajuan: {VELOCITY} Kuasa: {POWER} Maks. E.K.: {6:FORCE}{}Kos Pengendalian: {4:CURRENCY_LONG}/thn{}Kapasiti: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Kos: {CURRENCY_LONG} Kelajuan Maks.: {VELOCITY}{}Kapasiti: {CARGO_LONG}, {CARGO_LONG}{}Kos Pengendalian: {CURRENCY_LONG}/thn -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Kos: {CURRENCY_LONG} Kelajuan Maks.: {VELOCITY}{}Kapasiti: {CARGO_LONG}{}Kos Pengendalian: {CURRENCY_LONG}/thn -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Kos: {CURRENCY_LONG}Kelajuan Maks.: {VELOCITY} Jarak: {COMMA} petak{}Kapasiti: {CARGO_LONG}, {CARGO_LONG}{}Kos berjalan: {CURRENCY_LONG}/thn -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Kos: {CURRENCY_LONG} Kelajuan Maks.: {VELOCITY} Jarak: {COMMA} petak{}Kapasiti: {CARGO_LONG}{}Kos berjalan: {CURRENCY_LONG}/thn +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Kos: {CURRENCY_LONG} Kelajuan Maks.: {VELOCITY}{}Kapasiti: {CARGO_LONG}{}Kos Pengendalian: {CURRENCY_LONG}/thn # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Gantikan {STRING} - {STRING} @@ -3191,7 +3241,6 @@ STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED :{BLACK}Tiada ke STR_REPLACE_VEHICLES_STOP :{BLACK}Hentikan Penggantian Kenderaan STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Menekan untuk menghentikan ketukaran jenis engin yang telah dipilih di sebelah kiri -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Menggantikan: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Beralih antara tetingkap enjin dan penggantian wagon STR_REPLACE_ENGINES :Enjin STR_REPLACE_WAGONS :Gerabak @@ -3287,7 +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_RANGE :{BLACK}Kelajuan Maks.: {LTBLUE}{VELOCITY} {BLACK}Jarak: {LTBLUE}{COMMA} petak +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} @@ -3307,6 +3357,8 @@ 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 STR_QUERY_RENAME_ROAD_VEHICLE_CAPTION :{WHITE}Nama kenderaan jalanraya @@ -3445,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 @@ -3826,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... @@ -4029,6 +4080,7 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Tidak bo STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... kenderaan sudah musnah +STR_ERROR_NO_VEHICLES_AVAILABLE_YET_EXPLANATION :{WHITE}Mulakan permainan baru selepas {DATE_SHORT} atau gunakan NewGRF yang digunakan kenderaan terdahulu # Specific vehicle errors STR_ERROR_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}Keretapi tidak boleh melanggar isyarat kerana terdapat kemungkinan bahaya... @@ -4061,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 @@ -4073,6 +4125,14 @@ STR_ERROR_CAN_T_DELETE_SIGN :{WHITE}Papan ta STR_DESKTOP_SHORTCUT_COMMENT :Sebuah permainan simulasi berasaskan Transport Tycoon Deluxe # 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 # Town building names diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index 79a5b8551c..65c4e10c7f 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -102,25 +102,25 @@ STR_QUANTITY_COAL :{WEIGHT_LONG} k STR_QUANTITY_MAIL :{COMMA}{NBSP}postsekk{P "" er} STR_QUANTITY_OIL :{VOLUME_LONG} olje STR_QUANTITY_LIVESTOCK :{COMMA}{NBSP}enhet{P "" er} buskap -STR_QUANTITY_GOODS :{COMMA}{NBSP}kasse{P "" r} med gods +STR_QUANTITY_GOODS :{COMMA}{NBSP}kasse{P "" r} gods STR_QUANTITY_GRAIN :{WEIGHT_LONG} korn STR_QUANTITY_WOOD :{WEIGHT_LONG} tømmer STR_QUANTITY_IRON_ORE :{WEIGHT_LONG} jernmalm STR_QUANTITY_STEEL :{WEIGHT_LONG} stål -STR_QUANTITY_VALUABLES :{COMMA}{NBSP}sekk{P "" er} med verdisaker +STR_QUANTITY_VALUABLES :{COMMA}{NBSP}sekk{P "" er} verdisaker STR_QUANTITY_COPPER_ORE :{WEIGHT_LONG} kobbermalm STR_QUANTITY_MAIZE :{WEIGHT_LONG} mais STR_QUANTITY_FRUIT :{WEIGHT_LONG} frukt -STR_QUANTITY_DIAMONDS :{COMMA}{NBSP}sekk{P "" er} med diamanter +STR_QUANTITY_DIAMONDS :{COMMA}{NBSP}sekk{P "" er} diamanter STR_QUANTITY_FOOD :{WEIGHT_LONG} mat STR_QUANTITY_PAPER :{WEIGHT_LONG} papir -STR_QUANTITY_GOLD :{COMMA}{NBSP}sekk{P "" er} med gull +STR_QUANTITY_GOLD :{COMMA}{NBSP}sekk{P "" er} gull STR_QUANTITY_WATER :{VOLUME_LONG} vann STR_QUANTITY_WHEAT :{WEIGHT_LONG} hvete STR_QUANTITY_RUBBER :{VOLUME_LONG} gummi STR_QUANTITY_SUGAR :{WEIGHT_LONG} sukker STR_QUANTITY_TOYS :{COMMA}{NBSP}leke{P "" r} -STR_QUANTITY_SWEETS :{COMMA}{NBSP}sekk{P "" er} med godteri +STR_QUANTITY_SWEETS :{COMMA}{NBSP}sekk{P "" er} godteri STR_QUANTITY_COLA :{VOLUME_LONG} cola STR_QUANTITY_CANDYFLOSS :{WEIGHT_LONG} sukkerspinn STR_QUANTITY_BUBBLES :{COMMA} boble{P "" r} @@ -671,10 +671,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Velg pro STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Skru av/på tilfeldig program STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Vis musikkspormeny -STR_ERROR_NO_SONGS :{WHITE}Et musikksett uten sanger er valgt. Ingen sanger vil bli avspilt - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Musikkprogram STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Sporliste STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Program - '{STRING}' @@ -816,7 +813,7 @@ STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDE STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}{STRING} sponset grunnleggelsen av den nye byen {TOWN}! -STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLACK}Ny{G "" "" tt} {STRING} bygges i nærheten av {TOWN}! +STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLACK}Ny{G "" "" tt} {STRING} blir anlagt i nærheten av {TOWN}! STR_NEWS_INDUSTRY_PLANTED :{BIG_FONT}{BLACK}Ny{G "" "" tt} {STRING} plantes i nærheten av {TOWN}! STR_NEWS_INDUSTRY_CLOSURE_GENERAL :{BIG_FONT}{BLACK}{STRING} legges ned! @@ -825,7 +822,7 @@ STR_NEWS_INDUSTRY_CLOSURE_LACK_OF_TREES :{BIG_FONT}{BLAC STR_NEWS_EURO_INTRODUCTION :{BIG_FONT}{BLACK}Europeisk valutaunion!{}{}Euro introdusert som enerådende valutaenhet for transaksjoner i landet ditt! STR_NEWS_BEGIN_OF_RECESSION :{BIG_FONT}{BLACK}Global finanskrise!{}{}Økonomer frykter det verste i det økonomien raser! -STR_NEWS_END_OF_RECESSION :{BIG_FONT}{BLACK}Finanskrisen over!{}{}Opptur i markedet gir industrien selvsikkerheten tilbake! +STR_NEWS_END_OF_RECESSION :{BIG_FONT}{BLACK}Finanskrisen over!{}{}Opptur i markedet gir industrien selvtilliten tilbake! STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL :{BIG_FONT}{BLACK}{INDUSTRY} øker produksjonen! STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_COAL :{BIG_FONT}{BLACK}Ny kullåre funnet i {INDUSTRY}!{}En dobling i produksjonen ventes! @@ -1003,7 +1000,7 @@ STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Velg mus STR_GAME_OPTIONS_BASE_MUSIC_STATUS :{RED}{NUM} ødelagt{P "" e} fil{P "" er} STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Ytterligere informasjon om det originale musikksettet -STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}Mislytes med å hente en liste over støttede oppløsninger +STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}Mislyktes med å hente en liste over støttede oppløsninger STR_ERROR_FULLSCREEN_FAILED :{WHITE}Fullskjermmodus mislyktes # Custom currency window @@ -1082,11 +1079,11 @@ STR_TERRAIN_TYPE_VERY_FLAT :Veldig flatt STR_TERRAIN_TYPE_FLAT :Flatt STR_TERRAIN_TYPE_HILLY :Åslendt STR_TERRAIN_TYPE_MOUNTAINOUS :Berglendt -STR_TERRAIN_TYPE_ALPINIST :Alpinist +STR_TERRAIN_TYPE_ALPINIST :Alpint STR_CITY_APPROVAL_PERMISSIVE :Ettergivende STR_CITY_APPROVAL_TOLERANT :Tolerant -STR_CITY_APPROVAL_HOSTILE :Fientlig +STR_CITY_APPROVAL_HOSTILE :Fiendtlig STR_WARNING_NO_SUITABLE_AI :{WHITE}Ingen egnet AI tilgjengelig...{}Du kan laste ned flere AIer fra nettet med spillets nedlastingssystem. @@ -1340,8 +1337,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Farge på terre STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Grønn STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Mørkegrønn STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Fiolett -STR_CONFIG_SETTING_REVERSE_SCROLLING :Snu rulleretningen: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Opptreden ved rulling av kartet med høyre museknapp. Når deaktivert, beveger musen kameraet. Når aktivert, beveger musen kartet STR_CONFIG_SETTING_SMOOTH_SCROLLING :Myk rulling: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Velge hvordan synsfeltet ruller til en bestemt posisjon når du klikker på det lille kartet, eller ved utstedelse av en kommando for å gå til et bestemt objekt på kartet. Hvis aktivert, ruller synsfeltet jevnt, og hvis deaktivert hopper det direkte til det valgte punktet STR_CONFIG_SETTING_MEASURE_TOOLTIP :Vis målingsverktøy ved bruk av byggingsverktøy: {STRING} @@ -1373,8 +1368,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Kommando+klikk STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+klikk STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Av -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Venstre-klikk rulling: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Tillat rulling av kartet ved å dra det med den venstre museknappen. Dette er spesielt nyttig når du bruker en berøringsskjerm +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Lukk vinduet med høyreklikk: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Lukker et vindu ved å høyreklikke i det. Deaktiverer verktøytipset med høyreklikk! STR_CONFIG_SETTING_AUTOSAVE :Autolagring: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Velg intervall mellom automatiske lagringer av spillet @@ -1764,6 +1759,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Se etter STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Vis AI/Spillskript-innstillinger STR_INTRO_TOOLTIP_QUIT :{BLACK}Avslutt 'OpenTTD' +STR_INTRO_BASESET :{BLACK}Det valgte innebygde grafikksettet mangler {NUM} sprite{P "" r}. Se etter oppdateringer for settet. STR_INTRO_TRANSLATION :{BLACK}Denne oversettelsen mangler {NUM} streng{P "" er}. Vennligst hjelp til å gjøre OpenTTD bedre ved å bli med i oversettergruppen. For detaljer, sjekk readme.txt. # Quit window @@ -2593,6 +2589,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Flyplass STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Godtatte varer: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Skinnetype: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Fartsgrense for jernbanespor: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Veiens fartsgrense: {LTBLUE}{VELOCITY} @@ -2605,29 +2602,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Jorder STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Snødekket land STR_LAI_CLEAR_DESCRIPTION_DESERT :Ørken -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING}spor -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING}spor med blokksignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING}spor med forsignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING}spor med utgangssignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING}spor med kombinasjonssignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING}spor med avanserte signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} spor med enveis avanserte signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} spor med blokk- og forsignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} spor med blokk- og utgangssignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} spor med blokk- og kombinasjonssignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} spor med blokk- og avanserte signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} spor med blokk- og enveis avanserte signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} spor med for- og utgangssignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} spor med for- og kombinasjonssignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} spor med for- og avanserte signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} spor med for- og enveis avanserte signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} spor med utgangs- og kombinasjonssignaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} spor med utgangs- og avanserte signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} spor med utgangs- og enveis avanserte signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} spor med kombinasjon- og avanserte signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} spor med kombinasjon- og enveis avanserte signaler -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} spor med avanserte- og enveis avanserte signaler -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} togstall +STR_LAI_RAIL_DESCRIPTION_TRACK :Jernbanespor +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Jernbanespor med blokksignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Jernbanespor med forsignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Jernbanespor med utgangssignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Jernbanespor med kombinasjonssignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Jernbanespor med avanserte signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Jernbanespor med enveis avanserte signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Jernbanespor med blokk- og forsignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Jernbane spor med blokk- og utgangssignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Jernbanespor med blokk- og kombinasjonssignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Jernbane spor med blokk- og avanserte signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Jernbanespor med blokk- og enveis avanserte signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Jernbanespor med for- og utgangssignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Jernbanespor med for- og kombinasjonssignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Jernbane spor med forsignaler og avanserte signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Jernbanespor med for- og enveis avanserte signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Jernbanespor med utgangs- og kombinasjonssignaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Jernbanespor med utgangs- og avanserte signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Jernbanespor med utgangs- og enveis avanserte signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Jernbanespor med kombinasjon- og avanserte signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Jernbanespor med kombinasjon- og enveis avanserte signaler +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Jernbanespor med avanserte- og enveis avanserte signaler +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Jernbane-togstall STR_LAI_ROAD_DESCRIPTION_ROAD :Vei STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Vei med gatelykter @@ -2691,7 +2688,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Firma-eid lando STR_ABOUT_OPENTTD :{WHITE}Om OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Opprinnelig opphavsbeskyttet {COPYRIGHT} 1995 Chris Sawyer, Alle rettigheter reservert STR_ABOUT_VERSION :{BLACK}OpenTTD versjon {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 OpenTTD-teamet +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 @@ -2910,8 +2914,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Forsøk på å STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} inneholder en ødelagt sprite. Alle ødelagte spriter blir vist som røde spørsmålstegn (?). STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Inneholder flere Handling 8-oppføringer (figur {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Leste forbi slutten av pseudo-sprite (figur {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Det benyttede grafikksettet mangler en del spriter.{}Du må oppdatere grafikksettet. -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Den benyttede grafikkpakken mangler en mengde bildeelementer.{}Du må oppdatere grafikkpakken.{}Siden du spiller en {YELLOW}utviklingsversjon av OpenTTD{WHITE}, kan det være at du også trenger en {YELLOW}utviklingsversjon av grafikkpakken{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Etterspurte GRF-ressurser ikke tilgjengelig (figur {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} ble deaktivert av {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Ugyldig/ukjent sprite layout-format (figur {3:NUM}) @@ -2986,8 +2988,6 @@ STR_TOWN_POPULATION :{BLACK}Verdensb STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (By) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Innbyggertall: {ORANGE}{COMMA}{BLACK} Antall hus: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Passasjerer forrige måned: {ORANGE}{COMMA}{BLACK} maks: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Post forrige måned: {ORANGE}{COMMA}{BLACK} maks: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Varebehov for byvekst: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} påkrevd STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} nødvendig om vinteren @@ -3118,8 +3118,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Godtar STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Vis liste over godtatte varer STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Godtar: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Denne stasjonen har eksklusive transportrettigheter i denne byen. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} kjøpte eksklusive transportrettigheter i denne byen. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Denne stasjonen har eksklusive transportrettigheter i denne byen. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} kjøpte eksklusive transportrettigheter i denne byen. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Vurderinger STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Vis stasjonsvurdering @@ -3279,8 +3279,8 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL :{WHITE}{CURRENC # Industry directory STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Industrier STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Ingen - -STR_INDUSTRY_DIRECTORY_ITEM :{ORANGE}{INDUSTRY}{BLACK} ({CARGO_LONG}{STRING}){YELLOW} ({COMMA}{NBSP}% transportert) -STR_INDUSTRY_DIRECTORY_ITEM_TWO :{ORANGE}{INDUSTRY}{BLACK} ({CARGO_LONG}{STRING}/{CARGO_LONG}{STRING}){YELLOW} ({COMMA}{NBSP}%/{COMMA}{NBSP}% transportert) +STR_INDUSTRY_DIRECTORY_ITEM :{ORANGE}{INDUSTRY}{BLACK} ({CARGO_LONG}{STRING}){YELLOW} ({COMMA}% transportert) +STR_INDUSTRY_DIRECTORY_ITEM_TWO :{ORANGE}{INDUSTRY}{BLACK} ({CARGO_LONG}{STRING}/{CARGO_LONG}{STRING}){YELLOW} ({COMMA}%/{COMMA}% transportert) STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY} STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Industrinavn - klikk på navn for å gå til industri. Ctrl+klikk åpner et nytt tilleggsvindu over industrien @@ -3298,9 +3298,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Trenger: STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Trenger: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Krever: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} venter{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Varer som venter på behandling: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produserer: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Produserer: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3367,6 +3369,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Fjern alle kjø STR_GROUP_RENAME_CAPTION :{BLACK}Endre navn på gruppe +STR_GROUP_PROFIT_THIS_YEAR :Profitt i år: +STR_GROUP_PROFIT_LAST_YEAR :Profitt i fjor: +STR_GROUP_OCCUPANCY :Gjeldende bruk: +STR_GROUP_OCCUPANCY_VALUE :{NUM} % + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nye tog/vogner for jernbane STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nye tog/vogner for elektrisk jernbane @@ -3398,6 +3405,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Alle varetyper STR_PURCHASE_INFO_ALL_BUT :Alt utenom {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Maks trekkraft: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Rekkevidde: {GOLD}{COMMA} ruter +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Flytype: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Liste over tog/vogner - klikk på tog/vogn for mer informasjon. Ctrl+klikk for å skjule/vise denne typen STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Liste over kjøretøy - klikk på kjøretøy for mer informasjon. Ctrl+klikk for å skjule/vise kjøretøytypen @@ -3522,19 +3530,20 @@ STR_DEPOT_SELL_CONFIRMATION_TEXT :{YELLOW}Du er n # Engine preview window STR_ENGINE_PREVIEW_CAPTION :{WHITE}Melding fra kjøretøysprodusent STR_ENGINE_PREVIEW_MESSAGE :{GOLD}Vi har nettopp designet e{G n i t} ny{G "" "" tt} {STRING} - er du interessert i et års ekslusivt bruk av dette, slik at vi kan se hvordan det virker før det blir allment tilgjengelig? -STR_ENGINE_PREVIEW_RAILROAD_LOCOMOTIVE :lokomotiv -STR_ENGINE_PREVIEW_ROAD_VEHICLE :kjøretøy +STR_ENGINE_PREVIEW_RAILROAD_LOCOMOTIVE :{G=neuter}lokomotiv +STR_ENGINE_PREVIEW_ROAD_VEHICLE :{G=neuter}kjøretøy STR_ENGINE_PREVIEW_AIRCRAFT :{G=neuter}luftfartøy -STR_ENGINE_PREVIEW_SHIP :skip -STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :monorail-lokomotiv -STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :maglev-lokomotiv +STR_ENGINE_PREVIEW_SHIP :{G=neuter}skip +STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :{G=neuter}monorail-lokomotiv +STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :{G=neuter}maglev-lokomotiv STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Kostnad: {CURRENCY_LONG} Vekt: {WEIGHT_SHORT}{}Hastighet: {VELOCITY} Kraft: {POWER}{}Driftskostnader: {CURRENCY_LONG}/år{}Kapasitet: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Kostnad: {CURRENCY_LONG} Vekt: {WEIGHT_SHORT}{}Hastighet: {VELOCITY} Kraft: {POWER} Maks trekkraft: {6:FORCE}{}Vedlikehold: {4:CURRENCY_LONG}/år{}Kapasitet: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Kostnad: {CURRENCY_LONG} Maks hastighet: {VELOCITY}{}Kapasitet: {CARGO_LONG}, {CARGO_LONG}{}Driftskostnader: {CURRENCY_LONG}/år -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Kostnad: {CURRENCY_LONG} Maks hastighet: {VELOCITY}{}Kapasitet: {CARGO_LONG}{}Driftskostnader: {CURRENCY_LONG}/år -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Kostnad: {CURRENCY_LONG} Maks hastighet: {VELOCITY} Rekkevidde: {COMMA} ruter{}Kapasitet: {CARGO_LONG}, {CARGO_LONG}{}Driftskostnad: {CURRENCY_LONG}/år -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Kostnad: {CURRENCY_LONG} Maks hastighet: {VELOCITY} Rekkevidde: {COMMA} ruter{}Kapasitet: {CARGO_LONG}{}Driftskostnad: {CURRENCY_LONG}/år +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Kostnad: {CURRENCY_LONG} Maks hastighet: {VELOCITY}{}Kapasitet: {CARGO_LONG}{}Driftskostnader: {CURRENCY_LONG}/år +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Kostnad: {CURRENCY_LONG} Maks. hastighet: {VELOCITY}{}Flytype: {STRING}{}Kapasitet: {CARGO_LONG}, {CARGO_LONG}{}Driftskostnader: {CURRENCY_LONG}/år +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Kostnad: {CURRENCY_LONG} Maks. hastighet: {VELOCITY}{}Flytype: {STRING}{}Kapasitet: {CARGO_LONG}{}Driftskostnad: {CURRENCY_LONG}/år +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Kostnad: {CURRENCY_LONG} Maks. hastighet: {VELOCITY}{}Flytype: {STRING} Rekkevidde: {COMMA} ruter{}kapasitet: {CARGO_LONG}, {CARGO_LONG}{}Driftskostnader: {CURRENCY_LONG}/år +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Kostnad: {CURRENCY_LONG} Maks. hastighet: {VELOCITY}{}Flytype: {STRING} Rekkevidde: {COMMA} ruter{}Kapasitet: {CARGO_LONG}{}Driftskostnad: {CURRENCY_LONG}/år # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Erstatte {STRING} - {STRING} @@ -3561,10 +3570,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} når g STR_REPLACE_VEHICLES_STOP :{BLACK}Stopp erstatning av kjøretøy STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Klikk denne knappen for å stoppe erstatning av lokomotivet som er valgt på venstresiden -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Erstatter: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Veksle mellom tog- og vognerstatningsvinduet STR_REPLACE_ENGINES :Lokomotiv STR_REPLACE_WAGONS :Vogner +STR_REPLACE_ALL_RAILTYPE :Status: Mangler STR_REPLACE_HELP_RAILTYPE :{BLACK}Velg jernbanetypen du vil bytte ut lokomotiv på STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Viser hvilket lokomotiv som overtar for det valgte lokomotivet på venstresiden @@ -3657,7 +3666,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} år ({C STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} år ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Maks hastighet: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Maks hastighet: {LTBLUE}{VELOCITY} {BLACK}Rekkevidde: {LTBLUE}{COMMA} ruter +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Maks. hastighet: {LTBLUE}{VELOCITY} {BLACK}Flytype: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Maks. hastighet: {LTBLUE}{VELOCITY} {BLACK}Flytype: {LTBLUE}{STRING} {BLACK}Rekkevidde: {LTBLUE}{COMMA} ruter STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Vekt: {LTBLUE}{WEIGHT_SHORT} {BLACK}Kraft: {LTBLUE}{POWER}{BLACK} Maks hastighet: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Vekt: {LTBLUE}{WEIGHT_SHORT} {BLACK}Kraft: {LTBLUE}{POWER}{BLACK} Maks hastighet: {LTBLUE}{VELOCITY} {BLACK}Maks trekkraft: {LTBLUE}{FORCE} @@ -4217,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... @@ -4423,7 +4432,7 @@ STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}...{NBSP STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Ingen kjøretøyer vil være tilgjengelig i det hele tatt STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Endre din NewGRF konfigurasjon -STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Ingen kjøretøyer er tilgjengelig enda +STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Ingen kjøretøyer er tilgjengelig ennå STR_ERROR_NO_VEHICLES_AVAILABLE_YET_EXPLANATION :{WHITE}Starte et nytt spill etter {DATE_SHORT}, eller bruke en NewGRF som inneholder tidlige kjøretøy # Specific vehicle errors @@ -4547,7 +4556,7 @@ STR_INDUSTRY_NAME_CANDY_FACTORY :{G=masculine}Go STR_INDUSTRY_NAME_BATTERY_FARM :{G=masculine}Batterigård STR_INDUSTRY_NAME_COLA_WELLS :{G=masculine}Colabrønn STR_INDUSTRY_NAME_TOY_SHOP :{G=masculine}Leketøysbutikk -STR_INDUSTRY_NAME_TOY_FACTORY :Leketøysfabrikk +STR_INDUSTRY_NAME_TOY_FACTORY :{G=masculine}Leketøysfabrikk STR_INDUSTRY_NAME_PLASTIC_FOUNTAINS :{G=feminine}Plastfontene STR_INDUSTRY_NAME_FIZZY_DRINK_FACTORY :{G=masculine}Mineralvannfabrikk STR_INDUSTRY_NAME_BUBBLE_GENERATOR :{G=masculine}Boblegenerator diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt index c987698bc7..93db95f84b 100644 --- a/src/lang/norwegian_nynorsk.txt +++ b/src/lang/norwegian_nynorsk.txt @@ -671,10 +671,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Vel 'Eig STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Skru tilfeldig program av/på STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Syne musikkspormeny -STR_ERROR_NO_SONGS :{WHITE}Eit musikksett utan songar har blitt valt. Ingen songar vil bli spelt - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Musikkprogram STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Sporregister STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Program - '{STRING}' @@ -1311,7 +1308,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Farge på terre 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 :Fiolett -STR_CONFIG_SETTING_REVERSE_SCROLLING :Snu rulleretninga: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING :Jamn rulling i tilleggsvindauge: {STRING} STR_CONFIG_SETTING_MEASURE_TOOLTIP :Syne eit målingverktøytips når ymse byggjeverktøy brukast: {STRING} STR_CONFIG_SETTING_LIVERIES :Syne firmaovertakingar: {STRING} @@ -1338,7 +1334,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Kommando+klikk STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :CTRL+klikk STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Av -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Venstreknapps-rulling: {STRING} STR_CONFIG_SETTING_AUTOSAVE :Autolaging: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Vel intervall for automatisk lagring av spel @@ -2522,29 +2517,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Jorde STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Snødekt land STR_LAI_CLEAR_DESCRIPTION_DESERT :Ørken -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} spor -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} spor med blokksignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} spor med startsignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} spor med sluttsignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} spor med kombinerte signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} spor med avanserte signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} spor med einvegssignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} spor med blokk- og startsignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} spor med blokk- og sluttsignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} spor med blokk- og kombinerte signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} spor med blokk- og avanserte signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} spor med blokk- og einvegssignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} spor med start- og sluttsignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} spor med start- og kombinerte signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} spor med start- og avanserte signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} spor med start- og einvegssignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} spor med slutt- og kombinerte signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} spor med slutt- og avanserte signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} spor med slutt- og einvegssignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} spor med kombinerte og avanserte signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} spor med kombinerte og einvegssignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} spor med avanserte og einvegssignal -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} togstall +STR_LAI_RAIL_DESCRIPTION_TRACK :Jernbane spor +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Jernbane spor med blokksignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Jernbane spor med startsignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Jernbane spor med sluttsignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Jernbane spor med kombinerte signal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Jernbane spor med avanserte signal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Jernbane spor med einvegssignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Jernbane spor med blokk- og startsignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Jernbane spor med blokk- og sluttsignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Jernbane spor med blokk- og kombinerte signal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Jernbane spor med blokk- og avanserte signal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Jernbane spor med blokk- og einvegssignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Jernbane spor med start- og sluttsignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Jernbane spor med start- og kombinerte signal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Jernbane spor med start- og avanserte signal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Jernbane spor med start- og einvegssignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Jernbane spor med slutt- og kombinerte signal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Jernbane spor med slutt- og avanserte signal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Jernbane spor med slutt- og einvegssignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Jernbane spor med kombinerte og avanserte signal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Jernbane spor med kombinerte og einvegssignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Jernbane spor med avanserte og einvegssignal +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Jernbane togstall STR_LAI_ROAD_DESCRIPTION_ROAD :Veg STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Veg med gatelykter @@ -2608,7 +2603,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Feltet eigast a STR_ABOUT_OPENTTD :{WHITE}Om OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Opphaveleg opphavsbeskytta av {COPYRIGHT} 1995 Chris Sawyer, Alle rettigheiter reservert STR_ABOUT_VERSION :{BLACK}OpenTTD versjon {REV}. Oversett til nynorsk av Thor Morten Skogrand med fleire. -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 OpenTTD-teamet +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 @@ -2823,8 +2825,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Forsøk på å STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} inneheld øydelagd grafikk. All øydelagd grafikk vil bli vist som raude spørsmålsteikn (?). STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Inneheld fleire tilfelle av handling 8 (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Lest forbi slutten av pseudo-sprite (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Det nåværande grafikksettet manglar ein del bilete.{}Vennligst oppdater grafikksettet. -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Det valde grafikksettet manglar nokre bilete.{}Vær venleg og forny grafikksettet.{}I og med at du spelar eit {YELLOW}utviklingsutkast av OpenTTD{WHITE} treng du òg eit {YELLOW}utviklingsutkast av grafikksettet{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Etterspurde GRF-ressursar ikkje tilgjengeleg (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} vart deaktivert av {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Ugyldig/ukjend sprite layout-format (sprite {3:NUM}) @@ -2899,8 +2899,6 @@ STR_TOWN_POPULATION :{BLACK}Verdsinn STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (By) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Innbyggjartal: {ORANGE}{COMMA}{BLACK} Antal hus: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Passasjerar førre månad: {ORANGE}{COMMA}{BLACK} maks.: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Post førre månad: {ORANGE}{COMMA}{BLACK} maks.: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Varer naudsynt for folketalsauke: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} naudsynt STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} naudsynt om vinteren @@ -3031,8 +3029,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Aksepter STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Syne liste over godtekne varer STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Godtek: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Eigaren av stasjonen har eksklusive transportrettar i den her byen. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} har kjøp eksklusive transportrettar i byen. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Eigaren av stasjonen har eksklusive transportrettar i den her byen. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} har kjøp eksklusive transportrettar i byen. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Vurderingar STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Syne stasjonsvurdering @@ -3211,9 +3209,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Treng: { STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Treng: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Varer som ventar på å bli behandla: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Lagar: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Lagar: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3280,6 +3277,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Fjern alle køy STR_GROUP_RENAME_CAPTION :{BLACK}Gje nytt namn til ei gruppe + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nye tog/vogner for jernbane STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nytt elektrisk tog @@ -3444,10 +3442,7 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :maglev-lokomoti STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Kostnad: {CURRENCY_LONG} Vekt: {WEIGHT_SHORT}{}Hastigheit: {VELOCITY} Kraft: {POWER}{}Driftskostnader: {CURRENCY_LONG}/år{}Kapasitet: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Pris: {CURRENCY_LONG} Vekt: {WEIGHT_SHORT}{}Hastigheit: {VELOCITY} Kraft: {POWER} Maks. trekkraft: {6:FORCE}{}Driftskostnad: {4:CURRENCY_LONG}/yr{}Kapasitet: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Pris: {CURRENCY_LONG} Maks. hastigheit: {VELOCITY}{}Kapasitet: {CARGO_LONG}, {CARGO_LONG}{}Driftskostnad: {CURRENCY_LONG}/år -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Pris: {CURRENCY_LONG} Maks. hastigheit: {VELOCITY}{}Kapasitet: {CARGO_LONG}{}Driftskostnad: {CURRENCY_LONG}/år -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Kostnad: {CURRENCY_LONG} Maks. fart: {VELOCITY} Rekkevidde: {COMMA} ruter{}Kapasitet: {CARGO_LONG}, {CARGO_LONG}{}Driftskostnad: {CURRENCY_LONG}/år -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Kostnad: {CURRENCY_LONG} Maks. fart: {VELOCITY} Rekkevidde: {COMMA} ruter{}Kapasitet: {CARGO_LONG}{}Driftskostnad: {CURRENCY_LONG}/år +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Pris: {CURRENCY_LONG} Maks. hastigheit: {VELOCITY}{}Kapasitet: {CARGO_LONG}{}Driftskostnad: {CURRENCY_LONG}/år # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Erstatt {STRING} - {STRING} @@ -3474,7 +3469,6 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} når g STR_REPLACE_VEHICLES_STOP :{BLACK}Stopp utskiftinga av køyretøy STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Klikk denne knappen for å avbryte utskiftinga av lokomotivet du har vald på venstresida -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Erstatter: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Skift mellom tog- og vognerstatningsvindauget STR_REPLACE_ENGINES :Lokomotiv STR_REPLACE_WAGONS :Vogner @@ -3570,7 +3564,6 @@ STR_VEHICLE_INFO_AGE :{COMMA} år ({C STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} år ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Maks. hastigheit: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Maks fart: {LTBLUE}{VELOCITY} {BLACK}Rekkevidde: {LTBLUE}{COMMA} ruter STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Vekt: {LTBLUE}{WEIGHT_SHORT} {BLACK}Kraft: {LTBLUE}{POWER}{BLACK} Maks. hastigheit: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Vekt: {LTBLUE}{WEIGHT_SHORT} {BLACK}Kraft: {LTBLUE}{POWER}{BLACK} Maks. hastigheit: {LTBLUE}{VELOCITY} {BLACK}Maks. trekkraft: {LTBLUE}{FORCE} @@ -4126,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 f6a8294785..965c08cb42 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -702,10 +702,10 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Wyświet STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Wyświetl listę stacji firmy STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Wyświetl informacje finansowe firmy STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Wyświetl informacje ogólne firmy -STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Pokaż okno opowieści +STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Pokaż dziennik STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Pokaż listę celów STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Wyświetl wykresy -STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Wyświetl tabele firm +STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Wyświetl ranking firm STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Ufunduj budowę nowego przedsiębiorstwa STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Wyświetl listę pociągów firmy. Ctrl+klik otwiera listę grup/pojazdów STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Wyświetl listę pojazdów firmy. Ctrl+klik otwiera listę grup/pojazdów @@ -757,7 +757,7 @@ STR_SETTINGS_MENU_NEWGRF_SETTINGS :Ustawienia NewG STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Opcje przeźroczystości STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Wyświetlanie nazw miast STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED :Wyświetlanie nazw stacji -STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED :Wyświetlanie nazw pkt. orientacyjnych +STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED :Wyświetlanie nazw posterunków STR_SETTINGS_MENU_SIGNS_DISPLAYED :Wyświetlanie napisów STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS :Znaki konkurentów i nazwy są wyświetlane STR_SETTINGS_MENU_FULL_ANIMATION :Pełna animacja @@ -790,7 +790,7 @@ STR_SUBSIDIES_MENU_SUBSIDIES :Subsydia ############ range ends here ############ range for graph menu starts -STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH :Wykres obrotu +STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH :Wykres dochodów STR_GRAPH_MENU_INCOME_GRAPH :Wykres przychodów STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH :Wykres przewożonego ładunku STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH :Ocena działalności firmy @@ -799,7 +799,7 @@ STR_GRAPH_MENU_CARGO_PAYMENT_RATES :Stawki za ładu ############ range ends here ############ range for company league menu starts -STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE :Wykres Ligi Firm +STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE :Ranking Firm STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING :Szczegółowa tabela efektywności STR_GRAPH_MENU_HIGHSCORE :Tabela wyników ############ range ends here @@ -971,7 +971,7 @@ STR_GRAPH_KEY_CAPTION :{WHITE}Legenda STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Kliknij tutaj aby wł./wył. wyświetlanie danych firmy na wykresie # Company league window -STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Tabela Ligi Firm +STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Ranking Firm STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPANY} {BLACK}{COMPANY_NUM} '{STRING}' STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER :Inżynier STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER :Administrator Ruchu @@ -1009,7 +1009,7 @@ STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Ilość STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Ilość zarobionych pieniędzy w kwartale z największym zyskiem z ostatnich 12 kwartałów STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Ilość ładunku przewiezionego w poprzednich 4 kwartałach STR_PERFORMANCE_DETAIL_CARGO_TOOLTIP :{BLACK}Ilość różnych typów ładunku przewiezionych w ostatnim kwartale -STR_PERFORMANCE_DETAIL_MONEY_TOOLTIP :{BLACK}Ilość pieniędzy w ręku +STR_PERFORMANCE_DETAIL_MONEY_TOOLTIP :{BLACK}Ilość dostępnych środków pieniężnych STR_PERFORMANCE_DETAIL_LOAN_TOOLTIP :{BLACK}Wielkość pożyczki wziętej przez firmę STR_PERFORMANCE_DETAIL_TOTAL_TOOLTIP :{BLACK}Suma przyznanych punktów @@ -1029,6 +1029,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}Brak dostępnej muzyki STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}" STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Ścieżka STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Tytuł @@ -1048,21 +1049,19 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Wybierz STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Losowe odtwarzanie wł./wył. STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Pokaż okno wyboru ścieżek -STR_ERROR_NO_SONGS :{WHITE}Został wybrany zestaw muzyki bez utworów. Żaden utwór nie będzie odtwarzany - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Wybór Programu STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Wykaz ścieżek STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Programuj - '{STRING}' STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Wyczyść +STR_PLAYLIST_CHANGE_SET :{BLACK}Zmień zestaw STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Wyczyść obecny program (tylko Wlasny1 lub Wlasny2) STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klik na ścieżce aby dodać do obecnego programu (Wlasny1 i Wlasny2) STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Kliknij na ścieżce muzycznej aby usunąć ją z wybranego programu (Wlasny1 lub Wlasny2) # Highscore window STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Ranking firm, które osiągnęły rok {NUM} -STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Tabela Ligi Firm w {NUM} +STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Ranking Firm w {NUM} STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Biznesmen STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Przedsiębiorca @@ -1520,7 +1519,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_CENTER :wyśrodkowany STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :z prawej strony STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maksymalna wysokość początkowej pożyczki: {STRING} -STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maksymalna wysokość pożyczki jaką firma może zaciągnąć (nie uwzględnia inflacji) +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maksymalna wysokość pożyczki, jaką firma może zaciągnąć (bez uwzględnienia inflacji) STR_CONFIG_SETTING_INTEREST_RATE :Oprocentowanie: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Oprocentowanie pożyczki; kontroluje też inflację, jeśli jest włączona STR_CONFIG_SETTING_RUNNING_COSTS :Koszty amortyzacji: {STRING} @@ -1717,8 +1716,9 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Kolor terenu na STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :zielony STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :ciemnozielony STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :fioletowy -STR_CONFIG_SETTING_REVERSE_SCROLLING :Przewijaj obraz myszką w przeciwnym kierunku: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Zachowanie podczas przewijania mapy za pomocą prawego przycisku myszy. W przypadku wyłączenia mysz porusza kamerą. Po włączeniu mysz przesuwa mapę +STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Zachowanie podczas przeciągania mapy +STR_CONFIG_SETTING_SCROLLMODE_RMB :Przeciągnij mapę prawym przyciskiem myszy +STR_CONFIG_SETTING_SCROLLMODE_LMB :Przeciągnij mapę lewym przyciskiem myszy STR_CONFIG_SETTING_SMOOTH_SCROLLING :Wygładź przesuwanie widoku: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Zdecyduj, jak główny widok przesuwa się do konkretnej lokacji, gdy klikasz na mini-mapie lub gdy używasz komendy do przesunięcia do danego obiektu na mapie. Kiedy włączone, widok przesuwa się płynnie, kiedy wyłączone, następuje skok bezpośrednio do wybranego miejsca STR_CONFIG_SETTING_MEASURE_TOOLTIP :Pokaż dymek z pomiarem podczas używania różnych narzędzi: {STRING} @@ -1750,8 +1750,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 :Wyłączona -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Przewijanie lewym przyciskiem myszy: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Włącz przewijanie mapy przeciąganiem lewym przyciskiem myszki. Jest to przydatne podczas używania ekranu dotykowego do przewijania +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Zamknij okno prawym przyciskiem: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Zamyka okno poprzez kliknięcie prawym przyciskiem. Wyłącza pomoc kontekstową! STR_CONFIG_SETTING_AUTOSAVE :Autozapis: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Częstotliwość automatycznego zapisu stanu gry @@ -1856,8 +1856,8 @@ STR_CONFIG_SETTING_NOSERVICE :Wyłącz serwis STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Kiedy włączone, pojazdy nie są serwisowane, jeśli nie mogą się popsuć STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Włącz limity prędkości wagonów: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Kiedy włączone, użyj także ograniczenia prędkości dla wagonów do obliczenia maksymalnej prędkości pociągu -STR_CONFIG_SETTING_DISABLE_ELRAILS :Zabroń korzystania z kolei elektrycznych: {STRING} -STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT :Włączając to ustawienie, nie jest już wymagane elektryfikowanie torów, aby elektrowozy mogły po nich jeździć +STR_CONFIG_SETTING_DISABLE_ELRAILS :Tylko jeden rodzaj torów: {STRING} +STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT :Przy włączonym ustawieniu nie jest już wymagane elektryfikowanie torów, aby elektrowozy mogły po nich jeździć STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN :Przybycie pierwszego pojazdu do stacji gracza: {STRING} STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN_HELPTEXT :Wyświetl wiadomość w gazecie kiedy pierwszy pojazd dojedzie do stacji gracza @@ -1901,8 +1901,8 @@ STR_CONFIG_SETTING_SMOOTH_ECONOMY :Pozwól na łag STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Kiedy włączone, produkcja zakładów zmienia się częściej, ale mniejszymi krokami. To ustawienie zazwyczaj nie daje żadnego efektu, jeśli typy zakładów są pobierane z NewGRFów STR_CONFIG_SETTING_ALLOW_SHARES :Pozwól kupować udziały w innych firmach: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Kiedy włączone, pozwala na kupowanie i sprzedawanie udziałów w firmie. Udziały będą dostępne tylko dla firm z odpowiednim stażem -STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Udział w zyskach w przypadku częściowego transportu (przeładunku): {STRING} -STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Udział procentowy dochodu pośrednika otrzymywany za transfer towaru. Umożliwia kontrolę nad całościowym dochodem za dowóz towarów w łańcuchu dowozowym +STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Podział przychodów w przypadku przeładunków: {STRING} +STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Manipulowanie zrównoważeniem podziałów w łańcuchu dowozowym: przy 0% przychód zostanie zaksięgowany na konto wyłącznie ostatniego pojazdu w łańcuchu, wyższa wartość zwiększa zrównoważenie podziału STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Podczas przeciągania ustaw semafor co: {STRING} STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Ustaw dystans, na jakim semafory będą budowane przy torach aż do następnej przeszkody (semafor, zwrotnica), przy przeciąganiu STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} p{P ole ola ól} @@ -2002,7 +2002,7 @@ STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"asymetrycznie" STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Dokładność dystrybucji: {STRING} STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Im wyżej ustawisz, tym wiecej czasu zajmie procesorowi obliczenie wykresu. Jeśli zajmuje zbyt dużo czasu, może pojawić sie lag. Natomiast zbyt mała ilość powoduje niedokładną dystrybucję, co można zauważyć gdy towar nie jest wysyłany do miejsc do których się spodziewasz aby dotarł. STR_CONFIG_SETTING_DEMAND_DISTANCE :Wpływ odległości na dystrybucję: {STRING} -STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Jeśli ustawisz tę wartość na więcej niż 0, to dystans pomiędzy stacją początkową A jakiegoś towaru a prawdopodobną stacją docelową B będzie miało wpływ na ilość towaru wysłanego z A do B. Im dalej z A do B, tym mniej towaru zostanie wysłane. Im wększa wartość, tym mniej towaru będzie wysłane do dalekich stacji, a więcej towaru będzie wysłane do bliższych stacji. +STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Jeśli ładunki z jednej stacji trafiają na kilka różnych stacji, na ich dystrybucję wpływ ma odległość. Im wyższą wartość ustawisz, tym bliższe stacje będą preferowane. Zerowa wartość ustawienia sprawi, że odległość nie będzie wpływała na podział dystrybucji. STR_CONFIG_SETTING_DEMAND_SIZE :Ilość powracającego ładunku dla trybu symetrycznego: {STRING} STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Ustawiając to na mniej niż 100% powoduje, że symetryczna dystrybucja zachowuje się podobnie do asymetrycznej. Mniej towaru będzie zwróconego jeśli pewna ilość zostanie wysłana do stacji. Jeśli ustawisz to na 0%, to symetryczna dystrybucja zachowuje się jak asymetryczna. STR_CONFIG_SETTING_SHORT_PATH_SATURATION :Zapełnienie krótkich tras przed wybraniem tras o dużej przepustowości: {STRING} @@ -2141,6 +2141,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Poszukaj STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Pokaż ustawienia SI / Game Script STR_INTRO_TOOLTIP_QUIT :{BLACK}Wyjdź z 'OpenTTD' +STR_INTRO_BASESET :{BLACK}Aktualnie używany podstawowy zestaw graficzny nie posiada {NUM} wymagan{P ego ych ych} sprite{P 'u 'ów 'ów}. Proszę poszukać aktualizacji dla zestawu podstawowego. STR_INTRO_TRANSLATION :{BLACK}Tej wersji językowej brakuje jeszcze {NUM} wpis{P "" y ów}. Możesz pomóc ulepszyć nam OpenTTD rejestrując się jako tłumacz. Szczegóły znajdziesz w pliku readme.txt. # Quit window @@ -2410,7 +2411,7 @@ STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Nazwa f STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Inauguracja: {WHITE}{NUM} STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Wartość firmy: {WHITE}{CURRENCY_LONG} STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Bieżący bilans: {WHITE}{CURRENCY_LONG} -STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Przychód w ostatnim roku: {WHITE}{CURRENCY_LONG} +STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Dochód w ostatnim roku: {WHITE}{CURRENCY_LONG} STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Wydajność: {WHITE}{NUM} STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Pojazdy: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} @@ -2421,7 +2422,7 @@ STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nowa fir STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Rozpoczęcie działalności nowej firmy STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Obserwuj grę STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Oglądaj grę jako widz -STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Połącz z firmą +STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Dołącz do firmy STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Pomóż zarządzać tą firmą # Network connecting window @@ -2681,8 +2682,8 @@ STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}Zasoby: STR_JOIN_STATION_CAPTION :{WHITE}Połącz stację STR_JOIN_STATION_CREATE_SPLITTED_STATION :{YELLOW}Zbuduj oddzielną stację -STR_JOIN_WAYPOINT_CAPTION :{WHITE}Połącz pkt. orientacyjne -STR_JOIN_WAYPOINT_CREATE_SPLITTED_WAYPOINT :{YELLOW}Zbuduj oddzielny pkt. orientacyjny +STR_JOIN_WAYPOINT_CAPTION :{WHITE}Połącz posterunki +STR_JOIN_WAYPOINT_CREATE_SPLITTED_WAYPOINT :{YELLOW}Zbuduj oddzielny posterunek # Rail construction toolbar STR_RAIL_TOOLBAR_RAILROAD_CONSTRUCTION_CAPTION :Konstrukcja linii kolejowej @@ -2693,12 +2694,12 @@ STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Konstrukcja lin STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Budowa torów kolejowych. Ctrl przełącza buduj/usuń dla konstrukcji kolejowych. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Zbuduj tory kolejowe za pomocą trybu Autotory. Ctrl przełącza buduj/usuń dla konstrukcji kolejowych. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Budowa warsztatów (do kupowania i serwisowania pociągów). Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów -STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Zamiana torów na pkt. orientacyjny. Ctrl umożliwia łączenie pkt. orientacyjnych. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów +STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Zamiana torów na posterunek. Ctrl umożliwia łączenie posterunków. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Zbuduj stację kolejową. Ctrl umożliwia łączenie stacji. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Zbuduj sygnały kolejowe. Ctrl przełącza semafory/sygnały świetlne{}Przeciągnięcie pozwala na budowę sygnałów wzdłuż prostej linii torów. Ctrl pozwala na budowę sygnałów do następnego skrzyżowania{}Ctrl+klik przełącza do okna wyboru sygnałów. Shift przełącza pomiędzy budowaniem a szacowaniem kosztów STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Zbuduj most kolejowy. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Zbuduj tunel kolejowy. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów -STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Przełącz buduj/usuń dla torów kolejowych, sygnałów, pkt. orientacyjnych i stacji. Przetrzymanie Ctrl usuwa także tory kolejowe z pkt. orientacyjnych i stacji +STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Przełącz buduj/usuń dla torów kolejowych, sygnałów, posterunków i stacji. Przetrzymanie Ctrl usuwa także tory kolejowe z posterunków i stacji STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Zamiana typu torów. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_RAIL_NAME_RAILROAD :Kolej @@ -2711,8 +2712,8 @@ STR_BUILD_DEPOT_TRAIN_ORIENTATION_CAPTION :{WHITE}Ukierunk STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP :{BLACK}Wybierz ukierunkowanie warsztatów # Rail waypoint construction window -STR_WAYPOINT_CAPTION :{WHITE}Pkt. orientacyjny -STR_WAYPOINT_GRAPHICS_TOOLTIP :{BLACK}Wybierz typ pkt. orientacyjnego +STR_WAYPOINT_CAPTION :{WHITE}Posterunek +STR_WAYPOINT_GRAPHICS_TOOLTIP :{BLACK}Wybierz typ posterunku # Rail station construction window STR_STATION_BUILD_RAIL_CAPTION :{WHITE}Wybór stacji @@ -2729,7 +2730,7 @@ STR_STATION_BUILD_STATION_CLASS_TOOLTIP :{BLACK}Wybierz STR_STATION_BUILD_STATION_TYPE_TOOLTIP :{BLACK}Wybierz typ stacji do zbudowania STR_STATION_CLASS_DFLT :Typowa stacja -STR_STATION_CLASS_WAYP :Pkt. orientacyjne +STR_STATION_CLASS_WAYP :Posterunki # Signal window STR_BUILD_SIGNAL_CAPTION :{WHITE}Wybór sygnałów @@ -2969,6 +2970,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Nazwa po STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Akceptowany ładunek: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Typ torów: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Limit prędkości linii kolejowej: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Drogowe ograniczenie prędkości: {LTBLUE}{VELOCITY} @@ -2981,29 +2983,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Pola STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Zaśnieżony teren STR_LAI_CLEAR_DESCRIPTION_DESERT :Pustynia -STR_LAI_RAIL_DESCRIPTION_TRACK :{G=m}{STRING} odcinek -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} tor z semaforam blokowymi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} tor z semaforami wejściowymi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} tor z semaforem wyjściowym -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} tor z semaforami złożonymi (combo) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} tor z semaforami trasy -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} tor z jednokierunkowymi semaforami trasy -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} tor z semaforami blokowymi i semaforami wejścia -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} tor z semaforami blokowymi i semaforami wyjścia -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} tor z semaforami blokowymi i semaforami złożonymi (combo) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} tor z semaforami blokowymi i semaforami trasy -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} tor z semaforami blokowymi i jednokierunkowymi semaforami trasy -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} tor z semaforami wejścia i wyjścia -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} tor z semaforami wejścia i semaforami złożonymi (combo) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} tor z semaforami wejścia i semaforami trasy -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} tor z semaforami wejścia i jednokierunkowymi semaforami trasy -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} tor z semaforami wyjścia i semaforami złożonymi (combo) -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} tor z semaforami wyjścia i semaforami trasy -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} tor z semaforami wyjścia i jednokierunkowymi semaforami trasy -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} tor z semaforami złożonymi (combo) i semaforami trasy -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} tor z semaforami złożonymi (combo) i jednokierunkowymi semaforami trasy -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} tor z semaforami trasy i jednokierunkowymi semaforami trasy -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{G=f}Warsztaty - {STRING} +STR_LAI_RAIL_DESCRIPTION_TRACK :{G=m}Tor kolejowy +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Tor kolejowy z semaforam blokowymi +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Tor kolejowy z semaforami wejściowymi +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Tor kolejowy z semaforem wyjściowym +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Tor kolejowy z semaforami złożonymi (combo) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Tor kolejowy z semaforami trasy +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Tor kolejowy z jednokierunkowymi semaforami trasy +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Tor kolejowy z semaforami blokowymi i semaforami wejścia +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Tor kolejowy z semaforami blokowymi i semaforami wyjścia +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Tor kolejowy z semaforami blokowymi i semaforami złożonymi (combo) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Tor kolejowy z semaforami blokowymi i semaforami trasy +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Tor kolejowy z semaforami blokowymi i jednokierunkowymi semaforami trasy +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Tor kolejowy z semaforami wejścia i wyjścia +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Tor kolejowy z semaforami wejścia i semaforami złożonymi (combo) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Tor kolejowy z semaforami wejścia i semaforami trasy +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Tor kolejowy z semaforami wejścia i jednokierunkowymi semaforami trasy +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Tor kolejowy z semaforami wyjścia i semaforami złożonymi (combo) +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Tor kolejowy z semaforami wyjścia i semaforami trasy +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Tor kolejowy z semaforami wyjścia i jednokierunkowymi semaforami trasy +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Tor kolejowy z semaforami złożonymi (combo) i semaforami trasy +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Tor kolejowy z semaforami złożonymi (combo) i jednokierunkowymi semaforami trasy +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Tor kolejowy z semaforami trasy i jednokierunkowymi semaforami trasy +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{G=f}Warsztaty kolejowe STR_LAI_ROAD_DESCRIPTION_ROAD :Droga STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Droga z oświetleniem ulicznym @@ -3026,7 +3028,7 @@ STR_LAI_STATION_DESCRIPTION_TRUCK_LOADING_AREA :Stacja załadun STR_LAI_STATION_DESCRIPTION_BUS_STATION :Przystanek STR_LAI_STATION_DESCRIPTION_SHIP_DOCK :Port STR_LAI_STATION_DESCRIPTION_BUOY :Boja -STR_LAI_STATION_DESCRIPTION_WAYPOINT :Pkt. orientacyjny +STR_LAI_STATION_DESCRIPTION_WAYPOINT :Posterunek STR_LAI_WATER_DESCRIPTION_WATER :Woda STR_LAI_WATER_DESCRIPTION_CANAL :Kanał @@ -3067,7 +3069,21 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Teren w posiada STR_ABOUT_OPENTTD :{WHITE}OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Prawa Autorskie {COPYRIGHT} 1995 Chris Sawyer, Wszelkie prawa zastrzeżone STR_ABOUT_VERSION :{BLACK}OpenTTD wersja {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2015 Zespół OpenTTD +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ę @@ -3254,7 +3270,7 @@ STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Idź do STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Poprzedni obrazek STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Idź do poprzedniego normalnego obrazka, pomijając jakiekolwiek pseudo/kolorowe/znakowe obrazki i zawijaj je od pierwszego do ostatniego STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Przedstawienie wybranego orbazka. Dostosowanie jest ignorowane podczas rysowania tego obrazka -STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Poruszaj obrazkiem, zmieniając przesunięcia X i Y +STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Poruszaj obrazkiem, zmieniając przesunięcia X i Y. Ctrl+klik aby przesunąć o 8 jednostek na raz. STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Resetuj zależność STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Resetuj aktualne offsety zależne STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X offset: {NUM}, Y offset: {NUM} (Całkowity) @@ -3286,8 +3302,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Próba użycia STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} zawiera uszkodzoną teksturę. Wszystkie uszkodzone tekstury będą pokazane jako czerwony znak zapytania (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Zawiera wiele wpisów Action 8 (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Odczyt poza obszar pseudo-sprite'u (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Aktualnie używany zestaw grafik jest niekompletny.{}Proszę zaktualizować podstawowy zestaw grafik -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}W aktualnie używanym podstawowym zestawie graficznym brakuje pewnej ilości sprite'ów.{}Proszę zaktualizowaćswój zestaw graficzny.{}Z powodu tego, że używasz {YELLOW}rozwojowej wersji OpenTTD{WHITE}, możesz potrzebować również {YELLOW}rozwojowej wersji podstawowego zestawu graficznego{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Potrzebne źródło GRF nie jest dostępne (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} został wyłączony przez {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Niepoprawny/nieznany format układu sprite'u (sprite {3:NUM}) @@ -3362,8 +3376,7 @@ STR_TOWN_POPULATION :{BLACK}Populacj STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Miasto) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Populacja: {ORANGE}{COMMA}{BLACK} Domów: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Pasażerów w zeszłym miesiącu: {ORANGE}{COMMA}{BLACK} maks: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Poczta w zeszłym miesiącu: {ORANGE}{COMMA}{BLACK} maks: {ORANGE}{COMMA} +STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} w ostatnim miesiącu: {ORANGE}{COMMA}{BLACK} najwięcej: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Towar potrzebny do rozwoju miasta: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{RED}Wymagana {ORANGE}{STRING} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} wymagane zimą @@ -3414,7 +3427,7 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Kup roc STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Daj łapówkę lokalnym władzom, powiększ swoją ocenę, ryzykując poważne kary w razie złapania.{}Koszt: {CURRENCY_LONG} # Goal window -STR_GOALS_CAPTION :{WHITE}{COMPANY} Cele +STR_GOALS_CAPTION :{WHITE}Cele firmy {COMPANY} STR_GOALS_SPECTATOR_CAPTION :{WHITE}Cele globalne STR_GOALS_GLOBAL_TITLE :{BLACK}Cele globalne: STR_GOALS_TEXT :{ORANGE}{STRING} @@ -3462,8 +3475,8 @@ STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klik na usłudze żeby wyśrodkować widok na fabrykę/miasto. Ctrl+klik otwiera nowy podgląd na pozycji fabryki/miasta # Story book window -STR_STORY_BOOK_CAPTION :{WHITE}Album Historii Firmy {COMPANY} -STR_STORY_BOOK_SPECTATOR_CAPTION :{WHITE}Globalne okno opowieści +STR_STORY_BOOK_CAPTION :{WHITE}Dziennik Historii Firmy {COMPANY} +STR_STORY_BOOK_SPECTATOR_CAPTION :{WHITE}Ogólny przewodnik STR_STORY_BOOK_TITLE :{YELLOW}{STRING} STR_STORY_BOOK_GENERIC_PAGE_ITEM :Strona {NUM} STR_STORY_BOOK_SEL_PAGE_TOOLTIP :{BLACK}Skocz na właściwą stronę wybierając ją z listy. @@ -3494,8 +3507,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Akceptuj STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Pokaż listę akceptowanych ładunków STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Akceptuje: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Ta stacja posiada wyłączność na usługi transportowe w tym mieście. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :Firma {YELLOW}{COMPANY}{BLACK} kupiła wyłączność na usługi transportowe w tym mieście. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Ta stacja posiada wyłączność na usługi transportowe w tym mieście. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :Firma {YELLOW}{COMPANY}{BLACK} kupiła wyłączność na usługi transportowe w tym mieście. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Oceny STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Pokaż ocenę stacji @@ -3551,8 +3564,8 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Nie zezw # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} -STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centruj główny widok na pkt. orientacyjnym. Ctrl+klik otwiera nowy podgląd na lokacji pkt. orientacyjnego -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Zmień nazwę pkt. orientacyjnego +STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centruj główny widok na posterunku. Ctrl+klik otwiera nowy podgląd na lokacji posterunku +STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Zmień nazwę posterunku STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centruj główny widok na pozycji boi. Ctrl+klik otwiera nowy podgląd na lokacji boi STR_BUOY_VIEW_CHANGE_BUOY_NAME :{BLACK}Zmień nazwę boji @@ -3674,9 +3687,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Wymaga: STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Wymaga: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Potrzebuje: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} oczekuje{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Ładunek oczekujący na przetworzenie: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produkuje: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Produkuje: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3743,6 +3758,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Usuń wszystkie STR_GROUP_RENAME_CAPTION :{BLACK}Zmień nazwę grupy +STR_GROUP_PROFIT_THIS_YEAR :Zysk w tym roku: +STR_GROUP_PROFIT_LAST_YEAR :Zysk w zeszłym roku: +STR_GROUP_OCCUPANCY :Aktualne wykorzystanie: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nowe pociągi STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nowe elektryczne pojazdy szynowe @@ -3774,6 +3794,7 @@ STR_PURCHASE_INFO_ALL_TYPES :wszystkie typy STR_PURCHASE_INFO_ALL_BUT :wszystko oprócz {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Maks. siła pociągowa: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Zasięg: {GOLD}{COMMA} pól +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Typ samolotu: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista wyboru pociągów - kliknij na pojeździe, aby uzyskać informacje. Ctrl+klik przełącza ukrywanie typu pojazdu STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Lista wyboru pojazdów drogowych - kliknij na pojeździe, aby uzyskać więcej informacji. Ctrl+klik przełącza ukrywanie typu pojazdu @@ -3913,10 +3934,11 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE.b :lokomotywę Mag STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Koszt: {CURRENCY_LONG} Masa: {WEIGHT_SHORT}{}Prędkość: {VELOCITY} Moc: {POWER}{}Koszt utrzymania: {CURRENCY_LONG}/rok{}Ładowność: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Koszt: {CURRENCY_LONG} Masa: {WEIGHT_SHORT}{}Prędkość: {VELOCITY} Moc: {POWER} Maksymalna siła pociągowa: {6:FORCE}{}Koszt utrzymania: {4:CURRENCY_LONG}/rok{}Ładowność: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Koszt: {CURRENCY_LONG} Prędkość maksymalna: {VELOCITY}{}Ładowność: {CARGO_LONG}, {CARGO_LONG}{}Koszt utrzymania: {CURRENCY_LONG}/rok -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Koszt: {CURRENCY_LONG} Prędkość maksymalna: {VELOCITY}{}Ładowność: {CARGO_LONG}{}Koszt utrzymania: {CURRENCY_LONG}/rok -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Koszt: {CURRENCY_LONG} Prędkość maksymalna: {VELOCITY} Zasięg: {COMMA} pól{}Ładowność: {CARGO_LONG}, {CARGO_LONG}{}Koszt utrzymania: {CURRENCY_LONG}/rok -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Koszt: {CURRENCY_LONG} Prędkość maksymalna: {VELOCITY} Zasięg: {COMMA} pól{}Ładowność: {CARGO_LONG}{}Koszt utrzymania: {CURRENCY_LONG}/rok +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Koszt: {CURRENCY_LONG} Prędkość maksymalna: {VELOCITY}{}Ładowność: {CARGO_LONG}{}Koszt utrzymania: {CURRENCY_LONG}/rok +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Koszt: {CURRENCY_LONG} Max. prędkość: {VELOCITY}{}Typ samolotu: {STRING}{}Ładowność: {CARGO_LONG}, {CARGO_LONG}{}Koszt utrzymania: {CURRENCY_LONG}/rok +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Koszt: {CURRENCY_LONG} Max. prędkość: {VELOCITY}{}Typ samolotu: {STRING}{}Ładowność: {CARGO_LONG}{}Koszt utrzymania: {CURRENCY_LONG}/rok +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Koszt: {CURRENCY_LONG} Max. prędkość: {VELOCITY}{}Typ samolotu: {STRING} Zasięg: {COMMA}{}Ładowność: {CARGO_LONG}, {CARGO_LONG}{}Koszt utrzymania: {CURRENCY_LONG}/rok +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Koszt: {CURRENCY_LONG} Max. prędkość: {VELOCITY}{}Typ samolotu: {STRING} Zasięg: {COMMA}{}Ładowność: {CARGO_LONG}{}Koszt utrzymania: {CURRENCY_LONG}/rok # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Zastąp {STRING} - {STRING} @@ -3927,7 +3949,7 @@ STR_REPLACE_VEHICLE_AIRCRAFT :Samolot STR_REPLACE_VEHICLE_VEHICLES_IN_USE :{YELLOW}Używane pojazdy STR_REPLACE_VEHICLE_VEHICLES_IN_USE_TOOLTIP :{BLACK}Lista posiadanych pojazdów -STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES :{BLACK}Dostępne pojazdy +STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES :{YELLOW}Dostępne pojazdy STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES_TOOLTIP :{BLACK}Lista pojazdów dostępnych do zamiany STR_REPLACE_HELP_LEFT_ARRAY :{BLACK}Wybierz typ pojazdu do zamiany @@ -3943,10 +3965,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} kiedy STR_REPLACE_VEHICLES_STOP :{BLACK}Zatrzymaj zastępowanie STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Wciśnij ten przycisk jeśli nie chcesz zmieniać pojazdu zaznaczone po lewej stronie -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Zastępowanie: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Przejdź pomiędzy oknami zamiany lokomotyw i wagonów STR_REPLACE_ENGINES :Lokomotywy STR_REPLACE_WAGONS :Wagony +STR_REPLACE_ALL_RAILTYPE :Wszystkie pojazdy szynowe STR_REPLACE_HELP_RAILTYPE :{BLACK}Wybierz dla jakiego typu torów chcesz zastąpić lokomotywy STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Wyświetla typ pojazdu na jaki będzie zastąpiony pojazd zaznaczony po lewej stronie @@ -4039,7 +4061,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} {P rok STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} {P rok lata lat} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Prędkość maksymalna: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Prędkość maksymalna: {LTBLUE}{VELOCITY} {BLACK}Zasięg: {LTBLUE}{COMMA} pól +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Max. prędkość: {LTBLUE}{VELOCITY} {BLACK}Typ samolotu: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Max. prędkość: {LTBLUE}{VELOCITY} {BLACK}Typ samolotu: {LTBLUE}{STRING} {BLACK}Zasięg: {LTBLUE}{COMMA} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Masa: {LTBLUE}{WEIGHT_SHORT} {BLACK}Moc: {LTBLUE}{POWER}{BLACK} Prędkość maksymalna: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Masa: {LTBLUE}{WEIGHT_SHORT} {BLACK}Moc: {LTBLUE}{POWER}{BLACK} Prędkość maksymalna: {LTBLUE}{VELOCITY} {BLACK}Maksymalna siła pociągowa: {LTBLUE}{FORCE} @@ -4131,9 +4154,9 @@ STR_ORDERS_END_OF_SHARED_ORDERS :- - Koniec wsp # Order bottom buttons STR_ORDER_NON_STOP :{BLACK}Non-stop STR_ORDER_GO_TO :Idź do -STR_ORDER_GO_NON_STOP_TO :Idź bez przerwy do +STR_ORDER_GO_NON_STOP_TO :Idź bezpośrednio do STR_ORDER_GO_VIA :Idź przez -STR_ORDER_GO_NON_STOP_VIA :Idź bez przerwy przez +STR_ORDER_GO_NON_STOP_VIA :Idź bezpośrednio poprzez STR_ORDER_TOOLTIP_NON_STOP :{BLACK}Zmień sposób przejazdu w podświetlonym poleceniu STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}Pełny załadunek któregoś z towarów @@ -4144,9 +4167,9 @@ STR_ORDER_DROP_NO_LOADING :Nie ładować STR_ORDER_TOOLTIP_FULL_LOAD :{BLACK}Zmień sposób załadunku w podświetlonym poleceniu STR_ORDER_TOGGLE_UNLOAD :{BLACK}Rozładuj i załaduj -STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :Wyładuj jeśli akceptowane -STR_ORDER_DROP_UNLOAD :Rozładuj i załaduj -STR_ORDER_DROP_TRANSFER :Przeładunek +STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :Rozładuj jeśli akceptowane +STR_ORDER_DROP_UNLOAD :Rozładuj wszystko +STR_ORDER_DROP_TRANSFER :Pozostaw do przeładunku STR_ORDER_DROP_NO_UNLOADING :Nie rozładowuj STR_ORDER_TOOLTIP_UNLOAD :{BLACK}Zmień sposób wyładunku w podświetlonym poleceniu @@ -4182,7 +4205,7 @@ STR_ORDER_CONDITIONAL_COMPARATOR_LESS_EQUALS :mniejszy lub r STR_ORDER_CONDITIONAL_COMPARATOR_MORE_THAN :większy niż STR_ORDER_CONDITIONAL_COMPARATOR_MORE_EQUALS :większy lub równy STR_ORDER_CONDITIONAL_COMPARATOR_IS_TRUE :prawda -STR_ORDER_CONDITIONAL_COMPARATOR_IS_FALSE :fałsz +STR_ORDER_CONDITIONAL_COMPARATOR_IS_FALSE :nie prawda STR_ORDER_CONDITIONAL_VALUE_TOOLTIP :{BLACK}Wartość do porównania z danymi pojazdu STR_ORDER_CONDITIONAL_VALUE_CAPT :{WHITE}Podaj wartość do porównania @@ -4207,15 +4230,15 @@ STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Pokaż w # String parts to build the order string STR_ORDER_GO_TO_WAYPOINT :Idź przez {WAYPOINT} -STR_ORDER_GO_NON_STOP_TO_WAYPOINT :Idź bez zatrzymywania przez {WAYPOINT} +STR_ORDER_GO_NON_STOP_TO_WAYPOINT :Idź bezpośrednio poprzez {WAYPOINT} STR_ORDER_SERVICE_AT :Serwisuj w STR_ORDER_SERVICE_NON_STOP_AT :Serwisuj non-stop w -STR_ORDER_NEAREST_DEPOT :najbliższych -STR_ORDER_NEAREST_HANGAR :najbliższy hangar -STR_ORDER_TRAIN_DEPOT :Warsztatów -STR_ORDER_ROAD_VEHICLE_DEPOT :Zajezdni samochodowej +STR_ORDER_NEAREST_DEPOT :najbliższego +STR_ORDER_NEAREST_HANGAR :najbliższego hangaru +STR_ORDER_TRAIN_DEPOT :serwisu w warsztatach +STR_ORDER_ROAD_VEHICLE_DEPOT :serwisu w zajezdni STR_ORDER_SHIP_DEPOT :Doku STR_ORDER_GO_TO_NEAREST_DEPOT_FORMAT :{STRING} {STRING} {STRING} STR_ORDER_GO_TO_DEPOT_FORMAT :{STRING} {DEPOT} @@ -4226,7 +4249,7 @@ STR_ORDER_STOP_ORDER :(Stop) STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} -STR_ORDER_IMPLICIT :(Sugerujący) +STR_ORDER_IMPLICIT :(sugerowany) STR_ORDER_FULL_LOAD :(Pełny załadunek) STR_ORDER_FULL_LOAD_ANY :(Pełny załadunek dowolnego towaru) @@ -4267,7 +4290,7 @@ STR_ORDER_OUT_OF_RANGE :{RED} (Kolejny STR_ORDER_CONDITIONAL_UNCONDITIONAL :Skocz do rozkazu {COMMA} STR_ORDER_CONDITIONAL_NUM :Skocz do rozkazu {COMMA} kiedy {STRING} {STRING} {COMMA} -STR_ORDER_CONDITIONAL_TRUE_FALSE :Skocz do rozkazu {COMMA} kiedy {STRING} {STRING} +STR_ORDER_CONDITIONAL_TRUE_FALSE :Skocz do rozkazu {0:COMMA} kiedy {2:STRING} że {1:STRING} STR_INVALID_ORDER :{RED} (Błędne polecenie) @@ -4598,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... @@ -4606,6 +4628,7 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... ta d STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... droga jest zorientowana w złym kierunku STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... przystanki przelotowe nie mogą mieć zakrętów STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... przystanki przelotowe nie mogą mieć skrzyżowań +STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... droga jest jednokierunkowa lub zablokowana # Station destruction related errors STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Nie można usunąć części stacji... @@ -4626,15 +4649,15 @@ STR_ERROR_MUST_DEMOLISH_DOCK_FIRST :{WHITE}Należy STR_ERROR_MUST_DEMOLISH_AIRPORT_FIRST :{WHITE}Należy najpierw usunąć lotnisko # Waypoint related errors -STR_ERROR_WAYPOINT_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}Przylega do więcej niż jednego istniejącego pkt. orientacyjnego -STR_ERROR_TOO_CLOSE_TO_ANOTHER_WAYPOINT :{WHITE}Zbyt blisko innego pkt. orientacyjnego +STR_ERROR_WAYPOINT_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}Przylega do więcej niż jednego istniejącego posterunku +STR_ERROR_TOO_CLOSE_TO_ANOTHER_WAYPOINT :{WHITE}Zbyt blisko innego posterunku STR_ERROR_CAN_T_BUILD_TRAIN_WAYPOINT :{WHITE}Nie można budować tutaj punktu orientacyjnego... STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Nie można tutaj ustawić boi... -STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Nie można zmienić nazwy pkt. orientacyjnego... +STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Nie można zmienić nazwy posterunku... -STR_ERROR_CAN_T_REMOVE_TRAIN_WAYPOINT :{WHITE}Nie można usunąć stąd kolejowego punktu orientacyjnego... -STR_ERROR_MUST_REMOVE_RAILWAYPOINT_FIRST :{WHITE}Musisz usunąć najpierw punkt nawigacyjny +STR_ERROR_CAN_T_REMOVE_TRAIN_WAYPOINT :{WHITE}Nie można usunąć stąd posterunku kolejowego... +STR_ERROR_MUST_REMOVE_RAILWAYPOINT_FIRST :{WHITE}Musisz usunąć najpierw posterunek kolejowy STR_ERROR_BUOY_IN_THE_WAY :{WHITE}... boja na drodze STR_ERROR_BUOY_IS_IN_USE :{WHITE}... boja w użyciu przez inna firmę! @@ -4857,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 @@ -5288,8 +5313,8 @@ STR_FORMAT_WAYPOINT_NAME_SERIAL :Post. {TOWN} #{ STR_FORMAT_DEPOT_NAME_TRAIN :Warsztaty {TOWN} STR_FORMAT_DEPOT_NAME_TRAIN_SERIAL :Warsztaty {TOWN} #{COMMA} -STR_FORMAT_DEPOT_NAME_ROAD_VEHICLE :Zajezdnia samochodowa {TOWN} -STR_FORMAT_DEPOT_NAME_ROAD_VEHICLE_SERIAL :Zajezdnia samochodowa {TOWN} #{COMMA} +STR_FORMAT_DEPOT_NAME_ROAD_VEHICLE :Zajezdnia {TOWN} +STR_FORMAT_DEPOT_NAME_ROAD_VEHICLE_SERIAL :Zajezdnia {TOWN} #{COMMA} STR_FORMAT_DEPOT_NAME_SHIP :Stocznia {TOWN} STR_FORMAT_DEPOT_NAME_SHIP_SERIAL :Stocznia {TOWN} #{COMMA} STR_FORMAT_DEPOT_NAME_AIRCRAFT :Hangar {STATION} diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 9f3694ac9b..d9c00b1101 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -670,10 +670,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Seleccio STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Ligar/Desligar programa aleatório STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Mostrar janela de selecção de faixas de música -STR_ERROR_NO_SONGS :{WHITE}Um conjunto de música vazio foi seleccionado. Nenhuma música vai ser tocada. - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Programação Musical 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}' @@ -845,6 +842,7 @@ STR_NEWS_VEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}{VEHICLE STR_NEWS_VEHICLE_HAS_VOID_ORDER :{WHITE}{VEHICLE} tem uma ordem nula STR_NEWS_VEHICLE_HAS_DUPLICATE_ENTRY :{WHITE}{VEHICLE} tem ordens duplicadas STR_NEWS_VEHICLE_HAS_INVALID_ENTRY :{WHITE}{VEHICLE} tem uma ordem inválida no seu horário +STR_NEWS_PLANE_USES_TOO_SHORT_RUNWAY :{WHITE}{VEHICLE} tem um aeroporto nas ordens cuja pista de aterragem é muito curta STR_NEWS_VEHICLE_IS_GETTING_OLD :{WHITE}{VEHICLE} está a ficar velho STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE} está a ficar muito velho @@ -1198,9 +1196,9 @@ STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT_HELPTEXT :Altura máxima STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH :Tamanho máximo de túneis: {STRING} STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH_HELPTEXT :Tamanho máximo para construção de túneis STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD :Método de financiamento de indústrias primárias: {STRING} -STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_HELPTEXT :Método de financiar uma indústria pirmária. 'nenhum' significa que não é possível financiar nenhuma, 'prospecção' significa que é possível financiar, mas a construção é feita num local arbitrário no mapa e até pode falhar, 'como outras indústrias' significa que as indústrias de matérias primas podem ser construídas por companhias como indústrias de processamento em qualquer sítio que elas escolham +STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_HELPTEXT :Método de financiar uma indústria primária. 'nenhum' significa que não é possível financiar nenhuma, 'prospecção' significa que é possível financiar, mas a construção é feita num local arbitrário no mapa e até pode falhar, 'como as outras' significa que as indústrias de matérias primas podem ser construídas em qualquer sítio pelas empresas, como se fossem indústrias de processamento STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE :Nenhum -STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_NORMAL :Mesmo método +STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_NORMAL :Como as outras STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_PROSPECTING :Prospecção STR_CONFIG_SETTING_INDUSTRY_PLATFORM :Área plana à volta das industrias: {STRING} STR_CONFIG_SETTING_INDUSTRY_PLATFORM_HELPTEXT :Quantidade de terreno plano á volta de uma industria. Isto garante que terreno vazio esteja disponível para construir linhas, etc @@ -1288,17 +1286,21 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Mostrar a popul STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Grossura das linhas nos gráficos: {STRING} STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Largura da linha nos gráficos. Uma linha mais estreita é de leitura mais precisa, enquanto uma linha mais espessa é mais fácil de ver e as cores distinguem-se melhor. -STR_CONFIG_SETTING_LAND_GENERATOR :Gerador de terra: {STRING} +STR_CONFIG_SETTING_LANDSCAPE :Cenário: {STRING} +STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Os estilos dos cenários definem a jogabilidade base, cada um com cargas e requerimentos diferentes para o desenvolvimento das cidades. NewGRF e Scripts de Jogo permitem um controlo mais refinado +STR_CONFIG_SETTING_LAND_GENERATOR :Gerador de terreno: {STRING} +STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT :O gerador original é dependente do conjunto gráfico base, e compõe formas de terreno já afixadas. TerraGenesis é um gerador baseado no algoritmo de ruído de Perlin que permite definições mais refinadas STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Original STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_TERRAIN_TYPE :Tipo de terreno: {STRING} +STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(Apenas TerraGenesis) Relevo do terreno STR_CONFIG_SETTING_INDUSTRY_DENSITY :Densidade industrial: {STRING} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Define quantas indústrias devem ser geradas e que nível deve ser mantido durante o jogo STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Distância máxima entre o limite do mapa e Refinarias de Petróleo: {STRING} STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Refinarias de petróleo são construídas apenas próximo da borda do mapa, isto é, na costa para mapas de ilha STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Altura da linha de neve: {STRING} STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Controla a que altura a neve começa em paisagens sub-árticas. A neve também afecta a geração de indústrias e os requisitos de crescimento das cidades -STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Rudeza do terreno (apenas TerraGenesis) : {STRING} +STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Rudeza do terreno: {STRING} STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(Apenas TerraGenesis) Escolhe a frequência de montes: paisagens macias têm menos montes e mais espalhados. Paisagens duras têm muitos montes, que podem parecer repetitivos STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Muito suave STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Suave @@ -1333,8 +1335,6 @@ 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_REVERSE_SCROLLING :Ao deslizar com o rato, mover a vista na direcção oposta: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Comportamento ao navegar pelo mapa com o botão direito do rato. Quando desactivado, o rato move a câmara. Quando activo, o rato move o mapa STR_CONFIG_SETTING_SMOOTH_SCROLLING :Suavizar deslocamento da navegação no mapa: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Controla como a vista principal navega para uma posição específica ao clicar no mapa pequeno ou ao dar um comando para navegar para um objecto específico no mapa. Se activo, a vista principal navega suavemente, se inactivo a vista salta directamente para o destino. STR_CONFIG_SETTING_MEASURE_TOOLTIP :Mostrar medidas nas várias ferramentas de construção: {STRING} @@ -1366,8 +1366,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND : + Cli STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL : + clique STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Desligado -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Deslocar com botão esquerdo: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Activar deslocamento do mapa através de arrastamento com o botão esquerdo do rato. Esta opção é particularmente útil quando é usado um ecran de toque para deslocamento +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Fechar janelas ao fazer clique direito: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Fecha uma janela ao fazer clique direito dentro dela. Desactiva os textos de ajuda ao fazer clique direito! STR_CONFIG_SETTING_AUTOSAVE :Guardar automaticamente: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Seleccione o intervalo entre gravações automáticas @@ -1397,7 +1397,7 @@ STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Mostrar horári STR_CONFIG_SETTING_QUICKGOTO :Criação rápida de ordens de veículos: {STRING} STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT :Pré-seleccionar o 'cursor Ir Para' ao abrir a janela de ordens STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE :Tipo padrão de ferrovia (ao criar ou abrir jogo): {STRING} -STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Tipo de carrir seleccionado após o início ou carregamento de um jogo. 'primeiro disponível' selecciona o tipo mais antigo de carril, 'último disponível' selecciona o tipo mais recente de carril e 'mais utilizado' selecciona o tipo mais utilizado actualmente +STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Tipo de carril seleccionado após o início ou carregamento de um jogo. 'primeiro disponível' selecciona o tipo mais antigo de carril, 'último disponível' selecciona o tipo mais recente de carril e 'mais utilizado' selecciona o tipo mais utilizado actualmente STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :Primeiro disponível STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_LAST :Último disponível STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_MOST_USED :Mais utilizado @@ -1597,8 +1597,8 @@ STR_CONFIG_SETTING_LARGER_TOWNS :Proporção de STR_CONFIG_SETTING_LARGER_TOWNS_HELPTEXT :Quantidade de povoações que se tornarão cidades, logo cidades que começarão maiores e crescerão mais depressa STR_CONFIG_SETTING_LARGER_TOWNS_VALUE :1 em {COMMA} STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Nenhum -STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Multiplicador inicial para dimensão da metrópole: {STRING} -STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Tamanho relativo das cidades em relação ao tamanho normal das mesmas aquando o inicio do jogo +STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Multiplicador inicial para a dimensão das metrópoles: {STRING} +STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Tamanho relativo das metrópoles em relação ao tamanho normal das cidades aquando o início do jogo STR_CONFIG_SETTING_LINKGRAPH_INTERVAL :Actualizar gráfico de distribuição a cada {STRING} dia{P 0:2 "" s} STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT :Tempo entre recalculos subsequentes de cada gráfico. Cada recalculo calcula os planos para cada componente do gráfico. Isto significa que um valor X para essa configuração não indica que o gráfico será todo actualizado a cada X dias. Apenas alguns componentes serão. Quanto mais curto o definir, mais tempo será necessário ao CPU para o calcular. Quanto mais longo, mais tempo levará até que a distribuição da carga inicie em novas rotas. @@ -1661,11 +1661,23 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Métrico (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) STR_CONFIG_SETTING_LOCALISATION :{ORANGE}Localização +STR_CONFIG_SETTING_GRAPHICS :{ORANGE}Gráficos STR_CONFIG_SETTING_SOUND :{ORANGE}Efeitos sonoros STR_CONFIG_SETTING_INTERFACE :{ORANGE}Interface +STR_CONFIG_SETTING_INTERFACE_GENERAL :{ORANGE}Geral +STR_CONFIG_SETTING_INTERFACE_VIEWPORTS :{ORANGE}Visualizadores STR_CONFIG_SETTING_INTERFACE_CONSTRUCTION :{ORANGE}Construção +STR_CONFIG_SETTING_ADVISORS :{ORANGE}Notícias / Assessores +STR_CONFIG_SETTING_COMPANY :{ORANGE}Empresa +STR_CONFIG_SETTING_ACCOUNTING :{ORANGE}Contabilidade STR_CONFIG_SETTING_VEHICLES :{ORANGE}Veículos +STR_CONFIG_SETTING_VEHICLES_PHYSICS :{ORANGE}Física STR_CONFIG_SETTING_VEHICLES_ROUTING :{ORANGE}Em rota +STR_CONFIG_SETTING_LIMITATIONS :{ORANGE}Limitações +STR_CONFIG_SETTING_ACCIDENTS :{ORANGE}Desastres / Acidentes +STR_CONFIG_SETTING_GENWORLD :{ORANGE}Geração do mundo +STR_CONFIG_SETTING_ENVIRONMENT :{ORANGE}Meio Ambiente +STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :{ORANGE}Autoridades STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :{ORANGE}Cidades STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}Industrias STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}Distribuição de Carga @@ -1739,12 +1751,13 @@ STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Seleccio STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Mostrar opções de jogo STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Mostrar tabela de classificações -STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Definições de Display +STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Mostrar definições STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Mostrar definições de NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Verificar conteúdo novo e actualizado para descarga STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Mostrar definições de IA e de script de jogo STR_INTRO_TOOLTIP_QUIT :{BLACK}Sair de 'OpenTTD' +STR_INTRO_BASESET :{BLACK}O conjunto de gráficos base seleccionado tem {NUM} sprite{P "" s} em falta. Por favor verifique se existem atualizações para o conjunto. STR_INTRO_TRANSLATION :{BLACK}Faltam {NUM} string{P "" s} nesta tradução. Ajude o OpenTTD em inscrever-se como tradutor. Leia readme.txt para mais detalhes. # Quit window @@ -1820,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 @@ -2573,6 +2586,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Nome do STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Carga aceite: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Tipo de carril: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Limite de velocidade da linha: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Limite de velocidade da estrada: {LTBLUE}{VELOCITY} @@ -2585,29 +2599,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Campos STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Neve STR_LAI_CLEAR_DESCRIPTION_DESERT :Deserto -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} linha -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} linha com sinais de bloqueio -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} linha com pre-sinais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} linha com sinais de saída -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} linha com sinais combinados -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} linha com sinais de caminho -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} linha com sinais de sentido único -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} linha com bloqueio e pré-sinais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} linha com bloqueio e sinais de saida -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} linha com bloqueio e sinais combinados -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} linha com bloqueio e sinais de rota -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} linha com bloqueio e sinais de sentido único -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} linha com pré-sinais e sinais de saida -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} linha com pré-sinais e sinais combinados -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} linha com pré-sinais e sinais de rota -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} linha com pré-sinais e sinais de sentido único -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} linha com sinais de saida e sinais combinados -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} linha com sinais de saida e sinais de rota -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} linha com sinais de saida e de sentido único -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} linha com sinais combinados e sinais de rota -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} linha com sinais combinados e sentido unico -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} linha com sinais de rota e de sentido unico -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} depósito de comboios +STR_LAI_RAIL_DESCRIPTION_TRACK :Linha de caminhos-de-ferro +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Linha de caminhos-de-ferro com sinais de bloqueio +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Linha de caminhos-de-ferro com pre-sinais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Linha de caminhos-de-ferro com sinais de saída +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Linha de caminhos-de-ferro com sinais combinados +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Linha de caminhos-de-ferro com sinais de rota +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Linha de caminhos-de-ferro com sinais de sentido único +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Linha de caminhos-de-ferro com sinais de bloqueio e pré-sinais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Linha de caminhos-de-ferro com sinais de bloqueio e de saida +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Linha de caminhos-de-ferro com sinais de bloqueio e combinados +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Linha de caminhos-de-ferro com sinais de bloqueio e de rota +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Linha de caminhos-de-ferro com sinais de bloqueio e de sentido único +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Linha de caminhos-de-ferro com pré-sinais e sinais de saida +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Linha de caminhos-de-ferro com pré-sinais e sinais combinados +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Linha de caminhos-de-ferro com pré-sinais e sinais de rota +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Linha de caminhos-de-ferro com pré-sinais e sinais de sentido único +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Linha de caminhos-de-ferro com sinais de saida e combinados +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Linha de caminhos-de-ferro com sinais de saida e de rota +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Linha de caminhos-de-ferro com sinais de saida e de sentido único +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Linha de caminhos-de-ferro com sinais combinados e de rota +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Linha de caminhos-de-ferro com sinais combinados e de sentido único +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Linha de caminhos-de-ferro com sinais de rota e de sentido único +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Depósito de comboios de caminhos-de-ferro STR_LAI_ROAD_DESCRIPTION_ROAD :Estrada STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Estrada com iluminação @@ -2671,7 +2685,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Terreno proprie STR_ABOUT_OPENTTD :{WHITE}Sobre o OpenTTD... STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Direitos de autor originais {COPYRIGHT} 1995 Chris Sawyer, Todos os direitos reservados STR_ABOUT_VERSION :{BLACK}OpenTTD versão {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 A equipa do OpenTTD +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 @@ -2825,7 +2846,7 @@ STR_SAVE_PRESET_LIST_TOOLTIP :{BLACK}Lista de STR_SAVE_PRESET_TITLE :{BLACK}Intriduza um nome para a predefinição STR_SAVE_PRESET_EDITBOX_TOOLTIP :{BLACK}Nome seleccionado actualmente para gravação da predefinição STR_SAVE_PRESET_CANCEL :{BLACK}Cancelar -STR_SAVE_PRESET_CANCEL_TOOLTIP :Não mudar a predefinição +STR_SAVE_PRESET_CANCEL_TOOLTIP :{BLACK}Não mudar a predefinição STR_SAVE_PRESET_SAVE :{BLACK}Grava STR_SAVE_PRESET_SAVE_TOOLTIP :{BLACK}Grava a predefinição com o nome seleccionado @@ -2858,7 +2879,11 @@ STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Ir para STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Gráfico anterior STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Proceder ao gráfico normal anterior, ignorando quaisquer gráficos pseudo/recolorir/tipo-de-letra e dando a volta no início STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Representação do gráfico seleccionado actualmente. O alinhamento é ignorado a desenhar este gráfico -STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Mover o gráfico, mudando os desvios X e Y +STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Desloca o gráfico, alterando os intervalos X e Y. Ctrl+Clique desloca o gráfico 8 unidades de uma só vez +STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Repor relativo +STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Repor intervalos relativos atuais +STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Intervalo X: {NUM}, Intervalo Y: {NUM} (Absoluto) +STR_SPRITE_ALIGNER_OFFSETS_REL :{BLACK}Intervalo X: {NUM}, Intervalo Y: {NUM} (Relativo) STR_SPRITE_ALIGNER_PICKER_BUTTON :{BLACK}Escolher gráfico STR_SPRITE_ALIGNER_PICKER_TOOLTIP :{BLACK}Escolha um gráfico de qualquer lado no ecrã @@ -2886,8 +2911,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Tentativa de us STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} contém um objecto gráfico corrompido. Todos os objectos gráficos corrompidos serão apresentados como um ponto de interrogação (?) vermelho. STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Contém múltiplas entradas Action 8 - (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Leitura além dos limites do pseudo-sprite (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}O conjunto de gráficos base actual tem objectos gráficos em falta.{}Por favor faça a sua actualização. -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}O conjunto de gráficos base actualmente em uso tem um conjunto de gráficos em falta.{}Por favor actualize o conjunto de gráficos base.{}Visto que está a usar uma {YELLOW}imagem de desenvolvimento do OpenTTD{WHITE}, poderá também precisar de {YELLOW}uma imagem dos gráficos base de desenvolvimento{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Recursos GRF pedidos não disponíveis (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} foi desactivado por {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Formato de Gráfico Inválido ou desconhecido (sprite {3:NUM}) @@ -2962,8 +2985,6 @@ STR_TOWN_POPULATION :{BLACK}Populaç STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Metrópole) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}População: {ORANGE}{COMMA}{BLACK} Casas: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Passageiros no último mês: {ORANGE}{COMMA}{BLACK} máx: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Correio no último mês: {ORANGE}{COMMA}{BLACK} máx: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Mercadoria necessária para o seu desenvolvimento: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{RED}É necessário {ORANGE}{STRING} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{BLACK}No inverno, é necessário {ORANGE}{STRING} @@ -3094,8 +3115,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Aceita STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Mostrar lista de carga aceite STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Aceita: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Esta estação tem direitos de transporte exclusivos nesta cidade. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} comprou direitos exclusivos de transporte nesta cidade. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Esta estação tem direitos de transporte exclusivos nesta cidade. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} comprou direitos exclusivos de transporte nesta cidade. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Avaliações STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Mostrar avaliações da estação @@ -3274,9 +3295,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Necessá STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Necessário: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Requer: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} a aguardar{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Carga aguardando processamento: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produz: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Produz: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3336,12 +3359,18 @@ STR_GROUP_RENAME_TOOLTIP :{BLACK}Mudar o STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Clique para proteger este grupo da autosubstituição global STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Apagar Grupo +STR_GROUP_DELETE_QUERY_TEXT :{WHITE}Tem a certeza de que quer apagar este grupo e quaisquer descendentes? STR_GROUP_ADD_SHARED_VEHICLE :Adic. veíc. partilh. STR_GROUP_REMOVE_ALL_VEHICLES :Remover todos os veículos STR_GROUP_RENAME_CAPTION :{BLACK}Renomear um grupo +STR_GROUP_PROFIT_THIS_YEAR :Lucro deste ano: +STR_GROUP_PROFIT_LAST_YEAR :Lucro no último ano: +STR_GROUP_OCCUPANCY :Utilização actual: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Novos Veículos Ferroviários STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Novos comboios para carris electrificados @@ -3373,6 +3402,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Todos os tipos STR_PURCHASE_INFO_ALL_BUT :Todas menos {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Máx. Força de Tracção: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Alcance: {GOLD}{COMMA} quadrados +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Tipo de aeronave: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista de veículos ferroviários - clique num veículo para informações STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Lista de veículos rodoviários - clique num veículo para informações @@ -3504,12 +3534,13 @@ STR_ENGINE_PREVIEW_SHIP :barco STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :locomotiva monocarril STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :locomotiva maglev -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Custo: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocidade: {VELOCITY} Potência: {POWER}{}Custo de circulação: {CURRENCY_LONG}/ano{}Capacidade: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Custo: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocidade: {VELOCITY} Potência: {POWER} Máx. F.T.: {6:FORCE}{}Custo de circulação: {4:CURRENCY_LONG}/ano{}Capacidade: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Máx. Velocidade: {VELOCITY}{}Capacidade: {CARGO_LONG}, {CARGO_LONG}{}Custo de circulação: {CURRENCY_LONG}/ano -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Máx. Velocidade: {VELOCITY}{}Capacidade: {CARGO_LONG}{}Custo de circulação: {CURRENCY_LONG}/ano -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Preço: {CURRENCY_LONG} Velocidade max.: {VELOCITY} Alcance: {COMMA} quadrados{}Capacidade: {CARGO_LONG}, {CARGO_LONG}{}Custo de manutenção: {CURRENCY_LONG}/ano -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Preço: {CURRENCY_LONG} Velocidade max.: {VELOCITY} Alcance: {COMMA} quadrados{}Capacidade: {CARGO_LONG}{}Custo de manutenção: {CURRENCY_LONG}/ano +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Custo: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocidade Máx.: {VELOCITY} Potência: {POWER}{}Custo de Circulação: {CURRENCY_LONG}/ano{}Capacidade: {CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Custo: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocidade Máx.: {VELOCITY} Potência: {POWER} F.T. Máx.: {6:FORCE}{}Custo de Circulação: {4:CURRENCY_LONG}/ano{}Capacidade: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Velocidade Máx.: {VELOCITY}{}Capacidade: {CARGO_LONG}{}Custo de Circulação: {CURRENCY_LONG}/ano +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Velocidade Máx.: {VELOCITY}{}Tipo de Aeronave: {STRING}{}Capacidade: {CARGO_LONG}, {CARGO_LONG}{}Custo de Circulação: {CURRENCY_LONG}/ano +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Velocidade Máx.: {VELOCITY}{}Tipo de Aeronave: {STRING}{}Capacidade: {CARGO_LONG}{}Custo de Circulação: {CURRENCY_LONG}/ano +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Velocidade Máx.: {VELOCITY}{}Tipo de Aeronave: {STRING} Alcance: {COMMA} quadrados{}Capacidade: {CARGO_LONG}, {CARGO_LONG}{}Custo de Circulação: {CURRENCY_LONG}/ano +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Custo: {CURRENCY_LONG} Velocidade Máx.: {VELOCITY}{}Tipo de Aeronave: {STRING} Alcance: {COMMA} quadrados{}Capacidade: {CARGO_LONG}{}Custo de Circulação: {CURRENCY_LONG}/ano # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Substituir {STRING} - {STRING} @@ -3536,10 +3567,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} quando STR_REPLACE_VEHICLES_STOP :{BLACK}Parar Subst. de Veículos STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Pressione para parar a subsituição do tipo de motor que seleccionou à esquerda -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Trocando: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Alternar entre a janela de substituição de locomotivas e a janela de substituição de vagões STR_REPLACE_ENGINES :Locomotivas STR_REPLACE_WAGONS :Vagões +STR_REPLACE_ALL_RAILTYPE :Todos os veículos ferroviários STR_REPLACE_HELP_RAILTYPE :{BLACK}Seleccione o tipo de carril para o qual deseja efectuar a substituição dos motores STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Exibe o tipo de motor que substituirá o que está seleccionado à esquerda, se algum @@ -3632,7 +3663,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} ano{P " STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} ano{P "" s} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Máx. velocidade: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Velocidade max.: {LTBLUE}{VELOCITY} {BLACK}Alcance: {LTBLUE}{COMMA} quadrados +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Vel. máxima: {LTBLUE}{VELOCITY} {BLACK}Tipo de Aeronave: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Velocidade Máx.: {LTBLUE}{VELOCITY} {BLACK}Tipo de Aeronave: {LTBLUE}{STRING} {BLACK}Alcance: {LTBLUE}{COMMA} quadrados STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potência: {LTBLUE}{POWER}{BLACK} Max. velocidade: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potência: {LTBLUE}{POWER}{BLACK} Máx. velocidade: {LTBLUE}{VELOCITY} {BLACK}Máx. E.T.: {LTBLUE}{FORCE} @@ -3877,6 +3909,10 @@ STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :Viagem (sem pro STR_TIMETABLE_TRAVEL_NOT_TIMETABLED_SPEED :Viajar no máximo a {2:VELOCITY} (sem programação) STR_TIMETABLE_TRAVEL_FOR :Viajar durante {STRING} STR_TIMETABLE_TRAVEL_FOR_SPEED :Viajar por {STRING} no máximo a {VELOCITY} +STR_TIMETABLE_TRAVEL_FOR_ESTIMATED :Viajar (durante {STRING}, sem programação) +STR_TIMETABLE_TRAVEL_FOR_SPEED_ESTIMATED :Viajar (por {STRING}, sem programação) no máximo a {VELOCITY} +STR_TIMETABLE_STAY_FOR_ESTIMATED :(permanecer durante {STRING}, sem programação) +STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(viajar durante {STRING}, sem programação) STR_TIMETABLE_STAY_FOR :e ficar durante {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :e viaja para {STRING} STR_TIMETABLE_DAYS :{COMMA} dia{P "" s} @@ -3999,7 +4035,7 @@ STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Script de Jogo STR_AI_SETTINGS_CLOSE :{BLACK}Fechar STR_AI_SETTINGS_RESET :{BLACK}Repor STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} -STR_AI_SETTINGS_START_DELAY :Número de dias para iniciar esta IA depois da anterior (tomar ou lorgar): {ORANGE}{STRING} +STR_AI_SETTINGS_START_DELAY :Número de dias para iniciar esta IA depois da anterior (aproximadamente): {ORANGE}{STRING} # Textfile window @@ -4187,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 ddf6b20a1c..6b891bb7e8 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -669,10 +669,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Selectea STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Comutator pentru amestecarea melodiilor (pornit/oprit) STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Afişeaza fereastra pentru selecţia melodiilor -STR_ERROR_NO_SONGS :{WHITE}A fost selectat un set de muzică fără melodii. Nici o melodie nu va fi cântată - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Programare piese muzicale STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Lista melodiilor STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Program - '{STRING}' @@ -1100,6 +1097,7 @@ STR_CONFIG_SETTING_TYPE_GAME_INGAME :Setări joc (st STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Setări companie (stocate în fişierele de salvare; afectează doar jocurile noi) STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Setări companie (stocate în fişierul de salvare; afectează doar compania curentă) +STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK}Categorie: STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}Arată în lista de mai jos doar setările modificate STR_CONFIG_SETTING_RESTRICT_BASIC :Setări de bază (afişează numai setări importante) STR_CONFIG_SETTING_RESTRICT_ADVANCED :Setări avansate (afişează majoritatea setărilor) @@ -1114,6 +1112,7 @@ STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_MENU :Setări joc (st STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME :Setări joc (stocate în salvări; afectează doar jocul curent) STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Setări companie (stocate în salvări; afectează doar jocurile noi) STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Setări compenia (stocate în salvări; afectează doar compania curentă) +STR_CONFIG_SETTINGS_NONE :{WHITE}- Nespecificat - STR_CONFIG_SETTING_OFF :Inactiv STR_CONFIG_SETTING_ON :Activ @@ -1280,18 +1279,25 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Afișează popu STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Grosimea liniilor din grafice: {STRING} STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Grosimea liniilor din grafice. O linie subțire este mai informativă, o linie mai groasă este mai ușor de văzut și are culorile mai usor de distins +STR_CONFIG_SETTING_LANDSCAPE :Peisaj: {STRING} +STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Peisajele definesc scenariile de bază a jocului cu cerințe diferite pentru încărcături și dezvoltare a orașelor. NewGRF și scripturile de joc permit un control mai fin STR_CONFIG_SETTING_LAND_GENERATOR :Generator teren: {STRING} STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Original STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis +STR_CONFIG_SETTING_TERRAIN_TYPE :Tip teren: {STRING} +STR_CONFIG_SETTING_INDUSTRY_DENSITY :Densitatea industriei: {STRING} STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Distanța maximă de la marginea hărții pentru rafinării: {STRING} STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Rafinăriile de petrol vor fi construite doar la marginea hărţii, sau pe coastă, în cazul harţilor insulare STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Grosimea stratului de zăpadă: {STRING} STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Duritatea terenului (doar pt TerraGenesis) : {STRING} +STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(Doar TerraGenesis) Alegeți frecvența dealurilor: Peisajele line au dealuri mai puține și mai întinse. Peisajele dure au multe dealuri și pot arăta repetitiv STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Foarte fin STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Fin STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Dur STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Foarte dur +STR_CONFIG_SETTING_VARIETY :Distribuția varietății: {STRING} STR_CONFIG_SETTING_TREE_PLACER :Algoritm amplasare arbori: {STRING} +STR_CONFIG_SETTING_TREE_PLACER_HELPTEXT :Alegeți distribuția copacilor pe hartă: 'Original' plantează copacii dispersați uniform, 'Îmbunătățit' îi plantează grupat STR_CONFIG_SETTING_TREE_PLACER_NONE :Niciunul STR_CONFIG_SETTING_TREE_PLACER_ORIGINAL :Original STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Îmbunătăţit @@ -1313,8 +1319,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Culoarea terenu STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Verde STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Verde închis STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Mov -STR_CONFIG_SETTING_REVERSE_SCROLLING :Inversează direcţia de scroll: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Modul de funcționare in momentul folosirii butonului drept al mouse-ului pentru deplasare pe hartă. Când opțiunea este dezactivată, mouse-ul schimbă poziția camerei. La activare, mouse-ul desplasează harta. STR_CONFIG_SETTING_SMOOTH_SCROLLING :Derulare uşoară ecran: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Controlează modul de deplasare a imaginii din ecranul principal când se face click pe harta mică sau când se execută o comandă de deplasare către un obiect anume de pe hartă. Dacă este activată, imaginea se deplasează în mod fluid, altfel imaginea sare direct la zona dorită STR_CONFIG_SETTING_MEASURE_TOOLTIP :Arată o indicaţie de distanţă la folosirea uneltelor de construcţie: {STRING} @@ -1346,8 +1350,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Comandă+Click STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Control+Click STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Oprit -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Derulare ecran cu click-stânga: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Activează derularea hărții prin tragerea acesteia cu butonul stâng al mouse-ului. Această opțiune este în special utilă când se folosește un ecran tactil pentru deplasare STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Foloseşte formatul datei {STRING} pentru numele salvărilor @@ -1552,6 +1554,7 @@ STR_CONFIG_SETTING_SOFT_LIMIT :Numărul maxim STR_CONFIG_SETTING_SOFT_LIMIT_VALUE :{COMMA} STR_CONFIG_SETTING_SOFT_LIMIT_DISABLED :dezactivat STR_CONFIG_SETTING_ZOOM_MIN :Nivelul maxim de apropiere imagine: {STRING} +STR_CONFIG_SETTING_ZOOM_MIN_HELPTEXT :Nivelul maxim de apropiere a câmpului vizual. Luați aminte că nivelele înalte ridică necesarul de memorie STR_CONFIG_SETTING_ZOOM_MAX :Nivelul maxim de îndepărtare imagine: {STRING} STR_CONFIG_SETTING_ZOOM_LVL_MIN :x4 STR_CONFIG_SETTING_ZOOM_LVL_IN_2X :x2 @@ -1579,7 +1582,9 @@ STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :manual STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :asimetric STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :simetric STR_CONFIG_SETTING_DISTRIBUTION_PAX :Modalitatea de distribuire a pasagerilor: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"simetric" înseamnă că aproximativ același număr de pasageri va fi transportat din stația A spre stația B, precum de la B la A. "asimetric" presupune transportul unui număr arbitrar de pasageri în fiecare direcție. "manual" înseamnă că repartizarea pasagerilor nu va fi automatizată. STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Modalitatea de distribuire a poştei: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :"simetric" înseamnă că aproximativ aceeași cantitate de poștă va fi expediată din stația A spre stația B, precum de la B la A. "asimetric" presupune expedierea de cantități arbitrare de poștă în fiecare direcție. "manual" înseamnă că repartizarea poștei nu va fi automatizată. STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Modalitatea de distribuire pentru clasa de cargo BLINDAT: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Modalitatea de distribuire pentru alte clase de cargo: {STRING} STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Acurateţea distribuţiei: {STRING} @@ -1626,9 +1631,15 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) STR_CONFIG_SETTING_LOCALISATION :{ORANGE}Localizare STR_CONFIG_SETTING_SOUND :{ORANGE}Efecte sonore STR_CONFIG_SETTING_INTERFACE :{ORANGE}Interfaţă +STR_CONFIG_SETTING_INTERFACE_VIEWPORTS :{ORANGE}Câmpuri vizuale STR_CONFIG_SETTING_INTERFACE_CONSTRUCTION :{ORANGE}Construcţie +STR_CONFIG_SETTING_ADVISORS :{ORANGE}Știri / Consilieri +STR_CONFIG_SETTING_COMPANY :{ORANGE}Companie STR_CONFIG_SETTING_VEHICLES :{ORANGE}Vehicule STR_CONFIG_SETTING_VEHICLES_ROUTING :{ORANGE}Direcţionare +STR_CONFIG_SETTING_ACCIDENTS :{ORANGE}Dezastre / Accidente +STR_CONFIG_SETTING_GENWORLD :{ORANGE}Generare lume +STR_CONFIG_SETTING_ENVIRONMENT :{ORANGE}Mediu STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :{ORANGE}Oraşe STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}Industrii STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}Distribuţie cargo @@ -2537,6 +2548,7 @@ STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Încărcături acceptate: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Limită viteză pe calea ferată: {LTBLUE}{VELOCITY} +STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Viteza limită a drumului: {LTBLUE}{VELOCITY} # Description of land area of different tiles STR_LAI_CLEAR_DESCRIPTION_ROCKS :Stânci @@ -2547,29 +2559,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Teren agricol STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Teren înzăpezit STR_LAI_CLEAR_DESCRIPTION_DESERT :Deşert -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} cale ferată -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} cale ferată cu semafoare -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} cale ferată cu presemafoare -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} cale ferată cu semafoare de ieșire -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} cale ferată cu semafoare combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} cale ferată cu semafoare de direcționare -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} cale ferată cu semafoare de direcționare unidirecționale -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} cale ferată cu semafoare și presemafoare -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} cale ferată cu semafoare și semafoare de ieșire -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} cale ferată cu semafoare și semafoare combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} cale ferată cu semafoare și semafoare de direcționare -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} cale ferată cu semafoare și semafoare de direcționare unidirecționale -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} cale ferată cu presemafoare și semafoare de ieșire -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} cale ferată cu presemafoare și semafoare combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} cale ferată cu presemafoare și semafoare de direcționare -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} cale ferată cu presemafoare și semafoare de direcționare unidirecționale -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} cale ferată cu semafoare de ieșire și semafoare combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} cale ferată cu semafoare de ieșire și semafoare direcționale -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} cale ferată cu semafoare de ieșire și semafoare direcționale unidirecționale -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} cale ferată cu semafoare combo și semafoare direcționale -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} cale ferată cu semafoare combo și semafoare direcționale unidirecționale -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} cale ferată cu semafoare direcționale şi semafoare directionale unidirecționale -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} depou trenuri +STR_LAI_RAIL_DESCRIPTION_TRACK :Cale ferată cale ferată +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Cale ferată cale ferată cu semafoare +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Cale ferată cale ferată cu presemafoare +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Cale ferată cale ferată cu semafoare de ieșire +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Cale ferată cale ferată cu semafoare combo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Cale ferată cale ferată cu semafoare de direcționare +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Cale ferată cale ferată cu semafoare de direcționare unidirecționale +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Cale ferată cale ferată cu semafoare și presemafoare +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Cale ferată cale ferată cu semafoare și semafoare de ieșire +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Cale ferată cale ferată cu semafoare și semafoare combo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Cale ferată cale ferată cu semafoare și semafoare de direcționare +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Cale ferată cale ferată cu semafoare și semafoare de direcționare unidirecționale +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Cale ferată cale ferată cu presemafoare și semafoare de ieșire +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Cale ferată cale ferată cu presemafoare și semafoare combo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Cale ferată cale ferată cu presemafoare și semafoare de direcționare +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Cale ferată cale ferată cu presemafoare și semafoare de direcționare unidirecționale +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Cale ferată cale ferată cu semafoare de ieșire și semafoare combo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Cale ferată cale ferată cu semafoare de ieșire și semafoare direcționale +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Cale ferată cale ferată cu semafoare de ieșire și semafoare direcționale unidirecționale +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Cale ferată cale ferată cu semafoare combo și semafoare direcționale +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Cale ferată cale ferată cu semafoare combo și semafoare direcționale unidirecționale +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Cale ferată cale ferată cu semafoare direcționale şi semafoare directionale unidirecționale +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Cale ferată depou trenuri STR_LAI_ROAD_DESCRIPTION_ROAD :Şosea STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Stradă iluminată @@ -2633,7 +2645,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Teren în propr STR_ABOUT_OPENTTD :{WHITE}Despre OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyright original {COPYRIGHT} 1995 Chris Sawyer, Toate drepturile rezervate STR_ABOUT_VERSION :{BLACK}OpenTTD versiunea {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 Echipa OpenTTD +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 @@ -2652,6 +2671,7 @@ STR_SAVELOAD_SAVE_BUTTON :{BLACK}Salveaz STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}Salvează cu numele selectat jocul curent STR_SAVELOAD_LOAD_BUTTON :{BLACK}Încarcă STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}Încarcă salvarea selectată +STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP :{BLACK}Încarcă harta selectată STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Detalii joc STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Nicio informaţie disponibilă STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING} @@ -2754,6 +2774,8 @@ STR_NEWGRF_SETTINGS_MOVEUP :{BLACK}Mută î STR_NEWGRF_SETTINGS_MOVEUP_TOOLTIP :{BLACK}Mută fişierul NewGRF selectat mai sus în listă STR_NEWGRF_SETTINGS_MOVEDOWN :{BLACK}Mută în jos STR_NEWGRF_SETTINGS_MOVEDOWN_TOOLTIP :{BLACK}Mută fişierul NewGRF selectat mai jos în listă +STR_NEWGRF_SETTINGS_UPGRADE :{BLACK}Upgrade +STR_NEWGRF_SETTINGS_UPGRADE_TOOLTIP :{BLACK}Actualizați fișierele NewGRF pentru care aveți o versiune mai nouă instalată STR_NEWGRF_SETTINGS_FILE_TOOLTIP :{BLACK}O listă a fişierelor NewGRF instalate STR_NEWGRF_SETTINGS_SET_PARAMETERS :{BLACK}Setează parametri @@ -2779,6 +2801,9 @@ STR_NEWGRF_SETTINGS_DISABLED :{RED}Dezactivat STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}Incompatibil cu această versiune de OpenTTD # NewGRF save preset window +STR_SAVE_PRESET_CANCEL :{BLACK}Anulează +STR_SAVE_PRESET_CANCEL_TOOLTIP :{BLACK}Nu schimba setarea implicită +STR_SAVE_PRESET_SAVE_TOOLTIP :{BLACK}Salvează setarea pe numele selectat # NewGRF parameters window STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}Schimbă parametrii NewGRF @@ -2809,7 +2834,7 @@ STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Mergi la STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Imaginea precedentă STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Mergi la precedenta imagine normală, sărind peste pseudo-imagini, recolorări sau fonturi şi reporneşte când s-a ajuns la sfârşit STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Reprezentarea imaginii curente. Aliniamentul este ignorat -STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Mişcă imaginea schimbând distanţele pe axele X şi Y +STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Mișcă imaginea schimbând distanțele pe axele X şi Y. Ctrl+Clic pentru mutarea imaginii câte opt unități la un pas STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Resetează relativele STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Resetază limitele relative actuale STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Limita X: {NUM}, Limita Y: {NUM} (Absolut) @@ -2841,8 +2866,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Încercare de a STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} conţine o imagine coruptă. Toate imaginile corupte vor fi afişate ca semne de întrebare (?) roşii STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Conține mai multe intrări pentru Acțiunea 8 (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Citire după sfârşitul preudo-elementului grafic (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Unele imagini lipsesc din setul grafic de bază.{}Vă rugăm actualizaţi setul grafic de bază -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE} Pachetul grafic de bază folosit în acest moment este incomplet, un număr de sprite-uri lipsesc ..{}Trebuie să actualizezi acest pachet grafic de bază.{}Deoarece te joci o {YELLOW}versiune de dezvoltare a OpenTTD{WHITE}, este posibil să ai nevoie de o {YELLOW}versiune de dezvoltare a pachetului grafic de bază{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Resursele GRF solicitate nu sunt disponibile (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} a fost dezactivat de {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Structură necunoscută/invalidă pentru elementul grafic (sprite {3:NUM}) @@ -2916,8 +2939,6 @@ STR_TOWN_POPULATION :{BLACK}Populaţ STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Metropolă) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Populaţia: {ORANGE}{COMMA}{BLACK} Locuinţe: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Călători luna trecută: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Colete poştale luna trecută: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Transporturi necesare dezvoltării oraşului: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} necesare STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} necesare iarna @@ -3048,8 +3069,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Acceptă STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Afişează lista de încărcături acceptate STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Acceptă: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Această staţie are drepturi exclusive de transport în acest oraş. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} a cumpărat drepturi exclusive de transport în acest oraş. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Această staţie are drepturi exclusive de transport în acest oraş. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} a cumpărat drepturi exclusive de transport în acest oraş. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Evaluări STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Afişează evaluările staţiei @@ -3227,9 +3248,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Are nevo STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Are nevoie de: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Incarcatura in asteaptarea procesarii: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produce: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Produce: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3295,6 +3315,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Elimină toate STR_GROUP_RENAME_CAPTION :{BLACK}Redenumeşte un grup + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Noi vehicule feroviare STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Noi Vehicule Electrice pe Sine @@ -3459,10 +3480,7 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :locomotivă per STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Cost: {CURRENCY_LONG} Greutate: {WEIGHT_SHORT}{}Vitezã: {VELOCITY} Putere: {POWER}{}Cost de rulare: {CURRENCY_LONG}/an{}Capacitate: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cost: {CURRENCY_LONG} Greutate: {WEIGHT_SHORT}{}Viteză: {VELOCITY} Putere: {POWER} Ef. T. Max.: {6:FORCE}{}Cost rulaj: {4:CURRENCY_LONG}/an{}Capacitate: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Viteză max.: {VELOCITY}{}Capacitate: {CARGO_LONG}, {CARGO_LONG}{}Mentenanţă: {CURRENCY_LONG}/an -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Viteză max.: {VELOCITY}{}Capacitate: {CARGO_LONG}{}Mentenanţă: {CURRENCY_LONG}/an -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Cost: {CURRENCY_LONG} Viteză maximă: {VELOCITY} Rază de acțiune: {COMMA} tiles{}Capacitate: {CARGO_LONG}, {CARGO_LONG}{}Cost rulare: {CURRENCY_LONG}/an -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Viteză maximă: {VELOCITY} Rază de acțiune: {COMMA} pătrățele{}Capacitate: {CARGO_LONG}{}Cost de rulare: {CURRENCY_LONG}/yr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Viteză max.: {VELOCITY}{}Capacitate: {CARGO_LONG}{}Mentenanţă: {CURRENCY_LONG}/an # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Înlocuieşte {STRING} - {STRING} @@ -3489,7 +3507,6 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} când STR_REPLACE_VEHICLES_STOP :{BLACK}Oprire înlocuire vehicule STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Apasă aici pentru a opri înlocuirea motorului selectat în stânga -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Înlocuire: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Comutã între ferestrele de înlocuire motoare si vagoane STR_REPLACE_ENGINES :Motoare STR_REPLACE_WAGONS :Vagoane @@ -3585,7 +3602,6 @@ STR_VEHICLE_INFO_AGE :{COMMA} an{P "" STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} an{P "" i} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Viteză max.: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Viteză maximă: {LTBLUE}{VELOCITY} {BLACK}Rază de acțiune: {LTBLUE}{COMMA} pătrățele STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Greutate: {LTBLUE}{WEIGHT_SHORT} {BLACK}Putere: {LTBLUE}{POWER}{BLACK} Viteză max.: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Greutate: {LTBLUE}{WEIGHT_SHORT} {BLACK}Putere: {LTBLUE}{POWER}{BLACK} Viteză max.: {LTBLUE}{VELOCITY} {BLACK}Efort tractiv: {LTBLUE}{FORCE} @@ -3825,11 +3841,14 @@ STR_TIMETABLE_ORDER_VIEW_TOOLTIP :{BLACK}Schimba STR_TIMETABLE_TOOLTIP :{BLACK}Orar - click pe un ordin pentru a-l selecta STR_TIMETABLE_NO_TRAVEL :NU este calatorie -STR_TIMETABLE_NOT_TIMETABLEABLE :Călătorie (automat; orar generat de următorul ordin manual) +STR_TIMETABLE_NOT_TIMETABLEABLE :Călătorie (automat; programată după următoarea comandă manuală) STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :Calatorie (fara orar) -STR_TIMETABLE_TRAVEL_NOT_TIMETABLED_SPEED :Mergi cu maxim {2:VELOCITY} (fără planificare) +STR_TIMETABLE_TRAVEL_NOT_TIMETABLED_SPEED :Călătoriți (neplanificat) cu maxim {2:VELOCITY} STR_TIMETABLE_TRAVEL_FOR :Calatorii pentru {STRING} STR_TIMETABLE_TRAVEL_FOR_SPEED :Mergi către {STRING} cu maxim {VELOCITY} +STR_TIMETABLE_TRAVEL_FOR_ESTIMATED :Călătorie (pentru {STRING}, neplanificată) +STR_TIMETABLE_TRAVEL_FOR_SPEED_ESTIMATED :Călătoriți (pentru {STRING}, neprogramat) cu cel mult {VELOCITY} +STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(călătorie pentru {STRING}, neprogramată) STR_TIMETABLE_STAY_FOR :şi opreşte pentru {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :şi călătoreşte pentru {STRING} STR_TIMETABLE_DAYS :{COMMA} zi{P "" le} @@ -3958,6 +3977,8 @@ STR_AI_SETTINGS_START_DELAY :Perioada (în z STR_TEXTFILE_README_CAPTION :{WHITE}{STRING}, fișier readme al {STRING} STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING}, lista de modificări a {STRING} STR_TEXTFILE_LICENCE_CAPTION :{WHITE}{STRING}, licența fișierului {STRING} +STR_TEXTFILE_WRAP_TEXT :{WHITE}Încadrează textul +STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Încadrează textul ferestrei ca să fie vizibil integral, fără derulare STR_TEXTFILE_VIEW_README :{BLACK}Vezi fișierul readme STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Listă modificări STR_TEXTFILE_VIEW_LICENCE :{BLACK}Licenţă @@ -4136,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 8dc651c8f3..5c195be849 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -363,7 +363,7 @@ STR_BUTTON_LOCATION :{BLACK}Обзо STR_BUTTON_RENAME :{BLACK}Переименовать STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Закрыть окно -STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Заголовок окна - тащите его для перемещения окна +STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Окна можно перетаскивать, схватив за заголовок STR_TOOLTIP_SHADE :{BLACK}Свернуть окно, оставив заголовок STR_TOOLTIP_DEBUG :{BLACK}Показать отладочную информацию NewGRF STR_TOOLTIP_DEFSIZE :{BLACK}Изменить размеры окна на значения по умолчанию. Ctrl+щелчок сохранит текущий размер как значение по умолчанию. @@ -396,9 +396,9 @@ STR_OSK_KEYBOARD_LAYOUT_CAPS :~!@#$%^&*()_+|Q # Measurement tooltip STR_MEASURE_LENGTH :{BLACK}Длина: {NUM} -STR_MEASURE_AREA :{BLACK}Площадь: {NUM} x {NUM} +STR_MEASURE_AREA :{BLACK}Площадь: {NUM} × {NUM} STR_MEASURE_LENGTH_HEIGHTDIFF :{BLACK}Длина: {NUM}{}Разница высот: {HEIGHT} -STR_MEASURE_AREA_HEIGHTDIFF :{BLACK}Площадь: {NUM} x {NUM}{}Разница высот: {HEIGHT} +STR_MEASURE_AREA_HEIGHTDIFF :{BLACK}Площадь: {NUM} × {NUM}{}Разница высот: {HEIGHT} # These are used in buttons @@ -565,12 +565,12 @@ STR_RAIL_MENU_MAGLEV_CONSTRUCTION :Строите ############ range ends here ############ range for road construction menu starts -STR_ROAD_MENU_ROAD_CONSTRUCTION :Строительство автомобильных коммуникаций -STR_ROAD_MENU_TRAM_CONSTRUCTION :Строительство трамвайных коммуникаций +STR_ROAD_MENU_ROAD_CONSTRUCTION :Строительство автомобильной инфраструктуры +STR_ROAD_MENU_TRAM_CONSTRUCTION :Строительство трамвайной инфраструктуры ############ range ends here ############ range for waterways construction menu starts -STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION :Строительство водных коммуникаций +STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION :Строительство инфраструктуры водного транспорта ############ range ends here ############ range for airport construction menu starts @@ -593,7 +593,7 @@ STR_NEWS_MENU_MESSAGE_HISTORY_MENU :История ############ range ends here ############ range for about menu starts -STR_ABOUT_MENU_LAND_BLOCK_INFO :Информация о земле +STR_ABOUT_MENU_LAND_BLOCK_INFO :Информация об участке земли STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Консоль STR_ABOUT_MENU_AI_DEBUG :Отладка ИИ / скриптов @@ -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 :Переключить ограничивающие рамки @@ -715,7 +716,7 @@ STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Стои STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Оплата за перевозку грузов STR_GRAPH_CARGO_PAYMENT_RATES_X_LABEL :{TINY_FONT}{BLACK}Дней в пути -STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Оплата за доставку 10 единиц (10 000 литров) груза на расстояние в 20 клеток +STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Оплата за доставку 10 единиц (10{NBSP}000 литров) груза на расстояние в 20 клеток STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Показать все STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Спрятать все STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Показать все виды грузов на графике @@ -750,7 +751,7 @@ STR_PERFORMANCE_DETAIL_AMOUNT_INT :{BLACK}({COMMA} STR_PERFORMANCE_DETAIL_PERCENT :{WHITE}{NUM}% STR_PERFORMANCE_DETAIL_SELECT_COMPANY_TOOLTIP :{BLACK}Подробная информация о компании ############ Those following lines need to be in this order!! -STR_PERFORMANCE_DETAIL_VEHICLES :{BLACK}Кол-во ТС: +STR_PERFORMANCE_DETAIL_VEHICLES :{BLACK}Количество ТС: STR_PERFORMANCE_DETAIL_STATIONS :{BLACK}Станции: STR_PERFORMANCE_DETAIL_MIN_PROFIT :{BLACK}Мин. прибыль: STR_PERFORMANCE_DETAIL_MIN_INCOME :{BLACK}Мин. доход: @@ -758,15 +759,15 @@ STR_PERFORMANCE_DETAIL_MAX_INCOME :{BLACK}Макс STR_PERFORMANCE_DETAIL_DELIVERED :{BLACK}Доставлено: STR_PERFORMANCE_DETAIL_CARGO :{BLACK}Груз: STR_PERFORMANCE_DETAIL_MONEY :{BLACK}Деньги: -STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Заём: +STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Займ: STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Всего: ############ End of order list -STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP :{BLACK}Количество транспортных средств, принёсших доход в прошлом году. +STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP :{BLACK}Количество транспортных средств, принёсших доход в прошлом году STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Количество обслуживаемых станций. Если несколько типов станций связаны в одну, они все учитываются отдельно. STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP :{BLACK}Прибыль транспорта с самым низким доходом (среди транспортных средств старше 2-х лет) STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Наименьший квартальный доход за последние 3 года STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Наибольший квартальный доход за последние 3 года -STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Кол-во груза, доставленного за последние 4 квартала +STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Количество груза, доставленного за последние 4 квартала STR_PERFORMANCE_DETAIL_CARGO_TOOLTIP :{BLACK}Количество типов груза, доставленного за последний квартал STR_PERFORMANCE_DETAIL_MONEY_TOOLTIP :{BLACK}Количество денег на банковском счету компании STR_PERFORMANCE_DETAIL_LOAN_TOOLTIP :{BLACK}Размер займа, полученного этой компанией в банке @@ -775,9 +776,9 @@ STR_PERFORMANCE_DETAIL_TOTAL_TOOLTIP :{BLACK}Всег # Music window STR_MUSIC_JAZZ_JUKEBOX_CAPTION :{WHITE}Музыкальный автомат STR_MUSIC_PLAYLIST_ALL :{TINY_FONT}{BLACK}Все -STR_MUSIC_PLAYLIST_OLD_STYLE :{TINY_FONT}{BLACK}Старый Стиль -STR_MUSIC_PLAYLIST_NEW_STYLE :{TINY_FONT}{BLACK}Новый Стиль -STR_MUSIC_PLAYLIST_EZY_STREET :{TINY_FONT}{BLACK}Уличный Стиль +STR_MUSIC_PLAYLIST_OLD_STYLE :{TINY_FONT}{BLACK}Старый стиль +STR_MUSIC_PLAYLIST_NEW_STYLE :{TINY_FONT}{BLACK}Новый стиль +STR_MUSIC_PLAYLIST_EZY_STREET :{TINY_FONT}{BLACK}Уличный стиль STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLACK}Пользоват. 1 STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Пользоват. 2 STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Громкость музыки @@ -788,8 +789,9 @@ 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_TRACK :{TINY_FONT}{BLACK}Трек STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Название STR_MUSIC_SHUFFLE :{TINY_FONT}{BLACK}Случ. выбор STR_MUSIC_PROGRAM :{TINY_FONT}{BLACK}Программа @@ -801,23 +803,23 @@ STR_MUSIC_TOOLTIP_DRAG_SLIDERS_TO_SET_MUSIC :{BLACK}Пере STR_MUSIC_TOOLTIP_SELECT_ALL_TRACKS_PROGRAM :{BLACK}Выбор программы «Все треки» STR_MUSIC_TOOLTIP_SELECT_OLD_STYLE_MUSIC :{BLACK}Выбор программы «Старый стиль музыки» STR_MUSIC_TOOLTIP_SELECT_NEW_STYLE_MUSIC :{BLACK}Выбор программы «Новый стиль музыки» -STR_MUSIC_TOOLTIP_SELECT_EZY_STREET_STYLE :{BLACK}Выбрать музыкальную программу +STR_MUSIC_TOOLTIP_SELECT_EZY_STREET_STYLE :{BLACK}Выбор программы «Ezy Street» STR_MUSIC_TOOLTIP_SELECT_CUSTOM_1_USER_DEFINED :{BLACK}Выбор программы «Пользоват. 1» STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Выбор программы «Пользоват. 2» STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Вкл./Выкл. случайный выбор программы STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Показать окно выбора музыкальных треков -STR_ERROR_NO_SONGS :{WHITE}В выбранном музыкальном наборе отсутствует музыка. - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Выбор программы воспроизведения +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}» STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Очистить +STR_PLAYLIST_CHANGE_SET :{BLACK}Изменить набор STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Очистка пользовательской программы +STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Сменить выбор музыкального оформления на другой установленный набор STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Щёлкните по названию трека для добавления в пользовательскую программу -STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Выберите дорожку для удаления из пользовательского списка +STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Выберите трек для удаления из пользовательского списка # Highscore window STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Крупнейшие компании, достигшие {NUM} года @@ -838,7 +840,7 @@ STR_HIGHSCORE_PERFORMANCE_TITLE_MOGUL.abl :транспо STR_HIGHSCORE_PERFORMANCE_TITLE_TYCOON_OF_THE_CENTURY :Магнат Века STR_HIGHSCORE_PERFORMANCE_TITLE_TYCOON_OF_THE_CENTURY.abl :Магнатом Века STR_HIGHSCORE_NAME :{PRESIDENT_NAME}, {COMPANY} -STR_HIGHSCORE_STATS :{BIG_FONT}«{STRING}» ({COMMA}) +STR_HIGHSCORE_STATS :{BIG_FONT}«{STRING}» ({COMMA}) STR_HIGHSCORE_COMPANY_ACHIEVES_STATUS :{BIG_FONT}{BLACK}Директора компании «{COMPANY}» называют {STRING.abl}! STR_HIGHSCORE_PRESIDENT_OF_COMPANY_ACHIEVES_STATUS :{BIG_FONT}{WHITE}{PRESIDENT_NAME}, президент компании «{COMPANY}», заслужил титул «{STRING}»! @@ -943,8 +945,8 @@ STR_NEWS_DISASTER_SMALL_UFO :{BIG_FONT}{BLAC STR_NEWS_DISASTER_AIRPLANE_OIL_REFINERY :{BIG_FONT}{BLACK}Взрыв нефтеперегонного завода вблизи г.{NBSP}{TOWN}! STR_NEWS_DISASTER_HELICOPTER_FACTORY :{BIG_FONT}{BLACK}Взрыв завода при подозрительных обстоятельствах вблизи г.{NBSP}{TOWN}! STR_NEWS_DISASTER_BIG_UFO :{BIG_FONT}{BLACK}НЛО приземлилось возле г.{NBSP}{TOWN}! -STR_NEWS_DISASTER_COAL_MINE_SUBSIDENCE :{BIG_FONT}{BLACK}Обвал на угольной шахте вызывает оползень в районе г.{NBSP}{TOWN}! -STR_NEWS_DISASTER_FLOOD_VEHICLE :{BIG_FONT}{BLACK}Потоп!{}По крайней мере {COMMA} человек{P "" а ""} признан{P "" о о} пропавшим{P "" и и} без вести в результате наводнения! +STR_NEWS_DISASTER_COAL_MINE_SUBSIDENCE :{BIG_FONT}{BLACK}Обвал на угольной шахте вызвал оползень в районе г.{NBSP}{TOWN}! +STR_NEWS_DISASTER_FLOOD_VEHICLE :{BIG_FONT}{BLACK}Потоп!{}По крайней мере {COMMA} человек{P "" а ""} пропал{P "" о о} без вести в результате наводнения! STR_NEWS_COMPANY_IN_TROUBLE_TITLE :{BIG_FONT}{BLACK}Транспортная компания в опасном положении! STR_NEWS_COMPANY_IN_TROUBLE_DESCRIPTION :{BIG_FONT}{BLACK}{STRING} будет продана или объявлена банкротом, если не улучшит финансовые показатели! @@ -958,13 +960,14 @@ 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}! STR_NEWS_INDUSTRY_CLOSURE_GENERAL :{BIG_FONT}{BLACK}Предприятие «{STRING}» объявляет о скором закрытии! STR_NEWS_INDUSTRY_CLOSURE_SUPPLY_PROBLEMS :{BIG_FONT}{BLACK}{STRING} закрывается из-за проблем с поставками сырья! -STR_NEWS_INDUSTRY_CLOSURE_LACK_OF_TREES :{BIG_FONT}{BLACK}«{STRING}» объявляет о закрытии в связи с отсутствием деревьев в округе! +STR_NEWS_INDUSTRY_CLOSURE_LACK_OF_TREES :{BIG_FONT}{BLACK}«{STRING}» объявляет о закрытии в связи с полной вырубкой близлежащих лесов! STR_NEWS_EURO_INTRODUCTION :{BIG_FONT}{BLACK}Создана зона евро!{}{}Теперь в вашей стране в качестве единой валюты используется евро! STR_NEWS_BEGIN_OF_RECESSION :{BIG_FONT}{BLACK}Мировой спад{}{}Финансовые эксперты дают ужасные прогнозы в связи с кризисом экономики! @@ -989,7 +992,7 @@ STR_NEWS_VEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}У ТС STR_NEWS_VEHICLE_HAS_VOID_ORDER :{WHITE}У ТС «{VEHICLE}» недействительное задание STR_NEWS_VEHICLE_HAS_DUPLICATE_ENTRY :{WHITE}У ТС «{VEHICLE}» повторяющиеся задания STR_NEWS_VEHICLE_HAS_INVALID_ENTRY :{WHITE}У ТС «{VEHICLE}» некорректный пункт назначения -STR_NEWS_PLANE_USES_TOO_SHORT_RUNWAY :{WHITE}{VEHICLE} направлен{G 0 "" а о ы} в аэропорт со слишком короткой полосой +STR_NEWS_PLANE_USES_TOO_SHORT_RUNWAY :{WHITE}{VEHICLE} направлен{G 0 "" а о ы} в аэропорт со слишком короткой взлётно-посадочной полосой STR_NEWS_VEHICLE_IS_GETTING_OLD :{WHITE}ТС «{VEHICLE}» устарело STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}ТС «{VEHICLE}» сильно устарело @@ -1025,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 @@ -1070,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 :Английские @@ -1173,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} @@ -1257,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 :Настройки со значениями, отличающимися от настроек новой игры @@ -1489,9 +1493,13 @@ 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_REVERSE_SCROLLING :Обратить направление перемещения обзора мышью: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Настройка смещения обзора правой кнопкой мыши.{}Если отключено, мышь двигает камеру.{}Если включено, мышь двигает карту. -STR_CONFIG_SETTING_SMOOTH_SCROLLING :Плавное смещение обзора: {STRING} +STR_CONFIG_SETTING_SCROLLMODE :Перемещение обзора: {STRING} +STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Способ перемещения по игровому полю +STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Перемещать с помощью ПКМ, зафиксировав курсор +STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Перемещать с помощью ПКМ, зафиксировав курсор +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} STR_CONFIG_SETTING_MEASURE_TOOLTIP_HELPTEXT :Показывать расстояния и разницу высот при строительстве @@ -1500,8 +1508,8 @@ STR_CONFIG_SETTING_LIVERIES_HELPTEXT :Включит STR_CONFIG_SETTING_LIVERIES_NONE :нет STR_CONFIG_SETTING_LIVERIES_OWN :только для своей компании STR_CONFIG_SETTING_LIVERIES_ALL :для всех компаний -STR_CONFIG_SETTING_PREFER_TEAMCHAT :Открывать командный чат при нажатии Enter: {STRING} -STR_CONFIG_SETTING_PREFER_TEAMCHAT_HELPTEXT :Настроить внутрикорпоративный чат на клавишу «Enter», а общий - на «Ctrl+Enter» +STR_CONFIG_SETTING_PREFER_TEAMCHAT :Использовать Enter для командного чата: {STRING} +STR_CONFIG_SETTING_PREFER_TEAMCHAT_HELPTEXT :Использовать «Enter» для командного чата, а «Ctrl+Enter» - для общего STR_CONFIG_SETTING_SCROLLWHEEL_SCROLLING :Использовать колесо прокрутки: {STRING} STR_CONFIG_SETTING_SCROLLWHEEL_SCROLLING_HELPTEXT :Можно настроить смещение обзора с помощью качающегося колеса прокрутки STR_CONFIG_SETTING_SCROLLWHEEL_ZOOM :для масштабирования @@ -1522,8 +1530,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Команд. STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Контрол. STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Выкл. -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Смещение обзора по нажатию левой кнопки мыши: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Смещение обзора левой кнопкой мыши. Это удобно при использовании сенсорного экрана. +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 :Укажите интервал между автоматическими сохранениями @@ -1776,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% для того, чтобы избежать задержки груза, если пропускная способность маршрута будет переоценена алгоритмом. @@ -1913,6 +1921,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Найт STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Изменить настройки ИИ / игрового скрипта STR_INTRO_TOOLTIP_QUIT :{BLACK}Выйти из OpenTTD +STR_INTRO_BASESET :{BLACK}В выбранном наборе базовой графики отсутствует {NUM} спрайт{P "" а ов}. Пожалуйста, обновите набор графики. STR_INTRO_TRANSLATION :{BLACK}На этот язык не переведен{P 0 а ы о} {NUM} строк{P а и ""}. Вы можете помочь проекту, зарегистрировавшись как переводчик. Инструкции в файле readme.txt. # Quit window @@ -2065,7 +2074,7 @@ STR_NETWORK_SERVER_LIST_GAME_NAME_TOOLTIP :{BLACK}Назв STR_NETWORK_SERVER_LIST_GENERAL_ONLINE :{BLACK}{COMMA}/{COMMA} - {COMMA}/{COMMA} STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION :{BLACK}Клиенты STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION_TOOLTIP :{BLACK}Клиентов сейчас/макс.{}Компаний сейчас/макс. -STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT :{BLACK}{COMMA}x{COMMA} +STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT :{BLACK}{COMMA}×{COMMA} STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Размер карты STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Размер карты игры{}Нажмите для сортировки по площади STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Дата @@ -2082,7 +2091,7 @@ STR_NETWORK_SERVER_LIST_GAME_INFO :{SILVER}ИНФ STR_NETWORK_SERVER_LIST_CLIENTS :{SILVER}Клиенты: {WHITE}{COMMA} / {COMMA} - {COMMA} / {COMMA} STR_NETWORK_SERVER_LIST_LANGUAGE :{SILVER}Язык: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_LANDSCAPE :{SILVER}Ландшафт: {WHITE}{STRING} -STR_NETWORK_SERVER_LIST_MAP_SIZE :{SILVER}Размер карты: {WHITE}{COMMA}x{COMMA} +STR_NETWORK_SERVER_LIST_MAP_SIZE :{SILVER}Размер карты: {WHITE}{COMMA}×{COMMA} STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}Версия сервера: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Адрес сервера: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Дата начала: {WHITE}{DATE_SHORT} @@ -2416,7 +2425,7 @@ STR_CONTENT_TYPE_GS_LIBRARY :Библиот # Content downloading progress window STR_CONTENT_DOWNLOAD_TITLE :{WHITE}Загрузка контента... STR_CONTENT_DOWNLOAD_INITIALISE :{WHITE}Запрашиваем файлы... -STR_CONTENT_DOWNLOAD_FILE :{WHITE}Сейчас скачивается {STRING} ({NUM} из {NUM}) +STR_CONTENT_DOWNLOAD_FILE :{WHITE}Идёт загрузка {STRING} ({NUM} из {NUM}) STR_CONTENT_DOWNLOAD_COMPLETE :{WHITE}Загрузка завершена STR_CONTENT_DOWNLOAD_PROGRESS_SIZE :{WHITE}{BYTES} из {BYTES} загружено ({NUM}%) @@ -2450,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}неиспольз. @@ -2661,7 +2671,7 @@ STR_OBJECT_BUILD_CAPTION :{WHITE}Выбо STR_OBJECT_BUILD_TOOLTIP :{BLACK}Выберите создаваемый объект. При нажатом Shift - оценка стоимости постройки. STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Выберите класс объекта для строительства STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Предварительный просмотр объекта -STR_OBJECT_BUILD_SIZE :{BLACK}Размер: {GOLD}{NUM} x {NUM} клеток +STR_OBJECT_BUILD_SIZE :{BLACK}Размер: {GOLD}{NUM} × {NUM} клеток STR_OBJECT_CLASS_LTHS :Маяки STR_OBJECT_CLASS_TRNS :Передатчики @@ -2759,7 +2769,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Влад STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Владелец ж/д пути: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Администрация: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Нет -STR_LAND_AREA_INFORMATION_LANDINFO_COORDS :{BLACK}Координаты: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING}) +STR_LAND_AREA_INFORMATION_LANDINFO_COORDS :{BLACK}Координаты: {LTBLUE}{NUM} × {NUM} × {NUM} ({STRING}) STR_LAND_AREA_INFORMATION_BUILD_DATE :{BLACK}Построено: {LTBLUE}{DATE_LONG} STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Класс станции: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Тип станции: {LTBLUE}{STRING} @@ -2769,6 +2779,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Зона STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Принимает: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Тип ж/д полотна: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Макс. скорость ж/д: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Макс. скорость авто: {LTBLUE}{VELOCITY} @@ -2781,29 +2792,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Поля STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Заснеженная земля STR_LAI_CLEAR_DESCRIPTION_DESERT :Пустыня -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} путь -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} путь с сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} путь с входными сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} путь с выходными сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} путь с комбинированными сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} путь с маршрутными сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} путь с односторонними маршрутными сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} путь с обычными и входными сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} путь с обычными и выходными сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} путь с обычными и комбиниров. сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} путь с обычными и маршрутн. сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} путь с обычными и одностор. маршрутн. сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} путь с входными и выходными сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} путь с входными и комбинир. сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} путь с входными и маршрутн. сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} путь с входными и одностор. маршрутн. сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} путь с выходными и комбиниров. сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} путь с выходными и маршрутн. сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} путь с выходными и односторонн. маршрутн. сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} путь с комбинир. и маршрутн. сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} путь с комбинир. и односторонн. маршрутн. сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} путь с маршрутным и одностор. маршрутным сигналами -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING.n} депо +STR_LAI_RAIL_DESCRIPTION_TRACK :Ж/д путь +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Ж/д путь с сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Ж/д путь с входными сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Ж/д путь с выходными сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Ж/д путь с комбинированными сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Ж/д путь с маршрутными сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Ж/д путь с односторонними маршрутными сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Ж/д путь с обычным и входным сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Ж/д путь с обычным и выходным сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Ж/д путь с обычными и комбинированными сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Ж/д путь с обычными и маршрутными сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Ж/д путь с обычным и односторонним маршрутным сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Ж/д путь с входным и выходным сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Ж/д путь с входным и комбинированным сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Ж/д путь с входными и маршрутными сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Ж/д путь с входным и односторонним маршрутным сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Ж/д путь с выходными и комбинированными сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Ж/д путь с выходным и маршрутным сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Ж/д путь с выходным и односторонним маршрутным сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Ж/д путь с комбинированным и маршрутным сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Ж/д путь с комбинированным и односторонним маршрутным сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Ж/д путь с маршрутным и односторонним маршрутным сигналами +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Ж/д депо STR_LAI_ROAD_DESCRIPTION_ROAD :Дорога STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Дорога с уличным освещением @@ -2867,7 +2878,29 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Земля в STR_ABOUT_OPENTTD :{WHITE}Об OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Оригинальные авторские права {COPYRIGHT} 1995 Chris Sawyer. Все права защищены. STR_ABOUT_VERSION :{BLACK}OpenTTD версия {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 Команда разработчиков OpenTTD +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}Сохранить игру @@ -2932,7 +2965,7 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}Вруч STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Поворот карты: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Название карты: STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Размер: -STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} +STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} × {NUM} STR_MAPGEN_MAX_HEIGHTLEVEL_QUERY_CAPT :{WHITE}Максимальная высота карты STR_MAPGEN_SNOW_LINE_QUERY_CAPT :{WHITE}Изменить высоту снеговой линии @@ -2953,7 +2986,7 @@ STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_QUERY_CAPT :{WHITE}Изме STR_GENERATION_WORLD :{WHITE}Создание мира... STR_GENERATION_ABORT :{BLACK}Прервать STR_GENERATION_ABORT_CAPTION :{WHITE}Прервать создание игрового мира -STR_GENERATION_ABORT_MESSAGE :{YELLOW}Вы серьезно хотите прервать создание мира? +STR_GENERATION_ABORT_MESSAGE :{YELLOW}Вы действительно хотите прервать создание мира? STR_GENERATION_PROGRESS :{WHITE}{NUM}% готово STR_GENERATION_PROGRESS_NUM :{BLACK}{NUM} / {NUM} STR_GENERATION_WORLD_GENERATION :{BLACK}Создание мира @@ -3086,8 +3119,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Попытка STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} содержит повреждённый спрайт. Все повреждённые спрайты будут показаны красным знаком вопроса (?). STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Содержит несколько блоков «Action 8» (спрайт {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Чтение за концом псевдо-спрайта (спрайт {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}В текущем наборе базовой графики отсутствуют изображения некоторых объектов.{}Пожалуйста, обновите модуль базовой графики. -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}В используемом наборе базовой графики отсутствуют некоторые изображения.{}Пожалуйста, обновите набор изображений.{}Так как у вас {YELLOW}тестовая версия OpenTTD{WHITE}, вам может понадобиться {YELLOW}тестовая версия графического набора{WHITE}. STR_NEWGRF_ERROR_GRM_FAILED :Запрошенные ресурсы GRF недоступны (спрайт {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} был отключён из-за {2:STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Недопустимый/неизвестный формат расположения спрайтов (спрайт {3:NUM}) @@ -3155,15 +3186,15 @@ 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 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_PASSENGERS_LAST_MONTH_MAX :{BLACK}Пассажиров за прошлый месяц: {ORANGE}{COMMA}{BLACK} макс.: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Почты за прошлый месяц: {ORANGE}{COMMA}{BLACK} макс.: {ORANGE}{COMMA} +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 е е е ю}тся STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} требу{G 0 е е е ю}тся зимой @@ -3175,8 +3206,8 @@ STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}Горо STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}Город {RED}не{BLACK} развивается STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Уровень шума в городе: {ORANGE}{COMMA}{BLACK} макс: {ORANGE}{COMMA} STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Показать город в основном окне. Ctrl+щелчок - показать в дополнительном окне. -STR_TOWN_VIEW_LOCAL_AUTHORITY_BUTTON :{BLACK}Местные власти -STR_TOWN_VIEW_LOCAL_AUTHORITY_TOOLTIP :{BLACK}Информация о местных властях +STR_TOWN_VIEW_LOCAL_AUTHORITY_BUTTON :{BLACK}Администрация +STR_TOWN_VIEW_LOCAL_AUTHORITY_TOOLTIP :{BLACK}Взаимодействие с администрацией города STR_TOWN_VIEW_RENAME_TOOLTIP :{BLACK}Переименовать город STR_TOWN_VIEW_EXPAND_BUTTON :{BLACK}Расширить @@ -3191,9 +3222,9 @@ STR_LOCAL_AUTHORITY_CAPTION :{WHITE}Адми STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}Рейтинг транспортных компаний STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING} STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}Доступные действия: -STR_LOCAL_AUTHORITY_ACTIONS_TOOLTIP :{BLACK}Список возможных действий в этом городе - щёлкните для получения доп. сведений -STR_LOCAL_AUTHORITY_DO_IT_BUTTON :{BLACK}Применить -STR_LOCAL_AUTHORITY_DO_IT_TOOLTIP :{BLACK}Выполнить выделенное действие в списке выше +STR_LOCAL_AUTHORITY_ACTIONS_TOOLTIP :{BLACK}Список возможных действий в этом городе. Описание выбранного действия приводится ниже. +STR_LOCAL_AUTHORITY_DO_IT_BUTTON :{BLACK}Выполнить +STR_LOCAL_AUTHORITY_DO_IT_TOOLTIP :{BLACK}Выполнить выбранное действие STR_LOCAL_AUTHORITY_ACTION_SMALL_ADVERTISING_CAMPAIGN :Малая рекламная кампания STR_LOCAL_AUTHORITY_ACTION_MEDIUM_ADVERTISING_CAMPAIGN :Средняя рекламная кампания @@ -3294,12 +3325,12 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Прин STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Показать список принимаемых грузов STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Принимается: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Компания-владелец этой станции обладает эксклюзивными правами перевозки пассажиров и грузов в этом городе. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} приобрела эксклюзивные права на перевозку пассажиров и грузов в этом городе. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Компания-владелец этой станции обладает эксклюзивными правами перевозки пассажиров и грузов в этом городе. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} приобрела эксклюзивные права на перевозку пассажиров и грузов в этом городе. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Рейтинг STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Показать рейтинг станции -STR_STATION_VIEW_SUPPLY_RATINGS_TITLE :{BLACK}Месячный объём поставок и местный рейтинг: +STR_STATION_VIEW_SUPPLY_RATINGS_TITLE :{BLACK}Месячный объём перевозок и местный рейтинг: STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}: {YELLOW}{COMMA} / {STRING} ({COMMA}%) STR_STATION_VIEW_GROUP :{BLACK}Группировать @@ -3316,7 +3347,7 @@ STR_STATION_VIEW_VIA_ANY :{RED}{CARGO_SHO STR_STATION_VIEW_FROM_HERE :{GREEN}{CARGO_SHORT} с этой станции STR_STATION_VIEW_VIA_HERE :{GREEN}{CARGO_SHORT} через эту станцию STR_STATION_VIEW_TO_HERE :{GREEN}{CARGO_SHORT} на эту станцию -STR_STATION_VIEW_NONSTOP :{YELLOW}{CARGO_SHORT} без пересадок +STR_STATION_VIEW_NONSTOP :{YELLOW}{CARGO_SHORT} без остановок STR_STATION_VIEW_GROUP_S_V_D :Откуда - Через - Куда STR_STATION_VIEW_GROUP_S_D_V :Откуда - Куда - Через @@ -3436,7 +3467,7 @@ STR_COMPANY_VIEW_SELL_SHARE_TOOLTIP :{BLACK}Прод STR_COMPANY_VIEW_COMPANY_NAME_QUERY_CAPTION :Компания STR_COMPANY_VIEW_PRESIDENT_S_NAME_QUERY_CAPTION :Имя директора -STR_BUY_COMPANY_MESSAGE :{WHITE}Мы ищем транспортную компанию для присоединения к ней.{}{}Вы хотите купить {COMPANY} за {CURRENCY_LONG}? +STR_BUY_COMPANY_MESSAGE :{WHITE}Мы ищем потенциального покупателя для нашей компании.{}{}Не желаете ли Вы приобрести {COMPANY} за {CURRENCY_LONG}? # Company infrastructure window STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Инфраструктура «{COMPANY}» @@ -3462,7 +3493,7 @@ STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Спис # Industry view STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY} -STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Произведено за прошлый месяц: +STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Произведено в прошлом месяце: STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} ({COMMA}% перевезено) STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Показать предприятие в основном окне. Ctrl+щелчок - показать в дополнительном окне. STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Производительность: {YELLOW}{COMMA}% @@ -3474,9 +3505,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Треб STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Требуется: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Требуется: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} ожидает{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Груз, ожидающий переработки: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Производит: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Производит: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3543,6 +3576,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Удалить 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 STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Новый поезд STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Новый электропоезд @@ -3574,6 +3612,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Все типы STR_PURCHASE_INFO_ALL_BUT :Всё, кроме {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Макс. тяговое усилие: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Дальность: {GOLD}{COMMA} клет{P ка ки ок} +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Тип возд. судна: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Список локомотивов и вагонов - щёлкните для получения информации. Ctrl+щелчок скроет/покажет ТС. STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Список автотранспорта - щёлкните для получения информации. Ctrl+щелчок скроет/покажет выбранный автомобиль. @@ -3713,10 +3752,11 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE.gen :магнито 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_CAPACITY_CAPACITY_RUNCOST :{BLACK}Цена: {CURRENCY_LONG} Макс. скорость: {VELOCITY}{}Ёмкость: {CARGO_LONG}, {CARGO_LONG}{}Стоимость обслуживания: {CURRENCY_LONG}/год -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Цена: {CURRENCY_LONG} Макс. скорость: {VELOCITY}{}Ёмкость: {CARGO_LONG}{}Стоимость обслуж.: {CURRENCY_LONG}/год -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Цена: {CURRENCY_LONG} Макс. скорость: {VELOCITY} Дальность: {COMMA} клет{P 3 ка ки ок}{}Ёмкость: {CARGO_LONG}, {CARGO_LONG}{}Стоимость обслуживания: {CURRENCY_LONG}/год -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Цена: {CURRENCY_LONG} Макс. скорость: {VELOCITY} Дальность: {COMMA} клет{P 3 ка ки ок}{}Ёмкость: {CARGO_LONG}{}Стоимость обслуживания: {CURRENCY_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.gen} - {STRING} @@ -3747,10 +3787,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} ког STR_REPLACE_VEHICLES_STOP :{BLACK}Прекратить замену STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Прекратить замену транспорта -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Заменяем: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Переключение между окнами замены локомотивов и вагонов STR_REPLACE_ENGINES :Локомотивы STR_REPLACE_WAGONS :Вагоны +STR_REPLACE_ALL_RAILTYPE :Весь ж/д транспорт STR_REPLACE_HELP_RAILTYPE :{BLACK}Тип ж/д транспорта, подлежащего замене STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Транспорт, на который происходит замена @@ -3843,7 +3883,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} {P го STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} {P год года лет} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Макс. скорость: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Макс. скорость: {LTBLUE}{VELOCITY} {BLACK}Дальность: {LTBLUE}{COMMA} клет{P ка ки ок} +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Макс. скорость: {LTBLUE}{VELOCITY} {BLACK}Тип возд. судна: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Макс. скорость: {LTBLUE}{VELOCITY} {BLACK}Тип: {LTBLUE}{STRING} {BLACK}Дальность: {LTBLUE}{COMMA} клеток STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Вес: {LTBLUE}{WEIGHT_SHORT} {BLACK}Мощность: {LTBLUE}{POWER}{BLACK} Макс. скорость: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Вес: {LTBLUE}{WEIGHT_SHORT} {BLACK}Мощность: {LTBLUE}{POWER}{BLACK} Макс. скорость: {LTBLUE}{VELOCITY} {BLACK}Макс. ТУ: {LTBLUE}{FORCE} @@ -3853,7 +3894,7 @@ STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Надё STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Построен в {LTBLUE}{NUM} г.{BLACK} Стоимость: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Ёмкость: {LTBLUE}отсутствует{STRING} STR_VEHICLE_INFO_CAPACITY :{BLACK}Ёмкость: {LTBLUE}{CARGO_LONG}{3:STRING} -STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Ёмкость: {LTBLUE}{CARGO_LONG}{3:STRING} (x{4:NUM}) +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Ёмкость: {LTBLUE}{CARGO_LONG}{3:STRING} (×{4:NUM}) STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Ёмкость: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Выручка перевозки: {LTBLUE}{CURRENCY_LONG} @@ -3874,16 +3915,16 @@ STR_QUERY_RENAME_SHIP_CAPTION :{WHITE}Назв STR_QUERY_RENAME_AIRCRAFT_CAPTION :{WHITE}Название возд. судна # Extra buttons for train details windows -STR_VEHICLE_DETAILS_TRAIN_ENGINE_BUILT_AND_VALUE :{LTBLUE}{ENGINE}{BLACK} Построен в {LTBLUE}{NUM} г.{BLACK} Стоимость: {LTBLUE}{CURRENCY_LONG} -STR_VEHICLE_DETAILS_TRAIN_WAGON_VALUE :{LTBLUE}{ENGINE}{BLACK} Стоимость: {LTBLUE}{CURRENCY_LONG} +STR_VEHICLE_DETAILS_TRAIN_ENGINE_BUILT_AND_VALUE :{LTBLUE}{ENGINE}{BLACK} Построен в {LTBLUE}{NUM} г. {BLACK}Стоимость: {LTBLUE}{CURRENCY_LONG} +STR_VEHICLE_DETAILS_TRAIN_WAGON_VALUE :{LTBLUE}{ENGINE}{BLACK} Стоимость: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_TEXT :{BLACK}Общая загруженность состава: STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY :{LTBLUE}- {CARGO_LONG} (Всего: {CARGO_SHORT}) -STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_MULT :{LTBLUE}- {CARGO_LONG} ({CARGO_SHORT}) (x{NUM}) +STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_MULT :{LTBLUE}- {CARGO_LONG} ({CARGO_SHORT}) (×{NUM}) STR_VEHICLE_DETAILS_CARGO_EMPTY :{LTBLUE}Пусто STR_VEHICLE_DETAILS_CARGO_FROM :{LTBLUE}{CARGO_LONG} из {STATION} -STR_VEHICLE_DETAILS_CARGO_FROM_MULT :{LTBLUE}{CARGO_LONG} из {STATION} (x{NUM}) +STR_VEHICLE_DETAILS_CARGO_FROM_MULT :{LTBLUE}{CARGO_LONG} из {STATION} (×{NUM}) STR_VEHICLE_DETAIL_TAB_CARGO :{BLACK}Груз STR_VEHICLE_DETAILS_TRAIN_CARGO_TOOLTIP :{BLACK}Показать сведения о перевозимых грузах @@ -4034,7 +4075,7 @@ STR_ORDER_IMPLICIT :(Автомат STR_ORDER_FULL_LOAD :(Полная погрузка) STR_ORDER_FULL_LOAD_ANY :(Полная погрузка любым грузом) -STR_ORDER_NO_LOAD :(Не грузиться) +STR_ORDER_NO_LOAD :(Не загружаться) STR_ORDER_UNLOAD :(Разгрузиться и забрать груз) STR_ORDER_UNLOAD_FULL_LOAD :(Разгрузиться и ждать полной загрузки) STR_ORDER_UNLOAD_FULL_LOAD_ANY :(Разгрузиться и ждать полной загрузки любым грузом) @@ -4279,7 +4320,7 @@ STR_GAME_SAVELOAD_NOT_AVAILABLE :<недосту STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Игра была сохранена в версии без поддержки трамваев. Все трамваи удалены. # Map generation messages -STR_ERROR_COULD_NOT_CREATE_TOWN :{WHITE}Генерация карты остановлена...{}... нет доступных мест для размещения городов +STR_ERROR_COULD_NOT_CREATE_TOWN :{WHITE}Создание карты прекращено...{}... нет доступных мест для размещения городов STR_ERROR_NO_TOWN_IN_SCENARIO :{WHITE}... в этом сценарии нет городов STR_ERROR_PNGMAP :{WHITE}Не удалось загрузить ландшафт из PNG... @@ -4333,7 +4374,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}Администрация г.{NBSP}{TOWN} запрещает постройку ещё одного аэропорта в городе STR_ERROR_LOCAL_AUTHORITY_REFUSES_NOISE :{WHITE}Администрация г.{NBSP}{TOWN} не разрешает строительство аэропорта из-за высокого уровня шума. -STR_ERROR_BRIBE_FAILED :{WHITE}Ваша попытка дать взятку была раскрыта местным следователем +STR_ERROR_BRIBE_FAILED :{WHITE}Ваша попытка дать взятку была раскрыта следователем # Levelling errors STR_ERROR_CAN_T_RAISE_LAND_HERE :{WHITE}Здесь невозможно повысить уровень земли... @@ -4373,7 +4414,7 @@ STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... не STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Города не будут строить дороги сами. Вы можете включить строительство дорог в разделе «Настройки -> Окр.{NBSP}среда -> Города». STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Идут дорожные работы... STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Невозможно уничтожить город:{}к нему относится станция или депо, либо невозможно очистить одну из занимаемых им клеток. -STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}...в центре города нет места для статуи +STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... в центре города нет места для статуи # Industry related errors STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... слишком много предприятий @@ -4412,7 +4453,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}Невозможно переименовать станцию... @@ -4420,6 +4460,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}Невозможно удалить часть станции... @@ -4429,7 +4470,7 @@ STR_ERROR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Нево STR_ERROR_CAN_T_REMOVE_PASSENGER_TRAM_STATION :{WHITE}Невозможно удалить пассажирскую трамвайную остановку... STR_ERROR_CAN_T_REMOVE_CARGO_TRAM_STATION :{WHITE}Невозможно удалить грузовую трамвайную остановку... STR_ERROR_MUST_REMOVE_ROAD_STOP_FIRST :{WHITE}Сначала удалите остановку -STR_ERROR_THERE_IS_NO_STATION :{WHITE}...здесь нет станции +STR_ERROR_THERE_IS_NO_STATION :{WHITE}... здесь нет станции STR_ERROR_MUST_DEMOLISH_RAILROAD :{WHITE}Сначала снесите ж/д станцию STR_ERROR_MUST_DEMOLISH_BUS_STATION_FIRST :{WHITE}Сначала снесите автобусную остановку @@ -4449,7 +4490,7 @@ STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Нево STR_ERROR_CAN_T_REMOVE_TRAIN_WAYPOINT :{WHITE}Невозможно удалить точку пути... STR_ERROR_MUST_REMOVE_RAILWAYPOINT_FIRST :{WHITE}Сначала удалите точку пути -STR_ERROR_BUOY_IN_THE_WAY :{WHITE}... буй на пути +STR_ERROR_BUOY_IN_THE_WAY :{WHITE}... буй мешает STR_ERROR_BUOY_IS_IN_USE :{WHITE}... этот буй используется другой компанией! # Depot related errors @@ -4481,24 +4522,24 @@ STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Неверны # Autoreplace related errors STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}ТС «{VEHICLE}» слишком длинное после замены STR_ERROR_AUTOREPLACE_NOTHING_TO_DO :{WHITE}Правила автозамены/обновления не были применены -STR_ERROR_AUTOREPLACE_MONEY_LIMIT :(денег мало) +STR_ERROR_AUTOREPLACE_MONEY_LIMIT :(недостаточно денег) # Rail construction errors STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION :{WHITE}Недопустимая комбинация путей STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Сначала удалите сигналы STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Нет подходящих рельсов STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Сначала удалите рельсы -STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Дорога односторонняя или блокирована +STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Дорога односторонняя или заблокирована STR_ERROR_CROSSING_DISALLOWED :{WHITE}Через этот вид рельсов запрещено строить переезды STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Здесь невозможно поставить сигнал... STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Здесь невозможно проложить рельсы... STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Не удалось удалить рельсы... STR_ERROR_CAN_T_REMOVE_SIGNALS_FROM :{WHITE}Не удалось удалить сигнал... STR_ERROR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE :{WHITE}Невозможно преобразовать здесь сигнал... -STR_ERROR_THERE_IS_NO_RAILROAD_TRACK :{WHITE}...здесь нет железной дороги -STR_ERROR_THERE_ARE_NO_SIGNALS :{WHITE}...сигналы отсутствуют +STR_ERROR_THERE_IS_NO_RAILROAD_TRACK :{WHITE}... здесь нет железной дороги +STR_ERROR_THERE_ARE_NO_SIGNALS :{WHITE}... сигналы отсутствуют -STR_ERROR_CAN_T_CONVERT_RAIL :{WHITE}Здесь невозможно преобразовать тип рельса... +STR_ERROR_CAN_T_CONVERT_RAIL :{WHITE}Здесь невозможно преобразовать тип рельсов... # Road construction errors STR_ERROR_MUST_REMOVE_ROAD_FIRST :{WHITE}Сначала удалите дорогу @@ -4507,8 +4548,8 @@ STR_ERROR_CAN_T_BUILD_ROAD_HERE :{WHITE}Здес STR_ERROR_CAN_T_BUILD_TRAMWAY_HERE :{WHITE}Здесь невозможно проложить трамвайные пути... STR_ERROR_CAN_T_REMOVE_ROAD_FROM :{WHITE}Не удалось удалить дорогу... STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}Не удалось удалить трамвайные пути... -STR_ERROR_THERE_IS_NO_ROAD :{WHITE}...здесь нет дороги -STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}...здесь нет трамвайных путей +STR_ERROR_THERE_IS_NO_ROAD :{WHITE}... здесь нет дороги +STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}... здесь нет трамвайных путей # Waterway construction errors STR_ERROR_CAN_T_BUILD_CANALS :{WHITE}Здесь невозможно построить канал... @@ -4551,30 +4592,30 @@ STR_ERROR_TUNNEL_TOO_LONG :{WHITE}... ту # Object related errors STR_ERROR_TOO_MANY_OBJECTS :{WHITE}... слишком много объектов STR_ERROR_CAN_T_BUILD_OBJECT :{WHITE}Невозможно построить объект... -STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Объект на пути -STR_ERROR_COMPANY_HEADQUARTERS_IN :{WHITE}... штаб-квартира компании на пути +STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Объект мешает +STR_ERROR_COMPANY_HEADQUARTERS_IN :{WHITE}... штаб-квартира компании мешает STR_ERROR_CAN_T_PURCHASE_THIS_LAND :{WHITE}Невозможно купить эту землю... STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... вы и так уже владеете этим! # Group related errors -STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Не удалось создать группу... -STR_ERROR_GROUP_CAN_T_DELETE :{WHITE}Не удалось удалить группу... -STR_ERROR_GROUP_CAN_T_RENAME :{WHITE}Не удалось переименовать группу... -STR_ERROR_GROUP_CAN_T_SET_PARENT :{WHITE}Не удалось установить корректное вложение групп... -STR_ERROR_GROUP_CAN_T_REMOVE_ALL_VEHICLES :{WHITE}Не удалось удалить весь транспорт из группы... -STR_ERROR_GROUP_CAN_T_ADD_VEHICLE :{WHITE}Не удалось добавить транспорт в группу... -STR_ERROR_GROUP_CAN_T_ADD_SHARED_VEHICLE :{WHITE}Не удалось добавить транспорт с общим маршрутом в группу... +STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Невозможно создать группу... +STR_ERROR_GROUP_CAN_T_DELETE :{WHITE}Невозможно удалить группу... +STR_ERROR_GROUP_CAN_T_RENAME :{WHITE}Невозможно переименовать группу... +STR_ERROR_GROUP_CAN_T_SET_PARENT :{WHITE}Невозможно установить корректное вложение групп... +STR_ERROR_GROUP_CAN_T_REMOVE_ALL_VEHICLES :{WHITE}Невозможно удалить весь транспорт из группы... +STR_ERROR_GROUP_CAN_T_ADD_VEHICLE :{WHITE}Невозможно добавить транспорт в группу... +STR_ERROR_GROUP_CAN_T_ADD_SHARED_VEHICLE :{WHITE}Невозможно добавить транспорт с общим маршрутом в группу... # Generic vehicle errors STR_ERROR_TRAIN_IN_THE_WAY :{WHITE}Поезд мешает -STR_ERROR_ROAD_VEHICLE_IN_THE_WAY :{WHITE}Автомобиль на пути -STR_ERROR_SHIP_IN_THE_WAY :{WHITE}Корабль на пути -STR_ERROR_AIRCRAFT_IN_THE_WAY :{WHITE}ОН ЛЕТИТ! +STR_ERROR_ROAD_VEHICLE_IN_THE_WAY :{WHITE}Автомобиль мешает +STR_ERROR_SHIP_IN_THE_WAY :{WHITE}Корабль мешает +STR_ERROR_AIRCRAFT_IN_THE_WAY :{WHITE}Воздушное судно мешает STR_ERROR_CAN_T_REFIT_TRAIN :{WHITE}Невозможно переоборудовать поезд... STR_ERROR_CAN_T_REFIT_ROAD_VEHICLE :{WHITE}Невозможно переоборудовать автомобиль... -STR_ERROR_CAN_T_REFIT_SHIP :{WHITE}Не удалось переоборудовать корабль... -STR_ERROR_CAN_T_REFIT_AIRCRAFT :{WHITE}Не удалось переоборудовать самолёт... +STR_ERROR_CAN_T_REFIT_SHIP :{WHITE}Невозможно переоборудовать корабль... +STR_ERROR_CAN_T_REFIT_AIRCRAFT :{WHITE}Невозможно переоборудовать самолёт... STR_ERROR_CAN_T_RENAME_TRAIN :{WHITE}Невозможно переименовать поезд... STR_ERROR_CAN_T_RENAME_ROAD_VEHICLE :{WHITE}Невозможно переименовать автомобиль... @@ -4583,28 +4624,28 @@ STR_ERROR_CAN_T_RENAME_AIRCRAFT :{WHITE}Нево STR_ERROR_CAN_T_STOP_START_TRAIN :{WHITE}Невозможно остановить/запустить поезд... STR_ERROR_CAN_T_STOP_START_ROAD_VEHICLE :{WHITE}Невозможно остановить/запустить автомобиль... -STR_ERROR_CAN_T_STOP_START_SHIP :{WHITE}Не удалось остановить/запустить корабль... -STR_ERROR_CAN_T_STOP_START_AIRCRAFT :{WHITE}Не удалось остановить/запустить авиатранспорт... +STR_ERROR_CAN_T_STOP_START_SHIP :{WHITE}Невозможно остановить/запустить корабль... +STR_ERROR_CAN_T_STOP_START_AIRCRAFT :{WHITE}Невозможно остановить/запустить авиатранспорт... -STR_ERROR_CAN_T_SEND_TRAIN_TO_DEPOT :{WHITE}Не удалось отправить поезд в депо... +STR_ERROR_CAN_T_SEND_TRAIN_TO_DEPOT :{WHITE}Невозможно отправить поезд в депо... STR_ERROR_CAN_T_SEND_ROAD_VEHICLE_TO_DEPOT :{WHITE}Невозможно отправить автомобиль в гараж... -STR_ERROR_CAN_T_SEND_SHIP_TO_DEPOT :{WHITE}Не удалось отправить корабль в док... -STR_ERROR_CAN_T_SEND_AIRCRAFT_TO_HANGAR :{WHITE}Не удалось отправить самолёт в ангар... +STR_ERROR_CAN_T_SEND_SHIP_TO_DEPOT :{WHITE}Невозможно отправить корабль в док... +STR_ERROR_CAN_T_SEND_AIRCRAFT_TO_HANGAR :{WHITE}Невозможно отправить самолёт в ангар... -STR_ERROR_CAN_T_BUY_TRAIN :{WHITE}Не удалось купить ж/д транспорт... +STR_ERROR_CAN_T_BUY_TRAIN :{WHITE}Невозможно купить ж/д транспорт... STR_ERROR_CAN_T_BUY_ROAD_VEHICLE :{WHITE}Невозможно купить автомобиль... -STR_ERROR_CAN_T_BUY_SHIP :{WHITE}Не удалось купить корабль... -STR_ERROR_CAN_T_BUY_AIRCRAFT :{WHITE}Не удалось купить воздушное судно... +STR_ERROR_CAN_T_BUY_SHIP :{WHITE}Невозможно купить корабль... +STR_ERROR_CAN_T_BUY_AIRCRAFT :{WHITE}Невозможно купить воздушное судно... STR_ERROR_CAN_T_RENAME_TRAIN_TYPE :{WHITE}Невозможно изменить название модели поезда... STR_ERROR_CAN_T_RENAME_ROAD_VEHICLE_TYPE :{WHITE}Невозможно изменить название модели автомобиля... STR_ERROR_CAN_T_RENAME_SHIP_TYPE :{WHITE}Невозможно изменить название модели корабля... STR_ERROR_CAN_T_RENAME_AIRCRAFT_TYPE :{WHITE}Невозможно изменить название модели возд. судна... -STR_ERROR_CAN_T_SELL_TRAIN :{WHITE}Не удалось продать поезд... -STR_ERROR_CAN_T_SELL_ROAD_VEHICLE :{WHITE}Не удалось продать автомобиль... -STR_ERROR_CAN_T_SELL_SHIP :{WHITE}Не удалось продать корабль... -STR_ERROR_CAN_T_SELL_AIRCRAFT :{WHITE}Не удалось продать самолёт... +STR_ERROR_CAN_T_SELL_TRAIN :{WHITE}Невозможно продать поезд... +STR_ERROR_CAN_T_SELL_ROAD_VEHICLE :{WHITE}Невозможно продать автомобиль... +STR_ERROR_CAN_T_SELL_SHIP :{WHITE}Невозможно продать корабль... +STR_ERROR_CAN_T_SELL_AIRCRAFT :{WHITE}Невозможно продать самолёт... STR_ERROR_RAIL_VEHICLE_NOT_AVAILABLE :{WHITE}Локомотив и/или вагон недоступен STR_ERROR_ROAD_VEHICLE_NOT_AVAILABLE :{WHITE}Автотранспорт недоступен @@ -4612,7 +4653,7 @@ STR_ERROR_SHIP_NOT_AVAILABLE :{WHITE}Кора STR_ERROR_AIRCRAFT_NOT_AVAILABLE :{WHITE}Авиатранспорт недоступен STR_ERROR_TOO_MANY_VEHICLES_IN_GAME :{WHITE}Слишком много транспорта в игре -STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Не удалось изменить частоту обслуживания... +STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Невозможно изменить частоту обслуживания... STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... транспортное средство уничтожено @@ -4623,7 +4664,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_CAN_T_REVERSE_DIRECTION_TRAIN :{WHITE}Невозможно развернуть поезд... STR_ERROR_TRAIN_START_NO_POWER :У поезда нет тяги STR_ERROR_CAN_T_MAKE_ROAD_VEHICLE_TURN :{WHITE}Невозможно развернуть автомобиль... @@ -4636,12 +4677,12 @@ STR_ERROR_TOO_MANY_ORDERS :{WHITE}Слиш STR_ERROR_CAN_T_INSERT_NEW_ORDER :{WHITE}Невозможно вставить новое задание... STR_ERROR_CAN_T_DELETE_THIS_ORDER :{WHITE}Невозможно удалить это задание... STR_ERROR_CAN_T_MODIFY_THIS_ORDER :{WHITE}Невозможно изменить это задание... -STR_ERROR_CAN_T_MOVE_THIS_ORDER :{WHITE}Не удалось переместить это задание... -STR_ERROR_CAN_T_SKIP_ORDER :{WHITE}Не удалось пропустить текущее задание... -STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Не удалось перейти к выделенному заданию... +STR_ERROR_CAN_T_MOVE_THIS_ORDER :{WHITE}Невозможно переместить это задание... +STR_ERROR_CAN_T_SKIP_ORDER :{WHITE}Невозможно пропустить текущее задание... +STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Невозможно перейти к выделенному заданию... STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... ТС не может достигнуть всех станций STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... ТС не может достигнуть этой станции -STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}...ТС с общим маршрутом не может достигнуть этой станции +STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... ТС с общим маршрутом не может достигнуть этой станции STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}Невозможно использовать общий маршрут... STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}Невозможно создать индивидуальный маршрут... @@ -4664,13 +4705,15 @@ STR_ERROR_CAN_T_DELETE_SIGN :{WHITE}Не у STR_DESKTOP_SHORTCUT_COMMENT :Экономический симулятор на основе игры «Transport Tycoon Deluxe» # Translatable descriptions in media/baseset/*.ob* files -STR_BASEGRAPHICS_DOS_DESCRIPTION :Оригинальная графика из Transport Tycoon Deluxe для DOS. -STR_BASEGRAPHICS_DOS_DE_DESCRIPTION :Оригинальная графика из немецкой версии Transport Tycoon Deluxe для DOS. -STR_BASEGRAPHICS_WIN_DESCRIPTION :Оригинальная графика из Transport Tycoon Deluxe для Windows. -STR_BASESOUNDS_DOS_DESCRIPTION :Оригинальный набор звукового оформления из игры Transport Tycoon Deluxe для DOS. -STR_BASESOUNDS_WIN_DESCRIPTION :Оригинальный набор звукового оформления из игры Transport Tycoon Deluxe для Windows. +STR_BASEGRAPHICS_DOS_DESCRIPTION :Графика из Transport Tycoon Deluxe для DOS. +STR_BASEGRAPHICS_DOS_DE_DESCRIPTION :Графика из немецкой версии Transport Tycoon Deluxe для DOS. +STR_BASEGRAPHICS_WIN_DESCRIPTION :Графика из Transport Tycoon Deluxe для Windows. +STR_BASESOUNDS_DOS_DESCRIPTION :Набор звукового оформления из игры Transport Tycoon Deluxe для DOS. +STR_BASESOUNDS_WIN_DESCRIPTION :Набор звукового оформления из игры Transport Tycoon Deluxe для Windows. STR_BASESOUNDS_NONE_DESCRIPTION :"Пустой" набор звукового оформления, не содержащий никаких звуков. -STR_BASEMUSIC_WIN_DESCRIPTION :Оригинальный набор музыкального оформления из игры Transport Tycoon Deluxe для Windows. +STR_BASEMUSIC_WIN_DESCRIPTION :Набор музыкального оформления из игры Transport Tycoon Deluxe для Windows. +STR_BASEMUSIC_DOS_DESCRIPTION :Набор музыкального оформления из игры Transport Tycoon Deluxe для DOS. +STR_BASEMUSIC_TTO_DESCRIPTION :Набор музыкального оформления из игры Transport Tycoon Deluxe для DOS. STR_BASEMUSIC_NONE_DESCRIPTION :"Пустой" набор музыкального оформления, не содержащий никакой музыки. ##id 0x2000 @@ -4957,7 +5000,7 @@ STR_VEHICLE_NAME_ROAD_VEHICLE_DW_COAL_TRUCK :Грузови STR_VEHICLE_NAME_ROAD_VEHICLE_MPS_MAIL_TRUCK :Почтовый фургон MPS STR_VEHICLE_NAME_ROAD_VEHICLE_REYNARD_MAIL_TRUCK :Почтовый фургон Reynard STR_VEHICLE_NAME_ROAD_VEHICLE_PERRY_MAIL_TRUCK :Почтовый фургон Perry -STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_MAIL_TRUCK :Почтовый фургон «MightyMover» +STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_MAIL_TRUCK :Почтовый фургон MightyMover STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_MAIL_TRUCK :Почтовый фургон Powernaught STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_MAIL_TRUCK :Почтовый фургон Wizzowow STR_VEHICLE_NAME_ROAD_VEHICLE_WITCOMBE_OIL_TANKER :Цистерна Witcombe (нефть) diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt index b67e1ce265..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 @@ -857,15 +858,15 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Izaberi STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Uključi/isključi nasumičan izbor pri puštanju STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Prikaži prozor za izbor muzičkih numera -STR_ERROR_NO_SONGS :{WHITE}Izabran je skup muzike bez ijedne numere. Neće biti puštena nikakva muzika - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Izbor muzičkog programa +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) @@ -1075,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 @@ -1532,8 +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_REVERSE_SCROLLING :Suprotan smer pomeranja prozora: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Ponašanje kod skrolovanja karte desnim dugmetom miša. Kada je isključeno, miš pomiče kameru. Kada je uključeno, miš pomiče kartu +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} @@ -1565,8 +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_LEFT_MOUSE_BTN_SCROLLING :Pomeranje sa levim klikom: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Omogući skrolovanje po mapi povlačenjem mape sa levim dugmetom miša. Ovo je posebno korisno kod skrolovanja na ekranima na dodir +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 @@ -2477,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 @@ -2784,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} @@ -2796,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 :{STRING} kolosek -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} kolosek sa blok signalizacijom -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} kolosek sa predsignalizacijom -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} kolosek sa izlaznom signalizacijom -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} kolosek sa kombinovanom signalizacijom -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} kolosek sa putnom signalizacijom -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} kolosek sa jednosmernom putnom signalizacijom -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} kolosek sa blok i predsignalizacijom -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} kolosek sa blok i izlaznom signalizacijom -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} kolosek sa blok i kombinovanom signalizacijom -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} kolosek sa blok i putnom signalizacijom -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} kolosek sa blok i jednosmernom putnom signalizacijom -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} kolosek sa pred i izlaznom signalizacijom -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} kolosek sa pred i kombinovanom signalizacijom -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} kolosek sa pred i putnom signalizacijom -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} kolosek sa pred i jednosmernom putnom signalizacijom -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} kolosek sa izlaznom i kombinovanom signalizacijom -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} kolosek sa izlaznom i putnom signalizacijom -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} kolosek sa izlaznom i jednosmernom putnom signalizacijom -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} kolosek sa kombinovanom i putnom signalizacijom -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} kolosek sa kombinovanom i jednosmernom putnom signalizacijom -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} kolosek sa putnom i jednosmernom putnom signalizacijom -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} ž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 @@ -2882,7 +2889,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Zemljište u po STR_ABOUT_OPENTTD :{WHITE}O OpenTTD-u STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Originalni kopirajt {COPYRIGHT} 1995 Chris Sawyer, Sva prava zadržana STR_ABOUT_VERSION :{BLACK}OpenTTD verzija {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 OpenTTD tim +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 @@ -3101,8 +3115,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Pokušaj koriš STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} sadrži neispravan sprajt. Svi neispravni sprajtovi će biti prikazani kao crveni znakovi pitanja (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Sadrži više Akcija 8 ulaza (sprajt {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Čitanje iza završetka pseudo-sprajta (sprajt {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Odabranom skupu osnovnih grafika nedostaje neki broj sprajtova.{}Molimo Vas da ga ažurirate -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Grafičkom setu koji je trenutno u upotrebi nedostaje određen broj sprajtova.{}Osvežite grafički set.{}S obzirom da igrate {YELLOW}razvojnu verziju OpenTTD-a{WHITE}, treba vam i {YELLOW}razvojna verzija grafičkog seta{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Traženi GRF resursi nisu dostupni (sprajt {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} je isključen od strane {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Neispravan/nepoznat format prikazivanja sprajta (sprajt {3:NUM}) @@ -3170,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} @@ -3177,8 +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_PASSENGERS_LAST_MONTH_MAX :{BLACK}Broj putnika tokom meseca: {ORANGE}{COMMA}{BLACK} najviše: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Količina pošte tokom meseca: {ORANGE}{COMMA}{BLACK} najviše: {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 @@ -3309,8 +3321,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Prihvata STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Prikaži spisak tovara koje stanica prihvata STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Prihvata: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Ova stanica ima ekskluzivna transportna prava u ovom gradu. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} je kupio ekskluzivna prava prevoza u ovom gradu. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Ova stanica ima ekskluzivna transportna prava u ovom gradu. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} je kupio ekskluzivna prava prevoza u ovom gradu. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Ocene STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Prikaži ocene stanice @@ -3489,9 +3501,11 @@ 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_WAITING_FOR_PROCESSING :{BLACK}Tovar koji čeka na obradu: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Proizvodi: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Proizvodi: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3558,6 +3572,11 @@ 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 STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nova Železnička Električna Vozila @@ -3589,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 @@ -3617,8 +3637,8 @@ STR_BUY_VEHICLE_AIRCRAFT_RENAME_TOOLTIP :{BLACK}Promenit STR_BUY_VEHICLE_TRAIN_HIDE_TOGGLE_BUTTON :{BLACK}Sakriti STR_BUY_VEHICLE_ROAD_VEHICLE_HIDE_TOGGLE_BUTTON :{BLACK}Sakriti -STR_BUY_VEHICLE_SHIP_HIDE_TOGGLE_BUTTON :Sakriti -STR_BUY_VEHICLE_AIRCRAFT_HIDE_TOGGLE_BUTTON :Sakriti +STR_BUY_VEHICLE_SHIP_HIDE_TOGGLE_BUTTON :{BLACK}Sakriti +STR_BUY_VEHICLE_AIRCRAFT_HIDE_TOGGLE_BUTTON :{BLACK}Sakriti STR_BUY_VEHICLE_TRAIN_SHOW_TOGGLE_BUTTON :{BLACK}Prikaz STR_BUY_VEHICLE_ROAD_VEHICLE_SHOW_TOGGLE_BUTTON :{BLACK}Prikaži @@ -3728,10 +3748,11 @@ 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_CAPACITY_CAPACITY_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Najveća Brzina: {VELOCITY}{}Nosivost: {CARGO_LONG}, {CARGO_LONG}{}Cena Održavanja: {CURRENCY_LONG}/god. -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Najveća Brzina: {VELOCITY}{}Nosivost: {CARGO_LONG}{}Cena Održavanja: {CURRENCY_LONG}/god. -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Cena: {CURRENCY_LONG} Najveća Brzina: {VELOCITY} Domet: {COMMA} pločica{}Nosivost: {CARGO_LONG}, {CARGO_LONG}{}Cena Održavanja: {CURRENCY_LONG}/god. -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Najveća Brzina: {VELOCITY} Domet: {COMMA} pločica{}Nosivost: {CARGO_LONG}{}Cena Održavanja: {CURRENCY_LONG}/god. +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} @@ -3768,10 +3789,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} kada p STR_REPLACE_VEHICLES_STOP :{BLACK}Zaustavi Zamenu Vozila STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Pritisnite kako bi se zaustavila zamena vrsta lokomotive označene sa leve strane -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Zamenjuje se: {ORANGE}{STRING} 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 @@ -3864,7 +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_RANGE :{BLACK}Najveća brzina: {LTBLUE}{VELOCITY} {BLACK}Domet: {LTBLUE}{COMMA} pločica +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} @@ -4423,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... @@ -4431,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... @@ -4682,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 73035d0f92..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}乐曲主题 @@ -669,15 +671,14 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}选择 STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}开启/关闭 随机播放列表中的曲目 STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}打开音乐选单窗口 -STR_ERROR_NO_SONGS :{WHITE}选择了没有歌曲的音乐组。不会播放歌曲。 - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}音乐选单 STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}全部音轨列表 STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}当前选用'{STRING}'列表 STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}清除 +STR_PLAYLIST_CHANGE_SET :更改设置 STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}清除当前列表中曲目{}(仅限自定义1或自定义2) +STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}选择另一种已安装的音乐 STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}点击音乐曲目以加入当前播放列表{}(仅限自定义1或自定义2) STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}点击音乐曲目以从当前播放列表中删除{}(仅限自定义1或自定义2) @@ -813,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}! @@ -1337,8 +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_REVERSE_SCROLLING :拖动方向与屏幕移动方向相反:{STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :设置按下鼠标右键拖动时地图移动的方向,“关闭”鼠标拖动摄像机,“打开”时鼠标拖动地图。 +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} @@ -1370,8 +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_LEFT_MOUSE_BTN_SCROLLING :左击滚动: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :可用按住鼠标左键再拖拉的方法来进行屏幕滚动. 这对于触摸屏设备特别有用 +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 :选择自动存档时间间隔 @@ -1607,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 :对称 @@ -1616,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} @@ -2261,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 @@ -2589,6 +2592,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}机场 STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}接受货物:{LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}铁轨类型: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}轨道限速: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}道路限速:{LTBLUE}{VELOCITY} @@ -2601,29 +2605,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :田地 STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :雪地 STR_LAI_CLEAR_DESCRIPTION_DESERT :沙漠 -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} 轨道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :有通过信号灯的{STRING}轨道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :有入口信号灯的{STRING}轨道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :有出口信号灯的{STRING} 轨道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :有复合信号灯的{STRING}轨道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :有路径信号灯的{STRING}轨道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} 有单向路径信号灯的轨道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :有通过信号灯和入口信号灯的{STRING}轨道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :有通过信号灯和出口信号灯的{STRING}轨道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :有通过信号灯和复合信号灯的{STRING}轨道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :有通过信号灯和路径信号灯的{STRING}轨道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :有通过信号灯和单向路径信号灯的{STRING}轨道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :有入口信号灯和出口信号灯的{STRING}轨道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :有入口信号灯和复合信号灯的{STRING}轨道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :有入口信号灯和路径信号灯的{STRING}轨道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :有入口信号灯和单向路径信号灯的{STRING}轨道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :有出口信号灯和复合信号灯的{STRING}轨道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :有出口信号灯和路径信号灯的{STRING}轨道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :有出口信号灯和单向路径信号灯的{STRING}轨道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :有复合信号灯和路径信号灯的{STRING}轨道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :有复合信号灯和单向路径信号灯的{STRING}轨道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :有路径信号灯和单向路径信号灯的{STRING}轨道 -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} 列车车库 +STR_LAI_RAIL_DESCRIPTION_TRACK :铁路 轨道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :有通过信号灯的铁路轨道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :有入口信号灯的铁路轨道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :有出口信号灯的铁路 轨道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :有复合信号灯的铁路轨道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :有路径信号灯的铁路轨道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :铁路 有单向路径信号灯的轨道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :有通过信号灯和入口信号灯的铁路轨道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :有通过信号灯和出口信号灯的铁路轨道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :有通过信号灯和复合信号灯的铁路轨道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :有通过信号灯和路径信号灯的铁路轨道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :有通过信号灯和单向路径信号灯的铁路轨道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :有入口信号灯和出口信号灯的铁路轨道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :有入口信号灯和复合信号灯的铁路轨道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :有入口信号灯和路径信号灯的铁路轨道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :有入口信号灯和单向路径信号灯的铁路轨道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :有出口信号灯和复合信号灯的铁路轨道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :有出口信号灯和路径信号灯的铁路轨道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :有出口信号灯和单向路径信号灯的铁路轨道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :有复合信号灯和路径信号灯的铁路轨道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :有复合信号灯和单向路径信号灯的铁路轨道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :有路径信号灯和单向路径信号灯的铁路轨道 +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :铁路 列车车库 STR_LAI_ROAD_DESCRIPTION_ROAD :公路 STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :带路灯的公路 @@ -2687,7 +2691,27 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :公司属地 STR_ABOUT_OPENTTD :{WHITE}关于 OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}原始版权由 {COPYRIGHT} 1995 Chris Sawyer 所有,保留一切权力。 STR_ABOUT_VERSION :{BLACK}OpenTTD 版本 {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 OpenTTD 团队 +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}保存游戏 @@ -2711,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}为存档命名 @@ -2906,8 +2931,6 @@ STR_NEWGRF_ERROR_INVALID_ID :尝试使用非 STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} 含有损坏的图形元素{}所有损坏的图形元素{}将显示为红色的问号(?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :具有多个Action 8 (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :图像读取时发生越界错误 (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}当前基础图形组缺失部分图片。{}请升级图形组。 -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}当前使用的基础图形包参数有误。{}请更新基础图形包。{}如果你正在使用 {YELLOW}OPENTTD的开发测试版{WHITE},你需要 {YELLOW}相应配套的基础图形包。{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :GRF源文件不可访问 (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} 被 {STRING} 禁用 STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :错误/未知的sprite输出格式 (sprite {3:NUM}) @@ -2982,8 +3005,6 @@ 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_PASSENGERS_LAST_MONTH_MAX :{BLACK}上月旅客数量:{ORANGE}{COMMA}{BLACK} 最大值:{ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}上月邮包数量:{ORANGE}{COMMA}{BLACK} 最大值:{ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}城镇发展所必需的货物: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{RED} 需要: {ORANGE}{STRING} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} 冬季的需求 @@ -3114,15 +3135,15 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}接受 STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}显示接受的货物列表 STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}接受:{WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}这个车站在这个镇里享有独家经营权 -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} 购买了本城镇专属经营权 +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}这个车站在这个镇里享有独家经营权 +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} 购买了本城镇专属经营权 STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}评价 STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}显示车站评价 STR_STATION_VIEW_SUPPLY_RATINGS_TITLE :{BLACK}按月供应量与本地评比: STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}: {YELLOW}{COMMA} / {STRING} ({COMMA}%) -STR_STATION_VIEW_GROUP :群组方式 +STR_STATION_VIEW_GROUP :{BLACK}群组方式 STR_STATION_VIEW_WAITING_STATION :车站名:等候中 STR_STATION_VIEW_WAITING_AMOUNT :货物总量:等候中 STR_STATION_VIEW_PLANNED_STATION :车站名:计划中 @@ -3294,9 +3315,10 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}需要 STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}需要:{YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} 等待中{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}等待的货物: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}产出: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}产出: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3363,6 +3385,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :移除所有车 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 STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :购买普通列车 STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :购买电气化列车 @@ -3394,6 +3421,7 @@ STR_PURCHASE_INFO_ALL_TYPES :所有类型 STR_PURCHASE_INFO_ALL_BUT :除了 {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}最大牵引力:{GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}航行距离: {GOLD}{COMMA} 格 +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}飞机类型: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}列车车辆选择列表。点击车辆查看详细信息,或者按住 Ctrl 键再点击以切换是否隐藏车辆的种类 STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}路面车辆选择列表。点击车辆查看详细信息,或者按住 Ctrl 键再点击以切换是否隐藏车辆的种类 @@ -3527,10 +3555,11 @@ 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_CAPACITY_CAPACITY_RUNCOST :{BLACK}售价:{CURRENCY_LONG} 最大速度:{VELOCITY}{}运载能力:{CARGO_LONG}, {CARGO_LONG}{}运行成本:{CURRENCY_LONG} /年 -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}售价:{CURRENCY_LONG} 最大速度:{VELOCITY}{}运载能力:{CARGO_LONG}{}运行成本:{CURRENCY_LONG} /年 -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}费用: {CURRENCY_LONG} 最大速度: {VELOCITY} 航行距离: {COMMA} 格{}运载量: {CARGO_LONG}, {CARGO_LONG}{}运营成本: {CURRENCY_LONG}/年 -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}购买费用: {CURRENCY_LONG} 最大速度: {VELOCITY} 航行距离: {COMMA} 格{}运载量: {CARGO_LONG}{}运营成本: {CURRENCY_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} @@ -3557,10 +3586,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} 变老 STR_REPLACE_VEHICLES_STOP :{BLACK}停止更新 STR_REPLACE_HELP_STOP_BUTTON :{BLACK}点击这里可以停止继续更新车辆 -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}替换项目: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}可以切换 机车/挂车 替换项目 STR_REPLACE_ENGINES :机车 STR_REPLACE_WAGONS :挂车 +STR_REPLACE_ALL_RAILTYPE :所有铁路车辆 STR_REPLACE_HELP_RAILTYPE :{BLACK}选择要更新的车辆对应的铁路类型 STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}显示用来替换左侧被选定车辆的新车辆 @@ -3653,7 +3682,7 @@ STR_VEHICLE_INFO_AGE :{COMMA} 年 ({C STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} 年 ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}最大速度:{LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}最大速度: {LTBLUE}{VELOCITY} {BLACK}航行距离: {LTBLUE}{COMMA} 格 +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}最高速度: {LTBLUE}{VELOCITY} {BLACK}飞机种类: {LTBLUE}{STRING} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}重量:{LTBLUE}{WEIGHT_SHORT} {BLACK}功率:{LTBLUE}{POWER}{BLACK} 最大速度:{LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}重量:{LTBLUE}{WEIGHT_SHORT} {BLACK}功率:{LTBLUE}{POWER}{BLACK} 最大速度:{LTBLUE}{VELOCITY} {BLACK}最大牵引力:{LTBLUE}{FORCE} @@ -4133,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}不能提高这里的地面…… @@ -4212,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}不能重命名车站 @@ -4471,6 +4499,8 @@ STR_BASESOUNDS_DOS_DESCRIPTION :运输大亨DOS STR_BASESOUNDS_WIN_DESCRIPTION :Transport Tycoon Deluxe Windows (运输大亨Windows豪华版)的原版音效包. 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 b08ee64c54..b828879d48 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -733,10 +733,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Zvoliť STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Prepnúť náhodný výber STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Zobraziť okno pre výber hudobných stôp -STR_ERROR_NO_SONGS :{WHITE}Bola zvolená sada hudby bez skladieb. Žiadne skladby nebudú hrať - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Výber hudobného programu STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Zoznam skladieb STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Program - '{STRING}' @@ -1405,8 +1402,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Farby terénu n STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Zelená STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Tmavozelená STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Fialová -STR_CONFIG_SETTING_REVERSE_SCROLLING :Posúvať mapu opačným smerom: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Chovanie sa mapy keď je posúvaná pravým tlačítkom myši. Ak je vypnuté posúva sa kamera, ak je zapnuté posúva sa mapa. STR_CONFIG_SETTING_SMOOTH_SCROLLING :Plynulé posúvanie pohľadu: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Nastaví ako bude reagovať posúvanie na špecifickú pozíciu po kliknutí na minimapu, alebo po zadaní príkazu na presun na zadaný objekt. Ak je zapnuté, pohľad sa presúva plynulo. Ak je vypnuté, pohľad skočí priamo na zadané miesto/objekt. STR_CONFIG_SETTING_MEASURE_TOOLTIP :Zobraziť údaje o rozmeroch pri výstavbe: {STRING} @@ -1438,8 +1433,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Príkaz + klik STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :CTRL + klik STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Žiadna -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Posúvať pohľad ľavým tlačidlom myši: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Povolí posúvanie mapy ĽAVÝM tlačítkom myši. Toto je obzvlášť užitočné pri použití dotykového displeja. STR_CONFIG_SETTING_AUTOSAVE :Automatické ukladanie: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Vyberte interval pre automatické ukladanie hry @@ -2669,29 +2662,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Polia STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Zasnežený terén STR_LAI_CLEAR_DESCRIPTION_DESERT :Púšť -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} trať -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} trať so signálmi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} trať s pre-signálmi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} trať s exit-signálmi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} trať s combo-signálmi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} trať s path signálmi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} trať s jednosmernými signálmi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} trať s block a pre-signálmi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} trať s block a exit-signálmi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} trať s block a combo-signálmi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} trať s BLOCK a PATH signálmi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} trať s block a jednosmernými signálmi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} trať s pre- and exit-signálmi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} trať s pre- a combo-signálmi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} trať s pre- a path signálmi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} trať s pred- a jednosmernými semafórmy -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} trať s výstupnémi a kombinovanými semafórmi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} trať s výstupnými semafórmi a semafórmi cesty -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} trať s výstupnými a jednosmernými semafórmi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} trať s kombinovanými semafórmi a semafórmi cesty -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} trať s kombinovanými a jednosmernými semafórmi -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} trať so semáfórmi cesty a jednosmernými -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} vlakové depo +STR_LAI_RAIL_DESCRIPTION_TRACK :Železnica trať +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Železnica trať so signálmi +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Železnica trať s pre-signálmi +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Železnica trať s exit-signálmi +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Železnica trať s combo-signálmi +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Železnica trať s path signálmi +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Železnica trať s jednosmernými signálmi +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Železnica trať s block a pre-signálmi +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Železnica trať s block a exit-signálmi +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Železnica trať s block a combo-signálmi +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Železnica trať s BLOCK a PATH signálmi +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Železnica trať s block a jednosmernými signálmi +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Železnica trať s pre- and exit-signálmi +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Železnica trať s pre- a combo-signálmi +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Železnica trať s pre- a path signálmi +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Železnica trať s pred- a jednosmernými semafórmy +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Železnica trať s výstupnémi a kombinovanými semafórmi +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Železnica trať s výstupnými semafórmi a semafórmi cesty +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Železnica trať s výstupnými a jednosmernými semafórmi +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Železnica trať s kombinovanými semafórmi a semafórmi cesty +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Železnica trať s kombinovanými a jednosmernými semafórmi +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Železnica trať so semáfórmi cesty a jednosmernými +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Železnica vlakové depo STR_LAI_ROAD_DESCRIPTION_ROAD :Cesta STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Cesta s lampami @@ -2755,7 +2748,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Spoločnosťou STR_ABOUT_OPENTTD :{WHITE}OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Pôvodný copyright: {COPYRIGHT} 1995 Chris Sawyer, všetky práva vyhradené STR_ABOUT_VERSION :{BLACK}OpenTTD verzia {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 team OpenTTD +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 @@ -2974,8 +2974,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Pokus o použit STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} obsahuje poškodený sprite. Všetky poškodené sprajty budú zobrazené ako červený otáznik (?). STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Obsahuje viacnásobné záznamy Action 8 (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Čítanie za koncom pseudo-sprite (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}V používanej základnej grafickej sade chýbajú niektoré grafické objekty.{}Aktualizujte prosím základnú grafickú sadu. -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Aktuálne používanej základnej sade grafiky chýba niekoľko spritov.{}Prosím zaktualizujte základnú sadu grafiky.{}Keďže hráte {YELLOW}vývojovú verziu OpenTTD{WHITE}, môžete tiež potrebovať{YELLOW}vývojovú verziu základnej sady grafiky{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Požadované GRF prostriedky nie sú dosupné (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} bol vypnutý {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Nesprávny/neznámy formát rozloženia sprite(ov) (sprite {3:NUM}) @@ -3050,8 +3048,6 @@ STR_TOWN_POPULATION :{BLACK}Svetová STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Mesto) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Obyvateľstvo: {ORANGE}{COMMA}{BLACK} Domov: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Cestujúci posledný mesiac: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Pošta posledný mesiac: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Tovar potrebný k rozrastu mesta: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} potrebný STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} potrebné v zime @@ -3182,8 +3178,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Prijíma STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Zobraziť zoznam prijímaného nákladu STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Prijíma: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Táto stanica má exkluzívne prepravné práva v tomto meste. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :Spoločnosť {YELLOW}{COMPANY}{BLACK} si kúpila exkluzívne prepravné práva v tomto meste +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Táto stanica má exkluzívne prepravné práva v tomto meste. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :Spoločnosť {YELLOW}{COMPANY}{BLACK} si kúpila exkluzívne prepravné práva v tomto meste STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Hodnotenie STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Zobraziť hodnotenia stanice @@ -3362,9 +3358,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Potrebuj STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Potrebuje: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Náklad cakajúci na spracovanie: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produkuje: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Produkuje: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3431,6 +3426,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Odstrániť vš STR_GROUP_RENAME_CAPTION :{BLACK}Premenovať skupinu + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nove vlaky STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nové elektrické lokomotívy a vagóny @@ -3595,10 +3591,7 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :{G=z}magnetick STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Cena: {CURRENCY_LONG} Hmotnosť: {WEIGHT_SHORT}{}Rýchlosť: {VELOCITY} Výkon: {POWER}{}Prevádzkové náklady: {CURRENCY_LONG}/rok{}Kapacita: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cena: {CURRENCY_LONG} Hmotnosť: {WEIGHT_SHORT}{}Rýchlosť: {VELOCITY} Sila: {POWER} Max. T.E.: {6:FORCE}{}Prevádzkové náklady: {4:CURRENCY_LONG}/yr{}Kapacita: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Max. Rýchlosť: {VELOCITY}{}Kapacita: {CARGO_LONG}, {CARGO_LONG}{}Prevádzkové náklady: {CURRENCY_LONG}/rok -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Max. Rýchlosť: {VELOCITY}{}Kapacita: {CARGO_LONG}{}Prevádzkové náklady: {CURRENCY_LONG}/rok -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Cena: {CURRENCY_LONG} Max. rýchlosť: {VELOCITY} Dosah: {COMMA} políčok{}Kapacita: {CARGO_LONG}, {CARGO_LONG}{}Prevádzkové náklady: {CURRENCY_LONG}/rok -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Max. rýchlosť: {VELOCITY} Dosah: {COMMA} políčok{}Kapacita: {CARGO_LONG}{}Prevádzkové náklady: {CURRENCY_LONG}/rok +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Max. Rýchlosť: {VELOCITY}{}Kapacita: {CARGO_LONG}{}Prevádzkové náklady: {CURRENCY_LONG}/rok # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Výmena {STRING} - {STRING} @@ -3625,7 +3618,6 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} ked je STR_REPLACE_VEHICLES_STOP :{BLACK}Zastaviť výmenu vozidiel STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Stlačte pre zastavenie výmeny lokomotívy vybranej z ľavého zoznamu -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Výmena: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Prepne medzi oknami na výmenu lokomotív a vagónov STR_REPLACE_ENGINES :Lokomotívy STR_REPLACE_WAGONS :Vagónov @@ -3721,7 +3713,6 @@ STR_VEHICLE_INFO_AGE :{COMMA} rok{P " STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} rok{P "" y ov} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Max. rýchlosť: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Max. rýchlosť: {LTBLUE}{VELOCITY} {BLACK}Dosah: {LTBLUE}{COMMA} políčok STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Hmotnosť: {LTBLUE}{WEIGHT_SHORT} {BLACK}Sila: {LTBLUE}{POWER}{BLACK} Max. rýchlosť: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Hmotnosť: {LTBLUE}{WEIGHT_SHORT} {BLACK}Sila: {LTBLUE}{POWER}{BLACK} Max. rýchlosť: {LTBLUE}{VELOCITY} {BLACK}Max. T.E.: {LTBLUE}{FORCE} @@ -4280,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 6e6336cf96..0704d6e95b 100644 --- a/src/lang/slovenian.txt +++ b/src/lang/slovenian.txt @@ -402,7 +402,15 @@ STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Drsnik - STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Poruši zgradbe itd. na kvadratku zemlje. Ctrl izbere diagonalno območje. Shift preklaplja med izgradnjo in predvidenimi stroški # Show engines button +STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN :{BLACK}Prikaži skrito +STR_SHOW_HIDDEN_ENGINES_VEHICLE_ROAD_VEHICLE :{BLACK}Prikaži skrito +STR_SHOW_HIDDEN_ENGINES_VEHICLE_SHIP :{BLACK}Prikaži skrito +STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT :{BLACK}Prikaži skrito +STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN_TOOLTIP :{BLACK}Z vklopom tega gumba bodo prikazana skrita železniška vozila +STR_SHOW_HIDDEN_ENGINES_VEHICLE_ROAD_VEHICLE_TOOLTIP :{BLACK}Z vklopom tega gumba bodo prikazana tudi skrita cestna vozila. +STR_SHOW_HIDDEN_ENGINES_VEHICLE_SHIP_TOOLTIP :{BLACK}Z vklopom tega gumba, bodo prikazane tudi skrite ladje +STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}Z vklopom tega gumba bodo prikazana skrita letala # Query window STR_BUTTON_DEFAULT :{BLACK}Privzeto @@ -814,10 +822,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Izberi g STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Preklapljaj mešan program vključeno/izključeno STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Prikaži okno z izborom glasbe -STR_ERROR_NO_SONGS :{WHITE}Izbran je bil komplet glasbe brez skladb. Nobena skladba ne bo predvajana - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Izbor glasbenega programa STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Kazalo skladb STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Program - '{STRING}' @@ -989,6 +994,7 @@ STR_NEWS_VEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}{VEHICLE STR_NEWS_VEHICLE_HAS_VOID_ORDER :{WHITE}{VEHICLE} ima prazen ukaz STR_NEWS_VEHICLE_HAS_DUPLICATE_ENTRY :{WHITE}{VEHICLE} ima podvojene ukaze STR_NEWS_VEHICLE_HAS_INVALID_ENTRY :{WHITE}{VEHICLE} ima eno neveljavno postajo na urniku +STR_NEWS_PLANE_USES_TOO_SHORT_RUNWAY :{WHITE}{VEHICLE} ima v ukazih letališče, katerega steza je prekratka STR_NEWS_VEHICLE_IS_GETTING_OLD :{WHITE}{VEHICLE} se stara STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE} podlega iztrošenosti @@ -1125,9 +1131,11 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Izberi l STR_GAME_OPTIONS_RESOLUTION_OTHER :drugo STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Velikost vmesnika +STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Izberi velikost elementa vmesnika STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normalno STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dvojna velikost +STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Velikost kvadrata STR_GAME_OPTIONS_BASE_GRF :{BLACK}Osnovni komplet grafik STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Izberi osnovni komplet grafik za uporabo @@ -1143,6 +1151,7 @@ STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Izberi o STR_GAME_OPTIONS_BASE_MUSIC_STATUS :{RED}{NUM} poškodovan{P a i e ih} datotek{P a i e ""} STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Dodatne informacije o osnovnem kompletu glasbe +STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}Nalaganje seznama podprtih resolucij ni uspelo STR_ERROR_FULLSCREEN_FAILED :{WHITE}Celozaslonski način spodletel # Custom currency window @@ -1259,6 +1268,9 @@ STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_MENU :Nastavitve igre STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME :Nastavitve igre (zapisane ob shranjevanju; vplivajo le na trenutno igro) STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Nastavitve podjetja (zapisane ob shranjevanju; vplivajo le na nove igre) STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Nastavitve podjetja (zapisane ob shranjevanju; vplivajo le na trenutno podjetje) +STR_CONFIG_SETTING_CATEGORY_HIDES :{BLACK}Prikaži vse rezultate iskanja z nastavitvijo{}{SILVER}Kategorija {BLACK}do {WHITE}{STRING} +STR_CONFIG_SETTING_TYPE_HIDES :{BLACK}Prikaži vse rezultate iskanja z nastavitvijo{}{SILVER}Tip {BLACK}do {WHITE}Vsi tipi nastavitev +STR_CONFIG_SETTING_CATEGORY_AND_TYPE_HIDES :{BLACK}Prikaži vse rezultate iskanja z nastavitvijo{}{SILVER}Kategorija {BLACK}do {WHITE}{STRING} {BLACK}in {SILVER}Tip {BLACK}do {WHITE}Vsi tipi nastavitev STR_CONFIG_SETTINGS_NONE :{WHITE}- Brez - STR_CONFIG_SETTING_OFF :Izklopi @@ -1300,6 +1312,9 @@ STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Preklop med poj STR_CONFIG_SETTING_CITY_APPROVAL :Odnos mestnega sveta do prestrukturiranja površine: {STRING} STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Nastavitev nivoja hrupa in posameznih posegov podjetja na oceno v mestu in nadaljnjo gradnjo +STR_CONFIG_SETTING_MAX_HEIGHTLEVEL :Najvišji nivo zemljevida: {STRING} +STR_CONFIG_SETTING_MAX_HEIGHTLEVEL_HELPTEXT :Nastavi najvišjo dovoljeno višino za gore na ozemlju +STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}Ne moreš nastaviti najvišjega nivoja zemljevida na to vrednost. Vsaj ena gora na zemljevidu je višja. STR_CONFIG_SETTING_AUTOSLOPE :Dovoli oblikovanje terena pod objekti, tiri, ipd. (samonaklon): {STRING} STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Dovoli spremembo terena pod zgradbami in tiri brez odstranitve STR_CONFIG_SETTING_CATCHMENT :Dovoli bolj resnični območni zajem postaj: {STRING} @@ -1328,6 +1343,8 @@ STR_CONFIG_SETTING_INFLATION :Inflacija: {STR STR_CONFIG_SETTING_INFLATION_HELPTEXT :Omogoči inflacijo ekonomije, kjer se stroški zvišajo rahlo hitreje kot plačila STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH :Največja dolžina mostov: {STRING} STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH_HELPTEXT :Največja dolžina gradnje mostov +STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT :Najvišja višina mosta: {STRING} +STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT_HELPTEXT :Najvišja višina za gradnjo mostov STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH :Največja dolžina predorov: {STRING} STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH_HELPTEXT :Največja dolžina gradnje predorov STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD :Glavni ročni način gradnje industrij: {STRING} @@ -1422,24 +1439,31 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Debelina črt g STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Debelina črte grafov. Tanjša je bolj natančna, debelejša bolj razločna. STR_CONFIG_SETTING_LANDSCAPE :Pokrajina: {STRING} +STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Ozemlja definirajo osnovne načine igranja z različnimi tovori in potrebami za razvoj mest. Vsekakor NewGRF in skripti igre dopuščajo natančnejši nadzor. STR_CONFIG_SETTING_LAND_GENERATOR :Urejevalnik terena: {STRING} +STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT :Originalni generator je odvisen od osnovnih grafik in ustvari osnovne oblike pokrajine. TerraGenesis deluje na principu Perlin valovanja z bolj natančnim nadzorom nastavitev STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Original STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_TERRAIN_TYPE :Tip terena: {STRING} STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(samo TerraGenesis) Hribovitost pokrajine STR_CONFIG_SETTING_INDUSTRY_DENSITY :Gostota industrij: {STRING} +STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Nastavi, koliko industrij naj bi bilo ustvarjenih in kolikšen nivo naj bi se vzdrževal skozi igro STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Največja oddaljenost rafinerij nafte od roba: {STRING} STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Naftne rafinerije se nahajajo le pri robu kater, to je ob obali na otoških kartah STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Nadmorska višina snežne odeje: {STRING} +STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Nadzor nad višino snega v sub-arktičnem podnebju. Sneg vpliva tudi na rast industrije in mest STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Valovitost terena (samo TerraGenesis) : {STRING} +STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(Samo TerraGenesis...) Izberi pogostost gričev: Gladke pokrajine imajo manj širokih gričev. Razgibane pokrajine imajo več gričev, ki so lahko videti ponavljajoči. STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Zelo zglajen STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Zglajen STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Valovit STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Zelo valovit STR_CONFIG_SETTING_VARIETY :Raznolika distribucija: {STRING} +STR_CONFIG_SETTING_VARIETY_HELPTEXT :(TerraGenesis only) Nadzor nad ravninskimi in goratimi predeli ozemlja. Ker to izravna ozemlje, nastavi drugo nastavitev na gorato. STR_CONFIG_SETTING_RIVER_AMOUNT :Število rek: {STRING} STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Izberi koliko rek generirati STR_CONFIG_SETTING_TREE_PLACER :Algoritem postavljanja dreves: {STRING} +STR_CONFIG_SETTING_TREE_PLACER_HELPTEXT :Izberi razpored dreves po ozemlju: 'Original' posadi drevesa enakomerno razporejena, 'izboljšan' posadi drevesa v skupine STR_CONFIG_SETTING_TREE_PLACER_NONE :Brez STR_CONFIG_SETTING_TREE_PLACER_ORIGINAL :Original STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Izboljšan @@ -1463,8 +1487,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Barva ozemlja n STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Zelena STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Temno zelena STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Vijolična -STR_CONFIG_SETTING_REVERSE_SCROLLING :Obrni smer premika okna: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Sistem delovanja avtomatskega pomika z miško na robu. Onemogočeno - miška premika pogled, omogočeno - miška premika zemljevid. STR_CONFIG_SETTING_SMOOTH_SCROLLING :Gladek premik pogleda: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Način pomika pogleda na določen objekt majhnega zemljevida (centriranje pogleda). Omogočeno - pogled drsi, onemogočeno - pogled preskoči. STR_CONFIG_SETTING_MEASURE_TOOLTIP :Prikaz merilnega nasveta med uporabo gradbenih orodij: {STRING} @@ -1496,8 +1518,7 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Ukaz-klik STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Kontrola-klik STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Izklop -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Premik slike z levim klikom: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Omogoči pomik pogleda z levim klikom miške in vlečenjem. Primerno za dotične zaslone. +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Zapri okno z desnim klikom: {STRING} STR_CONFIG_SETTING_AUTOSAVE :Samodejno shrani: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Izberi časovni interval samodejnega shranjevanja igre @@ -1791,16 +1812,23 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrične (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) STR_CONFIG_SETTING_LOCALISATION :{ORANGE}Lokalno +STR_CONFIG_SETTING_GRAPHICS :{ORANGE}Grafike STR_CONFIG_SETTING_SOUND :{ORANGE}Zvočni učinki STR_CONFIG_SETTING_INTERFACE :{ORANGE}Vmesnik STR_CONFIG_SETTING_INTERFACE_GENERAL :{ORANGE}Splošno +STR_CONFIG_SETTING_INTERFACE_VIEWPORTS :{ORANGE}Pogledi STR_CONFIG_SETTING_INTERFACE_CONSTRUCTION :{ORANGE}Gradnja +STR_CONFIG_SETTING_ADVISORS :{ORANGE}Novice/Nasveti STR_CONFIG_SETTING_COMPANY :{ORANGE}Podjetje +STR_CONFIG_SETTING_ACCOUNTING :{ORANGE}Računi STR_CONFIG_SETTING_VEHICLES :{ORANGE}Vozila +STR_CONFIG_SETTING_VEHICLES_PHYSICS :{ORANGE}Fizika STR_CONFIG_SETTING_VEHICLES_ROUTING :{ORANGE}Usmerjanje +STR_CONFIG_SETTING_LIMITATIONS :{ORANGE}Omejitve STR_CONFIG_SETTING_ACCIDENTS :{ORANGE}Katastrofe / Nesreče STR_CONFIG_SETTING_GENWORLD :{ORANGE}Ustvarjanje sveta STR_CONFIG_SETTING_ENVIRONMENT :{ORANGE}Okolje +STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :{ORANGE}Oblasti STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :{ORANGE}Mesta STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}Industrije STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}Razpored tovora @@ -1914,6 +1942,8 @@ STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Igra ko STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Čarobni buldožer (odstrani industrije, neodstranljive objekte): {ORANGE}{STRING} STR_CHEAT_CROSSINGTUNNELS :{LTBLUE}Tuneli se lahko križajo pod zemljo: {ORANGE}{STRING} STR_CHEAT_NO_JETCRASH :{LTBLUE}Reaktivna letala ne bodo (pogosto) strmoglavila na malih letališčih: {ORANGE}{STRING} +STR_CHEAT_EDIT_MAX_HL :{LTBLUE}Uredi najvišjo višino ozemlja: {ORANGE}{NUM} +STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}Uredi najvišjo višino gora na ozemlju STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Zmerno podnebje STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Sub arktično podnebje STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub tropsko podnebje @@ -2718,29 +2748,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Polja STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Zasnežen teren STR_LAI_CLEAR_DESCRIPTION_DESERT :Puščava -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} tiri -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING}tiri s signali -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} tiri s pred-signali -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} tiri z izhodnimi signali -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} tiri s kombiniranimi signali -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} tiri s signali steze -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} tiri s signali za enosmerno stezo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} tiri z normalnimi in pred-signali -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} tiri z normalnimi in izhodnimi signali -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} tiri z normalnimi in kombiniranimi signali -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} tiri z normalnimi in steznimi signali -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} tiri z normalnimi in enosmernimi signali -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} tiri s pred in izhodnimi signali -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} tiri s pred in kombiniranimi signali -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} tiri s pred in steznimi signali -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} tiri s pred in enosmernimi signali -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} tiri z izhodnimi in kombiniranimi signali -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} tiri z izhodnimi in steznimi signali -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} tiri z izhodnimi in enosmernimi signali -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} tiri s kombiniranimi in steznimi signali -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} tiri s kombiniranimi in enosmernimi signali -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} tiri s steznimi in enosmernimi signali -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} železniška garaža +STR_LAI_RAIL_DESCRIPTION_TRACK :Železnica tiri +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Železnicatiri s signali +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Železnica tiri s pred-signali +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Železnica tiri z izhodnimi signali +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Železnica tiri s kombiniranimi signali +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Železnica tiri s signali steze +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Železnica tiri s signali za enosmerno stezo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Železnica tiri z normalnimi in pred-signali +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Železnica tiri z normalnimi in izhodnimi signali +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Železnica tiri z normalnimi in kombiniranimi signali +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Železnica tiri z normalnimi in steznimi signali +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Železnica tiri z normalnimi in enosmernimi signali +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Železnica tiri s pred in izhodnimi signali +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Železnica tiri s pred in kombiniranimi signali +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Železnica tiri s pred in steznimi signali +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Železnica tiri s pred in enosmernimi signali +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Železnica tiri z izhodnimi in kombiniranimi signali +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Železnica tiri z izhodnimi in steznimi signali +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Železnica tiri z izhodnimi in enosmernimi signali +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Železnica tiri s kombiniranimi in steznimi signali +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Železnica tiri s kombiniranimi in enosmernimi signali +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Železnica tiri s steznimi in enosmernimi signali +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Železnica železniška garaža STR_LAI_ROAD_DESCRIPTION_ROAD :Cesta STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Cesta z razsvetljavo @@ -2804,7 +2834,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Ozemlje v lasti STR_ABOUT_OPENTTD :{WHITE}O OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Prvotne avtorske pravice {COPYRIGHT} 1995 Chris Sawyer, vse pravice pridržane STR_ABOUT_VERSION :{BLACK}OpenTTD različica {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2015 ekipa OpenTTD +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 @@ -2840,6 +2877,8 @@ STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Število STR_MAPGEN_DATE :{BLACK}Datum: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Število industrij: STR_MAPGEN_MAX_HEIGHTLEVEL :{BLACK}Maksimalna višina mape: +STR_MAPGEN_MAX_HEIGHTLEVEL_UP :{BLACK}Zvišanje največje višine gora na ozemlju za 1 +STR_MAPGEN_MAX_HEIGHTLEVEL_DOWN :{BLACK}Znižanje največje višine gora na ozemlju za 1 STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Višina snežne meje: STR_MAPGEN_SNOW_LINE_UP :{BLACK}Premik snežne meje eno enoto višje STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Premik snežne meje eno enoto nižje @@ -2925,6 +2964,7 @@ STR_NEWGRF_SETTINGS_MOVEUP_TOOLTIP :{BLACK}Premakne STR_NEWGRF_SETTINGS_MOVEDOWN :{BLACK}Premakni dol STR_NEWGRF_SETTINGS_MOVEDOWN_TOOLTIP :{BLACK}Premakne izbrano NewGRF dol po seznamu STR_NEWGRF_SETTINGS_UPGRADE :{BLACK}Nadgradi +STR_NEWGRF_SETTINGS_UPGRADE_TOOLTIP :{BLACK}Nadgradi NewGRF datoteke, za katere imaš nameščeno novejšo različico STR_NEWGRF_SETTINGS_FILE_TOOLTIP :{BLACK}Seznam nameščenih NewGRF datotek. STR_NEWGRF_SETTINGS_SET_PARAMETERS :{BLACK}Nastavi parametre @@ -2951,9 +2991,13 @@ STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}Nekompatib # NewGRF save preset window STR_SAVE_PRESET_CAPTION :{WHITE}Shrani prednastavitev +STR_SAVE_PRESET_LIST_TOOLTIP :{BLACK}Seznam prednastavitev na voljo, izberi eno, da jo skopiraš kot ime za shranjevanje spodaj STR_SAVE_PRESET_TITLE :{BLACK}Vpiši ime za prednastavitev +STR_SAVE_PRESET_EDITBOX_TOOLTIP :{BLACK}Trenutno izbrano ime za shranjevanje prednastavitev STR_SAVE_PRESET_CANCEL :{BLACK}Prekliči +STR_SAVE_PRESET_CANCEL_TOOLTIP :{BLACK}Ne spremeni prednastavitve STR_SAVE_PRESET_SAVE :{BLACK}Shrani +STR_SAVE_PRESET_SAVE_TOOLTIP :{BLACK}Shrani prednastavitev k trenutno izbranemu imenu # NewGRF parameters window STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}Spremeni NewGRF parametre @@ -2984,7 +3028,7 @@ STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Pojdi na STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Prejšnja sličica STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Nadaljuj k prejšnji navadni sličici, zanemari vse navidezne/pobarvane/besedilne sličice in okvir na koncu STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Predstavitev trenutno izbrane sličice. Zamik je zanemarjen pri risanju te sličice -STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Premakni sličico s spreminjanjem X in Y osi +STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Premakni sličico naokrog s spreminjanjem X in Y osi. Ctrl-Klik za premik sličice 8 enot v koraku STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Resetiraj relativno STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Resetiraj zdajšne relativne odmike STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X odmik: {NUM}, Y odmik: {NUM} (Absolutno) @@ -3016,8 +3060,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Poskus uporabe STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} vsebuje eno poškodovano sličico. Vse poškodovane sličice se bodo prikazale kot rdeči vprašaji (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Vsebuje več Ukaz 8 vnosov (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Prebrana datoteka preko meje za sličice (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}V uporabljenem osnovnem setu grafik manjkajo sličice.{}Prosim, posodobi osnovni set grafik -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Trenutni set osnovnih grafik ne vsebuje določenih sličic. Posodobi osnovni set.{}Odkar igraš {YELLOW} razvojni pogled OpenTTD{WHITE}, nogoče potrebuješ tudi {YELLOW}razvojni pogled osnovnih grafik{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Zahtevani viri GRF niso na voljo (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} je bil izklopljen zaradi {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Neveljaven/neznan format zapisa sličic (sprite {3:NUM}) @@ -3045,6 +3087,7 @@ STR_NEWGRF_LIST_MISSING :{RED}Manjkajoč STR_NEWGRF_BROKEN :{WHITE}Ozadje NewGRFa '{0:STRING}' lahko povzroči desinhronizacijo in sesutje igre STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}Vozilo '{1:ENGINE}' je spremenilo status obratovanja, ko ni znotraj garaže STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}Spremenila se je dolžina vozila za '{1:ENGINE}' ko ni v garaži +STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Spremenila se je zmogljivost vozila za '{1:ENGINE}' ko ni v garaži ali predelavi STR_BROKEN_VEHICLE_LENGTH :{WHITE}Vlak '{VEHICLE}' , ki pripada družbi '{COMPANY}', ima neveljavno dolžino. Najbrž vsebuje probleme povezane z NewGRF. Igra se lahko sesuje STR_NEWGRF_BUGGY :{WHITE}NewGRF '{STRING}' javlja napačno informacijo @@ -3091,8 +3134,6 @@ STR_TOWN_POPULATION :{BLACK}Svetovno STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Mesto) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Prebivalstvo: {ORANGE}{COMMA}{BLACK} Število stavb: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Potnikov prejšnji mesec: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Pošte prejšnji mesec: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Količina potrebnega tovora za rast mesta: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} potrebno STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} je potreben pozimi @@ -3223,8 +3264,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Sprejema STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Prikaži seznam sprejetega tovora STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Sprejema: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Ta postaja ima ekskluzivne pravice v tem mestu. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} je odkupilo ekskluzivne prevozne pravice v tem mestu. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Ta postaja ima ekskluzivne pravice v tem mestu. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} je odkupilo ekskluzivne prevozne pravice v tem mestu. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Ocene STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Prikaz ocen postaje @@ -3403,9 +3444,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Potrebuj STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Potrebuje: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Tovor na čakanju obdelave: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Proizvaja: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Proizvaja: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3465,12 +3505,14 @@ STR_GROUP_RENAME_TOOLTIP :{BLACK}Preimenu STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Klikni za zaščito skupine pred splošno samoobnovo STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Izbriši skupino +STR_GROUP_DELETE_QUERY_TEXT :{WHITE}Zagotovo želiš izbrisati to skupino in vse njene podskupine? STR_GROUP_ADD_SHARED_VEHICLE :Vsa izmenljiva vozila STR_GROUP_REMOVE_ALL_VEHICLES :Odstrani vsa vozila STR_GROUP_RENAME_CAPTION :{BLACK}Preimenuj eno skupino + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nova železniška vozila STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nova električna tirna vozila @@ -3528,8 +3570,20 @@ STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_TOOLTIP :{BLACK}Preimenu STR_BUY_VEHICLE_SHIP_RENAME_TOOLTIP :{BLACK}Preimenuj ladjo STR_BUY_VEHICLE_AIRCRAFT_RENAME_TOOLTIP :{BLACK}Preimenuj letalo +STR_BUY_VEHICLE_TRAIN_HIDE_TOGGLE_BUTTON :{BLACK}Skrij +STR_BUY_VEHICLE_ROAD_VEHICLE_HIDE_TOGGLE_BUTTON :{BLACK}Skrij +STR_BUY_VEHICLE_SHIP_HIDE_TOGGLE_BUTTON :{BLACK}Skrij +STR_BUY_VEHICLE_AIRCRAFT_HIDE_TOGGLE_BUTTON :{BLACK}Skrij +STR_BUY_VEHICLE_TRAIN_SHOW_TOGGLE_BUTTON :{BLACK}Prikaži +STR_BUY_VEHICLE_ROAD_VEHICLE_SHOW_TOGGLE_BUTTON :{BLACK}Prikaži +STR_BUY_VEHICLE_SHIP_SHOW_TOGGLE_BUTTON :{BLACK}Prikaži +STR_BUY_VEHICLE_AIRCRAFT_SHOW_TOGGLE_BUTTON :{BLACK}Prikaži +STR_BUY_VEHICLE_TRAIN_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Vklop/izklop prikaza vrste železniških vozil +STR_BUY_VEHICLE_ROAD_VEHICLE_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Preklop med prikazom/skrivanjem tipa cestnih vozil +STR_BUY_VEHICLE_SHIP_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Vklop/izklop prikaza vrste ladij +STR_BUY_VEHICLE_AIRCRAFT_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Vklop/izklop prikaza vrste letal STR_QUERY_RENAME_TRAIN_TYPE_CAPTION :{WHITE}Preimenuj železniško vozilo STR_QUERY_RENAME_ROAD_VEHICLE_TYPE_CAPTION :{WHITE}Preimenuj cestno vozilo @@ -3623,10 +3677,8 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :magnetna lokomo STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Cena: {CURRENCY_LONG} Teža: {WEIGHT_SHORT}{}Hitrost: {VELOCITY} Moč: {POWER}{}Cena delovanja: {CURRENCY_LONG}/leto{}Zmogljivost: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cena: {CURRENCY_LONG} Teža: {WEIGHT_SHORT}{}Hitrost: {VELOCITY} Moč: {POWER} Max. T.E.: {6:FORCE}{}Stroški: {4:CURRENCY_LONG}/yr{}Zmogljivost: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Max. hitrost: {VELOCITY}{}Zmogljivost: {CARGO_LONG}, {CARGO_LONG}{}Cena delovanja: {CURRENCY_LONG}/leto -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Max. hitrost: {VELOCITY}{}Zmogljivost: {CARGO_LONG}{}Cena delovanja: {CURRENCY_LONG}/leto -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Cena: {CURRENCY_LONG} Max. Hitrost: {VELOCITY} Domet: {COMMA} polj{}Zmogljivost: {CARGO_LONG}, {CARGO_LONG}{}Stroški delovanja: {CURRENCY_LONG}/leto -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Max. Hitrost: {VELOCITY} Domet: {COMMA} polj{}Zmogljivost: {CARGO_LONG}{}Stroški delovanja: {CURRENCY_LONG}/leto +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Max. hitrost: {VELOCITY}{}Zmogljivost: {CARGO_LONG}{}Cena delovanja: {CURRENCY_LONG}/leto +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Cena: {CURRENCY_LONG} Max. hitrost: {VELOCITY}{}Vrsta letala: {STRING}{}Zmogljivost: {CARGO_LONG}{}Stroški obratovanja: {CURRENCY_LONG}/leto # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Zamenjaj {STRING} - {STRING} @@ -3635,6 +3687,10 @@ STR_REPLACE_VEHICLE_ROAD_VEHICLE :Cestno vozilo STR_REPLACE_VEHICLE_SHIP :Ladja STR_REPLACE_VEHICLE_AIRCRAFT :Letalo +STR_REPLACE_VEHICLE_VEHICLES_IN_USE :{YELLOW}Vozila v uporabi +STR_REPLACE_VEHICLE_VEHICLES_IN_USE_TOOLTIP :{BLACK}Stolpec z vozili, ki jih imaš v lasti +STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES :{YELLOW}Vozila na razpolago +STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES_TOOLTIP :{BLACK}Stolpec z vozili na voljo za zamenjavo STR_REPLACE_HELP_LEFT_ARRAY :{BLACK}Izberi tip lokomotive za zamenjati STR_REPLACE_HELP_RIGHT_ARRAY :{BLACK}Izberi vrsto lokomotive, ki jo hočeš prestaviti na levo označeno mesto @@ -3649,7 +3705,6 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} ko se STR_REPLACE_VEHICLES_STOP :{BLACK}Ustavi menjavo vozil STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Pritisni za zaustavitev zamenjave na levi izbranega tipa lokomotive -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Zamenjuje: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Preklop med okni za menjavo lokomotiv in vagonov STR_REPLACE_ENGINES :Lokomotive STR_REPLACE_WAGONS :Vagoni @@ -3745,7 +3800,6 @@ STR_VEHICLE_INFO_AGE :{COMMA} let{P o STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} let{P o i a ""} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Max. hitrost: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Max. hitrost: {LTBLUE}{VELOCITY} {BLACK}Domet: {LTBLUE}{COMMA} polj STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Teža: {LTBLUE}{WEIGHT_SHORT} {BLACK}Moč: {LTBLUE}{POWER}{BLACK} Max. hitrost: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Teža: {LTBLUE}{WEIGHT_SHORT} {BLACK}Moč: {LTBLUE}{POWER}{BLACK} Max. hitrost: {LTBLUE}{VELOCITY} {BLACK}Max. T.E.: {LTBLUE}{FORCE} @@ -3990,6 +4044,10 @@ STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :Potovanje (brez STR_TIMETABLE_TRAVEL_NOT_TIMETABLED_SPEED :Potuj z največ {2:VELOCITY} (brez časovne tabele) STR_TIMETABLE_TRAVEL_FOR :Potuj za {STRING} STR_TIMETABLE_TRAVEL_FOR_SPEED :Pozuj proti {STRING} z najvišjo hitrostjo {VELOCITY} +STR_TIMETABLE_TRAVEL_FOR_ESTIMATED :Potuj (za {STRING}, brez časovne tabele) +STR_TIMETABLE_TRAVEL_FOR_SPEED_ESTIMATED :Potuj (za {STRING}, brez časovne tabele) z največjo hitrostjo {VELOCITY} +STR_TIMETABLE_STAY_FOR_ESTIMATED :(počakaj največ {STRING}, brez časovne tabele) +STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(Potuj z največ {STRING}, brez časovne tabele) STR_TIMETABLE_STAY_FOR :in ostani za {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :s potovanjem za {STRING} STR_TIMETABLE_DAYS :{COMMA} d{P an neva nevi ni} @@ -4231,6 +4289,7 @@ STR_ERROR_EXCAVATION_WOULD_DAMAGE :{WHITE}Izkop bi STR_ERROR_ALREADY_AT_SEA_LEVEL :{WHITE}... že na morski gladini STR_ERROR_TOO_HIGH :{WHITE}... previsoko STR_ERROR_ALREADY_LEVELLED :{WHITE}... je že zravnana +STR_ERROR_BRIDGE_TOO_HIGH_AFTER_LOWER_LAND :{WHITE}Posledično bi bil most višje previsok. # Company related errors STR_ERROR_CAN_T_CHANGE_COMPANY_NAME :{WHITE}Ni mogoče spremeniti imena podjetja... @@ -4281,6 +4340,8 @@ STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... gozd STR_ERROR_CAN_ONLY_BE_BUILT_ABOVE_SNOW_LINE :{WHITE}... lahko se zgradi samo nad snežno mejo STR_ERROR_CAN_ONLY_BE_BUILT_BELOW_SNOW_LINE :{WHITE}... lahko se zgradi samo pod snežno mejo +STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES :{WHITE}Tam ni bilo primernih mest za postavitev industrije '{STRING}' +STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION :{WHITE}Spremeni način ustvarjanja ozemlja, da dobiš boljše ozemlje # Station construction related errors STR_ERROR_CAN_T_BUILD_RAILROAD_STATION :{WHITE}Tukaj ni mogoče zgraditi železniške postaje... @@ -4297,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 @@ -4418,6 +4478,7 @@ STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Najprej STR_ERROR_CAN_T_START_AND_END_ON :{WHITE}Ni mogoče začeti in končati v isti točki STR_ERROR_BRIDGEHEADS_NOT_SAME_HEIGHT :{WHITE}Priključki mosta niso na enaki višini STR_ERROR_BRIDGE_TOO_LOW_FOR_TERRAIN :{WHITE}Most je prenizek za teren +STR_ERROR_BRIDGE_TOO_HIGH_FOR_TERRAIN :{WHITE}Most je previsok za ta teren. STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Začetek in konec morata biti na isti višini STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... oba priključka mostu morata biti na kopnem STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... predolg most @@ -4444,6 +4505,7 @@ STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... ima STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Ni mogoče ustvariti skupine... STR_ERROR_GROUP_CAN_T_DELETE :{WHITE}Ni mogoče zbrisati te skupine... STR_ERROR_GROUP_CAN_T_RENAME :{WHITE}Ni mogoče preimenovati skupine... +STR_ERROR_GROUP_CAN_T_SET_PARENT :{WHITE}Ni mogoče nastaviti višje skupine... STR_ERROR_GROUP_CAN_T_REMOVE_ALL_VEHICLES :{WHITE}Ni mogoče odstraniti vseh vozil iz te skupine... STR_ERROR_GROUP_CAN_T_ADD_VEHICLE :{WHITE}Ni mogoče dodati vozila v to skupino... STR_ERROR_GROUP_CAN_T_ADD_SHARED_VEHICLE :{WHITE}Ni mogoče dodati izmenljivega vozila v skupino... @@ -5026,6 +5088,7 @@ STR_COMPANY_NAME :{COMPANY} STR_COMPANY_NAME_COMPANY_NUM :{COMPANY} {COMPANY_NUM} STR_DEPOT_NAME :{DEPOT} STR_ENGINE_NAME :{ENGINE} +STR_HIDDEN_ENGINE_NAME :{ENGINE} (skrito) STR_GROUP_NAME :{GROUP} STR_INDUSTRY_NAME :{INDUSTRY} STR_PRESIDENT_NAME :{PRESIDENT_NAME} diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index 11559c4a67..43f9d57b19 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -51,18 +51,18 @@ STR_CARGO_PLURAL_WHEAT :{G=m}Trigo STR_CARGO_PLURAL_RUBBER :{G=m}Caucho STR_CARGO_PLURAL_SUGAR :{G=m}Azúcar STR_CARGO_PLURAL_TOYS :{G=m}Juguetes -STR_CARGO_PLURAL_CANDY :{G=m}Dulces +STR_CARGO_PLURAL_CANDY :{G=m}Caramelos STR_CARGO_PLURAL_COLA :{G=f}Cola -STR_CARGO_PLURAL_COTTON_CANDY :{G=m}Algodón Dulce +STR_CARGO_PLURAL_COTTON_CANDY :{G=m}Algodón de Azúcar STR_CARGO_PLURAL_BUBBLES :{G=f}Burbujas -STR_CARGO_PLURAL_TOFFEE :{G=m}Caramelos +STR_CARGO_PLURAL_TOFFEE :{G=m}Tofes STR_CARGO_PLURAL_BATTERIES :{G=f}Pilas STR_CARGO_PLURAL_PLASTIC :{G=m}Plástico STR_CARGO_PLURAL_FIZZY_DRINKS :{G=m}Refrescos # Singular cargo name STR_CARGO_SINGULAR_NOTHING : -STR_CARGO_SINGULAR_PASSENGER :{G=m}Pasajeros +STR_CARGO_SINGULAR_PASSENGER :{G=m}Pasajero STR_CARGO_SINGULAR_COAL :{G=m}Carbón STR_CARGO_SINGULAR_MAIL :{G=m}Correo STR_CARGO_SINGULAR_OIL :{G=m}Petróleo @@ -85,11 +85,11 @@ STR_CARGO_SINGULAR_WHEAT :{G=m}Trigo STR_CARGO_SINGULAR_RUBBER :{G=m}Caucho STR_CARGO_SINGULAR_SUGAR :{G=m}Azúcar STR_CARGO_SINGULAR_TOY :{G=m}Juguete -STR_CARGO_SINGULAR_CANDY :{G=m}Dulce +STR_CARGO_SINGULAR_CANDY :{G=m}Caramelo STR_CARGO_SINGULAR_COLA :{G=f}Cola -STR_CARGO_SINGULAR_COTTON_CANDY :{G=m}Algodón Dulce +STR_CARGO_SINGULAR_COTTON_CANDY :{G=m}Algodón de Azúcar STR_CARGO_SINGULAR_BUBBLE :{G=f}Burbuja -STR_CARGO_SINGULAR_TOFFEE :{G=m}Caramelo +STR_CARGO_SINGULAR_TOFFEE :{G=m}Tofe STR_CARGO_SINGULAR_BATTERY :{G=f}Pila STR_CARGO_SINGULAR_PLASTIC :{G=m}Plástico STR_CARGO_SINGULAR_FIZZY_DRINK :{G=m}Refresco @@ -111,7 +111,7 @@ STR_QUANTITY_COPPER_ORE :{WEIGHT_LONG} d STR_QUANTITY_MAIZE :{WEIGHT_LONG} de maíz STR_QUANTITY_FRUIT :{WEIGHT_LONG} de fruta STR_QUANTITY_DIAMONDS :{COMMA}{NBSP}bolsa{P "" s} de diamantes -STR_QUANTITY_FOOD :{WEIGHT_LONG} de alimento +STR_QUANTITY_FOOD :{WEIGHT_LONG} de alimentos STR_QUANTITY_PAPER :{WEIGHT_LONG} de papel STR_QUANTITY_GOLD :{COMMA}{NBSP}bolsa{P "" s} de oro STR_QUANTITY_WATER :{VOLUME_LONG} de agua @@ -119,11 +119,11 @@ STR_QUANTITY_WHEAT :{WEIGHT_LONG} d STR_QUANTITY_RUBBER :{VOLUME_LONG} de caucho STR_QUANTITY_SUGAR :{WEIGHT_LONG} de azúcar STR_QUANTITY_TOYS :{COMMA}{NBSP}juguete{P "" s} -STR_QUANTITY_SWEETS :{COMMA}{NBSP}bolsa{P "" s} de dulces +STR_QUANTITY_SWEETS :{COMMA}{NBSP}bolsa{P "" s} de caramelos STR_QUANTITY_COLA :{VOLUME_LONG} de cola STR_QUANTITY_CANDYFLOSS :{WEIGHT_LONG} de algodón dulce STR_QUANTITY_BUBBLES :{COMMA} burbuja{P "" s} -STR_QUANTITY_TOFFEE :{WEIGHT_LONG} de caramelo{P "" s} +STR_QUANTITY_TOFFEE :{WEIGHT_LONG} de tofe{P "" s} STR_QUANTITY_BATTERIES :{COMMA} pila{P "" s} STR_QUANTITY_PLASTIC :{VOLUME_LONG} de plástico STR_QUANTITY_FIZZY_DRINKS :{COMMA} refresco{P "" s} @@ -229,10 +229,10 @@ STR_LIST_FILTER_TITLE :{BLACK}Patrón STR_LIST_FILTER_OSKTITLE :{BLACK}Escriba un patrón de filtrado STR_LIST_FILTER_TOOLTIP :{BLACK}Introduzca una palabra clave para filtrar la lista -STR_TOOLTIP_GROUP_ORDER :{BLACK}Seleccionar orden de agrupamiento -STR_TOOLTIP_SORT_ORDER :{BLACK}Seleccione ordenación (descendiente/ascendiente) -STR_TOOLTIP_SORT_CRITERIA :{BLACK}Seleccione criterio de orden -STR_TOOLTIP_FILTER_CRITERIA :{BLACK}Seleccione criterio de filtrado +STR_TOOLTIP_GROUP_ORDER :{BLACK}Selecciona orden de agrupamiento +STR_TOOLTIP_SORT_ORDER :{BLACK}Selecciona orden de clasificación (descendiente/ascendiente) +STR_TOOLTIP_SORT_CRITERIA :{BLACK}Selecciona orden de clasificación +STR_TOOLTIP_FILTER_CRITERIA :{BLACK}Selecciona criterio de filtrado STR_BUTTON_SORT_BY :{BLACK}Ordenar por STR_BUTTON_LOCATION :{BLACK}Sitio STR_BUTTON_RENAME :{BLACK}Renombrar @@ -286,7 +286,7 @@ STR_SORT_BY_TYPE :Tipo STR_SORT_BY_TRANSPORTED :Transportado STR_SORT_BY_NUMBER :Número STR_SORT_BY_PROFIT_LAST_YEAR :Beneficio año pasado -STR_SORT_BY_PROFIT_THIS_YEAR :Beneficio año actual +STR_SORT_BY_PROFIT_THIS_YEAR :Beneficio este año STR_SORT_BY_AGE :Edad STR_SORT_BY_RELIABILITY :Fiabilidad STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :Capacidad por tipo de carga @@ -468,14 +468,15 @@ STR_NEWS_MENU_MESSAGE_HISTORY_MENU :Historial de me ############ range ends here ############ range for about menu starts -STR_ABOUT_MENU_LAND_BLOCK_INFO :Información sobre terreno +STR_ABOUT_MENU_LAND_BLOCK_INFO :Información del terreno STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :Activar consola -STR_ABOUT_MENU_AI_DEBUG :Depuración de Script de IA / Juego +STR_ABOUT_MENU_AI_DEBUG :Depuración de Script de Juego / IA STR_ABOUT_MENU_SCREENSHOT :Captura de pantalla 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 @@ -660,7 +662,7 @@ STR_MUSIC_TOOLTIP_SKIP_TO_PREVIOUS_TRACK :{BLACK}Saltar a STR_MUSIC_TOOLTIP_SKIP_TO_NEXT_TRACK_IN_SELECTION :{BLACK}Saltar a la siguiente pista de la selección STR_MUSIC_TOOLTIP_STOP_PLAYING_MUSIC :{BLACK}Detener música STR_MUSIC_TOOLTIP_START_PLAYING_MUSIC :{BLACK}Comenzar música -STR_MUSIC_TOOLTIP_DRAG_SLIDERS_TO_SET_MUSIC :{BLACK}Mueva los cursores para fijar volumen de música y efectos +STR_MUSIC_TOOLTIP_DRAG_SLIDERS_TO_SET_MUSIC :{BLACK}Arrastre los controles deslizantes para ajustar el volumen de música y efectos STR_MUSIC_TOOLTIP_SELECT_ALL_TRACKS_PROGRAM :{BLACK}Seleccionar programa 'todas las pistas' STR_MUSIC_TOOLTIP_SELECT_OLD_STYLE_MUSIC :{BLACK}Seleccionar programa 'estilo antiguo' STR_MUSIC_TOOLTIP_SELECT_NEW_STYLE_MUSIC :{BLACK}Seleccionar programa 'estilo moderno' @@ -670,17 +672,17 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Seleccio STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Encender/apagar mezclador STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Mostrar ventana de selección de pistas musicales -STR_ERROR_NO_SONGS :{WHITE}Se ha seleccionado un conjunto de música sin canciones. No se reproducirá música - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Selección del programa de música +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} @@ -814,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}! @@ -870,7 +873,7 @@ STR_NEWS_STATION_NOW_ACCEPTS_CARGO_AND_CARGO :{WHITE}{STATION STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Oferta de subvención terminada:{}{}{STRING} de {STRING} a {STRING} ya no conlleva una subvención STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Subvención retirada:{}{}Servicio de {STRING} desde {STRING} a {STRING} ya no está subvencionado STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Se ofrece subvención:{}{}¡Al primer servicio de {STRING} que cubra la línea desde {STRING} a {STRING} se le otorgará una subvención durante un año por parte de las autoridades locales! -STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}¡Subvención otorgada a {STRING}!{}{}¡Servicio de {STRING} desde {STRING} a {STRING} pagará el 50% más durante un año! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}¡Subvención otorgada a {STRING}!{}{}¡Servicio de {STRING} desde {STRING} a {STRING} pagará un 50% más durante un año! STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}¡Subvención otorgada a {STRING}!{}{}¡Servicio de {STRING} desde {STRING} a {STRING} pagará tasa doble durante un año! STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}¡Subvención otorgada a {STRING}!{}{}¡Servicio de {STRING} desde {STRING} a {STRING} pagará tasa triple durante un año! STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}¡Subvención otorgada a {STRING}!{}{}¡Servicio de {STRING} desde {STRING} a {STRING} pagará tasa cuádruple durante un año! @@ -881,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 @@ -926,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 @@ -978,7 +982,7 @@ STR_GAME_OPTIONS_FULLSCREEN :{BLACK}Pantalla STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP :{BLACK}Marca esta opción para jugar OpenTTD a pantalla completa STR_GAME_OPTIONS_RESOLUTION :{BLACK}Resolución de pantalla -STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Seleccione la resolución de pantalla a usar +STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Selecciona la resolución de pantalla a usar STR_GAME_OPTIONS_RESOLUTION_OTHER :Otras STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Tamaño de la interfaz @@ -1048,7 +1052,7 @@ STR_VARIETY_VERY_LOW :Muy baja STR_VARIETY_LOW :Baja STR_VARIETY_MEDIUM :Media STR_VARIETY_HIGH :Alta -STR_VARIETY_VERY_HIGH :Muy Alta +STR_VARIETY_VERY_HIGH :Muy alta STR_AI_SPEED_VERY_SLOW :Muy lenta STR_AI_SPEED_SLOW :Lenta @@ -1325,10 +1329,10 @@ STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :A la izquierda STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Sentido horario STR_CONFIG_SETTING_SE_FLAT_WORLD_HEIGHT :El nivel de la altura del mapa plano tiene: {STRING} STR_CONFIG_SETTING_EDGES_NOT_EMPTY :{WHITE}Una o más casillas del borde norte no están vacías -STR_CONFIG_SETTING_EDGES_NOT_WATER :{WHITE}Una o más casillas en uno de los bordes no son agua +STR_CONFIG_SETTING_EDGES_NOT_WATER :{WHITE}Una o más casillas en uno de los bordes no es agua STR_CONFIG_SETTING_STATION_SPREAD :Máxima extensión de estaciones: {STRING} -STR_CONFIG_SETTING_STATION_SPREAD_HELPTEXT :Máxima área que pueden ocupar las partes de una estación. Valores muy altos pueden ralentizar el juego +STR_CONFIG_SETTING_STATION_SPREAD_HELPTEXT :Área máxima que pueden ocupar las partes de una estación. Cuidado, los valores muy altos pueden ralentizar el juego STR_CONFIG_SETTING_SERVICEATHELIPAD :Realizar, automáticamente, el mantenimiento de los helicópteros en helipuertos: {STRING} STR_CONFIG_SETTING_SERVICEATHELIPAD_HELPTEXT :Dar servicio a los helicópteros después de cada aterrizaje, aunque no haya hangar en el aeropuerto STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR :Une la barra de terreno a la barra de construcción: {STRING} @@ -1338,8 +1342,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Color a usar pa STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Verde STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Verde oscuro STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violeta -STR_CONFIG_SETTING_REVERSE_SCROLLING :Desplazamiento de vista invertido: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Comportamiento del juego al arrastrar el mapa con el botón derecho. Si se desactiva, el ratón mueve la cámara. Si se activa, el ratón mueve el mapa STR_CONFIG_SETTING_SMOOTH_SCROLLING :Desplazamiento de vista suavizado: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Controla la forma en la que la vista principal se mueve a una posición específica como resultado de hacer click en el mapa o al enviar la orden de moverse a un objeto determinado del mapa. Si se activa, la vista se mueve de forma suave. Si se desactiva, la vista se mueve directamente al destino STR_CONFIG_SETTING_MEASURE_TOOLTIP :Mostrar medidas usando las herramientas de construcción: {STRING} @@ -1371,8 +1373,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+Click STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Click STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Desactivado -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Desplazamiento con botón izquierdo: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Activa el deslizamiento del mapa al arrastrarlo con el botón izquierdo. Esto es especialmente útil al usar pantallas táctiles +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Cerrar ventana con click derecho: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Cierra una ventana al hacer click derecho dentro. ¡Quita la información al hacer click derecho! STR_CONFIG_SETTING_AUTOSAVE :Autoguardado: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Selecciona el intervalo entre guardados automáticos del juego @@ -1431,7 +1433,7 @@ STR_CONFIG_SETTING_SOUND_AMBIENT :Ambiental: {STR STR_CONFIG_SETTING_SOUND_AMBIENT_HELPTEXT :Reproducir sonidos ambientales de terreno, industrias y municipios STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING :Deshabilitar construcción de infraestructuras cuando no haya vehículos apropiados disponibles: {STRING} -STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING_HELPTEXT :Cuando se activa, solamente se pueden construir infraestructuras si hay vehículos disponibles para ellas, previniendo un gasto innecesario de tiempo y dinero +STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING_HELPTEXT :Cuando se activa, solo pueden construirse infraestructuras si hay vehículos disponibles para ellas, previniendo un gasto innecesario de tiempo y dinero STR_CONFIG_SETTING_MAX_TRAINS :Número máximo de trenes por empresa: {STRING} STR_CONFIG_SETTING_MAX_TRAINS_HELPTEXT :Número máximo de trenes que una compañía puede tener STR_CONFIG_SETTING_MAX_ROAD_VEHICLES :Número máximo de automóviles por empresa: {STRING} @@ -1444,14 +1446,14 @@ STR_CONFIG_SETTING_MAX_SHIPS_HELPTEXT :Número máximo STR_CONFIG_SETTING_AI_BUILDS_TRAINS :Desactivar trenes para el ordenador: {STRING} STR_CONFIG_SETTING_AI_BUILDS_TRAINS_HELPTEXT :Activar esta opción deshabilita la construcción de trenes para las IA STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES :Desactivar vehículos de carretera para el ordenador: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES_HELPTEXT :Activar esta opción deshabilita la construcción de vehículos de carretra para las IA +STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES_HELPTEXT :Activar esta opción deshabilita la construcción de vehículos de carretera para las IA STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT :Desactivar aeroplanos para el ordenador: {STRING} STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT_HELPTEXT :Activar esta opción deshabilita la construcción de aeronaves para las IA STR_CONFIG_SETTING_AI_BUILDS_SHIPS :Desactivar barcos para el ordenador: {STRING} STR_CONFIG_SETTING_AI_BUILDS_SHIPS_HELPTEXT :Activar esta opción deshabilita la construcción de barcos para las IA STR_CONFIG_SETTING_AI_PROFILE :Perfil por defecto: {STRING} -STR_CONFIG_SETTING_AI_PROFILE_HELPTEXT :Permite decidir el perfil a emplear para IA aleatorias o para los valores iniciales al añadir una nueva IA o un script de juego +STR_CONFIG_SETTING_AI_PROFILE_HELPTEXT :Permite decidir el perfil a emplear para IAs aleatorias o para los valores iniciales al añadir una nueva IA o un script de juego STR_CONFIG_SETTING_AI_PROFILE_EASY :Fácil STR_CONFIG_SETTING_AI_PROFILE_MEDIUM :Intermedio STR_CONFIG_SETTING_AI_PROFILE_HARD :Difícil @@ -1464,7 +1466,7 @@ STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :Número máximo STR_CONFIG_SETTING_SERVINT_ISPERCENT :Intervalo de mantenimiento en porcentajes: {STRING} STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Permite escoger si el mantenimiento de vehículos comenzará debido al tiempo pasado desde el último mantenimiento o por una reducción de la fiabilidad más allá de un porcentaje determinado STR_CONFIG_SETTING_SERVINT_TRAINS :Intervalo de mantenimiento por defecto para trenes: {STRING} -STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Fija el intervalo de mantenimiento por defecto para vehículos de ferrocarril nuevos, que se empleará si no se define un intervalo de forma explícita para ese vehículo +STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Fija el intervalo de mantenimiento por defecto para los nuevos vehículos de ferrocarril, siendo usado este si no se define un intervalo de forma explícita para ese vehículo STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}día{P 0 "" s}/% STR_CONFIG_SETTING_SERVINT_DISABLED :Deshabilitado STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES :Intervalo de mantenimiento por defecto para vehículos de carretera: {STRING} @@ -1476,7 +1478,7 @@ STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :Fija el interva STR_CONFIG_SETTING_NOSERVICE :Desactivar mantenimiento cuando las averías están desactivadas: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Cuando se activa, los vehículos no reciben mantenimiento si no pueden romperse STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Activar límites de velocidad en vagones: {STRING} -STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Si se activa, se tienen en cuenta los límites de velocidad de los vagones a la hora de decidir la máxima velocidad de un tren +STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Si se activa, se tienen en cuenta los límites de velocidad de los vagones a la hora de decidir la velocidad máxima de un tren STR_CONFIG_SETTING_DISABLE_ELRAILS :Desactivar ferrocarriles eléctricos: {STRING} STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT :Si se activa, no es necesario electrificar los ferrocarriles para hacer que los trenes eléctricos puedan recorrerlos @@ -1495,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} @@ -1575,16 +1577,16 @@ STR_CONFIG_SETTING_STATUSBAR_POS :Posición de la STR_CONFIG_SETTING_STATUSBAR_POS_HELPTEXT :Posición horizontal de la barra de estado en la parte inferior de la pantalla STR_CONFIG_SETTING_SNAP_RADIUS :Radio de fijación de ventana: {STRING} STR_CONFIG_SETTING_SNAP_RADIUS_HELPTEXT :Distancia máxima entre ventanas antes de que la ventana que se está moviendo sea alineada automáticamente con las ventanas cercanas -STR_CONFIG_SETTING_SNAP_RADIUS_VALUE :{COMMA} pixel{P 0 "" s} +STR_CONFIG_SETTING_SNAP_RADIUS_VALUE :{COMMA} pixel{P 0 "" es} STR_CONFIG_SETTING_SNAP_RADIUS_DISABLED :deshabilitado STR_CONFIG_SETTING_SOFT_LIMIT :Máximo número de ventanas sin anclar: {STRING} STR_CONFIG_SETTING_SOFT_LIMIT_HELPTEXT :Número máximo de ventanas sin anclar que pueden estar abiertas antes de que las más antiguas se cierren automáticamente para dejar paso a las nuevas STR_CONFIG_SETTING_SOFT_LIMIT_VALUE :{COMMA} STR_CONFIG_SETTING_SOFT_LIMIT_DISABLED :deshabilitado STR_CONFIG_SETTING_ZOOM_MIN :Máximo acercamiento: {STRING} -STR_CONFIG_SETTING_ZOOM_MIN_HELPTEXT :Máximo nivel de acercamiento para las ventanas de vista y la vista principal. Aumentar el nivel de acercamiento aumenta el consumo de memoria del juego +STR_CONFIG_SETTING_ZOOM_MIN_HELPTEXT :Nivel máximo de acercamiento para las ventanas de vista y la vista principal. Cuidado, aumentar el nivel de acercamiento incrementa el consumo de memoria del juego STR_CONFIG_SETTING_ZOOM_MAX :Máximo alejamiento: {STRING} -STR_CONFIG_SETTING_ZOOM_MAX_HELPTEXT :Máximo nivel de alejamiento para las ventanas de vista y la vista principal. Niveles altos de alejamiento pueden hacer que el juego se ralentize +STR_CONFIG_SETTING_ZOOM_MAX_HELPTEXT :Nivel máximo de alejamiento para las ventanas de vista y la vista principal. Cuidado, niveles altos de alejamiento pueden ralentizar el juego STR_CONFIG_SETTING_ZOOM_LVL_MIN :4x STR_CONFIG_SETTING_ZOOM_LVL_IN_2X :2x STR_CONFIG_SETTING_ZOOM_LVL_NORMAL :Normal @@ -1602,13 +1604,13 @@ STR_CONFIG_SETTING_LARGER_TOWNS :Proporción de STR_CONFIG_SETTING_LARGER_TOWNS_HELPTEXT :Número de pueblos que se convertirán en ciudades. Las ciudades comienzan siendo más grandes y crecen más rápido STR_CONFIG_SETTING_LARGER_TOWNS_VALUE :1 de cada {COMMA} STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Ninguna -STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Multiplicador inicial tamaño de ciudad: {STRING} +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 @@ -1621,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} @@ -1713,11 +1715,11 @@ STR_CONFIG_ERROR_DUPLICATE_GRFID :{WHITE}... igno STR_CONFIG_ERROR_INVALID_GRF :{WHITE}... ignorando NewGRF inválido '{STRING}': {STRING} STR_CONFIG_ERROR_INVALID_GRF_NOT_FOUND :no encontrado STR_CONFIG_ERROR_INVALID_GRF_UNSAFE :inseguro para uso estático -STR_CONFIG_ERROR_INVALID_GRF_SYSTEM :NewGRF de sistema +STR_CONFIG_ERROR_INVALID_GRF_SYSTEM :NewGRF del sistema STR_CONFIG_ERROR_INVALID_GRF_INCOMPATIBLE :incompatible con esta versión de OpenTTD STR_CONFIG_ERROR_INVALID_GRF_UNKNOWN :desconocido STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_LEVEL :{WHITE}... el nivel de compresión '{STRING}' no es válido -STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_ALGORITHM :{WHITE}... el formato de guardado '{STRING}' no está disponible. Revertiendo a '{STRING}' +STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_ALGORITHM :{WHITE}... el formato de guardado '{STRING}' no está disponible. Revirtiendo a '{STRING}' STR_CONFIG_ERROR_INVALID_BASE_GRAPHICS_NOT_FOUND :{WHITE}... ignorando conjunto de gráficos base '{STRING}': no encontrado STR_CONFIG_ERROR_INVALID_BASE_SOUNDS_NOT_FOUND :{WHITE}... ignorando conjunto de sonidos base '{STRING}': no encontrado STR_CONFIG_ERROR_INVALID_BASE_MUSIC_NOT_FOUND :{WHITE}... ignorando conjunto de música base '{STRING}': no encontrado @@ -1759,10 +1761,11 @@ STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Mostrar STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Mostrar configuración STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Muestra ajustes de NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Comprobar si hay nuevos contenidos actualizados para descargar -STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Mostrar configuración de scripts de IA y Juego +STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Mostrar configuración de scripts de juego e IAs STR_INTRO_TOOLTIP_QUIT :{BLACK}Salir de 'OpenTTD' -STR_INTRO_TRANSLATION :{BLACK}A esta traducción le faltan {NUM} cadena{P "" s}. Considera ayudar a mejorar OpenTTD convirtiéndote en traductor. Consulta readme.txt para más detalles. +STR_INTRO_BASESET :{BLACK}El conjunto de gráficos base actualmente seleccionado no encuentra {NUM} sprite{P "" s}. Comprueba si hay actualizaciones para el conjunto base, o usa otro totalmente actualizado. +STR_INTRO_TRANSLATION :{BLACK}A esta traducción le faltan {NUM} cadena{P "" s} de texto. Considera ayudar a mejorar OpenTTD convirtiéndote en traductor. Consulta el readme.txt para más detalles. # Quit window STR_QUIT_CAPTION :{WHITE}Salir @@ -1865,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 @@ -2261,7 +2264,7 @@ STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_FILE_NOT_WRITABLE :{WHITE}... no s STR_CONTENT_ERROR_COULD_NOT_EXTRACT :{WHITE}No ha sido posible descomprimir el archivo descargado STR_MISSING_GRAPHICS_SET_CAPTION :{WHITE}Gráficos no encontrados -STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD necesita gráficos para funcionar pero no se pudo encontrar ninguno. ¿Desea permitir que OpenTTD descargue e instale dichos gráficos? +STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD necesita gráficos para funcionar pero no pudo encontrarse ninguno. ¿Desea permitir que OpenTTD descargue e instale dichos gráficos? STR_MISSING_GRAPHICS_YES_DOWNLOAD :{BLACK}Sí, descargar los gráficos STR_MISSING_GRAPHICS_NO_QUIT :{BLACK}No, salir de OpenTTD @@ -2282,7 +2285,8 @@ STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Poner ob STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Leyenda de Movimientos de Carga STR_LINKGRAPH_LEGEND_ALL :{BLACK}Todas STR_LINKGRAPH_LEGEND_NONE :{BLACK}Ninguna -STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Seleccione las compañías a ser mostradas +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 @@ -2377,10 +2381,10 @@ STR_SELECT_ROAD_BRIDGE_CAPTION :{WHITE}Elige pu STR_SELECT_BRIDGE_SELECTION_TOOLTIP :{BLACK}Selección de puente - Click en el puente elegido para construirlo STR_SELECT_BRIDGE_INFO :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY_LONG} STR_SELECT_BRIDGE_SCENEDIT_INFO :{GOLD}{STRING},{} {VELOCITY} -STR_BRIDGE_NAME_SUSPENSION_STEEL :Suspensión, Acero +STR_BRIDGE_NAME_SUSPENSION_STEEL :Colgante, Acero STR_BRIDGE_NAME_GIRDER_STEEL :Tirantes, Acero -STR_BRIDGE_NAME_CANTILEVER_STEEL :Colgante, Acero -STR_BRIDGE_NAME_SUSPENSION_CONCRETE :Suspensión, Hormigón +STR_BRIDGE_NAME_CANTILEVER_STEEL :Cantiléver, Acero +STR_BRIDGE_NAME_SUSPENSION_CONCRETE :Colgante, Hormigón STR_BRIDGE_NAME_WOODEN :Madera STR_BRIDGE_NAME_CONCRETE :Hormigón STR_BRIDGE_NAME_TUBULAR_STEEL :Tubular, Acero @@ -2524,7 +2528,7 @@ STR_FOUND_TOWN_NAME_EDITOR_HELP :{BLACK}Click pa STR_FOUND_TOWN_NAME_RANDOM_BUTTON :{BLACK}Nombre aleatorio STR_FOUND_TOWN_NAME_RANDOM_TOOLTIP :{BLACK}Generar nuevo nombre -STR_FOUND_TOWN_INITIAL_SIZE_TITLE :{YELLOW}Tamaño municipio: +STR_FOUND_TOWN_INITIAL_SIZE_TITLE :{YELLOW}Tamaño del municipio: STR_FOUND_TOWN_INITIAL_SIZE_SMALL_BUTTON :{BLACK}Pequeña STR_FOUND_TOWN_INITIAL_SIZE_MEDIUM_BUTTON :{BLACK}Mediana STR_FOUND_TOWN_INITIAL_SIZE_LARGE_BUTTON :{BLACK}Grande @@ -2569,7 +2573,7 @@ STR_INDUSTRY_CARGOES_SELECT_INDUSTRY :{BLACK}Seleccio STR_INDUSTRY_CARGOES_SELECT_INDUSTRY_TOOLTIP :{BLACK}Permite seleccionar la industria a mostrar # Land area window -STR_LAND_AREA_INFORMATION_CAPTION :{WHITE}Información sobre el terreno +STR_LAND_AREA_INFORMATION_CAPTION :{WHITE}Información del terreno STR_LAND_AREA_INFORMATION_COST_TO_CLEAR_N_A :{BLACK}Coste de despeje: {LTBLUE}N/D STR_LAND_AREA_INFORMATION_COST_TO_CLEAR :{BLACK}Coste de despeje: {RED}{CURRENCY_LONG} STR_LAND_AREA_INFORMATION_REVENUE_WHEN_CLEARED :{BLACK}Beneficio cuando es limpiado: {LTBLUE}{CURRENCY_LONG} @@ -2590,6 +2594,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Nombre d STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Carga aceptada: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Tipo de ferrocarril: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Límite de velocidad del ferrocarril: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Límite de velocidad de carretera: {LTBLUE}{VELOCITY} @@ -2602,29 +2607,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Campos STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Tierra cubierta por nieve STR_LAI_CLEAR_DESCRIPTION_DESERT :Desierto -STR_LAI_RAIL_DESCRIPTION_TRACK :Vía de {STRING} -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} con señales de bloque -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} con señales de entrada -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} con señales de salida -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} con señales combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} con señales de ruta -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} con señales de ruta de un solo sentido -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} con señales de bloque y señales de entrada -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} con señales de bloque y señales de salida -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} con señales de bloque y señales combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} con señales de bloque y señales de ruta -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} con señales de bloque y señales de ruta de un solo sentido -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} con señales de entrada y señales de salida -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} con señales de entrada y señales combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} con señales de entrada y señales de ruta -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} con señales de entrada y señales de ruta de un solo sentido -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} con señales de salida y señales combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} con señales de salida y señales de ruta -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} con señales de salida y señales de ruta de un solo sentido -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} con señales combo y señales de ruta -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} con señales combo y señales de ruta de un solo sentido -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} con señales de ruta y señales de ruta de un solo sentido -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} depósito de tren +STR_LAI_RAIL_DESCRIPTION_TRACK :Vía de ferrocarril +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Vía de ferrocarril con señales de bloque +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Vía de ferrocarril con señales de entrada +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Vía de ferrocarril con señales de salida +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Vía de ferrocarril con señales combo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Vía de ferrocarril con señales de ruta +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Vía de ferrocarril con señales de ruta de un solo sentido +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Vía de ferrocarril con señales de bloque y de entrada +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Vía de ferrocarril con señales de bloque y de salida +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Vía de ferrocarril con señales de bloque y combo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Vía de ferrocarril con señales de bloque y de ruta +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Vía de ferrocarril con señales de bloque y de ruta de un solo sentido +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Ferrocarril con señales de entrada y de salida +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Vía de ferrocarril con señales de entrada y combo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Vía de ferrocarril con señales de entrada y de ruta +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Ferrocarril con señales de entrada y de ruta de un solo sentido +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Vía de ferrocarril con señales de salida y combo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Vía de ferrocarril con señales de salida y de ruta +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Vía de ferrocarril con señales de salida y de ruta de un solo sentido +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Vía de ferrocarril con señales combo y de ruta +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Vía de ferrocarril con señales combo y de ruta de un solo sentido +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Vía de ferrocarril con señales de dirección y de un solo sentido +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Depósito de trenes del ferrocarril STR_LAI_ROAD_DESCRIPTION_ROAD :Carretera STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Carretera con farolas @@ -2663,7 +2668,7 @@ STR_LAI_TUNNEL_DESCRIPTION_ROAD :Túnel de carre STR_LAI_BRIDGE_DESCRIPTION_RAIL_SUSPENSION_STEEL :Puente de ferrocarril de acero suspendido STR_LAI_BRIDGE_DESCRIPTION_RAIL_GIRDER_STEEL :Puente de ferrocarril de acero con tirantes -STR_LAI_BRIDGE_DESCRIPTION_RAIL_CANTILEVER_STEEL :Puente de ferrocarril colgante de acero +STR_LAI_BRIDGE_DESCRIPTION_RAIL_CANTILEVER_STEEL :Puente de ferrocarril cantiléver de acero STR_LAI_BRIDGE_DESCRIPTION_RAIL_SUSPENSION_CONCRETE :Puente de ferrocarril de hormigón suspendido reforzado STR_LAI_BRIDGE_DESCRIPTION_RAIL_WOODEN :Puente de ferrocarril de madera STR_LAI_BRIDGE_DESCRIPTION_RAIL_CONCRETE :Puente de ferrocarril de hormigón @@ -2671,7 +2676,7 @@ STR_LAI_BRIDGE_DESCRIPTION_RAIL_TUBULAR_STEEL :Puente de ferro STR_LAI_BRIDGE_DESCRIPTION_ROAD_SUSPENSION_STEEL :Puente de carretera de acero suspendido STR_LAI_BRIDGE_DESCRIPTION_ROAD_GIRDER_STEEL :Puente de carretera de acero con tirantes -STR_LAI_BRIDGE_DESCRIPTION_ROAD_CANTILEVER_STEEL :Puente de carretera colgante de acero +STR_LAI_BRIDGE_DESCRIPTION_ROAD_CANTILEVER_STEEL :Puente de carretera cantiléver de acero STR_LAI_BRIDGE_DESCRIPTION_ROAD_SUSPENSION_CONCRETE :Puente de carretera de hormigón suspendido reforzado STR_LAI_BRIDGE_DESCRIPTION_ROAD_WOODEN :Puente de carretera de madera STR_LAI_BRIDGE_DESCRIPTION_ROAD_CONCRETE :Puente de carretera de hormigón @@ -2688,7 +2693,35 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Terreno propied STR_ABOUT_OPENTTD :{WHITE}Acerca de OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyright Original {COPYRIGHT} 1995 Chris Sawyer, Todos los derechos reservados STR_ABOUT_VERSION :{BLACK}OpenTTD versión {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 El equipo OpenTTD +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 @@ -2712,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 @@ -2778,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 @@ -2897,7 +2931,7 @@ STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} est STR_NEWGRF_ERROR_INVALID_PARAMETER :Parámetro incorrecto para {1:STRING}: párametro {STRING} ({NUM}) STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} debe ser cargado antes de {STRING} STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} debe ser cargado después de {STRING} -STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} requiere OpenTTD versión {STRING} ó superior +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} necesita la versión {STRING} ó superior de OpenTTD STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :El archivo GRF ha sido diseñado para ser traducido STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Demasiados NewGRFs han sido cargados STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Cargar {1:STRING} como NewGRF estático con {STRING} puede causar desincronizaciones @@ -2907,11 +2941,10 @@ STR_NEWGRF_ERROR_INVALID_ID :Intento de usar STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} contiene un sprite corrupto. Todos los sprites corruptos serán mostrados como un interrogante rojo (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Contiene múltiples entradas de Acción 8 (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Lectura más allá del fin de un pseudo-sprite (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Al conjunto de gráficos base actualmente en uso le faltan algunos sprites.{}El conjunto de gráficos base debe ser actualizado -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Al conjunto de gráficos base actualmente en uso le faltan algunos sprites.{}El conjunto de gráficos base debe ser actualizado.{}Dado que estás jugando una {YELLOW}versión de desarrollo de OpenTTD{WHITE}, es posible que también necesites una {YELLOW}versión de desarrollo del conjunto de gráficos base{WHITE} 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! @@ -2937,7 +2970,7 @@ STR_NEWGRF_BROKEN :{WHITE}Es proba STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}Ha cambiado el estado 'vagón motorizado' para '{1:ENGINE}' cuando no estaba dentro de un depósito STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}Ha cambiado la longitud del vehículo para '{1:ENGINE}' cuando no estaba dentro de un depósito STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Ha cambiado la capacidad del vehículo para '{1:ENGINE}' fuera de un depósito o mientras no se estaba remodelando -STR_BROKEN_VEHICLE_LENGTH :{WHITE}Tren '{VEHICLE}' perteneciente a '{COMPANY}' tiene una longitud incorrecta. Puede ser debido a problemas con los NewGRF. El juego puede fallar +STR_BROKEN_VEHICLE_LENGTH :{WHITE}El tren '{VEHICLE}' perteneciente a '{COMPANY}' tiene una longitud incorrecta. Esto puede ser debido a problemas con los NewGRF. El juego puede desincronizarse o, incluso, fallar por completo STR_NEWGRF_BUGGY :{WHITE}El NewGRF '{0:STRING}' da información incorrecta STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}La información de carga/reforma para '{1:ENGINE}' difiere de la de lista de compra después de la construcción. Esto puede causar que la renovación/reemplazo automático no haga la reforma correcta @@ -2976,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} @@ -2983,8 +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_PASSENGERS_LAST_MONTH_MAX :{BLACK}Pasajeros último mes: {ORANGE}{COMMA}{BLACK} Máx.: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Correo último mes: {ORANGE}{COMMA}{BLACK} Máx.: {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 @@ -2992,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 @@ -3102,7 +3135,7 @@ STR_STATION_LIST_STATION :{YELLOW}{STATIO STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOINT} STR_STATION_LIST_NONE :{YELLOW}- Ninguna - STR_STATION_LIST_SELECT_ALL_FACILITIES :{BLACK}Seleccionar todos los tipos de estación -STR_STATION_LIST_SELECT_ALL_TYPES :{BLACK}Seleccionar todos los tipos de carga (incluidas las que no están en espera) +STR_STATION_LIST_SELECT_ALL_TYPES :{BLACK}Selecciona todos los tipos de carga (incluidas las que no están en espera) STR_STATION_LIST_NO_WAITING_CARGO :{BLACK}Ningún tipo de carga está esperando # Station view window @@ -3115,8 +3148,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Acepta STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Mostrar lista de carga aceptada STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Acepta: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Esta estación tiene derechos de transporte exclusivos en este municipio. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} compró derechos de transporte exclusivo en este municipio. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Esta estación tiene derechos de transporte exclusivos en este municipio. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} compró derechos de transporte exclusivo en este municipio. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Calificación STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Ver calificación de la estación @@ -3232,7 +3265,7 @@ STR_COMPANY_VIEW_INFRASTRUCTURE_AIRPORT :{WHITE}{COMMA} STR_COMPANY_VIEW_INFRASTRUCTURE_NONE :{WHITE}Ninguna STR_COMPANY_VIEW_BUILD_HQ_BUTTON :{BLACK}Construir Sede -STR_COMPANY_VIEW_BUILD_HQ_TOOLTIP :{BLACK}Construir sede de la empresa +STR_COMPANY_VIEW_BUILD_HQ_TOOLTIP :{BLACK}Construir la sede de la empresa STR_COMPANY_VIEW_VIEW_HQ_BUTTON :{BLACK}Ver Sede STR_COMPANY_VIEW_VIEW_HQ_TOOLTIP :{BLACK}Ver sede de la empresa STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Reubicar Sede @@ -3291,13 +3324,15 @@ STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}La indu ############ range for requires starts STR_INDUSTRY_VIEW_REQUIRES_CARGO :{BLACK}Requiere: {YELLOW}{STRING}{STRING} -STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Requiere: {YELLOW}{STRING}{STRING}, {STRING}{STRING} +STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Necesita: {YELLOW}{STRING}{STRING}, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Requiere: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Necesita: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} esperando{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Carga esperando a ser procesada: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produce: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Produce: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3309,19 +3344,19 @@ STR_CONFIG_GAME_PRODUCTION_LEVEL :{WHITE}Cambiar STR_VEHICLE_LIST_TRAIN_CAPTION :{WHITE}{STRING} - {COMMA} Trenes STR_VEHICLE_LIST_ROAD_VEHICLE_CAPTION :{WHITE}{STRING} - {COMMA} Vehículos de Carretera STR_VEHICLE_LIST_SHIP_CAPTION :{WHITE}{STRING} - {COMMA} Barcos -STR_VEHICLE_LIST_AIRCRAFT_CAPTION :{WHITE}{STRING} - {COMMA} Aeronave +STR_VEHICLE_LIST_AIRCRAFT_CAPTION :{WHITE}{STRING} - {COMMA} Aeronave{P "" s} STR_VEHICLE_LIST_TRAIN_LIST_TOOLTIP :{BLACK}Trenes - Click en tren para información -STR_VEHICLE_LIST_ROAD_VEHICLE_TOOLTIP :{BLACK}Vehículos de carretera - Click en vehículo para información +STR_VEHICLE_LIST_ROAD_VEHICLE_TOOLTIP :{BLACK}Vehículos de carretera - Click en el vehículo para información STR_VEHICLE_LIST_SHIP_TOOLTIP :{BLACK}Barcos - Click en barco para información STR_VEHICLE_LIST_AIRCRAFT_TOOLTIP :{BLACK}Aeronave - Click en la aeronave para información -STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Beneficio este año: {CURRENCY_LONG} (año anterior: {CURRENCY_LONG}) +STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Beneficio este año: {CURRENCY_LONG} (último año: {CURRENCY_LONG}) STR_VEHICLE_LIST_AVAILABLE_TRAINS :Trenes disponibles STR_VEHICLE_LIST_AVAILABLE_ROAD_VEHICLES :Vehículos de carretera disponibles STR_VEHICLE_LIST_AVAILABLE_SHIPS :Barcos disponibles -STR_VEHICLE_LIST_AVAILABLE_AIRCRAFT :Aviones disponibles +STR_VEHICLE_LIST_AVAILABLE_AIRCRAFT :Aeronaves disponibles STR_VEHICLE_LIST_AVAILABLE_ENGINES_TOOLTIP :{BLACK}Ver la lista de modelos disponibles para este tipo de vehículo STR_VEHICLE_LIST_MANAGE_LIST :{BLACK}Administrar lista @@ -3364,6 +3399,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Quitar todos lo STR_GROUP_RENAME_CAPTION :{BLACK}Renombrar un grupo +STR_GROUP_PROFIT_THIS_YEAR :Beneficio este año: +STR_GROUP_PROFIT_LAST_YEAR :Beneficio del último año: +STR_GROUP_OCCUPANCY :Uso actual: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nuevos Vehículos de Ferrocarril STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nuevos Vehículos de Ferrocarril Eléctrico @@ -3395,18 +3435,19 @@ STR_PURCHASE_INFO_ALL_TYPES :Todos los tipos STR_PURCHASE_INFO_ALL_BUT :Todo excepto {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}F.T máxima: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Alcance: {GOLD}{COMMA} casillas +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Tipo de aeronave: {GOLD}{STRING} -STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista de selección de los vehículos de raíl - Click en el vehículo para más información - Ctrl+Click para mostrar/ocultar el tipo del vehículo -STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Lista de selección de vehículos de carretera - Click en el vehículo para más información - Ctrl+Click para mostrar/ocultar el tipo del vehículo -STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Lista de selección de barcos - Click en el barco para más información - Ctrl+Click para mostrar/ocultar el tipo del barco -STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lista de selección de aeronaves - Click en la aeronave para más información - Ctrl+Click para mostrar/ocultar el tipo de la aeronave +STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista de selección de los vehículos de ferrocarril. Click en el vehículo para más información. Ctrl+Click para mostrar/ocultar el tipo del vehículo +STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Lista de selección de vehículos de carretera. Click en el vehículo para más información. Ctrl+Click para mostrar/ocultar el tipo del vehículo +STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Lista de selección de barcos. Click en el barco para más información. Ctrl+Click para mostrar/ocultar el tipo del barco +STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lista de selección de aeronaves. Click en la aeronave para más información. Ctrl+Click para mostrar/ocultar el tipo de la aeronave STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_BUTTON :{BLACK}Comprar vehículo STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_BUTTON :{BLACK}Comprar vehículo STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Comprar barco STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Comprar aeronave -STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar el vehículo de raíl resaltado. Shift+Click muestra una estimación del precio sin realizar la compra +STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Compra el vehículo de ferrocarril resaltado. Shift+Click muestra una estimación del precio sin realizar la compra STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar el vehículo de carretera resaltado. Shift+Click muestra una estimación del precio sin realizar la compra STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar el barco resaltado. Shift+Click muestra una estimación del precio sin realizar la compra STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar la aeronave resaltada. Shift+Click muestra una estimación del precio sin realizar la compra @@ -3453,8 +3494,8 @@ STR_DEPOT_VEHICLE_TOOLTIP_CHAIN :{BLACK}{NUM} ve STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG} ({CARGO_SHORT}) STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Trenes - arrastrar vehículo con Click izquierdo para añadir/retirar del tren, Click derecho para mostrar información. Mantén pulsado Ctrl para usar estos comandos con el resto del tren -STR_DEPOT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Vehículos de carretera - Click derecho en vehículo para información -STR_DEPOT_SHIP_LIST_TOOLTIP :{BLACK}Barcos - Click derecho en barco para información +STR_DEPOT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Vehículos de carretera - Click derecho en el vehículo para información +STR_DEPOT_SHIP_LIST_TOOLTIP :{BLACK}Barcos - Click derecho en el barco para información STR_DEPOT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Aeronave - Click derecho en la aeronave para información STR_DEPOT_TRAIN_SELL_TOOLTIP :{BLACK}Arrastrar aquí el vehículo de raíl para venderlo @@ -3526,12 +3567,13 @@ STR_ENGINE_PREVIEW_SHIP :{G=m}barco STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :{G=f}locomotora de monorraíl STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :{G=f}locomotora maglev -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Coste: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocidad: {VELOCITY} Potencia: {POWER}{}Coste Operativo: {CURRENCY_LONG}/año{}Capacidad: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Coste: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocidad: {VELOCITY} Potencia: {POWER} F.T. Máxima: {6:FORCE}{}Coste de operación: {4:CURRENCY_LONG}/año{}Capacidad: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Coste: {CURRENCY_LONG} Velocidad Máx.: {VELOCITY}{}Capacidad: {CARGO_LONG}, {CARGO_LONG}{}Coste Mantenimiento: {CURRENCY_LONG}/año -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Coste: {CURRENCY_LONG} Velocidad Máx.: {VELOCITY}{}Capacidad: {CARGO_LONG}{}Coste Mantenimiento: {CURRENCY_LONG}/año -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Coste: {CURRENCY_LONG} Velocidad Máx.: {VELOCITY} Alcance: {COMMA} casillas{}Capacidad: {CARGO_LONG}, {CARGO_LONG}{}Coste de Operación: {CURRENCY_LONG}/año -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Coste: {CURRENCY_LONG} Velocidad Máx.: {VELOCITY} Alcance: {COMMA} casillas{}Capacidad: {CARGO_LONG}{}Coste de Operación: {CURRENCY_LONG}/año +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Coste: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocidad: {VELOCITY} Potencia: {POWER}{}Coste Mantenimiento: {CURRENCY_LONG}/año{}Capacidad: {CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Coste: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocidad: {VELOCITY} Potencia: {POWER} F.T. Máxima: {6:FORCE}{}Coste Mantenimiento: {4:CURRENCY_LONG}/año{}Capacidad: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Coste: {CURRENCY_LONG} Velocidad Máx.: {VELOCITY}{}Capacidad: {CARGO_LONG}{}Coste Mantenimiento: {CURRENCY_LONG}/año +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Coste: {CURRENCY_LONG} Velocidad Máx.: {VELOCITY}{}Tipo de aeronave: {STRING}{}Capacidad: {CARGO_LONG}, {CARGO_LONG}{}Coste Mantenimiento: {CURRENCY_LONG}/año +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Coste: {CURRENCY_LONG} Velocidad Máx.: {VELOCITY}{}Tipo de aeronave: {STRING}{}Capacidad: {CARGO_LONG}{}Coste Mantenimiento: {CURRENCY_LONG}/año +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Coste: {CURRENCY_LONG} Velocidad Máx.: {VELOCITY}{}Tipo de aeronave: {STRING} Alcance: {COMMA} casillas{}Capacidad: {CARGO_LONG}, {CARGO_LONG}{}Coste Mantenimiento: {CURRENCY_LONG}/año +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Coste: {CURRENCY_LONG} Velocidad Máx.: {VELOCITY}{}Tipo de aeronave: {STRING} Alcance: {COMMA} casillas{}Capacidad: {CARGO_LONG}{}Coste Mantenimiento: {CURRENCY_LONG}/año # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Reemplazar {STRING} - {STRING} @@ -3558,10 +3600,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} cuando STR_REPLACE_VEHICLES_STOP :{BLACK}Parar de reemplazar vehículos STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Presiona este botón para detener el reemplazo del vehículo situado a la izquierda -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Reemplazando: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Cambia entre las ventanas de cambio de vagón y locomotora STR_REPLACE_ENGINES :Locomotoras STR_REPLACE_WAGONS :Vagones +STR_REPLACE_ALL_RAILTYPE :Todos los vehículos ferroviarios STR_REPLACE_HELP_RAILTYPE :{BLACK}Seleccione tipo de ferrocarril para el que desea reemplazar locomotoras STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Muestra con qué vehículo está siendo reemplazado el vehículo de la izquierda @@ -3654,11 +3696,12 @@ STR_VEHICLE_INFO_AGE :{COMMA} año{P STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} año{P "" s} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Velocidad Máx.: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Velocidad Máx.: {LTBLUE}{VELOCITY} {BLACK}Alcance: {LTBLUE}{COMMA} casillas +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Velocidad Máx.: {LTBLUE}{VELOCITY} {BLACK}Tipo de aeronave: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Velocidad Máx.: {LTBLUE}{VELOCITY} {BLACK}Tipo de aeronave: {LTBLUE}{STRING} {BLACK}Alcance: {LTBLUE}{COMMA} casillas STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potencia: {LTBLUE}{POWER}{BLACK} Velocidad Máx.: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potencia: {LTBLUE}{POWER}{BLACK} Velocidad Máx.: {LTBLUE}{VELOCITY} {BLACK}F.T. Máx.: {LTBLUE}{FORCE} -STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Beneficios este año: {LTBLUE}{CURRENCY_LONG} (último año: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Beneficio este año: {LTBLUE}{CURRENCY_LONG} (último año: {CURRENCY_LONG}) STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Fiabilidad: {LTBLUE}{COMMA}% {BLACK}Averías desde el último mantenimiento: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Construido: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY_LONG} @@ -3768,7 +3811,7 @@ STR_ORDER_TOOLTIP_UNLOAD :{BLACK}Cambiar STR_ORDER_REFIT :{BLACK}Reformar STR_ORDER_REFIT_TOOLTIP :{BLACK}Selecciona el tipo de carga a reformar en esta orden. Ctrl+Click para eliminar la orden de reforma STR_ORDER_REFIT_AUTO :{BLACK}Reforma en la estación -STR_ORDER_REFIT_AUTO_TOOLTIP :{BLACK}Seleccionar el tipo de carga a la que reformar en esta orden. Ctrl+Click elimina la orden de reforma. La reforma solamente puede llevarse a cabo si el vehículo lo permite +STR_ORDER_REFIT_AUTO_TOOLTIP :{BLACK}Selecciona el tipo de carga a reformar en esta orden. Ctrl+Click elimina la orden de reforma. La reforma solamente puede llevarse a cabo si el vehículo lo permite STR_ORDER_DROP_REFIT_AUTO :Carga fijada STR_ORDER_DROP_REFIT_AUTO_ANY :Carga disponible @@ -3816,7 +3859,7 @@ STR_ORDER_GO_TO_NEAREST_DEPOT :Ir al depósito STR_ORDER_GO_TO_NEAREST_HANGAR :Ir al hangar más cercano STR_ORDER_CONDITIONAL :Salto de orden condicional STR_ORDER_SHARE :Compartir órdenes -STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Añadir nueva orden antes de la orden resaltada, o añadirla al final de la lista. Ctrl sobre estaciones ordena 'Carga completa cualquier carga', sobre puntos de ruta ordena 'sin paradas' y sobre depósitos ordena 'mantenimiento'. Ctrl o Compartir órdenes permite a este vehículo compartir órdenes con el vehículo seleccionado. Click sobre un vehículo copia las órdenes. Una órden de depósito desactiva el mantenimiento automático del vehículo +STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Añadir nueva orden antes de la orden resaltada, o añadirla al final de la lista. Ctrl sobre estaciones ordena 'Carga completa de cualquier carga', sobre puntos de ruta ordena 'sin paradas' y sobre depósitos ordena 'mantenimiento'. Ctrl o Compartir órdenes permite a este vehículo compartir órdenes con el vehículo seleccionado. Click sobre un vehículo copia las órdenes. Una órden de depósito desactiva el mantenimiento automático del vehículo STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Ver todos los vehículos con el mismo calendario @@ -3956,14 +3999,14 @@ STR_DATE_YEAR_TOOLTIP :{BLACK}Seleccio # AI debug window -STR_AI_DEBUG :{WHITE}Depuración de Scripts de IA / Juego +STR_AI_DEBUG :{WHITE}Depuración de Scripts de Juego / IA STR_AI_DEBUG_NAME_AND_VERSION :{BLACK}{STRING} (v{NUM}) STR_AI_DEBUG_NAME_TOOLTIP :{BLACK}Nombre del script STR_AI_DEBUG_SETTINGS :{BLACK}Configuración STR_AI_DEBUG_SETTINGS_TOOLTIP :{BLACK}Cambiar la configuración del script -STR_AI_DEBUG_RELOAD :{BLACK}Recarga la IA +STR_AI_DEBUG_RELOAD :{BLACK}Recargar IA STR_AI_DEBUG_RELOAD_TOOLTIP :{BLACK}Elimina la IA, recarga el código y reinicia la IA -STR_AI_DEBUG_BREAK_STR_ON_OFF_TOOLTIP :{BLACK}Activar/desactivar la pausa automática cuando un mensaje de log de la IA coincide con la cadena de parada +STR_AI_DEBUG_BREAK_STR_ON_OFF_TOOLTIP :{BLACK}Activa/desactiva la pausa automática cuando un mensaje de log de la IA coincide con la cadena de parada STR_AI_DEBUG_BREAK_ON_LABEL :{BLACK}Pausar con: STR_AI_DEBUG_BREAK_STR_OSKTITLE :{BLACK}Pausar cuando el script registre esta cadena STR_AI_DEBUG_BREAK_STR_TOOLTIP :{BLACK}Cuando un mensaje de log de una IA coincide con esta cadena, el juego se pausa @@ -3976,13 +4019,13 @@ STR_AI_GAME_SCRIPT :{BLACK}Script d STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}Comprobar el registro del Script de Juego STR_ERROR_AI_NO_AI_FOUND :No se encontró IA apropiada para cargar.{}Ésta es una IA por defecto que no realiza acción alguna.{}Puedes descargar nuevas IA mediante el sistema de 'Contenido Online' -STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Uno de los scripts ejecutados ha fallado. Por favor, reporte el fallo al autor del script con una captura de la ventana de depuración de IA / Script +STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Uno de los scripts ejecutados ha fallado. Por favor, informe del fallo al autor del script con una captura de la ventana de depuración de Script / IA STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}La ventana de depuración de scripts solo está disponible para el servidor # AI configuration window -STR_AI_CONFIG_CAPTION :{WHITE}Configuración de Scripts +STR_AI_CONFIG_CAPTION :{WHITE}Configuración de Scripts de Juego / IA STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Script de Juego que será cargado en la próxima partida -STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Las IA que serán cargadas 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 STR_AI_CONFIG_NONE :(ninguna) @@ -4004,8 +4047,8 @@ STR_AI_CONFIG_CONFIGURE :{BLACK}Configur STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configura los parámetros del script # Available AIs window -STR_AI_LIST_CAPTION :{WHITE}{STRING} disponibles -STR_AI_LIST_CAPTION_AI :IA +STR_AI_LIST_CAPTION :{WHITE}Disponible {STRING} +STR_AI_LIST_CAPTION_AI :IAs STR_AI_LIST_CAPTION_GAMESCRIPT :Scripts de Juego STR_AI_LIST_TOOLTIP :{BLACK}Click para seleccionar un script @@ -4020,8 +4063,8 @@ STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}No cambi # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}Parámetros {STRING} -STR_AI_SETTINGS_CAPTION_AI :de la IA -STR_AI_SETTINGS_CAPTION_GAMESCRIPT :del Script de Juego +STR_AI_SETTINGS_CAPTION_AI :IA +STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Script de Juego STR_AI_SETTINGS_CLOSE :{BLACK}Cerrar STR_AI_SETTINGS_RESET :{BLACK}Reiniciar STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} @@ -4077,7 +4120,7 @@ STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :Archivo no legi STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :No se puede escribir en el archivo STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED :Comprobación de integridad de los datos fallida STR_GAME_SAVELOAD_NOT_AVAILABLE : -STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}El juego ha sido guardado en una versión sin soporte para tranvías. Todos los tranvías serán eliminados +STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}El juego se ha guardado en una versión sin soporte para tranvías. Todos los tranvías han sido eliminados # Map generation messages STR_ERROR_COULD_NOT_CREATE_TOWN :{WHITE}Generación de mapa abortada...{}... no hay localizaciones apropiadas para municipios @@ -4094,7 +4137,7 @@ STR_ERROR_BMPMAP_IMAGE_TYPE :{WHITE}... no s STR_ERROR_HEIGHTMAP_TOO_LARGE :{WHITE}... la imagen es demasiado grande STR_WARNING_HEIGHTMAP_SCALE_CAPTION :{WHITE}Alerta de escala -STR_WARNING_HEIGHTMAP_SCALE_MESSAGE :{YELLOW}Cambiar demasiado el tamaño del mapa de origen no está recomendado. ¿Desea continuar con la generación? +STR_WARNING_HEIGHTMAP_SCALE_MESSAGE :{YELLOW}No es recomendable cambiar en exceso el tamaño del mapa original. ¿Desea continuar con la generación? # Soundset messages STR_WARNING_FALLBACK_SOUNDSET :{WHITE}Solamente se encontró un conjunto de sonidos vacío. Si lo desea, instale un conjunto de sonidos a través del 'Contenido Online' @@ -4113,7 +4156,7 @@ STR_ERROR_MESSAGE_CAPTION_OTHER_COMPANY :{YELLOW}Mensaje # Generic construction errors STR_ERROR_OFF_EDGE_OF_MAP :{WHITE}Fuera del borde del mapa STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP :{WHITE}Demasiado cerca del borde del mapa -STR_ERROR_NOT_ENOUGH_CASH_REQUIRES_CURRENCY :{WHITE}No hay suficiente dinero - se requiere {CURRENCY_LONG} +STR_ERROR_NOT_ENOUGH_CASH_REQUIRES_CURRENCY :{WHITE}No hay suficiente dinero - se necesita {CURRENCY_LONG} STR_ERROR_FLAT_LAND_REQUIRED :{WHITE}Se requiere terreno llano STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION :{WHITE}Tierra inclinada en dirección errónea STR_ERROR_CAN_T_DO_THIS :{WHITE}No se puede hacer eso... @@ -4151,13 +4194,13 @@ STR_ERROR_CAN_T_CHANGE_COMPANY_NAME :{WHITE}No se pu STR_ERROR_CAN_T_CHANGE_PRESIDENT :{WHITE}No se puede cambiar nombre del presidente... STR_ERROR_MAXIMUM_PERMITTED_LOAN :{WHITE}... máxima cantidad de préstamo permitida es {CURRENCY_LONG} -STR_ERROR_CAN_T_BORROW_ANY_MORE_MONEY :{WHITE}No se incrementar el préstamo... +STR_ERROR_CAN_T_BORROW_ANY_MORE_MONEY :{WHITE}No se puede incrementar el préstamo... STR_ERROR_LOAN_ALREADY_REPAYED :{WHITE}... no hay préstamo que pagar STR_ERROR_CURRENCY_REQUIRED :{WHITE}... {CURRENCY_LONG} requerido STR_ERROR_CAN_T_REPAY_LOAN :{WHITE}No es posible pagar préstamo... STR_ERROR_INSUFFICIENT_FUNDS :{WHITE}No se puede dar dinero que ha sido prestado de un banco... STR_ERROR_CAN_T_BUY_COMPANY :{WHITE}No se puede comprar la empresa... -STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS :{WHITE}No se puede construir la sede de la empresa... +STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS :{WHITE}No puede construirse la sede de la empresa... STR_ERROR_CAN_T_BUY_25_SHARE_IN_THIS :{WHITE}No se puede comprar el 25% de acciones... STR_ERROR_CAN_T_SELL_25_SHARE_IN :{WHITE}No se puede vender el 25% de acciones... STR_ERROR_PROTECTED :{WHITE}Esta empresa es demasiado reciente como para comerciar con acciones... @@ -4166,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 @@ -4179,33 +4222,33 @@ STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... no e # Industry related errors STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... demasiadas industrias STR_ERROR_CAN_T_GENERATE_INDUSTRIES :{WHITE}No se pueden crear industrias... -STR_ERROR_CAN_T_BUILD_HERE :{WHITE}No se puede construir {STRING} aquí... +STR_ERROR_CAN_T_BUILD_HERE :{WHITE}No puede construirse {STRING} aquí... STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY :{WHITE}No se puede construir este tipo de industria aquí... STR_ERROR_INDUSTRY_TOO_CLOSE :{WHITE}... demasiado cerca de otra industria STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}... debe construirse un municipio primero STR_ERROR_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}... solo se permite uno por municipio -STR_ERROR_CAN_ONLY_BE_BUILT_IN_TOWNS_WITH_POPULATION_OF_1200 :{WHITE}... sólo puede ser construido en municipios de al menos 1.200 habitantes -STR_ERROR_CAN_ONLY_BE_BUILT_IN_RAINFOREST :{WHITE}... sólo se puede construir en áreas de selva -STR_ERROR_CAN_ONLY_BE_BUILT_IN_DESERT :{WHITE}... sólo se puede construir en áreas desérticas -STR_ERROR_CAN_ONLY_BE_BUILT_IN_TOWNS :{WHITE}... solo puede ser construido en municipios (reemplazando casas) -STR_ERROR_CAN_ONLY_BE_BUILT_NEAR_TOWN_CENTER :{WHITE}... solamente puede construirse cerca del centro de un municipio +STR_ERROR_CAN_ONLY_BE_BUILT_IN_TOWNS_WITH_POPULATION_OF_1200 :{WHITE}... solo puede construirse en municipios de al menos 1.200 habitantes +STR_ERROR_CAN_ONLY_BE_BUILT_IN_RAINFOREST :{WHITE}... solo puede construirse en zonas selváticas +STR_ERROR_CAN_ONLY_BE_BUILT_IN_DESERT :{WHITE}... solo puede construirse en zonas desérticas +STR_ERROR_CAN_ONLY_BE_BUILT_IN_TOWNS :{WHITE}... solo puede construirse en municipios (reemplazando casas) +STR_ERROR_CAN_ONLY_BE_BUILT_NEAR_TOWN_CENTER :{WHITE}... solo puede construirse cerca del centro de un municipio STR_ERROR_CAN_ONLY_BE_BUILT_IN_LOW_AREAS :{WHITE}... solo puede construirse en zonas bajas -STR_ERROR_CAN_ONLY_BE_POSITIONED :{WHITE}... sólo se puede colocar cerca de los bordes del mapa -STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... sólo se puede plantar bosques sobre la nieve -STR_ERROR_CAN_ONLY_BE_BUILT_ABOVE_SNOW_LINE :{WHITE}... solamente puede construirse por encima de la línea de nieve -STR_ERROR_CAN_ONLY_BE_BUILT_BELOW_SNOW_LINE :{WHITE}... solamente puede construirse por debajo de la línea de nieve +STR_ERROR_CAN_ONLY_BE_POSITIONED :{WHITE}... solo puede colocarse cerca de los bordes del mapa +STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... solo se pueden plantar bosques sobre la nieve +STR_ERROR_CAN_ONLY_BE_BUILT_ABOVE_SNOW_LINE :{WHITE}... solo puede construirse por encima de la línea de nieve +STR_ERROR_CAN_ONLY_BE_BUILT_BELOW_SNOW_LINE :{WHITE}... solo puede construirse por debajo de la línea de nieve STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES :{WHITE}No había sitios apropiados disponibles para industrias '{STRING}' STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION :{WHITE}Cambia los parámetros de generación del mapa para obtener un mapa mejor # Station construction related errors STR_ERROR_CAN_T_BUILD_RAILROAD_STATION :{WHITE}No se puede construir estación de tren aquí... -STR_ERROR_CAN_T_BUILD_BUS_STATION :{WHITE}No se puede construir estación de autobuses... +STR_ERROR_CAN_T_BUILD_BUS_STATION :{WHITE}No puede construirse una estación de autobuses... STR_ERROR_CAN_T_BUILD_TRUCK_STATION :{WHITE}No se puede construir estación de camiones... STR_ERROR_CAN_T_BUILD_PASSENGER_TRAM_STATION :{WHITE}No se puede construir estación de tranvía de pasajeros... -STR_ERROR_CAN_T_BUILD_CARGO_TRAM_STATION :{WHITE}No puede construir estación de tranvía de carga... -STR_ERROR_CAN_T_BUILD_DOCK_HERE :{WHITE}No se pueden construir muelles aquí... -STR_ERROR_CAN_T_BUILD_AIRPORT_HERE :{WHITE}No se puede construir aeropuerto aquí... +STR_ERROR_CAN_T_BUILD_CARGO_TRAM_STATION :{WHITE}No puede construirse una estación de tranvía de carga... +STR_ERROR_CAN_T_BUILD_DOCK_HERE :{WHITE}No pueden construirse muelles aquí... +STR_ERROR_CAN_T_BUILD_AIRPORT_HERE :{WHITE}No puede construirse un aeropuerto aquí... STR_ERROR_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}Adjunta más de una estación/zona de carga existente STR_ERROR_STATION_TOO_SPREAD_OUT :{WHITE}... estación demasiado extendida @@ -4213,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... @@ -4221,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... @@ -4312,8 +4355,8 @@ STR_ERROR_THERE_IS_NO_ROAD :{WHITE}... no h STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}... no hay tranvía # Waterway construction errors -STR_ERROR_CAN_T_BUILD_CANALS :{WHITE}No se pueden construir canales aquí... -STR_ERROR_CAN_T_BUILD_LOCKS :{WHITE}No se pueden construir dársenas aquí... +STR_ERROR_CAN_T_BUILD_CANALS :{WHITE}No pueden construirse canales aquí... +STR_ERROR_CAN_T_BUILD_LOCKS :{WHITE}No pueden construirse dársenas aquí... STR_ERROR_CAN_T_PLACE_RIVERS :{WHITE}No se pueden situar ríos aquí... STR_ERROR_MUST_BE_BUILT_ON_WATER :{WHITE}... debe construirse sobre el agua STR_ERROR_CAN_T_BUILD_ON_WATER :{WHITE}... no se puede construir sobre el agua @@ -4321,7 +4364,7 @@ STR_ERROR_CAN_T_BUILD_ON_SEA :{WHITE}... no s STR_ERROR_CAN_T_BUILD_ON_CANAL :{WHITE}... no se puede construir en un canal STR_ERROR_CAN_T_BUILD_ON_RIVER :{WHITE}... no se puede construir en un río STR_ERROR_MUST_DEMOLISH_CANAL_FIRST :{WHITE}Debes demoler el canal primero -STR_ERROR_CAN_T_BUILD_AQUEDUCT_HERE :{WHITE}No se puede construir un acueducto aquí +STR_ERROR_CAN_T_BUILD_AQUEDUCT_HERE :{WHITE}No puede construirse un acueducto aquí # Tree related errors STR_ERROR_TREE_ALREADY_HERE :{WHITE}... ya hay árboles aquí @@ -4329,7 +4372,7 @@ STR_ERROR_TREE_WRONG_TERRAIN_FOR_TREE_TYPE :{WHITE}... terr STR_ERROR_CAN_T_PLANT_TREE_HERE :{WHITE}No se pueden plantar árboles aquí... # Bridge related errors -STR_ERROR_CAN_T_BUILD_BRIDGE_HERE :{WHITE}No se puede construir puente aquí... +STR_ERROR_CAN_T_BUILD_BRIDGE_HERE :{WHITE}No puede construirse un puente aquí... STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Primero debe demolerse el puente STR_ERROR_CAN_T_START_AND_END_ON :{WHITE}No se puede comenzar y acabar en la misma posición STR_ERROR_BRIDGEHEADS_NOT_SAME_HEIGHT :{WHITE}Las cabeceras del puente no están al mismo nivel @@ -4353,7 +4396,7 @@ STR_ERROR_TUNNEL_TOO_LONG :{WHITE}... tún STR_ERROR_TOO_MANY_OBJECTS :{WHITE}... demasiados objetos STR_ERROR_CAN_T_BUILD_OBJECT :{WHITE}No se puede construir objeto... STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Objeto en medio -STR_ERROR_COMPANY_HEADQUARTERS_IN :{WHITE}... sede de empresa está en medio +STR_ERROR_COMPANY_HEADQUARTERS_IN :{WHITE}... la sede de la empresa está en medio STR_ERROR_CAN_T_PURCHASE_THIS_LAND :{WHITE}No es posible comprar este terreno... STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... ¡ya es de su propiedad! @@ -4465,20 +4508,22 @@ 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 # Town building names STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1 :Bloque alto de oficinas STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_1 :Bloque de oficinas -STR_TOWN_BUILDING_NAME_SMALL_BLOCK_OF_FLATS_1 :Bloque de viviendas pequeño +STR_TOWN_BUILDING_NAME_SMALL_BLOCK_OF_FLATS_1 :Bloque de apartamentos pequeño STR_TOWN_BUILDING_NAME_CHURCH_1 :Iglesia STR_TOWN_BUILDING_NAME_LARGE_OFFICE_BLOCK_1 :Gran bloque de oficinas STR_TOWN_BUILDING_NAME_TOWN_HOUSES_1 :Casas del municipio @@ -4538,8 +4583,8 @@ STR_INDUSTRY_NAME_WATER_TOWER :{G=f}Torre de A STR_INDUSTRY_NAME_FACTORY_2 :{G=f}Fábrica STR_INDUSTRY_NAME_FARM_2 :{G=f}Granja STR_INDUSTRY_NAME_LUMBER_MILL :{G=m}Aserradero -STR_INDUSTRY_NAME_COTTON_CANDY_FOREST :{G=m}Bosque de Algodón Dulce -STR_INDUSTRY_NAME_CANDY_FACTORY :{G=f}Fábrica de Dulces +STR_INDUSTRY_NAME_COTTON_CANDY_FOREST :{G=m}Bosque de Algodón de Azúcar +STR_INDUSTRY_NAME_CANDY_FACTORY :{G=f}Fábrica de Caramelos STR_INDUSTRY_NAME_BATTERY_FARM :{G=f}Granja de Pilas STR_INDUSTRY_NAME_COLA_WELLS :{G=m}Pozos de Cola STR_INDUSTRY_NAME_TOY_SHOP :{G=f}Tienda de Juguetes @@ -4547,7 +4592,7 @@ STR_INDUSTRY_NAME_TOY_FACTORY :{G=f}Fábrica d STR_INDUSTRY_NAME_PLASTIC_FOUNTAINS :{G=f}Fuentes de Plástico STR_INDUSTRY_NAME_FIZZY_DRINK_FACTORY :{G=f}Fábrica de Refrescos STR_INDUSTRY_NAME_BUBBLE_GENERATOR :{G=m}Generador de Burbujas -STR_INDUSTRY_NAME_TOFFEE_QUARRY :{G=f}Cantera de Caramelos +STR_INDUSTRY_NAME_TOFFEE_QUARRY :{G=f}Cantera de Tofe STR_INDUSTRY_NAME_SUGAR_MINE :{G=f}Mina de Azúcar ############ WARNING, using range 0x6000 for strings that are stored in the savegame @@ -4615,10 +4660,10 @@ STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_KELLING_3100_DIESEL :Kelling 3100 (D STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_TURNER_TURBO_DIESEL :Turner Turbo (Diésel) STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_MJS_1000_DIESEL :MJS 1000 (Diésel) STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_125_DIESEL :SH '125' (Diésel) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_30_ELECTRIC :SH '30' (Eléctrica) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_40_ELECTRIC :SH '40' (Eléctrica) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_T_I_M_ELECTRIC :'T.I.M.' (Eléctrica) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_ASIASTAR_ELECTRIC :'AsiaStar' (Eléctrica) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_30_ELECTRIC :SH '30' (Eléctrico) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_40_ELECTRIC :SH '40' (Eléctrico) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_T_I_M_ELECTRIC :'T.I.M.' (Eléctrico) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_ASIASTAR_ELECTRIC :'AsiaStar' (Eléctrico) STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PASSENGER_CAR :Vagón de Pasajeros STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_MAIL_VAN :Furgón de Correos STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COAL_CAR :Vagón de Carbón @@ -4630,18 +4675,18 @@ STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_WOOD_TRUCK :Vagón de Mader STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_IRON_ORE_HOPPER :Vagoneta de Mineral de Hierro STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_STEEL_TRUCK :Vagón de Acero STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_ARMORED_VAN :Vagón Blindado -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FOOD_VAN :Vagón de Alimento +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FOOD_VAN :Vagón de Alimentos STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PAPER_TRUCK :Vagón de Papel STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COPPER_ORE_HOPPER :Vagoneta de Mineral de Cobre STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_WATER_TANKER :Cisterna de Agua STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FRUIT_TRUCK :Vagón de Fruta STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_RUBBER_TRUCK :Vagón de Caucho STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_SUGAR_TRUCK :Vagón de Azúcar -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COTTON_CANDY_HOPPER :Vagoneta de Algodón Dulce -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_TOFFEE_HOPPER :Vagoneta de Caramelos +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COTTON_CANDY_HOPPER :Vagoneta de Algodón de Azúcar +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_TOFFEE_HOPPER :Vagoneta de Tofe STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_BUBBLE_VAN :Vagón de Burbujas STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COLA_TANKER :Cisterna de Cola -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_CANDY_VAN :Vagón de Dulces +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_CANDY_VAN :Vagón de Caramelos STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_TOY_VAN :Vagón de Juguetes STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_BATTERY_TRUCK :Vagón de Pilas STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FIZZY_DRINK_TRUCK :Vagón de Refrescos @@ -4660,26 +4705,26 @@ STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_WOOD_TRUCK :Vagón de Mader STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_IRON_ORE_HOPPER :Vagoneta de Mineral de Hierro STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_STEEL_TRUCK :Vagón de Acero STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_ARMORED_VAN :Vagón Blindado -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_FOOD_VAN :Vagón de Alimento +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_FOOD_VAN :Vagón de Alimentos STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_PAPER_TRUCK :Vagón de Papel STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COPPER_ORE_HOPPER :Vagoneta de Mineral de Cobre STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_WATER_TANKER :Cisterna de Agua STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_FRUIT_TRUCK :Vagón de Fruta STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_RUBBER_TRUCK :Vagón de Caucho STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_SUGAR_TRUCK :Vagón de Azúcar -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COTTON_CANDY_HOPPER :Vagoneta de Algodón Dulce -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_TOFFEE_HOPPER :Vagoneta de Caramelos +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COTTON_CANDY_HOPPER :Vagoneta de Algodón de Azúcar +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_TOFFEE_HOPPER :Vagoneta de Tofe STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_BUBBLE_VAN :Vagón de Burbujas STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COLA_TANKER :Cisterna de Cola -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_CANDY_VAN :Vagón de Dulces +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_CANDY_VAN :Vagón de Caramelos STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_TOY_VAN :Vagón de Juguetes STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_BATTERY_TRUCK :Vagón de Pilas STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_FIZZY_DRINK_TRUCK :Vagón de Refrescos STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_PLASTIC_TRUCK :Vagón de Plásticos -STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV1_LEVIATHAN_ELECTRIC :Lev1 'Leviathan' (Eléctrica) -STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV2_CYCLOPS_ELECTRIC :Lev2 'Cyclops' (Eléctrica) -STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV3_PEGASUS_ELECTRIC :Lev3 'Pegasus' (Eléctrica) -STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV4_CHIMAERA_ELECTRIC :Lev4 'Chimaera' (Eléctrica) +STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV1_LEVIATHAN_ELECTRIC :Lev1 'Leviathan' (Eléctrico) +STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV2_CYCLOPS_ELECTRIC :Lev2 'Cyclops' (Eléctrico) +STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV3_PEGASUS_ELECTRIC :Lev3 'Pegasus' (Eléctrico) +STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV4_CHIMAERA_ELECTRIC :Lev4 'Chimaera' (Eléctrico) STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_WIZZOWOW_ROCKETEER :Wizzowow Rocketeer STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_PASSENGER_CAR :Vagón de Pasajeros STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_MAIL_VAN :Furgón de Correos @@ -4692,18 +4737,18 @@ STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_WOOD_TRUCK :Vagón de Mader STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_IRON_ORE_HOPPER :Vagoneta de Mineral de Hierro STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_STEEL_TRUCK :Vagón de Acero STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_ARMORED_VAN :Vagón Blindado -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_FOOD_VAN :Vagón de Alimento +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_FOOD_VAN :Vagón de Alimentos STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_PAPER_TRUCK :Vagón de Papel STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COPPER_ORE_HOPPER :Vagoneta de Mineral de Cobre STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_WATER_TANKER :Cisterna de Agua STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_FRUIT_TRUCK :Vagón de Fruta STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_RUBBER_TRUCK :Vagón de Caucho STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_SUGAR_TRUCK :Vagón de Azúcar -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COTTON_CANDY_HOPPER :Vagoneta de Algodón Dulce -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_TOFFEE_HOPPER :Vagoneta de Caramelos +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COTTON_CANDY_HOPPER :Vagoneta de Algodón de Azúcar +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_TOFFEE_HOPPER :Vagoneta de Tofe STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_BUBBLE_VAN :Vagón de Burbujas STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COLA_TANKER :Cisterna de Cola -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_CANDY_VAN :Vagón de Dulces +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_CANDY_VAN :Vagón de Caramelos STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_TOY_VAN :Vagón de Juguetes STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_BATTERY_TRUCK :Vagón de Pilas STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_FIZZY_DRINK_TRUCK :Vagón de Refrescos @@ -4733,9 +4778,9 @@ STR_VEHICLE_NAME_ROAD_VEHICLE_FOSTER_LIVESTOCK_VAN :Camión de Gana STR_VEHICLE_NAME_ROAD_VEHICLE_BALOGH_GOODS_TRUCK :Camión de Mercancías Balogh STR_VEHICLE_NAME_ROAD_VEHICLE_CRAIGHEAD_GOODS_TRUCK :Camión de Mercancías Craighead STR_VEHICLE_NAME_ROAD_VEHICLE_GOSS_GOODS_TRUCK :Camión de Mercancías Goss -STR_VEHICLE_NAME_ROAD_VEHICLE_HEREFORD_GRAIN_TRUCK :Camión Granero Hereford -STR_VEHICLE_NAME_ROAD_VEHICLE_THOMAS_GRAIN_TRUCK :Camión Granero Thomas -STR_VEHICLE_NAME_ROAD_VEHICLE_GOSS_GRAIN_TRUCK :Camión Granero Goss +STR_VEHICLE_NAME_ROAD_VEHICLE_HEREFORD_GRAIN_TRUCK :Camión de Grano Hereford +STR_VEHICLE_NAME_ROAD_VEHICLE_THOMAS_GRAIN_TRUCK :Camión de Grano Thomas +STR_VEHICLE_NAME_ROAD_VEHICLE_GOSS_GRAIN_TRUCK :Camión de Grano Goss STR_VEHICLE_NAME_ROAD_VEHICLE_WITCOMBE_WOOD_TRUCK :Camión Maderero Witcombe STR_VEHICLE_NAME_ROAD_VEHICLE_FOSTER_WOOD_TRUCK :Camión Maderero Foster STR_VEHICLE_NAME_ROAD_VEHICLE_MORELAND_WOOD_TRUCK :Camión Maderero Moreland @@ -4748,9 +4793,9 @@ STR_VEHICLE_NAME_ROAD_VEHICLE_KELLING_STEEL_TRUCK :Camión de Acer STR_VEHICLE_NAME_ROAD_VEHICLE_BALOGH_ARMORED_TRUCK :Furgón Blindado Balogh STR_VEHICLE_NAME_ROAD_VEHICLE_UHL_ARMORED_TRUCK :Furgón Blindado Uhl STR_VEHICLE_NAME_ROAD_VEHICLE_FOSTER_ARMORED_TRUCK :Furgón Blindado Foster -STR_VEHICLE_NAME_ROAD_VEHICLE_FOSTER_FOOD_VAN :Furgón de Comida Foster -STR_VEHICLE_NAME_ROAD_VEHICLE_PERRY_FOOD_VAN :Furgón de Comida Perry -STR_VEHICLE_NAME_ROAD_VEHICLE_CHIPPY_FOOD_VAN :Furgón de Comida Chippy +STR_VEHICLE_NAME_ROAD_VEHICLE_FOSTER_FOOD_VAN :Furgón de Alimentos Foster +STR_VEHICLE_NAME_ROAD_VEHICLE_PERRY_FOOD_VAN :Furgón de Alimentos Perry +STR_VEHICLE_NAME_ROAD_VEHICLE_CHIPPY_FOOD_VAN :Furgón de Alimentos Chippy STR_VEHICLE_NAME_ROAD_VEHICLE_UHL_PAPER_TRUCK :Camión de Papel Uhl STR_VEHICLE_NAME_ROAD_VEHICLE_BALOGH_PAPER_TRUCK :Camión de Papel Balogh STR_VEHICLE_NAME_ROAD_VEHICLE_MPS_PAPER_TRUCK :Camión de Papel MPS @@ -4772,18 +4817,18 @@ STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_SUGAR_TRUCK :Camión de Azú STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_COLA_TRUCK :Camión de Cola MightyMover STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_COLA_TRUCK :Camión de Cola Powernaught STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_COLA_TRUCK :Camión de Cola Wizzowow -STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_COTTON_CANDY :Camión de Algodón Dulce MightyMover -STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_COTTON_CANDY :Camión de Algodón Dulce Powernaught -STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_COTTON_CANDY_TRUCK :Camión de Algodón Dulce Wizzowow -STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_TOFFEE_TRUCK :Camión de Caramelos MightyMover -STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_TOFFEE_TRUCK :Camión de Caramelos Powernaught -STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_TOFFEE_TRUCK :Camión de Caramelos Wizzowow +STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_COTTON_CANDY :Camión de Algodón de Azúcar MightyMover +STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_COTTON_CANDY :Camión de Algodón de Azúcar Powernaught +STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_COTTON_CANDY_TRUCK :Camión de Algodón de Azúcar Wizzowow +STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_TOFFEE_TRUCK :Camión de Tofe MightyMover +STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_TOFFEE_TRUCK :Camión de Tofe Powernaught +STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_TOFFEE_TRUCK :Camión de Tofe Wizzowow STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_TOY_VAN :Furgón de Juguetes MightyMover STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_TOY_VAN :Furgón de Juguetes Powernaught STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_TOY_VAN :Furgón de Juguetes Wizzowow -STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_CANDY_TRUCK :Camión de Dulces MightyMover -STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_CANDY_TRUCK :Camión de Dulces Powernaught -STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_CANDY_TRUCK :Camión de Dulces Wizzowow +STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_CANDY_TRUCK :Camión de Caramelos MightyMover +STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_CANDY_TRUCK :Camión de Caramelos Powernaught +STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_CANDY_TRUCK :Camión de Caramelos Wizzowow STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_BATTERY_TRUCK :Camión de Pilas MightyMover STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_BATTERY_TRUCK :Camión de Pilas Powernaught STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_BATTERY_TRUCK :Camión de Pilas Wizzowow diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt new file mode 100644 index 0000000000..113300b766 --- /dev/null +++ b/src/lang/spanish_MX.txt @@ -0,0 +1,5045 @@ +##name Spanish (Mexican) +##ownname Español (MX) +##isocode es_MX +##plural 0 +##textdir ltr +##digitsep , +##digitsepcur , +##decimalsep . +##winlangid 0x080a +##grflangid 0x55 +##gender m f + + +# $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 . + + +##id 0x0000 +STR_NULL : +STR_EMPTY : +STR_UNDEFINED :(no definido) +STR_JUST_NOTHING :Nada + +# Cargo related strings +# Plural cargo name +STR_CARGO_PLURAL_NOTHING : +STR_CARGO_PLURAL_PASSENGERS :{G=m}Pasajeros +STR_CARGO_PLURAL_COAL :{G=m}Carbón +STR_CARGO_PLURAL_MAIL :{G=m}Correo +STR_CARGO_PLURAL_OIL :{G=m}Petróleo +STR_CARGO_PLURAL_LIVESTOCK :{G=m}Ganado +STR_CARGO_PLURAL_GOODS :{G=f}Mercancías +STR_CARGO_PLURAL_GRAIN :{G=m}Grano +STR_CARGO_PLURAL_WOOD :{G=f}Madera +STR_CARGO_PLURAL_IRON_ORE :{G=m}Mineral de hierro +STR_CARGO_PLURAL_STEEL :{G=m}Acero +STR_CARGO_PLURAL_VALUABLES :{G=m}Valores +STR_CARGO_PLURAL_COPPER_ORE :{G=m}Mineral de cobre +STR_CARGO_PLURAL_MAIZE :{G=m}Maíz +STR_CARGO_PLURAL_FRUIT :{G=f}Frutas +STR_CARGO_PLURAL_DIAMONDS :{G=m}Diamantes +STR_CARGO_PLURAL_FOOD :{G=m}Alimentos +STR_CARGO_PLURAL_PAPER :{G=m}Papel +STR_CARGO_PLURAL_GOLD :{G=m}Oro +STR_CARGO_PLURAL_WATER :{G=m}Agua +STR_CARGO_PLURAL_WHEAT :{G=m}Trigo +STR_CARGO_PLURAL_RUBBER :{G=m}Caucho +STR_CARGO_PLURAL_SUGAR :{G=m}Azúcar +STR_CARGO_PLURAL_TOYS :{G=m}Juguetes +STR_CARGO_PLURAL_CANDY :{G=m}Dulces +STR_CARGO_PLURAL_COLA :{G=f}Bebida de cola +STR_CARGO_PLURAL_COTTON_CANDY :{G=m}Algodón de azúcar +STR_CARGO_PLURAL_BUBBLES :{G=f}Burbujas +STR_CARGO_PLURAL_TOFFEE :{G=m}Caramelos suaves +STR_CARGO_PLURAL_BATTERIES :{G=f}Pilas +STR_CARGO_PLURAL_PLASTIC :{G=m}Plástico +STR_CARGO_PLURAL_FIZZY_DRINKS :{G=m}Refrescos + +# Singular cargo name +STR_CARGO_SINGULAR_NOTHING : +STR_CARGO_SINGULAR_PASSENGER :{G=m}Pasajero +STR_CARGO_SINGULAR_COAL :{G=m}Carbón +STR_CARGO_SINGULAR_MAIL :{G=m}Correo +STR_CARGO_SINGULAR_OIL :{G=m}Petróleo +STR_CARGO_SINGULAR_LIVESTOCK :{G=m}Ganado +STR_CARGO_SINGULAR_GOODS :{G=f}Mercancía +STR_CARGO_SINGULAR_GRAIN :{G=m}Grano +STR_CARGO_SINGULAR_WOOD :{G=f}Madera +STR_CARGO_SINGULAR_IRON_ORE :{G=m}Mineral de hierro +STR_CARGO_SINGULAR_STEEL :{G=m}Acero +STR_CARGO_SINGULAR_VALUABLES :{G=m}Objeto de valor +STR_CARGO_SINGULAR_COPPER_ORE :{G=m}Mineral de cobre +STR_CARGO_SINGULAR_MAIZE :{G=m}Maíz +STR_CARGO_SINGULAR_FRUIT :{G=f}Fruta +STR_CARGO_SINGULAR_DIAMOND :{G=m}Diamante +STR_CARGO_SINGULAR_FOOD :{G=m}Alimento +STR_CARGO_SINGULAR_PAPER :{G=m}Papel +STR_CARGO_SINGULAR_GOLD :{G=m}Oro +STR_CARGO_SINGULAR_WATER :{G=m}Agua +STR_CARGO_SINGULAR_WHEAT :{G=m}Trigo +STR_CARGO_SINGULAR_RUBBER :{G=m}Caucho +STR_CARGO_SINGULAR_SUGAR :{G=m}Azúcar +STR_CARGO_SINGULAR_TOY :{G=m}Juguete +STR_CARGO_SINGULAR_CANDY :{G=m}Dulce +STR_CARGO_SINGULAR_COLA :{G=f}Bebida de cola +STR_CARGO_SINGULAR_COTTON_CANDY :{G=m}Algodón de azúcar +STR_CARGO_SINGULAR_BUBBLE :{G=f}Burbuja +STR_CARGO_SINGULAR_TOFFEE :{G=m}Caramelo suave +STR_CARGO_SINGULAR_BATTERY :{G=f}Pila +STR_CARGO_SINGULAR_PLASTIC :{G=m}Plástico +STR_CARGO_SINGULAR_FIZZY_DRINK :{G=m}Refresco + +# Quantity of cargo +STR_QUANTITY_NOTHING : +STR_QUANTITY_PASSENGERS :{COMMA}{NBSP}pasajero{P "" s} +STR_QUANTITY_COAL :{WEIGHT_LONG} de carbón +STR_QUANTITY_MAIL :{COMMA}{NBSP}bolsa{P "" s} de correo +STR_QUANTITY_OIL :{VOLUME_LONG} de petróleo +STR_QUANTITY_LIVESTOCK :{COMMA}{NBSP}cabeza{P "" s} de ganado +STR_QUANTITY_GOODS :{COMMA}{NBSP}caja{P "" s} de mercancías +STR_QUANTITY_GRAIN :{WEIGHT_LONG} de grano +STR_QUANTITY_WOOD :{WEIGHT_LONG} de madera +STR_QUANTITY_IRON_ORE :{WEIGHT_LONG} de mineral de hierro +STR_QUANTITY_STEEL :{WEIGHT_LONG} de acero +STR_QUANTITY_VALUABLES :{COMMA}{NBSP}bolsa{P "" s} de objetos de valor +STR_QUANTITY_COPPER_ORE :{WEIGHT_LONG} de mineral de cobre +STR_QUANTITY_MAIZE :{WEIGHT_LONG} de maíz +STR_QUANTITY_FRUIT :{WEIGHT_LONG} de fruta +STR_QUANTITY_DIAMONDS :{COMMA}{NBSP}bolsa{P "" s} de diamantes +STR_QUANTITY_FOOD :{WEIGHT_LONG} de alimento +STR_QUANTITY_PAPER :{WEIGHT_LONG} de papel +STR_QUANTITY_GOLD :{COMMA}{NBSP}bolsa{P "" s} de oro +STR_QUANTITY_WATER :{VOLUME_LONG} de agua +STR_QUANTITY_WHEAT :{WEIGHT_LONG} de trigo +STR_QUANTITY_RUBBER :{VOLUME_LONG} de caucho +STR_QUANTITY_SUGAR :{WEIGHT_LONG} de azúcar +STR_QUANTITY_TOYS :{COMMA}{NBSP}juguete{P "" s} +STR_QUANTITY_SWEETS :{COMMA}{NBSP}bolsa{P "" s} de dulces +STR_QUANTITY_COLA :{VOLUME_LONG} de cola +STR_QUANTITY_CANDYFLOSS :{WEIGHT_LONG} de algo{P dón dones} de azúcar +STR_QUANTITY_BUBBLES :{COMMA} burbuja{P "" s} +STR_QUANTITY_TOFFEE :{WEIGHT_LONG} de caramelo suave +STR_QUANTITY_BATTERIES :{COMMA} pila{P "" s} +STR_QUANTITY_PLASTIC :{VOLUME_LONG} de plásticos +STR_QUANTITY_FIZZY_DRINKS :{COMMA} refresco{P "" s} +STR_QUANTITY_N_A :N/A + +# Two letter abbreviation of cargo name +STR_ABBREV_NOTHING : +STR_ABBREV_PASSENGERS :{TINY_FONT}PS +STR_ABBREV_COAL :{TINY_FONT}CA +STR_ABBREV_MAIL :{TINY_FONT}CO +STR_ABBREV_OIL :{TINY_FONT}PE +STR_ABBREV_LIVESTOCK :{TINY_FONT}GA +STR_ABBREV_GOODS :{TINY_FONT}ME +STR_ABBREV_GRAIN :{TINY_FONT}GR +STR_ABBREV_WOOD :{TINY_FONT}MA +STR_ABBREV_IRON_ORE :{TINY_FONT}HI +STR_ABBREV_STEEL :{TINY_FONT}AC +STR_ABBREV_VALUABLES :{TINY_FONT}OV +STR_ABBREV_COPPER_ORE :{TINY_FONT}CB +STR_ABBREV_MAIZE :{TINY_FONT}MZ +STR_ABBREV_FRUIT :{TINY_FONT}FR +STR_ABBREV_DIAMONDS :{TINY_FONT}DI +STR_ABBREV_FOOD :{TINY_FONT}AL +STR_ABBREV_PAPER :{TINY_FONT}PA +STR_ABBREV_GOLD :{TINY_FONT}OR +STR_ABBREV_WATER :{TINY_FONT}AG +STR_ABBREV_WHEAT :{TINY_FONT}TR +STR_ABBREV_RUBBER :{TINY_FONT}CH +STR_ABBREV_SUGAR :{TINY_FONT}AZ +STR_ABBREV_TOYS :{TINY_FONT}JU +STR_ABBREV_SWEETS :{TINY_FONT}DU +STR_ABBREV_COLA :{TINY_FONT}CL +STR_ABBREV_CANDYFLOSS :{TINY_FONT}AA +STR_ABBREV_BUBBLES :{TINY_FONT}BU +STR_ABBREV_TOFFEE :{TINY_FONT}CS +STR_ABBREV_BATTERIES :{TINY_FONT}PI +STR_ABBREV_PLASTIC :{TINY_FONT}PL +STR_ABBREV_FIZZY_DRINKS :{TINY_FONT}RE +STR_ABBREV_NONE :{TINY_FONT}NADA +STR_ABBREV_ALL :{TINY_FONT}TODO + +# 'Mode' of transport for cargoes +STR_PASSENGERS :{COMMA}{NBSP}pasajero{P "" s} +STR_BAGS :{COMMA}{NBSP}bolsa{P "" s} +STR_TONS :{G=f}{COMMA}{NBSP}tonelada{P "" s} +STR_LITERS :{COMMA}{NBSP}litro{P "" s} +STR_ITEMS :{COMMA}{NBSP}artículo{P "" s} +STR_CRATES :{COMMA}{NBSP}caja{P "" s} + +# Colours, do not shuffle +STR_COLOUR_DARK_BLUE :Azul oscuro +STR_COLOUR_PALE_GREEN :Verde claro +STR_COLOUR_PINK :Rosa +STR_COLOUR_YELLOW :Amarillo +STR_COLOUR_RED :Rojo +STR_COLOUR_LIGHT_BLUE :Azul claro +STR_COLOUR_GREEN :Verde +STR_COLOUR_DARK_GREEN :Verde oscuro +STR_COLOUR_BLUE :Azul +STR_COLOUR_CREAM :Crema +STR_COLOUR_MAUVE :Malva +STR_COLOUR_PURPLE :Morado +STR_COLOUR_ORANGE :Naranja +STR_COLOUR_BROWN :Café +STR_COLOUR_GREY :Gris +STR_COLOUR_WHITE :Blanco + +# Units used in OpenTTD +STR_UNITS_VELOCITY_IMPERIAL :{COMMA}{NBSP}mph +STR_UNITS_VELOCITY_METRIC :{COMMA}{NBSP}km/h +STR_UNITS_VELOCITY_SI :{COMMA}{NBSP}m/s + +STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp +STR_UNITS_POWER_METRIC :{COMMA}{NBSP}cv +STR_UNITS_POWER_SI :{COMMA}{NBSP}kW + +STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t +STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t +STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg + +STR_UNITS_WEIGHT_LONG_IMPERIAL :{G=f}{COMMA}{NBSP}tonelada{P "" s} +STR_UNITS_WEIGHT_LONG_METRIC :{G=f}{COMMA}{NBSP}tonelada{P "" s} +STR_UNITS_WEIGHT_LONG_SI :{COMMA}{NBSP}kg + +STR_UNITS_VOLUME_SHORT_IMPERIAL :{COMMA}{NBSP}gal +STR_UNITS_VOLUME_SHORT_METRIC :{COMMA}{NBSP}l +STR_UNITS_VOLUME_SHORT_SI :{COMMA}{NBSP}m³ + +STR_UNITS_VOLUME_LONG_IMPERIAL :{COMMA}{NBSP} gal{P ón ones} +STR_UNITS_VOLUME_LONG_METRIC :{COMMA}{NBSP}litro{P "" s} +STR_UNITS_VOLUME_LONG_SI :{COMMA}{NBSP}m³ + +STR_UNITS_FORCE_IMPERIAL :{COMMA}{NBSP}lbf +STR_UNITS_FORCE_METRIC :{COMMA}{NBSP}kp +STR_UNITS_FORCE_SI :{COMMA}{NBSP}kN + +STR_UNITS_HEIGHT_IMPERIAL :{COMMA}{NBSP}pies +STR_UNITS_HEIGHT_METRIC :{COMMA}{NBSP}m +STR_UNITS_HEIGHT_SI :{COMMA}{NBSP}m + +# Common window strings +STR_LIST_FILTER_TITLE :{BLACK}Filtrar palabras: +STR_LIST_FILTER_OSKTITLE :{BLACK}Indicar una palabra a filtrar +STR_LIST_FILTER_TOOLTIP :{BLACK}Indicar una palabra clave para filtrar la lista + +STR_TOOLTIP_GROUP_ORDER :{BLACK}Elegir orden de grupo +STR_TOOLTIP_SORT_ORDER :{BLACK}Elegir orden descendiente o ascendiente +STR_TOOLTIP_SORT_CRITERIA :{BLACK}Elegir criterio de orden +STR_TOOLTIP_FILTER_CRITERIA :{BLACK}Elegir criterio de filtrado +STR_BUTTON_SORT_BY :{BLACK}Ordenar por +STR_BUTTON_LOCATION :{BLACK}Ubicación +STR_BUTTON_RENAME :{BLACK}Cambiar nombre + +STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Cerrar ventana +STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Título de la ventana (arrastrar para mover) +STR_TOOLTIP_SHADE :{BLACK}Ocultar ventana (mostrar solo título) +STR_TOOLTIP_DEBUG :{BLACK}Mostrar información de depuración de NewGRF +STR_TOOLTIP_DEFSIZE :{BLACK}Cambiar al tamaño predeterminado de la ventana. Ctrl+Clic guarda el tamaño actual como nuevo tamaño predeterminado +STR_TOOLTIP_STICKY :{BLACK}Excluir esta ventana de la función 'Cerrar todas las ventanas' (tecla Supr). Ctrl+Clic guarda esta preferencia como opción predeterminada +STR_TOOLTIP_RESIZE :{BLACK}Arrastrar para cambiar el tamaño de esta ventana +STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Cambiar entre tamaño de ventana grande o pequeño +STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST :{BLACK}Barra de desplazamiento (mueve la lista arriba o abajo) +STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Barra de desplazamiento (mueve la lista izquierda o derecha) +STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Demoler edificios, etc. en un área de terreno. Ctrl para seleccionar un área en diagonal. Mayús muestra una estimación del precio + +# Show engines button +STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN :{BLACK}Mostrar ocultos +STR_SHOW_HIDDEN_ENGINES_VEHICLE_ROAD_VEHICLE :{BLACK}Mostrar ocultos +STR_SHOW_HIDDEN_ENGINES_VEHICLE_SHIP :{BLACK}Mostrar ocultos +STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT :{BLACK}Mostrar ocultos + +STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN_TOOLTIP :{BLACK}Activar para mostrar también los trenes ocultos +STR_SHOW_HIDDEN_ENGINES_VEHICLE_ROAD_VEHICLE_TOOLTIP :{BLACK}Activar para mostrar también los vehículos de carretera ocultos +STR_SHOW_HIDDEN_ENGINES_VEHICLE_SHIP_TOOLTIP :{BLACK}Activar para mostrar también los barcos ocultos +STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}Activar para mostrar también las aeronaves ocultas + +# Query window +STR_BUTTON_DEFAULT :{BLACK}Predeterminado +STR_BUTTON_CANCEL :{BLACK}Cancelar +STR_BUTTON_OK :{BLACK}Aceptar + +# On screen keyboard window +STR_OSK_KEYBOARD_LAYOUT :|1234567890'¿\qwertyuiop´+asdfghjklñ{}ZXCVBNM;:_ . + +# Measurement tooltip +STR_MEASURE_LENGTH :{BLACK}Longitud: {NUM} +STR_MEASURE_AREA :{BLACK}Área: {NUM} × {NUM} +STR_MEASURE_LENGTH_HEIGHTDIFF :{BLACK}Longitud: {NUM}{}Diferencia altura: {HEIGHT} +STR_MEASURE_AREA_HEIGHTDIFF :{BLACK}Área: {NUM}×{NUM}{}Diferencia altura: {HEIGHT} + + +# These are used in buttons +STR_SORT_BY_CAPTION_NAME :{BLACK}Nombre +STR_SORT_BY_CAPTION_DATE :{BLACK}Fecha +# These are used in dropdowns +STR_SORT_BY_NAME :Nombre +STR_SORT_BY_PRODUCTION :Producción +STR_SORT_BY_TYPE :Tipo +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 +STR_SORT_BY_AGE :Edad +STR_SORT_BY_RELIABILITY :Fiabilidad +STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :Capacidad por tipo de carga +STR_SORT_BY_MAX_SPEED :Velocidad máxima +STR_SORT_BY_MODEL :Modelo +STR_SORT_BY_VALUE :Valor +STR_SORT_BY_LENGTH :Longitud +STR_SORT_BY_LIFE_TIME :Tiempo de vida restante +STR_SORT_BY_TIMETABLE_DELAY :Retraso en itinerario +STR_SORT_BY_FACILITY :Tipo de estación +STR_SORT_BY_WAITING_TOTAL :Cargamento total en espera +STR_SORT_BY_WAITING_AVAILABLE :Cargamento disponible en espera +STR_SORT_BY_RATING_MAX :Valoración más alta de cargamento +STR_SORT_BY_RATING_MIN :Valoración más baja de cargamento +STR_SORT_BY_ENGINE_ID :Id. locomotora (orden clásico) +STR_SORT_BY_COST :Costo +STR_SORT_BY_POWER :Potencia +STR_SORT_BY_TRACTIVE_EFFORT :Fuerza de tracción +STR_SORT_BY_INTRO_DATE :Fecha de introducción +STR_SORT_BY_RUNNING_COST :Costo de operación +STR_SORT_BY_POWER_VS_RUNNING_COST :Potencia vs. costo de operación +STR_SORT_BY_CARGO_CAPACITY :Capacidad de carga +STR_SORT_BY_RANGE :Alcance +STR_SORT_BY_POPULATION :Población +STR_SORT_BY_RATING :Evaluación + +# Tooltips for the main toolbar +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, 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 +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Mostrar lista de estaciones +STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Mostrar información financiera de la empresa +STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Mostrar información general de la empresa +STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Mostrar historial +STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Mostrar lista de metas +STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Mostrar gráficas +STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Mostrar tabla de evaluación de empresas +STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Aportar fondos para construir una nueva industria +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Mostrar lista de trenes de la empresa. Ctrl+Clic oculta la lista de grupos +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Mostrar lista de vehículos de carretera de la empresa. Ctrl+Clic oculta la lista de grupos +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Mostrar lista de barcos de la empresa. Ctrl+Clic oculta la lista de grupos +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Mostrar lista de aeronaves de la empresa. Ctrl+Clic oculta la lista de grupos +STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Acercar vista +STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Alejar vista +STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construir vías férreas +STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Construir carreteras +STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Construir muelles +STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Construir aeropuertos +STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Abrir herramienta para nivelar o elevar el terreno, plantar árboles, etc. +STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Mostrar ventana de sonido y música +STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Mostrar último mensaje o noticia, mostrar opciones de mensajes +STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Información sobre área de terreno, consola, depuración de script, capturas de pantalla, acerca de OpenTTD +STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR :{BLACK}Cambiar barras de herramientas + +# Extra tooltips for the scenario editor toolbar +STR_SCENEDIT_TOOLBAR_TOOLTIP_SAVE_SCENARIO_LOAD_SCENARIO :{BLACK}Guardar mapa personalizado, cargar mapa personalizado, salir del editor, salir +STR_SCENEDIT_TOOLBAR_OPENTTD :{YELLOW}OpenTTD +STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR :{YELLOW}Editor de mapas personalizados +STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD :{BLACK}Retroceder un año la fecha de inicio +STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD :{BLACK}Avanzar un año la fecha de inicio +STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE :{BLACK}Clic para establecer el año inicial +STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Mostrar mapa, guía de pueblos +STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Generación de terreno +STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Generación de pueblos +STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Generación de industrias +STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Construcción de carreteras +STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Plantar árboles. Mayús muestra una estimación del precio +STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Poner cartel +STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Colocar objeto. Mayús muestra una estimación del precio + +############ range for SE file menu starts +STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO :Guardar mapa +STR_SCENEDIT_FILE_MENU_LOAD_SCENARIO :Cargar mapa +STR_SCENEDIT_FILE_MENU_SAVE_HEIGHTMAP :Guardar mapa de alturas +STR_SCENEDIT_FILE_MENU_LOAD_HEIGHTMAP :Cargar mapa de alturas +STR_SCENEDIT_FILE_MENU_QUIT_EDITOR :Salir del editor +STR_SCENEDIT_FILE_MENU_SEPARATOR : +STR_SCENEDIT_FILE_MENU_QUIT :Salir +############ range for SE file menu starts + +############ range for settings menu starts +STR_SETTINGS_MENU_GAME_OPTIONS :Opciones de juego +STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Configuración +STR_SETTINGS_MENU_SCRIPT_SETTINGS :Configuración de scripts +STR_SETTINGS_MENU_NEWGRF_SETTINGS :Configuración de NewGRF +STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Opciones de transparencia +STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Mostrar nombres de pueblos +STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED :Mostrar nombres de estaciones +STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED :Mostrar puntos guías +STR_SETTINGS_MENU_SIGNS_DISPLAYED :Mostrar carteles propios +STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS :Mostrar carteles y nombres del competidor +STR_SETTINGS_MENU_FULL_ANIMATION :Animación completa +STR_SETTINGS_MENU_FULL_DETAIL :Detalle completo +STR_SETTINGS_MENU_TRANSPARENT_BUILDINGS :Edificios transparentes +STR_SETTINGS_MENU_TRANSPARENT_SIGNS :Carteles transparentes +############ range ends here + +############ range for file menu starts +STR_FILE_MENU_SAVE_GAME :Guardar partida +STR_FILE_MENU_LOAD_GAME :Cargar partida +STR_FILE_MENU_QUIT_GAME :Salir de la partida +STR_FILE_MENU_SEPARATOR : +STR_FILE_MENU_EXIT :Salir +############ range ends here + +# map menu +STR_MAP_MENU_MAP_OF_WORLD :Minimapa completo +STR_MAP_MENU_EXTRA_VIEW_PORT :Ventana de vista adicional +STR_MAP_MENU_LINGRAPH_LEGEND :Leyenda de flujo de cargamento +STR_MAP_MENU_SIGN_LIST :Lista de carteles + +############ range for town menu starts +STR_TOWN_MENU_TOWN_DIRECTORY :Guía de pueblos +STR_TOWN_MENU_FOUND_TOWN :Fundar pueblo +############ range ends here + +############ range for subsidies menu starts +STR_SUBSIDIES_MENU_SUBSIDIES :Subsidios +############ range ends here + +############ range for graph menu starts +STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH :Gráfica de utilidades operativas +STR_GRAPH_MENU_INCOME_GRAPH :Gráfica de ingresos +STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH :Gráfica de cargamento entregado +STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH :Gráfica de desempeño +STR_GRAPH_MENU_COMPANY_VALUE_GRAPH :Gráfica del valor de la empresa +STR_GRAPH_MENU_CARGO_PAYMENT_RATES :Tarifas de pagos por cargamento +############ range ends here + +############ range for company league menu starts +STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE :Tabla de evaluación de empresas +STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING :Detalles de desempeño +STR_GRAPH_MENU_HIGHSCORE :Tabla de puntuaciones +############ range ends here + +############ range for industry menu starts +STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY :Guía de industrias +STR_INDUSTRY_MENU_INDUSTRY_CHAIN :Cadenas de industrias +STR_INDUSTRY_MENU_FUND_NEW_INDUSTRY :Fundar nueva industria +############ range ends here + +############ range for railway construction menu starts +STR_RAIL_MENU_RAILROAD_CONSTRUCTION :Construcción de ferrocarril +STR_RAIL_MENU_ELRAIL_CONSTRUCTION :Construcción de ferrocarril eléctrico +STR_RAIL_MENU_MONORAIL_CONSTRUCTION :Construcción de monorriel +STR_RAIL_MENU_MAGLEV_CONSTRUCTION :Construcción de maglev +############ range ends here + +############ range for road construction menu starts +STR_ROAD_MENU_ROAD_CONSTRUCTION :Construcción de carretera +STR_ROAD_MENU_TRAM_CONSTRUCTION :Construcción de tranvía +############ range ends here + +############ range for waterways construction menu starts +STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION :Construcción de canales +############ range ends here + +############ range for airport construction menu starts +STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION :Construcción de aeropuerto +############ range ends here + +############ range for landscaping menu starts +STR_LANDSCAPING_MENU_LANDSCAPING :Terreno +STR_LANDSCAPING_MENU_PLANT_TREES :Plantar árboles +STR_LANDSCAPING_MENU_PLACE_SIGN :Poner letrero +############ range ends here + +############ range for music menu starts +STR_TOOLBAR_SOUND_MUSIC :Sonido y música +############ range ends here + +############ range for message menu starts +STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT :Último mensaje o noticia +STR_NEWS_MENU_MESSAGE_HISTORY_MENU :Historial de mensajes +############ range ends here + +############ range for about menu starts +STR_ABOUT_MENU_LAND_BLOCK_INFO :Información sobre área de terreno +STR_ABOUT_MENU_SEPARATOR : +STR_ABOUT_MENU_TOGGLE_CONSOLE :Activar consola +STR_ABOUT_MENU_AI_DEBUG :Depuración de scripts de IA o juego +STR_ABOUT_MENU_SCREENSHOT :Captura de pantalla +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 +STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Activar coloreado de bloques modificados +############ range ends here + +############ range for ordinal numbers used for the place in the highscore window +STR_ORDINAL_NUMBER_1ST :1º +STR_ORDINAL_NUMBER_2ND :2º +STR_ORDINAL_NUMBER_3RD :3º +STR_ORDINAL_NUMBER_4TH :4º +STR_ORDINAL_NUMBER_5TH :5º +STR_ORDINAL_NUMBER_6TH :6º +STR_ORDINAL_NUMBER_7TH :7º +STR_ORDINAL_NUMBER_8TH :8º +STR_ORDINAL_NUMBER_9TH :9º +STR_ORDINAL_NUMBER_10TH :10º +STR_ORDINAL_NUMBER_11TH :11º +STR_ORDINAL_NUMBER_12TH :12º +STR_ORDINAL_NUMBER_13TH :13º +STR_ORDINAL_NUMBER_14TH :14º +STR_ORDINAL_NUMBER_15TH :15º +############ range for ordinal numbers ends + +############ range for days starts +STR_DAY_NUMBER_1ST :1 +STR_DAY_NUMBER_2ND :2 +STR_DAY_NUMBER_3RD :3 +STR_DAY_NUMBER_4TH :4 +STR_DAY_NUMBER_5TH :5 +STR_DAY_NUMBER_6TH :6 +STR_DAY_NUMBER_7TH :7 +STR_DAY_NUMBER_8TH :8 +STR_DAY_NUMBER_9TH :9 +STR_DAY_NUMBER_10TH :10 +STR_DAY_NUMBER_11TH :11 +STR_DAY_NUMBER_12TH :12 +STR_DAY_NUMBER_13TH :13 +STR_DAY_NUMBER_14TH :14 +STR_DAY_NUMBER_15TH :15 +STR_DAY_NUMBER_16TH :16 +STR_DAY_NUMBER_17TH :17 +STR_DAY_NUMBER_18TH :18 +STR_DAY_NUMBER_19TH :19 +STR_DAY_NUMBER_20TH :20 +STR_DAY_NUMBER_21ST :21 +STR_DAY_NUMBER_22ND :22 +STR_DAY_NUMBER_23RD :23 +STR_DAY_NUMBER_24TH :24 +STR_DAY_NUMBER_25TH :25 +STR_DAY_NUMBER_26TH :26 +STR_DAY_NUMBER_27TH :27 +STR_DAY_NUMBER_28TH :28 +STR_DAY_NUMBER_29TH :29 +STR_DAY_NUMBER_30TH :30 +STR_DAY_NUMBER_31ST :31 +############ range for days ends + +############ range for months starts +STR_MONTH_ABBREV_JAN :Ene +STR_MONTH_ABBREV_FEB :Feb +STR_MONTH_ABBREV_MAR :Mar +STR_MONTH_ABBREV_APR :Abr +STR_MONTH_ABBREV_MAY :May +STR_MONTH_ABBREV_JUN :Jun +STR_MONTH_ABBREV_JUL :Jul +STR_MONTH_ABBREV_AUG :Ago +STR_MONTH_ABBREV_SEP :Sep +STR_MONTH_ABBREV_OCT :Oct +STR_MONTH_ABBREV_NOV :Nov +STR_MONTH_ABBREV_DEC :Dic + +STR_MONTH_JAN :Enero +STR_MONTH_FEB :Febrero +STR_MONTH_MAR :Marzo +STR_MONTH_APR :Abril +STR_MONTH_MAY :Mayo +STR_MONTH_JUN :Junio +STR_MONTH_JUL :Julio +STR_MONTH_AUG :Agosto +STR_MONTH_SEP :Septiembre +STR_MONTH_OCT :Octubre +STR_MONTH_NOV :Noviembre +STR_MONTH_DEC :Diciembre +############ range for months ends + +# Graph window +STR_GRAPH_KEY_BUTTON :{BLACK}Leyenda +STR_GRAPH_KEY_TOOLTIP :{BLACK}Mostrar leyenda de gráficas +STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING} +STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{}{NUM} +STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING} +STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA} + +STR_GRAPH_OPERATING_PROFIT_CAPTION :{WHITE}Gráfica de utilidad operativa +STR_GRAPH_INCOME_CAPTION :{WHITE}Gráfica de ingresos +STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Unidades de cargamento entregadas +STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Nivel de desempeño (nivel máximo: 1000) +STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Valor de la empresa + +STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Tarifas de pago por cargamento +STR_GRAPH_CARGO_PAYMENT_RATES_X_LABEL :{TINY_FONT}{BLACK}Días en tránsito +STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Pago por entregar 10 unidades (o 10,000 litros) de cargamento por distancia de 20 casillas +STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Activar todos +STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Desactivar todos +STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Mostrar todos los tipos de carga en la gráfica de tarifas de pago por cargamento +STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Ocultar todos los tipos de carga en la gráfica de tarifas de pago por cargamento +STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Mostrar u ocultar gráfica de este tipo de cargamento +STR_GRAPH_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLACK}{STRING} + +STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Mostrar detalles de nivel de desempeño + +# Graph key window +STR_GRAPH_KEY_CAPTION :{WHITE}Leyenda de gráfica +STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Mostrar u ocultar la entrada de la empresa en la gráfica + +# Company league window +STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Tabla de evaluación de empresas +STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPANY} {BLACK}{COMPANY_NUM} '{STRING}' +STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER :Ingeniero +STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER :Director de Tráfico +STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR :Coordinador de Transporte +STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ROUTE_SUPERVISOR :Supervisor de Rutas +STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_DIRECTOR :Jefe +STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHIEF_EXECUTIVE :Subdirector +STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHAIRMAN :Director +STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_PRESIDENT :Presidente +STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TYCOON :Magnate + +# Performance detail window +STR_PERFORMANCE_DETAIL :{WHITE}Detalle de nivel de desempeño +STR_PERFORMANCE_DETAIL_KEY :{BLACK}Detalle +STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY :{BLACK}({CURRENCY_SHORT}/{CURRENCY_SHORT}) +STR_PERFORMANCE_DETAIL_AMOUNT_INT :{BLACK}({COMMA}/{COMMA}) +STR_PERFORMANCE_DETAIL_PERCENT :{WHITE}{NUM}% +STR_PERFORMANCE_DETAIL_SELECT_COMPANY_TOOLTIP :{BLACK}Mostrar detalles de esta empresa +############ Those following lines need to be in this order!! +STR_PERFORMANCE_DETAIL_VEHICLES :{BLACK}Vehículos: +STR_PERFORMANCE_DETAIL_STATIONS :{BLACK}Estaciones: +STR_PERFORMANCE_DETAIL_MIN_PROFIT :{BLACK}Utilidad mín.: +STR_PERFORMANCE_DETAIL_MIN_INCOME :{BLACK}Ingreso mín.: +STR_PERFORMANCE_DETAIL_MAX_INCOME :{BLACK}Ingreso máx.: +STR_PERFORMANCE_DETAIL_DELIVERED :{BLACK}Entregado: +STR_PERFORMANCE_DETAIL_CARGO :{BLACK}Cargamento: +STR_PERFORMANCE_DETAIL_MONEY :{BLACK}Dinero: +STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Préstamo: +STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Total: +############ End of order list +STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP :{BLACK}Número de vehículos que generaron utilidades el año pasado. Incluye vehículos de carretera, trenes, barcos y aeronaves +STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Número de estaciones abastecidas recientemente. Las estaciones de tren, paradas de autobuses, aeropuertos y demás se contabilizan aparte, aun si pertenecen a la misma estación +STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP :{BLACK}Utilidad del vehículo con menores ingresos (de entre aquellos con más de 2 años) +STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Cantidad de efectivo ganado en el trimestre con la utilidad más baja de los pasados 12 trimestres +STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Cantidad de efectivo ganado en el trimestre con la utilidad más alta de los pasados 12 trimestres +STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Unidades de cargamento entregadas en los pasados cuatro trimestres +STR_PERFORMANCE_DETAIL_CARGO_TOOLTIP :{BLACK}Número de tipos de cargamento entregados en el trimestre pasado +STR_PERFORMANCE_DETAIL_MONEY_TOOLTIP :{BLACK}Cantidad de dinero que esta empresa tiene en el banco +STR_PERFORMANCE_DETAIL_LOAN_TOOLTIP :{BLACK}Cantidad de dinero que esta empresa ha recibido como préstamo +STR_PERFORMANCE_DETAIL_TOTAL_TOOLTIP :{BLACK}Total de puntos ganados del máximo posible + +# Music window +STR_MUSIC_JAZZ_JUKEBOX_CAPTION :{WHITE}Selección de jazz +STR_MUSIC_PLAYLIST_ALL :{TINY_FONT}{BLACK}Todo +STR_MUSIC_PLAYLIST_OLD_STYLE :{TINY_FONT}{BLACK}Antiguo +STR_MUSIC_PLAYLIST_NEW_STYLE :{TINY_FONT}{BLACK}Moderno +STR_MUSIC_PLAYLIST_EZY_STREET :{TINY_FONT}{BLACK}Ezy Street +STR_MUSIC_PLAYLIST_CUSTOM_1 :{TINY_FONT}{BLACK}Personal 1 +STR_MUSIC_PLAYLIST_CUSTOM_2 :{TINY_FONT}{BLACK}Personal 2 +STR_MUSIC_MUSIC_VOLUME :{TINY_FONT}{BLACK}Volumen música +STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLACK}Volumen efectos +STR_MUSIC_RULER_MIN :{TINY_FONT}{BLACK}MÍN +STR_MUSIC_RULER_MAX :{TINY_FONT}{BLACK}MÁX +STR_MUSIC_RULER_MARKER :{TINY_FONT}{BLACK}' +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 +STR_MUSIC_SHUFFLE :{TINY_FONT}{BLACK}Mezclar +STR_MUSIC_PROGRAM :{TINY_FONT}{BLACK}Programa +STR_MUSIC_TOOLTIP_SKIP_TO_PREVIOUS_TRACK :{BLACK}Saltar a la pista anterior de la selección +STR_MUSIC_TOOLTIP_SKIP_TO_NEXT_TRACK_IN_SELECTION :{BLACK}Saltar a la pista siguiente de la selección +STR_MUSIC_TOOLTIP_STOP_PLAYING_MUSIC :{BLACK}Detener música +STR_MUSIC_TOOLTIP_START_PLAYING_MUSIC :{BLACK}Comenzar música +STR_MUSIC_TOOLTIP_DRAG_SLIDERS_TO_SET_MUSIC :{BLACK}Mover los cursores para ajustar el volumen de la música y los efectos +STR_MUSIC_TOOLTIP_SELECT_ALL_TRACKS_PROGRAM :{BLACK}Elegir programa 'todas las pistas' +STR_MUSIC_TOOLTIP_SELECT_OLD_STYLE_MUSIC :{BLACK}Elegir programa 'antiguo' +STR_MUSIC_TOOLTIP_SELECT_NEW_STYLE_MUSIC :{BLACK}Elegir programa 'moderno' +STR_MUSIC_TOOLTIP_SELECT_EZY_STREET_STYLE :{BLACK}Elegir programa 'Ezy Street' +STR_MUSIC_TOOLTIP_SELECT_CUSTOM_1_USER_DEFINED :{BLACK}Elegir programa 'Personal 1' (definido por el usuario) +STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Elegir programa 'Personal 2' (definido por el usuario) +STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Encender o apagar mezclador +STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Mostrar ventana de selección de pistas musicales + +# Playlist window +STR_PLAYLIST_MUSIC_SELECTION_SETNAME :{WHITE}Programa musical - "{STRING}" +STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" +STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Lista de reproducción +STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Programa: '{STRING}' +STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Eliminar +STR_PLAYLIST_CHANGE_SET :{BLACK}Cambiar lista musical +STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Eliminar programa actual (solo Personal 1 y Personal 2) +STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Cambiar la selección musical a otra lista instalada +STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Clic 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}Clic en la pista de música para quitarla del programa actual (solo Personal 1 y 2) + +# Highscore window +STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Lista de empresas que han llegado a {NUM} +STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Tabla de clasificación de empresas en {NUM} +STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. +STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Hombre de negocios +STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Empresario +STR_HIGHSCORE_PERFORMANCE_TITLE_INDUSTRIALIST :Industrial +STR_HIGHSCORE_PERFORMANCE_TITLE_CAPITALIST :Capitalista +STR_HIGHSCORE_PERFORMANCE_TITLE_MAGNATE :Magnate +STR_HIGHSCORE_PERFORMANCE_TITLE_MOGUL :Potentado +STR_HIGHSCORE_PERFORMANCE_TITLE_TYCOON_OF_THE_CENTURY :Magnate del siglo +STR_HIGHSCORE_NAME :{PRESIDENT_NAME}, {COMPANY} +STR_HIGHSCORE_STATS :{BIG_FONT}'{STRING}' ({COMMA}) +STR_HIGHSCORE_COMPANY_ACHIEVES_STATUS :{BIG_FONT}{BLACK}¡{COMPANY} logra colocarse como '{STRING}'! +STR_HIGHSCORE_PRESIDENT_OF_COMPANY_ACHIEVES_STATUS :{BIG_FONT}{WHITE}¡{PRESIDENT_NAME} de {COMPANY} logra colocarse como '{STRING}'! + +# Smallmap window +STR_SMALLMAP_CAPTION :{WHITE}Mapa: {STRING} + +STR_SMALLMAP_TYPE_CONTOURS :Contornos +STR_SMALLMAP_TYPE_VEHICLES :Vehículos +STR_SMALLMAP_TYPE_INDUSTRIES :Industrias +STR_SMALLMAP_TYPE_ROUTEMAP :Flujo de cargamento +STR_SMALLMAP_TYPE_ROUTES :Rutas +STR_SMALLMAP_TYPE_VEGETATION :Vegetación +STR_SMALLMAP_TYPE_OWNERS :Propietarios +STR_SMALLMAP_TOOLTIP_SHOW_LAND_CONTOURS_ON_MAP :{BLACK}Mostrar elevaciones en el mapa +STR_SMALLMAP_TOOLTIP_SHOW_VEHICLES_ON_MAP :{BLACK}Mostrar vehículos en el mapa +STR_SMALLMAP_TOOLTIP_SHOW_INDUSTRIES_ON_MAP :{BLACK}Mostrar industrias en el mapa +STR_SMALLMAP_TOOLTIP_SHOW_LINK_STATS_ON_MAP :{BLACK}Mostrar flujo de cargamento en el mapa +STR_SMALLMAP_TOOLTIP_SHOW_TRANSPORT_ROUTES_ON :{BLACK}Mostrar rutas de transporte en el mapa +STR_SMALLMAP_TOOLTIP_SHOW_VEGETATION_ON_MAP :{BLACK}Mostrar vegetación en el mapa +STR_SMALLMAP_TOOLTIP_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Mostrar dueños de terreno en el mapa +STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Clic en un tipo de industria para mostrarlo u ocultarlo. Ctrl+Clic oculta todos los tipos excepto el elegido. Ctrl+Clic de nuevo en el mismo tipo muestra todos los tipos de industrias +STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Clic en una empresa para mostrar u ocultar sus propiedades. Ctrl+Clic oculta todas las empresas excepto la elegida. Ctrl+Clic de nuevo en la misma empresa muestra todas las empresas +STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Clic en un cargamento para mostrar u ocultar sus propiedades. Ctrl+Clic oculta todos los cargamentos excepto el elegido. Ctrl+Clic de nuevo muestra todos los tipos de cargamento + +STR_SMALLMAP_LEGENDA_ROADS :{TINY_FONT}{BLACK}Carreteras +STR_SMALLMAP_LEGENDA_RAILROADS :{TINY_FONT}{BLACK}Ferrocarriles +STR_SMALLMAP_LEGENDA_STATIONS_AIRPORTS_DOCKS :{TINY_FONT}{BLACK}Estaciones, aeropuertos y puertos +STR_SMALLMAP_LEGENDA_BUILDINGS_INDUSTRIES :{TINY_FONT}{BLACK}Edificios e industrias +STR_SMALLMAP_LEGENDA_VEHICLES :{TINY_FONT}{BLACK}Vehículos +STR_SMALLMAP_LEGENDA_TRAINS :{TINY_FONT}{BLACK}Trenes +STR_SMALLMAP_LEGENDA_ROAD_VEHICLES :{TINY_FONT}{BLACK}Vehículos de carretera +STR_SMALLMAP_LEGENDA_SHIPS :{TINY_FONT}{BLACK}Barcos +STR_SMALLMAP_LEGENDA_AIRCRAFT :{TINY_FONT}{BLACK}Aeronaves +STR_SMALLMAP_LEGENDA_TRANSPORT_ROUTES :{TINY_FONT}{BLACK}Rutas de transporte +STR_SMALLMAP_LEGENDA_FOREST :{TINY_FONT}{BLACK}Bosque +STR_SMALLMAP_LEGENDA_RAILROAD_STATION :{TINY_FONT}{BLACK}Estación de ferrocarril +STR_SMALLMAP_LEGENDA_TRUCK_LOADING_BAY :{TINY_FONT}{BLACK}Estación de carga de camiones +STR_SMALLMAP_LEGENDA_BUS_STATION :{TINY_FONT}{BLACK}Parada de autobús +STR_SMALLMAP_LEGENDA_AIRPORT_HELIPORT :{TINY_FONT}{BLACK}Aeropuerto/Helipuerto +STR_SMALLMAP_LEGENDA_DOCK :{TINY_FONT}{BLACK}Muelle +STR_SMALLMAP_LEGENDA_ROUGH_LAND :{TINY_FONT}{BLACK}Terreno irregular +STR_SMALLMAP_LEGENDA_GRASS_LAND :{TINY_FONT}{BLACK}Pasto +STR_SMALLMAP_LEGENDA_BARE_LAND :{TINY_FONT}{BLACK}Terreno árido +STR_SMALLMAP_LEGENDA_FIELDS :{TINY_FONT}{BLACK}Campos +STR_SMALLMAP_LEGENDA_TREES :{TINY_FONT}{BLACK}Árboles +STR_SMALLMAP_LEGENDA_ROCKS :{TINY_FONT}{BLACK}Rocas +STR_SMALLMAP_LEGENDA_WATER :{TINY_FONT}{BLACK}Agua +STR_SMALLMAP_LEGENDA_NO_OWNER :{TINY_FONT}{BLACK}Sin propietario +STR_SMALLMAP_LEGENDA_TOWNS :{TINY_FONT}{BLACK}Pueblos +STR_SMALLMAP_LEGENDA_INDUSTRIES :{TINY_FONT}{BLACK}Industrias +STR_SMALLMAP_LEGENDA_DESERT :{TINY_FONT}{BLACK}Desierto +STR_SMALLMAP_LEGENDA_SNOW :{TINY_FONT}{BLACK}Nieve + +STR_SMALLMAP_TOOLTIP_TOGGLE_TOWN_NAMES_ON_OFF :{BLACK}Mostrar u ocultar nombres de pueblos en el mapa +STR_SMALLMAP_CENTER :{BLACK}Centrar vista en la ubicación actual +STR_SMALLMAP_INDUSTRY :{TINY_FONT}{STRING} ({NUM}) +STR_SMALLMAP_LINKSTATS :{TINY_FONT}{STRING} +STR_SMALLMAP_COMPANY :{TINY_FONT}{COMPANY} +STR_SMALLMAP_TOWN :{TINY_FONT}{WHITE}{TOWN} +STR_SMALLMAP_DISABLE_ALL :{BLACK}Ocultar todo +STR_SMALLMAP_ENABLE_ALL :{BLACK}Ver todo +STR_SMALLMAP_SHOW_HEIGHT :{BLACK}Mostrar elevación +STR_SMALLMAP_TOOLTIP_DISABLE_ALL_INDUSTRIES :{BLACK}No mostrar industrias en el mapa +STR_SMALLMAP_TOOLTIP_ENABLE_ALL_INDUSTRIES :{BLACK}Mostrar todas las industrias en el mapa +STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Mostrar u ocultar elevaciones en el mapa +STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}No mostrar propiedades de empresas en el mapa +STR_SMALLMAP_TOOLTIP_ENABLE_ALL_COMPANIES :{BLACK}Mostrar todas las propiedades de empresas en el mapa +STR_SMALLMAP_TOOLTIP_DISABLE_ALL_CARGOS :{BLACK}No mostrar ningún cargamento en el mapa +STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Muestra todos los cargamentos en el mapa + +# Status bar messages +STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Mostrar último mensaje o noticia +STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - - +STR_STATUSBAR_PAUSED :{YELLOW}* * EN PAUSA * * +STR_STATUSBAR_AUTOSAVE :{RED}GUARDADO AUTOMÁTICO +STR_STATUSBAR_SAVING_GAME :{RED}* * GUARDANDO PARTIDA * * + +# News message history +STR_MESSAGE_HISTORY :{WHITE}Historial de mensajes +STR_MESSAGE_HISTORY_TOOLTIP :{BLACK}Lista de los mensajes más recientes +STR_MESSAGE_NEWS_FORMAT :{STRING} - {STRING} + +STR_NEWS_MESSAGE_CAPTION :{WHITE}Mensaje +STR_NEWS_CUSTOM_ITEM :{BIG_FONT}{BLACK}{STRING} + +STR_NEWS_FIRST_TRAIN_ARRIVAL :{BIG_FONT}{BLACK}Los ciudadanos celebran . . .{}¡Primer tren llega a {STATION}! +STR_NEWS_FIRST_BUS_ARRIVAL :{BIG_FONT}{BLACK}Los ciudadanos celebran . . .{}¡Primer autobús llega a {STATION}! +STR_NEWS_FIRST_TRUCK_ARRIVAL :{BIG_FONT}{BLACK}Los ciudadanos celebran . . .{}¡Primer camión llega a {STATION}! +STR_NEWS_FIRST_PASSENGER_TRAM_ARRIVAL :{BIG_FONT}{BLACK}Los ciudadanos celebran . . .{}¡Primer tranvía de pasajeros llega a {STATION}! +STR_NEWS_FIRST_CARGO_TRAM_ARRIVAL :{BIG_FONT}{BLACK}Los ciudadanos celebran . . .{}¡Primer tranvía de carga llega a {STATION}! +STR_NEWS_FIRST_SHIP_ARRIVAL :{BIG_FONT}{BLACK}Los ciudadanos celebran . . .{}¡Primer barco llega a {STATION}! +STR_NEWS_FIRST_AIRCRAFT_ARRIVAL :{BIG_FONT}{BLACK}Los ciudadanos celebran . . .{}¡Primera aeronave llega a {STATION}! + +STR_NEWS_TRAIN_CRASH :{BIG_FONT}{BLACK}¡Accidente de tren!{}{COMMA} muertos deja explosión después de choque +STR_NEWS_ROAD_VEHICLE_CRASH_DRIVER :{BIG_FONT}{BLACK}¡Accidente de tráfico!{}Muere conductor en explosión después de choque con el tren +STR_NEWS_ROAD_VEHICLE_CRASH :{BIG_FONT}{BLACK}¡Accidente de tráfico!{}{COMMA} muertos deja explosión después de choque con el tren +STR_NEWS_AIRCRAFT_CRASH :{BIG_FONT}{BLACK}¡Accidente aéreo!{}{COMMA} muertos deja explosión en {STATION} +STR_NEWS_PLANE_CRASH_OUT_OF_FUEL :{BIG_FONT}{BLACK}¡Accidente aéreo!{}Avión se queda sin combustible, ¡{COMMA} personas mueren en explosión! + +STR_NEWS_DISASTER_ZEPPELIN :{BIG_FONT}{BLACK}¡Desastre de zepelín en {STATION}! +STR_NEWS_DISASTER_SMALL_UFO :{BIG_FONT}{BLACK}¡Vehículo destruido en la carretara al impactar con ovni! +STR_NEWS_DISASTER_AIRPLANE_OIL_REFINERY :{BIG_FONT}{BLACK}¡Explota refinería de petróleo cerca de {TOWN}! +STR_NEWS_DISASTER_HELICOPTER_FACTORY :{BIG_FONT}{BLACK}¡Fábrica destruida misteriosamente cerca de {TOWN}! +STR_NEWS_DISASTER_BIG_UFO :{BIG_FONT}{BLACK}¡Ovni aterriza cerca de {TOWN}! +STR_NEWS_DISASTER_COAL_MINE_SUBSIDENCE :{BIG_FONT}{BLACK}¡Hundimiento de mina de carbón deja ola de destrucción cerca de {TOWN}! +STR_NEWS_DISASTER_FLOOD_VEHICLE :{BIG_FONT}{BLACK}¡Inundación!{}Desaparecidos o muertos al menos {COMMA} después de las terribles inundaciones! + +STR_NEWS_COMPANY_IN_TROUBLE_TITLE :{BIG_FONT}{BLACK}¡Empresa de transporte en problemas! +STR_NEWS_COMPANY_IN_TROUBLE_DESCRIPTION :{BIG_FONT}{BLACK}¡{STRING} será vendida o declarada en bancarrota de no incrementar su desempeño pronto! +STR_NEWS_COMPANY_MERGER_TITLE :{BIG_FONT}{BLACK}¡Fusión de empresas de transportes! +STR_NEWS_COMPANY_MERGER_DESCRIPTION :{BIG_FONT}{BLACK}¡{STRING} fue vendida a {STRING} por {CURRENCY_LONG}! +STR_NEWS_COMPANY_BANKRUPT_TITLE :{BIG_FONT}{BLACK}¡En bancarrota! +STR_NEWS_COMPANY_BANKRUPT_DESCRIPTION :{BIG_FONT}{BLACK}¡{STRING} fue cerrada por sus acreedores y todos sus activos fueron vendidos! +STR_NEWS_COMPANY_LAUNCH_TITLE :{BIG_FONT}{BLACK}¡Nueva empresa de transportes! +STR_NEWS_COMPANY_LAUNCH_DESCRIPTION :{BIG_FONT}{BLACK}¡{STRING} comienza su construcción cerca de {TOWN}! +STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLACK}¡{STRING} ha sido adquirida por {STRING}! +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}! + +STR_NEWS_INDUSTRY_CLOSURE_GENERAL :{BIG_FONT}{BLACK}¡La industria {STRING} anuncia su inminente cierre! +STR_NEWS_INDUSTRY_CLOSURE_SUPPLY_PROBLEMS :{BIG_FONT}{BLACK}¡Problemas con suministros provocan que {STRING} anuncie su inminente cierre! +STR_NEWS_INDUSTRY_CLOSURE_LACK_OF_TREES :{BIG_FONT}{BLACK}¡La falta de árboles hace que {STRING} anuncie su inminente cierre! + +STR_NEWS_EURO_INTRODUCTION :{BIG_FONT}{BLACK}¡Unión Monetaria Europea!{}{}¡El Euro es introducido como la nueva moneda oficial de todas las transacciones! +STR_NEWS_BEGIN_OF_RECESSION :{BIG_FONT}{BLACK}¡Recesión mundial!{}{}¡Expertos temen lo peor mientras la economía se desploma! +STR_NEWS_END_OF_RECESSION :{BIG_FONT}{BLACK}¡Fin de la recesión!{}{}¡Incremento en el comercio da confianza a las industrias mientras la economía se fortalece! + +STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL :{BIG_FONT}{BLACK}¡{INDUSTRY} incrementa su producción! +STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_COAL :{BIG_FONT}{BLACK}¡Encontrado nuevo yacimiento de carbón en {INDUSTRY}!{}¡Se espera duplicar la producción! +STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_OIL :{BIG_FONT}{BLACK}¡Encontradas nuevas reservas de petróleo en {INDUSTRY}!{}¡Se espera duplicar la producción! +STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_FARM :{BIG_FONT}{BLACK}¡Nuevos métodos agrícolas en {INDUSTRY} esperan duplicar la producción! +STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_SMOOTH :{BIG_FONT}{BLACK}¡La producción de {STRING} en {INDUSTRY} aumenta un {COMMA}%! +STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL :{BIG_FONT}{BLACK}¡La producción en {INDUSTRY} desciende un 50%! +STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_FARM :{BIG_FONT}{BLACK}¡Plaga de insectos causa estragos en {INDUSTRY}!{} La producción desciende un 50% +STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_SMOOTH :{BIG_FONT}{BLACK}¡La producción de {STRING} en {INDUSTRY} desciende un {COMMA}%! + +STR_NEWS_TRAIN_IS_WAITING :{WHITE}{VEHICLE} está esperando en el depósito +STR_NEWS_ROAD_VEHICLE_IS_WAITING :{WHITE}{VEHICLE} está esperando en el depósito +STR_NEWS_SHIP_IS_WAITING :{WHITE}{VEHICLE} está esperando en el astillero +STR_NEWS_AIRCRAFT_IS_WAITING :{WHITE}{VEHICLE} está esperando en el hangar + +# Order review system / warnings +STR_NEWS_VEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}{VEHICLE} tiene muy pocas órdenes en la lista +STR_NEWS_VEHICLE_HAS_VOID_ORDER :{WHITE}{VEHICLE} tiene una orden vacía +STR_NEWS_VEHICLE_HAS_DUPLICATE_ENTRY :{WHITE}{VEHICLE} tiene órdenes duplicadas +STR_NEWS_VEHICLE_HAS_INVALID_ENTRY :{WHITE}{VEHICLE} tiene una estación no válida en la lista +STR_NEWS_PLANE_USES_TOO_SHORT_RUNWAY :{WHITE}{VEHICLE} tiene un aeropuerto con una pista muy corta en la lista + +STR_NEWS_VEHICLE_IS_GETTING_OLD :{WHITE}{VEHICLE} se está haciendo viejo +STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE} se está haciendo muy viejo +STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD_AND :{WHITE}{VEHICLE} se está haciendo muy viejo y requiere renovación urgente +STR_NEWS_TRAIN_IS_STUCK :{WHITE}{VEHICLE} no encuentra una ruta para continuar +STR_NEWS_VEHICLE_IS_LOST :{WHITE}{VEHICLE} se perdió +STR_NEWS_VEHICLE_IS_UNPROFITABLE :{WHITE}La utilidad de {VEHICLE} el año pasado fue de {CURRENCY_LONG} +STR_NEWS_AIRCRAFT_DEST_TOO_FAR :{WHITE}{VEHICLE} no puede llegar al siguiente destino porque no está a su alcance + +STR_NEWS_ORDER_REFIT_FAILED :{WHITE}{VEHICLE} no avanza porque no pudo reformarse +STR_NEWS_VEHICLE_AUTORENEW_FAILED :{WHITE}Renovación automática fallida para {VEHICLE}{}{STRING} + +STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLACK}¡Nuev{G o a} {STRING} ahora disponible! +STR_NEWS_NEW_VEHICLE_TYPE :{BIG_FONT}{BLACK}{ENGINE} +STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}¡Nuev{G o a} {STRING} ahora disponible! - {ENGINE} + +STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO :{WHITE}{STATION} ya no acepta {STRING} +STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_OR_CARGO :{WHITE}{STATION} ya no acepta {STRING} ni {STRING} +STR_NEWS_STATION_NOW_ACCEPTS_CARGO :{WHITE}{STATION} acepta ahora {STRING} +STR_NEWS_STATION_NOW_ACCEPTS_CARGO_AND_CARGO :{WHITE}{STATION} acepta ahora {STRING} y {STRING} + +STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Oferta de subsidio vencida:{}{}{STRING} de {STRING} a {STRING} ya no está subsidiado +STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Subsidio retirado:{}{}El servicio de {STRING} desde {STRING} a {STRING} ya no está subsidiado +STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Se ofrece subsidio.{}{}¡El primer servicio de {STRING} desde {STRING} a {STRING} tendrá subsidio durante un año por parte del ayuntamiento local! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}¡Subsidio otorgado a {STRING}!{}{}¡El servicio de {STRING} desde {STRING} a {STRING} generará un 50% extra por un año! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}¡Subsidio otorgado a {STRING}!{}{}¡El servicio de {STRING} desde {STRING} a {STRING} generará tasa doble durante un año! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}¡Subsidio otorgado a {STRING}!{}{}¡El servicio de {STRING} desde {STRING} a {STRING} generará tasa triple durante un año! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}¡Subsidio otorgado a {STRING}!{}{}¡El servicio de {STRING} desde {STRING} a {STRING} generará tasa cuádruple por un año! + +STR_NEWS_ROAD_REBUILDING :{BIG_FONT}{BLACK}¡Caos por el tráfico en {TOWN}!{}{}¡Obras de reconstrucción de caminos por parte de {STRING} provocan 6 meses de dolores de cabeza a conductores! +STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}¡Monopolio de transportes! +STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLACK}¡Ayuntamiento de {TOWN} firma contrato de exclusividad con {STRING} por un año! + +# Extra view window +STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Vista {COMMA} +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}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 +STR_GAME_OPTIONS_CURRENCY_UNITS_FRAME :{BLACK}Unidad monetaria +STR_GAME_OPTIONS_CURRENCY_UNITS_DROPDOWN_TOOLTIP :{BLACK}Selección de unidad monetaria + +############ start of currency region +STR_GAME_OPTIONS_CURRENCY_GBP :Libra británica (GBP) +STR_GAME_OPTIONS_CURRENCY_USD :Dólar estadounidense (USD) +STR_GAME_OPTIONS_CURRENCY_EUR :Euro (EUR) +STR_GAME_OPTIONS_CURRENCY_JPY :Yen japonés (¥) +STR_GAME_OPTIONS_CURRENCY_ATS :Chelín austríaco (ATS) +STR_GAME_OPTIONS_CURRENCY_BEF :Franco belga (BEF) +STR_GAME_OPTIONS_CURRENCY_CHF :Franco suizo (CHF) +STR_GAME_OPTIONS_CURRENCY_CZK :Corona checa (CZK) +STR_GAME_OPTIONS_CURRENCY_DEM :Marco alemán (DEM) +STR_GAME_OPTIONS_CURRENCY_DKK :Corona danesa (DKK) +STR_GAME_OPTIONS_CURRENCY_ESP :Peseta española (ESP) +STR_GAME_OPTIONS_CURRENCY_FIM :Marco finlandés (FIM) +STR_GAME_OPTIONS_CURRENCY_FRF :Franco francés (FRF) +STR_GAME_OPTIONS_CURRENCY_GRD :Dracma griego (GRD) +STR_GAME_OPTIONS_CURRENCY_HUF :Florín húngaro (HUF) +STR_GAME_OPTIONS_CURRENCY_ISK :Corona islandesa (ISK) +STR_GAME_OPTIONS_CURRENCY_ITL :Lira italiana (ITL) +STR_GAME_OPTIONS_CURRENCY_NLG :Florín holandés (NLG) +STR_GAME_OPTIONS_CURRENCY_NOK :Corona noruega (NOK) +STR_GAME_OPTIONS_CURRENCY_PLN :Esloti polaco (PLN) +STR_GAME_OPTIONS_CURRENCY_RON :Leu rumano (RON) +STR_GAME_OPTIONS_CURRENCY_RUR :Rublo ruso (RUR) +STR_GAME_OPTIONS_CURRENCY_SIT :Tólar esloveno (SIT) +STR_GAME_OPTIONS_CURRENCY_SEK :Corona sueca (SEK) +STR_GAME_OPTIONS_CURRENCY_TRY :Lira turca (TRY) +STR_GAME_OPTIONS_CURRENCY_SKK :Corona eslovaca +STR_GAME_OPTIONS_CURRENCY_BRL :Real brasileño (BRL) +STR_GAME_OPTIONS_CURRENCY_EEK :Corona estonia (EEK) +STR_GAME_OPTIONS_CURRENCY_LTL :Litas lituana (LTL) +STR_GAME_OPTIONS_CURRENCY_KRW :Won surcoreano (KRW) +STR_GAME_OPTIONS_CURRENCY_ZAR :Rand sudafricano (ZAR) +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 +STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Elegir de qué lado irá la circulación +STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Manejar por la izquierda +STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Manejar por la derecha + +STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Nombres de pueblos +STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Elegir el estilo de nombres para pueblos + +############ start of townname region +STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Inglés +STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Francés +STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Alemán +STR_GAME_OPTIONS_TOWN_NAME_ADDITIONAL_ENGLISH :Inglés (adicional) +STR_GAME_OPTIONS_TOWN_NAME_LATIN_AMERICAN :América Latina +STR_GAME_OPTIONS_TOWN_NAME_SILLY :Tonterías (inglés) +STR_GAME_OPTIONS_TOWN_NAME_SWEDISH :Sueco +STR_GAME_OPTIONS_TOWN_NAME_DUTCH :Holandés +STR_GAME_OPTIONS_TOWN_NAME_FINNISH :Finlandés +STR_GAME_OPTIONS_TOWN_NAME_POLISH :Polaco +STR_GAME_OPTIONS_TOWN_NAME_SLOVAK :Eslovaco +STR_GAME_OPTIONS_TOWN_NAME_NORWEGIAN :Noruego +STR_GAME_OPTIONS_TOWN_NAME_HUNGARIAN :Húngaro +STR_GAME_OPTIONS_TOWN_NAME_AUSTRIAN :Austríaco +STR_GAME_OPTIONS_TOWN_NAME_ROMANIAN :Rumano +STR_GAME_OPTIONS_TOWN_NAME_CZECH :Checo +STR_GAME_OPTIONS_TOWN_NAME_SWISS :Suizo +STR_GAME_OPTIONS_TOWN_NAME_DANISH :Danés +STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Turco +STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Italiano +STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalán +############ end of townname region + +STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Guardado automático +STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Elegir el intervalo de guardados automáticos + +############ start of autosave dropdown +STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF :Desactivado +STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_1_MONTH :Cada mes +STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_3_MONTHS :Cada 3 meses +STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_6_MONTHS :Cada 6 meses +STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_12_MONTHS :Cada 12 meses +############ end of autosave dropdown + +STR_GAME_OPTIONS_LANGUAGE :{BLACK}Idioma +STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Elegir el idioma de la interfaz + +STR_GAME_OPTIONS_FULLSCREEN :{BLACK}Pantalla completa +STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP :{BLACK}Jugar OpenTTD en pantalla completa + +STR_GAME_OPTIONS_RESOLUTION :{BLACK}Resolución de pantalla +STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Elegir la resolución de pantalla +STR_GAME_OPTIONS_RESOLUTION_OTHER :Otra + +STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Tamaño de la interfaz +STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Elegir el tamaño de los elementos de la interfaz + +STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal +STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Doble +STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Cuádruple + +STR_GAME_OPTIONS_BASE_GRF :{BLACK}Gráficos base +STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Elegir los gráficos base +STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} archivo{P "" s} perdido{P "" s} o con errores +STR_GAME_OPTIONS_BASE_GRF_DESCRIPTION_TOOLTIP :{BLACK}Información adicional sobre los gráficos base + +STR_GAME_OPTIONS_BASE_SFX :{BLACK}Sonidos base +STR_GAME_OPTIONS_BASE_SFX_TOOLTIP :{BLACK}Elegir sonidos base +STR_GAME_OPTIONS_BASE_SFX_DESCRIPTION_TOOLTIP :{BLACK}Información adicional sobre los sonidos base + +STR_GAME_OPTIONS_BASE_MUSIC :{BLACK}Música base +STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Elegir música base +STR_GAME_OPTIONS_BASE_MUSIC_STATUS :{RED}{NUM} archivo{P "" s} con errores +STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Información adicional sobre música base + +STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}No se pudo obtener una lista de resoluciones soportadas +STR_ERROR_FULLSCREEN_FAILED :{WHITE}El modo de pantalla completa falló + +# Custom currency window + +STR_CURRENCY_WINDOW :{WHITE}Moneda personalizada +STR_CURRENCY_EXCHANGE_RATE :{LTBLUE}Tasa de cambio: {ORANGE} {CURRENCY_LONG} = £ {COMMA} +STR_CURRENCY_DECREASE_EXCHANGE_RATE_TOOLTIP :{BLACK}Reducir el valor de la moneda por una libra (£) +STR_CURRENCY_INCREASE_EXCHANGE_RATE_TOOLTIP :{BLACK}Incrementar el valor de la moneda por una libra (£) +STR_CURRENCY_SET_EXCHANGE_RATE_TOOLTIP :{BLACK}Ajustar el valor de cambio de la moneda por una Libra (£) + +STR_CURRENCY_SEPARATOR :{LTBLUE}Separador: {ORANGE}{STRING} +STR_CURRENCY_SET_CUSTOM_CURRENCY_SEPARATOR_TOOLTIP :{BLACK}Establecer el separador de cifras de la moneda + +STR_CURRENCY_PREFIX :{LTBLUE}Prefijo: {ORANGE}{STRING} +STR_CURRENCY_SET_CUSTOM_CURRENCY_PREFIX_TOOLTIP :{BLACK}Establecer el prefijo de la moneda +STR_CURRENCY_SUFFIX :{LTBLUE}Sufijo: {ORANGE}{STRING} +STR_CURRENCY_SET_CUSTOM_CURRENCY_SUFFIX_TOOLTIP :{BLACK}Establecer el sufijo de la moneda + +STR_CURRENCY_SWITCH_TO_EURO :{LTBLUE}Cambiar a euro: {ORANGE}{NUM} +STR_CURRENCY_SWITCH_TO_EURO_NEVER :{LTBLUE}Cambiar a euro: {ORANGE}nunca +STR_CURRENCY_SET_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Establecer el año del cambio a euro +STR_CURRENCY_DECREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Cambiar a euro antes +STR_CURRENCY_INCREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Cambiar a euro después + +STR_CURRENCY_PREVIEW :{LTBLUE}Vista previa: {ORANGE} {CURRENCY_LONG} +STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 libras (£) en la moneda +STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Cambiar parámetro de moneda personalizada + +STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Núm. máximo de jugadores: {ORANGE}{COMMA} + +STR_NONE :Ninguno +STR_FUNDING_ONLY :Solo fundadas +STR_MINIMAL :Mínimo +STR_NUM_VERY_LOW :Muy bajo +STR_NUM_LOW :Bajo +STR_NUM_NORMAL :Normal +STR_NUM_HIGH :Alto +STR_NUM_CUSTOM :Personalizado +STR_NUM_CUSTOM_NUMBER :Personalizado ({NUM}) + +STR_VARIETY_NONE :Ninguna +STR_VARIETY_VERY_LOW :Muy baja +STR_VARIETY_LOW :Baja +STR_VARIETY_MEDIUM :Media +STR_VARIETY_HIGH :Alta +STR_VARIETY_VERY_HIGH :Muy alta + +STR_AI_SPEED_VERY_SLOW :Muy lenta +STR_AI_SPEED_SLOW :Lenta +STR_AI_SPEED_MEDIUM :Media +STR_AI_SPEED_FAST :Rápida +STR_AI_SPEED_VERY_FAST :Muy rápida + +STR_SEA_LEVEL_VERY_LOW :Muy bajo +STR_SEA_LEVEL_LOW :Bajo +STR_SEA_LEVEL_MEDIUM :Medio +STR_SEA_LEVEL_HIGH :Alto +STR_SEA_LEVEL_CUSTOM :Personalizado +STR_SEA_LEVEL_CUSTOM_PERCENTAGE :Personalizado ({NUM}%) + +STR_RIVERS_NONE :Ninguno +STR_RIVERS_FEW :Muy pocos +STR_RIVERS_MODERATE :Algunos +STR_RIVERS_LOT :Muchos + +STR_DISASTER_NONE :Ninguno +STR_DISASTER_REDUCED :Reducidos +STR_DISASTER_NORMAL :Normal + +STR_SUBSIDY_X1_5 :x1.5 +STR_SUBSIDY_X2 :x2 +STR_SUBSIDY_X3 :x3 +STR_SUBSIDY_X4 :x4 + +STR_TERRAIN_TYPE_VERY_FLAT :Muy plano +STR_TERRAIN_TYPE_FLAT :Plano +STR_TERRAIN_TYPE_HILLY :Accidentado +STR_TERRAIN_TYPE_MOUNTAINOUS :Montañoso +STR_TERRAIN_TYPE_ALPINIST :Escarpado + +STR_CITY_APPROVAL_PERMISSIVE :Permisiva +STR_CITY_APPROVAL_TOLERANT :Tolerante +STR_CITY_APPROVAL_HOSTILE :Hostil + +STR_WARNING_NO_SUITABLE_AI :{WHITE}No se encontraron archivos de IA apropiados...{}Se pueden descargar por medio del sistema de 'Contenido en línea' + +# Settings tree window +STR_CONFIG_SETTING_TREE_CAPTION :{WHITE}Configuración +STR_CONFIG_SETTING_FILTER_TITLE :{BLACK}Filtrar palabras: +STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Desplegar todo +STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Plegar todo +STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(no hay explicación disponible) +STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Valor predeterminado: {ORANGE}{STRING} +STR_CONFIG_SETTING_TYPE :{LTBLUE}Tipo de opción: {ORANGE}{STRING} +STR_CONFIG_SETTING_TYPE_CLIENT :Opción de cliente (no se almacena en partidas guardadas, afecta todas las partidas) +STR_CONFIG_SETTING_TYPE_GAME_MENU :Opción de partida (se almacena en las partidas guardadas, afecta solamente partidas nuevas) +STR_CONFIG_SETTING_TYPE_GAME_INGAME :Opción de partida (almacenada en la partida guardada, afecta solamente la partida actual) +STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Opción de empresa (se almacena en las partidas guardadas, afecta solamente las partidas nuevas) +STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Opción de empresa (almacenada en la partida guardada, afecta solamente la empresa actual) + +STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK}Categoría: +STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}Tipo: +STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}Mostrar lista con opciones predeterminadas +STR_CONFIG_SETTING_RESTRICT_BASIC :Básico (mostrar solo las opciones más esenciales) +STR_CONFIG_SETTING_RESTRICT_ADVANCED :Avanzado (mostrar la mayoría de las opciones) +STR_CONFIG_SETTING_RESTRICT_ALL :Experto (mostrar todas las opciones, incluso las avanzadas) +STR_CONFIG_SETTING_RESTRICT_CHANGED_AGAINST_DEFAULT :Opciones con un valor diferente al predeterminado +STR_CONFIG_SETTING_RESTRICT_CHANGED_AGAINST_NEW :Opciones con un valor diferente a las opciones de partida nueva + +STR_CONFIG_SETTING_TYPE_DROPDOWN_HELPTEXT :{BLACK}Restringir la lista a ciertos tipos de opciones +STR_CONFIG_SETTING_TYPE_DROPDOWN_ALL :Todos los tipos de opciones +STR_CONFIG_SETTING_TYPE_DROPDOWN_CLIENT :Opciones de cliente (no se almacena en partidas guardadas, afecta todas las partidas) +STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_MENU :Opciones de juego (se almacena en las partidas guardadas, afecta solamente partidas nuevas) +STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME :Opciones de juego (se almacena en las partidas guardadas, afecta solamente la partida actual) +STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Opciones de empresa (se almacena en las partidas guardadas, afecta solamente partidas nuevas) +STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Opciones de empresa (se almacena en las partidas guardadas, afecta solamente la empresa actual) +STR_CONFIG_SETTING_CATEGORY_HIDES :{BLACK}Mostrar todos los resultados por opción de configuración{}{SILVER}Categoría {BLACK}a {WHITE}{STRING} +STR_CONFIG_SETTING_TYPE_HIDES :{BLACK}Mostrar todos los resultados por opción de configuración{}{SILVER}Tipo {BLACK}a {WHITE}Todos los tipos de opción +STR_CONFIG_SETTING_CATEGORY_AND_TYPE_HIDES :{BLACK}Mostrar todos los resultados por opción de configuración{}{SILVER}Categoría {BLACK}a {WHITE}{STRING} {BLACK}y {SILVER}Tipo {BLACK}a {WHITE}Todos los tipos de opción +STR_CONFIG_SETTINGS_NONE :{WHITE}- Ninguno - + +STR_CONFIG_SETTING_OFF :No +STR_CONFIG_SETTING_ON :Sí +STR_CONFIG_SETTING_DISABLED :Deshabilitado + +STR_CONFIG_SETTING_COMPANIES_OFF :Desactivado +STR_CONFIG_SETTING_COMPANIES_OWN :Mi empresa +STR_CONFIG_SETTING_COMPANIES_ALL :Todas las empresas + +STR_CONFIG_SETTING_NONE :Ninguno +STR_CONFIG_SETTING_ORIGINAL :Original +STR_CONFIG_SETTING_REALISTIC :Realista + +STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT :Izquierda +STR_CONFIG_SETTING_HORIZONTAL_POS_CENTER :Centro +STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Derecha + +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Máximo préstamo inicial: {STRING} +STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Máxima cantidad que una empresa puede pedir prestada (sin tener en cuenta la inflación) +STR_CONFIG_SETTING_INTEREST_RATE :Porcentaje de interés: {STRING} +STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Porcentaje de interés de los préstamos; controla también la inflación, en caso de estar activada +STR_CONFIG_SETTING_RUNNING_COSTS :Costos de operación: {STRING} +STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT :Nivel de los costos de mantenimiento y operación de vehículos e infraestructura +STR_CONFIG_SETTING_CONSTRUCTION_SPEED :Velocidad de construcción: {STRING} +STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :Restringir la velocidad de las acciones de construcción de jugadores no humanos +STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :Averías de vehículos: {STRING} +STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :Controlar cada cuánto los vehículos con poco mantenimiento sufren fallas +STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER :Multiplicador de subsidio: {STRING} +STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :Establecer cuánto se paga por subsidios conectados +STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Costos de construcción: {STRING} +STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Nivel de costos de construcción y adquisición +STR_CONFIG_SETTING_RECESSIONS :Recesiones: {STRING} +STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Si se activa, habrá recesiones cada cierto año. Durante una recesión, toda la producción decaerá considerablemente (se restablecerá al final de la recesión) +STR_CONFIG_SETTING_TRAIN_REVERSING :Prohibir a los trenes que cambien de dirección en las estaciones: {STRING} +STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Si se activa, los trenes no podrán girar al lado opuesto en estaciones intermedias, ni siquiera si al girar hay una ruta más corta a su próximo destino +STR_CONFIG_SETTING_DISASTERS :Desastres: {STRING} +STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Desastres que ocasionalmente pueden bloquear o destruir vehículos o infraestructura +STR_CONFIG_SETTING_CITY_APPROVAL :Actitud de los ayuntamientos ante restructuraciones hechas en sus zonas: {STRING} +STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Medida en que el ruido y el daño ambiental causado por las empresas afectan su evaluación y futuras acciones de construcción en las mismas zonas + +STR_CONFIG_SETTING_MAX_HEIGHTLEVEL :Elevación máxima del mapa: {STRING} +STR_CONFIG_SETTING_MAX_HEIGHTLEVEL_HELPTEXT :Elevación máxima que las montañas pueden tener en el mapa +STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}No se puede establecer la elevación máxima del mapa en el valor indicado. Al menos una montaña ya es más alta +STR_CONFIG_SETTING_AUTOSLOPE :Permitir modificar terreno debajo edificios, vías férreas, etc.: {STRING} +STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Modificar el terreno debajo de edificios y vías de tren sin quitarlos +STR_CONFIG_SETTING_CATCHMENT :Permitir cambiar el tamaño del área de recolección a una forma más real: {STRING} +STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Las áreas de recolección se adecúan a diferentes tamaños, según los tipos de estaciones y aeropuertos +STR_CONFIG_SETTING_EXTRADYNAMITE :Permitir quitar mayor cantidad de carreteras, puentes y túneles de los pueblos: {STRING} +STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT :Hacer más fácil eliminar infraestructura y edificios que sean propiedad de los pueblos +STR_CONFIG_SETTING_TRAIN_LENGTH :Longitud máxima de trenes: {STRING} +STR_CONFIG_SETTING_TRAIN_LENGTH_HELPTEXT :Longitud máxima permitida para los trenes +STR_CONFIG_SETTING_TILE_LENGTH :{COMMA} casilla{P 0 "" s} +STR_CONFIG_SETTING_SMOKE_AMOUNT :Cantidad de humo o chispas: {STRING} +STR_CONFIG_SETTING_SMOKE_AMOUNT_HELPTEXT :Cantidad de humo o chispas que son emitidos por los vehículos +STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL :Modelo de aceleración para trenes: {STRING} +STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL_HELPTEXT :Elegir el modelo de simulación física para emplear en la aceleración de trenes. El modelo 'Original' penaliza las pendientes de forma idéntica para todos los vehículos. El modelo 'Simulado' penaliza pendientes y curvas según las características del tren como longitud, fuerza de tracción, etc. +STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL :Modelo de aceleración para vehículos de carretera: {STRING} +STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL_HELPTEXT :Elegir el modelo de simulación física para emplear en la aceleración de vehículos de carretera. El modelo 'Original' penaliza las pendientes de forma idéntica para todos los vehículos. El modelo 'Simulado' penaliza pendientes y curvas según las características del vehículo como potencia, fuerza de tracción, etc. +STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS :Inclinación de pendientes para trenes: {STRING} +STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS_HELPTEXT :Grado de inclinación de una casilla con pendiente para un tren. Los valores altos hacen que sea más difícil subir las colinas +STR_CONFIG_SETTING_PERCENTAGE :{COMMA}% +STR_CONFIG_SETTING_ROAD_VEHICLE_SLOPE_STEEPNESS :Inclinación de pendientes para vehículos de carretera: {STRING} +STR_CONFIG_SETTING_ROAD_VEHICLE_SLOPE_STEEPNESS_HELPTEXT :Grado de inclinación de una casilla con pendiente para un vehículo de carretera. Los valores altos hacen que sea más difícil subir las colinas +STR_CONFIG_SETTING_FORBID_90_DEG :Prohibir a trenes y barcos realizar giros de 90°: {STRING} +STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :Los giros de 90° ocurren en vías férreas perpendiculares donde el tren gira 90° al pasar de una casilla a otra, en lugar de los 45° habituales en otras combinaciones de vías. Esto también se aplica al radio de giro de los barcos +STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS :Permitir la ampliación de estaciones no adyacentes: {STRING} +STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Permitir añadir de partes a una estación sin tener que estar en contacto directo con las partes existentes. Se debe pulsar Ctrl+Clic para añadir las nuevas partes +STR_CONFIG_SETTING_INFLATION :Inflación: {STRING} +STR_CONFIG_SETTING_INFLATION_HELPTEXT :Activar inflación en la economía, lo que hace que los costos aumenten ligeramente más rápido que los ingresos +STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH :Longitud máxima de puentes: {STRING} +STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH_HELPTEXT :Longitud máxima permitida al construir puentes +STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT :Altura máxima de puentes: {STRING} +STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT_HELPTEXT :Altura máxima permitida al construir puentes +STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH :Longitud máxima de túneles: {STRING} +STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH_HELPTEXT :Longitud máxima permitida al construir túneles +STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD :Método para fundar una industria primaria: {STRING} +STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_HELPTEXT :Método con el que se funda una industria primaria. 'Ninguno' indica que no se puede crear ninguna. 'Prospección' indica que se puede fundar una nueva industria pero cuya construcción ocurrirá en un lugar aleatorio del mapa con posibilidad de fallar. 'Como las demás' indica que las industrias primarias pueden construirse como otras industrias, en el lugar que se quiera +STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE :Ninguno +STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_NORMAL :Como las demás +STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_PROSPECTING :Prospección +STR_CONFIG_SETTING_INDUSTRY_PLATFORM :Área plana alrededor de industrias: {STRING} +STR_CONFIG_SETTING_INDUSTRY_PLATFORM_HELPTEXT :Cantidad de espacio plano alrededor de las industrias. Esto asegura que haya espacio libre alrededor de las industrias para construir vías férreas, etc. +STR_CONFIG_SETTING_MULTIPINDTOWN :Permitir múltiples industrias similares por pueblo: {STRING} +STR_CONFIG_SETTING_MULTIPINDTOWN_HELPTEXT :Generalmente, no se permite más de una industria del mismo tipo por pueblo. Con esta opción se permiten múltiples industrias del mismo tipo en el mismo pueblo +STR_CONFIG_SETTING_SIGNALSIDE :Mostrar señales: {STRING} +STR_CONFIG_SETTING_SIGNALSIDE_HELPTEXT :De qué lado de las vías se instalarán las señales +STR_CONFIG_SETTING_SIGNALSIDE_LEFT :A la izquierda +STR_CONFIG_SETTING_SIGNALSIDE_DRIVING_SIDE :En el lado de conducción +STR_CONFIG_SETTING_SIGNALSIDE_RIGHT :A la derecha +STR_CONFIG_SETTING_SHOWFINANCES :Mostrar ventana de finanzas al final del año: {STRING} +STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :Si se activa, la ventana de finanzas aparecerá al final de cada año para permitir realizar una inspección más fácil del estado financiero de la empresa +STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Toda nueva orden es 'Sin paradas' por defecto: {STRING} +STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Generalmente, un tren se detendrá en cada estación por la que pase. Si se activa esta opción, pasará sin detenerse a través de todas las estaciones hasta llegar a su destino. Esta opción solamente define el valor predeterminado de las órdenes nuevas. Es posible especificar para cada orden el comportamiento deseado +STR_CONFIG_SETTING_STOP_LOCATION :Todos los nuevos trenes paran por defecto en el {STRING} del andén +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :En qué parte predeterminada del andén se detendrán los trenes. En el 'principio' el tren se detiene cerca del punto de entrada, en el 'mitad' se detiene en el punto medio del andén y en el 'fondo' se detiene lejos del punto de entrada. Esta opción solamente define el valor predeterminado de las órdenes nuevas. Es posible especificar para cada orden el comportamiento deseado +STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :principio +STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :centro +STR_CONFIG_SETTING_STOP_LOCATION_FAR_END :fondo +STR_CONFIG_SETTING_AUTOSCROLL :Recorrer vista cuando se mueva el cursor a los bordes: {STRING} +STR_CONFIG_SETTING_AUTOSCROLL_HELPTEXT :Si se activa esta opción, las vistas se recorrerán cuando el ratón esté cerca de los bordes de la ventana +STR_CONFIG_SETTING_AUTOSCROLL_DISABLED :Desactivado +STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT_FULLSCREEN :Vista principal, solo en pantalla completa +STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT :Vista principal +STR_CONFIG_SETTING_AUTOSCROLL_EVERY_VIEWPORT :Todas las vistas +STR_CONFIG_SETTING_BRIBE :Permitir sobornos al ayuntamiento: {STRING} +STR_CONFIG_SETTING_BRIBE_HELPTEXT :Las empresas pueden tratar de sobornar a los ayuntamientos. Si el soborno es descubierto por un inspector, la empresa no podrá realizar actividades en la localidad durante seis meses +STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Permitir adquirir los derechos de transporte exclusivos: {STRING} +STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Si una empresa adquiere los derechos de transporte exclusivos en un pueblo, las estaciones de la competencia (de pasajeros o carga) no recibirán nada que entregar durante un año +STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Permitir la construcción de nuevos edificios: {STRING} +STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :Las empresas aportan dinero a los ayuntamientos para que construyan nuevas casas y edificios +STR_CONFIG_SETTING_ALLOW_FUND_ROAD :Permitir el pago de la reconstrucción de las carreteras locales: {STRING} +STR_CONFIG_SETTING_ALLOW_FUND_ROAD_HELPTEXT :Las empresas aportan dinero a los ayuntamientos para que reconstruyan sus carreteras y así sabotear a otros servicios de transporte por carretera que operen en la zona +STR_CONFIG_SETTING_ALLOW_GIVE_MONEY :Permitir enviar dinero a otras empresas: {STRING} +STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :Permitir la transferencia de dinero entre empresas en modo multijugador +STR_CONFIG_SETTING_FREIGHT_TRAINS :Multiplicador de peso para simular trenes pesados: {STRING} +STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :Establece el impacto de llevar cargamento en los trenes. Un valor mayor exige mayor potencia a los trenes para llevar una carga, sobretodo al subir colinas +STR_CONFIG_SETTING_PLANE_SPEED :Factor de velocidad de aeronaves: {STRING} +STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT :Establece la velocidad relativa de las aeronaves comparada con la de otros vehículos para reducir las utilidades de transportación aérea +STR_CONFIG_SETTING_PLANE_SPEED_VALUE :1/{COMMA} +STR_CONFIG_SETTING_PLANE_CRASHES :Cantidad de accidentes aéreos: {STRING} +STR_CONFIG_SETTING_PLANE_CRASHES_HELPTEXT :Probabilidad de que ocurran accidentes aéreos +STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Ninguno +STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :Reducida +STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :Normal +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Permitir la construcción de paradas intermedias sobre carreteras en pueblos: {STRING} +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Construir paradas de autobuses intermedias en carreteras que sean propiedad de los pueblos +STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD :Permitir la construcción de paradas intermedias sobre carreteras de la competencia: {STRING} +STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT :Construir paradas de autobuses intermedias en carreteras que sean propiedad de otras empresas +STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}No se puede cambiar esta opción si ya existen vehículos +STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE :Mantenimiento de infraestructura: {STRING} +STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Cuando se activa, la infraestructura tiene costo de mantenimiento, el cual aumenta en relación con el tamaño de la red de transporte. Esto afecta en mayor medida a las empresas grandes que a las pequeñas + +STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Aeropuertos siempre disponibles: {STRING} +STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Los tipos de aeropuertos estarán disponibles todo el tiempo tras haber sido introducidos + +STR_CONFIG_SETTING_WARN_LOST_VEHICLE :Avisar si un vehículo se ha perdido: {STRING} +STR_CONFIG_SETTING_WARN_LOST_VEHICLE_HELPTEXT :Mostrar mensajes indicando aquellos vehículos que no puedan encontrar una ruta a su destino +STR_CONFIG_SETTING_ORDER_REVIEW :Analizar órdenes de vehículos: {STRING} +STR_CONFIG_SETTING_ORDER_REVIEW_HELPTEXT :Cuando se activa, las órdenes de los vehículos se analizan regularmente y los problemas que se encuentren se informan en una noticia +STR_CONFIG_SETTING_ORDER_REVIEW_OFF :No +STR_CONFIG_SETTING_ORDER_REVIEW_EXDEPOT :Sí, excepto los vehículos detenidos +STR_CONFIG_SETTING_ORDER_REVIEW_ON :Todos los vehículos +STR_CONFIG_SETTING_WARN_INCOME_LESS :Avisar si las utilidades de un vehículo son negativas: {STRING} +STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Mostrar un mensaje cuando un vehículo no haya obtenido ninguna ganancia durante un año +STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Vehículos siempre disponibles: {STRING} +STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Todos los modelos de vehículos estarán disponibles para siempre tras haber sido introducidos +STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Renovar automáticamente vehículos que se hagan viejos: {STRING} +STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Los vehículos próximos al final de su vida útil serán renovados automáticamente, siempre y cuando se cumplan las condiciones de renovación +STR_CONFIG_SETTING_AUTORENEW_MONTHS :Renovar automáticamente el vehículo a {STRING} de su edad máxima +STR_CONFIG_SETTING_AUTORENEW_MONTHS_HELPTEXT :Edad relativa en la que un vehículo es considerado para renovarse +STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_BEFORE :{COMMA} mes{P 0 "" es} antes +STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_AFTER :{COMMA} mes{P 0 "" es} después +STR_CONFIG_SETTING_AUTORENEW_MONEY :Costo mínimo requerido para renovación automática: {STRING} +STR_CONFIG_SETTING_AUTORENEW_MONEY_HELPTEXT :Mínima cantidad de dinero disponible en el banco para poder considerar la renovación automática de vehículos +STR_CONFIG_SETTING_ERRMSG_DURATION :Duración de mensajes de error: {STRING} +STR_CONFIG_SETTING_ERRMSG_DURATION_HELPTEXT :Duración de los mensajes de error mostrados en los avisos en rojo. Algunos mensajes de error (críticos) no se cierran automáticamente, solo de forma manual +STR_CONFIG_SETTING_ERRMSG_DURATION_VALUE :{COMMA} segundo{P 0 "" s} +STR_CONFIG_SETTING_HOVER_DELAY :Mostrar información de herramientas: {STRING} +STR_CONFIG_SETTING_HOVER_DELAY_HELPTEXT :Al posar el ratón sobre un elemento de la interfaz, el tiempo de retraso requerido para mostrar información de ayuda o sugerencias. También se puede establecer el valor en 0 para mostrar estos mensajes con el botón derecho del ratón. +STR_CONFIG_SETTING_HOVER_DELAY_VALUE :Posar el ratón durante {COMMA} milisegundo{P 0 "" s} +STR_CONFIG_SETTING_HOVER_DELAY_DISABLED :Botón derecho +STR_CONFIG_SETTING_POPULATION_IN_LABEL :Mostrar población de pueblos: {STRING} +STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Mostrar en el mapa la población de los pueblos junto a sus nombres +STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Grosor de las líneas en las gráficas: {STRING} +STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Grosor de las líneas en las gráficas. Una línea fina es más precisa, una línea más gruesa es más fácil de distinguir + +STR_CONFIG_SETTING_LANDSCAPE :Terreno: {STRING} +STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Los terrenos definen mapas con diferentes tipos de carga y requisitos de crecimiento para los pueblos. Es posible modificarlos empleando NewGRF y scripts de juego +STR_CONFIG_SETTING_LAND_GENERATOR :Generador de terreno: {STRING} +STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT :El generador 'Original' depende de los gráficos base y crea formas de terreno fijas. 'TerraGenesis' es un generador basado en Ruido Perlin que permite un mayor control de configuración +STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Original +STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis +STR_CONFIG_SETTING_TERRAIN_TYPE :Tipo de terreno: {STRING} +STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(Solo TerraGenesis) Colinas del terreno +STR_CONFIG_SETTING_INDUSTRY_DENSITY :Densidad industrial: {STRING} +STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Número de industrias a generar y nivel a mantener durante el juego +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 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 +STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Suave +STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Rugoso +STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Muy rugoso +STR_CONFIG_SETTING_VARIETY :Distribución de variedad: {STRING} +STR_CONFIG_SETTING_VARIETY_HELPTEXT :(Sólo TerraGenesis) Controlar si el mapa tendrá zonas montañosas y planas. Puesto que esta opción solo hace más plano el mapa, hay que elegir terreno montañoso en otras opciones +STR_CONFIG_SETTING_RIVER_AMOUNT :Cantidad de ríos: {STRING} +STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Número de ríos que habrá en el mapa +STR_CONFIG_SETTING_TREE_PLACER :Algoritmo de colocación de árboles: {STRING} +STR_CONFIG_SETTING_TREE_PLACER_HELPTEXT :La distribución de los árboles sobre el mapa. 'Original' distribuye la plantación de árboles uniformemente, mientras que 'Mejorado' los planta en grupos +STR_CONFIG_SETTING_TREE_PLACER_NONE :Ninguno +STR_CONFIG_SETTING_TREE_PLACER_ORIGINAL :Original +STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Mejorado +STR_CONFIG_SETTING_ROAD_SIDE :Vehículos de carretera: {STRING} +STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Elegir de qué lado irá la circulación +STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rotar mapa de alturas: {STRING} +STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :A la izquierda +STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :A la derecha +STR_CONFIG_SETTING_SE_FLAT_WORLD_HEIGHT :El nivel de la elevación del mapa plano tiene: {STRING} +STR_CONFIG_SETTING_EDGES_NOT_EMPTY :{WHITE}Una o más casillas del borde norte no están vacías +STR_CONFIG_SETTING_EDGES_NOT_WATER :{WHITE}Una o más casillas en uno de los bordes no es agua + +STR_CONFIG_SETTING_STATION_SPREAD :Máxima ampliación de estaciones: {STRING} +STR_CONFIG_SETTING_STATION_SPREAD_HELPTEXT :Máxima área que pueden ocupar las partes de una estación. Los valores muy altos pueden hacer que el juego sea lento +STR_CONFIG_SETTING_SERVICEATHELIPAD :Realizar automáticamente el mantenimiento de helicópteros en los helipuertos: {STRING} +STR_CONFIG_SETTING_SERVICEATHELIPAD_HELPTEXT :Dar mantenimiento a los helicópteros después de cada aterrizaje, aun sin haber hangar en el aeropuerto +STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR :Unir la barra de transformación de terreno con la barra de construcción: {STRING} +STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR_HELPTEXT :Al abrir alguna de las barras de herramientas de construcción abrir también la barra de transformación de terreno +STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR :Color de terreno usado en el minimapa: {STRING} +STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Color para el terreno mostrado en el minimapa +STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Verde +STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Verde oscuro +STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violeta +STR_CONFIG_SETTING_SCROLLMODE :Desplazamiento de vista: {STRING} +STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Modo de recorrer la vista sobre el mapa +STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Desplazar la vista con clic derecho, ratón en posición fija +STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Recorrer mapa con clic derecho, ratón en posición fija +STR_CONFIG_SETTING_SCROLLMODE_RMB :Recorrer mapa con clic derecho +STR_CONFIG_SETTING_SCROLLMODE_LMB :Recorrer mapa con clic izquierdo +STR_CONFIG_SETTING_SMOOTH_SCROLLING :Desplazamiento de vista suavizado: {STRING} +STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Forma en la que la vista principal se mueve a una ubicación específica al hacer clic en el minimapa o tras una orden de moverse a un objeto determinado del mapa. Si se activa, la vista se mueve de forma suave. Si se desactiva, la vista se mueve instantáneamente al sitio indicado +STR_CONFIG_SETTING_MEASURE_TOOLTIP :Mostrar información de medidas al usar las herramientas de construcción: {STRING} +STR_CONFIG_SETTING_MEASURE_TOOLTIP_HELPTEXT :Mostrar distancias en número de casillas y las diferencias de altura cuando se realicen labores de construcción +STR_CONFIG_SETTING_LIVERIES :Mostrar cromáticas por tipo de vehículo: {STRING} +STR_CONFIG_SETTING_LIVERIES_HELPTEXT :Controlar el uso de cromáticas por vehículo y no por empresa +STR_CONFIG_SETTING_LIVERIES_NONE :Ninguno +STR_CONFIG_SETTING_LIVERIES_OWN :Mi empresa +STR_CONFIG_SETTING_LIVERIES_ALL :Todas las empresas +STR_CONFIG_SETTING_PREFER_TEAMCHAT :Activar chat de equipo con : {STRING} +STR_CONFIG_SETTING_PREFER_TEAMCHAT_HELPTEXT :Cambiar el acceso al chat interno de la empresa y al chat público entre y +STR_CONFIG_SETTING_SCROLLWHEEL_SCROLLING :Función de la rueda del ratón: {STRING} +STR_CONFIG_SETTING_SCROLLWHEEL_SCROLLING_HELPTEXT :Activar el desplazamiento del mapa con ratones de rueda bidimensional +STR_CONFIG_SETTING_SCROLLWHEEL_ZOOM :Enfocar mapa +STR_CONFIG_SETTING_SCROLLWHEEL_SCROLL :Desplazarse sobre el mapa +STR_CONFIG_SETTING_SCROLLWHEEL_OFF :Nada +STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER :Velocidad de la rueda del ratón sobre el mapa: {STRING} +STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER_HELPTEXT :Controlar la sensibilidad de la rueda del ratón +STR_CONFIG_SETTING_OSK_ACTIVATION :Teclado en pantalla: {STRING} +STR_CONFIG_SETTING_OSK_ACTIVATION_HELPTEXT :Elegir el método para abrir el teclado en pantalla y escribir texto empleando solamente el puntero. Esta opción está pensada para dispositivos pequeños sin teclado físico +STR_CONFIG_SETTING_OSK_ACTIVATION_DISABLED :Deshabilitado +STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Doble clic +STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Un solo clic (al enfocar) +STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Un solo clic (instantáneo) + +STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Emulación del botón derecho: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Método para emular los clic con el botón derecho del ratón +STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+Clic +STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Clic +STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Ninguno + +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Cerrar ventana con clic derecho: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Cerrar la ventana haciendo clic derecho sobre ella. ¡Desactiva los mensajes de ayuda con clic derecho! + +STR_CONFIG_SETTING_AUTOSAVE :Guardado automático: {STRING} +STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Intervalo entre guardados automáticos de la partida + +STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Usar formato de fecha {STRING} para los nombres de partidas guardadas +STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Asignar un formato de fecha como nombre al guardar una partida +STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_LONG :largo (31 Dic 2008) +STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_SHORT :corto (31-12-2008) +STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_ISO :ISO (2008-12-31) + +STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME :Poner el juego en pausa al comenzar una partida: {STRING} +STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME_HELPTEXT :Si se activa, el juego se detendrá automáticamente al comenzar nuevas partidas para permitir revisar el mapa +STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL :Al pausar el juego, permitir: {STRING} +STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_HELPTEXT :Qué acciones se pueden realizar mientras el juego está en pausa. +STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_NO_ACTIONS :Ninguna acción +STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_CONSTRUCTION :Todas las acciones, excepto construir +STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_LANDSCAPING :Todas las acciones, excepto modificar terreno +STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_ACTIONS :Todas las acciones +STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS :Usar grupos en la lista de vehículos: {STRING} +STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Activar el uso de listas avanzadas para agrupar vehículos +STR_CONFIG_SETTING_LOADING_INDICATORS :Usar indicadores de carga: {STRING} +STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Mostrar indicadores sobre los vehículos mientras cargan o descargan +STR_CONFIG_SETTING_TIMETABLE_IN_TICKS :Mostrar tiempo de viaje en ticks en lugar de días: {STRING} +STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Mostrar los tiempos de viaje en los itinerarios en impulsos de reloj de sistema (ticks) en lugar de días +STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Mostrar salidas y llegadas en itinerarios: {STRING} +STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Mostrar tiempos anticipados de llegadas y salidas en los itinerarios +STR_CONFIG_SETTING_QUICKGOTO :Creación rápida de órdenes para vehículos: {STRING} +STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT :Elegir automáticamente la opción 'Ir a' al abrir la ventana de órdenes +STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE :Tipo predeterminado de vías férreas al iniciar o cargar un juego: {STRING} +STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Tipo predeterminado de vías de tren al iniciar o cargar un juego. 'Primero disponible' elige el tipo más viejo, 'Último disponible' elige el tipo más nuevo y 'Más usado' elige el tipo de mayor uso al momento +STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :Primero disponible +STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_LAST :Último disponible +STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_MOST_USED :Más usado +STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION :Mostrar rutas reservadas sobre las vías férreas: {STRING} +STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT :Dar un color especial a las vías de tren reservadas para ayudar a resolver problemas con trenes que no ingresan en secciones con señales de ruta +STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Mantener activas las herramientas de construcción tras su uso: {STRING} +STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT :Mantener abiertas las herramientas de construcción de puentes, túneles, etc., después de usarlas +STR_CONFIG_SETTING_EXPENSES_LAYOUT :Agrupar gastos en la ventana de finanzas: {STRING} +STR_CONFIG_SETTING_EXPENSES_LAYOUT_HELPTEXT :Definir el diseño de la ventana de finanzas + +STR_CONFIG_SETTING_SOUND_TICKER :Boletín de noticias: {STRING} +STR_CONFIG_SETTING_SOUND_TICKER_HELPTEXT :Reproducir sonido para mensajes resumidos de noticias +STR_CONFIG_SETTING_SOUND_NEWS :Noticias: {STRING} +STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT :Reproducir sonido al mostrar noticias +STR_CONFIG_SETTING_SOUND_NEW_YEAR :Fin de año: {STRING} +STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :Reproducir sonido al mostrar el resumen anual del desempeño de la empresa al terminar el año +STR_CONFIG_SETTING_SOUND_CONFIRM :Construcción: {STRING} +STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT :Reproducir sonido al construir con éxito o realizar otras acciones +STR_CONFIG_SETTING_SOUND_CLICK :Clic de botones: {STRING} +STR_CONFIG_SETTING_SOUND_CLICK_HELPTEXT :Emitir pitido al pulsar botones +STR_CONFIG_SETTING_SOUND_DISASTER :Desastres y accidentes: {STRING} +STR_CONFIG_SETTING_SOUND_DISASTER_HELPTEXT :Reproducir efectos de sonido en desastres y accidentes +STR_CONFIG_SETTING_SOUND_VEHICLE :Vehículos: {STRING} +STR_CONFIG_SETTING_SOUND_VEHICLE_HELPTEXT :Reproducir efectos de sonido de vehículos +STR_CONFIG_SETTING_SOUND_AMBIENT :Ambiente: {STRING} +STR_CONFIG_SETTING_SOUND_AMBIENT_HELPTEXT :Reproducir sonidos ambientales de terreno, industrias y pueblos + +STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING :Deshabilitar construcción de infraestructura cuando no haya vehículos apropiados disponibles: {STRING} +STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING_HELPTEXT :Cuando se activa, solamente se puede construir infraestructura si hay vehículos apropiados disponibles, previniendo un gasto innecesario de tiempo y dinero +STR_CONFIG_SETTING_MAX_TRAINS :Número máximo de trenes por empresa: {STRING} +STR_CONFIG_SETTING_MAX_TRAINS_HELPTEXT :Número máximo de trenes que una empresa puede tener +STR_CONFIG_SETTING_MAX_ROAD_VEHICLES :Número máximo de vehículos de carretera por empresa: {STRING} +STR_CONFIG_SETTING_MAX_ROAD_VEHICLES_HELPTEXT :Número máximo de vehículos de carretera que una empresa puede tener +STR_CONFIG_SETTING_MAX_AIRCRAFT :Número máximo de aeronaves por empresa: {STRING} +STR_CONFIG_SETTING_MAX_AIRCRAFT_HELPTEXT :Número máximo de aeronaves que una empresa puede tener +STR_CONFIG_SETTING_MAX_SHIPS :Número máximo de barcos por empresa: {STRING} +STR_CONFIG_SETTING_MAX_SHIPS_HELPTEXT :Número máximo de barcos que una empresa puede tener + +STR_CONFIG_SETTING_AI_BUILDS_TRAINS :Desactivar trenes para la computadora: {STRING} +STR_CONFIG_SETTING_AI_BUILDS_TRAINS_HELPTEXT :Activar esta opción para deshabilitar la construcción de trenes por jugadores no humanos +STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES :Desactivar vehículos de carretera para la computadora: {STRING} +STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES_HELPTEXT :Activar esta opción para deshabilitar la construcción de vehículos de carretera por jugadores no humanos +STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT :Desactivar aeroplanos para la computadora: {STRING} +STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT_HELPTEXT :Activar esta opción deshabilita la construcción de aeronaves por jugadores no humanos +STR_CONFIG_SETTING_AI_BUILDS_SHIPS :Desactivar barcos para la computadora: {STRING} +STR_CONFIG_SETTING_AI_BUILDS_SHIPS_HELPTEXT :Activar esta opción deshabilita la construcción de barcos por jugadores no humanos + +STR_CONFIG_SETTING_AI_PROFILE :Perfil predeterminado: {STRING} +STR_CONFIG_SETTING_AI_PROFILE_HELPTEXT :Perfil para los jugadores no humanos aleatorios, o para los valores iniciales al añadir un nuevo jugador no humano o un script de juego +STR_CONFIG_SETTING_AI_PROFILE_EASY :Fácil +STR_CONFIG_SETTING_AI_PROFILE_MEDIUM :Intermedio +STR_CONFIG_SETTING_AI_PROFILE_HARD :Difícil + +STR_CONFIG_SETTING_AI_IN_MULTIPLAYER :Permitir jugadores no humanos en modo multijugador: {STRING} +STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :Permitir a los jugadores controlados por la computadora participar en partidas de varios jugadores +STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :#opcodes disponibles antes de que los scripts sean suspendidos: {STRING} +STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :Número máximo de operaciones que un script puede realizar por turno + +STR_CONFIG_SETTING_SERVINT_ISPERCENT :Intervalo de mantenimiento en porcentajes: {STRING} +STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Escoger si el mantenimiento de vehículos comenzará debido al tiempo pasado desde el último mantenimiento o por una reducción de la fiabilidad menor de un porcentaje determinado +STR_CONFIG_SETTING_SERVINT_TRAINS :Intervalo de mantenimiento predeterminado para trenes: {STRING} +STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Intervalo de mantenimiento predeterminado para nuevos trenes, en caso de no definirse otro explícitamente +STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}día{P 0 "" s}/% +STR_CONFIG_SETTING_SERVINT_DISABLED :Deshabilitado +STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES :Intervalo de mantenimiento predeterminado para vehículos de carretera: {STRING} +STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES_HELPTEXT :Intervalo de mantenimiento predeterminado para nuevos vehículos de carretera, en caso de no definirse otro explícitamente +STR_CONFIG_SETTING_SERVINT_AIRCRAFT :Intervalo de mantenimiento predeterminado para aeronaves: {STRING} +STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :Intervalo de mantenimiento predeterminado para nuevas aeronaves, en caso de no definirse otro explícitamente +STR_CONFIG_SETTING_SERVINT_SHIPS :Intervalo de mantenimiento predeterminado para barcos: {STRING} +STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :Intervalo de mantenimiento predeterminado para nuevos barcos, en caso de no definirse otro explícitamente +STR_CONFIG_SETTING_NOSERVICE :Desactivar mantenimiento si las averías están desactivadas: {STRING} +STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Al activarse, los vehículos no recibirán mantenimiento si no pueden averiarse +STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Activar límites de velocidad para vagones: {STRING} +STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Al activarse, se tienen en cuenta los límites de velocidad de los vagones para decidir la máxima velocidad de un tren +STR_CONFIG_SETTING_DISABLE_ELRAILS :Desactivar ferrocarriles eléctricos: {STRING} +STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT :Si se activa, no es necesario electrificar las vías férreas para hacer que los trenes eléctricos puedan recorrerlas + +STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN :Llegada del primer vehículo a una estación del jugador: {STRING} +STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN_HELPTEXT :Mostrar noticia cuando el primer vehículo llegue a una estación del jugador +STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER :Llegada del primer vehículo a una estación de la competencia: {STRING} +STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER_HELPTEXT :Mostrar noticia cuando el primer vehículo llegue a la estación de un competidor +STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :Accidentes y desastres: {STRING} +STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS_HELPTEXT :Mostrar noticia cuando ocurra un accidente o un desastre +STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Información de la empresa: {STRING} +STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Mostrar noticia cuando una nueva empresa sea creada o cuando alguna empresa esté en peligro de quiebra +STR_CONFIG_SETTING_NEWS_INDUSTRY_OPEN :Apertura de industrias: {STRING} +STR_CONFIG_SETTING_NEWS_INDUSTRY_OPEN_HELPTEXT :Mostrar noticia cuando abra una nueva industria +STR_CONFIG_SETTING_NEWS_INDUSTRY_CLOSE :Cierre de industrias: {STRING} +STR_CONFIG_SETTING_NEWS_INDUSTRY_CLOSE_HELPTEXT :Mostrar noticia cuando cierre una industria +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 noticia cuando cambie el nivel de producción de una industria que esté atendida por la empresa del jugador +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 noticia cuando cambie el nivel de producción de una industria que esté atendida por las empresas de la competencia +STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED :Cambios de producción de otras industrias: {STRING} +STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED_HELPTEXT :Mostrar noticia cuando cambie el nivel de producción de una industria que no esté atendida por nadie +STR_CONFIG_SETTING_NEWS_ADVICE :Sugerencias e información de los vehículos de la empresa: {STRING} +STR_CONFIG_SETTING_NEWS_ADVICE_HELPTEXT :Mostrar mensajes sobre vehículos que requieran atención +STR_CONFIG_SETTING_NEWS_NEW_VEHICLES :Nuevos vehículos: {STRING} +STR_CONFIG_SETTING_NEWS_NEW_VEHICLES_HELPTEXT :Mostrar noticias sobre nuevos tipos de vehículos disponibles +STR_CONFIG_SETTING_NEWS_CHANGES_ACCEPTANCE :Cambios en la recepción de cargamento: {STRING} +STR_CONFIG_SETTING_NEWS_CHANGES_ACCEPTANCE_HELPTEXT :Mostrar mensajes sobre cambios a la recepción de cargamento en estaciones +STR_CONFIG_SETTING_NEWS_SUBSIDIES :Subsidios: {STRING} +STR_CONFIG_SETTING_NEWS_SUBSIDIES_HELPTEXT :Mostrar noticias sobre eventos relacionados con subsidios +STR_CONFIG_SETTING_NEWS_GENERAL_INFORMATION :Información general: {STRING} +STR_CONFIG_SETTING_NEWS_GENERAL_INFORMATION_HELPTEXT :Mostrar noticias sobre eventos generales, tales como la compra de derechos exclusivos de transporte o el pago de la reconstrucción de carreteras locales + +STR_CONFIG_SETTING_NEWS_MESSAGES_OFF :Desactivado +STR_CONFIG_SETTING_NEWS_MESSAGES_SUMMARY :Resumen +STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Completo + +STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Noticias a color aparecen en el año: {STRING} +STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Año en el que los periódicos comenzarán a imprimirse a color. Antes de ese año, apacerán en blanco y negro +STR_CONFIG_SETTING_STARTING_YEAR :Fecha de inicio: {STRING} +STR_CONFIG_SETTING_SMOOTH_ECONOMY :Activar economía fácil (cambios más pequeños): {STRING} +STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Al activarse, habrá cambios de producción en las industrias más frecuentemente y en escala menor. Si se usa un NewGRF con industrias adicionales esta opción generalmente no tiene efecto +STR_CONFIG_SETTING_ALLOW_SHARES :Permitir comprar acciones de otras empresas: {STRING} +STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Al activarse, se pueden comprar y vender acciones de otras empresas. Las acciones de una empresa solamente estarán disponibles cuando la empresa cumpla una edad determinada +STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Porcentaje de la utilidad total a pagar por transferencias de carga: {STRING} +STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Porcentaje de utilidad cedida a los transportes intermedios en sistemas de transferencia de carga, dando un mayor control sobre la utilidad de cada vehículo +STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Al arrastrar, colocar señales cada: {STRING} +STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Distancia de separación entre señales hasta topar con algún obstáculo (otra señal, un desvío, etc.) al instalarlas mediante arrastre con el ratón +STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} casilla{P 0 "" s} +STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Al arrastrar, mantener distancia fija entre señales: {STRING} +STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Forma en que se instalan las señales cuando se usa Ctrl+Arrastrar. Si se desactiva, se instalan señales a la entrada de túneles y puentes para evitar tramos largas de vías férreas sin señales. Si se activa, se colocan señales cada cierto número de casillas, haciendo que el alineamiento de señales en vías paralelas sea más sencillo +STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Señales mecánicas por defecto antes de: {STRING} +STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Año a partir del cual se usarán señales eléctricas. Antes de ese año se usarán señales mecánicas, las cuales funcionan igual pero tienen distinto aspecto +STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI :Activar interfaz de señales: {STRING} +STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI_HELPTEXT :Mostrar una ventana para elegir los tipos de señales a instalar. Si no se activa, se instalan las señales y se selecciona un tipo determinado mediante Ctrl+Clic, sin que aparezca ninguna interfaz +STR_CONFIG_SETTING_DEFAULT_SIGNAL_TYPE :Tipo de señal predeterminada a instalar: {STRING} +STR_CONFIG_SETTING_DEFAULT_SIGNAL_TYPE_HELPTEXT :Tipo de señal predeterminada a utilizar +STR_CONFIG_SETTING_DEFAULT_SIGNAL_NORMAL :Señales de bloqueo +STR_CONFIG_SETTING_DEFAULT_SIGNAL_PBS :Señales de ruta +STR_CONFIG_SETTING_DEFAULT_SIGNAL_PBSOWAY :Señales de ruta de un sentido +STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Cambiar entre tipos de señales: {STRING} +STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Elegir entre qué señales se debe cambiar al usar Ctrl+Clic con la herramienta de señales +STR_CONFIG_SETTING_CYCLE_SIGNAL_NORMAL :Solo señales de bloqueo +STR_CONFIG_SETTING_CYCLE_SIGNAL_PBS :Solo señales de ruta +STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Todas + +STR_CONFIG_SETTING_TOWN_LAYOUT :Diseño urbano para los nuevos pueblos: {STRING} +STR_CONFIG_SETTING_TOWN_LAYOUT_HELPTEXT :Diseño de carreteras y calles para las redes de transporte en los pueblos +STR_CONFIG_SETTING_TOWN_LAYOUT_DEFAULT :Original +STR_CONFIG_SETTING_TOWN_LAYOUT_BETTER_ROADS :Mejorado +STR_CONFIG_SETTING_TOWN_LAYOUT_2X2_GRID :Rejilla de 2×2 +STR_CONFIG_SETTING_TOWN_LAYOUT_3X3_GRID :Rejilla de 3×3 +STR_CONFIG_SETTING_TOWN_LAYOUT_RANDOM :Aleatorio +STR_CONFIG_SETTING_ALLOW_TOWN_ROADS :Permitir que los pueblos construyan carreteras: {STRING} +STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Los pueblos podrán construir carreteras para expandirse. Si se deshabilita, los ayuntamientos no podrán construir ninguna carretera +STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Permitir a los pueblos construir pasos a nivel: {STRING} +STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Los pueblos podrán construir pasos a nivel +STR_CONFIG_SETTING_NOISE_LEVEL :Permitir a los pueblos controlar el nivel de ruido de los aeropuertos: {STRING} +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Al desactivarse, puede haber solo dos aeropuertos por pueblo. Al activarse, el número de aeropuertos en el pueblo depende del nivel de aceptación de ruido en la misma, el cual depende de la población, del tamaño de los aeropuertos y de la distancia entre ellos +STR_CONFIG_SETTING_TOWN_FOUNDING :Fundar pueblos: {STRING} +STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Los jugadores podrán crear nuevos pueblos durante la partida +STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN :Prohibido +STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :Permitido +STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED_CUSTOM_LAYOUT :Permitido, diseño urbano personalizado + +STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Crecimiento de árboles durante la partida: {STRING} +STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Controlar la aparición aleatoria de árboles durante la partida. Esto puede afectar industrias que dependen del crecimiento de árboles, como los aserraderos +STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NONE :Ninguno {RED}(inutiliza aserraderos) +STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_RAINFOREST :Solo en selva +STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_ALL :Cualquier parte + +STR_CONFIG_SETTING_TOOLBAR_POS :Posición de la barra de herramientas principal: {STRING} +STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Posición horizontal de la barra de herramientas principal en la parte superior de la pantalla +STR_CONFIG_SETTING_STATUSBAR_POS :Posición de la barra de estado: {STRING} +STR_CONFIG_SETTING_STATUSBAR_POS_HELPTEXT :Posición horizontal de la barra de estado en la parte inferior de la pantalla +STR_CONFIG_SETTING_SNAP_RADIUS :Radio de ajuste de ventana: {STRING} +STR_CONFIG_SETTING_SNAP_RADIUS_HELPTEXT :Distancia máxima entre ventanas antes de que la ventana que se está moviendo sea ajustada automáticamente con las ventanas cercanas +STR_CONFIG_SETTING_SNAP_RADIUS_VALUE :{COMMA} pixel{P 0 "" es} +STR_CONFIG_SETTING_SNAP_RADIUS_DISABLED :Deshabilitado +STR_CONFIG_SETTING_SOFT_LIMIT :Máximo número de ventanas sin anclar: {STRING} +STR_CONFIG_SETTING_SOFT_LIMIT_HELPTEXT :Número máximo de ventanas sin anclar que pueden estar abiertas antes de que las anteriores se cierren automáticamente para dejar paso a las nuevas +STR_CONFIG_SETTING_SOFT_LIMIT_VALUE :{COMMA} +STR_CONFIG_SETTING_SOFT_LIMIT_DISABLED :Deshabilitado +STR_CONFIG_SETTING_ZOOM_MIN :Máximo acercamiento: {STRING} +STR_CONFIG_SETTING_ZOOM_MIN_HELPTEXT :Máximo nivel de acercamiento para las ventanas de vista y la vista principal. Aumentar el nivel de acercamiento aumenta el consumo de memoria del juego +STR_CONFIG_SETTING_ZOOM_MAX :Máximo alejamiento: {STRING} +STR_CONFIG_SETTING_ZOOM_MAX_HELPTEXT :Máximo nivel de alejamiento para las ventanas de vista y la vista principal. Los niveles altos podrían provocar que el juego sea más lento +STR_CONFIG_SETTING_ZOOM_LVL_MIN :4x +STR_CONFIG_SETTING_ZOOM_LVL_IN_2X :2x +STR_CONFIG_SETTING_ZOOM_LVL_NORMAL :Normal +STR_CONFIG_SETTING_ZOOM_LVL_OUT_2X :2x +STR_CONFIG_SETTING_ZOOM_LVL_OUT_4X :4x +STR_CONFIG_SETTING_ZOOM_LVL_OUT_8X :8x +STR_CONFIG_SETTING_TOWN_GROWTH :Velocidad de crecimiento de pueblos: {STRING} +STR_CONFIG_SETTING_TOWN_GROWTH_HELPTEXT :A qué velocidad se expanden los pueblos +STR_CONFIG_SETTING_TOWN_GROWTH_NONE :Ninguna +STR_CONFIG_SETTING_TOWN_GROWTH_SLOW :Lenta +STR_CONFIG_SETTING_TOWN_GROWTH_NORMAL :Normal +STR_CONFIG_SETTING_TOWN_GROWTH_FAST :Rápida +STR_CONFIG_SETTING_TOWN_GROWTH_VERY_FAST :Muy rápida +STR_CONFIG_SETTING_LARGER_TOWNS :Proporción de pueblos que se convertirán en ciudades: {STRING} +STR_CONFIG_SETTING_LARGER_TOWNS_HELPTEXT :Número de pueblos que se convertirán en ciudades. Las ciudades comienzan siendo más grandes y crecen más rápido +STR_CONFIG_SETTING_LARGER_TOWNS_VALUE :1 de cada {COMMA} +STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Ninguno +STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Multiplicador inicial de tamaño de ciudad: {STRING} +STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Tamaño medio de las ciudades en relación a los pueblos al comienzo de la partida + +STR_CONFIG_SETTING_LINKGRAPH_INTERVAL :Actualizar la gráfica de distribución cada {STRING}{NBSP}día{P 0:2 "" s} +STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT :Periodo de tiempo entre cálculos consecutivos de la gráfica de distribución. Esta opción se refiere a los cálculos para cada uno de los componentes de la gráfica, por lo cual establecer un valor no quiere decir que la gráfica completa se actualizará tras ese número de días, solo algún componente lo hará. Cuanto menor sea, mayor tiempo de CPU será necesario para calcular la gráfica distribución. Cuanto mayor sea, más tardará la gráfica en adaptarse a nuevas rutas +STR_CONFIG_SETTING_LINKGRAPH_TIME :Usar {STRING}{NBSP}día{P 0:2 "" s} para el cálculo de la gráfica de distribución +STR_CONFIG_SETTING_LINKGRAPH_TIME_HELPTEXT :Tiempo requerido en el cálculo de cada uno de los componentes de la gráfica de distribución. Cuanto menor sea este valor, más probable es que el juego sea más lento. Cuanto mayor sea, más tiempo tardará la distribución en actualizarse cuando se produzcan cambios en las rutas +STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :Manual +STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :Asimétrica +STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :Simétrica +STR_CONFIG_SETTING_DISTRIBUTION_PAX :Modo de distribución para pasajeros: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :En una distribución 'Simétrica', se envía la misma cantidad de pasajeros entre dos estaciones. En una distribución 'Asimétrica', se pueden enviar cantidades arbitrarias de pasajeros en ambas direcciones. 'Manual' significa que no hay distribución automática para los pasajeros +STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Modo de distribución para el correo: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :En una distribución 'Simétrica', se envía la misma cantidad de correo entre dos estaciones. En una distribución 'Asimétrica', se pueden enviar cantidades arbitrarias de correo en ambas direcciones. 'Manual' significa que no hay distribución automática para el correo +STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Modo de distribución para cargamento de valores: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :El cargamento de valores contiene objetos de valor en el clima Templado, diamantes en el clima Subtropical y oro en el clima Subártico (hay NewGRF para modificar esto). En una distribución 'Simétrica', se envía la misma cantidad de cargamento entre dos estaciones. En una distribución 'Asimétrica', se pueden enviar cantidades arbitrarias de cargamento en ambas direcciones. 'Manual' significa que no hay distribución automática para este cargamento. Se recomienda establecer la distribución en 'Asimétrica' o en 'Manual' al jugar en clima Subártico, pues los bancos no regresarán el oro a sus minas de procedencia. En los climas Templado y Subtropical se puede escoger 'Simétrica', ya que los bancos pueden regresar los objetos de valor a su banco origen. +STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Modo de distribución para otro cargamento: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :'Asimétrica' significa que se pueden mover cantidades arbitrarias de cargamento en ambas direcciones. 'Manual' significa que no habrá distribución automática para esta clase de cargamento. +STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Precisión de la distribución: {STRING} +STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Si el valor es alto, se requerirá mayor tiempo para calcular la gráfica de distribución (si se lleva demasiado tiempo, se notará desfase en el juego). Si es muy bajo, la distribución será imprecisa, pudiendo hacer que el cargamento no vaya al lugar indicado +STR_CONFIG_SETTING_DEMAND_DISTANCE :Efecto de la distancia en la demanda: {STRING} +STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Con un valor diferente a 0, la distancia entre la estación de origen de cierta carga y una posible estación de destino afectará la cantidad de cargamento que se envíe entre ambas. Cuanto más lejos estén entre sí, menos cargamento se enviará. Cuanto mayor sea el valor de esta opción, menos cargamento se enviará a estaciones distantes en favor de estaciones cercanas +STR_CONFIG_SETTING_DEMAND_SIZE :Cantidad de cargamento a devolver en modo simétrico: {STRING} +STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Establecer un valor menor de 100% hará que la distribución simétrica de cargamento sea más asimétrica. Se enviará menos cargamento de regreso forzosamente si una cantidad determinada es enviada a una estación. Si se fija a 0%, la distribución simétrica será como una distribución asimétrica +STR_CONFIG_SETTING_SHORT_PATH_SATURATION :Nivel de saturación de rutas cortas antes de cambiar a rutas de mayor capacidad: {STRING} +STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :Entre dos estaciones usualmente hay más de una ruta posible. Se intentarán saturar las rutas más cotas primero, luego las que le siguen, y así sucesivamente. La saturación está determinada por una estimación de capacidad y uso planificado. Una vez que se hayan saturado todas las rutas, si todavía hay demanda se sobrecargarán los caminos empezando por aquellos de mayor capacidad. El algoritmo no siempre estimará la capacidad de forma precisa. Esta opción permite especificar el porcentaje de saturación que debe tener una ruta en el primer análisis antes de pasar a la siguiente ruta. Ponerlo a menos de 100% permite evitar estaciones sobrecargadas en el caso de que se sobreestimen las capacidades + +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :Unidades de velocidad: {STRING} +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Cada vez que se muestre una velocidad en la interfaz de usuario, se emplearán las unidades elegidas +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Imperial (mph) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Métrico (km/h) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s) + +STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Unidades de potencia de vehículos: {STRING} +STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Cada vez que se muestre la potencia de un vehículo en la interfaz de usuario, se emplearán las unidades elegidas +STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_IMPERIAL :Imperial (cv) +STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_METRIC :Métrico (cv) +STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_SI :SI (kW) + +STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT :Unidades de peso: {STRING} +STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_HELPTEXT :Cada vez que se muestre un peso en la interfaz de usuario, se emplearán las unidades elegidas +STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_IMPERIAL :Imperial (t o tonelada) +STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_METRIC :Métrico (t o tonelada) +STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_SI :SI (kg) + +STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME :Unidades de volumen: {STRING} +STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_HELPTEXT :Cada vez que se muestre un volumen en la interfaz de usuario, se emplearán las unidades elegidas +STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_IMPERIAL :Imperial (gal) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_METRIC :Métrico (l) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_SI :SI (m³) + +STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE :Unidades de fuerza de tracción: {STRING} +STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_HELPTEXT :Cada vez que se muestre una fuerza de tracción (o esfuerzo de tracción) en la interfaz de usuario, se emplearán las unidades elegidas +STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_IMPERIAL :Imperial (lbf) +STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_METRIC :Métrico (kp) +STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) + +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Unidades de altura: {STRING} +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Cada vez que se muestre una altura en la interfaz de usuario, se emplearán las unidades elegidas +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (pies) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Métrico (m) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) + +STR_CONFIG_SETTING_LOCALISATION :{ORANGE}Localización +STR_CONFIG_SETTING_GRAPHICS :{ORANGE}Gráficos +STR_CONFIG_SETTING_SOUND :{ORANGE}Sonido +STR_CONFIG_SETTING_INTERFACE :{ORANGE}Interfaz +STR_CONFIG_SETTING_INTERFACE_GENERAL :{ORANGE}General +STR_CONFIG_SETTING_INTERFACE_VIEWPORTS :{ORANGE}Ventanas de vista +STR_CONFIG_SETTING_INTERFACE_CONSTRUCTION :{ORANGE}Construcción +STR_CONFIG_SETTING_ADVISORS :{ORANGE}Noticias y sugerencias +STR_CONFIG_SETTING_COMPANY :{ORANGE}Empresa +STR_CONFIG_SETTING_ACCOUNTING :{ORANGE}Contabilidad +STR_CONFIG_SETTING_VEHICLES :{ORANGE}Vehículos +STR_CONFIG_SETTING_VEHICLES_PHYSICS :{ORANGE}Leyes físicas +STR_CONFIG_SETTING_VEHICLES_ROUTING :{ORANGE}Enrutamiento +STR_CONFIG_SETTING_LIMITATIONS :{ORANGE}Limitaciones +STR_CONFIG_SETTING_ACCIDENTS :{ORANGE}Desastres y accidentes +STR_CONFIG_SETTING_GENWORLD :{ORANGE}Generación de mapa +STR_CONFIG_SETTING_ENVIRONMENT :{ORANGE}Ambiente +STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :{ORANGE}Autoridades +STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :{ORANGE}Pueblos +STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}Industrias +STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}Distribución de carga +STR_CONFIG_SETTING_AI :{ORANGE}Competidores +STR_CONFIG_SETTING_AI_NPC :{ORANGE}Jugadores no humanos + +STR_CONFIG_SETTING_PATHFINDER_OPF :Original +STR_CONFIG_SETTING_PATHFINDER_NPF :NPF +STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(recomendado) + +STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS :Algoritmo de rutas para trenes: {STRING} +STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS_HELPTEXT :Algoritmo de búsqueda de rutas para trenes +STR_CONFIG_SETTING_PATHFINDER_FOR_ROAD_VEHICLES :Algoritmo de rutas para vehículos de carretera: {STRING} +STR_CONFIG_SETTING_PATHFINDER_FOR_ROAD_VEHICLES_HELPTEXT :Algoritmo de búsqueda de rutas para para vehículos de carretera +STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS :Algoritmo de rutas para barcos: {STRING} +STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS_HELPTEXT :Algoritmo de búsqueda de rutas para barcos +STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Cambio de sentido automático en señales: {STRING} +STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Los trenes se darán la vuelta ante una señal si han estado esperado durante un tiempo largo + +STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Establecer valor + +# Config errors +STR_CONFIG_ERROR :{WHITE}Error en el archivo de configuración... +STR_CONFIG_ERROR_ARRAY :{WHITE}... error en arreglo '{STRING}' +STR_CONFIG_ERROR_INVALID_VALUE :{WHITE}... valor '{STRING}' no válido para '{STRING}' +STR_CONFIG_ERROR_TRAILING_CHARACTERS :{WHITE}... caracteres en blanco al final de la opción '{STRING}' +STR_CONFIG_ERROR_DUPLICATE_GRFID :{WHITE}... NewGRF '{STRING}' ignorado: GRF ID duplicado con '{STRING}' +STR_CONFIG_ERROR_INVALID_GRF :{WHITE}... NewGRF '{STRING}' no válido, ignorado: {STRING} +STR_CONFIG_ERROR_INVALID_GRF_NOT_FOUND :no encontrado +STR_CONFIG_ERROR_INVALID_GRF_UNSAFE :inseguro para uso estático +STR_CONFIG_ERROR_INVALID_GRF_SYSTEM :NewGRF de sistema +STR_CONFIG_ERROR_INVALID_GRF_INCOMPATIBLE :no compatible con esta versión de OpenTTD +STR_CONFIG_ERROR_INVALID_GRF_UNKNOWN :desconocido +STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_LEVEL :{WHITE}... el nivel de compresión '{STRING}' no es válido +STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_ALGORITHM :{WHITE}... el formato de guardado '{STRING}' no está disponible. Revertiendo a '{STRING}' +STR_CONFIG_ERROR_INVALID_BASE_GRAPHICS_NOT_FOUND :{WHITE}... gráficos base '{STRING}' ignorados: no encontrados +STR_CONFIG_ERROR_INVALID_BASE_SOUNDS_NOT_FOUND :{WHITE}... sonidos base '{STRING}' ignorados: no encontrados +STR_CONFIG_ERROR_INVALID_BASE_MUSIC_NOT_FOUND :{WHITE}... música base '{STRING}' ignorada: no encontrada +STR_CONFIG_ERROR_OUT_OF_MEMORY :{WHITE}No hay memoria suficiente +STR_CONFIG_ERROR_SPRITECACHE_TOO_BIG :{WHITE}La asignación de {BYTES} de caché de sprites ha fallado. La caché de sprites ha sido reducida a {BYTES}, lo que reducirá el desempeño de OpenTTD. Para reducir los requisitos de memoria es posible deshabilitar los gráficos de 32bpp o reducir los grados de acercamiento + +# Intro window +STR_INTRO_CAPTION :{WHITE}OpenTTD {REV} + +STR_INTRO_NEW_GAME :{BLACK}Nueva partida +STR_INTRO_LOAD_GAME :{BLACK}Cargar partida +STR_INTRO_PLAY_SCENARIO :{BLACK}Jugar mapa pers. +STR_INTRO_PLAY_HEIGHTMAP :{BLACK}Jugar mapa de alturas +STR_INTRO_SCENARIO_EDITOR :{BLACK}Editor de mapas +STR_INTRO_MULTIPLAYER :{BLACK}Multijugador + +STR_INTRO_GAME_OPTIONS :{BLACK}Opciones de juego +STR_INTRO_HIGHSCORE :{BLACK}Tabla de puntuaciones +STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Configuración +STR_INTRO_NEWGRF_SETTINGS :{BLACK}Config. NewGRF +STR_INTRO_ONLINE_CONTENT :{BLACK}Contenido en línea +STR_INTRO_SCRIPT_SETTINGS :{BLACK}Configuración de scripts +STR_INTRO_QUIT :{BLACK}Salir + +STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Comenzar una nueva partida. Ctrl+Clic omite la configuración del mapa +STR_INTRO_TOOLTIP_LOAD_GAME :{BLACK}Cargar una partida guardada +STR_INTRO_TOOLTIP_PLAY_HEIGHTMAP :{BLACK}Empezar una nueva partida usando un mapa de alturas como terreno +STR_INTRO_TOOLTIP_PLAY_SCENARIO :{BLACK}Comenzar una nueva partida usando un mapa personalizado +STR_INTRO_TOOLTIP_SCENARIO_EDITOR :{BLACK}Crear un mapa personalizado +STR_INTRO_TOOLTIP_MULTIPLAYER :{BLACK}Empezar una partida multijugador + +STR_INTRO_TOOLTIP_TEMPERATE :{BLACK}Elegir mapa de clima 'Templado' +STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Elegir mapa de clima 'Subártico' +STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Elegir mapa de clima 'Subtropical' +STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Elegir mapa de clima 'Mundo de juguetes' + +STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Mostrar las opciones de juego +STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Mostrar tabla de puntuaciones +STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Mostrar configuración +STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Mostrar configuración de NewGRF +STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Revisar si hay nuevos contenidos actualizados para descargar +STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Mostrar configuración de scripts +STR_INTRO_TOOLTIP_QUIT :{BLACK}Salir de 'OpenTTD' + +STR_INTRO_BASESET :{BLACK}A los gráficos base elegidos les hace falta {NUM} spirte{P "" s}. Necesitan actualizarse. +STR_INTRO_TRANSLATION :{BLACK}A esta traducción le falta{P 0 "" n} {NUM} cadena{P "" s}. Considera ayudar a mejorar OpenTTD convirtiéndote en traductor. Consulta el archivo readme.txt para más detalles. + +# Quit window +STR_QUIT_CAPTION :{WHITE}Salir +STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD :{YELLOW}¿Estás seguro de salir de OpenTTD y regresar a {STRING}? +STR_QUIT_YES :{BLACK}Sí +STR_QUIT_NO :{BLACK}No + +# Supported OSes +STR_OSNAME_WINDOWS :Windows +STR_OSNAME_DOS :DOS +STR_OSNAME_UNIX :Unix +STR_OSNAME_OSX :OS{NBSP}X +STR_OSNAME_BEOS :BeOS +STR_OSNAME_HAIKU :Haiku +STR_OSNAME_MORPHOS :MorphOS +STR_OSNAME_AMIGAOS :AmigaOS +STR_OSNAME_OS2 :OS/2 +STR_OSNAME_SUNOS :SunOS + +# Abandon game +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 +STR_CHEATS :{WHITE}Trucos +STR_CHEATS_TOOLTIP :{BLACK}Las casillas marcadas indican que ya se usó este truco +STR_CHEATS_WARNING :{BLACK}¡Atención! Estás a punto de traicionar a tus competidores. Recuerda que siempre se recordará tal deshonra +STR_CHEAT_MONEY :{LTBLUE}Añadir {CURRENCY_LONG} en efectivo +STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Jugar como la empresa: {ORANGE}{COMMA} +STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Excavadora mágica (elimina industrias y objetos inamovibles): {ORANGE}{STRING} +STR_CHEAT_CROSSINGTUNNELS :{LTBLUE}Los túneles se pueden cruzar: {ORANGE}{STRING} +STR_CHEAT_NO_JETCRASH :{LTBLUE}Las aeronaves jet no se estrellan (tanto) en aeropuertos pequeños: {ORANGE}{STRING} +STR_CHEAT_EDIT_MAX_HL :{LTBLUE}Cambiar la elevación máxima del mapa: {ORANGE}{NUM} +STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}Cambiar la elevación máxima de las montañas en el mapa +STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Clima Templado +STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Clima Subártico +STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Clima Subtropical +STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Clima Mundo de juguetes +STR_CHEAT_CHANGE_DATE :{LTBLUE}Cambiar fecha: {ORANGE} {DATE_SHORT} +STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Cambiar año actual +STR_CHEAT_SETUP_PROD :{LTBLUE}Permitir cambiar los valores de producción: {ORANGE}{STRING} + +# Livery window +STR_LIVERY_CAPTION :{WHITE}Nueva cromática + +STR_LIVERY_GENERAL_TOOLTIP :{BLACK}Mostrar cromática general +STR_LIVERY_TRAIN_TOOLTIP :{BLACK}Mostrar cromáticas para trenes +STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Mostrar cromáticas para vehículos de carretera +STR_LIVERY_SHIP_TOOLTIP :{BLACK}Mostrar cromáticas para barcos +STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Mostrar cromáticas para aeronaves +STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Elegir el color principal para la cromática elegida. Ctrl+Clic para establecerlo como cromática general +STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Elegir el color secundario para el diseño seleccionado. Ctrl+Clic para establecerlo como cromática general +STR_LIVERY_PANEL_TOOLTIP :{BLACK}Elegir un solo tipo de cromática, o Ctrl+Clic para elegir varios. Marcar las casillas para establecer diferentes combinaciones según el tipo de vehículo + +STR_LIVERY_DEFAULT :Cromática estándar +STR_LIVERY_STEAM :Locomotora a vapor +STR_LIVERY_DIESEL :Locomotora de diésel +STR_LIVERY_ELECTRIC :Locomotora eléctrica +STR_LIVERY_MONORAIL :Locomotora de monorriel +STR_LIVERY_MAGLEV :Locomotora maglev +STR_LIVERY_DMU :DMU +STR_LIVERY_EMU :EMU +STR_LIVERY_PASSENGER_WAGON_STEAM :Carro de pasajeros (vapor) +STR_LIVERY_PASSENGER_WAGON_DIESEL :Carro de pasajeros (diésel) +STR_LIVERY_PASSENGER_WAGON_ELECTRIC :Carro de pasajeros (eléctrico) +STR_LIVERY_PASSENGER_WAGON_MONORAIL :Carro de pasajeros (monorriel) +STR_LIVERY_PASSENGER_WAGON_MAGLEV :Carro de pasajeros (maglev) +STR_LIVERY_FREIGHT_WAGON :Vagón de carga +STR_LIVERY_BUS :Autobús +STR_LIVERY_TRUCK :Camión de carga +STR_LIVERY_PASSENGER_SHIP :Transbordador de pasajeros +STR_LIVERY_FREIGHT_SHIP :Barco de carga +STR_LIVERY_HELICOPTER :Helicóptero +STR_LIVERY_SMALL_PLANE :Aeronave pequeña +STR_LIVERY_LARGE_PLANE :Aeronave grande +STR_LIVERY_PASSENGER_TRAM :Tranvía de pasajeros +STR_LIVERY_FREIGHT_TRAM :Tranvía de carga + +# Face selection window +STR_FACE_CAPTION :{WHITE}Selección de cara +STR_FACE_CANCEL_TOOLTIP :{BLACK}Cancelar selección de nueva cara +STR_FACE_OK_TOOLTIP :{BLACK}Aceptar selección de nueva cara +STR_FACE_RANDOM :{BLACK}Aleatorio + +STR_FACE_MALE_BUTTON :{BLACK}Hombre +STR_FACE_MALE_TOOLTIP :{BLACK}Elegir cara masculina +STR_FACE_FEMALE_BUTTON :{BLACK}Mujer +STR_FACE_FEMALE_TOOLTIP :{BLACK}Elegir cara femenina +STR_FACE_NEW_FACE_BUTTON :{BLACK}Nueva cara +STR_FACE_NEW_FACE_TOOLTIP :{BLACK}Generar cara al azar +STR_FACE_ADVANCED :{BLACK}Avanzado +STR_FACE_ADVANCED_TOOLTIP :{BLACK}Selección avanzada de caras +STR_FACE_SIMPLE :{BLACK}Simple +STR_FACE_SIMPLE_TOOLTIP :{BLACK}Selección simple de caras +STR_FACE_LOAD :{BLACK}Cargar +STR_FACE_LOAD_TOOLTIP :{BLACK}Cargar cara favorita +STR_FACE_LOAD_DONE :{WHITE}Cara favorita cargada desde el archivo de configuración +STR_FACE_FACECODE :{BLACK}Número de cara +STR_FACE_FACECODE_TOOLTIP :{BLACK}Establecer un número de cara +STR_FACE_FACECODE_CAPTION :{WHITE}Establecer un número de cara +STR_FACE_FACECODE_SET :{WHITE}Nuevo número de cara fue asignado +STR_FACE_FACECODE_ERR :{WHITE}No se puede asignar número de cara, ¡debe ser un valor 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}Cara guardada como favorita en el archivo de configuración +STR_FACE_EUROPEAN :{BLACK}Europea +STR_FACE_SELECT_EUROPEAN :{BLACK}Elegir cara con rasgos europeos +STR_FACE_AFRICAN :{BLACK}Africana +STR_FACE_SELECT_AFRICAN :{BLACK}Elegir cara con rasgos africanos +STR_FACE_YES :Sí +STR_FACE_NO :No +STR_FACE_MOUSTACHE_EARRING_TOOLTIP :{BLACK}Añadir bigotes o aretes +STR_FACE_HAIR :Pelo: +STR_FACE_HAIR_TOOLTIP :{BLACK}Cambiar cabello +STR_FACE_EYEBROWS :Cejas: +STR_FACE_EYEBROWS_TOOLTIP :{BLACK}Cambiar cejas +STR_FACE_EYECOLOUR :Color de ojos: +STR_FACE_EYECOLOUR_TOOLTIP :{BLACK}Cambiar color de ojos +STR_FACE_GLASSES :Gafas: +STR_FACE_GLASSES_TOOLTIP :{BLACK}Añadir gafas +STR_FACE_GLASSES_TOOLTIP_2 :{BLACK}Cambiar gafas +STR_FACE_NOSE :Nariz: +STR_FACE_NOSE_TOOLTIP :{BLACK}Cambiar nariz +STR_FACE_LIPS :Labios: +STR_FACE_MOUSTACHE :Bigote: +STR_FACE_LIPS_MOUSTACHE_TOOLTIP :{BLACK}Cambiar labios o bigote +STR_FACE_CHIN :Barbilla: +STR_FACE_CHIN_TOOLTIP :{BLACK}Cambiar barbilla +STR_FACE_JACKET :Saco: +STR_FACE_JACKET_TOOLTIP :{BLACK}Cambiar saco +STR_FACE_COLLAR :Cuello: +STR_FACE_COLLAR_TOOLTIP :{BLACK}Cambiar cuello +STR_FACE_TIE :Corbata: +STR_FACE_EARRING :Aretes: +STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Cambiar corbata o aretes + +# Network server list +STR_NETWORK_SERVER_LIST_CAPTION :{WHITE}Multijugador +STR_NETWORK_SERVER_LIST_ADVERTISED :{BLACK}Público +STR_NETWORK_SERVER_LIST_ADVERTISED_TOOLTIP :{BLACK}Permitir escoger entre una partida pública (Internet) y una partida privada (LAN) +STR_NETWORK_SERVER_LIST_ADVERTISED_NO :No +STR_NETWORK_SERVER_LIST_ADVERTISED_YES :Sí +STR_NETWORK_SERVER_LIST_PLAYER_NAME :{BLACK}Nombre del jugador: +STR_NETWORK_SERVER_LIST_ENTER_NAME_TOOLTIP :{BLACK}Nombre con el que otros jugadores te identificarán + +STR_NETWORK_SERVER_LIST_GAME_NAME :{BLACK}Nombre +STR_NETWORK_SERVER_LIST_GAME_NAME_TOOLTIP :{BLACK}Nombre de la partida +STR_NETWORK_SERVER_LIST_GENERAL_ONLINE :{BLACK}{COMMA}/{COMMA} - {COMMA}/{COMMA} +STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION :{BLACK}Clientes +STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION_TOOLTIP :{BLACK}Clientes conectados/máx. clientes{}Empresas conectadas/máximo de empresas +STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT :{BLACK}{COMMA}×{COMMA} +STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Tamaño del mapa +STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Tamaño del mapa de la partida{}Clic para ordenar por área +STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Fecha +STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Fecha actual +STR_NETWORK_SERVER_LIST_YEARS_CAPTION :{BLACK}Años +STR_NETWORK_SERVER_LIST_YEARS_CAPTION_TOOLTIP :{BLACK}Número de años{}que han transcurrido en la partida +STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Idioma, versión del servidor, etc. + +STR_NETWORK_SERVER_LIST_CLICK_GAME_TO_SELECT :{BLACK}Clic para elegir una partida de la lista +STR_NETWORK_SERVER_LIST_LAST_JOINED_SERVER :{BLACK}Servidor al que te conectaste la última vez: +STR_NETWORK_SERVER_LIST_CLICK_TO_SELECT_LAST :{BLACK}Clic para elegir el servidor al que te conectaste la última vez + +STR_NETWORK_SERVER_LIST_GAME_INFO :{SILVER}INFORMACIÓN DE PARTIDA +STR_NETWORK_SERVER_LIST_CLIENTS :{SILVER}Clientes: {WHITE}{COMMA}/{COMMA} - {COMMA}/{COMMA} +STR_NETWORK_SERVER_LIST_LANGUAGE :{SILVER}Idioma: {WHITE}{STRING} +STR_NETWORK_SERVER_LIST_LANDSCAPE :{SILVER}Clima: {WHITE}{STRING} +STR_NETWORK_SERVER_LIST_MAP_SIZE :{SILVER}Tamaño del mapa: {WHITE}{COMMA}x{COMMA} +STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}Versión del servidor: {WHITE}{STRING} +STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Dirección del servidor: {WHITE}{STRING} +STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Fecha de inicio: {WHITE}{DATE_SHORT} +STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Fecha actual: {WHITE}{DATE_SHORT} +STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}¡Protegido por contraseña! +STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}SERVIDOR APAGADO +STR_NETWORK_SERVER_LIST_SERVER_FULL :{SILVER}SERVIDOR LLENO +STR_NETWORK_SERVER_LIST_VERSION_MISMATCH :{SILVER}INCOMPATIBILIDAD DE VERSIONES +STR_NETWORK_SERVER_LIST_GRF_MISMATCH :{SILVER}INCOMPATIBILIDAD CON NEWGRF + +STR_NETWORK_SERVER_LIST_JOIN_GAME :{BLACK}Unirse a la partida +STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}Volver a cargar servidor +STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Volver a cargar información del servidor + +STR_NETWORK_SERVER_LIST_FIND_SERVER :{BLACK}Buscar servidor +STR_NETWORK_SERVER_LIST_FIND_SERVER_TOOLTIP :{BLACK}Buscar servidor en la red +STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Añadir servidor +STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Añadir el servidor a una lista que siempre será analizada en busca de partidas activas +STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Iniciar servidor +STR_NETWORK_SERVER_LIST_START_SERVER_TOOLTIP :{BLACK}Iniciar un nuevo servidor + +STR_NETWORK_SERVER_LIST_PLAYER_NAME_OSKTITLE :{BLACK}Introducir nombre del jugador +STR_NETWORK_SERVER_LIST_ENTER_IP :{BLACK}Introducir la dirección IP del servidor + +# Start new multiplayer server +STR_NETWORK_START_SERVER_CAPTION :{WHITE}Empezar nueva partida multijugador + +STR_NETWORK_START_SERVER_NEW_GAME_NAME :{BLACK}Nombre de la partida: +STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}La partida será mostrada a otros jugadores en el menú de selección de partidas +STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Establecer contraseña +STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Proteger la partida con una contraseña para prevenir el acceso a otras personas + +STR_NETWORK_START_SERVER_UNADVERTISED :No +STR_NETWORK_START_SERVER_ADVERTISED :Sí +STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} cliente{P "" s} +STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Número máximo de clientes: +STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Elegir el número máximo de clientes. No es necesario que se conecten todos +STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} empresa{P "" s} +STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Número máximo de empresas: +STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Limitar el servidor a un cierto número de empresas +STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} espectador{P "" es} +STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Número máximo de espectadores: +STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Limitar el servidor a un cierto número de espectadores +STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Idioma: +STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Otros jugadores sabrán qué idioma se utiliza en este servidor + +STR_NETWORK_START_SERVER_NEW_GAME_NAME_OSKTITLE :{BLACK}Introducir un nombre para la partida en red + +# Network game languages +############ Leave those lines in this order!! +STR_NETWORK_LANG_ANY :Cualquiera +STR_NETWORK_LANG_ENGLISH :Inglés +STR_NETWORK_LANG_GERMAN :Alemán +STR_NETWORK_LANG_FRENCH :Francés +STR_NETWORK_LANG_BRAZILIAN :Portugués (Brasil) +STR_NETWORK_LANG_BULGARIAN :Búlgaro +STR_NETWORK_LANG_CHINESE :Chino +STR_NETWORK_LANG_CZECH :Checo +STR_NETWORK_LANG_DANISH :Danés +STR_NETWORK_LANG_DUTCH :Alemán +STR_NETWORK_LANG_ESPERANTO :Esperanto +STR_NETWORK_LANG_FINNISH :Finés +STR_NETWORK_LANG_HUNGARIAN :Húngaro +STR_NETWORK_LANG_ICELANDIC :Islandés +STR_NETWORK_LANG_ITALIAN :Italiano +STR_NETWORK_LANG_JAPANESE :Japonés +STR_NETWORK_LANG_KOREAN :Coreano +STR_NETWORK_LANG_LITHUANIAN :Lituano +STR_NETWORK_LANG_NORWEGIAN :Noruego +STR_NETWORK_LANG_POLISH :Polaco +STR_NETWORK_LANG_PORTUGUESE :Portugués +STR_NETWORK_LANG_ROMANIAN :Rumano +STR_NETWORK_LANG_RUSSIAN :Ruso +STR_NETWORK_LANG_SLOVAK :Eslovaco +STR_NETWORK_LANG_SLOVENIAN :Esloveno +STR_NETWORK_LANG_SPANISH :Español +STR_NETWORK_LANG_SWEDISH :Sueco +STR_NETWORK_LANG_TURKISH :Turco +STR_NETWORK_LANG_UKRAINIAN :Ucraniano +STR_NETWORK_LANG_AFRIKAANS :Afrikáans +STR_NETWORK_LANG_CROATIAN :Croata +STR_NETWORK_LANG_CATALAN :Catalán +STR_NETWORK_LANG_ESTONIAN :Estonio +STR_NETWORK_LANG_GALICIAN :Gallego +STR_NETWORK_LANG_GREEK :Griego +STR_NETWORK_LANG_LATVIAN :Letón +############ End of leave-in-this-order + +# Network game lobby +STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Sala virtual de partidas multijugador + +STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Preparándose para unirse: {ORANGE}{STRING} +STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Lista de empresas presentes en el juego. Puedes unirte a una empresa existente o crear una nueva si hay espacio libre + +STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}INFORMACIÓN DE LA EMPRESA +STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Nombre empresa: {WHITE}{STRING} +STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Inauguración: {WHITE}{NUM} +STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Valor de la empresa: {WHITE}{CURRENCY_LONG} +STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Saldo actual: {WHITE}{CURRENCY_LONG} +STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Ingresos año pasado: {WHITE}{CURRENCY_LONG} +STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Desempeño: {WHITE}{NUM} + +STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Vehículos: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} +STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Estaciones: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE} +STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Jugadores: {WHITE}{STRING} + +STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nueva empresa +STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Crear nueva empresa +STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Observar partida +STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Observar una partida como espectador +STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Unirse a empresa +STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Ayudar a dirigir esta empresa + +# Network connecting window +STR_NETWORK_CONNECTING_CAPTION :{WHITE}Conectando... + +############ Leave those lines in this order!! +STR_NETWORK_CONNECTING_1 :{BLACK}(1/6) Conectando... +STR_NETWORK_CONNECTING_2 :{BLACK}(2/6) Autorizando... +STR_NETWORK_CONNECTING_3 :{BLACK}(3/6) Esperando... +STR_NETWORK_CONNECTING_4 :{BLACK}(4/6) Descargando mapa... +STR_NETWORK_CONNECTING_5 :{BLACK}(5/6) Procesando datos... +STR_NETWORK_CONNECTING_6 :{BLACK}(6/6) Registrando... + +STR_NETWORK_CONNECTING_SPECIAL_1 :{BLACK}Recibiendo información de partida... +STR_NETWORK_CONNECTING_SPECIAL_2 :{BLACK}Recibiendo información de la empresa... +############ End of leave-in-this-order +STR_NETWORK_CONNECTING_WAITING :{BLACK}{NUM} cliente{P "" s} en espera +STR_NETWORK_CONNECTING_DOWNLOADING_1 :{BLACK}{BYTES} descargados hasta ahora +STR_NETWORK_CONNECTING_DOWNLOADING_2 :{BLACK}{BYTES}/{BYTES} descargados + +STR_NETWORK_CONNECTION_DISCONNECT :{BLACK}Desconectarse + +STR_NETWORK_NEED_GAME_PASSWORD_CAPTION :{WHITE}Servidor protegido. Introducir contraseña +STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}Empresa protegida. Introducir contraseña + +# Network company list added strings +STR_NETWORK_COMPANY_LIST_CLIENT_LIST :{WHITE}Lista de clientes +STR_NETWORK_COMPANY_LIST_SPECTATE :{WHITE}Observar +STR_NETWORK_COMPANY_LIST_NEW_COMPANY :{WHITE}Nueva empresa + +# Network client list +STR_NETWORK_CLIENTLIST_KICK :Expulsar +STR_NETWORK_CLIENTLIST_BAN :Prohibir acceso +STR_NETWORK_CLIENTLIST_GIVE_MONEY :Dar dinero +STR_NETWORK_CLIENTLIST_SPEAK_TO_ALL :Hablar a todos +STR_NETWORK_CLIENTLIST_SPEAK_TO_COMPANY :Hablar a una empresa +STR_NETWORK_CLIENTLIST_SPEAK_TO_CLIENT :Mensaje privado + +STR_NETWORK_SERVER :Servidor +STR_NETWORK_CLIENT :Cliente +STR_NETWORK_SPECTATORS :Espectadores + +STR_NETWORK_GIVE_MONEY_CAPTION :{WHITE}Introducir la cantidad de dinero a dar +STR_NETWORK_TOOLBAR_LIST_SPECTATOR :{BLACK}Espectador + +# Network set password +STR_COMPANY_PASSWORD_CANCEL :{BLACK}No guardar la contraseña introducida +STR_COMPANY_PASSWORD_OK :{BLACK}Asignar a la empresa la nueva contraseña +STR_COMPANY_PASSWORD_CAPTION :{WHITE}Contraseña de la empresa +STR_COMPANY_PASSWORD_MAKE_DEFAULT :{BLACK}Contraseña predeterminada de la empresa +STR_COMPANY_PASSWORD_MAKE_DEFAULT_TOOLTIP :{BLACK}Usar la contraseña de esta empresa para cualquier otra nueva empresa + +# Network company info join/password +STR_COMPANY_VIEW_JOIN :{BLACK}Unirse +STR_COMPANY_VIEW_JOIN_TOOLTIP :{BLACK}Unirse y jugar como esta empresa +STR_COMPANY_VIEW_PASSWORD :{BLACK}Contraseña +STR_COMPANY_VIEW_PASSWORD_TOOLTIP :{BLACK}Proteger con contraseña tu empresa para prevenir que usuarios no autorizados se unan a ella +STR_COMPANY_VIEW_SET_PASSWORD :{BLACK}Establecer contraseña de la empresa + +# Network chat +STR_NETWORK_CHAT_SEND :{BLACK}Enviar +STR_NETWORK_CHAT_COMPANY_CAPTION :[Equipo] : +STR_NETWORK_CHAT_CLIENT_CAPTION :[Privado] {STRING}: +STR_NETWORK_CHAT_ALL_CAPTION :[Todos] : + +STR_NETWORK_CHAT_COMPANY :[Equipo] {STRING}: {WHITE}{STRING} +STR_NETWORK_CHAT_TO_COMPANY :[Equipo] a {STRING}: {WHITE}{STRING} +STR_NETWORK_CHAT_CLIENT :[Privado] {STRING}: {WHITE}{STRING} +STR_NETWORK_CHAT_TO_CLIENT :[Privado] a {STRING}: {WHITE}{STRING} +STR_NETWORK_CHAT_ALL :[Todos] {STRING}: {WHITE}{STRING} +STR_NETWORK_CHAT_OSKTITLE :{BLACK}Introducir mensaje para el chat en red + +# Network messages +STR_NETWORK_ERROR_NOTAVAILABLE :{WHITE}No se encontraron ni compilaron dispositivos sin soporte de red +STR_NETWORK_ERROR_NOSERVER :{WHITE}No se pudo encontrar ninguna partida en red +STR_NETWORK_ERROR_NOCONNECTION :{WHITE}El servidor no responde a la petición +STR_NETWORK_ERROR_NEWGRF_MISMATCH :{WHITE}No se pudo conectar debido a incompatibilidad de NewGRF +STR_NETWORK_ERROR_DESYNC :{WHITE}La sincronización de la partida en red falló +STR_NETWORK_ERROR_LOSTCONNECTION :{WHITE}La conexión con la partida en red se perdió +STR_NETWORK_ERROR_SAVEGAMEERROR :{WHITE}No se pudo cargar la partida +STR_NETWORK_ERROR_SERVER_START :{WHITE}No se pudo iniciar el servidor +STR_NETWORK_ERROR_CLIENT_START :{WHITE}No se pudo conectar +STR_NETWORK_ERROR_TIMEOUT :{WHITE}Tiempo de espera agotado en conexión #{NUM} +STR_NETWORK_ERROR_SERVER_ERROR :{WHITE}Se produjo un error de protocolo y la conexión fue cerrada +STR_NETWORK_ERROR_WRONG_REVISION :{WHITE}La versión de este cliente no corresponde con la versión del servidor +STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Contraseña incorrecta +STR_NETWORK_ERROR_SERVER_FULL :{WHITE}El servidor está completo +STR_NETWORK_ERROR_SERVER_BANNED :{WHITE}Se te ha prohibido el acceso al servidor +STR_NETWORK_ERROR_KICKED :{WHITE}Has sido expulsado del servidor +STR_NETWORK_ERROR_CHEATER :{WHITE}No se permiten trucos en este servidor +STR_NETWORK_ERROR_TOO_MANY_COMMANDS :{WHITE}Estabas enviando demasiados comandos al servidor +STR_NETWORK_ERROR_TIMEOUT_PASSWORD :{WHITE}Tardaste demasiado en introducir la contraseña +STR_NETWORK_ERROR_TIMEOUT_COMPUTER :{WHITE}Tu computadora es demasiado lenta para seguir la velocidad del servidor +STR_NETWORK_ERROR_TIMEOUT_MAP :{WHITE}Tu computadora tardó demasiado en descargar el mapa +STR_NETWORK_ERROR_TIMEOUT_JOIN :{WHITE}Tu computadora tardó demasiado en conectarse al servidor + +############ Leave those lines in this order!! +STR_NETWORK_ERROR_CLIENT_GENERAL :error general +STR_NETWORK_ERROR_CLIENT_DESYNC :error de desincronización +STR_NETWORK_ERROR_CLIENT_SAVEGAME :no se puede cargar el mapa +STR_NETWORK_ERROR_CLIENT_CONNECTION_LOST :conexión perdida +STR_NETWORK_ERROR_CLIENT_PROTOCOL_ERROR :error de protocolo +STR_NETWORK_ERROR_CLIENT_NEWGRF_MISMATCH :NewGRF incompatible +STR_NETWORK_ERROR_CLIENT_NOT_AUTHORIZED :no autorizado +STR_NETWORK_ERROR_CLIENT_NOT_EXPECTED :recibido paquete inválido o inesperado +STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :revisión incorrecta +STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :nombre en uso +STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :contraseña incorrecta +STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :empresa incorrecta en un DoCommand +STR_NETWORK_ERROR_CLIENT_KICKED :expulsado por el servidor +STR_NETWORK_ERROR_CLIENT_CHEATER :trataste de usar un truco +STR_NETWORK_ERROR_CLIENT_SERVER_FULL :servidor lleno +STR_NETWORK_ERROR_CLIENT_TOO_MANY_COMMANDS :estabas enviando demasiados comandos +STR_NETWORK_ERROR_CLIENT_TIMEOUT_PASSWORD :no se recibió la contraseña a tiempo +STR_NETWORK_ERROR_CLIENT_TIMEOUT_COMPUTER :tiempo agotado en general +STR_NETWORK_ERROR_CLIENT_TIMEOUT_MAP :la descarga del mapa tardó demasiado +STR_NETWORK_ERROR_CLIENT_TIMEOUT_JOIN :el procesado del mapa tardó demasiado +############ End of leave-in-this-order + +STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION_CAPTION :{WHITE}Posible pérdida de conexión +STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION :{WHITE}No se han recibido datos del servidor desde hace {NUM} segundo{P "" s} + +# Network related errors +STR_NETWORK_SERVER_MESSAGE :*** {1:STRING} +############ Leave those lines in this order!! +STR_NETWORK_SERVER_MESSAGE_GAME_PAUSED :Partida en pausa ({STRING}) +STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_1 :Partida aún en pausa ({STRING}) +STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_2 :Partida aún en pausa ({STRING}, {STRING}) +STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_3 :Partida aún en pausa ({STRING}, {STRING}, {STRING}) +STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_4 :Partida aún en pausa ({STRING}, {STRING}, {STRING}, {STRING}) +STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED :Partida reanudada ({STRING}) +STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :número de jugadores +STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :clientes conectándose +STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :manual +STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :script de juego +############ End of leave-in-this-order +STR_NETWORK_MESSAGE_CLIENT_LEAVING :saliendo +STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} se unió a la partida +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} se unió a la partida (Cliente #{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} se unió a la empresa #{2:NUM} +STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} se unió como espectador +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} creó una nueva empresa (#{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} salió de la partida ({2:STRING}) +STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} cambió su nombre a {STRING} +STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} le dio a tu empresa {2:CURRENCY_LONG} +STR_NETWORK_MESSAGE_GAVE_MONEY_AWAY :*** {2:CURRENCY_LONG} cedidos a la empresa {1:STRING} +STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}El servidor ha cerrado la sesión +STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Se está reiniciando el servidor...{}Espera por favor... + +# Content downloading window +STR_CONTENT_TITLE :{WHITE}Descarga de contenido +STR_CONTENT_TYPE_CAPTION :{BLACK}Tipo +STR_CONTENT_TYPE_CAPTION_TOOLTIP :{BLACK}Tipo de contenido +STR_CONTENT_NAME_CAPTION :{BLACK}Nombre +STR_CONTENT_NAME_CAPTION_TOOLTIP :{BLACK}Nombre del contenido +STR_CONTENT_MATRIX_TOOLTIP :{BLACK}Clic en un elemento para ver sus detalles{}Clic en la casilla para seleccionarlo como descarga +STR_CONTENT_SELECT_ALL_CAPTION :{BLACK}Elegir todas +STR_CONTENT_SELECT_ALL_CAPTION_TOOLTIP :{BLACK}Marcar para descargar todo el contenido +STR_CONTENT_SELECT_UPDATES_CAPTION :{BLACK}Elegir actualizaciones +STR_CONTENT_SELECT_UPDATES_CAPTION_TOOLTIP :{BLACK}Marcar para descargar solo actualizaciones de contenido existente +STR_CONTENT_UNSELECT_ALL_CAPTION :{BLACK}Desmarcar todo +STR_CONTENT_UNSELECT_ALL_CAPTION_TOOLTIP :{BLACK}Desmarcar todo el contenido para no ser descargado +STR_CONTENT_SEARCH_EXTERNAL :{BLACK}Buscar en sitios web externos +STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Buscar contenido no disponible en el servicio de contenido del juego en sitios web externos no asociados con OpenTTD +STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}¡Estás saliendo de OpenTTD! +STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}Los términos y condiciones para descargar contenido de sitios web externos varían.{}Será necesario referirse a tales sitios para saber cómo instalar el contenido en OpenTTD.{}¿Continuar? +STR_CONTENT_FILTER_TITLE :{BLACK}Etiqueta o palabras claves +STR_CONTENT_OPEN_URL :{BLACK}Visitar sitio web +STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Visitar el sitio web de este contenido +STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Descargar +STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Comenzar a descargar el contenido elegido +STR_CONTENT_TOTAL_DOWNLOAD_SIZE :{SILVER}Tamaño total de descarga: {WHITE}{BYTES} +STR_CONTENT_DETAIL_TITLE :{SILVER}INFORMACIÓN DEL CONTENIDO +STR_CONTENT_DETAIL_SUBTITLE_UNSELECTED :{SILVER}Contenido no elegido para descargar +STR_CONTENT_DETAIL_SUBTITLE_SELECTED :{SILVER}Contenido elegido para descargar +STR_CONTENT_DETAIL_SUBTITLE_AUTOSELECTED :{SILVER}Dependencia elegida para descargar +STR_CONTENT_DETAIL_SUBTITLE_ALREADY_HERE :{SILVER}Este contenido ya fue descargado +STR_CONTENT_DETAIL_SUBTITLE_DOES_NOT_EXIST :{SILVER}Este contenido es desconocido y no puede ser descargado en OpenTTD +STR_CONTENT_DETAIL_UPDATE :{SILVER}Este es un sustituto de un{G "" a} {STRING} existente +STR_CONTENT_DETAIL_NAME :{SILVER}Nombre: {WHITE}{STRING} +STR_CONTENT_DETAIL_VERSION :{SILVER}Versión: {WHITE}{STRING} +STR_CONTENT_DETAIL_DESCRIPTION :{SILVER}Descripción: {WHITE}{STRING} +STR_CONTENT_DETAIL_URL :{SILVER}URL: {WHITE}{STRING} +STR_CONTENT_DETAIL_TYPE :{SILVER}Tipo: {WHITE}{STRING} +STR_CONTENT_DETAIL_FILESIZE :{SILVER}Tamaño de descarga: {WHITE}{BYTES} +STR_CONTENT_DETAIL_SELECTED_BECAUSE_OF :{SILVER}Razón de selección: {WHITE}{STRING} +STR_CONTENT_DETAIL_DEPENDENCIES :{SILVER}Dependencias: {WHITE}{STRING} +STR_CONTENT_DETAIL_TAGS :{SILVER}Etiquetas: {WHITE}{STRING} +STR_CONTENT_NO_ZLIB :{WHITE}OpenTTD ha sido compilado sin soporte "zlib"... +STR_CONTENT_NO_ZLIB_SUB :{WHITE}... ¡No es posible descargar contenido! + +# Order of these is important! +STR_CONTENT_TYPE_BASE_GRAPHICS :{G=m}Gráficos base +STR_CONTENT_TYPE_NEWGRF :{G=m}NewGRF +STR_CONTENT_TYPE_AI :{G=f}IA +STR_CONTENT_TYPE_AI_LIBRARY :{G=f}Biblioteca de IA +STR_CONTENT_TYPE_SCENARIO :{G=m}Mapa pers. +STR_CONTENT_TYPE_HEIGHTMAP :{G=m}Mapa de alturas +STR_CONTENT_TYPE_BASE_SOUNDS :{G=m}Sonidos base +STR_CONTENT_TYPE_BASE_MUSIC :{G=m}Música base +STR_CONTENT_TYPE_GAME_SCRIPT :Script de juego +STR_CONTENT_TYPE_GS_LIBRARY :Biblioteca SJ + +# Content downloading progress window +STR_CONTENT_DOWNLOAD_TITLE :{WHITE}Descargando contenido... +STR_CONTENT_DOWNLOAD_INITIALISE :{WHITE}Solicitando archivos... +STR_CONTENT_DOWNLOAD_FILE :{WHITE}Descargando {STRING} ({NUM} de {NUM}) +STR_CONTENT_DOWNLOAD_COMPLETE :{WHITE}Descarga finalizada +STR_CONTENT_DOWNLOAD_PROGRESS_SIZE :{WHITE}{BYTES} de {BYTES} descargados ({NUM} %) + +# Content downloading error messages +STR_CONTENT_ERROR_COULD_NOT_CONNECT :{WHITE}No es posible conectarse al servidor de contenidos... +STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD :{WHITE}Descarga errónea... +STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_CONNECTION_LOST :{WHITE}... conexión perdida +STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_FILE_NOT_WRITABLE :{WHITE}... no se puede escribir en el archivo +STR_CONTENT_ERROR_COULD_NOT_EXTRACT :{WHITE}No ha sido posible descomprimir el archivo descargado + +STR_MISSING_GRAPHICS_SET_CAPTION :{WHITE}Gráficos no encontrados +STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD requiere gráficos para funcionar pero no se pudo encontrar ninguno. ¿Permitir que OpenTTD descargue e instale dichos gráficos? +STR_MISSING_GRAPHICS_YES_DOWNLOAD :{BLACK}Sí, descargar los gráficos +STR_MISSING_GRAPHICS_NO_QUIT :{BLACK}No, salir de OpenTTD + +# Transparency settings window +STR_TRANSPARENCY_CAPTION :{WHITE}Opciones de transparencia +STR_TRANSPARENT_SIGNS_TOOLTIP :{BLACK}Activar o desactivar transparencia para carteles. Ctrl+Clic para excluir de tecla rápida 'X' +STR_TRANSPARENT_TREES_TOOLTIP :{BLACK}Activar o desactivar transparencia para árboles. Ctrl+Clic para excluir de tecla rápida 'X' +STR_TRANSPARENT_HOUSES_TOOLTIP :{BLACK}Activar o desactivar transparencia para casas. Ctrl+Clic para excluir de tecla rápida 'X' +STR_TRANSPARENT_INDUSTRIES_TOOLTIP :{BLACK}Activar o desactivar transparencia para industrias. Ctrl+Clic para excluir de tecla rápida 'X' +STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Activar o desactivar transparencia para edificios como estaciones, depósitos o puntos guías. Ctrl+Clic para excluir de tecla rápida 'X' +STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Activar o desactivar transparencia para puentes. Ctrl+Clic para excluir de tecla rápida 'X' +STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Activar o desactivar transparencia para estructuras como faros o antenas. Ctrl+Clic para excluir de tecla rápida 'X' +STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Activar o desactivar transparencia para catenaria. Ctrl+Clic para excluir de tecla rápida 'X' +STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Activar o desactivar transparencia para indicadores de carga. Ctrl+Clic para excluir de tecla rápida 'X' +STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Ocultar objetos totalmente (deben ser transparentes primero) + +# Linkgraph legend window +STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Leyenda de flujo de cargamento +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 +STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLACK}saturado +STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}sobrecargado + +# Base for station construction window(s) +STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Mostrar área de recolección +STR_STATION_BUILD_COVERAGE_OFF :{BLACK}Desactivado +STR_STATION_BUILD_COVERAGE_ON :{BLACK}Activado +STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}No mostrar área de recolección en el sitio planeado +STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}Mostrar área de recolección en el sitio planeado +STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}Acepta: {GOLD}{CARGO_LIST} +STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}Provee: {GOLD}{CARGO_LIST} + +# Join station window +STR_JOIN_STATION_CAPTION :{WHITE}Ampliar estación +STR_JOIN_STATION_CREATE_SPLITTED_STATION :{YELLOW}Construir aparte + +STR_JOIN_WAYPOINT_CAPTION :{WHITE}Unir puntos guías +STR_JOIN_WAYPOINT_CREATE_SPLITTED_WAYPOINT :{YELLOW}Construir aparte + +# Rail construction toolbar +STR_RAIL_TOOLBAR_RAILROAD_CONSTRUCTION_CAPTION :Construcción de ferrocarril +STR_RAIL_TOOLBAR_ELRAIL_CONSTRUCTION_CAPTION :Construcción ferrocarril eléctrico +STR_RAIL_TOOLBAR_MONORAIL_CONSTRUCTION_CAPTION :Construcción de monorriel +STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Construcción de maglev + +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construir tramo de vías férreas en una orientación. Ctrl quita o coloca vías. Mayús muestra una estimación del precio +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Construir tramo de vías férreas con orientación automática. Ctrl quita o coloca vías. Mayús muestra una estimación del precio +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Construir depósito de trenes (para comprar y dar mantenimiento a trenes). Mayús muestra una estimación del precio +STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Construir punto guía sobre vías férreas. Ctrl activa la unión de puntos guías. Mayús muestra una estimación del precio +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Construir estación de ferrocarril. Ctrl activa la ampliación de estaciones. Mayús muestra una estimación del precio +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Instalar señales de ferrocarril. Ctrl cambia entre señales mecánicas y eléctricas{}Al arrastrar sobre las vías se instalan señales a lo largo de un tramo recto elegido. Ctrl instala señales hasta el siguiente desvío u otra señal{}Ctrl+Clic cambia a la herramienta de selección de señales. Mayús muestra una estimación del precio +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Construir puente de ferrocarril. Mayús muestra una estimación del precio +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Construir túnel de ferrocarril. Mayús muestra una estimación del precio +STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Quitar vías férreas, señales, estaciones y puntos guías. Al mantener pulsado Ctrl se quitan también las vías al retirar estaciones o puntos guías +STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Convertir o actualizar tipos de vías férreas. Mayús muestra una estimación del precio + +STR_RAIL_NAME_RAILROAD :Ferrocarril +STR_RAIL_NAME_ELRAIL :Ferrocarril eléctrico +STR_RAIL_NAME_MONORAIL :Monorriel +STR_RAIL_NAME_MAGLEV :Maglev + +# Rail depot construction window +STR_BUILD_DEPOT_TRAIN_ORIENTATION_CAPTION :{WHITE}Orientación del depósito +STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP :{BLACK}Elegir la orientación del depósito de trenes + +# Rail waypoint construction window +STR_WAYPOINT_CAPTION :{WHITE}Punto guía +STR_WAYPOINT_GRAPHICS_TOOLTIP :{BLACK}Elegir el tipo de punto guía + +# Rail station construction window +STR_STATION_BUILD_RAIL_CAPTION :{WHITE}Selección de estación +STR_STATION_BUILD_ORIENTATION :{BLACK}Orientación +STR_STATION_BUILD_RAILROAD_ORIENTATION_TOOLTIP :{BLACK}Elegir la orientación de la estación de ferrocarril +STR_STATION_BUILD_NUMBER_OF_TRACKS :{BLACK}Número de andenes +STR_STATION_BUILD_NUMBER_OF_TRACKS_TOOLTIP :{BLACK}Elegir el número de andenes de la estación de ferrocarril +STR_STATION_BUILD_PLATFORM_LENGTH :{BLACK}Longitud del andén +STR_STATION_BUILD_PLATFORM_LENGTH_TOOLTIP :{BLACK}Elegir la longitud de la estación de ferrocarril +STR_STATION_BUILD_DRAG_DROP :{BLACK}Arrastrar y soltar +STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Construir una estación mediante arrastrar y soltar el ratón + +STR_STATION_BUILD_STATION_CLASS_TOOLTIP :{BLACK}Mostrar el tipo de estación elegida +STR_STATION_BUILD_STATION_TYPE_TOOLTIP :{BLACK}Construir el tipo de estación elegida + +STR_STATION_CLASS_DFLT :Estación predeterminada +STR_STATION_CLASS_WAYP :Puntos guías + +# Signal window +STR_BUILD_SIGNAL_CAPTION :{WHITE}Selección de señales +STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Señal de bloqueo (mecánica){}Es el tipo de señal más básico que permite a un único tren ocupar al mismo tiempo un tramo de vía entre dos señales +STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Señal de entrada (mecánica){}Abierta si existe una o más señales de salida en el siguiente tramo, de lo contrario se mostrará cerrada +STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Señal de salida (mecánica){}Igual que una señal de bloqueo pero es necesaria para activar la posición correcta de las señales de entrada y combo +STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TOOLTIP :{BLACK}Señal de combo (mecánica){}La señal hace lo mismo que una señal de entrada y salida a la vez, lo que permite construir grandes "árboles" de señales condicionales +STR_BUILD_SIGNAL_SEMAPHORE_PBS_TOOLTIP :{BLACK}Señal de ruta (mecánica){}Una señal de ruta permite a más de un tren entrar al mismo tiempo en un tramo de vía con señales, en tanto que el tren pueda reservar una ruta hasta un lugar seguro. Puede ser pasada por detrás +STR_BUILD_SIGNAL_SEMAPHORE_PBS_OWAY_TOOLTIP :{BLACK}Señal de ruta de un sentido (mecánica){}Igual que una señal de ruta pero no puede ser pasada por detrás +STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP :{BLACK}Señal de bloqueo (eléctrica){}Es el tipo de señal más básico que permite a un único tren ocupar al mismo tiempo un tramo de vía entre dos señales +STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP :{BLACK}Señal de entrada (eléctrica){}Verde si existe una o más señales de salida en el siguiente tramo, de lo contrario se mostrará en rojo +STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Señal de salida (eléctrica){}Igual que una señal de bloqueo pero es necesaria para activar el color correcto de las señales de entrada y combo +STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Señal combo (eléctrica){}La señal hace lo mismo que una señal de entrada y salida a la vez, lo que permite construir grandes "árboles" de señales condicionales +STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Señal de ruta (eléctrica){}Una señal de ruta permite a más de un tren entrar al mismo tiempo en un tramo de vía con señales, en tanto que el tren pueda reservar una ruta hasta un lugar seguro. Puede ser pasada por detrás +STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Señal de ruta de un sentido (eléctrica){}Igual que una señal de ruta pero no puede ser pasada por detrás +STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Conversión de señal{}Activar para pulsar sobre una señal existente y convertirla en el tipo y variante elegidos. Ctrl+Clic permite cambiar entre variantes de señales. Mayús+Clic muestra una estimación del precio de conversión +STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}Cantidad de señales instaladas al arrastrar +STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}Más +STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Menos + +# Bridge selection window +STR_SELECT_RAIL_BRIDGE_CAPTION :{WHITE}Selección de puente de ferrocarril +STR_SELECT_ROAD_BRIDGE_CAPTION :{WHITE}Selección de puente de carretera +STR_SELECT_BRIDGE_SELECTION_TOOLTIP :{BLACK}Selección de puente: Clic en el puente elegido para construirlo +STR_SELECT_BRIDGE_INFO :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY_LONG} +STR_SELECT_BRIDGE_SCENEDIT_INFO :{GOLD}{STRING},{} {VELOCITY} +STR_BRIDGE_NAME_SUSPENSION_STEEL :Colgante (acero) +STR_BRIDGE_NAME_GIRDER_STEEL :Vigas (acero) +STR_BRIDGE_NAME_CANTILEVER_STEEL :Voladizo (acero) +STR_BRIDGE_NAME_SUSPENSION_CONCRETE :Colgante (concreto) +STR_BRIDGE_NAME_WOODEN :Madera +STR_BRIDGE_NAME_CONCRETE :Concreto +STR_BRIDGE_NAME_TUBULAR_STEEL :Tubular (acero) +STR_BRIDGE_TUBULAR_SILICON :Tubular (silicio) + + +# Road construction toolbar +STR_ROAD_TOOLBAR_ROAD_CONSTRUCTION_CAPTION :{WHITE}Construcción de carretera +STR_ROAD_TOOLBAR_TRAM_CONSTRUCTION_CAPTION :{WHITE}Construcción de tranvía +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Construir sección de carretera. Ctrl quita las carreteras. Mayús muestra una estimación del precio +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Construir sección de tranvía. Ctrl quita los carriles de tranvía. Mayús muestra una estimación del precio +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Construir carretera con orientación automática. Ctrl quita carreteras. Mayús muestra una estimación del precio +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Construir tranvías con orientación automática. Ctrl quita los carriles de tranvía. Mayús muestra una estimación del precio +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Construir depósito de carretera (para comprar y dar mantenimiento a vehículos). Mayús muestra una estimación del precio +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Construir depósito de tranvías (para comprar y dar mantenimiento a tranvías). Mayús muestra una estimación del precio +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Construir parada de autobús. Ctrl activa la ampliación de estaciones. Mayús muestra una estimación del precio +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Construir estación de tranvía de pasajeros. Ctrl activa la ampliación de estaciones. Mayús muestra una estimación del precio +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Construir estación de carga de camiones. Ctrl activa la ampliación de estaciones. Mayús muestra una estimación del precio +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Construir estación de tranvía de carga. Ctrl activa la ampliación de estaciones. Mayús muestra una estimación del precio +STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Activar o desactivar carreteras de un sentido +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Construir puente de carretera. Mayús muestra una estimación del precio +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Construir puente de tranvía. Mayús muestra una estimación del precio +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Construir túnel de carretera. Mayús muestra una estimación del precio +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Construir túnel de tranvía. Mayús muestra una estimación del precio +STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Quitar carretera +STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Quitar carriles de tranvía + +# Road depot construction window +STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION :{WHITE}Orientación del depósito +STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP :{BLACK}Elegir la orientación del depósito de vehículos de carretera +STR_BUILD_DEPOT_TRAM_ORIENTATION_CAPTION :{WHITE}Orientación del depósito +STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP :{BLACK}Elegir la orientación del depósito de tranvías + +# Road vehicle station construction window +STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Orientación de la parada de autobús +STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP :{BLACK}Elegir la orientación de la parada de autobús +STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Orientación de la estación de camiones +STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Elegir la orientación de la estación de camiones +STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Orientación de la estación de tranvía de pasajeros +STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Elegir la orientación de la estación de tranvía de pasajeros +STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Orientación de la estación de tranvía de carga +STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Elegir la orientación de la estación de tranvía de carga + +# Waterways toolbar (last two for SE only) +STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Vías fluviales +STR_WATERWAYS_TOOLBAR_CAPTION_SE :{WHITE}Canales +STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Construir canal. Mayús muestra una estimación del precio +STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Construir esclusa. Mayús muestra una estimación del precio +STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Construir astillero (para comprar y dar mantenimiento a barcos). Mayús muestra una estimación del precio +STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Construir muelles. Ctrl activa la ampliación de estaciones. Mayús muestra una estimación del precio +STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Colocar boya para utilizar como punto guía marítimo. Mayús muestra una estimación del precio +STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Construir acueducto. Mayús muestra una estimación del precio +STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Definir cuerpo de agua.{}Crea un canal, a menos que se pulse Ctrl en un área al nivel del mar, en cuyo caso se inundarán los alrededores +STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Colocar ríos + +# Ship depot construction window +STR_DEPOT_BUILD_SHIP_CAPTION :{WHITE}Orientación del astillero +STR_DEPOT_BUILD_SHIP_ORIENTATION_TOOLTIP :{BLACK}Elegir la orientación del astillero + +# Dock construction window +STR_STATION_BUILD_DOCK_CAPTION :{WHITE}Muelle + +# Airport toolbar +STR_TOOLBAR_AIRCRAFT_CAPTION :{WHITE}Aeropuertos +STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP :{BLACK}Construir aeropuerto. Ctrl activa la ampliación de aeropuertos. Mayús muestra una estimación del precio + +# Airport construction window +STR_STATION_BUILD_AIRPORT_CAPTION :{WHITE}Selección de aeropuerto +STR_STATION_BUILD_AIRPORT_TOOLTIP :{BLACK}Elegir tamaño y tipo de aeropuerto +STR_STATION_BUILD_AIRPORT_CLASS_LABEL :{BLACK}Tipo de aeropuerto +STR_STATION_BUILD_AIRPORT_LAYOUT_NAME :{BLACK}Diseño {NUM} + +STR_AIRPORT_SMALL :Pequeño +STR_AIRPORT_CITY :Ciudad +STR_AIRPORT_METRO :Metropolitano +STR_AIRPORT_INTERNATIONAL :Internacional +STR_AIRPORT_COMMUTER :Suburbano +STR_AIRPORT_INTERCONTINENTAL :Intercontinental +STR_AIRPORT_HELIPORT :Helipuerto +STR_AIRPORT_HELIDEPOT :Hangar para helicóptero +STR_AIRPORT_HELISTATION :Estación de helicóptero + +STR_AIRPORT_CLASS_SMALL :Aeropuertos pequeños +STR_AIRPORT_CLASS_LARGE :Aeropuertos grandes +STR_AIRPORT_CLASS_HUB :Aeropuertos centrales +STR_AIRPORT_CLASS_HELIPORTS :Helipuertos + +STR_STATION_BUILD_NOISE :{BLACK}Ruido generado: {GOLD}{COMMA} + +# Landscaping toolbar +STR_LANDSCAPING_TOOLBAR :{WHITE}Modificación de terreno +STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Disminuir una esquina del terreno. Al arrastrar el ratón se reduce la primera esquina elegida y se nivela el resto del terreno seleccionado a dicha altura. Ctrl para seleccionar un área en diagonal. +STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Elevar una esquina del terreno. Al arrastrar el ratón se eleva la primera esquina elegida y se nivela el resto del terreno seleccionado a dicha altura. Ctrl para seleccionar un área en diagonal. Mayús muestra una estimación del precio +STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Nivela un área de terreno a la altura de la primera esquina seleccionada. Ctrl para seleccionar un área en diagonal. Mayús muestra una estimación del precio +STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Comprar terreno para usos futuros. Mayús muestra una estimación del precio + +# Object construction window +STR_OBJECT_BUILD_CAPTION :{WHITE}Selección de objeto +STR_OBJECT_BUILD_TOOLTIP :{BLACK}Elegir una estructura u objeto a construir. Mayús muestra una estimación del precio +STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Elegir el tipo de objeto o estructura a construir +STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Vista previa del objeto +STR_OBJECT_BUILD_SIZE :{BLACK}Tamaño: {GOLD}{NUM}×{NUM} casillas + +STR_OBJECT_CLASS_LTHS :Faros +STR_OBJECT_CLASS_TRNS :Torres de transmisión + +# Tree planting window (last two for SE only) +STR_PLANT_TREE_CAPTION :{WHITE}Árboles +STR_PLANT_TREE_TOOLTIP :{BLACK}Elegir el tipo de árboles a plantar. Si la casilla ya tiene un árbol, se añadirán más árboles de distintos tipos sin importar el tipo elegido +STR_TREES_RANDOM_TYPE :{BLACK}Tipo aleatorio +STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Colocar árboles de distinto tipo al azar. Mayús muestra una estimación del precio +STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Árboles al azar +STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Planta árboles al azar sobre el terreno + +# Land generation window (SE) +STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Generación de terreno +STR_TERRAFORM_TOOLTIP_PLACE_ROCKY_AREAS_ON_LANDSCAPE :{BLACK}Colocar zonas rocosas sobre el terreno +STR_TERRAFORM_TOOLTIP_DEFINE_DESERT_AREA :{BLACK}Definir área desértica.{}Mantener pulsado Ctrl para quitarla +STR_TERRAFORM_TOOLTIP_INCREASE_SIZE_OF_LAND_AREA :{BLACK}Aumentar el tamaño del área de terreno a disminuir o elevar +STR_TERRAFORM_TOOLTIP_DECREASE_SIZE_OF_LAND_AREA :{BLACK}Disminuir el tamaño del área de terreno a disminuir o elevar +STR_TERRAFORM_TOOLTIP_GENERATE_RANDOM_LAND :{BLACK}Generar terreno al azar +STR_TERRAFORM_SE_NEW_WORLD :{BLACK}Crear nuevo mapa +STR_TERRAFORM_RESET_LANDSCAPE :{BLACK}Restaurar terreno +STR_TERRAFORM_RESET_LANDSCAPE_TOOLTIP :{BLACK}Eliminar del mapa todas las propiedades de las empresas + +STR_QUERY_RESET_LANDSCAPE_CAPTION :{WHITE}Restaurar terreno +STR_RESET_LANDSCAPE_CONFIRMATION_TEXT :{WHITE}¿Eliminar todas las propiedades de las empresas? + +# Town generation window (SE) +STR_FOUND_TOWN_CAPTION :{WHITE}Creación de pueblos +STR_FOUND_TOWN_NEW_TOWN_BUTTON :{BLACK}Nuevo pueblo +STR_FOUND_TOWN_NEW_TOWN_TOOLTIP :{BLACK}Fundar un nuevo pueblo. Mayús muestra una estimación del precio +STR_FOUND_TOWN_RANDOM_TOWN_BUTTON :{BLACK}Pueblo aleatorio +STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP :{BLACK}Fundar pueblo en un lugar aleatorio +STR_FOUND_TOWN_MANY_RANDOM_TOWNS :{BLACK}Muchos pueblos aleatorios +STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP :{BLACK}Cubrir el mapa con pueblos colocados al azar + +STR_FOUND_TOWN_NAME_TITLE :{YELLOW}Nombre del pueblo: +STR_FOUND_TOWN_NAME_EDITOR_TITLE :{BLACK}Indicar el nombre del pueblo +STR_FOUND_TOWN_NAME_EDITOR_HELP :{BLACK}Clic para indicar el nombre del pueblo +STR_FOUND_TOWN_NAME_RANDOM_BUTTON :{BLACK}Nombre aleatorio +STR_FOUND_TOWN_NAME_RANDOM_TOOLTIP :{BLACK}Generar nuevo nombre al azar + +STR_FOUND_TOWN_INITIAL_SIZE_TITLE :{YELLOW}Tamaño del pueblo: +STR_FOUND_TOWN_INITIAL_SIZE_SMALL_BUTTON :{BLACK}Pequeño +STR_FOUND_TOWN_INITIAL_SIZE_MEDIUM_BUTTON :{BLACK}Mediano +STR_FOUND_TOWN_INITIAL_SIZE_LARGE_BUTTON :{BLACK}Grande +STR_FOUND_TOWN_SIZE_RANDOM :{BLACK}Aleatorio +STR_FOUND_TOWN_INITIAL_SIZE_TOOLTIP :{BLACK}Elegir el tamaño del pueblo +STR_FOUND_TOWN_CITY :{BLACK}Ciudad +STR_FOUND_TOWN_CITY_TOOLTIP :{BLACK}Las ciudades crecen más rápido que los pueblos{}Según la configuración del juego, al ser creadas tendrán mayor población + +STR_FOUND_TOWN_ROAD_LAYOUT :{YELLOW}Diseño urbano: +STR_FOUND_TOWN_SELECT_TOWN_ROAD_LAYOUT :{BLACK}Elegir el diseño de carreteras y cuadras para este pueblo +STR_FOUND_TOWN_SELECT_LAYOUT_ORIGINAL :{BLACK}Original +STR_FOUND_TOWN_SELECT_LAYOUT_BETTER_ROADS :{BLACK}Mejorado +STR_FOUND_TOWN_SELECT_LAYOUT_2X2_GRID :{BLACK}Rejilla de 2×2 +STR_FOUND_TOWN_SELECT_LAYOUT_3X3_GRID :{BLACK}Rejilla de 3×3 +STR_FOUND_TOWN_SELECT_LAYOUT_RANDOM :{BLACK}Aleatorio + +# Fund new industry window +STR_FUND_INDUSTRY_CAPTION :{WHITE}Fundación de una nueva industria +STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}Elegir de la lista la industria adecuada +STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :Muchas industrias al azar +STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}Cubrir el mapa con industrias colocadas al azar +STR_FUND_INDUSTRY_INDUSTRY_BUILD_COST :{BLACK}Costo: {YELLOW}{CURRENCY_LONG} +STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}Prospección +STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY :{BLACK}Construir +STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}Fundar + +# Industry cargoes window +STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Cadena industrial para la industria de {STRING} +STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Cadena industrial para el cargamento de {STRING} +STR_INDUSTRY_CARGOES_PRODUCERS :{WHITE}Industrias proveedoras +STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Industrias receptoras +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 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 +STR_INDUSTRY_CARGOES_SELECT_CARGO_TOOLTIP :{BLACK}Elegir el tipo de cargamento a mostrar +STR_INDUSTRY_CARGOES_SELECT_INDUSTRY :{BLACK}Elegir industria +STR_INDUSTRY_CARGOES_SELECT_INDUSTRY_TOOLTIP :{BLACK}Elegir la industria a mostrar + +# Land area window +STR_LAND_AREA_INFORMATION_CAPTION :{WHITE}Información sobre área de terreno +STR_LAND_AREA_INFORMATION_COST_TO_CLEAR_N_A :{BLACK}Costo por despejar: {LTBLUE}N/D +STR_LAND_AREA_INFORMATION_COST_TO_CLEAR :{BLACK}Costo por despejar: {RED}{CURRENCY_LONG} +STR_LAND_AREA_INFORMATION_REVENUE_WHEN_CLEARED :{BLACK}Ingreso por despejar: {LTBLUE}{CURRENCY_LONG} +STR_LAND_AREA_INFORMATION_OWNER_N_A :N/D +STR_LAND_AREA_INFORMATION_OWNER :{BLACK}Propietario: {LTBLUE}{STRING} +STR_LAND_AREA_INFORMATION_ROAD_OWNER :{BLACK}Propietario de la carretera: {LTBLUE}{STRING} +STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Propietario del tranvía: {LTBLUE}{STRING} +STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Propietario del ferrocarril: {LTBLUE}{STRING} +STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Ayuntamiento: {LTBLUE}{STRING} +STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Ninguno +STR_LAND_AREA_INFORMATION_LANDINFO_COORDS :{BLACK}Coordenadas: {LTBLUE}{NUM}×{NUM}×{NUM} ({STRING}) +STR_LAND_AREA_INFORMATION_BUILD_DATE :{BLACK}Construido: {LTBLUE}{DATE_LONG} +STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Clase de estación: {LTBLUE}{STRING} +STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Tipo de estación: {LTBLUE}{STRING} +STR_LAND_AREA_INFORMATION_AIRPORT_CLASS :{BLACK}Tipo de aeropuerto: {LTBLUE}{STRING} +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 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} +STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Límite de velocidad de carretera: {LTBLUE}{VELOCITY} + +# Description of land area of different tiles +STR_LAI_CLEAR_DESCRIPTION_ROCKS :Rocas +STR_LAI_CLEAR_DESCRIPTION_ROUGH_LAND :Terreno irregular +STR_LAI_CLEAR_DESCRIPTION_BARE_LAND :Tierra árida +STR_LAI_CLEAR_DESCRIPTION_GRASS :Hierba +STR_LAI_CLEAR_DESCRIPTION_FIELDS :Campos +STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Terreno nevado +STR_LAI_CLEAR_DESCRIPTION_DESERT :Desierto + +STR_LAI_RAIL_DESCRIPTION_TRACK :Vías férreas +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Vías férreas con señales de bloqueo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Vías férreas con señales de entrada +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Vías férreas con señales de salida +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Vías férreas con señales combo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Vías férreas con señales de ruta +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Vías férreas con señales de ruta de un solo sentido +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Vías férreas con señales de bloqueo y de entrada +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Vías férreas con señales de bloqueo y de salida +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Vías férreas con señales de bloqueo y combo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Vías férreas con señales de bloqueo y de ruta +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Vías férreas con señales de bloqueo y de ruta de un solo sentido +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Vías férreas con señales de entrada y de salida +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Vías férreas con señales de entrada y combo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Vías férreas con señales de entrada y de ruta +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Vías férreas con señales de entrada y de ruta de un solo sentido +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Vías férreas con señales de salida y combo +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Vías férreas con señales de salida y de ruta +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Vías férreas con señales de salida y de ruta de un solo sentido +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Vías férreas con señales combo y de ruta +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Vías férreas con señales combo y de ruta de un solo sentido +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Vías férreas con señales de ruta y de ruta de un solo sentido +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Depósito (trenes) + +STR_LAI_ROAD_DESCRIPTION_ROAD :Carretera +STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Carretera con alumbrado +STR_LAI_ROAD_DESCRIPTION_TREE_LINED_ROAD :Carretera con árboles +STR_LAI_ROAD_DESCRIPTION_ROAD_VEHICLE_DEPOT :Depósito de vehículos de carretera +STR_LAI_ROAD_DESCRIPTION_ROAD_RAIL_LEVEL_CROSSING :Paso a nivel +STR_LAI_ROAD_DESCRIPTION_TRAMWAY :Tranvía + +# Houses come directly from their building names +STR_LAI_TOWN_INDUSTRY_DESCRIPTION_UNDER_CONSTRUCTION :{STRING} (en construcción) + +STR_LAI_TREE_NAME_TREES :Árboles +STR_LAI_TREE_NAME_RAINFOREST :Selva +STR_LAI_TREE_NAME_CACTUS_PLANTS :Cactus + +STR_LAI_STATION_DESCRIPTION_RAILROAD_STATION :Estación de ferrocarril +STR_LAI_STATION_DESCRIPTION_AIRCRAFT_HANGAR :Hangar de aeronaves +STR_LAI_STATION_DESCRIPTION_AIRPORT :Aeropuerto +STR_LAI_STATION_DESCRIPTION_TRUCK_LOADING_AREA :Estación de carga de camiones +STR_LAI_STATION_DESCRIPTION_BUS_STATION :Parada de autobús +STR_LAI_STATION_DESCRIPTION_SHIP_DOCK :Muelle +STR_LAI_STATION_DESCRIPTION_BUOY :Boya +STR_LAI_STATION_DESCRIPTION_WAYPOINT :Punto guía + +STR_LAI_WATER_DESCRIPTION_WATER :Agua +STR_LAI_WATER_DESCRIPTION_CANAL :Canal +STR_LAI_WATER_DESCRIPTION_LOCK :Esclusa +STR_LAI_WATER_DESCRIPTION_RIVER :Río +STR_LAI_WATER_DESCRIPTION_COAST_OR_RIVERBANK :Costa o rivera +STR_LAI_WATER_DESCRIPTION_SHIP_DEPOT :Astillero + +# Industries come directly from their industry names + +STR_LAI_TUNNEL_DESCRIPTION_RAILROAD :Túnel de ferrocarril +STR_LAI_TUNNEL_DESCRIPTION_ROAD :Túnel de carretera + +STR_LAI_BRIDGE_DESCRIPTION_RAIL_SUSPENSION_STEEL :Puente colgante de ferrocarril (acero) +STR_LAI_BRIDGE_DESCRIPTION_RAIL_GIRDER_STEEL :Puente de vigas de ferrocarril (acero) +STR_LAI_BRIDGE_DESCRIPTION_RAIL_CANTILEVER_STEEL :Puente voladizo de ferrocarril (acero) +STR_LAI_BRIDGE_DESCRIPTION_RAIL_SUSPENSION_CONCRETE :Puente colgante de ferrocarril (concreto reforzado) +STR_LAI_BRIDGE_DESCRIPTION_RAIL_WOODEN :Puente de ferrocarril (madera) +STR_LAI_BRIDGE_DESCRIPTION_RAIL_CONCRETE :Puente de ferrocarril (concreto) +STR_LAI_BRIDGE_DESCRIPTION_RAIL_TUBULAR_STEEL :Puente tubular de ferrocarril + +STR_LAI_BRIDGE_DESCRIPTION_ROAD_SUSPENSION_STEEL :Puente colgante de carretera (acero) +STR_LAI_BRIDGE_DESCRIPTION_ROAD_GIRDER_STEEL :Puente de vigas de carretera (acero) +STR_LAI_BRIDGE_DESCRIPTION_ROAD_CANTILEVER_STEEL :Puente voladizo de carretera (acero) +STR_LAI_BRIDGE_DESCRIPTION_ROAD_SUSPENSION_CONCRETE :Puente colgante de carretera (concreto reforzado) +STR_LAI_BRIDGE_DESCRIPTION_ROAD_WOODEN :Puente de carretera (madera) +STR_LAI_BRIDGE_DESCRIPTION_ROAD_CONCRETE :Puente de carretera (concreto) +STR_LAI_BRIDGE_DESCRIPTION_ROAD_TUBULAR_STEEL :Puente tubular de carretera + +STR_LAI_BRIDGE_DESCRIPTION_AQUEDUCT :Acueducto + +STR_LAI_OBJECT_DESCRIPTION_TRANSMITTER :Torre de transmisión +STR_LAI_OBJECT_DESCRIPTION_LIGHTHOUSE :Faro +STR_LAI_OBJECT_DESCRIPTION_COMPANY_HEADQUARTERS :Sede de la empresa +STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Terreno propiedad de una empresa + +# About OpenTTD window +STR_ABOUT_OPENTTD :{WHITE}Acerca de OpenTTD +STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyright original {COPYRIGHT} 1995 Chris Sawyer, Todos los derechos reservados +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 +STR_SAVELOAD_SAVE_SCENARIO :{WHITE}Guardar mapa +STR_SAVELOAD_LOAD_SCENARIO :{WHITE}Cargar mapa +STR_SAVELOAD_LOAD_HEIGHTMAP :{WHITE}Cargar mapa de alturas +STR_SAVELOAD_SAVE_HEIGHTMAP :{WHITE}Guardar mapa de alturas +STR_SAVELOAD_HOME_BUTTON :{BLACK}Clic para ir a la carpeta de guardado predeterminada +STR_SAVELOAD_BYTES_FREE :{BLACK}{BYTES} libres +STR_SAVELOAD_LIST_TOOLTIP :{BLACK}Lista de unidades de almacenamiento, carpetas y partidas guardadas +STR_SAVELOAD_EDITBOX_TOOLTIP :{BLACK}Nombre elegido para la partida a guardar +STR_SAVELOAD_DELETE_BUTTON :{BLACK}Eliminar +STR_SAVELOAD_DELETE_TOOLTIP :{BLACK}Eliminar la partida guardada elegida +STR_SAVELOAD_SAVE_BUTTON :{BLACK}Guardar +STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}Guardar la partida actual usando el nombre elegido +STR_SAVELOAD_LOAD_BUTTON :{BLACK}Cargar +STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}Cargar la partida elegida +STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP :{BLACK}Cargar el mapa de alturas elegido +STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Detalles de la partida +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 + +# World generation +STR_MAPGEN_WORLD_GENERATION_CAPTION :{WHITE}Generación de mapa +STR_MAPGEN_MAPSIZE :{BLACK}Tamaño del mapa: +STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Elegir el tamaño del mapa en número de casillas. El número real de casillas disponibles en el mapa será ligeramente inferior +STR_MAPGEN_BY :{BLACK}× +STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Núm. de pueblos: +STR_MAPGEN_DATE :{BLACK}Fecha: +STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Núm. de industrias: +STR_MAPGEN_MAX_HEIGHTLEVEL :{BLACK}Elevación máx.: +STR_MAPGEN_MAX_HEIGHTLEVEL_UP :{BLACK}Aumentar la elevación máxima de las montañas del mapa una unidad +STR_MAPGEN_MAX_HEIGHTLEVEL_DOWN :{BLACK}Disminuir la elevación máxima de las montañas del mapa una unidad +STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Nivel de nieve: +STR_MAPGEN_SNOW_LINE_UP :{BLACK}Mover el nivel de inicio de nieve hacia arriba +STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Mover el nivel de inicio de nieve hacia abajo +STR_MAPGEN_LAND_GENERATOR :{BLACK}Generador de terreno: +STR_MAPGEN_TREE_PLACER :{BLACK}Algoritmo de árboles: +STR_MAPGEN_TERRAIN_TYPE :{BLACK}Tipo de terreno +STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Nivel del mar: +STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Ríos: +STR_MAPGEN_SMOOTHNESS :{BLACK}Suavidad: +STR_MAPGEN_VARIETY :{BLACK}Variedad: +STR_MAPGEN_GENERATE :{WHITE}Generar + +# Strings for map borders at game generation +STR_MAPGEN_BORDER_TYPE :{BLACK}Bordes del mapa: +STR_MAPGEN_NORTHWEST :{BLACK}Noroeste +STR_MAPGEN_NORTHEAST :{BLACK}Noreste +STR_MAPGEN_SOUTHEAST :{BLACK}Sureste +STR_MAPGEN_SOUTHWEST :{BLACK}Suroeste +STR_MAPGEN_BORDER_FREEFORM :{BLACK}Forma libre +STR_MAPGEN_BORDER_WATER :{BLACK}Agua +STR_MAPGEN_BORDER_RANDOM :{BLACK}Aleatorio +STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Aleatorio +STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual + +STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Rotación del mapa de alturas: +STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Nombre del mapa de alturas: +STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Tamaño: +STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM}×{NUM} + +STR_MAPGEN_MAX_HEIGHTLEVEL_QUERY_CAPT :{WHITE}Cambiar la elevación máxima del mapa +STR_MAPGEN_SNOW_LINE_QUERY_CAPT :{WHITE}Cambiar el nivel de inicio de nieve +STR_MAPGEN_START_DATE_QUERY_CAPT :{WHITE}Cambiar año de inicio + +# SE Map generation +STR_SE_MAPGEN_CAPTION :{WHITE}Tipo de mapa +STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Terreno plano +STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Generar un mapa plano +STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Terreno aleatorio +STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Elevación terreno plano: +STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Reducir la elevación del terreno plano +STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Aumentar la elevación del terreno plano + +STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_QUERY_CAPT :{WHITE}Cambiar elevación de terreno plano + +# Map generation progress +STR_GENERATION_WORLD :{WHITE}Generando mapa... +STR_GENERATION_ABORT :{BLACK}Cancelar +STR_GENERATION_ABORT_CAPTION :{WHITE}Cancelar generación de mapa +STR_GENERATION_ABORT_MESSAGE :{YELLOW}¿Cancelar realmente la generación del mapa? +STR_GENERATION_PROGRESS :{WHITE}{NUM}% completado +STR_GENERATION_PROGRESS_NUM :{BLACK}{NUM}/{NUM} +STR_GENERATION_WORLD_GENERATION :{BLACK}Generación de mapa +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 objetos +STR_GENERATION_CLEARING_TILES :{BLACK}Generación de áreas irregulares y rocosas +STR_GENERATION_SETTINGUP_GAME :{BLACK}Configurando partida +STR_GENERATION_PREPARING_TILELOOP :{BLACK}Generando casillas +STR_GENERATION_PREPARING_SCRIPT :{BLACK}Ejecutando script +STR_GENERATION_PREPARING_GAME :{BLACK}Preparando partida + +# NewGRF settings +STR_NEWGRF_SETTINGS_CAPTION :{WHITE}Configuración de NewGRF +STR_NEWGRF_SETTINGS_INFO_TITLE :{WHITE}Información detallada de NewGRF +STR_NEWGRF_SETTINGS_ACTIVE_LIST :{WHITE}Archivos NewGRF activos +STR_NEWGRF_SETTINGS_INACTIVE_LIST :{WHITE}Archivos NewGRF inactivos +STR_NEWGRF_SETTINGS_SELECT_PRESET :{ORANGE}Seleccionar perfil: +STR_NEWGRF_FILTER_TITLE :{ORANGE}Filtrar palabras: +STR_NEWGRF_SETTINGS_PRESET_LIST_TOOLTIP :{BLACK}Cargar perfil +STR_NEWGRF_SETTINGS_PRESET_SAVE :{BLACK}Guardar +STR_NEWGRF_SETTINGS_PRESET_SAVE_TOOLTIP :{BLACK}Guardar lista actual como nuevo perfil +STR_NEWGRF_SETTINGS_PRESET_SAVE_QUERY :{BLACK}Indicar nombre de perfil +STR_NEWGRF_SETTINGS_PRESET_DELETE :{BLACK}Eliminar +STR_NEWGRF_SETTINGS_PRESET_DELETE_TOOLTIP :{BLACK}Eliminar el perfil elegido +STR_NEWGRF_SETTINGS_ADD :{BLACK}Añadir +STR_NEWGRF_SETTINGS_ADD_FILE_TOOLTIP :{BLACK}Añadir el NewGRF seleccionado a la lista de archivos activos +STR_NEWGRF_SETTINGS_RESCAN_FILES :{BLACK}Volver a cargar archivos +STR_NEWGRF_SETTINGS_RESCAN_FILES_TOOLTIP :{BLACK}Volver a cargar la lista de archivos NewGRF disponibles +STR_NEWGRF_SETTINGS_REMOVE :{BLACK}Quitar +STR_NEWGRF_SETTINGS_REMOVE_TOOLTIP :{BLACK}Quitar el NewGRF elegido de la lista de archivos activos +STR_NEWGRF_SETTINGS_MOVEUP :{BLACK}Subir +STR_NEWGRF_SETTINGS_MOVEUP_TOOLTIP :{BLACK}Mover el NewGRF elegido una posición arriba en la lista +STR_NEWGRF_SETTINGS_MOVEDOWN :{BLACK}Bajar +STR_NEWGRF_SETTINGS_MOVEDOWN_TOOLTIP :{BLACK}Mover el NewGRF elegido una posición abajo en la lista +STR_NEWGRF_SETTINGS_UPGRADE :{BLACK}Actualizar +STR_NEWGRF_SETTINGS_UPGRADE_TOOLTIP :{BLACK}Actualizar los archivos NewGRF que lo requieran a la versión más reciente +STR_NEWGRF_SETTINGS_FILE_TOOLTIP :{BLACK}Lista de archivos NewGRF instalados + +STR_NEWGRF_SETTINGS_SET_PARAMETERS :{BLACK}Parámetros +STR_NEWGRF_SETTINGS_SHOW_PARAMETERS :{BLACK}Mostrar parámetros +STR_NEWGRF_SETTINGS_TOGGLE_PALETTE :{BLACK}Cambiar paleta +STR_NEWGRF_SETTINGS_TOGGLE_PALETTE_TOOLTIP :{BLACK}Cambia la paleta del NewGRF elegido.{}Esto es necesario cuando los gráficos de un NewGRF se ven de color rosa durante el juego +STR_NEWGRF_SETTINGS_APPLY_CHANGES :{BLACK}Aplicar cambios + +STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_BUTTON :{BLACK}Buscar en línea el contenido que haga falta +STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_TOOLTIP :{BLACK}Revisar si el contenido que falta puede ser encontrado en línea + +STR_NEWGRF_SETTINGS_FILENAME :{BLACK}Archivo: {SILVER}{STRING} +STR_NEWGRF_SETTINGS_GRF_ID :{BLACK}GRF ID: {SILVER}{STRING} +STR_NEWGRF_SETTINGS_VERSION :{BLACK}Versión: {SILVER}{NUM} +STR_NEWGRF_SETTINGS_MIN_VERSION :{BLACK}Mín. versión compatible: {SILVER}{NUM} +STR_NEWGRF_SETTINGS_MD5SUM :{BLACK}MD5sum: {SILVER}{STRING} +STR_NEWGRF_SETTINGS_PALETTE :{BLACK}Paleta: {SILVER}{STRING} +STR_NEWGRF_SETTINGS_PARAMETER :{BLACK}Parámetros: {SILVER}{STRING} + +STR_NEWGRF_SETTINGS_NO_INFO :{BLACK}No hay información disponible +STR_NEWGRF_SETTINGS_NOT_FOUND :{RED}Archivo no encontrado +STR_NEWGRF_SETTINGS_DISABLED :{RED}Desactivado +STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}No compatible con esta versión de OpenTTD + +# NewGRF save preset window +STR_SAVE_PRESET_CAPTION :{WHITE}Guardar perfil +STR_SAVE_PRESET_LIST_TOOLTIP :{BLACK}Lista de perfiles disponibles (elegir uno para copiar el nombre en el perfil inferior) +STR_SAVE_PRESET_TITLE :{BLACK}Indicar un nombre para el perfil +STR_SAVE_PRESET_EDITBOX_TOOLTIP :{BLACK}Nombre del perfil a guardar +STR_SAVE_PRESET_CANCEL :{BLACK}Cancelar +STR_SAVE_PRESET_CANCEL_TOOLTIP :{BLACK}No modificar el perfil +STR_SAVE_PRESET_SAVE :{BLACK}Guardar +STR_SAVE_PRESET_SAVE_TOOLTIP :{BLACK}Guardar el perfil con el nombre elegido + +# NewGRF parameters window +STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}Cambiar parámetros de NewGRF +STR_NEWGRF_PARAMETERS_CLOSE :{BLACK}Cerrar +STR_NEWGRF_PARAMETERS_RESET :{BLACK}Restablecer +STR_NEWGRF_PARAMETERS_RESET_TOOLTIP :{BLACK}Restablecer todos los parámetros a sus valores predeterminados +STR_NEWGRF_PARAMETERS_DEFAULT_NAME :Parámetro {NUM} +STR_NEWGRF_PARAMETERS_SETTING :{STRING}: {ORANGE}{STRING} +STR_NEWGRF_PARAMETERS_NUM_PARAM :{LTBLUE}Número de parámetros: {ORANGE}{NUM} + +# NewGRF inspect window +STR_NEWGRF_INSPECT_CAPTION :{WHITE}Analizar: {STRING} +STR_NEWGRF_INSPECT_PARENT_BUTTON :{BLACK}Superior +STR_NEWGRF_INSPECT_PARENT_TOOLTIP :{BLACK}Inspeccionar objeto del entorno superior + +STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT :{STRING} en {HEX} +STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_OBJECT :Objeto +STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_RAIL_TYPE :Tipo de ferrocarril + +STR_NEWGRF_INSPECT_QUERY_CAPTION :{WHITE}Parámetro de variable NewGRF 60+x (hexadecimal) + +# Sprite aligner window +STR_SPRITE_ALIGNER_CAPTION :{WHITE}Alinear sprite {COMMA} ({STRING}) +STR_SPRITE_ALIGNER_NEXT_BUTTON :{BLACK}Siguiente sprite +STR_SPRITE_ALIGNER_NEXT_TOOLTIP :{BLACK}Ir al siguiente sprite (ignorando pseudosprites, sprites coloreados y sprites de fuente) y pasar del último al primer sprite +STR_SPRITE_ALIGNER_GOTO_BUTTON :{BLACK}Ir a sprite +STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Ir al sprite indicado. Si el sprite no es un sprite normal, ir al siguiente sprite normal +STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Sprite anterior +STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Ir al sprite anterior (ignorando pseudosprites, sprites coloreados y sprites de fuente) y pasar del primer al último sprite +STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Representación del sprite elegido. Se ignora la alineación al ser dibujado +STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Mover el sprite cambiando los valores X y Y. Ctrl+Clic mueve el sprite ocho unidades de una sola vez +STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Restaurar coordenadas relativas +STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Restaurar las coordenadas relativas +STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Coordenada X: {NUM}, Coordenada Y: {NUM} (absoluta) +STR_SPRITE_ALIGNER_OFFSETS_REL :{BLACK}Coordenada X: {NUM}, Coordenada Y: {NUM} (relativa) +STR_SPRITE_ALIGNER_PICKER_BUTTON :{BLACK}Elegir sprite +STR_SPRITE_ALIGNER_PICKER_TOOLTIP :{BLACK}Elegir un sprite de cualquier parte de la pantalla + +STR_SPRITE_ALIGNER_GOTO_CAPTION :{WHITE}Ir a sprite + +# NewGRF (self) generated warnings/errors +STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING} +STR_NEWGRF_ERROR_MSG_WARNING :{RED}Atención: {SILVER}{STRING} +STR_NEWGRF_ERROR_MSG_ERROR :{RED}Error: {SILVER}{STRING} +STR_NEWGRF_ERROR_MSG_FATAL :{RED}Error fatal: {SILVER}{STRING} +STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Ocurrió un error fatal de NewGRF:{}{STRING} +STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} no funcionará con la con la versión de TTDPatch reportada por OpenTTD +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} es la para la versión {STRING} de TTD +STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} está diseñado para usarse con {STRING} +STR_NEWGRF_ERROR_INVALID_PARAMETER :Parámetro no válido para {1:STRING}: parámetro {STRING} ({NUM}) +STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} debe cargarse antes de {STRING} +STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} debe cargarse después de {STRING} +STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} requiere OpenTTD versión {STRING} o superior +STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :El archivo GRF fue diseñado para ser traducido +STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Demasiados NewGRF cargados +STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Cargar {1:STRING} como NewGRF estático con {STRING} puede causar desincronizaciones +STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Sprite inesperado (sprite {3:NUM}) +STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Propiedad de Acción 0 desconocida {4:HEX} (sprite {3:NUM}) +STR_NEWGRF_ERROR_INVALID_ID :Intento de usar una ID no válida (sprite {3:NUM}) +STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} contiene un sprite con errores. Todos los sprites con errores se muestran como un símbolo de interrogación rojo (?) +STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Contiene múltiples entradas de Acción 8 (sprite {3:NUM}) +STR_NEWGRF_ERROR_READ_BOUNDS :La lectura excedió el límite de pseudo-sprite (sprite {3:NUM}) +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! +STR_NEWGRF_CONFIRMATION_TEXT :{YELLOW}Se van a modificar los NewGRF de una partida ya comenzada. Esto puede provocar un error fatal en OpenTTD o corromper la partida.{}No se deben crear reportes de errores por problemas causados por esta acción.{}¿Continuar de todos modos? + +STR_NEWGRF_DUPLICATE_GRFID :{WHITE}El archivo no puede añadirse: GRF ID duplicado +STR_NEWGRF_COMPATIBLE_LOADED :{ORANGE}Archivo no encontrado (GRF compatible cargado) +STR_NEWGRF_TOO_MANY_NEWGRFS :{WHITE}No se puede añadir archivo: se alcanzó el máximo de NewGRF permitidos + +STR_NEWGRF_COMPATIBLE_LOAD_WARNING :{WHITE}GRF(s) compatibles cargado para archivos que faltan +STR_NEWGRF_DISABLED_WARNING :{WHITE}El o los archivos GRF no encontrados han sido desactivados +STR_NEWGRF_UNPAUSE_WARNING_TITLE :{YELLOW}Archivo(s) GRF no encontrados +STR_NEWGRF_UNPAUSE_WARNING :{WHITE}Reanudar la partida puede provocar un error fatal en OpenTTD. No se deben crear reportes para errores fatales posteriores.{}¿Proceder de todos modos? + +# NewGRF status +STR_NEWGRF_LIST_NONE :Ninguno +STR_NEWGRF_LIST_ALL_FOUND :Todos los archivos presentes +STR_NEWGRF_LIST_COMPATIBLE :{YELLOW}Archivos compatibles encontrados +STR_NEWGRF_LIST_MISSING :{RED}Archivos que faltan + +# NewGRF 'it's broken' warnings +STR_NEWGRF_BROKEN :{WHITE}Es posible que el funcionamiento del NewGRF '{0:STRING}' cause desincronizaciones o errores +STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}Cambió el estado 'vagón con motor' para '{1:ENGINE}' cuando no estaba dentro de un depósito +STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}cambió la longitud del vehículo para '{1:ENGINE}' cuando no estaba dentro de un depósito +STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Cambió la capacidad del vehículo para '{1:ENGINE}' cuando no estaba dentro de un depósito o mientras no se estaba reformando +STR_BROKEN_VEHICLE_LENGTH :{WHITE}Tren '{VEHICLE}' perteneciente a '{COMPANY}' tiene una longitud no válida. Puede ser debido a problemas con los NewGRF. El juego puede fallar + +STR_NEWGRF_BUGGY :{WHITE}El NewGRF '{0:STRING}' da información incorrecta +STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}La información de cargamento o reequipamiento para '{1:ENGINE}' difiere de la lista de compra después de la construcción. Esto puede causar que la renovación y el reemplazo automático no haga el reequipamiento correcta +STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' ha causado un bucle sin fin en la llamada de producción +STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}La llamada {1:HEX} devolvió un resultado desconocido o no válido {2:HEX} + +# 'User removed essential NewGRFs'-placeholders for stuff without specs +STR_NEWGRF_INVALID_CARGO : +STR_NEWGRF_INVALID_CARGO_ABBREV :?? +STR_NEWGRF_INVALID_CARGO_QUANTITY :{COMMA} de +STR_NEWGRF_INVALID_ENGINE : +STR_NEWGRF_INVALID_INDUSTRYTYPE : + +# Placeholders for other invalid stuff, e.g. vehicles that have gone (Game Script). +STR_INVALID_VEHICLE : + +# NewGRF scanning window +STR_NEWGRF_SCAN_CAPTION :{WHITE}Analizando archivos NewGRF +STR_NEWGRF_SCAN_MESSAGE :{BLACK}Analizando archivos NewGRF. Dependiendo de la cantidad, esto puede tardar un poco... +STR_NEWGRF_SCAN_STATUS :{BLACK}{NUM} NewGRF{P "" s} analizado{P "" s} de un total aproximado de {NUM} NewGRF{P "" s} +STR_NEWGRF_SCAN_ARCHIVES :Analizando archivos + +# Sign list window +STR_SIGN_LIST_CAPTION :{WHITE}Lista de carteles: {COMMA} cartel{P "" es} +STR_SIGN_LIST_MATCH_CASE :{BLACK}Distinguir mayúsculas +STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Distinguir entre mayúsculas y minúsculas al filtrar la lista de carteles + +# Sign window +STR_EDIT_SIGN_CAPTION :{WHITE}Editar texto del cartel +STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Ir al siguiente cartel +STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Ir al cartel anterior + +STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Indicar un nombre para el cartel + +# Town directory window +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} + +# Town view window +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 +STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{ORANGE}{STRING}{GREEN} entregado +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 pueblo crece cada {ORANGE}{COMMA}{BLACK}{NBSP}día{P "" s} +STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}El pueblo crece cada {ORANGE}{COMMA}{BLACK}{NBSP}días{P "" s} (obra negra) +STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}El pueblo {RED}no{BLACK} está creciendo +STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Nivel de ruido en el pueblo: {ORANGE}{COMMA}{BLACK} Máx.: {ORANGE}{COMMA} +STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Centrar vista sobre el pueblo. Ctrl+Clic abre una ventana de vista en dicha ubicación +STR_TOWN_VIEW_LOCAL_AUTHORITY_BUTTON :{BLACK}Ayuntamiento +STR_TOWN_VIEW_LOCAL_AUTHORITY_TOOLTIP :{BLACK}Mostrar información sobre el ayuntamiento local +STR_TOWN_VIEW_RENAME_TOOLTIP :{BLACK}Cambiar nombre del pueblo + +STR_TOWN_VIEW_EXPAND_BUTTON :{BLACK}Aumentar +STR_TOWN_VIEW_EXPAND_TOOLTIP :{BLACK}Aumentar la población del pueblo +STR_TOWN_VIEW_DELETE_BUTTON :{BLACK}Eliminar +STR_TOWN_VIEW_DELETE_TOOLTIP :{BLACK}Eliminar este pueblo completamente + +STR_TOWN_VIEW_RENAME_TOWN_BUTTON :Cambiar nombre + +# Town local authority window +STR_LOCAL_AUTHORITY_CAPTION :{WHITE}Ayuntamiento de {TOWN} +STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}Evaluación de empresas de transporte: +STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING} +STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}Acciones disponibles: +STR_LOCAL_AUTHORITY_ACTIONS_TOOLTIP :{BLACK}Lista de acciones que pueden llevarse a cabo en este pueblo. Clic en un elemento de la lista para obtener más detalles +STR_LOCAL_AUTHORITY_DO_IT_BUTTON :{BLACK}Realizar +STR_LOCAL_AUTHORITY_DO_IT_TOOLTIP :{BLACK}Llevar a cabo la acción elegida de la lista + +STR_LOCAL_AUTHORITY_ACTION_SMALL_ADVERTISING_CAMPAIGN :Pequeña campaña publicitaria +STR_LOCAL_AUTHORITY_ACTION_MEDIUM_ADVERTISING_CAMPAIGN :Mediana campaña publicitaria +STR_LOCAL_AUTHORITY_ACTION_LARGE_ADVERTISING_CAMPAIGN :Gran campaña publicitaria +STR_LOCAL_AUTHORITY_ACTION_ROAD_RECONSTRUCTION :Pagar la reconstrucción de las carreteras locales +STR_LOCAL_AUTHORITY_ACTION_STATUE_OF_COMPANY :Poner una estatua al dueño de la empresa +STR_LOCAL_AUTHORITY_ACTION_NEW_BUILDINGS :Pagar la construcción de nuevos edificios +STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Comprar los derechos exclusivos de transporte +STR_LOCAL_AUTHORITY_ACTION_BRIBE :Sobornar al ayuntamiento + +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Iniciar una pequeña campaña publicitaria local para atraer más pasajeros y cargamento a tus servicios de transporte.{}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Iniciar una campaña publicitaria local mediana para atraer más pasajeros y cargamento a tus servicios de transporte.{}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Iniciar una gran campaña publicitaria local para atraer más pasajeros y cargamento a tus servicios de transporte.{}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Pagar la reconstrucción de las carreteras locales. Provoca considerables complicaciones al tráfico durante 6 meses.{}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Construir una estatua en honor a tu empresa.{}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Pagar la construcción de nuevos edificios comerciales en el pueblo.{}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Comprar la exclusividad de los derechos de servicio de transporte en este pueblo durante un año. El ayuntamiento solo permitirá el uso de las estaciones pertenecientes a tu empresa.{}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Sobornar al ayuntamiento para aumentar mejorar tu evaluación, con el riesgo de una severa penalización si llegas a ser descubierto.{}Costo: {CURRENCY_LONG} + +# Goal window +STR_GOALS_CAPTION :{WHITE}Metas de {COMPANY} +STR_GOALS_SPECTATOR_CAPTION :{WHITE}Metas globales +STR_GOALS_GLOBAL_TITLE :{BLACK}Metas globales: +STR_GOALS_TEXT :{ORANGE}{STRING} +STR_GOALS_NONE :{ORANGE}- Ninguna - +STR_GOALS_SPECTATOR_NONE :{ORANGE}- No aplica - +STR_GOALS_PROGRESS :{ORANGE}{STRING} +STR_GOALS_PROGRESS_COMPLETE :{GREEN}{STRING} +STR_GOALS_COMPANY_TITLE :{BLACK}Metas de la empresa +STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Clic en una meta para centrar la vista principal en la casilla, industria o pueblo. Ctrl+Clic abre una nueva ventana de vista en dicha ubicación + +# Goal question window +STR_GOAL_QUESTION_CAPTION_QUESTION :Pregunta +STR_GOAL_QUESTION_CAPTION_INFORMATION :Información +STR_GOAL_QUESTION_CAPTION_WARNING :Advertencia +STR_GOAL_QUESTION_CAPTION_ERROR :Error + +############ Start of Goal Question button list +STR_GOAL_QUESTION_BUTTON_CANCEL :Cancelar +STR_GOAL_QUESTION_BUTTON_OK :Aceptar +STR_GOAL_QUESTION_BUTTON_NO :No +STR_GOAL_QUESTION_BUTTON_YES :Sí +STR_GOAL_QUESTION_BUTTON_DECLINE :Rechazar +STR_GOAL_QUESTION_BUTTON_ACCEPT :Aceptar +STR_GOAL_QUESTION_BUTTON_IGNORE :Ignorar +STR_GOAL_QUESTION_BUTTON_RETRY :Reintentar +STR_GOAL_QUESTION_BUTTON_PREVIOUS :Anterior +STR_GOAL_QUESTION_BUTTON_NEXT :Siguiente +STR_GOAL_QUESTION_BUTTON_STOP :Detener +STR_GOAL_QUESTION_BUTTON_START :Comenzar +STR_GOAL_QUESTION_BUTTON_GO :Ir +STR_GOAL_QUESTION_BUTTON_CONTINUE :Continuar +STR_GOAL_QUESTION_BUTTON_RESTART :Reiniciar +STR_GOAL_QUESTION_BUTTON_POSTPONE :Posponer +STR_GOAL_QUESTION_BUTTON_SURRENDER :Rendirse +STR_GOAL_QUESTION_BUTTON_CLOSE :Cerrar +############ End of Goal Question button list + +# Subsidies window +STR_SUBSIDIES_CAPTION :{WHITE}Subsidios +STR_SUBSIDIES_OFFERED_TITLE :{BLACK}Se ofrecen subsidios al servicio que lleve: +STR_SUBSIDIES_OFFERED_FROM_TO :{ORANGE}{STRING} desde {STRING} a {STRING}{YELLOW} (antes de {DATE_SHORT}) +STR_SUBSIDIES_NONE :{ORANGE}- Ninguno - +STR_SUBSIDIES_SUBSIDISED_TITLE :{BLACK}Servicios con subsidio: +STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING} desde {STRING} a {STRING}{YELLOW} ({COMPANY}{YELLOW}, hasta {DATE_SHORT}) +STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Clic en un servicio para centrar la vista principal en esta industria o pueblo. Ctrl+Clic abre una ventana de vista en dicha ubicación + +# Story book window +STR_STORY_BOOK_CAPTION :{WHITE}Historial de {COMPANY} +STR_STORY_BOOK_SPECTATOR_CAPTION :{WHITE}Historial global +STR_STORY_BOOK_TITLE :{YELLOW}{STRING} +STR_STORY_BOOK_GENERIC_PAGE_ITEM :Página {NUM} +STR_STORY_BOOK_SEL_PAGE_TOOLTIP :{BLACK}Permitir ir a una página específica al elegirla en esta lista desplegable +STR_STORY_BOOK_PREV_PAGE :{BLACK}Anterior +STR_STORY_BOOK_PREV_PAGE_TOOLTIP :{BLACK}Ir a la página anterior +STR_STORY_BOOK_NEXT_PAGE :{BLACK}Siguiente +STR_STORY_BOOK_NEXT_PAGE_TOOLTIP :{BLACK}Ir a la siguiente página +STR_STORY_BOOK_INVALID_GOAL_REF :{RED}Referencia a objetivos no válida + +# Station list window +STR_STATION_LIST_TOOLTIP :{BLACK}Nombres de estaciones: Clic en un nombre para centrar la vista principal en la estación. Ctrl+Clic abre una ventana de vista en dicha ubicación +STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE :{BLACK}Mantener pulsado Ctrl para seleccionar más de un elemento +STR_STATION_LIST_CAPTION :{WHITE}{COMPANY}: {COMMA} estaci{P ón ones} +STR_STATION_LIST_STATION :{YELLOW}{STATION} {STATION_FEATURES} +STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOINT} +STR_STATION_LIST_NONE :{YELLOW}- Ninguna - +STR_STATION_LIST_SELECT_ALL_FACILITIES :{BLACK}Elegir todos los tipos de estación +STR_STATION_LIST_SELECT_ALL_TYPES :{BLACK}Elegir todos los tipos de cargamento (incluidos los que no estén en espera) +STR_STATION_LIST_NO_WAITING_CARGO :{BLACK}Ningún tipo de cargamento está esperando + +# Station view window +STR_STATION_VIEW_CAPTION :{WHITE}{STATION} {STATION_FEATURES} +STR_STATION_VIEW_WAITING_CARGO :{WHITE}{CARGO_LONG} +STR_STATION_VIEW_EN_ROUTE_FROM :{YELLOW}({CARGO_SHORT} en camino desde {STATION}) +STR_STATION_VIEW_RESERVED :{YELLOW}({CARGO_SHORT} reservado para cargar) + +STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Acepta +STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Lista de cargamento aceptado +STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Acepta: {WHITE}{CARGO_LIST} + +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Esta estación tiene los derechos exclusivos de transporte en este pueblo. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} compró los derechos exclusivos de transporte en este pueblo. + +STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Evaluación +STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Ver evaluación de la estación +STR_STATION_VIEW_SUPPLY_RATINGS_TITLE :{BLACK}Suministro mensual y evaluación local: +STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}: {YELLOW}{COMMA}/{STRING} ({COMMA}%) + +STR_STATION_VIEW_GROUP :{BLACK}Agrupar por +STR_STATION_VIEW_WAITING_STATION :Estación: Esperando +STR_STATION_VIEW_WAITING_AMOUNT :Cantidad: Esperando +STR_STATION_VIEW_PLANNED_STATION :Estación: Planeado +STR_STATION_VIEW_PLANNED_AMOUNT :Cantidad: Planeado +STR_STATION_VIEW_FROM :{YELLOW}{CARGO_SHORT} desde {STATION} +STR_STATION_VIEW_VIA :{YELLOW}{CARGO_SHORT} pasando por {STATION} +STR_STATION_VIEW_TO :{YELLOW}{CARGO_SHORT} a {STATION} +STR_STATION_VIEW_FROM_ANY :{RED}{CARGO_SHORT} desde estación desconocida +STR_STATION_VIEW_TO_ANY :{RED}{CARGO_SHORT} a cualquier estación +STR_STATION_VIEW_VIA_ANY :{RED}{CARGO_SHORT} pasando por cualquier estación +STR_STATION_VIEW_FROM_HERE :{GREEN}{CARGO_SHORT} con salida desde esta estación +STR_STATION_VIEW_VIA_HERE :{GREEN}{CARGO_SHORT} se detendrá en esta estación +STR_STATION_VIEW_TO_HERE :{GREEN}{CARGO_SHORT} a esta estación +STR_STATION_VIEW_NONSTOP :{YELLOW}{CARGO_SHORT} sin paradas + +STR_STATION_VIEW_GROUP_S_V_D :Origen-Ruta-Destino +STR_STATION_VIEW_GROUP_S_D_V :Origen-Destino-Ruta +STR_STATION_VIEW_GROUP_V_S_D :Ruta-Origen-Destino +STR_STATION_VIEW_GROUP_V_D_S :Ruta-Destino-Origen +STR_STATION_VIEW_GROUP_D_S_V :Destino-Origen-Ruta +STR_STATION_VIEW_GROUP_D_V_S :Destino-Ruta-Origen + +############ range for rating starts +STR_CARGO_RATING_APPALLING :Espantosa +STR_CARGO_RATING_VERY_POOR :Atroz +STR_CARGO_RATING_POOR :Mala +STR_CARGO_RATING_MEDIOCRE :Mediocre +STR_CARGO_RATING_GOOD :Buena +STR_CARGO_RATING_VERY_GOOD :Muy buena +STR_CARGO_RATING_EXCELLENT :Excelente +STR_CARGO_RATING_OUTSTANDING :Excepcional +############ range for rating ends + +STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centrar vista en la ubicación de la estación. Ctrl+Clic abre una ventana de vista en dicha ubicación +STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Cambiar nombre de la estación + +STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Mostrar aquellos trenes que tienen esta estación en su itinerario +STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Mostrar aquellos vehículos de carretera que tienen esta parada en su itinerario +STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Mostrar aquellas aeronaves que tienen este aeropuerto en su horario +STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Mostrar aquellos barcos que tienen este muelle en su horario + +STR_STATION_VIEW_RENAME_STATION_CAPTION :Cambiar nombre de estación + +STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Cerrar aeropuerto +STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}No permitir que aterricen aviones en este aeropuerto + +# Waypoint/buoy view window +STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} +STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centrar vista en ubicación del punto guía. Ctrl+Clic abre una ventana de vista en dicha ubicación +STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Cambiar nombre de punto guía +STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrar la vista en la ubicación de la boya. Ctrl+Clic abre una ventana de vista en dicha ubicación +STR_BUOY_VIEW_CHANGE_BUOY_NAME :{BLACK}Cambiar nombre de boya + +STR_EDIT_WAYPOINT_NAME :{WHITE}Cambiar nombre de punto guía + +# Finances window +STR_FINANCES_CAPTION :{WHITE}Finanzas de {COMPANY} {BLACK}{COMPANY_NUM} +STR_FINANCES_EXPENDITURE_INCOME_TITLE :{WHITE}Gastos e ingresos +STR_FINANCES_YEAR :{WHITE}{NUM} +STR_FINANCES_SECTION_CONSTRUCTION :{GOLD}Construcción +STR_FINANCES_SECTION_NEW_VEHICLES :{GOLD}Nuevos vehículos +STR_FINANCES_SECTION_TRAIN_RUNNING_COSTS :{GOLD}Gastos de operación de trenes +STR_FINANCES_SECTION_ROAD_VEHICLE_RUNNING_COSTS :{GOLD}Gastos de operación de vehículos de carretera +STR_FINANCES_SECTION_AIRCRAFT_RUNNING_COSTS :{GOLD}Gastos de operación de aeronaves +STR_FINANCES_SECTION_SHIP_RUNNING_COSTS :{GOLD}Gastos de operación de barcos +STR_FINANCES_SECTION_PROPERTY_MAINTENANCE :{GOLD}Mantenimiento de propiedades +STR_FINANCES_SECTION_TRAIN_INCOME :{GOLD}Ingresos de trenes +STR_FINANCES_SECTION_ROAD_VEHICLE_INCOME :{GOLD}Ingresos de vehículos de carretera +STR_FINANCES_SECTION_AIRCRAFT_INCOME :{GOLD}Ingresos de aeronaves +STR_FINANCES_SECTION_SHIP_INCOME :{GOLD}Ingresos de barcos +STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Intereses por préstamo +STR_FINANCES_SECTION_OTHER :{GOLD}Otros +STR_FINANCES_NEGATIVE_INCOME :{BLACK}-{CURRENCY_LONG} +STR_FINANCES_POSITIVE_INCOME :{BLACK}+{CURRENCY_LONG} +STR_FINANCES_TOTAL_CAPTION :{WHITE}Total: +STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Saldo en banco +STR_FINANCES_LOAN_TITLE :{WHITE}Préstamo +STR_FINANCES_MAX_LOAN :{WHITE}Préstamo máximo: {BLACK}{CURRENCY_LONG} +STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} +STR_FINANCES_BORROW_BUTTON :{BLACK}Pedir préstamo de {CURRENCY_LONG} +STR_FINANCES_BORROW_TOOLTIP :{BLACK}Incrementar préstamo. Ctrl+Clic solicita todo el préstamo posible +STR_FINANCES_REPAY_BUTTON :{BLACK}Pagar préstamo de {CURRENCY_LONG} +STR_FINANCES_REPAY_TOOLTIP :{BLACK}Pagar parte del préstamo. Ctrl+Clic paga todo el préstamo posible +STR_FINANCES_INFRASTRUCTURE_BUTTON :{BLACK}Infraestructura + +# Company view +STR_COMPANY_VIEW_CAPTION :{WHITE}{COMPANY} {BLACK}{COMPANY_NUM} +STR_COMPANY_VIEW_PRESIDENT_MANAGER_TITLE :{WHITE}{PRESIDENT_NAME}{}{GOLD}(Presidente) + +STR_COMPANY_VIEW_INAUGURATED_TITLE :{GOLD}Inaugurada: {WHITE}{NUM} +STR_COMPANY_VIEW_COLOUR_SCHEME_TITLE :{GOLD}Cromática: +STR_COMPANY_VIEW_VEHICLES_TITLE :{GOLD}Vehículos: +STR_COMPANY_VIEW_TRAINS :{WHITE}{COMMA} tren{P "" es} +STR_COMPANY_VIEW_ROAD_VEHICLES :{WHITE}{COMMA} vehículo{P "" s} de carretera +STR_COMPANY_VIEW_AIRCRAFT :{WHITE}{COMMA} aeronave{P "" s} +STR_COMPANY_VIEW_SHIPS :{WHITE}{COMMA} barco{P "" s} +STR_COMPANY_VIEW_VEHICLES_NONE :{WHITE}Ninguno +STR_COMPANY_VIEW_COMPANY_VALUE :{GOLD}Valor de la empresa: {WHITE}{CURRENCY_LONG} +STR_COMPANY_VIEW_SHARES_OWNED_BY :{WHITE}({COMMA}% propiedad de {COMPANY}) +STR_COMPANY_VIEW_INFRASTRUCTURE :{GOLD}Infraestructura: +STR_COMPANY_VIEW_INFRASTRUCTURE_RAIL :{WHITE}{COMMA} tramo{P "" s} de vías férreas +STR_COMPANY_VIEW_INFRASTRUCTURE_ROAD :{WHITE}{COMMA} tramo{P "" s} de carretera +STR_COMPANY_VIEW_INFRASTRUCTURE_WATER :{WHITE}{COMMA} casilla{P "" s} de agua +STR_COMPANY_VIEW_INFRASTRUCTURE_STATION :{WHITE}{COMMA} casilla{P "" s} de estación +STR_COMPANY_VIEW_INFRASTRUCTURE_AIRPORT :{WHITE}{COMMA} aeropuerto{P "" s} +STR_COMPANY_VIEW_INFRASTRUCTURE_NONE :{WHITE}Ninguna + +STR_COMPANY_VIEW_BUILD_HQ_BUTTON :{BLACK}Construir sede +STR_COMPANY_VIEW_BUILD_HQ_TOOLTIP :{BLACK}Construir edificio de las oficinas centrales de la empresa +STR_COMPANY_VIEW_VIEW_HQ_BUTTON :{BLACK}Ver sede +STR_COMPANY_VIEW_VIEW_HQ_TOOLTIP :{BLACK}Ver edificio de las oficinas centrales de la empresa +STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Reubicar sede +STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Reubicar la sede de la empresa a cualquier otro lugar con el costo del 1% del valor total de la empresa. Mayús+Clic muestra una estimación del precio sin mover la sede +STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}Detalles +STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Ver informe detallado de infraestructura + +STR_COMPANY_VIEW_NEW_FACE_BUTTON :{BLACK}Nueva cara +STR_COMPANY_VIEW_NEW_FACE_TOOLTIP :{BLACK}Elegir nueva cara para el presidente +STR_COMPANY_VIEW_COLOUR_SCHEME_BUTTON :{BLACK}Cromática +STR_COMPANY_VIEW_COLOUR_SCHEME_TOOLTIP :{BLACK}Cambiar la cromática (colores corporativos) de los vehículos +STR_COMPANY_VIEW_COMPANY_NAME_BUTTON :{BLACK}Nombre empresa +STR_COMPANY_VIEW_COMPANY_NAME_TOOLTIP :{BLACK}Cambiar el nombre de la empresa +STR_COMPANY_VIEW_PRESIDENT_NAME_BUTTON :{BLACK}Nombre presidente +STR_COMPANY_VIEW_PRESIDENT_NAME_TOOLTIP :{BLACK}Cambiar el nombre del presidente + +STR_COMPANY_VIEW_BUY_SHARE_BUTTON :{BLACK}Comprar un 25% de las acciones +STR_COMPANY_VIEW_SELL_SHARE_BUTTON :{BLACK}Vender 25% de las acciones +STR_COMPANY_VIEW_BUY_SHARE_TOOLTIP :{BLACK}Comprar 25% de las acciones de esta empresa. Mayús+Clic muestra una estimación del precio sin comprar ninguna acción +STR_COMPANY_VIEW_SELL_SHARE_TOOLTIP :{BLACK}Vender 25% de las acciones de esta empresa. Mayús+Clic muestra una estimación del beneficio sin vender ninguna acción + +STR_COMPANY_VIEW_COMPANY_NAME_QUERY_CAPTION :Nombre de la empresa +STR_COMPANY_VIEW_PRESIDENT_S_NAME_QUERY_CAPTION :Nombre del presidente + +STR_BUY_COMPANY_MESSAGE :{WHITE}Buscamos una empresa de transportes que quiera adquirir la nuestra.{}{}¿Comprar {COMPANY} por {CURRENCY_LONG}? + +# Company infrastructure window +STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infraestructura de {COMPANY} +STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Tramos de vías férreas: +STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Señales +STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Tramos de carretera: +STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Carretera +STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tranvía +STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Casillas de agua: +STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Canales +STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Estaciones: +STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS :{WHITE}Casillas de estaciones +STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS :{WHITE}Aeropuertos +STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL :{WHITE}{CURRENCY_LONG}/año + +# 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}% 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}% 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! + +############ range for requires starts +STR_INDUSTRY_VIEW_REQUIRES_CARGO :{BLACK}Requiere: {YELLOW}{STRING}{STRING} +STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Requiere: {YELLOW}{STRING}{STRING}, {STRING}{STRING} +STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Requiere: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} +############ range for requires ends + +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Requiere: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} esperando{STRING} + +############ range for produces starts +STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produce: {YELLOW}{STRING}{STRING} +STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Produce: {YELLOW}{STRING}{STRING}, {STRING}{STRING} +############ range for produces ends + +STR_CONFIG_GAME_PRODUCTION :{WHITE}Cambiar producción (múltiplo de 8, máximo 2040) +STR_CONFIG_GAME_PRODUCTION_LEVEL :{WHITE}Cambiar nivel de producción (porcentaje, máximo 800%) + +# Vehicle lists +STR_VEHICLE_LIST_TRAIN_CAPTION :{WHITE}{STRING}: {COMMA} tren{P "" es} +STR_VEHICLE_LIST_ROAD_VEHICLE_CAPTION :{WHITE}{STRING}: {COMMA} vehículo{P "" s} de carretera +STR_VEHICLE_LIST_SHIP_CAPTION :{WHITE}{STRING}: {COMMA} barco{P "" s} +STR_VEHICLE_LIST_AIRCRAFT_CAPTION :{WHITE}{STRING}: {COMMA} aeronave{P "" s} + +STR_VEHICLE_LIST_TRAIN_LIST_TOOLTIP :{BLACK}Trenes: Clic en un tren para más información +STR_VEHICLE_LIST_ROAD_VEHICLE_TOOLTIP :{BLACK}Vehículos de carretera: Clic en un vehículo para más información +STR_VEHICLE_LIST_SHIP_TOOLTIP :{BLACK}Barcos: Clic en un barco para más información +STR_VEHICLE_LIST_AIRCRAFT_TOOLTIP :{BLACK}Aeronave: Clic en una aeronave para más información + +STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Utilidad este año: {CURRENCY_LONG} (año pasado: {CURRENCY_LONG}) + +STR_VEHICLE_LIST_AVAILABLE_TRAINS :Trenes disponibles +STR_VEHICLE_LIST_AVAILABLE_ROAD_VEHICLES :Vehículos de carretera disponibles +STR_VEHICLE_LIST_AVAILABLE_SHIPS :Barcos disponibles +STR_VEHICLE_LIST_AVAILABLE_AIRCRAFT :Aeronaves disponibles +STR_VEHICLE_LIST_AVAILABLE_ENGINES_TOOLTIP :{BLACK}Ver la lista de modelos disponibles para este tipo de vehículo + +STR_VEHICLE_LIST_MANAGE_LIST :{BLACK}Administrar lista +STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Enviar instrucciones a todos los vehículos de la lista +STR_VEHICLE_LIST_REPLACE_VEHICLES :Reemplazar vehículos +STR_VEHICLE_LIST_SEND_FOR_SERVICING :Enviar a mantenimiento + +STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Enviar a depósito +STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Enviar a depósito +STR_VEHICLE_LIST_SEND_SHIP_TO_DEPOT :Enviar a astillero +STR_VEHICLE_LIST_SEND_AIRCRAFT_TO_HANGAR :Enviar al hangar + +STR_VEHICLE_LIST_MASS_STOP_LIST_TOOLTIP :{BLACK}Clic para detener todos los vehículos de la lista +STR_VEHICLE_LIST_MASS_START_LIST_TOOLTIP :{BLACK}Clic para poner en marcha todos los vehículos de la lista + +STR_VEHICLE_LIST_SHARED_ORDERS_LIST_CAPTION :{WHITE}Órdenes compartidas por {COMMA} vehículo{P "" s} + +# Group window +STR_GROUP_ALL_TRAINS :Todos los trenes +STR_GROUP_ALL_ROAD_VEHICLES :Todos los vehículos de carretera +STR_GROUP_ALL_SHIPS :Todos los barcos +STR_GROUP_ALL_AIRCRAFTS :Todas las aeronaves + +STR_GROUP_DEFAULT_TRAINS :Trenes sin agrupar +STR_GROUP_DEFAULT_ROAD_VEHICLES :Vehículos de carretera sin agrupar +STR_GROUP_DEFAULT_SHIPS :Barcos sin agrupar +STR_GROUP_DEFAULT_AIRCRAFTS :Aeronaves sin agrupar + +STR_GROUPS_CLICK_ON_GROUP_FOR_TOOLTIP :{BLACK}Grupos: Clic en un grupo para ver los vehículos incluidos. Arrastrar y soltar para reorganizar los grupos. +STR_GROUP_CREATE_TOOLTIP :{BLACK}Clic para crear un grupo +STR_GROUP_DELETE_TOOLTIP :{BLACK}Eliminar el grupo seleccionado +STR_GROUP_RENAME_TOOLTIP :{BLACK}Cambiar nombre del grupo seleccionado +STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Clic para evitar que los vehículos en este grupo se reemplacen automáticamente. + +STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Eliminar grupo +STR_GROUP_DELETE_QUERY_TEXT :{WHITE}¿Eliminar este grupo y todos sus subgrupos? + +STR_GROUP_ADD_SHARED_VEHICLE :Añadir vehículos con órdenes compartidas +STR_GROUP_REMOVE_ALL_VEHICLES :Quitar todos los vehículos + +STR_GROUP_RENAME_CAPTION :{BLACK}Cambiar nombre del grupo + +STR_GROUP_PROFIT_THIS_YEAR :Ganancias de este año: +STR_GROUP_PROFIT_LAST_YEAR :Ganancias del año pasado: +STR_GROUP_OCCUPANCY :Uso actual: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + +# Build vehicle window +STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nuevos trenes +STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nuevos trenes eléctricos +STR_BUY_VEHICLE_TRAIN_MONORAIL_CAPTION :Nuevos monorrieles +STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :Nuevos trenes maglev + +STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Nuevos trenes +STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Nuevos vehículos de carretera +STR_BUY_VEHICLE_SHIP_CAPTION :Nuevos barcos +STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Nuevas aeronaves + +STR_PURCHASE_INFO_COST_WEIGHT :{BLACK}Costo: {GOLD}{CURRENCY_LONG}{BLACK} Peso: {GOLD}{WEIGHT_SHORT} +STR_PURCHASE_INFO_SPEED_POWER :{BLACK}Velocidad: {GOLD}{VELOCITY}{BLACK} Potencia: {GOLD}{POWER} +STR_PURCHASE_INFO_SPEED :{BLACK}Velocidad: {GOLD}{VELOCITY} +STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}Velocidad en océano: {GOLD}{VELOCITY} +STR_PURCHASE_INFO_SPEED_CANAL :{BLACK}Velocidad en canales y ríos: {GOLD}{VELOCITY} +STR_PURCHASE_INFO_RUNNINGCOST :{BLACK}Costo de operación: {GOLD}{CURRENCY_LONG}/año +STR_PURCHASE_INFO_CAPACITY :{BLACK}Capacidad: {GOLD}{CARGO_LONG} {STRING} +STR_PURCHASE_INFO_REFITTABLE :(reequipable) +STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Diseñado: {GOLD}{NUM}{BLACK} Duración: {GOLD}{COMMA} año{P "" s} +STR_PURCHASE_INFO_RELIABILITY :{BLACK}Máx. fiabilidad: {GOLD}{COMMA}% +STR_PURCHASE_INFO_COST :{BLACK}Costo: {GOLD}{CURRENCY_LONG} +STR_PURCHASE_INFO_WEIGHT_CWEIGHT :{BLACK}Peso: {GOLD}{WEIGHT_SHORT} ({WEIGHT_SHORT}) +STR_PURCHASE_INFO_COST_SPEED :{BLACK}Costo: {GOLD}{CURRENCY_LONG}{BLACK} Velocidad: {GOLD}{VELOCITY} +STR_PURCHASE_INFO_AIRCRAFT_CAPACITY :{BLACK}Capacidad: {GOLD}{CARGO_LONG}, {CARGO_LONG} +STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK}Vagones con motor: {GOLD}+{POWER}{BLACK} Peso: {GOLD}+{WEIGHT_SHORT} +STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Reforma: {GOLD}{STRING} +STR_PURCHASE_INFO_ALL_TYPES :Todo tipo de carga +STR_PURCHASE_INFO_ALL_BUT :Todo excepto {CARGO_LIST} +STR_PURCHASE_INFO_MAX_TE :{BLACK}Máx. fuerza de tracción: {GOLD}{FORCE} +STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Alcance: {GOLD}{COMMA} casillas +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Tipo de aeronave: {GOLD}{STRING} + +STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista de selección trenes. Clic en un tren para más información. Ctrl+Clic para mostrar u ocultar el tipo de tren +STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Lista de selección de vehículos de carretera. Clic en un vehículo para más información. Ctrl+Clic para mostrar u ocultar el tipo del vehículo +STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Lista de selección de barcos. Clic en un barco para más información. Ctrl+Clic para mostrar u ocultar el tipo de barco +STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lista de selección de aeronaves. Clic en un aeronave para más información. Ctrl+Clic para mostrar u ocultar el tipo de aeronave + +STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_BUTTON :{BLACK}Comprar +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_BUTTON :{BLACK}Comprar +STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Comprar +STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Comprar + +STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar el tren elegido. Mayús+Clic muestra una estimación del precio sin realizar la compra +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar el vehículo de carretera elegido. Mayús+Clic muestra una estimación del precio sin realizar la compra +STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar el barco elegido. Mayús+Clic muestra una estimación del precio sin realizar la compra +STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar la aeronave elegida. Mayús+Clic muestra una estimación del precio sin realizar la compra + +STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Cambiar nombre +STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_BUTTON :{BLACK}Cambiar nombre +STR_BUY_VEHICLE_SHIP_RENAME_BUTTON :{BLACK}Cambiar nombre +STR_BUY_VEHICLE_AIRCRAFT_RENAME_BUTTON :{BLACK}Cambiar nombre + +STR_BUY_VEHICLE_TRAIN_RENAME_TOOLTIP :{BLACK}Cambiar el nombre a este tipo de tren +STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_TOOLTIP :{BLACK}Cambiar el nombre a este tipo de vehículo +STR_BUY_VEHICLE_SHIP_RENAME_TOOLTIP :{BLACK}Cambiar el nombre a este tipo de barco +STR_BUY_VEHICLE_AIRCRAFT_RENAME_TOOLTIP :{BLACK}Cambiar el nombre a este tipo de aeronave + +STR_BUY_VEHICLE_TRAIN_HIDE_TOGGLE_BUTTON :{BLACK}Ocultar +STR_BUY_VEHICLE_ROAD_VEHICLE_HIDE_TOGGLE_BUTTON :{BLACK}Ocultar +STR_BUY_VEHICLE_SHIP_HIDE_TOGGLE_BUTTON :{BLACK}Ocultar +STR_BUY_VEHICLE_AIRCRAFT_HIDE_TOGGLE_BUTTON :{BLACK}Ocultar + +STR_BUY_VEHICLE_TRAIN_SHOW_TOGGLE_BUTTON :{BLACK}Mostrar +STR_BUY_VEHICLE_ROAD_VEHICLE_SHOW_TOGGLE_BUTTON :{BLACK}Mostrar +STR_BUY_VEHICLE_SHIP_SHOW_TOGGLE_BUTTON :{BLACK}Mostrar +STR_BUY_VEHICLE_AIRCRAFT_SHOW_TOGGLE_BUTTON :{BLACK}Mostrar + +STR_BUY_VEHICLE_TRAIN_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Mostrar u ocultar este tipo de tren +STR_BUY_VEHICLE_ROAD_VEHICLE_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Mostrar u ocultar este tipo de vehículo de carretera +STR_BUY_VEHICLE_SHIP_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Mostrar u ocultar este tipo de barco +STR_BUY_VEHICLE_AIRCRAFT_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Mostrar u ocultar este tipo de aeronave + +STR_QUERY_RENAME_TRAIN_TYPE_CAPTION :{WHITE}Cambiar el nombre del tren +STR_QUERY_RENAME_ROAD_VEHICLE_TYPE_CAPTION :{WHITE}Cambiar el nombre del vehículo de carretera +STR_QUERY_RENAME_SHIP_TYPE_CAPTION :{WHITE}Cambiar el nombre del barco +STR_QUERY_RENAME_AIRCRAFT_TYPE_CAPTION :{WHITE}Cambiar el nombre de la aeronave + +# Depot window +STR_DEPOT_CAPTION :{WHITE}{DEPOT} + +STR_DEPOT_RENAME_TOOLTIP :{BLACK}Cambiar nombre del depósito +STR_DEPOT_RENAME_DEPOT_CAPTION :Cambiar nombre del depósito + +STR_DEPOT_NO_ENGINE :{BLACK}- +STR_DEPOT_VEHICLE_TOOLTIP :{BLACK}{ENGINE}{STRING} +STR_DEPOT_VEHICLE_TOOLTIP_CHAIN :{BLACK}{NUM} vehículo{P "" s}{STRING} +STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG} ({CARGO_SHORT}) + +STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Trenes: arrastrar vehículos de ferrocarril con Clic izquierdo para añadirlos o quitarlos del tren. Clic derecho para más información. Mantener pulsado Ctrl para usar estos comandos con el resto del tren +STR_DEPOT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Vehículos de carretera: Clic derecho para más información +STR_DEPOT_SHIP_LIST_TOOLTIP :{BLACK}Barcos: Clic derecho en barco para más información +STR_DEPOT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Aeronaves: Clic derecho en la aeronave para más información + +STR_DEPOT_TRAIN_SELL_TOOLTIP :{BLACK}Arrastrar aquí un vehículo para venderlo +STR_DEPOT_ROAD_VEHICLE_SELL_TOOLTIP :{BLACK}Arrastrar aquí el vehículo de carretera para venderlo +STR_DEPOT_SHIP_SELL_TOOLTIP :{BLACK}Arrastrar aquí el barco para venderlo +STR_DEPOT_AIRCRAFT_SELL_TOOLTIP :{BLACK}Arrastrar aquí la aeronave para venderla + +STR_DEPOT_DRAG_WHOLE_TRAIN_TO_SELL_TOOLTIP :{BLACK}Arrastrar aquí la locomotora para vender todo el tren + +STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TOOLTIP :{BLACK}Vender todos los trenes del depósito +STR_DEPOT_SELL_ALL_BUTTON_ROAD_VEHICLE_TOOLTIP :{BLACK}Vender todos los vehículos de carretera del depósito +STR_DEPOT_SELL_ALL_BUTTON_SHIP_TOOLTIP :{BLACK}Vender todos los barcos del astillero +STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TOOLTIP :{BLACK}Vender todas las aeronaves del hangar + +STR_DEPOT_AUTOREPLACE_TRAIN_TOOLTIP :{BLACK}Reemplazar automáticamente todos los trenes en el depósito +STR_DEPOT_AUTOREPLACE_ROAD_VEHICLE_TOOLTIP :{BLACK}Reemplazar automáticamente todos los vehículos de carretera en el depósito +STR_DEPOT_AUTOREPLACE_SHIP_TOOLTIP :{BLACK}Reemplazar automáticamente todos los barcos en el astillero +STR_DEPOT_AUTOREPLACE_AIRCRAFT_TOOLTIP :{BLACK}Reemplaza automáticamente todas las aeronaves en el hangar + +STR_DEPOT_TRAIN_NEW_VEHICLES_BUTTON :{BLACK}Nuevo tren +STR_DEPOT_ROAD_VEHICLE_NEW_VEHICLES_BUTTON :{BLACK}Nuevo vehículo +STR_DEPOT_SHIP_NEW_VEHICLES_BUTTON :{BLACK}Nuevo barco +STR_DEPOT_AIRCRAFT_NEW_VEHICLES_BUTTON :{BLACK}Nueva aeronave + +STR_DEPOT_TRAIN_NEW_VEHICLES_TOOLTIP :{BLACK}Comprar nuevo tren +STR_DEPOT_ROAD_VEHICLE_NEW_VEHICLES_TOOLTIP :{BLACK}Comprar nuevo vehículo de carretera +STR_DEPOT_SHIP_NEW_VEHICLES_TOOLTIP :{BLACK}Comprar nuevo barco +STR_DEPOT_AIRCRAFT_NEW_VEHICLES_TOOLTIP :{BLACK}Comprar nueva aeronave + +STR_DEPOT_CLONE_TRAIN :{BLACK}Clonar +STR_DEPOT_CLONE_ROAD_VEHICLE :{BLACK}Clonar +STR_DEPOT_CLONE_SHIP :{BLACK}Clonar +STR_DEPOT_CLONE_AIRCRAFT :{BLACK}Clonar + +STR_DEPOT_CLONE_TRAIN_DEPOT_INFO :{BLACK}Esto comprará una copia idéntica del tren, incluyendo todos sus vagones y carros. Clic en este botón y después en el tren a copiar. Ctrl+Clic para compartir las órdenes. Mayús+Clic muestra una estimación del precio sin realizar la compra +STR_DEPOT_CLONE_ROAD_VEHICLE_DEPOT_INFO :{BLACK}Esto comprará una copia idéntica del vehículo de carretera. Clic en este botón y después en el vehículo a copiar. Ctrl+Clic para compartir las órdenes. Mayús+Clic muestra una estimación del precio sin realizar la compra +STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Esto comprará una copia idéntica del barco. Clic en este botón y después en el barco a copiar. Ctrl+Clic para compartir las órdenes. Mayús+Clic muestra una estimación del precio sin realizar la compra +STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Esto comprará una copia idéntica de la aeronave. Clic en este botón y después en la aeronave a copiar. Ctrl+Clic para compartir las órdenes. Mayús+Clic muestra una estimación del precio sin realizar la compra + +STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Centrar vista en la ubicación del depósito de trenes. Ctrl+Clic abre una ventana de vista en dicha ubicación +STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Centrar vista en la ubicación del depósito de vehículos. Ctrl+Clic abre una ventana de vista en dicha ubicación +STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Centrar vista en la ubicación del astillero. Ctrl+Clic abre una ventana de vista en dicha ubicación +STR_DEPOT_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Centrar vista en la ubicación del hangar. Ctrl+Clic abre una ventana de vista en dicha ubicación + +STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TOOLTIP :{BLACK}Listar todos los trenes que tengan alguna orden de ir a este depósito +STR_DEPOT_VEHICLE_ORDER_LIST_ROAD_VEHICLE_TOOLTIP :{BLACK}Listar todos los vehículos que tengan alguna orden de ir a este depósito +STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TOOLTIP :{BLACK}Listar todos los barcos que tengan alguna orden de ir a este astillero +STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TOOLTIP :{BLACK}Listar todas las aeronaves que tengan alguna orden de ir a este hangar + +STR_DEPOT_MASS_STOP_DEPOT_TRAIN_TOOLTIP :{BLACK}Clic para detener todos los trenes que hay en el depósito +STR_DEPOT_MASS_STOP_DEPOT_ROAD_VEHICLE_TOOLTIP :{BLACK}Clic para detener todos los vehículos que hay en el depósito +STR_DEPOT_MASS_STOP_DEPOT_SHIP_TOOLTIP :{BLACK}Clic para detener todos los barcos que hay en el astillero +STR_DEPOT_MASS_STOP_HANGAR_TOOLTIP :{BLACK}Clic para detener todas las aeronaves que hay en el hangar + +STR_DEPOT_MASS_START_DEPOT_TRAIN_TOOLTIP :{BLACK}Clic para poner en marcha todos los trenes que hay en el depósito +STR_DEPOT_MASS_START_DEPOT_ROAD_VEHICLE_TOOLTIP :{BLACK}Clic para poner en marcha todos los vehículos que hay en el depósito +STR_DEPOT_MASS_START_DEPOT_SHIP_TOOLTIP :{BLACK}Clic para poner en marcha todos los barcos que hay en el astillero +STR_DEPOT_MASS_START_HANGAR_TOOLTIP :{BLACK}Clic para despegar todas las aeronaves que hay en el hangar + +STR_DEPOT_SELL_CONFIRMATION_TEXT :{YELLOW}Se venderán todos los vehículos que hay en este depósito. ¿Proceder? + +# Engine preview window +STR_ENGINE_PREVIEW_CAPTION :{WHITE}Mensaje del fabricante de vehículos +STR_ENGINE_PREVIEW_MESSAGE :{GOLD}Hemos diseñado un{G "" a} nuev{G o a} {STRING}. ¿Le interesaría el uso exclusivo de este vehículo por un año para que podamos probar su desempeño antes de lanzarlo al público? +STR_ENGINE_PREVIEW_RAILROAD_LOCOMOTIVE :{G=f}locomotora +STR_ENGINE_PREVIEW_ROAD_VEHICLE :{G=m}vehículo de carretera +STR_ENGINE_PREVIEW_AIRCRAFT :{G=f}aeronave +STR_ENGINE_PREVIEW_SHIP :{G=m}barco +STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :{G=f}locomotora de monorriel +STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :{G=f}locomotora maglev + +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Costo: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocidad: {VELOCITY} Potencia: {POWER}{}Costo de operación: {CURRENCY_LONG}/año{}Capacidad: {CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Costo: {CURRENCY_LONG} Peso: {WEIGHT_SHORT}{}Velocidad: {VELOCITY} Potencia: {POWER} Máx. F.T.: {6:FORCE}{}Costo de operación: {4:CURRENCY_LONG}/año{}Capacidad: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Costo: {CURRENCY_LONG} Velocidad máx.: {VELOCITY}{}Capacidad: {CARGO_LONG}{}Costo de mantenimiento: {CURRENCY_LONG}/año +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Costo: {CURRENCY_LONG} Vel. máx.: {VELOCITY}{}Tipo de aeronave: {STRING}{}Capacidad: {CARGO_LONG}, {CARGO_LONG}{}Costo de operación: {CURRENCY_LONG} al año +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Costo: {CURRENCY_LONG} Vel. máx.: {VELOCITY}{}Tipo de aeronave: {STRING}{}Capacidad: {CARGO_LONG}{}Costo de operación: {CURRENCY_LONG} al año +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Costo: {CURRENCY_LONG} Vel. máx.: {VELOCITY}{}Tipo de aeronave: {STRING} Alcance: {COMMA} casillas{}Capacidad: {CARGO_LONG}, {CARGO_LONG}{}Costo de operación: {CURRENCY_LONG} al año +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Costo: {CURRENCY_LONG} Vel. máx.: {VELOCITY}{}Tipo de aeronave: {STRING} Alcance: {COMMA} tiles{}Capacidad: {CARGO_LONG}{}Costo de operación: {CURRENCY_LONG} al año + +# Autoreplace window +STR_REPLACE_VEHICLES_WHITE :{WHITE}Reemplazar {STRING} - {STRING} +STR_REPLACE_VEHICLE_TRAIN :Tren +STR_REPLACE_VEHICLE_ROAD_VEHICLE :Vehículo de carretera +STR_REPLACE_VEHICLE_SHIP :Barco +STR_REPLACE_VEHICLE_AIRCRAFT :Aeronave + +STR_REPLACE_VEHICLE_VEHICLES_IN_USE :{YELLOW}Vehículos en uso +STR_REPLACE_VEHICLE_VEHICLES_IN_USE_TOOLTIP :{BLACK}Esta columna muestra los vehículos ya adquiridos +STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES :{YELLOW}Vehículos disponibles +STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES_TOOLTIP :{BLACK}Esta columna muestra los vehículos disponibles para realizar el reemplazo + +STR_REPLACE_HELP_LEFT_ARRAY :{BLACK}Elegir el tipo de vehículo a reemplazar +STR_REPLACE_HELP_RIGHT_ARRAY :{BLACK}Elegir el nuevo tipo de vehículo que reemplazará al vehículo elegido a la izquierda + +STR_REPLACE_VEHICLES_START :{BLACK}Iniciar proceso de reemplazo +STR_REPLACE_VEHICLES_NOW :Reemplazar todos los vehículos ahora +STR_REPLACE_VEHICLES_WHEN_OLD :Reemplazar sólo los vehículos viejos +STR_REPLACE_HELP_START_BUTTON :{BLACK}Clic para reemplazar el vehículo elegido a la izquierda por el elegido a la derecha +STR_REPLACE_NOT_REPLACING :{BLACK}Reemplazo no iniciado +STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED :{BLACK}No hay vehículos elegidos +STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} cuando esté viejo +STR_REPLACE_VEHICLES_STOP :{BLACK}Dejar de reemplazar vehículos +STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Presionar este botón para detener el reemplazo del vehículo situado a la izquierda + +STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Cambiar entre reemplazo de vagón y locomotora +STR_REPLACE_ENGINES :Locomotoras +STR_REPLACE_WAGONS :Vagones +STR_REPLACE_ALL_RAILTYPE :Todos los vehículos ferroviarios + +STR_REPLACE_HELP_RAILTYPE :{BLACK}Elegir el tipo de vías férreas para las que se desea reemplazar locomotoras +STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Mostrar el vehículo que reemplazará al otro de la izquierda +STR_REPLACE_RAIL_VEHICLES :Trenes +STR_REPLACE_ELRAIL_VEHICLES :Trenes eléctricos +STR_REPLACE_MONORAIL_VEHICLES :Trenes de monorriel +STR_REPLACE_MAGLEV_VEHICLES :Trenes maglev + +STR_REPLACE_REMOVE_WAGON :{BLACK}Quitar vagón: {ORANGE}{STRING} +STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Hacer que el reemplazo automático mantenga la longitud del tren quitando vagones (empezando por el frente), si el cambio de locomotora produce un tren más largo + +# Vehicle view +STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE} + +STR_VEHICLE_VIEW_TRAIN_LOCATION_TOOLTIP :{BLACK}Centrar la vista en la ubicación del tren. Ctrl+Clic sigue al tren en la vista principal +STR_VEHICLE_VIEW_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Centrar vista en la ubicación del vehículo. Ctrl+Clic sigue al vehículo en la vista principal +STR_VEHICLE_VIEW_SHIP_LOCATION_TOOLTIP :{BLACK}Centrar vista en la ubicación del barco. Ctrl+Clic sigue al barco en la vista principal +STR_VEHICLE_VIEW_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Centrar vista en la ubicación de la aeronave. Ctrl+Clic sigue a la aeronave en la vista principal + +STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Enviar tren al depósito. Ctrl+Clic para realizar solamente mantenimiento +STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}Enviar vehículo al depósito. Ctrl+Clic para realizar solamente mantenimiento +STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Enviar barco al astillero. Ctrl+Clic para realizar solamente mantenimiento +STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}Enviar aeronave al hangar. Ctrl+Clic para realizar solamente mantenimiento + +STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}Esto comprará una copia idéntica del tren, incluyendo todos sus vagones y carros. Clic en este botón y después en el tren a copiar. Ctrl+Clic para compartir las órdenes. Mayús+Clic muestra una estimación del precio sin realizar la compra +STR_VEHICLE_VIEW_CLONE_ROAD_VEHICLE_INFO :{BLACK}Esto comprará una copia idéntica del vehículo. Clic en este botón y después en el tren a copiar. Ctrl+Clic para compartir las órdenes. Mayús+Clic muestra una estimación del precio sin realizar la compra +STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}Esto comprará una copia idéntica del barco. Clic en este botón y después en el tren a copiar. Ctrl+Clic para compartir las órdenes. Mayús+Clic muestra una estimación del precio sin realizar la compra +STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Esto comprará una copia idéntica de la aeronave. Clic en este botón y después en el tren a copiar. Ctrl+Clic para compartir las órdenes. Mayús+Clic muestra una estimación del precio sin realizar la compra + +STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}Forzar al tren a proceder sin esperar a que la señal le ceda vía libre + +STR_VEHICLE_VIEW_TRAIN_REFIT_TOOLTIP :{BLACK}Reformar tren para transportar otro tipo de cargamento +STR_VEHICLE_VIEW_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Reformar vehículo de carretera para transportar otro tipo de cargamento +STR_VEHICLE_VIEW_SHIP_REFIT_TOOLTIP :{BLACK}Reformar barco para que transporte otro tipo de cargamento +STR_VEHICLE_VIEW_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Reformar aeronave para llevar otro tipo de cargamento + +STR_VEHICLE_VIEW_TRAIN_REVERSE_TOOLTIP :{BLACK}Cambiar dirección del tren +STR_VEHICLE_VIEW_ROAD_VEHICLE_REVERSE_TOOLTIP :{BLACK}Forzar al vehículo a girar en sentido opuesto + +STR_VEHICLE_VIEW_TRAIN_ORDERS_TOOLTIP :{BLACK}Ver órdenes del tren. Ctrl+Clic muestra su itinerario +STR_VEHICLE_VIEW_ROAD_VEHICLE_ORDERS_TOOLTIP :{BLACK}Ver órdenes del vehículo Ctrl+Clic muestra su itinerario +STR_VEHICLE_VIEW_SHIP_ORDERS_TOOLTIP :{BLACK}Ver órdenes del barco. Ctrl+Clic muestra su itinerario +STR_VEHICLE_VIEW_AIRCRAFT_ORDERS_TOOLTIP :{BLACK}Ver órdenes de la aeronave. Ctrl+Clic muestra su itinerario + +STR_VEHICLE_VIEW_TRAIN_SHOW_DETAILS_TOOLTIP :{BLACK}Ver detalles del tren +STR_VEHICLE_VIEW_ROAD_VEHICLE_SHOW_DETAILS_TOOLTIP :{BLACK}Ver detalles del vehículo +STR_VEHICLE_VIEW_SHIP_SHOW_DETAILS_TOOLTIP :{BLACK}Ver detalles del barco +STR_VEHICLE_VIEW_AIRCRAFT_SHOW_DETAILS_TOOLTIP :{BLACK}Ver detalles de la aeronave + +STR_VEHICLE_VIEW_TRAIN_STATE_START_STOP_TOOLTIP :{BLACK}Actividad del tren. Clic para detener o poner en marcha. Ctrl+Clic para desplazarse hasta el destino +STR_VEHICLE_VIEW_ROAD_VEHICLE_STATE_START_STOP_TOOLTIP :{BLACK}Actividad del vehículo. Clic para detener o poner en marcha. Ctrl+Clic para desplazarse hasta el destino +STR_VEHICLE_VIEW_SHIP_STATE_START_STOP_TOOLTIP :{BLACK}Actividad del barco. Clic para detener o poner en marcha. Ctrl+Clic para desplazarse hasta el destino +STR_VEHICLE_VIEW_AIRCRAFT_STATE_START_STOP_TOOLTIP :{BLACK}Actividad de la aeronave. Clic para aterrizar o despegar. Ctrl+Clic para desplazarse hasta el destino + +# Messages in the start stop button in the vehicle view +STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Cargando/Descargando +STR_VEHICLE_STATUS_LEAVING :{LTBLUE}Partiendo +STR_VEHICLE_STATUS_CRASHED :{RED}¡Accidentado! +STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}Averiado +STR_VEHICLE_STATUS_STOPPED :{RED}Detenido +STR_VEHICLE_STATUS_TRAIN_STOPPING_VEL :{RED}Deteniéndose, {VELOCITY} +STR_VEHICLE_STATUS_TRAIN_NO_POWER :{RED}Sin potencia +STR_VEHICLE_STATUS_TRAIN_STUCK :{ORANGE}Esperando ruta libre +STR_VEHICLE_STATUS_AIRCRAFT_TOO_FAR :{ORANGE}Muy lejos del próximo destino + +STR_VEHICLE_STATUS_HEADING_FOR_STATION_VEL :{LTBLUE}Hacia {STATION}, {VELOCITY} +STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}Sin órdenes, {VELOCITY} +STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Hacia {WAYPOINT}, {VELOCITY} +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}Hacia {DEPOT}, {VELOCITY} +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Mantenimiento en {DEPOT}, {VELOCITY} + +# Vehicle stopped/started animations +STR_VEHICLE_COMMAND_STOPPED_SMALL :{TINY_FONT}{RED}Detenido +STR_VEHICLE_COMMAND_STOPPED :{RED}Detenido +STR_VEHICLE_COMMAND_STARTED_SMALL :{TINY_FONT}{GREEN}En marcha +STR_VEHICLE_COMMAND_STARTED :{GREEN}En marcha + +# Vehicle details +STR_VEHICLE_DETAILS_CAPTION :{WHITE}{VEHICLE} (Detalles) +STR_VEHICLE_NAME_BUTTON :{BLACK}Nombre + +STR_VEHICLE_DETAILS_TRAIN_RENAME :{BLACK}Cambiar nombre +STR_VEHICLE_DETAILS_ROAD_VEHICLE_RENAME :{BLACK}Cambiar nombre +STR_VEHICLE_DETAILS_SHIP_RENAME :{BLACK}Cambiar nombre +STR_VEHICLE_DETAILS_AIRCRAFT_RENAME :{BLACK}Cambiar nombre + +STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Edad: {LTBLUE}{STRING}{BLACK} Costo de mantenimiento: {LTBLUE}{CURRENCY_LONG}/año +# The next two need to stay in this order +STR_VEHICLE_INFO_AGE :{COMMA} año{P "" s} ({COMMA}) +STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} año{P "" s} ({COMMA}) + +STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Velocidad máx.: {LTBLUE}{VELOCITY} +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Vel. máx.: {LTBLUE}{VELOCITY} {BLACK}Tipo de aeronave: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Vel. máx.: {LTBLUE}{VELOCITY} {BLACK}Tipo de aeronave: {LTBLUE}{STRING} {BLACK}Alcance: {LTBLUE}{COMMA} casillas +STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potencia: {LTBLUE}{POWER}{BLACK} Velocidad máx.: {LTBLUE}{VELOCITY} +STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Peso: {LTBLUE}{WEIGHT_SHORT} {BLACK}Potencia: {LTBLUE}{POWER}{BLACK} Velocidad máx.: {LTBLUE}{VELOCITY} {BLACK}F.T. máx.: {LTBLUE}{FORCE} + +STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Utilidad este año: {LTBLUE}{CURRENCY_LONG} (año pasado: {CURRENCY_LONG}) +STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Fiabilidad: {LTBLUE}{COMMA}% {BLACK}Averías desde el último mantenimiento: {LTBLUE}{COMMA} + +STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Construido: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY_LONG} +STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Capacidad: {LTBLUE}Ninguna{STRING} +STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacidad: {LTBLUE}{CARGO_LONG}{3:STRING} +STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacidad: {LTBLUE}{CARGO_LONG}{3:STRING} (×{4:NUM}) +STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Capacidad: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} + +STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Créditos por transferencia: {LTBLUE}{CURRENCY_LONG} + +STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS :{BLACK}Mantenimiento cada: {LTBLUE}{COMMA}{NBSP}días{BLACK} Último mantenimiento: {LTBLUE}{DATE_LONG} +STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Mantenimiento cada: {LTBLUE}{COMMA}%{BLACK} Último mantenimiento: {LTBLUE}{DATE_LONG} +STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}Incrementar el intervalo de mantenimiento 10 días. Ctrl+Clic para incrementar el intervalo de mantenimiento en 5 días +STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}Reducir intervalo de mantenimiento 10 días. Ctrl+Clic para reducir el intervalo de mantenimiento 5 días + +STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Cambiar tipo de intervalo de mantenimiento +STR_VEHICLE_DETAILS_DEFAULT :Predeterminado +STR_VEHICLE_DETAILS_DAYS :Días +STR_VEHICLE_DETAILS_PERCENT :Porcentaje + +STR_QUERY_RENAME_TRAIN_CAPTION :{WHITE}Cambiar nombre +STR_QUERY_RENAME_ROAD_VEHICLE_CAPTION :{WHITE}Cambiar nombre +STR_QUERY_RENAME_SHIP_CAPTION :{WHITE}Cambiar nombre +STR_QUERY_RENAME_AIRCRAFT_CAPTION :{WHITE}Cambiar nombre + +# Extra buttons for train details windows +STR_VEHICLE_DETAILS_TRAIN_ENGINE_BUILT_AND_VALUE :{LTBLUE}{ENGINE}{BLACK} Construido: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY_LONG} +STR_VEHICLE_DETAILS_TRAIN_WAGON_VALUE :{LTBLUE}{ENGINE}{BLACK} Valor: {LTBLUE}{CURRENCY_LONG} + +STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_TEXT :{BLACK}Capacidad total de este tren: +STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY :{LTBLUE}- {CARGO_LONG} ({CARGO_SHORT}) +STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_MULT :{LTBLUE}- {CARGO_LONG} ({CARGO_SHORT}) (×{NUM}) + +STR_VEHICLE_DETAILS_CARGO_EMPTY :{LTBLUE}Vacío +STR_VEHICLE_DETAILS_CARGO_FROM :{LTBLUE}{CARGO_LONG} desde {STATION} +STR_VEHICLE_DETAILS_CARGO_FROM_MULT :{LTBLUE}{CARGO_LONG} desde {STATION} (×{NUM}) + +STR_VEHICLE_DETAIL_TAB_CARGO :{BLACK}Cargamento +STR_VEHICLE_DETAILS_TRAIN_CARGO_TOOLTIP :{BLACK}Mostrar detalles de mercancía transportada +STR_VEHICLE_DETAIL_TAB_INFORMATION :{BLACK}Información +STR_VEHICLE_DETAILS_TRAIN_INFORMATION_TOOLTIP :{BLACK}Mostrar detalles de los vehículos +STR_VEHICLE_DETAIL_TAB_CAPACITIES :{BLACK}Capacidades +STR_VEHICLE_DETAILS_TRAIN_CAPACITIES_TOOLTIP :{BLACK}Mostrar capacidades de cada vehículo del tren +STR_VEHICLE_DETAIL_TAB_TOTAL_CARGO :{BLACK}Cargamento total +STR_VEHICLE_DETAILS_TRAIN_TOTAL_CARGO_TOOLTIP :{BLACK}Mostrar capacidad total del tren dividida por tipo de cargamento + +STR_VEHICLE_DETAILS_TRAIN_ARTICULATED_RV_CAPACITY :{BLACK}Capacidad: {LTBLUE} + +# Vehicle refit +STR_REFIT_CAPTION :{WHITE}{VEHICLE} (reformar) +STR_REFIT_TITLE :{GOLD}Elegir el nuevo tipo de cargamento: +STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Nueva capacidad: {GOLD}{CARGO_LONG}{}{BLACK}Costo por reformar: {RED}{CURRENCY_LONG} +STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}Nueva capacidad: {GOLD}{CARGO_LONG}{}{BLACK}Ingreso al reformar: {GREEN}{CURRENCY_LONG} +STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Nueva capacidad: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Costo por reformar: {RED}{CURRENCY_LONG} +STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Nueva capacidad: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Ingreso al reformar: {GREEN}{CURRENCY_LONG} +STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Elegir los vehículos de ferrocarril a reformar. Arrastrar con el ratón para elegir más de un vehículo. Clic en un espacio vacío para elegir el tren completo. Ctrl+Clic para elegir una unidad del tren y los vagones subsecuentes + +STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Elegir el tipo de cargamento para el tren +STR_REFIT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Elegir el tipo de cargamento para el vehículo de carretera +STR_REFIT_SHIP_LIST_TOOLTIP :{BLACK}Elegir el tipo de cargamento para el barco +STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Elegir el tipo de cargamento para la aeronave + +STR_REFIT_TRAIN_REFIT_BUTTON :{BLACK}Reformar tren +STR_REFIT_ROAD_VEHICLE_REFIT_BUTTON :{BLACK}Reformar vehículo de carretera +STR_REFIT_SHIP_REFIT_BUTTON :{BLACK}Reformar barco +STR_REFIT_AIRCRAFT_REFIT_BUTTON :{BLACK}Reformar aeronave + +STR_REFIT_TRAIN_REFIT_TOOLTIP :{BLACK}Reformar el tren para transportar el cargamento elegido +STR_REFIT_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Reformar el vehículo de carretera para transportar el cargamento elegido +STR_REFIT_SHIP_REFIT_TOOLTIP :{BLACK}Reformar el barco para transportar el cargamento elegido +STR_REFIT_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Reformar la aeronave para transportar el cargamento elegido + +# Order view +STR_ORDERS_CAPTION :{WHITE}{VEHICLE} (Órdenes) +STR_ORDERS_TIMETABLE_VIEW :{BLACK}Itinerario +STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Cambiar a la ventana de itinerarios + +STR_ORDERS_LIST_TOOLTIP :{BLACK}Lista de órdenes: Clic en una orden para resaltarla. Ctrl+Clic para desplazarse a la estación indicada en la orden +STR_ORDER_INDEX :{COMMA}:{NBSP} +STR_ORDER_TEXT :{STRING} {STRING} {STRING} + +STR_ORDERS_END_OF_ORDERS :- - Fin de órdenes - - +STR_ORDERS_END_OF_SHARED_ORDERS :- - Fin de órdenes compartidas - - + +# Order bottom buttons +STR_ORDER_NON_STOP :{BLACK}Sin paradas +STR_ORDER_GO_TO :Ir a +STR_ORDER_GO_NON_STOP_TO :Ir sin paradas a +STR_ORDER_GO_VIA :Pasar por +STR_ORDER_GO_NON_STOP_VIA :Ir sin paradas por +STR_ORDER_TOOLTIP_NON_STOP :{BLACK}Cambiar la forma de parada en la orden resaltada + +STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}Llenar cualquiera +STR_ORDER_DROP_LOAD_IF_POSSIBLE :Cargar si hay disponible +STR_ORDER_DROP_FULL_LOAD_ALL :Llenar todo +STR_ORDER_DROP_FULL_LOAD_ANY :Llenar cualquiera +STR_ORDER_DROP_NO_LOADING :No cargar +STR_ORDER_TOOLTIP_FULL_LOAD :{BLACK}Cambiar la forma de carga en la orden resaltada + +STR_ORDER_TOGGLE_UNLOAD :{BLACK}Descargar todo +STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :Descargar si es aceptado +STR_ORDER_DROP_UNLOAD :Descargar todo +STR_ORDER_DROP_TRANSFER :Transferir +STR_ORDER_DROP_NO_UNLOADING :No descargar +STR_ORDER_TOOLTIP_UNLOAD :{BLACK}Cambiar la forma de descarga en la orden resaltada + +STR_ORDER_REFIT :{BLACK}Reformar +STR_ORDER_REFIT_TOOLTIP :{BLACK}Elegir el tipo de cargamento a reformar en esta orden. Ctrl+Clic para eliminar la orden +STR_ORDER_REFIT_AUTO :{BLACK}Reformar en estación +STR_ORDER_REFIT_AUTO_TOOLTIP :{BLACK}Elegir el tipo de cargamento a reformar en esta orden. Ctrl+Clic para eliminar la orden. Reformar solo es posible si el vehículo lo permite +STR_ORDER_DROP_REFIT_AUTO :Cargamento fijo +STR_ORDER_DROP_REFIT_AUTO_ANY :Cargamento disponible + +STR_ORDER_SERVICE :{BLACK}Mantenimiento +STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ir siempre +STR_ORDER_DROP_SERVICE_DEPOT :Mantto. si es necesario +STR_ORDER_DROP_HALT_DEPOT :Detenerse +STR_ORDER_SERVICE_TOOLTIP :{BLACK}Ignorar esta orden a menos que el mantenimiento sea necesario + +STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Datos del vehículo para órdenes condicionales + +# Conditional order variables, must follow order of OrderConditionVariable enum +STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE :Porcentaje de carga +STR_ORDER_CONDITIONAL_RELIABILITY :Fiabilidad +STR_ORDER_CONDITIONAL_MAX_SPEED :Velocidad máxima +STR_ORDER_CONDITIONAL_AGE :Edad (años) +STR_ORDER_CONDITIONAL_REQUIRES_SERVICE :Requiere mantenimiento +STR_ORDER_CONDITIONAL_UNCONDITIONALLY :Siempre +STR_ORDER_CONDITIONAL_REMAINING_LIFETIME :Tiempo de vida restante (años) + +STR_ORDER_CONDITIONAL_COMPARATOR_TOOLTIP :{BLACK}Comparación de los datos del vehículo respecto al valor dado +STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS :es igual a +STR_ORDER_CONDITIONAL_COMPARATOR_NOT_EQUALS :no es igual a +STR_ORDER_CONDITIONAL_COMPARATOR_LESS_THAN :es menor que +STR_ORDER_CONDITIONAL_COMPARATOR_LESS_EQUALS :es menor o igual que +STR_ORDER_CONDITIONAL_COMPARATOR_MORE_THAN :es mayor que +STR_ORDER_CONDITIONAL_COMPARATOR_MORE_EQUALS :es mayor o igual a +STR_ORDER_CONDITIONAL_COMPARATOR_IS_TRUE :es verdadero +STR_ORDER_CONDITIONAL_COMPARATOR_IS_FALSE :es falso + +STR_ORDER_CONDITIONAL_VALUE_TOOLTIP :{BLACK}El valor contra el cual comparar de los datos del vehículo +STR_ORDER_CONDITIONAL_VALUE_CAPT :{WHITE}Indicar el valor a comparar + +STR_ORDERS_SKIP_BUTTON :{BLACK}Ignorar +STR_ORDERS_SKIP_TOOLTIP :{BLACK}Ignorar la orden actual y proceder con la siguiente. Ctrl+Clic para iniciar la orden resaltada + +STR_ORDERS_DELETE_BUTTON :{BLACK}Eliminar +STR_ORDERS_DELETE_TOOLTIP :{BLACK}Eliminar orden resaltada +STR_ORDERS_DELETE_ALL_TOOLTIP :{BLACK}Eliminar todas las órdenes +STR_ORDERS_STOP_SHARING_BUTTON :{BLACK}Dejar de compartir +STR_ORDERS_STOP_SHARING_TOOLTIP :{BLACK}Dejar de compartir la lista de órdenes. Ctrl+Clic elimina también todas las órdenes de este vehículo + +STR_ORDERS_GO_TO_BUTTON :{BLACK}Ir a +STR_ORDER_GO_TO_NEAREST_DEPOT :Ir al depósito más cercano +STR_ORDER_GO_TO_NEAREST_HANGAR :Ir al hangar más cercano +STR_ORDER_CONDITIONAL :Salto de orden condicional +STR_ORDER_SHARE :Compartir órdenes +STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Añadir nueva orden antes de la orden marcada o añadirla al final de la lista. Ctrl+Clic sobre una estación para establecer la orden a 'Cargar máx. cualquier carga', sobre un punto guía para 'Sin paradas' y sobre un depósito para 'Mantenimiento' (esta última desactivará el mantenimiento automático). Ctrl+Clic sobre otro vehículo para hacer que ambos compartan siempre las mismas órdenes. Clic sobre un vehículo para copiar sus órdenes (sin compartirlas). + +STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Ver todos los vehículos que comparten el mismo itinerario + +# String parts to build the order string +STR_ORDER_GO_TO_WAYPOINT :Ir pasando por {WAYPOINT} +STR_ORDER_GO_NON_STOP_TO_WAYPOINT :Ir sin paradas pasando por {WAYPOINT} + +STR_ORDER_SERVICE_AT :Mantenimiento en +STR_ORDER_SERVICE_NON_STOP_AT :Ir a sin paradas a mantenimiento en + +STR_ORDER_NEAREST_DEPOT :el más cercano +STR_ORDER_NEAREST_HANGAR :el hangar más cercano +STR_ORDER_TRAIN_DEPOT :depósito de trenes +STR_ORDER_ROAD_VEHICLE_DEPOT :depósito de vehículos de carretera +STR_ORDER_SHIP_DEPOT :astillero de barcos +STR_ORDER_GO_TO_NEAREST_DEPOT_FORMAT :{STRING} {STRING} {STRING} +STR_ORDER_GO_TO_DEPOT_FORMAT :{STRING} {DEPOT} + +STR_ORDER_REFIT_ORDER :(Reformar a {STRING}) +STR_ORDER_REFIT_STOP_ORDER :(Reformar a {STRING} y detenerse) +STR_ORDER_STOP_ORDER :(Detenerse) + +STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} + +STR_ORDER_IMPLICIT :(Implícito) + +STR_ORDER_FULL_LOAD :(Llenar todo) +STR_ORDER_FULL_LOAD_ANY :(Llenar cualquiera) +STR_ORDER_NO_LOAD :(No cargar) +STR_ORDER_UNLOAD :(Descargar y cargar) +STR_ORDER_UNLOAD_FULL_LOAD :(Descargar y llenar todo) +STR_ORDER_UNLOAD_FULL_LOAD_ANY :(Descargar y llenar cualquiera) +STR_ORDER_UNLOAD_NO_LOAD :(Descargar y dejar vacío) +STR_ORDER_TRANSFER :(Transferir y cargar) +STR_ORDER_TRANSFER_FULL_LOAD :(Transferir y llenar) +STR_ORDER_TRANSFER_FULL_LOAD_ANY :(Transferir y llenar cualquiera) +STR_ORDER_TRANSFER_NO_LOAD :(Transferir y dejar vacío) +STR_ORDER_NO_UNLOAD :(No descargar y cargar) +STR_ORDER_NO_UNLOAD_FULL_LOAD :(No descargar y llenar todo) +STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY :(No descargar y llenar cualquiera) +STR_ORDER_NO_UNLOAD_NO_LOAD :(No descargar ni cargar) + +STR_ORDER_AUTO_REFIT :(Reformar a {STRING}) +STR_ORDER_FULL_LOAD_REFIT :(Llenar todo y reformar a{STRING}) +STR_ORDER_FULL_LOAD_ANY_REFIT :(Llenar cualquiera y reformar a {STRING}) +STR_ORDER_UNLOAD_REFIT :(Descargar y cargar con reforma a {STRING}) +STR_ORDER_UNLOAD_FULL_LOAD_REFIT :(Descargar y llenar todo con reforma a {STRING}) +STR_ORDER_UNLOAD_FULL_LOAD_ANY_REFIT :(Descargar y llenar cualquiera con reforma a {STRING}) +STR_ORDER_TRANSFER_REFIT :(Transferir y cargar con reforma a {STRING}) +STR_ORDER_TRANSFER_FULL_LOAD_REFIT :(Transferir y llenar con reforma a {STRING}) +STR_ORDER_TRANSFER_FULL_LOAD_ANY_REFIT :(Transferir y llenar cualquiera con reforma a {STRING}) +STR_ORDER_NO_UNLOAD_REFIT :(No descargar y cargar con reforma a {STRING}) +STR_ORDER_NO_UNLOAD_FULL_LOAD_REFIT :(No descargar y llenar todo con reforma a {STRING}) +STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY_REFIT :(No descargar y llenar cualquiera con reforma a {STRING}) + +STR_ORDER_AUTO_REFIT_ANY :cargamento disponible + +STR_ORDER_STOP_LOCATION_NEAR_END :[principio] +STR_ORDER_STOP_LOCATION_MIDDLE :[centro] +STR_ORDER_STOP_LOCATION_FAR_END :[fondo] + +STR_ORDER_OUT_OF_RANGE :{RED} (El siguiente destino está muy lejos) + +STR_ORDER_CONDITIONAL_UNCONDITIONAL :Saltar a orden {COMMA} +STR_ORDER_CONDITIONAL_NUM :Saltar a orden {COMMA} cuando {STRING} {STRING} {COMMA} +STR_ORDER_CONDITIONAL_TRUE_FALSE :Saltar a orden {COMMA} cuando {STRING} {STRING} + +STR_INVALID_ORDER :{RED} (Orden no válida) + +# Time table window +STR_TIMETABLE_TITLE :{WHITE}{VEHICLE} (Itinerarios) +STR_TIMETABLE_ORDER_VIEW :{BLACK}Órdenes +STR_TIMETABLE_ORDER_VIEW_TOOLTIP :{BLACK}Cambiar a la ventana de órdenes + +STR_TIMETABLE_TOOLTIP :{BLACK}Itinerarios: Clic en una orden para marcarla + +STR_TIMETABLE_NO_TRAVEL :No viajar +STR_TIMETABLE_NOT_TIMETABLEABLE :Viajar (automático; programado por la próxima orden manual) +STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :Viajar (no programado) +STR_TIMETABLE_TRAVEL_NOT_TIMETABLED_SPEED :Viajar (no programado) a {2:VELOCITY} como máximo +STR_TIMETABLE_TRAVEL_FOR :Viajar durante {STRING} +STR_TIMETABLE_TRAVEL_FOR_SPEED :Viajar durante {STRING} a {VELOCITY} como máximo +STR_TIMETABLE_TRAVEL_FOR_ESTIMATED :Viajar (durante {STRING}, no programado) +STR_TIMETABLE_TRAVEL_FOR_SPEED_ESTIMATED :Viajar (durante {STRING}, no programado) a {VELOCITY} como máximo +STR_TIMETABLE_STAY_FOR_ESTIMATED :(esperar {STRING}, no programado) +STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(viajar {STRING}, no programado) +STR_TIMETABLE_STAY_FOR :y esperar {STRING} +STR_TIMETABLE_AND_TRAVEL_FOR :y viajar {STRING} +STR_TIMETABLE_DAYS :{COMMA}{NBSP}día{P "" s} +STR_TIMETABLE_TICKS :{COMMA}{NBSP}tick{P "" s} + +STR_TIMETABLE_TOTAL_TIME :{BLACK}El itinerario completo se recorre en {STRING} +STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}El itinerario completo se recorre en {STRING} (no todo programado) + +STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Este vehículo va a tiempo +STR_TIMETABLE_STATUS_LATE :{BLACK}Este vehículo va retrasado por {STRING} +STR_TIMETABLE_STATUS_EARLY :{BLACK}Este vehículo va adelantado por {STRING} +STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Este itinerario no ha comenzado +STR_TIMETABLE_STATUS_START_AT :{BLACK}Este itinerario comenzará el {STRING} + +STR_TIMETABLE_STARTING_DATE :{BLACK}Fecha de inicio +STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Elegir una fecha de inicio del itinerario. Ctrl+Clic para establecer el inicio del itinerario y distribuir uniformemente todos los demás vehículos que lo compartan, siempre y cuando esté programado completamente + +STR_TIMETABLE_CHANGE_TIME :{BLACK}Cambiar tiempo +STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Cambiar la cantidad de tiempo para la orden elegida + +STR_TIMETABLE_CLEAR_TIME :{BLACK}Borrar tiempo +STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Borrar la cantidad de tiempo para la orden elegida + +STR_TIMETABLE_CHANGE_SPEED :{BLACK}Cambiar límite de velocidad +STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Cambiar el límite de velocidad para la orden elegida + +STR_TIMETABLE_CLEAR_SPEED :{BLACK}Borrar límite de velocidad +STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Borrar el límite de velocidad para la orden elegida + +STR_TIMETABLE_RESET_LATENESS :{BLACK}Reiniciar retrasos +STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Reiniciar el contador del retraso para que el vehículo vaya a tiempo + +STR_TIMETABLE_AUTOFILL :{BLACK}Llenar automáticamente +STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Llenar la tabla de itinerarios automáticamente con los valores del siguiente recorrido (Ctrl+Clic para intentar mantener los tiempos de espera) + +STR_TIMETABLE_EXPECTED :{BLACK}Esperado +STR_TIMETABLE_SCHEDULED :{BLACK}Programado +STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Cambiar entre esperado y programado + +STR_TIMETABLE_ARRIVAL_ABBREVIATION :Lleg: +STR_TIMETABLE_DEPARTURE_ABBREVIATION :Sal: + + +# Date window (for timetable) +STR_DATE_CAPTION :{WHITE}Elegir fecha +STR_DATE_SET_DATE :{BLACK}Elegir fecha +STR_DATE_SET_DATE_TOOLTIP :{BLACK}Usar la fecha elegida como fecha inicial del itinerario +STR_DATE_DAY_TOOLTIP :{BLACK}Elegir día +STR_DATE_MONTH_TOOLTIP :{BLACK}Elegir mes +STR_DATE_YEAR_TOOLTIP :{BLACK}Elegir año + + +# AI debug window +STR_AI_DEBUG :{WHITE}Depuración de scripts de IA y juego +STR_AI_DEBUG_NAME_AND_VERSION :{BLACK}{STRING} (v{NUM}) +STR_AI_DEBUG_NAME_TOOLTIP :{BLACK}Nombre del script +STR_AI_DEBUG_SETTINGS :{BLACK}Configuración +STR_AI_DEBUG_SETTINGS_TOOLTIP :{BLACK}Cambiar la configuración del script +STR_AI_DEBUG_RELOAD :{BLACK}Volver a cargar código +STR_AI_DEBUG_RELOAD_TOOLTIP :{BLACK}Eliminar la IA, volver a cargar el código y reiniciar la IA +STR_AI_DEBUG_BREAK_STR_ON_OFF_TOOLTIP :{BLACK}Activar o desactivar interrupción cuando un mensaje de log de la IA coincida con la cadena de interrupción +STR_AI_DEBUG_BREAK_ON_LABEL :{BLACK}Interrumpir en: +STR_AI_DEBUG_BREAK_STR_OSKTITLE :{BLACK}Pausar cuando el script registre esta cadena +STR_AI_DEBUG_BREAK_STR_TOOLTIP :{BLACK}Cuando un mensaje de log de una IA coincida con esta cadena, poner el juego en pausa +STR_AI_DEBUG_MATCH_CASE :{BLACK}Distinguir mayúsculas +STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}Activar o desactivar la distinción de mayúsculas al comparar los mensajes del log de la IA con la cadena de interrupción +STR_AI_DEBUG_CONTINUE :{BLACK}Continuar +STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}Quitar la pausa y hacer que la IA continúe +STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}Mostrar salida de depuración de esta IA +STR_AI_GAME_SCRIPT :{BLACK}Script de juego +STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}Analizar el registro del script de juego + +STR_ERROR_AI_NO_AI_FOUND :No se encontró IA apropiada para cargar.{}Esta es una IA predeterminada que no realiza ninguna acción.{}Se pueden descargar nuevas IA a través del sistema de 'Contenido en línea' +STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Uno de los scripts ejecutados ha fallado. Por favor, informa del fallo al autor del script con una captura de la ventana de depuración +STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}La ventana de depuración de scripts solo está disponible para el servidor + +# AI configuration window +STR_AI_CONFIG_CAPTION :{WHITE}Configuración de scripts +STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Script de juego que será cargado en la próxima partida +STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Scripts de IA que serán cargados la próxima partida +STR_AI_CONFIG_HUMAN_PLAYER :Jugador humano +STR_AI_CONFIG_RANDOM_AI :IA aleatoria +STR_AI_CONFIG_NONE :(ninguno) + +STR_AI_CONFIG_MOVE_UP :{BLACK}Mover hacia arriba +STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Mover la IA elegida una posición hacia arriba +STR_AI_CONFIG_MOVE_DOWN :{BLACK}Mover hacia abajo +STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Mover la IA elegida una posición hacia abajo + +STR_AI_CONFIG_GAMESCRIPT :{SILVER}Script de juego +STR_AI_CONFIG_AI :{SILVER}IA + +STR_AI_CONFIG_CHANGE :{BLACK}Seleccionar {STRING} +STR_AI_CONFIG_CHANGE_NONE : +STR_AI_CONFIG_CHANGE_AI :IA +STR_AI_CONFIG_CHANGE_GAMESCRIPT :Script de juego +STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Cargar otro script +STR_AI_CONFIG_CONFIGURE :{BLACK}Configurar +STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configurar los parámetros del script + +# Available AIs window +STR_AI_LIST_CAPTION :{WHITE}Disponible {STRING} +STR_AI_LIST_CAPTION_AI :Lista de IA +STR_AI_LIST_CAPTION_GAMESCRIPT :Scripts de juego +STR_AI_LIST_TOOLTIP :{BLACK}Clic para elegir un script + +STR_AI_LIST_AUTHOR :{LTBLUE}Autor: {ORANGE}{STRING} +STR_AI_LIST_VERSION :{LTBLUE}Versión: {ORANGE}{NUM} +STR_AI_LIST_URL :{LTBLUE}URL: {ORANGE}{STRING} + +STR_AI_LIST_ACCEPT :{BLACK}Aceptar +STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Elegir el script marcado +STR_AI_LIST_CANCEL :{BLACK}Cancelar +STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}No cambiar de script + +# AI Parameters +STR_AI_SETTINGS_CAPTION :{WHITE}Parámetros {STRING} +STR_AI_SETTINGS_CAPTION_AI :IA +STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Script de juego +STR_AI_SETTINGS_CLOSE :{BLACK}Cerrar +STR_AI_SETTINGS_RESET :{BLACK}Reiniciar +STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} +STR_AI_SETTINGS_START_DELAY :Número de días a esperar antes de comenzar esta IA desde el momento en el que empezó la anterior: {ORANGE}{STRING} + + +# Textfile window +STR_TEXTFILE_README_CAPTION :{WHITE}Archivo Léeme del {STRING} {STRING} +STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}Registro de cambios del {STRING} {STRING} +STR_TEXTFILE_LICENCE_CAPTION :{WHITE}Licencia del {STRING} {STRING} +STR_TEXTFILE_WRAP_TEXT :{WHITE}Unir texto +STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Unir el texto de la ventana para que quepa sin tener que desplazarse +STR_TEXTFILE_VIEW_README :{BLACK}Ver archivo Léeme +STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Registro de cambios +STR_TEXTFILE_VIEW_LICENCE :{BLACK}Licencia + + +# Vehicle loading indicators +STR_PERCENT_UP_SMALL :{TINY_FONT}{WHITE}{NUM}%{UP_ARROW} +STR_PERCENT_UP :{WHITE}{NUM}%{UP_ARROW} +STR_PERCENT_DOWN_SMALL :{TINY_FONT}{WHITE}{NUM}%{DOWN_ARROW} +STR_PERCENT_DOWN :{WHITE}{NUM}%{DOWN_ARROW} +STR_PERCENT_UP_DOWN_SMALL :{TINY_FONT}{WHITE}{NUM}%{UP_ARROW}{DOWN_ARROW} +STR_PERCENT_UP_DOWN :{WHITE}{NUM}%{UP_ARROW}{DOWN_ARROW} +STR_PERCENT_NONE_SMALL :{TINY_FONT}{WHITE}{NUM}% +STR_PERCENT_NONE :{WHITE}{NUM}% + +# Income 'floats' +STR_INCOME_FLOAT_COST_SMALL :{TINY_FONT}{RED}Costo: {CURRENCY_LONG} +STR_INCOME_FLOAT_COST :{RED}Costo: {CURRENCY_LONG} +STR_INCOME_FLOAT_INCOME_SMALL :{TINY_FONT}{GREEN}Ingreso: {CURRENCY_LONG} +STR_INCOME_FLOAT_INCOME :{GREEN}Ingreso: {CURRENCY_LONG} +STR_FEEDER_TINY :{TINY_FONT}{YELLOW}Transferencia: {CURRENCY_LONG} +STR_FEEDER :{YELLOW}Transferencia: {CURRENCY_LONG} +STR_FEEDER_INCOME_TINY :{TINY_FONT}{YELLOW}Transferencia: {CURRENCY_LONG}{WHITE} / {GREEN}Utilidad: {CURRENCY_LONG} +STR_FEEDER_INCOME :{YELLOW}Transferencia: {CURRENCY_LONG}{WHITE} / {GREEN}Utilidad: {CURRENCY_LONG} +STR_FEEDER_COST_TINY :{TINY_FONT}{YELLOW}Transferencia: {CURRENCY_LONG}{WHITE} / {RED}Costo: {CURRENCY_LONG} +STR_FEEDER_COST :{YELLOW}Transferencia: {CURRENCY_LONG}{WHITE} / {RED}Costo: {CURRENCY_LONG} +STR_MESSAGE_ESTIMATED_COST :{WHITE}Costo estimado: {CURRENCY_LONG} +STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Ingreso estimado: {CURRENCY_LONG} + +# Saveload messages +STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Se sigue guardando la partida,{}¡por favor espera hasta que termine! +STR_ERROR_AUTOSAVE_FAILED :{WHITE}Error en guardado automático +STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}No es posible leer la unidad de disco +STR_ERROR_GAME_SAVE_FAILED :{WHITE}Error guardando partida{}{STRING} +STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}No es posible eliminar el archivo +STR_ERROR_GAME_LOAD_FAILED :{WHITE}Error al cargar partida{}{STRING} +STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Error interno: {STRING} +STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Archivo con errores - {STRING} +STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :La partida guardada es de una versión más reciente del juego +STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :No se puede leer el archivo +STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :No se puede escribir en el archivo +STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED :El análisis de integridad de los datos falló +STR_GAME_SAVELOAD_NOT_AVAILABLE : +STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}La partida fue guardada en una versión que no admite tranvías. Todos los tranvías serán eliminados + +# Map generation messages +STR_ERROR_COULD_NOT_CREATE_TOWN :{WHITE}Generación de mapa abortada...{}... no hay ubicaciones apropiadas para colocar pueblos +STR_ERROR_NO_TOWN_IN_SCENARIO :{WHITE}... no hay pueblos en el mapa + +STR_ERROR_PNGMAP :{WHITE}No se puede cargar mapa desde PNG... +STR_ERROR_PNGMAP_FILE_NOT_FOUND :{WHITE}... archivo no encontrado +STR_ERROR_PNGMAP_IMAGE_TYPE :{WHITE}... no se pudo convertir el tipo de imagen. Se requieren imágenes PNG de 8 o 24 bits +STR_ERROR_PNGMAP_MISC :{WHITE}... algo salió mal (quizá el archivo está dañado) + +STR_ERROR_BMPMAP :{WHITE}No se pudo cargar mapa desde BMP... +STR_ERROR_BMPMAP_IMAGE_TYPE :{WHITE}... no se pudo convertir el tipo de imagen + +STR_ERROR_HEIGHTMAP_TOO_LARGE :{WHITE}... la imagen es demasiado grande + +STR_WARNING_HEIGHTMAP_SCALE_CAPTION :{WHITE}Advertencia de escala +STR_WARNING_HEIGHTMAP_SCALE_MESSAGE :{YELLOW}No se recomienda cambiar demasiado el tamaño del mapa de origen. ¿Continuar de todos modos? + +# Soundset messages +STR_WARNING_FALLBACK_SOUNDSET :{WHITE}Solamente se encontraron sonidos de respaldo. Es posible instalar más sonidos a través del 'Contenido en línea' + +# Screenshot related messages +STR_WARNING_SCREENSHOT_SIZE_CAPTION :{WHITE}Captura de pantalla gigante +STR_WARNING_SCREENSHOT_SIZE_MESSAGE :{YELLOW}La captura de pantalla tendrá una resolución {COMMA}×{COMMA} pixeles. Realizar la captura puede llevar un tiempo. ¿Continuar? + +STR_MESSAGE_SCREENSHOT_SUCCESSFULLY :{WHITE}Captura de pantalla guardada exitosamente en '{STRING}' +STR_ERROR_SCREENSHOT_FAILED :{WHITE}¡La captura de pantalla falló! + +# Error message titles +STR_ERROR_MESSAGE_CAPTION :{YELLOW}Mensaje +STR_ERROR_MESSAGE_CAPTION_OTHER_COMPANY :{YELLOW}Mensaje de {STRING} + +# Generic construction errors +STR_ERROR_OFF_EDGE_OF_MAP :{WHITE}Fuera del borde del mapa +STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP :{WHITE}Demasiado cerca del borde del mapa +STR_ERROR_NOT_ENOUGH_CASH_REQUIRES_CURRENCY :{WHITE}No alcanza el dinero: se necesitan {CURRENCY_LONG} +STR_ERROR_FLAT_LAND_REQUIRED :{WHITE}Se requiere terreno plano +STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION :{WHITE}Tierra inclinada en dirección errónea +STR_ERROR_CAN_T_DO_THIS :{WHITE}No se puede hacer eso... +STR_ERROR_BUILDING_MUST_BE_DEMOLISHED :{WHITE}Primero se debe demoler el edificio +STR_ERROR_CAN_T_CLEAR_THIS_AREA :{WHITE}No se puede despejar esta zona... +STR_ERROR_SITE_UNSUITABLE :{WHITE}... lugar no apto +STR_ERROR_ALREADY_BUILT :{WHITE}... ya construido +STR_ERROR_OWNED_BY :{WHITE}... propiedad de {STRING} +STR_ERROR_AREA_IS_OWNED_BY_ANOTHER :{WHITE}... otra empresa es dueña de esta área +STR_ERROR_TERRAFORM_LIMIT_REACHED :{WHITE}... límite de modificación de terreno alcanzado +STR_ERROR_CLEARING_LIMIT_REACHED :{WHITE}... límite de casillas despejadas alcanzado +STR_ERROR_TREE_PLANT_LIMIT_REACHED :{WHITE}... limite de plantación de árboles alcanzado +STR_ERROR_NAME_MUST_BE_UNIQUE :{WHITE}El nombre debe ser único +STR_ERROR_GENERIC_OBJECT_IN_THE_WAY :{WHITE}{1:STRING} obstaculiza +STR_ERROR_NOT_ALLOWED_WHILE_PAUSED :{WHITE}No permitido en pausa + +# Local authority errors +STR_ERROR_LOCAL_AUTHORITY_REFUSES_TO_ALLOW_THIS :{WHITE}El ayuntamiento de {TOWN} se opone a esta acción +STR_ERROR_LOCAL_AUTHORITY_REFUSES_AIRPORT :{WHITE}El ayuntamiento de {TOWN} se opone a la construcción de otro aeropuerto en este pueblo +STR_ERROR_LOCAL_AUTHORITY_REFUSES_NOISE :{WHITE}El ayuntamiento de {TOWN} se opone a otorgar permiso para la construcción del aeropuerto debido a cuestiones de ruido +STR_ERROR_BRIBE_FAILED :{WHITE}El intento de soborno ha sido descubierto por un investigador de la zona + +# Levelling errors +STR_ERROR_CAN_T_RAISE_LAND_HERE :{WHITE}No se puede elevar el terreno aquí... +STR_ERROR_CAN_T_LOWER_LAND_HERE :{WHITE}No se puede disminuir el terreno aquí... +STR_ERROR_CAN_T_LEVEL_LAND_HERE :{WHITE}No se puede nivelar el terreno aquí... +STR_ERROR_EXCAVATION_WOULD_DAMAGE :{WHITE}La excavación dañaría el túnel +STR_ERROR_ALREADY_AT_SEA_LEVEL :{WHITE}... ya está al nivel del mar +STR_ERROR_TOO_HIGH :{WHITE}... demasiado alto +STR_ERROR_ALREADY_LEVELLED :{WHITE}... ya está plano +STR_ERROR_BRIDGE_TOO_HIGH_AFTER_LOWER_LAND :{WHITE}Después del cambio, el puente sobre este terreno será demasiado alto + +# Company related errors +STR_ERROR_CAN_T_CHANGE_COMPANY_NAME :{WHITE}No se puede cambiar el nombre de la empresa... +STR_ERROR_CAN_T_CHANGE_PRESIDENT :{WHITE}No se puede cambiar nombre del presidente... + +STR_ERROR_MAXIMUM_PERMITTED_LOAN :{WHITE}... el máximo préstamo permitido es de {CURRENCY_LONG} +STR_ERROR_CAN_T_BORROW_ANY_MORE_MONEY :{WHITE}No es posible pedir más préstamo... +STR_ERROR_LOAN_ALREADY_REPAYED :{WHITE}... no hay préstamo que pagar +STR_ERROR_CURRENCY_REQUIRED :{WHITE}... se requieren {CURRENCY_LONG} +STR_ERROR_CAN_T_REPAY_LOAN :{WHITE}No se puede pagar préstamo... +STR_ERROR_INSUFFICIENT_FUNDS :{WHITE}No se puede regalar dinero que fue prestado de un banco... +STR_ERROR_CAN_T_BUY_COMPANY :{WHITE}No se puede comprar la empresa... +STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS :{WHITE}No se puede construir la sede de la empresa... +STR_ERROR_CAN_T_BUY_25_SHARE_IN_THIS :{WHITE}No se puede comprar el 25% de acciones... +STR_ERROR_CAN_T_SELL_25_SHARE_IN :{WHITE}No se puede vender el 25% de acciones... +STR_ERROR_PROTECTED :{WHITE}Esta empresa es muy reciente para comerciar con acciones... + +# Town related errors +STR_ERROR_CAN_T_GENERATE_TOWN :{WHITE}No se puede crear ningún pueblo +STR_ERROR_CAN_T_RENAME_TOWN :{WHITE}No se puede cambiar nombre del pueblo... +STR_ERROR_CAN_T_FOUND_TOWN_HERE :{WHITE}No se puede crear pueblo aquí... +STR_ERROR_CAN_T_EXPAND_TOWN :{WHITE}No se puede expandir el pueblo... +STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... demasiado cerca del borde del mapa +STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... demasiado cerca de otro pueblo +STR_ERROR_TOO_MANY_TOWNS :{WHITE}... demasiados pueblos +STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... ya no hay espacio en el mapa +STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}El pueblo no construirá carreteras. La función de construcción de carreteras puede activarse en Configuración->Ambiente->Pueblos +STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Obras de carretera en progreso +STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}No se puede eliminar este pueblo...{}Quedan estaciones o depósitos relacionados con él, o una propiedad suya no puede ser retirada +STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... no hay ningún lugar apto para una estatua en el centro de este pueblo + +# Industry related errors +STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... demasiadas industrias +STR_ERROR_CAN_T_GENERATE_INDUSTRIES :{WHITE}No se pueden crear industrias... +STR_ERROR_CAN_T_BUILD_HERE :{WHITE}No se puede construir {STRING} aquí... +STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY :{WHITE}No se puede construir este tipo de industria aquí... +STR_ERROR_INDUSTRY_TOO_CLOSE :{WHITE}... demasiado cerca de otra industria +STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}... primero se debe crear al menos un pueblo +STR_ERROR_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}... solo se permite una por pueblo +STR_ERROR_CAN_ONLY_BE_BUILT_IN_TOWNS_WITH_POPULATION_OF_1200 :{WHITE}... solo se puede construir en pueblos de al menos 1,200 habitantes +STR_ERROR_CAN_ONLY_BE_BUILT_IN_RAINFOREST :{WHITE}... solo se puede construir en áreas de selva +STR_ERROR_CAN_ONLY_BE_BUILT_IN_DESERT :{WHITE}... solo se puede construir en áreas desérticas +STR_ERROR_CAN_ONLY_BE_BUILT_IN_TOWNS :{WHITE}... solo se puede construir en pueblos (reemplazando casas) +STR_ERROR_CAN_ONLY_BE_BUILT_NEAR_TOWN_CENTER :{WHITE}... solo se puede construir cerca del centro de un pueblo +STR_ERROR_CAN_ONLY_BE_BUILT_IN_LOW_AREAS :{WHITE}... solo se puede construir en zonas bajas +STR_ERROR_CAN_ONLY_BE_POSITIONED :{WHITE}... solo se puede situar cerca de los bordes del mapa +STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... los bosques solo se pueden plantar sobre la nieve +STR_ERROR_CAN_ONLY_BE_BUILT_ABOVE_SNOW_LINE :{WHITE}... solo se puede construir por encima del nivel de nieve +STR_ERROR_CAN_ONLY_BE_BUILT_BELOW_SNOW_LINE :{WHITE}... solo se puede construir por debajo del nivel de nieve + +STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES :{WHITE}No hubo espacio para industrias de tipo "{STRING}" +STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION :{WHITE}Cambia las opciones de generación para crear un mejor mapa + +# Station construction related errors +STR_ERROR_CAN_T_BUILD_RAILROAD_STATION :{WHITE}No se puede construir la estación de tren aquí... +STR_ERROR_CAN_T_BUILD_BUS_STATION :{WHITE}No se puede construir la parada de autobús aquí... +STR_ERROR_CAN_T_BUILD_TRUCK_STATION :{WHITE}No se puede construir la estación de camiones aquí... +STR_ERROR_CAN_T_BUILD_PASSENGER_TRAM_STATION :{WHITE}No se puede construir la estación de tranvía de pasajeros aquí... +STR_ERROR_CAN_T_BUILD_CARGO_TRAM_STATION :{WHITE}No se puede construir la estación de tranvía de carga aquí... +STR_ERROR_CAN_T_BUILD_DOCK_HERE :{WHITE}No se pueden construir muelles aquí... +STR_ERROR_CAN_T_BUILD_AIRPORT_HERE :{WHITE}No se puede construir el aeropuerto aquí... + +STR_ERROR_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}Se amplía más de una parada o estación existente +STR_ERROR_STATION_TOO_SPREAD_OUT :{WHITE}... estación demasiado amplia +STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Demasiadas estaciones +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_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... +STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... esta carretera es propiedad de un pueblo +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... +STR_ERROR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}Primero se debe quitar la estación de ferrocarril +STR_ERROR_CAN_T_REMOVE_BUS_STATION :{WHITE}No se puede quitar la parada de autobús... +STR_ERROR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}No se puede quitar la estación de camiones... +STR_ERROR_CAN_T_REMOVE_PASSENGER_TRAM_STATION :{WHITE}No se puede quitar la estación de tranvía de pasajeros... +STR_ERROR_CAN_T_REMOVE_CARGO_TRAM_STATION :{WHITE}No se puede quitar la estación de tranvía de carga... +STR_ERROR_MUST_REMOVE_ROAD_STOP_FIRST :{WHITE}Primero se debe quitar la parada de autobús +STR_ERROR_THERE_IS_NO_STATION :{WHITE}... no hay ninguna estación aquí + +STR_ERROR_MUST_DEMOLISH_RAILROAD :{WHITE}Primero se debe demoler la estación de ferrocarril +STR_ERROR_MUST_DEMOLISH_BUS_STATION_FIRST :{WHITE}Primero se debe demoler la parada de autobús +STR_ERROR_MUST_DEMOLISH_TRUCK_STATION_FIRST :{WHITE}Primero se debe demoler la estación de camiones +STR_ERROR_MUST_DEMOLISH_PASSENGER_TRAM_STATION_FIRST :{WHITE}Primero se debe demoler la estación del tranvía de pasajeros +STR_ERROR_MUST_DEMOLISH_CARGO_TRAM_STATION_FIRST :{WHITE}Primero se debe demoler la estación del tranvía de carga +STR_ERROR_MUST_DEMOLISH_DOCK_FIRST :{WHITE}Primero se debe demoler el muelle +STR_ERROR_MUST_DEMOLISH_AIRPORT_FIRST :{WHITE}Primero se debe demoler el aeropuerto + +# Waypoint related errors +STR_ERROR_WAYPOINT_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}Se amplía más de un punto guía existente +STR_ERROR_TOO_CLOSE_TO_ANOTHER_WAYPOINT :{WHITE}Demasiado cerca de otro punto guía + +STR_ERROR_CAN_T_BUILD_TRAIN_WAYPOINT :{WHITE}No se puede construir el punto guía aquí... +STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}No se puede colocar la boya aquí... +STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}No se puede cambiar nombre del punto guía... + +STR_ERROR_CAN_T_REMOVE_TRAIN_WAYPOINT :{WHITE}No se puede quitar el punto guía de aquí... +STR_ERROR_MUST_REMOVE_RAILWAYPOINT_FIRST :{WHITE}Primero se debe retirar el punto guía +STR_ERROR_BUOY_IN_THE_WAY :{WHITE}... una boya obstaculiza +STR_ERROR_BUOY_IS_IN_USE :{WHITE}... ¡boya en uso por otra empresa! + +# Depot related errors +STR_ERROR_CAN_T_BUILD_TRAIN_DEPOT :{WHITE}No se puede construir el depósito de trenes aquí... +STR_ERROR_CAN_T_BUILD_ROAD_DEPOT :{WHITE}No se puede construir el depósito de carretera aquí... +STR_ERROR_CAN_T_BUILD_TRAM_DEPOT :{WHITE}No se puede construir el depósito de tranvía aquí... +STR_ERROR_CAN_T_BUILD_SHIP_DEPOT :{WHITE}No se puede construir el astillero aquí... + +STR_ERROR_CAN_T_RENAME_DEPOT :{WHITE}No se puede cambiar nombre del depósito... + +STR_ERROR_TRAIN_MUST_BE_STOPPED_INSIDE_DEPOT :{WHITE}... puede que esté detenido dentro de un depósito +STR_ERROR_ROAD_VEHICLE_MUST_BE_STOPPED_INSIDE_DEPOT :{WHITE}... puede que esté detenido dentro de un depósito +STR_ERROR_SHIP_MUST_BE_STOPPED_INSIDE_DEPOT :{WHITE}... puede que esté detenido dentro de un astillero +STR_ERROR_AIRCRAFT_MUST_BE_STOPPED_INSIDE_HANGAR :{WHITE}... puede que esté detenido dentro de un hangar + +STR_ERROR_TRAINS_CAN_ONLY_BE_ALTERED_INSIDE_A_DEPOT :{WHITE}Los trenes pueden modificarse solo si están detenidos dentro de un depósito +STR_ERROR_TRAIN_TOO_LONG :{WHITE}Tren demasiado largo +STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE :{WHITE}No se puede cambiar dirección del vehículo... +STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE_MULTIPLE_UNITS :{WHITE}... vehículo compuesto por múltiples unidades +STR_ERROR_INCOMPATIBLE_RAIL_TYPES :Los tipos de vías férreas no son compatibles + +STR_ERROR_CAN_T_MOVE_VEHICLE :{WHITE}No se puede mover vehículo... +STR_ERROR_REAR_ENGINE_FOLLOW_FRONT :{WHITE}La locomotora trasera debe conectarse a la delantera +STR_ERROR_UNABLE_TO_FIND_ROUTE_TO :{WHITE}No se puede encontrar ruta al depósito +STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}No se puede encontrar depósito + +STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Tipo de depósito erróneo + +# Autoreplace related errors +STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} es demasiado largo después del reemplazo +STR_ERROR_AUTOREPLACE_NOTHING_TO_DO :{WHITE}No se han aplicado reglas de reemplazo o renovación +STR_ERROR_AUTOREPLACE_MONEY_LIMIT :(límite de dinero) + +# Rail construction errors +STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION :{WHITE}Combinación imposible de vías +STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Primero se deben quitar las señales +STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Tramo de vías férreas no apropiado +STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Primero se debe quitar el tramo de vías férreas +STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Carretera de un solo sentido o bloqueada +STR_ERROR_CROSSING_DISALLOWED :{WHITE}No se permiten pasos a nivel para este tipo de vías férreas +STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}No se pueden instalar señales aquí... +STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}No se pueden construir vías férreas aquí... +STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}No se pueden quitar vías férreas de aquí... +STR_ERROR_CAN_T_REMOVE_SIGNALS_FROM :{WHITE}No se pueden quitar señales de aquí... +STR_ERROR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE :{WHITE}No se pueden convertir las señales aquí... +STR_ERROR_THERE_IS_NO_RAILROAD_TRACK :{WHITE}... no hay vías férreas +STR_ERROR_THERE_ARE_NO_SIGNALS :{WHITE}... no hay señales + +STR_ERROR_CAN_T_CONVERT_RAIL :{WHITE}No se puede convertir tipo de vías férreas aquí... + +# Road construction errors +STR_ERROR_MUST_REMOVE_ROAD_FIRST :{WHITE}Primero se debe quitar la carretera +STR_ERROR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION :{WHITE}... las carreteras de un sentido no pueden tener intersecciones +STR_ERROR_CAN_T_BUILD_ROAD_HERE :{WHITE}No se puede construir carretera aquí... +STR_ERROR_CAN_T_BUILD_TRAMWAY_HERE :{WHITE}No se puede construir tranvía aquí... +STR_ERROR_CAN_T_REMOVE_ROAD_FROM :{WHITE}No se puede quitar carretera de aquí... +STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}No se puede quitar tranvía de aquí... +STR_ERROR_THERE_IS_NO_ROAD :{WHITE}... no hay carretera +STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}... no hay tranvía + +# Waterway construction errors +STR_ERROR_CAN_T_BUILD_CANALS :{WHITE}No se pueden construir canales aquí... +STR_ERROR_CAN_T_BUILD_LOCKS :{WHITE}No se pueden construir esclusas aquí... +STR_ERROR_CAN_T_PLACE_RIVERS :{WHITE}No se pueden colocar ríos aquí... +STR_ERROR_MUST_BE_BUILT_ON_WATER :{WHITE}... se debe construir sobre el agua +STR_ERROR_CAN_T_BUILD_ON_WATER :{WHITE}... no se puede construir sobre el agua +STR_ERROR_CAN_T_BUILD_ON_SEA :{WHITE}... no se puede construir sobre mar abierto +STR_ERROR_CAN_T_BUILD_ON_CANAL :{WHITE}... no se puede construir sobre un canal +STR_ERROR_CAN_T_BUILD_ON_RIVER :{WHITE}... no se puede construir sobre un río +STR_ERROR_MUST_DEMOLISH_CANAL_FIRST :{WHITE}Primero se debe tapar el canal +STR_ERROR_CAN_T_BUILD_AQUEDUCT_HERE :{WHITE}No se puede construir un acueducto aquí + +# Tree related errors +STR_ERROR_TREE_ALREADY_HERE :{WHITE}... ya hay árboles aquí +STR_ERROR_TREE_WRONG_TERRAIN_FOR_TREE_TYPE :{WHITE}... terreno no apto para este tipo de árbol +STR_ERROR_CAN_T_PLANT_TREE_HERE :{WHITE}No se pueden plantar árboles aquí... + +# Bridge related errors +STR_ERROR_CAN_T_BUILD_BRIDGE_HERE :{WHITE}No se puede construir puente aquí... +STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Primero se debe demoler el puente +STR_ERROR_CAN_T_START_AND_END_ON :{WHITE}No se puede comenzar y acabar en la misma posición +STR_ERROR_BRIDGEHEADS_NOT_SAME_HEIGHT :{WHITE}Las estribos del puente no están al mismo nivel +STR_ERROR_BRIDGE_TOO_LOW_FOR_TERRAIN :{WHITE}El puente es demasiado bajo para este terreno +STR_ERROR_BRIDGE_TOO_HIGH_FOR_TERRAIN :{WHITE}El puente es demasiado alto para este terreno +STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Principio y final deben estar alineados +STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... los dos extremos del puente deben estar sobre tierra +STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... puente demasiado largo +STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}El puente terminaría fuera del mapa + +# Tunnel related errors +STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}No se puede construir túnel aquí... +STR_ERROR_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Lugar no apto para entrada de túnel +STR_ERROR_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Primero se debe demoler el túnel +STR_ERROR_ANOTHER_TUNNEL_IN_THE_WAY :{WHITE}Otro túnel obstaculiza +STR_ERROR_TUNNEL_THROUGH_MAP_BORDER :{WHITE}El túnel se extendería más allá del mapa +STR_ERROR_UNABLE_TO_EXCAVATE_LAND :{WHITE}No se puede excavar la tierra al otro lado del túnel +STR_ERROR_TUNNEL_TOO_LONG :{WHITE}... túnel demasiado largo + +# Object related errors +STR_ERROR_TOO_MANY_OBJECTS :{WHITE}... demasiados objetos +STR_ERROR_CAN_T_BUILD_OBJECT :{WHITE}No se puede colocar objeto... +STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Otro objeto estorba +STR_ERROR_COMPANY_HEADQUARTERS_IN :{WHITE}... la sede de la empresa obstaculiza +STR_ERROR_CAN_T_PURCHASE_THIS_LAND :{WHITE}No es posible adquirir este terreno... +STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... ¡ya fue adquirido por el jugador! + +# Group related errors +STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}No se puede crear grupo... +STR_ERROR_GROUP_CAN_T_DELETE :{WHITE}No se puede eliminar grupo... +STR_ERROR_GROUP_CAN_T_RENAME :{WHITE}No se puede cambiar nombre del grupo... +STR_ERROR_GROUP_CAN_T_SET_PARENT :{WHITE}No se puede establecer la jerarquía de grupos... +STR_ERROR_GROUP_CAN_T_REMOVE_ALL_VEHICLES :{WHITE}No se pueden quitar todos los vehículos de este grupo... +STR_ERROR_GROUP_CAN_T_ADD_VEHICLE :{WHITE}No se puede añadir el vehículo a este grupo... +STR_ERROR_GROUP_CAN_T_ADD_SHARED_VEHICLE :{WHITE}No se pueden añadir vehículos compartidos al grupo... + +# Generic vehicle errors +STR_ERROR_TRAIN_IN_THE_WAY :{WHITE}Tren estorba +STR_ERROR_ROAD_VEHICLE_IN_THE_WAY :{WHITE}Vehículo de carretera estorba +STR_ERROR_SHIP_IN_THE_WAY :{WHITE}Barco estorba +STR_ERROR_AIRCRAFT_IN_THE_WAY :{WHITE}Aeronave obstaculiza + +STR_ERROR_CAN_T_REFIT_TRAIN :{WHITE}No se puede reformar tren... +STR_ERROR_CAN_T_REFIT_ROAD_VEHICLE :{WHITE}No se puede reformar vehículo de carretera... +STR_ERROR_CAN_T_REFIT_SHIP :{WHITE}No se puede reformar barco... +STR_ERROR_CAN_T_REFIT_AIRCRAFT :{WHITE}No se puede reformar aeronave... + +STR_ERROR_CAN_T_RENAME_TRAIN :{WHITE}No se puede cambiar nombre del tren... +STR_ERROR_CAN_T_RENAME_ROAD_VEHICLE :{WHITE}No se puede cambiar nombre del vehículo... +STR_ERROR_CAN_T_RENAME_SHIP :{WHITE}No se puede cambiar nombre del barco... +STR_ERROR_CAN_T_RENAME_AIRCRAFT :{WHITE}No se puede cambiar nombre de la aeronave... + +STR_ERROR_CAN_T_STOP_START_TRAIN :{WHITE}No se puede detener o poner en marcha el tren... +STR_ERROR_CAN_T_STOP_START_ROAD_VEHICLE :{WHITE}No se puede detener o poner en marcha el vehículo... +STR_ERROR_CAN_T_STOP_START_SHIP :{WHITE}No se puede detener o poner en marcha el barco... +STR_ERROR_CAN_T_STOP_START_AIRCRAFT :{WHITE}No se puede aterrizar o despegar la aeronave... + +STR_ERROR_CAN_T_SEND_TRAIN_TO_DEPOT :{WHITE}No se puede enviar el tren al depósito... +STR_ERROR_CAN_T_SEND_ROAD_VEHICLE_TO_DEPOT :{WHITE}No se puede enviar el vehículo al depósito... +STR_ERROR_CAN_T_SEND_SHIP_TO_DEPOT :{WHITE}No se puede enviar el barco a astillero... +STR_ERROR_CAN_T_SEND_AIRCRAFT_TO_HANGAR :{WHITE}No se puede enviar el aeronave al hangar + +STR_ERROR_CAN_T_BUY_TRAIN :{WHITE}No se puede comprar tren... +STR_ERROR_CAN_T_BUY_ROAD_VEHICLE :{WHITE}No se puede comprar vehículo... +STR_ERROR_CAN_T_BUY_SHIP :{WHITE}No se puede comprar barco... +STR_ERROR_CAN_T_BUY_AIRCRAFT :{WHITE}No se puede comprar aeronave... + +STR_ERROR_CAN_T_RENAME_TRAIN_TYPE :{WHITE}No se puede cambiar nombre del tipo de tren... +STR_ERROR_CAN_T_RENAME_ROAD_VEHICLE_TYPE :{WHITE}No se puede cambiar nombre del tipo de vehículo... +STR_ERROR_CAN_T_RENAME_SHIP_TYPE :{WHITE}No se puede cambiar nombre del tipo de barco... +STR_ERROR_CAN_T_RENAME_AIRCRAFT_TYPE :{WHITE}No se puede cambiar nombre del tipo de aeronave... + +STR_ERROR_CAN_T_SELL_TRAIN :{WHITE}No se puede vender tren... +STR_ERROR_CAN_T_SELL_ROAD_VEHICLE :{WHITE}No se puede vender vehículo... +STR_ERROR_CAN_T_SELL_SHIP :{WHITE}No se puede vender barco... +STR_ERROR_CAN_T_SELL_AIRCRAFT :{WHITE}No se puede vender aeronave... + +STR_ERROR_RAIL_VEHICLE_NOT_AVAILABLE :{WHITE}Vehículo no disponible +STR_ERROR_ROAD_VEHICLE_NOT_AVAILABLE :{WHITE}Vehículo no disponible +STR_ERROR_SHIP_NOT_AVAILABLE :{WHITE}Barco no disponible +STR_ERROR_AIRCRAFT_NOT_AVAILABLE :{WHITE}Aeronave no disponible + +STR_ERROR_TOO_MANY_VEHICLES_IN_GAME :{WHITE}Demasiados vehículos en el juego +STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}No se puede cambiar intervalo de mantenimiento... + +STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... el vehículo está destruido + +STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}No habrá vehículos disponibles +STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Se debe modificar la configuración de NewGRF +STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Todavía no hay vehículos disponibles +STR_ERROR_NO_VEHICLES_AVAILABLE_YET_EXPLANATION :{WHITE}Se debe empezar una nueva partida después de {DATE_SHORT} o usar un NewGRF que proporcione vehículos más antiguos + +# Specific vehicle errors +STR_ERROR_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}El tren no puede rebasar la señal si está en peligro... +STR_ERROR_CAN_T_REVERSE_DIRECTION_TRAIN :{WHITE}No se puede cambiar la dirección del tren... +STR_ERROR_TRAIN_START_NO_POWER :El tren no tiene potencia + +STR_ERROR_CAN_T_MAKE_ROAD_VEHICLE_TURN :{WHITE}No se puede girar vehículo de carretera... + +STR_ERROR_AIRCRAFT_IS_IN_FLIGHT :{WHITE}La aeronave está en vuelo + +# Order related errors +STR_ERROR_NO_MORE_SPACE_FOR_ORDERS :{WHITE}Ya no hay espacio para más órdenes +STR_ERROR_TOO_MANY_ORDERS :{WHITE}Demasiadas órdenes +STR_ERROR_CAN_T_INSERT_NEW_ORDER :{WHITE}No se puede añadir otra orden... +STR_ERROR_CAN_T_DELETE_THIS_ORDER :{WHITE}No se puede eliminar esta orden... +STR_ERROR_CAN_T_MODIFY_THIS_ORDER :{WHITE}No se puede modificar esta orden... +STR_ERROR_CAN_T_MOVE_THIS_ORDER :{WHITE}No se puede mover esta orden... +STR_ERROR_CAN_T_SKIP_ORDER :{WHITE}No se puede saltar la orden actual... +STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}No se puede saltar a la orden elegida... +STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... el vehículo no puede ir a todas las estaciones +STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... el vehículo no puede ir a esa estación +STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... un vehículo que comparte esta orden no puede ir a esa estación + +STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}No se puede compartir la lista de órdenes... +STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}No se puede dejar de compartir la lista de órdenes... +STR_ERROR_CAN_T_COPY_ORDER_LIST :{WHITE}No se puede copiar la lista de órdenes... +STR_ERROR_TOO_FAR_FROM_PREVIOUS_DESTINATION :{WHITE}... demasiado lejos del destino anterior +STR_ERROR_AIRCRAFT_NOT_ENOUGH_RANGE :{WHITE}... la aeronave no tiene suficiente alcance + +# Timetable related errors +STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}No se pueden asignar itinerarios al vehículo... +STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Los vehículos solo pueden esperar en estaciones +STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Este vehículo no se detendrá en esta estación + +# Sign related errors +STR_ERROR_TOO_MANY_SIGNS :{WHITE}... demasiados carteles +STR_ERROR_CAN_T_PLACE_SIGN_HERE :{WHITE}No se puede poner cartel aquí... +STR_ERROR_CAN_T_CHANGE_SIGN_NAME :{WHITE}No se puede cambiar el nombre del cartel... +STR_ERROR_CAN_T_DELETE_SIGN :{WHITE}No se puede quitar el cartel... + +# Translatable comment for OpenTTD's desktop shortcut +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 para DOS. +STR_BASEGRAPHICS_DOS_DE_DESCRIPTION :Gráficos originales de Transport Tycoon Deluxe para DOS (en alemán). +STR_BASEGRAPHICS_WIN_DESCRIPTION :Gráficos originales de Transport Tycoon Deluxe para Windows. +STR_BASESOUNDS_DOS_DESCRIPTION :Sonidos originales de Transport Tycoon Deluxe para DOS. +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 +# Town building names +STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1 :Edificio alto de oficinas +STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_1 :Edificio de oficinas +STR_TOWN_BUILDING_NAME_SMALL_BLOCK_OF_FLATS_1 :Conjunto habitacional pequeño +STR_TOWN_BUILDING_NAME_CHURCH_1 :Iglesia +STR_TOWN_BUILDING_NAME_LARGE_OFFICE_BLOCK_1 :Complejo de oficinas +STR_TOWN_BUILDING_NAME_TOWN_HOUSES_1 :Casas adosadas +STR_TOWN_BUILDING_NAME_HOTEL_1 :Hotel +STR_TOWN_BUILDING_NAME_STATUE_1 :Estatua +STR_TOWN_BUILDING_NAME_FOUNTAIN_1 :Fuente +STR_TOWN_BUILDING_NAME_PARK_1 :Parque +STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_2 :Edificio de oficinas +STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1 :Tiendas y oficinas +STR_TOWN_BUILDING_NAME_MODERN_OFFICE_BUILDING_1 :Edificio de oficinas moderno +STR_TOWN_BUILDING_NAME_WAREHOUSE_1 :Almacén +STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_3 :Edificio de oficinas +STR_TOWN_BUILDING_NAME_STADIUM_1 :Estadio +STR_TOWN_BUILDING_NAME_OLD_HOUSES_1 :Casas antiguass +STR_TOWN_BUILDING_NAME_COTTAGES_1 :Casas rurales +STR_TOWN_BUILDING_NAME_HOUSES_1 :Casas +STR_TOWN_BUILDING_NAME_FLATS_1 :Departamentos +STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_2 :Edificio alto de oficinas +STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_2 :Tiendas y oficinas +STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_3 :Tiendas y oficinas +STR_TOWN_BUILDING_NAME_THEATER_1 :Teatro +STR_TOWN_BUILDING_NAME_STADIUM_2 :Estadio +STR_TOWN_BUILDING_NAME_OFFICES_1 :Oficinas +STR_TOWN_BUILDING_NAME_HOUSES_2 :Casas +STR_TOWN_BUILDING_NAME_CINEMA_1 :Cine +STR_TOWN_BUILDING_NAME_SHOPPING_MALL_1 :Centro comercial +STR_TOWN_BUILDING_NAME_IGLOO_1 :Iglú +STR_TOWN_BUILDING_NAME_TEPEES_1 :Tipis +STR_TOWN_BUILDING_NAME_TEAPOT_HOUSE_1 :Casa de olla de té +STR_TOWN_BUILDING_NAME_PIGGY_BANK_1 :Alcancía + +##id 0x4800 +# industry names +STR_INDUSTRY_NAME_COAL_MINE :{G=f}Mina de carbón +STR_INDUSTRY_NAME_POWER_STATION :{G=f}Central eléctrica +STR_INDUSTRY_NAME_SAWMILL :{G=m}Aserradero +STR_INDUSTRY_NAME_FOREST :{G=m}Bosque +STR_INDUSTRY_NAME_OIL_REFINERY :{G=f}Refinería de petróleo +STR_INDUSTRY_NAME_OIL_RIG :{G=f}Plataforma petrolífera +STR_INDUSTRY_NAME_FACTORY :{G=f}Fábrica +STR_INDUSTRY_NAME_PRINTING_WORKS :{G=f}Imprenta +STR_INDUSTRY_NAME_STEEL_MILL :{G=f}Siderúrgica +STR_INDUSTRY_NAME_FARM :{G=f}Granja +STR_INDUSTRY_NAME_COPPER_ORE_MINE :{G=f}Mina de cobre +STR_INDUSTRY_NAME_OIL_WELLS :{G=m}Pozos petrolíferos +STR_INDUSTRY_NAME_BANK :{G=m}Banco +STR_INDUSTRY_NAME_FOOD_PROCESSING_PLANT :{G=f}Planta procesadora de alimentos +STR_INDUSTRY_NAME_PAPER_MILL :{G=f}Fábrica de papel +STR_INDUSTRY_NAME_GOLD_MINE :{G=f}Mina de oro +STR_INDUSTRY_NAME_BANK_TROPIC_ARCTIC :{G=m}Banco +STR_INDUSTRY_NAME_DIAMOND_MINE :{G=f}Mina de diamantes +STR_INDUSTRY_NAME_IRON_ORE_MINE :{G=f}Mina de hierro +STR_INDUSTRY_NAME_FRUIT_PLANTATION :{G=f}Plantación de fruta +STR_INDUSTRY_NAME_RUBBER_PLANTATION :{G=f}Plantación de caucho +STR_INDUSTRY_NAME_WATER_SUPPLY :{G=m}Suministro de agua +STR_INDUSTRY_NAME_WATER_TOWER :{G=f}Torre de agua +STR_INDUSTRY_NAME_FACTORY_2 :{G=f}Fábrica +STR_INDUSTRY_NAME_FARM_2 :{G=f}Granja +STR_INDUSTRY_NAME_LUMBER_MILL :{G=m}Aserradero +STR_INDUSTRY_NAME_COTTON_CANDY_FOREST :{G=m}Bosque de algodón de azúcar +STR_INDUSTRY_NAME_CANDY_FACTORY :{G=f}Fábrica de dulces +STR_INDUSTRY_NAME_BATTERY_FARM :{G=f}Granja de pilas +STR_INDUSTRY_NAME_COLA_WELLS :{G=m}Pozos de cola +STR_INDUSTRY_NAME_TOY_SHOP :{G=f}Tienda de juguetes +STR_INDUSTRY_NAME_TOY_FACTORY :{G=f}Fábrica de juguetes +STR_INDUSTRY_NAME_PLASTIC_FOUNTAINS :{G=f}Fuentes de plástico +STR_INDUSTRY_NAME_FIZZY_DRINK_FACTORY :{G=f}Fábrica de refrescos +STR_INDUSTRY_NAME_BUBBLE_GENERATOR :{G=m}Generador de burbujas +STR_INDUSTRY_NAME_TOFFEE_QUARRY :{G=f}Cantera de caramelos +STR_INDUSTRY_NAME_SUGAR_MINE :{G=f}Mina de azúcar + +############ WARNING, using range 0x6000 for strings that are stored in the savegame +############ These strings may never get a new id, or savegames will break! +##id 0x6000 +STR_SV_EMPTY : +STR_SV_UNNAMED :Sin nombre +STR_SV_TRAIN_NAME :Tren {COMMA} +STR_SV_ROAD_VEHICLE_NAME :Vehículo de carretera {COMMA} +STR_SV_SHIP_NAME :Barco {COMMA} +STR_SV_AIRCRAFT_NAME :Aeronave {COMMA} + +STR_SV_STNAME :{STRING} +STR_SV_STNAME_NORTH :{STRING} Norte +STR_SV_STNAME_SOUTH :{STRING} Sur +STR_SV_STNAME_EAST :{STRING} Oriente +STR_SV_STNAME_WEST :{STRING} Poniente +STR_SV_STNAME_CENTRAL :{STRING} Centro +STR_SV_STNAME_TRANSFER :Transferencia {STRING} +STR_SV_STNAME_HALT :Parada {STRING} +STR_SV_STNAME_VALLEY :Valle de {STRING} +STR_SV_STNAME_HEIGHTS :Altos de {STRING} +STR_SV_STNAME_WOODS :Bosques de {STRING} +STR_SV_STNAME_LAKESIDE :Lago de {STRING} +STR_SV_STNAME_EXCHANGE :Intercambio {STRING} +STR_SV_STNAME_AIRPORT :Aeropuerto de {STRING} +STR_SV_STNAME_OILFIELD :Yacimiento petrolífero de {STRING} +STR_SV_STNAME_MINES :Minas de {STRING} +STR_SV_STNAME_DOCKS :Muelles de {STRING} +STR_SV_STNAME_BUOY :{STRING} +STR_SV_STNAME_WAYPOINT :{STRING} +##id 0x6020 +STR_SV_STNAME_ANNEXE :Anexo {STRING} +STR_SV_STNAME_SIDINGS :Inmediaciones de {STRING} +STR_SV_STNAME_BRANCH :Ramal de {STRING} +STR_SV_STNAME_UPPER :Alto {STRING} +STR_SV_STNAME_LOWER :Bajo {STRING} +STR_SV_STNAME_HELIPORT :Helipuerto de {STRING} +STR_SV_STNAME_FOREST :Bosque de {STRING} +STR_SV_STNAME_FALLBACK :{STRING} Estación #{NUM} +############ end of savegame specific region! + +##id 0x8000 +# Vehicle names +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_KIRBY_PAUL_TANK_STEAM :Kirby Paul Tank (vapor) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_MJS_250_DIESEL :MJS 250 (diésel) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_PLODDYPHUT_CHOO_CHOO :Ploddyphut Choo-Choo +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_POWERNAUT_CHOO_CHOO :Powernaut Choo-Choo +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_MIGHTYMOVER_CHOO_CHOO :MightyMover Choo-Choo +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_PLODDYPHUT_DIESEL :Ploddyphut Diésel +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_POWERNAUT_DIESEL :Powernaut Diésel +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_WILLS_2_8_0_STEAM :Wills 2-8-0 (vapor) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_CHANEY_JUBILEE_STEAM :Chaney 'Jubilee' (vapor) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_GINZU_A4_STEAM :Ginzu 'A4' (vapor) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_8P_STEAM :SH '8P' (vapor) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_MANLEY_MOREL_DMU_DIESEL :Manley-Morel DMU (diésel) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_DASH_DIESEL :'Dash' (diésel) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_HENDRY_25_DIESEL :SH/Hendry '25' (diésel) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_UU_37_DIESEL :UU '37' (diésel) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_FLOSS_47_DIESEL :Floss '47' (diésel) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_CS_4000_DIESEL :CS 4000 (diésel) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_CS_2400_DIESEL :CS 2400 (diésel) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_CENTENNIAL_DIESEL :Centennial (diésel) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_KELLING_3100_DIESEL :Kelling 3100 (diésel) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_TURNER_TURBO_DIESEL :Turner Turbo (diésel) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_MJS_1000_DIESEL :MJS 1000 (diésel) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_125_DIESEL :SH '125' (diésel) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_30_ELECTRIC :SH '30' (eléctrica) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_40_ELECTRIC :SH '40' (eléctrica) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_T_I_M_ELECTRIC :'T.I.M.' (eléctrica) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_ASIASTAR_ELECTRIC :'AsiaStar' (eléctrica) +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PASSENGER_CAR :Carro de pasajeros +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_MAIL_VAN :Vagón de correos +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COAL_CAR :Vagón de carbón +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_OIL_TANKER :Cisterna de petróleo +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_LIVESTOCK_VAN :Vagón de ganado +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_GOODS_VAN :Vagón de mercancías +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_GRAIN_HOPPER :Tolva de grano +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_WOOD_TRUCK :Vagón de madera +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_IRON_ORE_HOPPER :Tolva de mineral de hierro +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_STEEL_TRUCK :Vagón de acero +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_ARMORED_VAN :Vagón blindado +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FOOD_VAN :Vagón de alimento +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PAPER_TRUCK :Vagón de papel +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COPPER_ORE_HOPPER :Tolva de mineral de cobre +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_WATER_TANKER :Cisterna de agua +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FRUIT_TRUCK :Vagón de fruta +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_RUBBER_TRUCK :Vagón de caucho +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_SUGAR_TRUCK :Vagón de azúcar +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COTTON_CANDY_HOPPER :Tolva de algodón de azúcar +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_TOFFEE_HOPPER :Tolva de caramelos +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_BUBBLE_VAN :Vagón de burbujas +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COLA_TANKER :Cisterna de cola +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_CANDY_VAN :Vagón de dulces +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_TOY_VAN :Vagón de juguetes +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_BATTERY_TRUCK :Vagón de pilas +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FIZZY_DRINK_TRUCK :Vagón de refrescos +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PLASTIC_TRUCK :Vagón de plásticos +STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_X2001_ELECTRIC :'X2001' (Eléctrico) +STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_MILLENNIUM_Z1_ELECTRIC :'Millennium Z1' (Eléctrico) +STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_WIZZOWOW_Z99 :Wizzowow Z99 +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_PASSENGER_CAR :Carro de pasajeros +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_MAIL_VAN :Vagón de correo +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COAL_CAR :Vagón de carbón +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_OIL_TANKER :Cisterna de petróleo +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_LIVESTOCK_VAN :Vagón de ganado +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_GOODS_VAN :Vagón de mercancías +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_GRAIN_HOPPER :Tolva de grano +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_WOOD_TRUCK :Vagón de madera +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_IRON_ORE_HOPPER :Tolva de mineral de hierro +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_STEEL_TRUCK :Vagón de acero +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_ARMORED_VAN :Vagón blindado +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_FOOD_VAN :Vagón de alimento +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_PAPER_TRUCK :Vagón de papel +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COPPER_ORE_HOPPER :Tolva de mineral de cobre +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_WATER_TANKER :Cisterna de agua +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_FRUIT_TRUCK :Vagón de fruta +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_RUBBER_TRUCK :Vagón de caucho +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_SUGAR_TRUCK :Vagón de azúcar +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COTTON_CANDY_HOPPER :Tolva de algodón de azúcar +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_TOFFEE_HOPPER :Tolva de caramelos +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_BUBBLE_VAN :Vagón de burbujas +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COLA_TANKER :Cisterna de cola +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_CANDY_VAN :Vagón de dulces +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_TOY_VAN :Vagón de juguetes +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_BATTERY_TRUCK :Vagón de pilas +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_FIZZY_DRINK_TRUCK :Vagón de refrescos +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_PLASTIC_TRUCK :Vagón de plásticos +STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV1_LEVIATHAN_ELECTRIC :Lev1 'Leviathan' (eléctrica) +STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV2_CYCLOPS_ELECTRIC :Lev2 'Cyclops' (eléctrica) +STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV3_PEGASUS_ELECTRIC :Lev3 'Pegasus' (eléctrica) +STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV4_CHIMAERA_ELECTRIC :Lev4 'Chimaera' (eléctrica) +STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_WIZZOWOW_ROCKETEER :Wizzowow Rocketeer +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_PASSENGER_CAR :Vagón de pasajeros +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_MAIL_VAN :Vagón de correo +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COAL_CAR :Vagón de carbón +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_OIL_TANKER :Cisterna de petróleo +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_LIVESTOCK_VAN :Vagón de ganado +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_GOODS_VAN :Vagón de mercancías +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_GRAIN_HOPPER :Vagón de tolva de grano +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_WOOD_TRUCK :Vagón de madera +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_IRON_ORE_HOPPER :Tolva de mineral de hierro +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_STEEL_TRUCK :Vagón de acero +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_ARMORED_VAN :Vagón blindado +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_FOOD_VAN :Vagón de alimento +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_PAPER_TRUCK :Vagón de papel +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COPPER_ORE_HOPPER :Tolva de mineral de cobre +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_WATER_TANKER :Cisterna de agua +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_FRUIT_TRUCK :Vagón de fruta +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_RUBBER_TRUCK :Vagón de caucho +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_SUGAR_TRUCK :Vagón de azúcar +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COTTON_CANDY_HOPPER :Tolva de algodón de azúcar +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_TOFFEE_HOPPER :Tolva de caramelos +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_BUBBLE_VAN :Vagón de burbujas +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COLA_TANKER :Cisterna de cola +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_CANDY_VAN :Vagón de dulces +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_TOY_VAN :Vagón de juguetes +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_BATTERY_TRUCK :Vagón de pilas +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_FIZZY_DRINK_TRUCK :Vagón de refrescos +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_PLASTIC_TRUCK :Vagón de plásticos +STR_VEHICLE_NAME_ROAD_VEHICLE_MPS_REGAL_BUS :Autobús MPS Regal +STR_VEHICLE_NAME_ROAD_VEHICLE_HEREFORD_LEOPARD_BUS :Autobús Hereford Leopard +STR_VEHICLE_NAME_ROAD_VEHICLE_FOSTER_BUS :Autobús Foster +STR_VEHICLE_NAME_ROAD_VEHICLE_FOSTER_MKII_SUPERBUS :Superbús Foster MkII +STR_VEHICLE_NAME_ROAD_VEHICLE_PLODDYPHUT_MKI_BUS :Autobús Ploddyphut MkI +STR_VEHICLE_NAME_ROAD_VEHICLE_PLODDYPHUT_MKII_BUS :Autobús Ploddyphut MkII +STR_VEHICLE_NAME_ROAD_VEHICLE_PLODDYPHUT_MKIII_BUS :Autobús Ploddyphut MkIII +STR_VEHICLE_NAME_ROAD_VEHICLE_BALOGH_COAL_TRUCK :Camión carbonero Balogh +STR_VEHICLE_NAME_ROAD_VEHICLE_UHL_COAL_TRUCK :Camión carbonero Uhl +STR_VEHICLE_NAME_ROAD_VEHICLE_DW_COAL_TRUCK :Camión carbonero DW +STR_VEHICLE_NAME_ROAD_VEHICLE_MPS_MAIL_TRUCK :Camión de correo MPS +STR_VEHICLE_NAME_ROAD_VEHICLE_REYNARD_MAIL_TRUCK :Camión de correo Reynard +STR_VEHICLE_NAME_ROAD_VEHICLE_PERRY_MAIL_TRUCK :Camión de correo Perry +STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_MAIL_TRUCK :Camión de correo MightyMover +STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_MAIL_TRUCK :Camión de correo Powernaught +STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_MAIL_TRUCK :Camión de correo Wizzowow +STR_VEHICLE_NAME_ROAD_VEHICLE_WITCOMBE_OIL_TANKER :Cisterna de petróleo Witcombe +STR_VEHICLE_NAME_ROAD_VEHICLE_FOSTER_OIL_TANKER :Cisterna de petróleo Foster +STR_VEHICLE_NAME_ROAD_VEHICLE_PERRY_OIL_TANKER :Cisterna de petróleo Perry +STR_VEHICLE_NAME_ROAD_VEHICLE_TALBOTT_LIVESTOCK_VAN :Camión de ganado Talbott +STR_VEHICLE_NAME_ROAD_VEHICLE_UHL_LIVESTOCK_VAN :Camión de ganado Uhl +STR_VEHICLE_NAME_ROAD_VEHICLE_FOSTER_LIVESTOCK_VAN :Camión de ganado Foster +STR_VEHICLE_NAME_ROAD_VEHICLE_BALOGH_GOODS_TRUCK :Camión de mercancías Balogh +STR_VEHICLE_NAME_ROAD_VEHICLE_CRAIGHEAD_GOODS_TRUCK :Camión de mercancías Craighead +STR_VEHICLE_NAME_ROAD_VEHICLE_GOSS_GOODS_TRUCK :Camión de mercancías Goss +STR_VEHICLE_NAME_ROAD_VEHICLE_HEREFORD_GRAIN_TRUCK :Camión granero Hereford +STR_VEHICLE_NAME_ROAD_VEHICLE_THOMAS_GRAIN_TRUCK :Camión granero Thomas +STR_VEHICLE_NAME_ROAD_VEHICLE_GOSS_GRAIN_TRUCK :Camión granero Goss +STR_VEHICLE_NAME_ROAD_VEHICLE_WITCOMBE_WOOD_TRUCK :Camión maderero Witcombe +STR_VEHICLE_NAME_ROAD_VEHICLE_FOSTER_WOOD_TRUCK :Camión maderero Foster +STR_VEHICLE_NAME_ROAD_VEHICLE_MORELAND_WOOD_TRUCK :Camión maderero Moreland +STR_VEHICLE_NAME_ROAD_VEHICLE_MPS_IRON_ORE_TRUCK :Camión de hierro MPS +STR_VEHICLE_NAME_ROAD_VEHICLE_UHL_IRON_ORE_TRUCK :Camión de hierro Uhl +STR_VEHICLE_NAME_ROAD_VEHICLE_CHIPPY_IRON_ORE_TRUCK :Camión de hierro Chippy +STR_VEHICLE_NAME_ROAD_VEHICLE_BALOGH_STEEL_TRUCK :Camión de acero Balogh +STR_VEHICLE_NAME_ROAD_VEHICLE_UHL_STEEL_TRUCK :Camión de acero Uhl +STR_VEHICLE_NAME_ROAD_VEHICLE_KELLING_STEEL_TRUCK :Camión de acero Kelling +STR_VEHICLE_NAME_ROAD_VEHICLE_BALOGH_ARMORED_TRUCK :Camión blindado Balogh +STR_VEHICLE_NAME_ROAD_VEHICLE_UHL_ARMORED_TRUCK :Camión blindado Uhl +STR_VEHICLE_NAME_ROAD_VEHICLE_FOSTER_ARMORED_TRUCK :Camión blindado Foster +STR_VEHICLE_NAME_ROAD_VEHICLE_FOSTER_FOOD_VAN :Camión de alimentos Foster +STR_VEHICLE_NAME_ROAD_VEHICLE_PERRY_FOOD_VAN :Camión de alimentos Perry +STR_VEHICLE_NAME_ROAD_VEHICLE_CHIPPY_FOOD_VAN :Camión de alimentos Chippy +STR_VEHICLE_NAME_ROAD_VEHICLE_UHL_PAPER_TRUCK :Camión de papel Uhl +STR_VEHICLE_NAME_ROAD_VEHICLE_BALOGH_PAPER_TRUCK :Camión de papel Balogh +STR_VEHICLE_NAME_ROAD_VEHICLE_MPS_PAPER_TRUCK :Camión de papel MPS +STR_VEHICLE_NAME_ROAD_VEHICLE_MPS_COPPER_ORE_TRUCK :Camión de cobre MPS +STR_VEHICLE_NAME_ROAD_VEHICLE_UHL_COPPER_ORE_TRUCK :Camión de cobre Uhl +STR_VEHICLE_NAME_ROAD_VEHICLE_GOSS_COPPER_ORE_TRUCK :Camión de cobre Goss +STR_VEHICLE_NAME_ROAD_VEHICLE_UHL_WATER_TANKER :Cisterna de agua Uhl +STR_VEHICLE_NAME_ROAD_VEHICLE_BALOGH_WATER_TANKER :Cisterna de agua Balogh +STR_VEHICLE_NAME_ROAD_VEHICLE_MPS_WATER_TANKER :Cisterna de agua MPS +STR_VEHICLE_NAME_ROAD_VEHICLE_BALOGH_FRUIT_TRUCK :Camión frutero Balogh +STR_VEHICLE_NAME_ROAD_VEHICLE_UHL_FRUIT_TRUCK :Camión frutero Uhl +STR_VEHICLE_NAME_ROAD_VEHICLE_KELLING_FRUIT_TRUCK :Camión frutero Kelling +STR_VEHICLE_NAME_ROAD_VEHICLE_BALOGH_RUBBER_TRUCK :Camión de caucho Balogh +STR_VEHICLE_NAME_ROAD_VEHICLE_UHL_RUBBER_TRUCK :Camión de caucho Uhl +STR_VEHICLE_NAME_ROAD_VEHICLE_RMT_RUBBER_TRUCK :Camión de caucho RMT +STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_SUGAR_TRUCK :Camión de azúcar MightyMover +STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_SUGAR_TRUCK :Camión de azúcar Powernaught +STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_SUGAR_TRUCK :Camión de azúcar Wizzowow +STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_COLA_TRUCK :Camión de cola MightyMover +STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_COLA_TRUCK :Camión de cola Powernaught +STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_COLA_TRUCK :Camión de cola Wizzowow +STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_COTTON_CANDY :Camión de algodón de azúcar MightyMover +STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_COTTON_CANDY :Camión de algodón de azúcar Powernaught +STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_COTTON_CANDY_TRUCK :Camión de algodón de azúcar Wizzowow +STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_TOFFEE_TRUCK :Camión de caramelos MightyMover +STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_TOFFEE_TRUCK :Camión de caramelos Powernaught +STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_TOFFEE_TRUCK :Camión de caramelos Wizzowow +STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_TOY_VAN :Camión de juguetes MightyMover +STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_TOY_VAN :Camión de juguetes Powernaught +STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_TOY_VAN :Camión de juguetes Wizzowow +STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_CANDY_TRUCK :Camión de dulces MightyMover +STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_CANDY_TRUCK :Camión de dulces Powernaught +STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_CANDY_TRUCK :Camión de dulces Wizzowow +STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_BATTERY_TRUCK :Camión de pilas MightyMover +STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_BATTERY_TRUCK :Camión de pilas Powernaught +STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_BATTERY_TRUCK :Camión de pilas Wizzowow +STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_FIZZY_DRINK :Camión de refrescos MightyMover +STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_FIZZY_DRINK :Camión de refrescos Powernaught +STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_FIZZY_DRINK_TRUCK :Camión de refrescos Wizzowow +STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_PLASTIC_TRUCK :Camión de plásticos MightyMover +STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_PLASTIC_TRUCK :Camión de plásticos Powernaught +STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_PLASTIC_TRUCK :Camión de plásticos Wizzowow +STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_BUBBLE_TRUCK :Camión de burbujas MightyMover +STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_BUBBLE_TRUCK :Camión de burbujas Powernaught +STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_BUBBLE_TRUCK :Camión de burbujas Wizzowow +STR_VEHICLE_NAME_SHIP_MPS_OIL_TANKER :Petrolero MPS +STR_VEHICLE_NAME_SHIP_CS_INC_OIL_TANKER :Petrolero CS-Inc. +STR_VEHICLE_NAME_SHIP_MPS_PASSENGER_FERRY :Transbordador MPS +STR_VEHICLE_NAME_SHIP_FFP_PASSENGER_FERRY :Transbordador FFP +STR_VEHICLE_NAME_SHIP_BAKEWELL_300_HOVERCRAFT :Aerodeslizador Bakewell 300 +STR_VEHICLE_NAME_SHIP_CHUGGER_CHUG_PASSENGER :Transbordador Chugger-Chug +STR_VEHICLE_NAME_SHIP_SHIVERSHAKE_PASSENGER_FERRY :Transbordador Shivershake +STR_VEHICLE_NAME_SHIP_YATE_CARGO_SHIP :Buque carguero Yate +STR_VEHICLE_NAME_SHIP_BAKEWELL_CARGO_SHIP :Buque carguero Bakewell +STR_VEHICLE_NAME_SHIP_MIGHTYMOVER_CARGO_SHIP :Buque carguero MightyMover +STR_VEHICLE_NAME_SHIP_POWERNAUT_CARGO_SHIP :Buque carguero Powernaut +STR_VEHICLE_NAME_AIRCRAFT_SAMPSON_U52 :Sampson U52 +STR_VEHICLE_NAME_AIRCRAFT_COLEMAN_COUNT :Coleman Count +STR_VEHICLE_NAME_AIRCRAFT_FFP_DART :FFP Dart +STR_VEHICLE_NAME_AIRCRAFT_YATE_HAUGAN :Yate Haugan +STR_VEHICLE_NAME_AIRCRAFT_BAKEWELL_COTSWALD_LB_3 :Bakewell Cotswald LB-3 +STR_VEHICLE_NAME_AIRCRAFT_BAKEWELL_LUCKETT_LB_8 :Bakewell Luckett LB-8 +STR_VEHICLE_NAME_AIRCRAFT_BAKEWELL_LUCKETT_LB_9 :Bakewell Luckett LB-9 +STR_VEHICLE_NAME_AIRCRAFT_BAKEWELL_LUCKETT_LB80 :Bakewell Luckett LB80 +STR_VEHICLE_NAME_AIRCRAFT_BAKEWELL_LUCKETT_LB_10 :Bakewell Luckett LB-10 +STR_VEHICLE_NAME_AIRCRAFT_BAKEWELL_LUCKETT_LB_11 :Bakewell Luckett LB-11 +STR_VEHICLE_NAME_AIRCRAFT_YATE_AEROSPACE_YAC_1_11 :Yate Aerospace YAC 1-11 +STR_VEHICLE_NAME_AIRCRAFT_DARWIN_100 :Darwin 100 +STR_VEHICLE_NAME_AIRCRAFT_DARWIN_200 :Darwin 200 +STR_VEHICLE_NAME_AIRCRAFT_DARWIN_300 :Darwin 300 +STR_VEHICLE_NAME_AIRCRAFT_DARWIN_400 :Darwin 400 +STR_VEHICLE_NAME_AIRCRAFT_DARWIN_500 :Darwin 500 +STR_VEHICLE_NAME_AIRCRAFT_DARWIN_600 :Darwin 600 +STR_VEHICLE_NAME_AIRCRAFT_GURU_GALAXY :Guru Galaxy +STR_VEHICLE_NAME_AIRCRAFT_AIRTAXI_A21 :Aerotaxi A21 +STR_VEHICLE_NAME_AIRCRAFT_AIRTAXI_A31 :Aerotaxi A31 +STR_VEHICLE_NAME_AIRCRAFT_AIRTAXI_A32 :Aerotaxi A32 +STR_VEHICLE_NAME_AIRCRAFT_AIRTAXI_A33 :Aerotaxi A33 +STR_VEHICLE_NAME_AIRCRAFT_YATE_AEROSPACE_YAE46 :Yate Aerospace YAe46 +STR_VEHICLE_NAME_AIRCRAFT_DINGER_100 :Dinger 100 +STR_VEHICLE_NAME_AIRCRAFT_AIRTAXI_A34_1000 :Aerotaxi A34-1000 +STR_VEHICLE_NAME_AIRCRAFT_YATE_Z_SHUTTLE :Yate Z-Shuttle +STR_VEHICLE_NAME_AIRCRAFT_KELLING_K1 :Kelling K1 +STR_VEHICLE_NAME_AIRCRAFT_KELLING_K6 :Kelling K6 +STR_VEHICLE_NAME_AIRCRAFT_KELLING_K7 :Kelling K7 +STR_VEHICLE_NAME_AIRCRAFT_DARWIN_700 :Darwin 700 +STR_VEHICLE_NAME_AIRCRAFT_FFP_HYPERDART_2 :FFP Hyperdart 2 +STR_VEHICLE_NAME_AIRCRAFT_DINGER_200 :Dinger 200 +STR_VEHICLE_NAME_AIRCRAFT_DINGER_1000 :Dinger 1000 +STR_VEHICLE_NAME_AIRCRAFT_PLODDYPHUT_100 :Ploddyphut 100 +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 :Helicóptero Tricario +STR_VEHICLE_NAME_AIRCRAFT_GURU_X2_HELICOPTER :Helicóptero Guru X2 +STR_VEHICLE_NAME_AIRCRAFT_POWERNAUT_HELICOPTER :Helicóptero Powernaut + +##id 0x8800 +# Formatting of some strings +STR_FORMAT_DATE_TINY :{0:STRING}/{1:STRING}/{2:NUM} +STR_FORMAT_DATE_SHORT :{STRING} {NUM} +STR_FORMAT_DATE_LONG :{0:STRING} {1:STRING} {2:NUM} +STR_FORMAT_DATE_ISO :{2:NUM}-{1:STRING}-{0:STRING} + +STR_FORMAT_BUOY_NAME :Boya {TOWN} +STR_FORMAT_BUOY_NAME_SERIAL :Boya {TOWN} #{COMMA} +STR_FORMAT_COMPANY_NUM :(Empresa {COMMA}) +STR_FORMAT_GROUP_NAME :Grupo {COMMA} +STR_FORMAT_INDUSTRY_NAME :{1:STRING}, {0:TOWN} +STR_FORMAT_WAYPOINT_NAME :Punto guía, {TOWN} +STR_FORMAT_WAYPOINT_NAME_SERIAL :Punto guía #{1:COMMA}, {0:TOWN} + +STR_FORMAT_DEPOT_NAME_TRAIN :Depósito de trenes, {TOWN} +STR_FORMAT_DEPOT_NAME_TRAIN_SERIAL :Depósito de trenes #{1:COMMA}, {0:TOWN} +STR_FORMAT_DEPOT_NAME_ROAD_VEHICLE :Depósito de vehículos de carretera, {TOWN} +STR_FORMAT_DEPOT_NAME_ROAD_VEHICLE_SERIAL :Depósito de vehículos de carretera #{1:COMMA}, {0:TOWN} +STR_FORMAT_DEPOT_NAME_SHIP :Astillero, {TOWN} +STR_FORMAT_DEPOT_NAME_SHIP_SERIAL :Astillero #{1:COMMA}, {0:TOWN} +STR_FORMAT_DEPOT_NAME_AIRCRAFT :Hangar de {STATION} + +STR_UNKNOWN_STATION :estación desconocida +STR_DEFAULT_SIGN_NAME :Cartel +STR_COMPANY_SOMEONE :alguien + +STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING} +STR_SAVEGAME_NAME_SPECTATOR :Espectador, {1:STRING} + +# Viewport strings +STR_VIEWPORT_TOWN_POP :{WHITE}{TOWN} ({COMMA}) +STR_VIEWPORT_TOWN :{WHITE}{TOWN} +STR_VIEWPORT_TOWN_TINY_BLACK :{TINY_FONT}{BLACK}{TOWN} +STR_VIEWPORT_TOWN_TINY_WHITE :{TINY_FONT}{WHITE}{TOWN} + +STR_VIEWPORT_SIGN_SMALL_BLACK :{TINY_FONT}{BLACK}{SIGN} +STR_VIEWPORT_SIGN_SMALL_WHITE :{TINY_FONT}{WHITE}{SIGN} + +STR_VIEWPORT_STATION :{STATION} {STATION_FEATURES} +STR_VIEWPORT_STATION_TINY :{TINY_FONT}{STATION} + +STR_VIEWPORT_WAYPOINT :{WAYPOINT} +STR_VIEWPORT_WAYPOINT_TINY :{TINY_FONT}{WAYPOINT} + +# Simple strings to get specific types of data +STR_COMPANY_NAME :{COMPANY} +STR_COMPANY_NAME_COMPANY_NUM :{COMPANY} {COMPANY_NUM} +STR_DEPOT_NAME :{DEPOT} +STR_ENGINE_NAME :{ENGINE} +STR_HIDDEN_ENGINE_NAME :{ENGINE} (oculto) +STR_GROUP_NAME :{GROUP} +STR_INDUSTRY_NAME :{INDUSTRY} +STR_PRESIDENT_NAME :{PRESIDENT_NAME} +STR_SIGN_NAME :{SIGN} +STR_STATION_NAME :{STATION} +STR_TOWN_NAME :{TOWN} +STR_VEHICLE_NAME :{VEHICLE} +STR_WAYPOINT_NAME :{WAYPOINT} + +STR_JUST_CARGO :{CARGO_LONG} +STR_JUST_CHECKMARK :{CHECKMARK} +STR_JUST_COMMA :{COMMA} +STR_JUST_CURRENCY_SHORT :{CURRENCY_SHORT} +STR_JUST_CURRENCY_LONG :{CURRENCY_LONG} +STR_JUST_CARGO_LIST :{CARGO_LIST} +STR_JUST_INT :{NUM} +STR_JUST_DATE_TINY :{DATE_TINY} +STR_JUST_DATE_SHORT :{DATE_SHORT} +STR_JUST_DATE_LONG :{DATE_LONG} +STR_JUST_DATE_ISO :{DATE_ISO} +STR_JUST_STRING :{STRING} +STR_JUST_STRING_STRING :{STRING}{STRING} +STR_JUST_RAW_STRING :{STRING} +STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRING} + +# Slightly 'raw' stringcodes with colour or size +STR_BLACK_COMMA :{BLACK}{COMMA} +STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_COMMA :{TINY_FONT}{COMMA} +STR_BLUE_COMMA :{BLUE}{COMMA} +STR_RED_COMMA :{RED}{COMMA} +STR_WHITE_COMMA :{WHITE}{COMMA} +STR_TINY_BLACK_DECIMAL :{TINY_FONT}{BLACK}{DECIMAL} +STR_COMPANY_MONEY :{WHITE}{CURRENCY_LONG} +STR_BLACK_DATE_LONG :{BLACK}{DATE_LONG} +STR_WHITE_DATE_LONG :{WHITE}{DATE_LONG} +STR_SHORT_DATE :{WHITE}{DATE_TINY} +STR_DATE_LONG_SMALL :{TINY_FONT}{BLACK}{DATE_LONG} +STR_TINY_GROUP :{TINY_FONT}{GROUP} +STR_BLACK_INT :{BLACK}{NUM} +STR_ORANGE_INT :{ORANGE}{NUM} +STR_WHITE_SIGN :{WHITE}{SIGN} +STR_TINY_BLACK_STATION :{TINY_FONT}{BLACK}{STATION} +STR_BLACK_STRING :{BLACK}{STRING} +STR_BLACK_RAW_STRING :{BLACK}{STRING} +STR_ORANGE_STRING :{ORANGE}{STRING} +STR_LTBLUE_STRING :{LTBLUE}{STRING} +STR_WHITE_STRING :{WHITE}{STRING} +STR_ORANGE_STRING1_WHITE :{ORANGE}{STRING}{WHITE} +STR_ORANGE_STRING1_LTBLUE :{ORANGE}{STRING}{LTBLUE} +STR_TINY_BLACK_HEIGHT :{TINY_FONT}{BLACK}{HEIGHT} +STR_TINY_BLACK_VEHICLE :{TINY_FONT}{BLACK}{VEHICLE} +STR_TINY_RIGHT_ARROW :{TINY_FONT}{RIGHT_ARROW} + +STR_BLACK_1 :{BLACK}1 +STR_BLACK_2 :{BLACK}2 +STR_BLACK_3 :{BLACK}3 +STR_BLACK_4 :{BLACK}4 +STR_BLACK_5 :{BLACK}5 +STR_BLACK_6 :{BLACK}6 +STR_BLACK_7 :{BLACK}7 + +STR_TRAIN :{BLACK}{TRAIN} +STR_BUS :{BLACK}{BUS} +STR_LORRY :{BLACK}{LORRY} +STR_PLANE :{BLACK}{PLANE} +STR_SHIP :{BLACK}{SHIP} + +STR_TOOLBAR_RAILTYPE_VELOCITY :{STRING} ({VELOCITY}) diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 96b81d34dd..1e9fe336a7 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -669,17 +669,14 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Välj sp STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Växla slumpning av/på STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Visa fönstret för val av musikspår -STR_ERROR_NO_SONGS :{WHITE}Ett musikpaket utan låtar har valts. Ingen musik kommer att spelas - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Konstruera spellista STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Spårindex STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Spellista - '{STRING}' STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Töm STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Töm aktuell spellista (enbart Personlig1 eller Personlig2) STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Klicka på ett musikstycke för att lägga till det i spellistan (enbart Personlig1 eller Personlig2) -STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klicka på ett musikstycket för att ta bort det från spellistan (endast Personlig1 och Personlig2) +STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Klicka på ett musikstycke för att ta bort det från spellistan (endast Personlig1 och Personlig2) # Highscore window STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}De bästa företagen som nådde {NUM} @@ -1237,7 +1234,7 @@ STR_CONFIG_SETTING_ALLOW_FUND_ROAD_HELPTEXT :Tillåt att fö STR_CONFIG_SETTING_ALLOW_GIVE_MONEY :Tillåt skicka pengar till andra företag: {STRING} STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :Tillåt överföring av pengar mellan företag i flerspelarläge STR_CONFIG_SETTING_FREIGHT_TRAINS :Godsfaktor för att simulera tunga tåg: {STRING} -STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :Ställ in påverkan av att frakta gods i tåg. Ett högre värde gör att frakt-gods är mer krävande för tågen, speciellt vid lutningar +STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :Ställ in påverkan av att frakta gods i tåg. Ett högre värde gör att fraktgods är mer krävande för tågen, speciellt vid lutningar STR_CONFIG_SETTING_PLANE_SPEED :Hastighetsfaktor för flygplan: {STRING} STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT :Ställ in relativ hastighet för flygplan relativt övriga fordonstyper. Detta reducerar inkomsterna för flygtransporter. STR_CONFIG_SETTING_PLANE_SPEED_VALUE :1 / {COMMA} @@ -1246,10 +1243,10 @@ STR_CONFIG_SETTING_PLANE_CRASHES_HELPTEXT :Ställ in hur s STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Inga STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :Reducerad STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :Normal -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Tillåt genomfarts-stopp på stadsägda vägar: {STRING} -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Tillåt konstruktion av genomfarts-stopp på stadsägda vägar +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Tillåt genomfartshållplatser på stadsägda vägar: {STRING} +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Tillåt konstruktion av genomfartshållplatser på stadsägda vägar STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD :Tillåt dina fordon att köra genom motståndarens hållplatser: {STRING} -STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT :Tillåt konstruktion av genomfarts-stopp på vägar som ägs av andra företag +STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT :Tillåt konstruktion av genomfartshållplatser på vägar som ägs av andra företag STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}Det är inte möjligt att ändra denna inställning när det finns fordon STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE :Underhåll av infrastruktur: {STRING} STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Om det är aktiverat så kostar underhåll av infrastruktur. Kostnaden ökar mer än proportionellt mot nätverkets storlek, vilket innebär att större företag drabbas hårdare än små företag av underhållskostnader. @@ -1296,8 +1293,8 @@ STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Original STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_TERRAIN_TYPE :Terrängtyp: {STRING} STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(TerraGenesis endast) Hilliness av landskapet -STR_CONFIG_SETTING_INDUSTRY_DENSITY :Industri densitet: {STRING} -STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Ange hur många industrier ska genereras och vilken nivå bör bibehållas under spelet +STR_CONFIG_SETTING_INDUSTRY_DENSITY :Industritäthet: {STRING} +STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Ange hur många industrier som ska genereras och vilken nivå som ska bibehållas under spelet STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Maximalt avstånd mellan oljeraffinaderier och kartans kant: {STRING} STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Oljeraffinaderier byggs bara nära kartans kanter, alltså vid kusten om det är en ö-karta STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Snölinjeshöjd: {STRING} @@ -1337,8 +1334,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Terrängens fä STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Grön STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Mörkgrön STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violett -STR_CONFIG_SETTING_REVERSE_SCROLLING :Omvänd scrollriktning: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Beteende för skrollning av kartan med den högra musknappen. När det är inaktiverat rör musen kameran. När det är aktiverat rör musen kartan STR_CONFIG_SETTING_SMOOTH_SCROLLING :Mjuk scrollning av vy: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Kontrollera hur huvudvyn skrollar till en specifik position vid klick på minikartan eller när ett kommando används för att skrolla till ett specifikt objekt på kartan. Om det är aktiverat skrollar vyn mjukt, om det är inaktiverat hoppar den direkt till målet STR_CONFIG_SETTING_MEASURE_TOOLTIP :Visa måtthjälptext vid användning av byggverktyg: {STRING} @@ -1370,8 +1365,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command-klick STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Control-klick STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Av -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Scrolla med vänster musknappsklick: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Aktivera skrollning av kartan genom att dra den med den vänstra musknappen. Detta är särskilt användbart för skrollning vid användning av en pekskärm +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Stäng fönster med högerklick: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Stänger fönster när man högerklickar inuti dem. Denna inställning inaktiverar tooltips vid högerklick! STR_CONFIG_SETTING_AUTOSAVE :Autospara: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Välj intervall mellan automatisk sparande @@ -1761,6 +1756,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Kolla ef STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Visa inställningar för datorspelare och spelskript STR_INTRO_TOOLTIP_QUIT :{BLACK}Avsluta 'OpenTTD' +STR_INTRO_BASESET :{BLACK}Det grafikpaket som för närvarande är valt som standard saknar {NUM} sprite{P "" s}. Vänligen kontrollera om det finns en uppdatering till paketet. STR_INTRO_TRANSLATION :{BLACK}Den här översättningen saknar {NUM} sträng{P "" ar}. Hjälp gärna till att förbättra OpenTTD genom att bli översättare. Se readme.txt för mer info. # Quit window @@ -1792,7 +1788,7 @@ STR_CHEATS_TOOLTIP :{BLACK}Checkbox STR_CHEATS_WARNING :{BLACK}Varning! Du är på väg att förråda dina motståndare. Kom ihåg att detta inte kommer glömmas STR_CHEAT_MONEY :{LTBLUE}Öka pengar med {CURRENCY_LONG} STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Spelar som företag:: {ORANGE}{COMMA} -STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Magisk Bulldozer (ta bort industrier, oflyttbara objekt etc.): {ORANGE}{STRING} +STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Magisk bulldozer (ta bort industrier, oflyttbara objekt etc.): {ORANGE}{STRING} STR_CHEAT_CROSSINGTUNNELS :{LTBLUE}Tunnlar kan korsa varandra: {ORANGE}{STRING} STR_CHEAT_NO_JETCRASH :{LTBLUE}Jetplan kommer inte att störta (frekvent) på små flygplatser: {ORANGE} {STRING} STR_CHEAT_EDIT_MAX_HL :{LTBLUE}Ändra maximal karthöjd: {ORANGE}{NUM} @@ -1803,7 +1799,7 @@ STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Sub-tropiskt la STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Leksakslandskap STR_CHEAT_CHANGE_DATE :{LTBLUE}Byt datum: {ORANGE} {DATE_SHORT} STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Ändra nuvarande år -STR_CHEAT_SETUP_PROD :{LTBLUE}Aktivera modifierande produceringsvärden: {ORANGE}{STRING} +STR_CHEAT_SETUP_PROD :{LTBLUE}Aktivera modifiering av produktionsvärden: {ORANGE}{STRING} # Livery window STR_LIVERY_CAPTION :{WHITE}Nytt färgval @@ -1813,8 +1809,8 @@ STR_LIVERY_TRAIN_TOOLTIP :{BLACK}Visa fä STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Visa färgscheman för vägfordon STR_LIVERY_SHIP_TOOLTIP :{BLACK}Visa färgscheman för skepp STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Visa färgschema för flygplan -STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Välj huvudfärg för det aktuella schemat. Ctrl+Click kommer att välja färgen för alla scheman -STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Välj andravalsfärgen för det aktuella schemat. Ctrl+Click kommer att välja färgen för alla scheman +STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Välj huvudfärg för det aktuella schemat. Ctrl+klick kommer att välja färgen för alla scheman +STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Välj andravalsfärgen för det aktuella schemat. Ctrl+klick kommer att välja färgen för alla scheman STR_LIVERY_PANEL_TOOLTIP :{BLACK}Välj ett färgschema att ändra eller välj flera genom CTRL+klick. Bocka för rutan för att använda scheman STR_LIVERY_DEFAULT :Normalt färgschema @@ -2452,12 +2448,12 @@ STR_STATION_BUILD_AIRPORT_TOOLTIP :{BLACK}Välj st STR_STATION_BUILD_AIRPORT_CLASS_LABEL :{BLACK}Flygplatsklass STR_STATION_BUILD_AIRPORT_LAYOUT_NAME :{BLACK}Layout {NUM} -STR_AIRPORT_SMALL :Liten +STR_AIRPORT_SMALL :Liten flygplats STR_AIRPORT_CITY :Stad STR_AIRPORT_METRO :Storstads-flygplats STR_AIRPORT_INTERNATIONAL :Internationell flygplats STR_AIRPORT_COMMUTER :Pendlare -STR_AIRPORT_INTERCONTINENTAL :Interkontinental +STR_AIRPORT_INTERCONTINENTAL :Interkontinental flygplats STR_AIRPORT_HELIPORT :Helikopterplatta STR_AIRPORT_HELIDEPOT :Helikopterhangar STR_AIRPORT_HELISTATION :Helikopterstation @@ -2552,7 +2548,7 @@ STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}Grunda # Industry cargoes window STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Industrikedja för {STRING} industrin -STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Industrikedja för {STRING} godset +STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Industrikedja för godset {STRING} STR_INDUSTRY_CARGOES_PRODUCERS :{WHITE}Producerande industrier STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Mottagande industrier STR_INDUSTRY_CARGOES_HOUSES :{WHITE}Hus @@ -2589,6 +2585,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Flygplat STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Accepterat gods: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Spårtyp: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Hastighetsgräns för järnvägsspår: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Hastighetsbegränsning på väg: {LTBLUE}{VELOCITY} @@ -2601,29 +2598,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Fält STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Snötäckt mark STR_LAI_CLEAR_DESCRIPTION_DESERT :Öken -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} järnvägsspår -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} järnvägsspår med normal signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} järnvägsspår med försignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} järnvägsspår med utfartssignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} järnvägsspår med kombinationssignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} järnvägsspår med avancerad signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} järnvägsspår med avancerad envägssignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} järnvägsspår med normal signal och försignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} järnvägsspår med normal signal och utfartssignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} järnvägsspår med normal signal och kombinationssignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} järnvägsspår med normal signal och avancerad signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} järnvägsspår med normal signal och avancerad envägssignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} järnvägsspår med för- och utfartssignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} järnvägsspår med för- och kombinationssignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} järnvägsspår med försignal och avancerad signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} järnvägsspår med försignal och envägs avancerad signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} järnvägsspår med utfarts- och kombinationssignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} järnvägsspår med utfartssignal och avancerad signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} järnvägsspår med utfartssignal och avancerad envägssignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} järnvägsspår med kombinationssignal och avancerad signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} järnvägsspår med kombinationssignal och avancerad envägssignal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} järnvägsspår med avancerad signal och avancerad envägssignal -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} järvägsdepå +STR_LAI_RAIL_DESCRIPTION_TRACK :Järnvägsspår +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Järnvägsspår med normal signal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Järnvägsspår med försignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Järnvägsspår med utfartssignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Järnvägsspår med kombinationssignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Järnvägsspår med avancerad signal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Järnvägsspår med avancerad envägssignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Järnvägsspår med normal signal och försignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Järnvägsspår med normal signal och utfartssignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Järnvägsspår med normal signal och kombinationssignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Järnvägsspår med normal signal och avancerad signal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Järnvägsspår med normal signal och avancerad envägssignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Järnvägsspår med för- och utfartssignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Järnvägsspår med för- och kombinationssignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Järnvägsspår med försignal och avancerad signal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Järnvägsspår med försignal och avancerad envägssignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Järnvägsspår med utfarts- och kombinationssignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Järnvägsspår med utfartssignal och avancerad signal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Järnvägsspår med utfartssignal och avancerad envägssignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Järnvägsspår med kombinationssignal och avancerad signal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Järnvägsspår med kombinationssignal och avancerad envägssignal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Järnvägsspår med avancerad signal och avancerad envägssignal +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Järnvägsdepå STR_LAI_ROAD_DESCRIPTION_ROAD :Väg STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Väg med gatubelysning @@ -2685,9 +2682,16 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Mark som ägs a # About OpenTTD window STR_ABOUT_OPENTTD :{WHITE}Om OpenTTD -STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Ursprunglig äganderätt {COPYRIGHT} 1995 Chris Sawyer, Alla rättigheter hävdas +STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Ursprunglig upphovsrätt {COPYRIGHT} 1995 Chris Sawyer, Alla rättigheter hävdas STR_ABOUT_VERSION :{BLACK}OpenTTD-version {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 OpenTTD-teamet +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 @@ -2906,8 +2910,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Försökt att a STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} innehåller en skadad bild. Alla korrupta bilder kommer att visas som ett rött frågetecken (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Innehåller flera Action 8 (spriteobjekt {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Läste förbi slutet av pseudo-spriteobjekt (spriteobjekt {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Det aktiva grafikpaketet saknar ett antal bilder.{}Var vänlig och uppdatera grafikpaketet -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Det aktiva grafikpaketet saknar ett antal bilder.{}Var vänlig och uppdatera grafikpaketet.{}Eftersom du spelar en {YELLOW}utvecklings-version av OpenTTD{WHITE}, så kan du även behöva en {YELLOW}utvecklings-version av basgrafikpaketet{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Efterfrågade GRF-resurser är inte tillgängliga (spriteobjekt {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} har inaktiverats av {2:STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Felaktig/okänd layout-format av spriteobjekt (spriteobjekt {3:NUM}) @@ -2982,8 +2984,6 @@ STR_TOWN_POPULATION :{BLACK}Global f STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Stad) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Invånare: {ORANGE}{COMMA}{BLACK} Hus: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Passagerare förra månaden: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Post förra månaden: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Fraktgods behövs för ortens tillväxt: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} krävs STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} krävs under vintern @@ -3114,8 +3114,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Accepter STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Visa lista över accepterat gods STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Accepterar: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Den här stationen har exklusiva transporträttigheter i den här staden. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} har köpt exklusiva transporträttigheter i den här staden. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Den här stationen har exklusiva transporträttigheter i den här staden. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} har köpt exklusiva transporträttigheter i den här staden. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Värderingar STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Visa stationens klassificering @@ -3205,7 +3205,7 @@ STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENC STR_FINANCES_BORROW_BUTTON :{BLACK}Låna {CURRENCY_LONG} STR_FINANCES_BORROW_TOOLTIP :{BLACK}Öka lånets storlek. Ctrl + Klick lånar så mycket som möjligt STR_FINANCES_REPAY_BUTTON :{BLACK}Återbetala {CURRENCY_LONG} -STR_FINANCES_REPAY_TOOLTIP :{BLACK}Återbetala en del av lånet. Ctrl+Klick återbetalar så mycket som möjligt +STR_FINANCES_REPAY_TOOLTIP :{BLACK}Återbetala en del av lånet. Ctrl+klick återbetalar så mycket som är möjligt STR_FINANCES_INFRASTRUCTURE_BUTTON :{BLACK}Infrastruktur # Company view @@ -3294,9 +3294,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Kräver: STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Kräver: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Kräver: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} väntar{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Last som väntar på att bli behandlad: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Producerar: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Producerar: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3363,6 +3365,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Ta bort alla fo STR_GROUP_RENAME_CAPTION :{BLACK}Döp om en grupp +STR_GROUP_PROFIT_THIS_YEAR :Vinst i år: +STR_GROUP_PROFIT_LAST_YEAR :Vinst förra året: +STR_GROUP_OCCUPANCY :Nuvarande användning: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nytt tågfordon STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nya elektriska järnvägsfordon @@ -3394,6 +3401,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Alla typer av l STR_PURCHASE_INFO_ALL_BUT :Allt utom {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Maximal Dragkraft: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Räckvidd: {GOLD}{COMMA} rutor +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Flygplanstyp: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista av tågvagnar. Klicka på tågvagn för information. Ctrl+klick visar eller döljer vagnstypen STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Vägfordonslista. Klicka på fordon för information. Ctrl+klick visar eller döljer fordonstypen @@ -3527,10 +3535,11 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :maglev-lok STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Kostnad: {CURRENCY_LONG} Vikt: {WEIGHT_SHORT}{}Hastighet: {VELOCITY} Kraft {POWER}{}Löpande kostnad: {CURRENCY_LONG}/år{}Kapacitet: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Kostnad: {CURRENCY_LONG} Vikt: {WEIGHT_SHORT}{}Hastighet: {VELOCITY} Effekt: {POWER} Max. T.E.: {6:FORCE}{}Löpande kostnad: {4:CURRENCY_LONG}/år{}Kapacitet: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Kostnad: {CURRENCY_LONG} Maxhastiget: {VELOCITY}{}Kapacitet: {CARGO_LONG}, {CARGO_LONG}{}Körkostnad: {CURRENCY_LONG}/år -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Kostnad: {CURRENCY_LONG} Maxhastiget: {VELOCITY}{}Kapacitet: {CARGO_LONG}{}Körkostnad: {CURRENCY_LONG}/år -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Kostnad: {CURRENCY_LONG} Maxhastighet: {VELOCITY} Räckvidd: {COMMA} rutor{}Kapacitet: {CARGO_LONG}, {CARGO_LONG}{}Driftkostnad: {CURRENCY_LONG}/år -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Kostnad: {CURRENCY_LONG} Maxhastighet: {VELOCITY} Räckvidd: {COMMA} rutor{}Kapacitet: {CARGO_LONG}{}Driftkostnad: {CURRENCY_LONG}/yr +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Kostnad: {CURRENCY_LONG} Maxhastiget: {VELOCITY}{}Kapacitet: {CARGO_LONG}{}Körkostnad: {CURRENCY_LONG}/år +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Kostnad: {CURRENCY_LONG} Maxhastighet: {VELOCITY}{}Flygplanstyp: {STRING}{}Kapacitet: {CARGO_LONG}, {CARGO_LONG}{}Körkostnad: {CURRENCY_LONG}/år +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Kostnad: {CURRENCY_LONG} Maxhastighet: {VELOCITY}{}Flygplanstyp: {STRING}{}Kapacitet: {CARGO_LONG}{}Körkostnad: {CURRENCY_LONG}/år +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Kostnad: {CURRENCY_LONG} Maxhastighet: {VELOCITY}{}Flygplanstyp: {STRING} Räckvidd: {COMMA} rutor{}Kapacitet: {CARGO_LONG}, {CARGO_LONG}{}Körkostnad: {CURRENCY_LONG}/år +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Kostnad: {CURRENCY_LONG} Maxhastighet: {VELOCITY}{}Flygplanstyp: {STRING} Räckvidd: {COMMA} rutor{}Kapacitet: {CARGO_LONG}{}Körkostnad: {CURRENCY_LONG}/år # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Byt ut {STRING} - {STRING} @@ -3557,10 +3566,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} vid h STR_REPLACE_VEHICLES_STOP :{BLACK}Sluta byta ut fordon STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Tryck för att sluta byta ut fordonstypen vald på vänster sida -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Ersätter: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Växla mellan lok- och vagnersättningsfönster STR_REPLACE_ENGINES :Lok STR_REPLACE_WAGONS :Vagnar +STR_REPLACE_ALL_RAILTYPE :Alla järnvägsfordon STR_REPLACE_HELP_RAILTYPE :{BLACK}Välj vilken järnvägstyp du vill byta ut lok för STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Visa vilket fordon det vänstra fordonet byts ut till, om något @@ -3570,7 +3579,7 @@ STR_REPLACE_MONORAIL_VEHICLES :Monorail-fordon STR_REPLACE_MAGLEV_VEHICLES :Maglevfordon STR_REPLACE_REMOVE_WAGON :{BLACK}Vagnborttagning: {ORANGE}{STRING} -STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Gör så att automatiskt utbytning behåller ett tågs längd genom att ta bort vagnar (med början längst fram) om utbytandet av loket skulle göra tåget längre +STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Gör så att automatiskt utbyte behåller ett tågs längd genom att ta bort vagnar (med början längst fram) om utbytandet av loket skulle göra tåget längre # Vehicle view STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE} @@ -3653,7 +3662,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} år ({C STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} år ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Maxhastiget: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Maxhastighet: {LTBLUE}{VELOCITY} {BLACK}Räckvidd: {LTBLUE}{COMMA} rutor +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Maxhastighet: {LTBLUE}{VELOCITY} {BLACK}Flygplanstyp: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Maxhastighet: {LTBLUE}{VELOCITY} {BLACK}Flygplanstyp: {LTBLUE}{STRING} {BLACK}Räckvidd: {LTBLUE}{COMMA} rutor STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Vikt: {LTBLUE}{WEIGHT_SHORT} {BLACK}Kraft: {LTBLUE}{POWER}{BLACK} Maxhastiget: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Vikt: {LTBLUE}{WEIGHT_SHORT} {BLACK}Kraft: {LTBLUE}{POWER}{BLACK} Maxhastiget: {LTBLUE}{VELOCITY} {BLACK}Max. T.E.: {LTBLUE}{FORCE} @@ -3713,7 +3723,7 @@ STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Ny kapac STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}Ny kapacitet: {GOLD}{CARGO_LONG}{}{BLACK}Inkomstens vinst: {GREEN}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Ny kapacitet: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Kostnad för anpassning: {RED}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Ny kapacitet: {GOLD}{CARGO_LONG}. {GOLD}{CARGO_LONG}{}{BLACK}Inkomstens vinst: {GREEN}{CURRENCY_LONG} -STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Välj vilka fordon som ska anpassas. Genom att dra med musen kan flera fordon väljas. Klicka på en tom yta för att välja hela fordonet. Ctrl+Klick på ett fordon kommer att välja hela resterande kedjan +STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Välj vilka fordon som ska anpassas. Genom att dra med musen kan flera fordon väljas. Klicka på en tom yta för att välja hela fordonet. Ctrl+klick på ett fordon kommer att välja det och hela den resterande kedjan STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Välj godstyp för tåget att bära STR_REFIT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Välj lasttyp för fordon @@ -4112,7 +4122,7 @@ STR_ERROR_MESSAGE_CAPTION_OTHER_COMPANY :{YELLOW}Meddela # Generic construction errors STR_ERROR_OFF_EDGE_OF_MAP :{WHITE}Utanför kanten STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP :{WHITE}För nära kanten av kartan -STR_ERROR_NOT_ENOUGH_CASH_REQUIRES_CURRENCY :{WHITE}Inte tillräckligt med pengar - krävs {CURRENCY_LONG} +STR_ERROR_NOT_ENOUGH_CASH_REQUIRES_CURRENCY :{WHITE}Inte tillräckligt med pengar - kräver {CURRENCY_LONG} STR_ERROR_FLAT_LAND_REQUIRED :{WHITE}Platt mark krävs STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION :{WHITE}Marken lutar åt fel håll STR_ERROR_CAN_T_DO_THIS :{WHITE}Kan inte utföra detta... @@ -4132,7 +4142,7 @@ STR_ERROR_NOT_ALLOWED_WHILE_PAUSED :{WHITE}Inte til # Local authority errors STR_ERROR_LOCAL_AUTHORITY_REFUSES_TO_ALLOW_THIS :{WHITE}De lokala myndigheterna i {TOWN} tillåter inte detta STR_ERROR_LOCAL_AUTHORITY_REFUSES_AIRPORT :{WHITE}De lokala myndigheterna i {TOWN} tillåter inte att ytterligare en flygplats byggs i staden -STR_ERROR_LOCAL_AUTHORITY_REFUSES_NOISE :{WHITE}{TOWN}'s lokala myndigheter vägrar ge tillåtelse att bygga en flygplats på grund av ljudproblem +STR_ERROR_LOCAL_AUTHORITY_REFUSES_NOISE :{WHITE}De lokala myndigheterna i {TOWN} vägrar ge tillåtelse att bygga en flygplats på grund av ljudproblem STR_ERROR_BRIBE_FAILED :{WHITE}Ditt mutningsförsök upptäcktes av en regional granskare # Levelling errors @@ -4151,7 +4161,7 @@ STR_ERROR_CAN_T_CHANGE_PRESIDENT :{WHITE}Kan inte STR_ERROR_MAXIMUM_PERMITTED_LOAN :{WHITE}... maximal storlek på lånet är {CURRENCY_LONG} STR_ERROR_CAN_T_BORROW_ANY_MORE_MONEY :{WHITE}Kan inte låna mer pengar... -STR_ERROR_LOAN_ALREADY_REPAYED :{WHITE}... lånet redan återbetalt +STR_ERROR_LOAN_ALREADY_REPAYED :{WHITE}... lånet är redan återbetalt STR_ERROR_CURRENCY_REQUIRED :{WHITE}... {CURRENCY_LONG} krävs STR_ERROR_CAN_T_REPAY_LOAN :{WHITE}Kan inte återbetala lånet... STR_ERROR_INSUFFICIENT_FUNDS :{WHITE}Kan inte ge bort pengar som är lånade från banken... @@ -4207,19 +4217,18 @@ STR_ERROR_CAN_T_BUILD_DOCK_HERE :{WHITE}Kan inte STR_ERROR_CAN_T_BUILD_AIRPORT_HERE :{WHITE}Kan inte bygga flygplats här... STR_ERROR_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}Angränsar till mer än en station/hållplats -STR_ERROR_STATION_TOO_SPREAD_OUT :{WHITE}... station för utspridd +STR_ERROR_STATION_TOO_SPREAD_OUT :{WHITE}... stationen för utspridd STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}För många stationer/hållplatser 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 stationer/hållplatser 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... STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... detta är en stadsägd väg STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... vägen pekar i fel riktning -STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... drive through stopp kan inte ha gatuhörn -STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... drive through stopp kan inte ha korsningar +STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... genomfartshållplatser kan inte ha gatuhörn +STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... genomfartshållplatser kan inte ha korsningar # Station destruction related errors STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Kan ej ta bort del av station... @@ -4265,7 +4274,7 @@ STR_ERROR_ROAD_VEHICLE_MUST_BE_STOPPED_INSIDE_DEPOT :{WHITE}... mås STR_ERROR_SHIP_MUST_BE_STOPPED_INSIDE_DEPOT :{WHITE}... måste stoppas i en depå STR_ERROR_AIRCRAFT_MUST_BE_STOPPED_INSIDE_HANGAR :{WHITE}... måste stoppas i en hangar -STR_ERROR_TRAINS_CAN_ONLY_BE_ALTERED_INSIDE_A_DEPOT :{WHITE}Tåg kan bara ändras när det står still inuti en depå +STR_ERROR_TRAINS_CAN_ONLY_BE_ALTERED_INSIDE_A_DEPOT :{WHITE}Tåg kan bara ändras när det står stilla inuti en depå STR_ERROR_TRAIN_TOO_LONG :{WHITE}Tåg för långt STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE :{WHITE}Kan inte byta fordonets riktning... STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE_MULTIPLE_UNITS :{WHITE}... består av flera delar @@ -4360,7 +4369,7 @@ STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... du STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Kan inte skapa grupp... STR_ERROR_GROUP_CAN_T_DELETE :{WHITE}Kan inte ta bort denna grupp... STR_ERROR_GROUP_CAN_T_RENAME :{WHITE}Kan inte döpa om grupp... -STR_ERROR_GROUP_CAN_T_SET_PARENT :{WHITE}Kan inte ställa föräldragrupp ... +STR_ERROR_GROUP_CAN_T_SET_PARENT :{WHITE}Kan inte ställa in föräldragrupp ... STR_ERROR_GROUP_CAN_T_REMOVE_ALL_VEHICLES :{WHITE}Kan inte ta bort alla fordon i denna grupp... STR_ERROR_GROUP_CAN_T_ADD_VEHICLE :{WHITE}Kan inte lägga till fordon i denna grupp... STR_ERROR_GROUP_CAN_T_ADD_SHARED_VEHICLE :{WHITE}Kan inte lägga till delade fordon i denna grupp... diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt index d1636e034a..d123db86e1 100644 --- a/src/lang/tamil.txt +++ b/src/lang/tamil.txt @@ -659,10 +659,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_1_USER_DEFINED :{BLACK}'பய STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}'பயனரால் மாற்றியமைக்கப்பட்ட 2' பிரோகிராமினைத் தேர்ந்தெடுக்கவும் STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}இசைத் த்டத்தினைத் தேர்ந்தெடுக்கும் திரையினைக் காட்டு -STR_ERROR_NO_SONGS :{WHITE}இசைத்தடமே இல்லாதப் பட்டியல் தேர்ந்தெடுக்கப்பட்டுள்ளது. எந்த பாட்டும் ஒலிக்காது - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}இசை பிரோகிராம் தேர்ந்தெடுத்தல் STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}இசைத்தடம் வரிசை STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}பிரோகிராம் - '{STRING}' @@ -1200,9 +1197,11 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL :நகரத் STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :நகரத்தின் மக்கள்தொகையினை வரைபடத்தில் காட்டவும் STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :வரைபடத்தில் கோடுகளின் எண்ணிக்கை: {STRING} +STR_CONFIG_SETTING_LANDSCAPE : நிலவெளி: {STRING} STR_CONFIG_SETTING_LAND_GENERATOR :நில உருவாக்கி: {STRING} STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :உண்மையான STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis +STR_CONFIG_SETTING_INDUSTRY_DENSITY :தொழிற்சாலை அடர்த்தி: {STRING} STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :வரைபட எல்லையிலிருந்து எண்ணெய் சுத்திகரிப்பு நிலையங்கள் இருக்கக்கூடிய தூரம்: {STRING} STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :எண்ணெய் சுத்திகரிப்பு நிலையங்கள் வரைபடத்தின் எல்லைகளில் மட்டுமே கட்ட இயலும், அதாவது தீவு வரைபடங்களில் கடற்கரைகளில் கட்ட இயலும் STR_CONFIG_SETTING_SNOWLINE_HEIGHT :பனி-கோடின் உயரம்: {STRING} @@ -1215,6 +1214,7 @@ STR_CONFIG_SETTING_TREE_PLACER :மரங்க STR_CONFIG_SETTING_TREE_PLACER_NONE :ஒன்றுமில்லை STR_CONFIG_SETTING_TREE_PLACER_ORIGINAL :உண்மையான STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :சீரமைக்கப்பட்ட +STR_CONFIG_SETTING_ROAD_SIDE :சாலை வாகனங்கள்: {STRING} STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :உயர்பட சுழற்ச்சி: {STRING} STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :வலமிருந்து இடமாக செல் STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :இடமிலிருந்து வலஞ்செல் @@ -1228,7 +1228,6 @@ 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_REVERSE_SCROLLING :திருப்பப்பட்ட பக்கமுருட்டி திசை : {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING :பார்படத்தின் இலகுவான பக்கமுருட்டல்: {STRING} STR_CONFIG_SETTING_LIVERIES :நிறுவன livery களைக் காட்டு: {STRING} STR_CONFIG_SETTING_LIVERIES_NONE :ஒன்றுமில்லை @@ -1250,6 +1249,7 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Click STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :அணை +STR_CONFIG_SETTING_AUTOSAVE :தானியங்கிபதிவு: {STRING} STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :{STRING} தேதி வகையினை பதிவுஆட்டங்கள் பெயர்களுக்கு பயன்படுத்தவும் STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :பதிவு ஆட்டங்கள் கோப்புப் பெயர்களில் உள்ள தேதி வகையினை அமை @@ -1306,6 +1306,7 @@ STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT_HELPTEXT :கணினி STR_CONFIG_SETTING_AI_BUILDS_SHIPS :கணினியிற்கு கப்பல்களை அனுமதிக்காதே: {STRING} STR_CONFIG_SETTING_AI_BUILDS_SHIPS_HELPTEXT :கணினியால் கப்பல்களை பயன்படுத்த இயலாது +STR_CONFIG_SETTING_AI_PROFILE :முதன்மை அமைப்புகள் profile: {STRING} STR_CONFIG_SETTING_AI_PROFILE_EASY :எளிதான STR_CONFIG_SETTING_AI_PROFILE_MEDIUM :நடுத்தரமான STR_CONFIG_SETTING_AI_PROFILE_HARD :கடுமையான @@ -1414,6 +1415,7 @@ STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :ஒன்று STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :தொடக்க நகர அளவு பெருக்கம்: {STRING} STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :ஆட்டத்தின் தொடக்கத்தில் மாநகரங்களின் அளவு நகரங்களை ஒப்பிடுகையில் +STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :கைமுறை STR_CONFIG_SETTING_DISTRIBUTION_PAX :பயணிகள் பரிமாற்றம் வகை: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_MAIL :அஞ்சல் பரிமாற்றம் வகை: {STRING} @@ -1446,11 +1448,17 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :இம்பீ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :மெட்ரிக் (மீ) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (மீ) +STR_CONFIG_SETTING_GRAPHICS :{ORANGE}அசைவூட்டம் STR_CONFIG_SETTING_SOUND :{ORANGE}ஒலிகள் STR_CONFIG_SETTING_INTERFACE :{ORANGE}Interface STR_CONFIG_SETTING_INTERFACE_CONSTRUCTION :{ORANGE}கட்டுமானம் +STR_CONFIG_SETTING_COMPANY :{ORANGE}நிறுவனம் +STR_CONFIG_SETTING_ACCOUNTING :{ORANGE}கணக்கியல் STR_CONFIG_SETTING_VEHICLES :{ORANGE}வாகனங்கள் STR_CONFIG_SETTING_VEHICLES_ROUTING :{ORANGE}வழி மாற்றல் +STR_CONFIG_SETTING_LIMITATIONS :{ORANGE}எல்லைகள் +STR_CONFIG_SETTING_ACCIDENTS :{ORANGE}பேரழிவுகள் / விபத்துகள் +STR_CONFIG_SETTING_ENVIRONMENT :{ORANGE}சுற்றுச்சூழல் STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :{ORANGE}நகரங்கள் STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}தொழிற்சாலைகள் STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}சரக்கு பரிமாற்றம் @@ -2146,6 +2154,7 @@ STR_AIRPORT_CITY :மாநகர STR_AIRPORT_METRO :மாநகர STR_AIRPORT_INTERNATIONAL :சர்வதேச STR_AIRPORT_COMMUTER :பயணிகள் +STR_AIRPORT_INTERCONTINENTAL :கண்டமிடை STR_AIRPORT_HELIPORT :ஹெலிபோர்ட் STR_AIRPORT_HELIDEPOT :வானூர்தி பணிமனை STR_AIRPORT_HELISTATION :வானூர்தி நிலையம் @@ -2279,29 +2288,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :வயல்வ STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :பனி-படர்ந்த நிலம் STR_LAI_CLEAR_DESCRIPTION_DESERT :பாலைவனம் -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} தடம் -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} தடம் கட்ட சிக்னல்களுடன் -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} தடம் முன் சிக்னல்களுடன் -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} தடம் வெளியேறு சிக்னல்களுடன் -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} தடம் இணைந்த சிக்னல்களுடன் -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} தடம் பாதை சிக்னல்களுடன் -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} தடம் ஒருவழிப் பாதை சிக்னல்களுடன் -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} தடம் கட்டம் மற்றும் முன் சிக்னல்களுடன் -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} தடம் கட்டம் மற்றும் வெளியேறு சிக்னல்களுடன் -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} தடம் கட்டம் மற்றும் இணைந்த சிக்னல்களுடன் -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} தடம் கட்டம் மற்றும் பாதை சிக்னல்களுடன் -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} தடம் கட்டம் மற்றும் ஒருவழிப் பாதை சிக்னல்களுடன் -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} தடம் முன் மற்றும் வெளியேறு சிக்னல்களுடன் -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} தடம் முன் மற்றும் இணைந்த சிக்னல்களுடன் -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} தடம் முன் மற்றும் பாதை சிக்னல்களுடன் -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} தடம் முன் மற்றும் ஒருவழிப் பாதை சிக்னல்களுடன் -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} தடம் வெளியேறு மற்றும் இணைந்த சிக்னல்களுடன் -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} தடம் வெளியேறு மற்றும் பாதை சிக்னல்களுடன் -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} தடம் வெளியேறு மற்றும் ஒருவழிப் பாதை சிக்னல்களுடன் -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} தடம் இணைந்த மற்றும் பாதை சிக்னல்களுடன் -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} தடம் இணைந்த மற்றும் ஒருவழிப் பாதை சிக்னல்களுடன் -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} தடம் பாதை மற்றும் ஒருவழிப் பாதை சிக்னல்களுடன் -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} இரயில் பணிமனை +STR_LAI_RAIL_DESCRIPTION_TRACK :இரயில்வே தடம் +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :இரயில்வே தடம் கட்ட சிக்னல்களுடன் +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :இரயில்வே தடம் முன் சிக்னல்களுடன் +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :இரயில்வே தடம் வெளியேறு சிக்னல்களுடன் +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :இரயில்வே தடம் இணைந்த சிக்னல்களுடன் +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :இரயில்வே தடம் பாதை சிக்னல்களுடன் +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :இரயில்வே தடம் ஒருவழிப் பாதை சிக்னல்களுடன் +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :இரயில்வே தடம் கட்டம் மற்றும் முன் சிக்னல்களுடன் +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :இரயில்வே தடம் கட்டம் மற்றும் வெளியேறு சிக்னல்களுடன் +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :இரயில்வே தடம் கட்டம் மற்றும் இணைந்த சிக்னல்களுடன் +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :இரயில்வே தடம் கட்டம் மற்றும் பாதை சிக்னல்களுடன் +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :இரயில்வே தடம் கட்டம் மற்றும் ஒருவழிப் பாதை சிக்னல்களுடன் +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :இரயில்வே தடம் முன் மற்றும் வெளியேறு சிக்னல்களுடன் +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :இரயில்வே தடம் முன் மற்றும் இணைந்த சிக்னல்களுடன் +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :இரயில்வே தடம் முன் மற்றும் பாதை சிக்னல்களுடன் +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :இரயில்வே தடம் முன் மற்றும் ஒருவழிப் பாதை சிக்னல்களுடன் +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :இரயில்வே தடம் வெளியேறு மற்றும் இணைந்த சிக்னல்களுடன் +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :இரயில்வே தடம் வெளியேறு மற்றும் பாதை சிக்னல்களுடன் +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :இரயில்வே தடம் வெளியேறு மற்றும் ஒருவழிப் பாதை சிக்னல்களுடன் +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :இரயில்வே தடம் இணைந்த மற்றும் பாதை சிக்னல்களுடன் +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :இரயில்வே தடம் இணைந்த மற்றும் ஒருவழிப் பாதை சிக்னல்களுடன் +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :இரயில்வே தடம் பாதை மற்றும் ஒருவழிப் பாதை சிக்னல்களுடன் +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :இரயில்வே இரயில் பணிமனை STR_LAI_ROAD_DESCRIPTION_ROAD :சாலை STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :தெரு விளக்குகளுடன் சாலை @@ -2365,7 +2374,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :நிறுவ STR_ABOUT_OPENTTD :{WHITE}OpenTTD-ஐ பற்றி STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}அசல் உரிமைகள் {COPYRIGHT} 1995 கிறிஸ் சாயர், எல்லா உரிமைகளும் பதிவுசெய்யப்பட்டது STR_ABOUT_VERSION :{BLACK}OpenTTD பதிப்பு {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 OpenTTD குழுமம் +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}ஆட்டத்தை பதிவு செய் @@ -2611,8 +2627,6 @@ 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_PASSENGERS_LAST_MONTH_MAX :{BLACK}சென்ற மாத பயணிகள்: {ORANGE}{COMMA}{BLACK} அதிகம்: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}சென்ற மாத அஞ்சல்கள்: {ORANGE}{COMMA}{BLACK} அதிகம்: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}நகரத்தின் வளர்ச்சியிற்கு தேவையான சரக்குகள்: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} தேவை STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} குளிர்காலத்தில் தேவை @@ -2734,8 +2748,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}ஏற STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}ஏற்றுக்கொள்ளப்படும் சரக்குகளின் பட்டியலினைக் காட்டு STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}ஏற்றுக்கொள்பவை: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}இந்த நிலையம் இந்த நகரின் முழு போக்குவரத்து உரிமைகளையும் பெற்றுள்ளது. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} இந்த நகரின் மொத்த போக்குவரத்து உரிமைகளையும் வாங்கியது. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}இந்த நிலையம் இந்த நகரின் முழு போக்குவரத்து உரிமைகளையும் பெற்றுள்ளது. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} இந்த நகரின் மொத்த போக்குவரத்து உரிமைகளையும் வாங்கியது. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}தரங்கள் STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}நிலைய தரத்தினைக் காட்டவும் @@ -2899,9 +2913,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}தே STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}தேவைப்படுகிறது: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}பதனிப்பட காத்திருக்கும் சரக்கு: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}தயாரிப்பு: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}தயாரிக்கிறது: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -2964,6 +2977,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :அனைத் STR_GROUP_RENAME_CAPTION :{BLACK}குழுவின் பெயரினை மாற்றவும் + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :புது இரயில் வாகனங்கள் STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :புது மின்சார இரயில் வாகனங்கள் @@ -3106,10 +3120,7 @@ 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} அதி. T.E.: {6:FORCE}{}ஓட்டுவதற்கான செலவு: {4:CURRENCY_LONG}/வரு{}கொள்ளளவு: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}செலவு: {CURRENCY_LONG} அதி. வேகம்: {VELOCITY}{}கொள்ளளவு: {CARGO_LONG}, {CARGO_LONG}{}ஓட்டும் செலவு: {CURRENCY_LONG}/ஆண்டிற்கு -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}செலவு: {CURRENCY_LONG} அதி. வேகம்: {VELOCITY}{}கொள்ளளவு: {CARGO_LONG}{}ஓட்டும் செலவு: {CURRENCY_LONG}/ஆண்டிற்கு -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}செலவு: {CURRENCY_LONG} அதி. வேகம்: {VELOCITY} எல்லை: {COMMA} கட்டங்கள்{}கொள்ளளவு: {CARGO_LONG}, {CARGO_LONG}{}ஓட்டும் செலவு: {CURRENCY_LONG}/ஆண்டிற்கு -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}செலவு: {CURRENCY_LONG} அதி. வேகம்: {VELOCITY} வரையறை: {COMMA} கட்டங்கள்{}கொள்ளளவு: {CARGO_LONG}{}இயக்குவதற்கான செலவு: {CURRENCY_LONG}/வரு +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}செலவு: {CURRENCY_LONG} அதி. வேகம்: {VELOCITY}{}கொள்ளளவு: {CARGO_LONG}{}ஓட்டும் செலவு: {CURRENCY_LONG}/ஆண்டிற்கு # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}மாற்று {STRING} - {STRING} @@ -3129,7 +3140,6 @@ STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED :{BLACK}எந STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} காலாவதியான பிறகு STR_REPLACE_VEHICLES_STOP :{BLACK}வாகனங்களை மாற்றுவதை நிறுத்தவும் -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}மாற்றல்: {ORANGE}{STRING} STR_REPLACE_ENGINES :பொறிகள் STR_REPLACE_WAGONS :வாகனங்கள் @@ -3217,7 +3227,6 @@ STR_VEHICLE_INFO_AGE :{COMMA} வர STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} வருடம்{P "" கள்} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}அதி. வேகம்: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}அதி. வேகம்: {LTBLUE}{VELOCITY} {BLACK}வரையறை: {LTBLUE}{COMMA} கட்டங்கள் STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}எடை: {LTBLUE}{WEIGHT_SHORT} {BLACK}திறன்: {LTBLUE}{POWER}{BLACK} அதி. வேகம்: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}எடை: {LTBLUE}{WEIGHT_SHORT} {BLACK}திறன்: {LTBLUE}{POWER}{BLACK} அதி. வேகம்: {LTBLUE}{VELOCITY} {BLACK}அதி. T.E.: {LTBLUE}{FORCE} @@ -3748,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 3b413263f0..878b9c26c5 100644 --- a/src/lang/thai.txt +++ b/src/lang/thai.txt @@ -250,6 +250,7 @@ STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}ทำ # Show engines button +STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}ถ้าได้อนุญาตที่ปุ่มนี้แล้ว อากาศยานที่ซ่อนจะถูกแสดงออกมา # Query window STR_BUTTON_DEFAULT :{BLACK}ค่าปกติ @@ -316,7 +317,7 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}แส STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}แสดงข้อมูลทางการเงินของบริษัท STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}แสดงข้อมูลทั่วไปของบริษัท STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}แสดงสมุดบันทึก -STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :แสดงรายการเป้าหมายที่ต้องทำ +STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}แสดงรายการเป้าหมายที่ต้องทำ STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}แสดงกราฟ STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}แสดงตารางอันดับบริษัท STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}ลงทุนก่อสร้างอุตสาหกรรมใหม่ หรือ แสดงรายชื่ออุตสาหกรรมทั้งหมด @@ -660,10 +661,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}เล STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}เปิด/ปิด Toggle programme shuffle on/off STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}แสดงหน้าต่างเลือกรายการเพลง -STR_ERROR_NO_SONGS :{WHITE}ชุดเพลงประกอบนี้ไม่มีการเลือกเพลงไว้ - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}รายการเลือกโปรแกรมเพลง STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}รายการเพลง STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}โปรแกรม - '{STRING}' @@ -970,6 +968,7 @@ STR_GAME_OPTIONS_RESOLUTION :{BLACK}คว STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}เลือกความละเอียดของหน้าจอที่จะใช้ STR_GAME_OPTIONS_RESOLUTION_OTHER :อื่นๆ +STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}ขนาดของแผงควบคุม STR_GAME_OPTIONS_BASE_GRF :{BLACK}ตั้งค่า Graphic พื้นฐาน @@ -1064,6 +1063,7 @@ STR_TERRAIN_TYPE_VERY_FLAT :แบนรา STR_TERRAIN_TYPE_FLAT :แบนราบ STR_TERRAIN_TYPE_HILLY :เนินเขา STR_TERRAIN_TYPE_MOUNTAINOUS :ภูเขาสูง +STR_TERRAIN_TYPE_ALPINIST :นักไต่เขา STR_CITY_APPROVAL_PERMISSIVE :อนุญาต STR_CITY_APPROVAL_TOLERANT :พอผ่อนผันให้ได้ @@ -1084,6 +1084,8 @@ STR_CONFIG_SETTING_TYPE_GAME_INGAME :ตั้งค STR_CONFIG_SETTING_TYPE_COMPANY_MENU :ตั้งค่าองค์กร (ถูกเก็บไว้ในการบันทึกเกม; มีผลเฉพาะการเริ่มเกมใหม่) STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :ตั้งค่าองค์กร (ถูกเก็บไว้ในการบันทึกเกม; มีผลเฉพาะเกมปัจจุบัน) +STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK}หมวดหมู่: +STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}ชนิด: STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}จำกัดรายการด้านล่างให้แสดงเฉพาะการตั้งค่าที่มีการเปลี่ยนแปลง STR_CONFIG_SETTING_RESTRICT_BASIC :ตั้งค่าพื้นฐาน STR_CONFIG_SETTING_RESTRICT_ADVANCED :ตั้งค่าขั้นสูง @@ -1166,6 +1168,7 @@ STR_CONFIG_SETTING_INFLATION :ภาวะเ STR_CONFIG_SETTING_INFLATION_HELPTEXT :เมื่อเปิดการใช้งานอัตราเงินเฟ้อ ค่าเงินจะถูกลงและต้องใช้เงินมากขึ้นในการซื้อหรือสร้าง แต่ผลตอบแทนจากการขนส่งก็จะเพิ่มขึ้นด้วยเช่นกัน STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH :ความยาวสูงสุดของสะพาน: {STRING} STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH_HELPTEXT :ปรับความยาวสูงสุดสำหรับการสร้างสะพาน +STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT :ความสูงของสะพาน: {STRING} STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH :ความยาวสูงสุดของอุโมงค์: {STRING} STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH_HELPTEXT :ปรับความยาวสูงสุดสำหรับการสร้างอุโมงค์ STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD :กำหนดวิธีหลักในการก่อสร้างอุตสาหกรรมเอง: {STRING} @@ -1265,7 +1268,9 @@ STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :ระยะห่างที่สุดจากขอบแผนที่ของโรงกลั่นน้ำมัน: {STRING} STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :โรงกลั่นน้ำมันจะสามารถตั้งได้เฉพาะบริเวณใกล้ๆขอบแผนที่เท่านั้น การตั้งค่านี้จะสามารถตั้งให้สร้างโรงกลั่นน้ำมันได้ห่างสูงสุดเท่าใดจากของแผนที่ STR_CONFIG_SETTING_SNOWLINE_HEIGHT :ระดับความสูงแนวหิมะ: {STRING} +STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :ควบคุมความสูงเริ่มต้นของหิมะบนพื้นภูมิทัศน์อาร์ติคย่อยๆ, หิมะยังมีผลการสร้างอุตสาหกรรม และการเติบโตของเมือง STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :ความหยาบของพื้นที่ (เฉพาะ TerraGenesis): {STRING} +STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(TerraGenesis only) Choose the frequency of hills: Smooth landscapes have fewer, more wide-spread hills. Rough landscapes have many hills, which may look repetitive STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :ราบเรียบมาก STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :ราบเรียบ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :หยาบ @@ -1292,8 +1297,6 @@ 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_REVERSE_SCROLLING :กลับทิศการเลื่อนหน้าจอ: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :เลือกลักษณะการเลื่อนแผนที่ เมื่อใช้ปุ่มคลิ๊กเมาส์ขวา หากเปิดการใช้งาน หน้าจอจะเคลื่อนที่ไปในทิศตรงกันข้ามกับการคลิ๊กเมาส์ค้างแล้วลากเมาส์ไป STR_CONFIG_SETTING_SMOOTH_SCROLLING :เลื่อนอย่างนิ่มนวลบนจอภาพ: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :ควบคุมการเคลื่อนที่ของจอภาพ เวลาคลิ๊กเลือกตำแหน่งในแผนที่ย่อ หากไม่เปิดใช้งาน ตำแหน่งของจอจะย้ายไปที่ตำแหน่งที่เลือกทันที แต่หากเปิดใช้งาน จะเคลื่อนที่ไปยังตำแหน่งอย่างนุ่มนวล STR_CONFIG_SETTING_MEASURE_TOOLTIP :แสดงบอลลูนข้อความแสดงระยะทางหรือข้อมูลอื่นๆ เมื่อใช่เครื่องมือสร้าง: {STRING} @@ -1325,8 +1328,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+คล STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Click STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :ปิด -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :เลื่อนหน้าจอด้วยการคลิ๊กเมาส์ซ้าย: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :เปิดใช้งานเพื่อให้สามารถใช้การคลิ๊กเมาส์ซ้ายในการเลื่อนภาพหน้าจอได้ STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :ใช้รูปแบบวันที่ {STRING} เป็นชื่อเซฟของเกม @@ -1622,7 +1623,9 @@ STR_CONFIG_SETTING_SOUND :{ORANGE}เส STR_CONFIG_SETTING_INTERFACE :{ORANGE}ส่วนเชื่อมต่อผู้ใช้ STR_CONFIG_SETTING_INTERFACE_CONSTRUCTION :{ORANGE}การก่อสร้าง STR_CONFIG_SETTING_VEHICLES :{ORANGE}ยานพาหนะ +STR_CONFIG_SETTING_VEHICLES_PHYSICS :{ORANGE}กายภาพ STR_CONFIG_SETTING_VEHICLES_ROUTING :{ORANGE}การค้นหาเส้นทางของพาหนะ +STR_CONFIG_SETTING_ENVIRONMENT :{ORANGE}สิ่งแวดล้อม STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :{ORANGE}เมือง STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}อุตสาหกรรม STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}การกระจายสินค้า @@ -1676,6 +1679,7 @@ STR_INTRO_MULTIPLAYER :{BLACK}เล STR_INTRO_GAME_OPTIONS :{BLACK}ตัวเลือกเกม STR_INTRO_HIGHSCORE :{BLACK}ตารางคะแนนสูงสุด +STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}ตั้งค่า STR_INTRO_NEWGRF_SETTINGS :{BLACK}การตั้งค่า NewGRF STR_INTRO_ONLINE_CONTENT :{BLACK}ตรวจสอบเนื้อหาออนไลน์ STR_INTRO_SCRIPT_SETTINGS :{BLACK}ตั้งค่า AI/Game Script @@ -1695,6 +1699,7 @@ STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}เล STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}แสดงตัวเลือกเกม STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}แสดงตารางคะแนนสูงสุด +STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}การตั้งค่า หน้าจอ STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}แสดงการกำหนดค่า NewGRF STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}ตรวจสอบเนื้อหาใหม่และการปรับปรุงสำหรับดาวโหลด STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}แสดงการตั้งค่า AI/Game script @@ -2215,7 +2220,7 @@ STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}เป STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}ตั้งให้วัตถุมองไม่เห็นแทนการโปร่งใส # Linkgraph legend window -STR_LINKGRAPH_LEGEND_CAPTION :{WHITE}แสดงเส้นทางและความหนาแน่น +STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}แสดงเส้นทางและความหนาแน่น STR_LINKGRAPH_LEGEND_ALL :{BLACK}ทั้งหมด STR_LINKGRAPH_LEGEND_NONE :{BLACK}ไม่เลือก STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}เลือกบริษัทที่จะแสดง @@ -2537,29 +2542,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :ทุ่งห STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :พื้นที่หิมะปกคลุม STR_LAI_CLEAR_DESCRIPTION_DESERT :ทะเลทราย -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} ราง -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING}ทางรถไฟกับ Block Signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING}ทางรถไฟกับ Pre-Signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING}ทางรถไฟกับ Exit-Signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING}ทางรถไฟกับ Combo-Signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING}ทางรถไฟกับ Path Signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING}ทางรถไฟกับ Path Signal แบบเดินทางเดียว -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING}ทางรถไฟกับ Block และ Pre-Signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING}ทางรถไฟกับ Block และ Exit-Signal -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING}ทางรถไฟกับ Block และ Combo-Signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING}ทางรถไฟกับ Block และ Path Signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING}ทางรถไฟกับ Block และ Path Signals แบบเดินรถทางเดียว -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING}ทางรถไฟกับ Pre- และ Exit-Signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING}ทางรถไฟกับ Pre- และ Combo-Signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING}ทางรถไฟกับ Pre- และ Path Signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING}ทางรถไฟและ Pre- และ Path Signals แบบเดินรถทางเดียว -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING}ทางรถไฟกับ Exit- และ Combo-Signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING}ทางรถไฟกับ Exit- และ Path Signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING}ทางรถไฟและ Exit- และ Path Signals แบบเดินรถทางเดียว -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING}ทางรถไฟและ Combo- และ Path Signals -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING}ทางรถไฟและ Combo- และ Path Signals แบบเดินรถทางเดียว -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING}ทางรถไฟกับ Path และ Path Signals แบบเดินรถทางเดียว -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} โรงซ่อมบำรุงรถไฟ +STR_LAI_RAIL_DESCRIPTION_TRACK :รางรถไฟ ราง +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :รางรถไฟทางรถไฟกับ Block Signal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :รางรถไฟทางรถไฟกับ Pre-Signal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :รางรถไฟทางรถไฟกับ Exit-Signal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :รางรถไฟทางรถไฟกับ Combo-Signal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :รางรถไฟทางรถไฟกับ Path Signal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :รางรถไฟทางรถไฟกับ Path Signal แบบเดินทางเดียว +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :รางรถไฟทางรถไฟกับ Block และ Pre-Signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :รางรถไฟทางรถไฟกับ Block และ Exit-Signal +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :รางรถไฟทางรถไฟกับ Block และ Combo-Signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :รางรถไฟทางรถไฟกับ Block และ Path Signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :รางรถไฟทางรถไฟกับ Block และ Path Signals แบบเดินรถทางเดียว +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :รางรถไฟทางรถไฟกับ Pre- และ Exit-Signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :รางรถไฟทางรถไฟกับ Pre- และ Combo-Signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :รางรถไฟทางรถไฟกับ Pre- และ Path Signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :รางรถไฟทางรถไฟและ Pre- และ Path Signals แบบเดินรถทางเดียว +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :รางรถไฟทางรถไฟกับ Exit- และ Combo-Signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :รางรถไฟทางรถไฟกับ Exit- และ Path Signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :รางรถไฟทางรถไฟและ Exit- และ Path Signals แบบเดินรถทางเดียว +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :รางรถไฟทางรถไฟและ Combo- และ Path Signals +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :รางรถไฟทางรถไฟและ Combo- และ Path Signals แบบเดินรถทางเดียว +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :รางรถไฟทางรถไฟกับ Path และ Path Signals แบบเดินรถทางเดียว +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :รางรถไฟ โรงซ่อมบำรุงรถไฟ STR_LAI_ROAD_DESCRIPTION_ROAD :ถนน STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :ถนนพร้อมไฟถนน @@ -2623,7 +2628,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :บริษั STR_ABOUT_OPENTTD :{WHITE}เกี่ยวกับ OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}ลิขสิทธิ์เดิม {COPYRIGHT} ค.ศ.1995 ของ Chris Sawyer, สงวนลิขสิทธิ์ STR_ABOUT_VERSION :{BLACK}OpenTTD รุ่นที่ {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}ลิขสิทธิ์ OpenTTD {COPYRIGHT}2002-2015 ของ The OpenTTD team +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}บันทึกเกม @@ -2657,6 +2669,7 @@ STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}จำนวนเมือง STR_MAPGEN_DATE :{BLACK}วันที่: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}จำนวนอุตสาหกรรม: +STR_MAPGEN_MAX_HEIGHTLEVEL :{BLACK}ขนาดความสูงของแผนที่สูงสุด: STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}เส้นความสูงเขตหิมะ: STR_MAPGEN_SNOW_LINE_UP :{BLACK}ปรับเปลี่ยนความสูงของหิมะขึ้นไป 1 ระดับ STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}ปรับเปลี่ยนความสูงของหิมะลงมา 1 ระดับ @@ -2740,6 +2753,8 @@ STR_NEWGRF_SETTINGS_MOVEUP :{BLACK}ย้ STR_NEWGRF_SETTINGS_MOVEUP_TOOLTIP :{BLACK}เลื่อน NewGRF ที่เลือกไว้ขึ้นไปในรายการ STR_NEWGRF_SETTINGS_MOVEDOWN :{BLACK}ย้ายตำแหน่งลง STR_NEWGRF_SETTINGS_MOVEDOWN_TOOLTIP :{BLACK}เลื่อน NewGRF ที่เลือกไว้ลงไปในรายการ +STR_NEWGRF_SETTINGS_UPGRADE :{BLACK}อัพเกรด +STR_NEWGRF_SETTINGS_UPGRADE_TOOLTIP :{BLACK}ปรับปรุงรุ่นไฟล์ NewGRF สำหรับเวอร์ชันที่ได้ติดตั้งไปแล้วก่อนหน้า STR_NEWGRF_SETTINGS_FILE_TOOLTIP :{BLACK}รายการของ NewGRF ที่มีการติดตั้งในปัจจุบัน STR_NEWGRF_SETTINGS_SET_PARAMETERS :{BLACK}ตั้งค่า parameters @@ -2765,6 +2780,7 @@ STR_NEWGRF_SETTINGS_DISABLED :{RED}ไม่ STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}ไม่รองรับกับ OpenTTD เวอร์ชั่นนี้ # NewGRF save preset window +STR_SAVE_PRESET_SAVE_TOOLTIP :{BLACK}บันทึก ชุดการตั้งค่า ตามที่ได้เลือกไว้ # NewGRF parameters window STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}เปลี่ยนแปลง NewGRF parameters @@ -2823,8 +2839,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Attempt to use STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} บรรจุ sprites ที่สูญหาย. สิ่งที่สูญหายจะแสดงเป็นเครื่องหมายตกใจสีแดง (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Contains multiple Action 8 entries (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Read past end of pseudo-sprite (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}กราฟิกพื้นฐานที่ใช้อยู่มี Sprite ไม่สมบูรณ์{}กรุณาปรับรุ่นของ Base Graphic -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}ไฟล์ในกราฟฟิคพื้นฐานหายไปบางส่วน{}กรุณาอัพเดตกราฟฟิคพื้นฐาน.{}ตั้งแต่คุณเริ่มเล่น {YELLOW}ภาพของ OpenTTD{WHITE},คุณอาจต้องการ {YELLOW}ภาพของกราฟฟิคพื้นฐาน{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :ต้นแบบ GRF ที่ต้องการสามารถใช้การได้(sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} ถูกยกเลิกโดย {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :ไม่ถูกต้อง/ไม่ทราบ รูปแบบ sprite (sprite {3:NUM}) @@ -2898,8 +2912,6 @@ 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_PASSENGERS_LAST_MONTH_MAX :{BLACK}ผู้โดยสารเมื่อเดือนที่แล้ว: {ORANGE}{COMMA}{BLACK} จำนวนสูงสุด: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}ไปรษณีย์ภัณฑ์เมื่อเดือนที่แล้ว: {ORANGE}{COMMA}{BLACK} จำนวนสูงสุด: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}ความต้องการสินค้าสำหรับการขยายตัวของเมือง: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} required STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} ต้องการหิมะ @@ -3030,8 +3042,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}ปิ STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}ปิดหน้าต่างความนิยมลงและแสดงเฉพาะรายการสินค้าที่สถานีรองรับและรอการขนส่ง STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}กำลังต้องการ: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}สถานนีนี้มีสัมปทานขนส่งจากเมืองนี้ -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} ซื้อสัมปทานขนส่งที่เมืองนี้ +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}สถานนีนี้มีสัมปทานขนส่งจากเมืองนี้ +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} ซื้อสัมปทานขนส่งที่เมืองนี้ STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}ความพึงพอใจ STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}แสดงความพึงพอใจของสถานี @@ -3076,9 +3088,9 @@ STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}จุ STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}เปลี่ยนชื่อสถานี STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}แสดงขบวนรถไฟที่มีรายการเข้าจอดที่สถานีนี้ -STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :แสดงยานพาหนะทางบกที่มีรายการเข้าจอดที่สถานีนี้ -STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :แสดงอากาศยานที่มีรายการลงจอดจอดที่สถานีนี้ -STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :แสดงเรือที่มีรายการเข้าเทียบท่าที่ท่านี้ +STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}แสดงยานพาหนะทางบกที่มีรายการเข้าจอดที่สถานีนี้ +STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}แสดงอากาศยานที่มีรายการลงจอดจอดที่สถานีนี้ +STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}แสดงเรือที่มีรายการเข้าเทียบท่าที่ท่านี้ STR_STATION_VIEW_RENAME_STATION_CAPTION :เปลี่ยนชื่อสถานี/พื้นที่รับส่งสินค้า @@ -3210,9 +3222,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}มี STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}มีความต้องการ: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}พัสดุและสิ่งของที่รอการผลิต: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}ผลผลิต: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}ผลผลิต: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3277,6 +3288,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :ลบยาน STR_GROUP_RENAME_CAPTION :{BLACK}เปลี่ยนชื่อกลุ่ม + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :รถไฟใหม่ STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :รถไฟฟ้าใหม่ @@ -3334,8 +3346,12 @@ STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_TOOLTIP :{BLACK}เป STR_BUY_VEHICLE_SHIP_RENAME_TOOLTIP :{BLACK}เปลี่ยนชื่อชนิดของเรือ STR_BUY_VEHICLE_AIRCRAFT_RENAME_TOOLTIP :{BLACK}เปลี่ยนชื่อชนิดของเครื่องบิน +STR_BUY_VEHICLE_AIRCRAFT_HIDE_TOGGLE_BUTTON :{BLACK}ซ่อน +STR_BUY_VEHICLE_TRAIN_SHOW_TOGGLE_BUTTON :{BLACK}การแสดงผล +STR_BUY_VEHICLE_ROAD_VEHICLE_SHOW_TOGGLE_BUTTON :{BLACK}การแสดงผล +STR_BUY_VEHICLE_AIRCRAFT_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}ปรับเปลี่ยน ซ่อน/แสดง ของชนิดเครื่องอากาศยาน STR_QUERY_RENAME_TRAIN_TYPE_CAPTION :{WHITE}เปลี่ยนชื่อชนิดของรถไฟ STR_QUERY_RENAME_ROAD_VEHICLE_TYPE_CAPTION :{WHITE}เปลี่ยนชื่อชนิดของรถ @@ -3371,7 +3387,7 @@ STR_DEPOT_SELL_ALL_BUTTON_SHIP_TOOLTIP :{BLACK}ขา STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TOOLTIP :{BLACK}ขายอากาศยานทั้งหมดในโรงซ่อมบำรุง STR_DEPOT_AUTOREPLACE_TRAIN_TOOLTIP :{BLACK}แทนที่อัตโนมัติสำหรับรถไฟทั้งหมดในโรงซ่อมบำรุง -STR_DEPOT_AUTOREPLACE_ROAD_VEHICLE_TOOLTIP :แทนที่อัตโนมัติสำหรับยานพาหนะทางบกทั้งหมดในโรงซ่อมบำรุง +STR_DEPOT_AUTOREPLACE_ROAD_VEHICLE_TOOLTIP :{BLACK}แทนที่อัตโนมัติสำหรับยานพาหนะทางบกทั้งหมดในโรงซ่อมบำรุง STR_DEPOT_AUTOREPLACE_SHIP_TOOLTIP :{BLACK}แทนที่อัตโนมัติสำหรับยานพาหนะทางน้ำทั้งหมดในอู่ STR_DEPOT_AUTOREPLACE_AIRCRAFT_TOOLTIP :{BLACK}แทนที่อัตโนมัติสำหรับอากาศยานทั้งหมดในโรงซ่อมบำรุง @@ -3429,10 +3445,7 @@ 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_CAPACITY_CAPACITY_RUNCOST :{BLACK}มูลค่า: {CURRENCY_LONG} ความเร็วสูงสุด: {VELOCITY}{}ความจุ: {CARGO_LONG}, {CARGO_LONG}{}ค่าปฎิบัติการ: {CURRENCY_LONG}/ปี -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}มูลค่า: {CURRENCY_LONG} ความเร็วสูงสุด: {VELOCITY}{}ความจุ: {CARGO_LONG}{}ค่าปฏิบัติการ: {CURRENCY_LONG}/ปี -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}มูลค่า: {CURRENCY_LONG} ความเร็วสูงสุด: {VELOCITY} พิสัย: {COMMA} ช่อง{}ความจุ: {CARGO_LONG}, {CARGO_LONG}{}ค่าปฏิบัติการ: {CURRENCY_LONG}/ปี -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}มูลค่า: {CURRENCY_LONG} ความเร็วสูงสุด: {VELOCITY} พิสัย: {COMMA} tiles{}ความจุ: {CARGO_LONG}{}ค่าปฏิบัติการ: {CURRENCY_LONG}/ปี +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}มูลค่า: {CURRENCY_LONG} ความเร็วสูงสุด: {VELOCITY}{}ความจุ: {CARGO_LONG}{}ค่าปฏิบัติการ: {CURRENCY_LONG}/ปี # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}เปลี่ยน {STRING} - {STRING} @@ -3441,6 +3454,7 @@ STR_REPLACE_VEHICLE_ROAD_VEHICLE :ยานพา STR_REPLACE_VEHICLE_SHIP :ยานพาหนะทางน้ำ STR_REPLACE_VEHICLE_AIRCRAFT :อากาศยาน +STR_REPLACE_VEHICLE_VEHICLES_IN_USE :{YELLOW}พาหนะถูกใช้งานอยู่ STR_REPLACE_HELP_LEFT_ARRAY :{BLACK}เลือกประเภทของรถจักรที่จะแทนที่ STR_REPLACE_HELP_RIGHT_ARRAY :{BLACK}เลือกประเภทของพาหนะที่จะแทนที่ทางซ้ายมือ @@ -3455,7 +3469,6 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} เม STR_REPLACE_VEHICLES_STOP :{BLACK}หยุดการแทนที่ยานพาหนะ STR_REPLACE_HELP_STOP_BUTTON :{BLACK}กดเพื่อเริ่มหยุดการแทนที่ยานพาหนะตามที่เลือกไว้ในรายการ -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}กำลังแทนที่: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}สลับระหว่างหน้าต่างการแทนที่ของรถจักรและรถพ่วง STR_REPLACE_ENGINES :รถจักร STR_REPLACE_WAGONS :รถพ่วง @@ -3551,7 +3564,6 @@ STR_VEHICLE_INFO_AGE :{COMMA} ปี STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} ปี ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}ความเร็วสูงสุด: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}ความเร็วสูงสุด: {LTBLUE}{VELOCITY} {BLACK}พิสัย: {LTBLUE}{COMMA} ช่อง STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}น้ำหนัก: {LTBLUE}{WEIGHT_SHORT} {BLACK}พลังขับเคลื่อน: {LTBLUE}{POWER}{BLACK} ความเร็วสูงสุด: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}น้ำหนัก: {LTBLUE}{WEIGHT_SHORT} {BLACK}พลังขับเคลื่อน: {LTBLUE}{POWER}{BLACK} ความเร็วสูงสุด: {LTBLUE}{VELOCITY} {BLACK}กำลังลากจูงสูงสุด: {LTBLUE}{FORCE} @@ -4037,6 +4049,7 @@ STR_ERROR_EXCAVATION_WOULD_DAMAGE :{WHITE}กา STR_ERROR_ALREADY_AT_SEA_LEVEL :{WHITE}... ตอนนี้อยู่ที่ระดับน้ำทะเลแล้ว STR_ERROR_TOO_HIGH :{WHITE}... สูงเกินไป STR_ERROR_ALREADY_LEVELLED :{WHITE}... อยู่ในสภาพที่ต่ำที่สุดแล้ว +STR_ERROR_BRIDGE_TOO_HIGH_AFTER_LOWER_LAND :{WHITE}สะพานที่อยู่ด้านบนจะสูงเกินไป # Company related errors STR_ERROR_CAN_T_CHANGE_COMPANY_NAME :{WHITE}ไม่สามารถเปลี่ยนชื่อบริษัทได้ @@ -4103,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 2943c70be4..e837d1efef 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -669,10 +669,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}選擇 STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}開關播放清單亂序播放 STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}於選擇視窗顯示樂軌 -STR_ERROR_NO_SONGS :{WHITE}已選擇不含音樂的音樂集,不會播放任何音樂 - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}背景音樂播放清單選擇 STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM}「{STRING}」 STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}音軌索引 STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}播放清單 - 「{STRING}」 @@ -1337,8 +1334,6 @@ 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_REVERSE_SCROLLING :反轉捲軸方向:{STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :設定在右撳拖曳滑鼠時的系統反應。如停用此選項,移動滑鼠時會移動顯示範圍 (即影像的移動方向與滑鼠的移動方向相反)。如啟用此選項,移動滑鼠時會移動顯示地圖 (即影像的移動方向與滑鼠的移動方向相同) STR_CONFIG_SETTING_SMOOTH_SCROLLING :視野平滑移動:{STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :設定在小地圖中點選一個位置時,主視野的顯示反應。如啟用此選項,影像會移動直至到達點選的位置;否則影像會直接跳到點選的位置 STR_CONFIG_SETTING_MEASURE_TOOLTIP :使用某些建設工具時顯示度量提示:{STRING} @@ -1370,8 +1365,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command 鍵 STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Control 鍵 STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :無 -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :滑鼠左鍵捲動:{STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :容許以左撳並拖曳滑鼠捲動地圖。此選項對使用觸控螢幕進行捲動動作很有幫助 STR_CONFIG_SETTING_AUTOSAVE :自動儲存: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :選擇自動存檔的週期 @@ -2085,7 +2078,7 @@ STR_NETWORK_CLIENT :用戶端 STR_NETWORK_SPECTATORS :旁觀者 STR_NETWORK_GIVE_MONEY_CAPTION :{WHITE}請輸入你要付出多少資金 -STR_NETWORK_TOOLBAR_LIST_SPECTATOR :(BLACK)旁觀者 +STR_NETWORK_TOOLBAR_LIST_SPECTATOR :{BLACK}旁觀者 # Network set password STR_COMPANY_PASSWORD_CANCEL :{BLACK}不要儲存所輸入的密碼 @@ -2601,29 +2594,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :田地 STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :覆雪地 STR_LAI_CLEAR_DESCRIPTION_DESERT :沙漠 -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} 鐵軌 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :設有閉塞號誌的{STRING}軌道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :設有預警號誌的{STRING}軌道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :設有出口號誌的{STRING}軌道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :設有預警-出口複合號誌的{STRING}軌道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :設有路徑號誌的{STRING}軌道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :設有單向路徑號誌的{STRING}軌道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :設有閉塞與預警號誌的{STRING}軌道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :設有閉塞與出口號誌的{STRING}軌道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :設有閉塞與複合號誌的{STRING}軌道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :設有閉塞與路徑號誌的{STRING}軌道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :設有閉塞與單向路徑號誌的{STRING}軌道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :分別設有預警與出口號誌的{STRING}軌道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :分別設有預警與複合號誌的{STRING}軌道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :設有預警與路徑號誌的{STRING}軌道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :設有預警與單向路徑號誌的{STRING}軌道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :分別設有出口與複合號誌的{STRING}軌道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :設有出口與路徑號誌的{STRING}軌道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :設有出口與單向路徑號誌的{STRING}軌道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :設有複合與路徑號誌的{STRING}軌道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :設有複合與單向路徑號誌的{STRING}軌道 -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :分別設有一般路徑與單向路徑號誌的{STRING}軌道 -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING}機廠 +STR_LAI_RAIL_DESCRIPTION_TRACK :鐵路 鐵軌 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :設有閉塞號誌的鐵路軌道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :設有預警號誌的鐵路軌道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :設有出口號誌的鐵路軌道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :設有預警-出口複合號誌的鐵路軌道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :設有路徑號誌的鐵路軌道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :設有單向路徑號誌的鐵路軌道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :設有閉塞與預警號誌的鐵路軌道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :設有閉塞與出口號誌的鐵路軌道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :設有閉塞與複合號誌的鐵路軌道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :設有閉塞與路徑號誌的鐵路軌道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :設有閉塞與單向路徑號誌的鐵路軌道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :分別設有預警與出口號誌的鐵路軌道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :分別設有預警與複合號誌的鐵路軌道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :設有預警與路徑號誌的鐵路軌道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :設有預警與單向路徑號誌的鐵路軌道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :分別設有出口與複合號誌的鐵路軌道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :設有出口與路徑號誌的鐵路軌道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :設有出口與單向路徑號誌的鐵路軌道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :設有複合與路徑號誌的鐵路軌道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :設有複合與單向路徑號誌的鐵路軌道 +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :分別設有一般路徑與單向路徑號誌的鐵路軌道 +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :鐵路機廠 STR_LAI_ROAD_DESCRIPTION_ROAD :公路 STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :有路燈的公路 @@ -2687,7 +2680,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :公司所有土 STR_ABOUT_OPENTTD :{WHITE}關於 OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}原著作權為 {COPYRIGHT} 1995 Chris Sawyer,保留所有權利 STR_ABOUT_VERSION :{BLACK}OpenTTD 版本 {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 OpenTTD 開發小組 +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}儲存遊戲 @@ -2874,7 +2874,7 @@ STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}前往 STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}上一個子畫面 STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}繼續處理上一個正常的子畫面,略過任何虛位/重新著色/文字字型相關的子畫面,並在到達第一個子畫面後,返回最後的子畫面繼續進行處理。 STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}顯示目前選取的 sprite。當 sprite 正在描繪時會忽略其定位 -STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}移動 sprite 到指定的 X 及 Y 座標位移 +STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}移動 sprite 到指定的 X 及 Y 座標位移。Ctrl+點擊可以一次移動8個單元格。 STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}重設相對值 STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}重設目前的相對位移值 STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}X 位移:{NUM},Y 位移:{NUM}(絕對值) @@ -2906,8 +2906,6 @@ STR_NEWGRF_ERROR_INVALID_ID :子畫面企圖 STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} 包含了毀損的 sprite。所有毀損的 sprite 會以紅色問號 (?) 顯示。 STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :過多的 Action 8 資料 (發生於第 {3:NUM} 個子畫面) STR_NEWGRF_ERROR_READ_BOUNDS :子畫面資料不足 (發生於第 {3:NUM} 個子畫面) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}目前使用的基本圖形集少了某些 sprite。{}請更新基本圖形集。 -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}你正在使用的圖形集缺少了一些圖形.{}請更新圖形集.{}因為你正在使用一個{YELLOW}開發中的OpenTTD{WHITE},你可能需要一個{YELLOW}開發中的圖形集{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :要求的 GRF 資料不存在或無法讀取 (發生於第 {3:NUM} 個子畫面) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{2:STRING} 使 {1:STRING} 被停用 STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :無效或無法識別的子畫面配置格式 (發生於第 {3:NUM} 個子畫面) @@ -2982,8 +2980,6 @@ 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_PASSENGERS_LAST_MONTH_MAX :{BLACK}上月乘客數字:{ORANGE}{COMMA}{BLACK} 紀錄最高:{ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}上月郵件數量:{ORANGE}{COMMA}{BLACK} 紀錄最高:{ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}市鎮成長所需貨物: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{RED}需要 {ORANGE}{STRING} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} 必須是冬天 @@ -3091,7 +3087,7 @@ STR_STORY_BOOK_PREV_PAGE :{BLACK}上一 STR_STORY_BOOK_PREV_PAGE_TOOLTIP :{BLACK}前往上一頁繼續觀看 STR_STORY_BOOK_NEXT_PAGE :{BLACK}下一頁 STR_STORY_BOOK_NEXT_PAGE_TOOLTIP :{BLACK}前往下一頁繼續觀看 -STR_STORY_BOOK_INVALID_GOAL_REF :(RED)無效的目標參照 +STR_STORY_BOOK_INVALID_GOAL_REF :{RED}無效的目標參照 # Station list window STR_STATION_LIST_TOOLTIP :{BLACK}車站名稱 - 點選名稱可將車站置於畫面中央。按住 Ctrl 點選可於車站位置開啟新視窗視野 @@ -3114,8 +3110,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}接受 STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}顯示接受的貨物種類 STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}接受:{WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}此車站享有所屬市鎮的專屬運輸權 -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK}已購買此市鎮的專屬運輸權 +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}此車站享有所屬市鎮的專屬運輸權 +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK}已購買此市鎮的專屬運輸權 STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}評價 STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}顯示車站評價 @@ -3294,9 +3290,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}需要 STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}需要:{YELLOW}{STRING}{STRING},{STRING}{STRING},{STRING}{STRING} ############ range for requires ends + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}囤積的貨物: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}產出:{YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}產出:{YELLOW}{STRING}{STRING},{STRING}{STRING} ############ range for produces ends @@ -3363,6 +3358,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :移去所有運 STR_GROUP_RENAME_CAPTION :{BLACK}重新命名群組 + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :新購鐵路列車 STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :新購電氣化列車 @@ -3527,10 +3523,7 @@ 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_CAPACITY_CAPACITY_RUNCOST :{BLACK}費用:{CURRENCY_LONG} 最高速度:{VELOCITY}{}容量:{CARGO_LONG}, {CARGO_LONG}{}營運成本:{CURRENCY_LONG}/年 -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}費用:{CURRENCY_LONG} 最高速度:{VELOCITY}{}容量:{CARGO_LONG}{}營運成本:{CURRENCY_LONG}/年 -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}成本: {CURRENCY_LONG} 最高速度: {VELOCITY} 範圍: {COMMA} 格{}容量: {CARGO_LONG}, {CARGO_LONG}{}營運成本: {CURRENCY_LONG}/年 -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}成本: {CURRENCY_LONG} 最高速度: {VELOCITY} 範圍: {COMMA} 格{}容量: {CARGO_LONG}{}營運成本: {CURRENCY_LONG}/年 +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}費用:{CURRENCY_LONG} 最高速度:{VELOCITY}{}容量:{CARGO_LONG}{}營運成本:{CURRENCY_LONG}/年 # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}替換 {STRING} - {STRING} @@ -3557,7 +3550,6 @@ STR_REPLACE_REPLACING_WHEN_OLD :更換舊運具 STR_REPLACE_VEHICLES_STOP :{BLACK}停止替換運輸工具 STR_REPLACE_HELP_STOP_BUTTON :{BLACK}按下之後會停止替換左方指定的車頭 -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}替換:{ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}在車頭及車廂替換畫面間切換。 STR_REPLACE_ENGINES :車頭 STR_REPLACE_WAGONS :車廂 @@ -3653,7 +3645,6 @@ STR_VEHICLE_INFO_AGE :{COMMA} 年 ({C STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} 年 ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}最高速度:{LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}最高速度: {LTBLUE}{VELOCITY} {BLACK}範圍: {LTBLUE}{COMMA} 格 STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}載重:{LTBLUE}{WEIGHT_SHORT} {BLACK}功率:{LTBLUE}{POWER}{BLACK} 最高速度:{LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}載重:{LTBLUE}{WEIGHT_SHORT} {BLACK}功率:{LTBLUE}{POWER}{BLACK} 最高速度:{LTBLUE}{VELOCITY} {BLACK}最大牽引力:{LTBLUE}{FORCE} @@ -4212,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 d769641c60..c7b456f68d 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -286,7 +286,7 @@ STR_SORT_BY_TYPE :Tür STR_SORT_BY_TRANSPORTED :Taşınan STR_SORT_BY_NUMBER :Numara STR_SORT_BY_PROFIT_LAST_YEAR :Geçen seneki kar -STR_SORT_BY_PROFIT_THIS_YEAR :Bu seneki kar +STR_SORT_BY_PROFIT_THIS_YEAR :Bu yılki kar STR_SORT_BY_AGE :Yaş STR_SORT_BY_RELIABILITY :Güvenilirlik STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :Her kargo için toplam kapasite @@ -670,10 +670,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}'Özel 2 STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Rastgele programı aç/kapa STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Şarkı seçim penceresini göster -STR_ERROR_NO_SONGS :{WHITE}Şarkısız bir müzik kümesi seçildi. Hiçbir şarkı çalınmayacak - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Müzik Program Seçimi STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Parça Listesi STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Program - '{STRING}' @@ -897,8 +894,8 @@ STR_GAME_OPTIONS_CURRENCY_USD :Amerikan Dolar STR_GAME_OPTIONS_CURRENCY_EUR :Avro (€) STR_GAME_OPTIONS_CURRENCY_JPY :Japon Yeni (¥) STR_GAME_OPTIONS_CURRENCY_ATS :Avusturya Şilini (ATS) -STR_GAME_OPTIONS_CURRENCY_BEF :Belcika Frangı (BEF) -STR_GAME_OPTIONS_CURRENCY_CHF :İsviçre Frangı (CHF) +STR_GAME_OPTIONS_CURRENCY_BEF :Belçika Frankı (BEF) +STR_GAME_OPTIONS_CURRENCY_CHF :İsviçre Frankı (CHF) STR_GAME_OPTIONS_CURRENCY_CZK :Çek Korunası (CZK) STR_GAME_OPTIONS_CURRENCY_DEM :Alman markı (DEM) STR_GAME_OPTIONS_CURRENCY_DKK :Danimarka Kronu (DKK) @@ -1338,8 +1335,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Küçük harita STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Yeşil STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Koyu yeşil STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Mor -STR_CONFIG_SETTING_REVERSE_SCROLLING :Fareyle kaydırma hareketini ters çevir: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Haritayı sağ fare tuşuyla kaydırırken davranış biçimi. Etkisiz kılındığında, fare kamerayı hareket ettirir. Etkinleştirildiğinde ise fare haritayı hareket ettirir. STR_CONFIG_SETTING_SMOOTH_SCROLLING :Düzgün viewport kaydırması: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Küçük haritaya tıklandığında veya harita üzerindeki belli bir nesneye gidilmesi için komut verildiğinde ana görüntünün nasıl kaydırılacağını kontrol eder. Etkinleştirildiğinde harita kayarak ilerler, kapatıldığında ise doğrudan hedeflenen noktaya atlama yapar. STR_CONFIG_SETTING_MEASURE_TOOLTIP :İnşa araçları kullanılırken ölçüm ipucu göster: {STRING} @@ -1371,8 +1366,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Komut-tıklama STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Kontrol-tıklama STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Kapalı -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Sol tık ile ekran kaydır: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Sol fare tuşuyla sürükleyerek harita kaydırma özelliğini etkinleştir. Özellikle dokunmatik-ekran kullanırken kaydırma yapmak için kullanılabilir. +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Sağ tıklama ile pencereyi kapat: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :İçerisinde sağ tıklandığında pencereyi kapatır. Sağ tıklandığında ipuçları gösterimini devre dışı bırakır! STR_CONFIG_SETTING_AUTOSAVE :Otomatik kaydet: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Otomatik oyun kaydetme sıklığını seçin @@ -1762,6 +1757,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}İndiril STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}YZ ve Oyun betik ayarlarını göster STR_INTRO_TOOLTIP_QUIT :{BLACK}'OpenTTD' den çık +STR_INTRO_BASESET :{BLACK}Geçerli seçimdeki temel grafik setinin {NUM} örneği eksik. Lütfen temel setin güncellemelerini kontrol edin. STR_INTRO_TRANSLATION :{BLACK}Bu çeviride {NUM} eksik metin var. Çevirmen olarak kaydolarak OpenTTD'nin iyileştirilmesine yardım edin. Ayrıntılar için readme.txt'ye bakın. # Quit window @@ -1797,7 +1793,7 @@ STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Sihirli STR_CHEAT_CROSSINGTUNNELS :{LTBLUE}Tüneller kesişebilir: {ORANGE}{STRING} STR_CHEAT_NO_JETCRASH :{LTBLUE}Jetler küçük havalimanlarında (sıklıkla) düşmesin: {ORANGE}{STRING} STR_CHEAT_EDIT_MAX_HL :{LTBLUE}Azami harita yüksekliğini değiştir: {ORANGE}{NUM} -STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{BLACK}Haritadaki azami dağ yüksekliğini düzenle +STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}Haritadaki azami dağ yüksekliğini düzenle STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Ilıman iklim STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Soğuk iklim STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Tropik iklim @@ -2497,7 +2493,7 @@ STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Haritaya # Land generation window (SE) STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Arazi Yapımı -STR_TERRAFORM_TOOLTIP_PLACE_ROCKY_AREAS_ON_LANDSCAPE :{BLACK}Haritaya kayalik koy +STR_TERRAFORM_TOOLTIP_PLACE_ROCKY_AREAS_ON_LANDSCAPE :{BLACK}Haritaya kayalık koy STR_TERRAFORM_TOOLTIP_DEFINE_DESERT_AREA :{BLACK}Çöl alanı tanımla.{}Kaldırmak için CTRL'yi basılı tut STR_TERRAFORM_TOOLTIP_INCREASE_SIZE_OF_LAND_AREA :{BLACK}yükseltme/alçaltma alanını arttır STR_TERRAFORM_TOOLTIP_DECREASE_SIZE_OF_LAND_AREA :{BLACK}Yükseltme/alçaltma alanını arttır @@ -2590,6 +2586,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Havalima STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}İstenen: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Ray türü: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Ray hız sınırı: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Yol hız sınırı: {LTBLUE}{VELOCITY} @@ -2602,29 +2599,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Mera STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Karlı arazi STR_LAI_CLEAR_DESCRIPTION_DESERT :Çöl -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} ray -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} blok sinyalli ray -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} ön sinyalli ray -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} çıkış sinyalli ray -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} karışık sinyalli ray -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} yol sinyalli ray -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} tek yön yol sinyalli ray -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} blok ve ön sinyalli ray -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} blok ve çıkış sinyalli ray -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} blok ve karışık sinyalli ray -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} blok ve yol sinyalli ray -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} blok ve tek yön yol sinyalli ray -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} ön ve çıkış sinyalli ray -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} ön ve karışık sinyalli ray -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} ön ve yol sinyalli ray -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} ön ve tek yön yol sinyalli ray -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} çıkış ve karışık sinyalli ray -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} çıkış ve yol sinyalli ray -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} çıkış ve tek yön yol sinyalli ray -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} karışık ve tek yön yol sinyalli ray -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} karışık ve tek yön yol sinyalli ray -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} yol ve tek yön yol sinyalli ray -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} tren garajı +STR_LAI_RAIL_DESCRIPTION_TRACK :Ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Blok sinyalli ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Ön sinyalli ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Çıkış sinyalli ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Karışık sinyalli ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Yol sinyalli ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Tek yön yol sinyalli ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Blok ve ön sinyalli ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Blok ve çıkış sinyalli ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Blok ve karışık sinyalli ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Blok ve yol sinyalli ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Blok ve tek yön yol sinyalli ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Ön ve çıkış sinyalli ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Ön ve karışık sinyalli ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Ön ve yol sinyalli ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Ön ve tek yön yol sinyalli ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Çıkış ve karışık sinyalli ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Çıkış ve yol sinyalli ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Çıkış ve tek yön yol sinyalli ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Karışık ve tek yön yol sinyalli ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Karışık ve tek yön yol sinyalli ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Yol ve tek yön yol sinyalli ray +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Tren garajı STR_LAI_ROAD_DESCRIPTION_ROAD :Yol STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Sokak lambalı yol @@ -2688,7 +2685,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Satın alınmı STR_ABOUT_OPENTTD :{WHITE}OpenTTD Hakkında STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Telif hakkı {COPYRIGHT} 1995 Chris Sawyer, Her hakkı saklıdır STR_ABOUT_VERSION :{BLACK}OpenTTD sürüm {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 OpenTTD ekibi +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 @@ -2781,7 +2785,7 @@ STR_GENERATION_WORLD_GENERATION :{BLACK}Harita STR_GENERATION_RIVER_GENERATION :{BLACK}Nehir oluşturma STR_GENERATION_TREE_GENERATION :{BLACK}Ağaç üretimi STR_GENERATION_OBJECT_GENERATION :{BLACK}Nesne oluşturma -STR_GENERATION_CLEARING_TILES :{BLACK}Engebeli ve kayalik alan oluştur +STR_GENERATION_CLEARING_TILES :{BLACK}Engebeli ve kayalık alan oluştur STR_GENERATION_SETTINGUP_GAME :{BLACK}Oyun ayarlanıyor STR_GENERATION_PREPARING_TILELOOP :{BLACK}tile-loop çalıştırılıyor STR_GENERATION_PREPARING_SCRIPT :{BLACK}Betik çalıştırılıyor @@ -2907,8 +2911,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Geçersiz ID ku STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} bozuk bir nesne içeriyor. Tüm bozuk nesneler kırmızı bir soru işareti (?) olarak görünecektir STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Birden çok Action 8 girişi içeriyor (nesne {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Pseudo-nesne bitiminden sonrasını okudu (nesne {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Kullanımda olan temel grafik kümesi bazı nesneleri içermiyor.{}Lütfen temel grafik kümesini güncelleyin -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Kullanımdaki temel grafik kümesi bazı nesneleri içermiyor.{}Lütfen temel grafik setinizi güncelleyin .{}{YELLOW}OpenTTD'nin geliştirme kopyasını {WHITE}kullandığınız için, {YELLOW}temel grafiklerin de{WHITE} geliştirme kopyasını kullanmalısınız. STR_NEWGRF_ERROR_GRM_FAILED :İstenen GRF kaynakları mevcut değil (nesne {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} {STRING} tarafından deaktive edildi STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Geçersiz/bilinmeyen nesne yerleşim biçimi (nesne {3:NUM}) @@ -2983,8 +2985,6 @@ STR_TOWN_POPULATION :{BLACK}Dünya n STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Şehir) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Nüfus: {ORANGE}{COMMA}{BLACK} Ev: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Geçen ayki yolcu: {ORANGE}{COMMA}{BLACK} azami: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Geçen ayki posta: {ORANGE}{COMMA}{BLACK} azami: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Kasaba büyümesi için gerekli kargo: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} gerekli STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} kışın gerekir @@ -3115,8 +3115,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}İstenen STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}İstenen kargoların listesini göster STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}İstenen: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Bu istasyon şehrin ulaşım haklarına sahip. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} bu şehirdeki ulaşım haklarını satın aldı. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Bu istasyon şehrin ulaşım haklarına sahip. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} bu şehirdeki ulaşım haklarını satın aldı. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Değerlendirmeler STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}İstasyon değerlendirmelerini göster @@ -3172,7 +3172,7 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Uçağı # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} -STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Ana görünümü güzegaha ortala. Ctrl ile tıklama güzegahın konumunu gösteren yeni bir pencere açar +STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Ana görünümü güzergaha ortala. Ctrl ile tıklama güzegahın konumunu gösteren yeni bir pencere açar STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Ara nokta adını değiştir STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Ana görünümü şamandıra konumuna ortala. Ctrl ile tıklama şamandıranın konumunu gösteren yeni bir pencere açar STR_BUOY_VIEW_CHANGE_BUOY_NAME :{BLACK}Şamandıra adını değiştir @@ -3295,9 +3295,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}İstenen STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}İstenenler: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Gereken: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} bekliyor{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}İşlenmeyi bekleyen kargo: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Üretir: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Üretir: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3364,6 +3366,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Bütün araçla STR_GROUP_RENAME_CAPTION :{BLACK}Grubun ismini değiştir +STR_GROUP_PROFIT_THIS_YEAR :Bu yılki kar: +STR_GROUP_PROFIT_LAST_YEAR :Geçen yılki kar: +STR_GROUP_OCCUPANCY :Şu anki kullanım: +STR_GROUP_OCCUPANCY_VALUE :%{NUM} + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Yeni Tren STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Yeni Elektrikli Trenler @@ -3395,6 +3402,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Tüm kargo tür STR_PURCHASE_INFO_ALL_BUT :Şunlar hariç tümü: {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Aza. Çekim Gücü: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Menzil: {GOLD}{COMMA} kare +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Uçak türü: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Tren seçim listesi. Bilgi için araç tıklayın. Ctrl+Tıklama araç türünün gizlenmesini açar/kapatır STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Karayolu araçları seçim listesi. Bilgi için araca tıklayın. Ctrl+Tıklama araç türünün gizlenmesini açar/kapatır @@ -3495,7 +3503,7 @@ STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Geminin STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Uçağın bir kopyasını oluşturur. Önce bu düğmeye sonra da hangarın içindeki veya dışındaki bir uçaga tıklayın. Ctrl-tıklama talimatları paylaştırır. Shift ile tıklama satın almadan tahmini maliyeti gösterir STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Tren garını göster. Ctrl ile tıklama garın konumunu gösteren yeni bir pencere açar -STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Kara taşıtı garajını göster. Ctrl+Tıklama garajın konumunu gösteren yeni bir pencere açar +STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Kara taşıtı garajını göster. Ctrl ile tıklama garajın konumunu gösteren yeni bir pencere açar STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Tersaneyi göster. Ctrl ile tıklama tershanenin konumunu gösteren yeni bir pencere açar STR_DEPOT_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Hangarı göster. Ctrl ile tıklama hangarın konumunu gösteren yeni bir pencere açar @@ -3526,12 +3534,13 @@ STR_ENGINE_PREVIEW_SHIP :gemi STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :monoray lokomotifi STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :maglev lokomotifi -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Fiyat: {CURRENCY_LONG} Ağırlık: {WEIGHT_SHORT}{}Hız: {VELOCITY} Güç: {POWER}{}Bakım: {CURRENCY_LONG}/sene{}Kapasite: {CARGO_LONG} -STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Maliyet: {CURRENCY_LONG} Ağırlık: {WEIGHT_SHORT}{}Hız: {VELOCITY} Güç: {POWER} Azami Tork: {6:FORCE}{}Çalışma Gideri: {4:CURRENCY_LONG}/yıl{}Kapasite: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Maliyet: {CURRENCY_LONG} Azami Hız: {VELOCITY}{}Kapasite: {CARGO_LONG}, {CARGO_LONG}{}İşletme Gideri: {CURRENCY_LONG}/yıl -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Maliyet: {CURRENCY_LONG} Azami Hız: {VELOCITY}{}Kapasite: {CARGO_LONG}{}İşletme Gideri: {CURRENCY_LONG}/yıl -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Maliyet: {CURRENCY_LONG} Azami Hız: {VELOCITY} Menzil: {COMMA} kare{}Kapasite: {CARGO_LONG}, {CARGO_LONG}{}Çalışma gideri: {CURRENCY_LONG}/yıl -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Maliyet: {CURRENCY_LONG} Azami Hız: {VELOCITY} Menzil: {COMMA} kare{}Kapasite: {CARGO_LONG}{}Çalışma gideri: {CURRENCY_LONG}/yıl +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Fiyat: {CURRENCY_LONG} Ağırlık: {WEIGHT_SHORT}{}Hız: {VELOCITY} Güç: {POWER}{}İşletme Gideri: {CURRENCY_LONG}/yıl{}Kapasite: {CARGO_LONG} +STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Maliyet: {CURRENCY_LONG} Ağırlık: {WEIGHT_SHORT}{}Hız: {VELOCITY} Güç: {POWER} Azami Tork: {6:FORCE}{}İşletme Gideri: {4:CURRENCY_LONG}/yıl{}Kapasite: {5:CARGO_LONG} +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Maliyet: {CURRENCY_LONG} Azami Hız: {VELOCITY}{}Kapasite: {CARGO_LONG}{}İşletme Gideri: {CURRENCY_LONG}/yıl +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Maliyet: {CURRENCY_LONG} Azami Hız: {VELOCITY}{}Uçak türü: {STRING}{}Kapasite: {CARGO_LONG}, {CARGO_LONG}{}İşletme Gideri: {CURRENCY_LONG}/yıl +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Maliyet: {CURRENCY_LONG} Azami Hız: {VELOCITY}{}Uçak türü: {STRING}{}Kapasite: {CARGO_LONG}{}İşletme Gideri: {CURRENCY_LONG}//yıl +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Maliyet: {CURRENCY_LONG} Azami Hız: {VELOCITY}{}Uçak türü: {STRING} Menzil: {COMMA} kare{}Kapasite: {CARGO_LONG}, {CARGO_LONG}{}İşletme Gideri: {CURRENCY_LONG}/yıl +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Maliyet: {CURRENCY_LONG} Azami Hız: {VELOCITY}{}Uçak türü: {STRING} Menzil: {COMMA} kare{}Kapasite: {CARGO_LONG}{}İşletme Gideri: {CURRENCY_LONG}/yıl # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Değiştir {STRING} - {STRING} @@ -3558,10 +3567,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} eskidi STR_REPLACE_VEHICLES_STOP :{BLACK}Araçları değiştirmeyi durdur STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Değiştirme işlemini durdurmak için basın -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Değiştiriyor: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Lokomotif ve vagon değişimi pencereleri arasında geçiş yap. STR_REPLACE_ENGINES :Lokomotifler STR_REPLACE_WAGONS :Vagon +STR_REPLACE_ALL_RAILTYPE :Tüm demiryolu araçları STR_REPLACE_HELP_RAILTYPE :{BLACK}Lokomatiflerini değiştireceğiniz ray türünü seçin STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Soldaki değiştiriliyorsa neyle değiştirildiğini göster @@ -3654,7 +3663,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} sene ({ STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} sene ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Azami Hız: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Azami hız: {LTBLUE}{VELOCITY} {BLACK}Menzil: {LTBLUE}{COMMA} kare +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Azami hız: {LTBLUE}{VELOCITY} {BLACK}Uçak türü: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Azami hız: {LTBLUE}{VELOCITY} {BLACK}Uçak türü: {LTBLUE}{STRING} {BLACK}Menzil: {LTBLUE}{COMMA} kare STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Ağırlık: {LTBLUE}{WEIGHT_SHORT} {BLACK}Güç: {LTBLUE}{POWER}{BLACK} Azami Hız: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Ağırlık: {LTBLUE}{WEIGHT_SHORT} {BLACK}Güç: {LTBLUE}{POWER}{BLACK} Azami Hız: {LTBLUE}{VELOCITY} {BLACK}Azami Tork: {LTBLUE}{FORCE} @@ -4213,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... @@ -4245,7 +4254,7 @@ STR_ERROR_WAYPOINT_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}Birden f STR_ERROR_TOO_CLOSE_TO_ANOTHER_WAYPOINT :{WHITE}Diğer yerimine çok yakın STR_ERROR_CAN_T_BUILD_TRAIN_WAYPOINT :{WHITE}Buraya tren yerimi yapılamaz... -STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Şamandıra yerlestirilemez... +STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Buraya şamandıra yerleştirilemez... STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Yerimi adı değiştirilemedi... STR_ERROR_CAN_T_REMOVE_TRAIN_WAYPOINT :{WHITE}Tren yerimi kaldırılamaz... @@ -4457,7 +4466,7 @@ STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Araç bu # Sign related errors STR_ERROR_TOO_MANY_SIGNS :{WHITE}... çok fazla tabela var -STR_ERROR_CAN_T_PLACE_SIGN_HERE :{WHITE}Buraya tabela konulamiyor... +STR_ERROR_CAN_T_PLACE_SIGN_HERE :{WHITE}Buraya tabela konulamıyor... STR_ERROR_CAN_T_CHANGE_SIGN_NAME :{WHITE}Tabela adı değiştirilemiyor... STR_ERROR_CAN_T_DELETE_SIGN :{WHITE}Tabelayı silemezsiniz... diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index b8c4576ab0..d4f33017f1 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -797,10 +797,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Вибр STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Вкл./відкл. випадкову програму STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Показує вікно вибору музичної програми -STR_ERROR_NO_SONGS :{WHITE}Був обраний музичний набір без пісень. Пісні не будуть програватись - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Вибір музичної програми STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Назва доріжки STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Програма - '{STRING}' @@ -1465,8 +1462,6 @@ 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_REVERSE_SCROLLING :Змінити напрямок прокрутки: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Налаштування переміщення по карті правою кнопкою миші. При включенні переміщується карта. При виключенні - камера. STR_CONFIG_SETTING_SMOOTH_SCROLLING :Плавна прокрутка у вікні: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Налаштування способу прокрутки основного екрану при клацанні мишою по зменшенній карті, або інших діях, що призводять до переміщення по карті (кнопки "Оглянути", тощо). При включенні опції переміщення карти відбувається плавно. При виключенні - відбувається моментальне переміщення в необхідну точку STR_CONFIG_SETTING_MEASURE_TOOLTIP :Показувати підказки про розміри під час будівництва: {STRING} @@ -1498,8 +1493,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Команда+ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+клац мишою STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :не емулювати -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Прокрутка по лівому клацу миші: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Дозволяє "тягати" карту утримуючи ліву кнопку миші, що дає можливість використовувати сенсорні екрани природнім способом.. STR_CONFIG_SETTING_AUTOSAVE :Автозбереження: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Оберіть проміжок між автоматичними збереженнями гри @@ -2491,7 +2484,7 @@ STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TOOLTIP :{BLACK}Комб STR_BUILD_SIGNAL_SEMAPHORE_PBS_TOOLTIP :{BLACK}Розширений сигнал (семафор){}Розширений сигнал дозволяє більше ніж одному поїзду одночасно заходити до блоку сигналів, якщо поїзд може зарезервувати шлях до безпечної точки зупинки. Розширені сигнали дозволяють проїжджати їх з обох сторін STR_BUILD_SIGNAL_SEMAPHORE_PBS_OWAY_TOOLTIP :{BLACK}Односторонній розширений сигнал (семафор){}Розширений сигнал дозволяє більше ніж одному поїзду одночасно заходити до блоку сигналів, якщо поїзд може зарезервувати шлях до безпечної точки зупинки. Односторонні розширені сигнали не дозволяють вїжджати з іншої сторони STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP :{BLACK}Звичайний сигнал (електричний){}Найпростіший тип сигналу, який дозволяє перебувати у сигнальному блоці тільки одному поїзду. Сигнали необхідні для того, щоб уникнути зіткнень поїздів на залізницях, де більше одного поїзда -STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP :{BLACK}Вхідний сигнал (електричний){}Зелений, доки один або більше зелених вихідних сигналів з наступної блок-дільниці. Інакше червоний +STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP :{BLACK}Вхідний сигнал (електричний){}Зелений, доки є один або більше зелених вихідних сигналів з наступної блок-дільниці. Інакше червоний STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Вихідний сигнал (електричний){}Працює як звичайний сигнал, але необхідний для нормальної роботи вхідного або комбінованого пре-сигналів STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Комбінований сигнал (електричний){}Комбінований сигнал працює як об'єднаний вхідний-вихідний сигнал. Це дозволяє будувати великі "дерева" пре-сигналів STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Розширений сигнал (електричний){}Розширений сигнал дозволяє більше ніж одному поїзду одночасно заходити до блоку сигналів, якщо поїзд може зарезервувати шлях до безпечної точки зупинки. Розширені сигнали дозволяють проїжджати їх з обох сторін @@ -2732,29 +2725,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Поле STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Засніжена земля STR_LAI_CLEAR_DESCRIPTION_DESERT :Пустеля -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} з блок-сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} з пресигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} з вихідними сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} з комбосигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} з маршрутними сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} з односторонніми маршрутними сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} з блок-сигналами і пресигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} з блок-сигналами і вихідними сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} з блок-сигналами і комбосигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} з блок-сигналами та маршрутними сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} з блок-сигналами та одност. маршрутними сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} з пресигналами і вихідними сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} з пресигналами і комбосигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} з пресигналами і маршрутними сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} з пресигналами і одност. маршрутними сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} з вихідними сигналами та комбосигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} з вихідними та маршрутними сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} з вихідними та одност. маршрутними сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} з комбосигналами і маршрутними сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} з комбосигналами та одност. маршрутними сигналами -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} з маршрутними та одност. маршрутними сигналами -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} залізничне депо +STR_LAI_RAIL_DESCRIPTION_TRACK :Звичайна колія +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Звичайна колія з блок-сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Звичайна колія з пресигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Звичайна колія з вихідними сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Звичайна колія з комбосигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Звичайна колія з маршрутними сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Звичайна колія з односторонніми маршрутними сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Звичайна колія з блок-сигналами і пресигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Звичайна колія з блок-сигналами і вихідними сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Звичайна колія з блок-сигналами і комбосигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Звичайна колія з блок-сигналами та маршрутними сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Звичайна колія з блок-сигналами та одност. маршрутними сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Звичайна колія з пресигналами і вихідними сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Звичайна колія з пресигналами і комбосигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Звичайна колія з пресигналами і маршрутними сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Звичайна колія з пресигналами і одност. маршрутними сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Звичайна колія з вихідними сигналами та комбосигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Звичайна колія з вихідними та маршрутними сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Звичайна колія з вихідними та одност. маршрутними сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Звичайна колія з комбосигналами і маршрутними сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Звичайна колія з комбосигналами та одност. маршрутними сигналами +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Звичайна колія з маршрутними та одност. маршрутними сигналами +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Звичайна колія залізничне депо STR_LAI_ROAD_DESCRIPTION_ROAD :Дорога STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Дорога з вуличними ліхтарями @@ -2818,7 +2811,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Ця ділян STR_ABOUT_OPENTTD :{WHITE}Про OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Авторське право {COPYRIGHT} 1995 Кріс Сойєр, Всі права захищені STR_ABOUT_VERSION :{BLACK}OpenTTD версія {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 команда OpenTTD +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}Зберегти гру @@ -3005,7 +3005,7 @@ STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Йти STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Попередній спрайт STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Повернутися до попереднього нормального спрайту, пропускаючи будь-які псевдо/перемальовані/шрифтові спрайти і обгортаючи (wrap) навколо починаючи з першого спрайту і закінчуючи останнім STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Відображення обраного спрайту (вирівнювання ігнорується) -STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Рухайте спрайт навколо, змінюючи його зміщення за X та Y +STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Рухайте спрайт навколо, змінюючи його зміщення за X та Y. Ctrl+клік зміщує спрайт на 8 клітинок STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Відновити відносні STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Відновити поточні зсуви (відносні) STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Зсув по осі X: {NUM}, Зсув по осі Y: {NUM} (Абсолютно) @@ -3037,8 +3037,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Спроба в STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} містить зіпсований спрайт. Усі зіпсовані спрайти будуть показані як червоний знак питання (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Містить декілька записів Action 8 (спрайт {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Вихід за границю псевдо-спрайта при читанні (спрайт {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}У базовому наборі графіки, що зараз використовується не вистачає спрайтів.{}Будь-ласка оновіть базовий набір графіки -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}В наборі графіки, який використовується на даний момент відсутній ряд спрайтів.{}Будь ласка, поновіть базовий набір графіки.{}Оскільки ви граєте у {YELLOW} тестову версію OpenTTD{WHITE}, вам також може знадобитися {YELLOW}тестовий набір базової графіки{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Недоступні необхідні ресурси GRF (спрайт {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} був вимкнений {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Некоректний або невідомий формат розміщення спрайтів (спрайт {3:NUM}) @@ -3113,8 +3111,6 @@ 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_PASSENGERS_LAST_MONTH_MAX :{BLACK}Пасажирів за місяць: {ORANGE}{COMMA}{BLACK} найбільше: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Пошти за місяць: {ORANGE}{COMMA}{BLACK} найбільше: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Вантаж, потрібний для зростання міста: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} потрібно STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} потрібно взимку @@ -3245,8 +3241,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Прий STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Показати список приймання вантажів STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Приймає: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Ця станція має ексклюзивні права на перевезення. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} отримала ексклюзивні права на перевезення. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Ця станція має ексклюзивні права на перевезення. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} отримала ексклюзивні права на перевезення. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Рейтинг STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Показати рейтинг станції @@ -3425,9 +3421,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Потр STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Потребує: {YELLOW}{STRING.z}{STRING.z}, {STRING.z}{STRING.z}, {STRING.z}{STRING.z} ############ range for requires ends + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Вантаж чекає на обробку: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Продукція: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Продукція: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3494,6 +3489,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Позбути STR_GROUP_RENAME_CAPTION :{BLACK}Перейменувати групу + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Новий неелектрифікований поїзд STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Новий електрифікований поїзд @@ -3658,10 +3654,7 @@ 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_CAPACITY_CAPACITY_RUNCOST :{BLACK}Вартість: {CURRENCY_LONG} Макс. швидкість: {VELOCITY}{}Місткість: {CARGO_LONG}, {CARGO_LONG}{}Вартість експлуатації: {CURRENCY_LONG}/рік -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Вартість: {CURRENCY_LONG} Макс. швидкість: {VELOCITY}{}Місткість: {CARGO_LONG}{}Вартість експлуатації: {CURRENCY_LONG}/рік -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Ціна: {CURRENCY_LONG} Макс. швидкість: {VELOCITY} Дальність: {COMMA} клітинок{}Місткість: {CARGO_LONG}, {CARGO_LONG}{}Вартість експлуатації: {CURRENCY_LONG}/рік -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Вартість: {CURRENCY_LONG} Макс. швидкість: {VELOCITY} Дальність: {COMMA} клітинок{}Місткість: {CARGO_LONG}{}Витрати від експлуатації: {CURRENCY_LONG}/рік +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Вартість: {CURRENCY_LONG} Макс. швидкість: {VELOCITY}{}Місткість: {CARGO_LONG}{}Вартість експлуатації: {CURRENCY_LONG}/рік # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Оновити {STRING} - {STRING} @@ -3688,7 +3681,6 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} кол STR_REPLACE_VEHICLES_STOP :{BLACK}Зупинити оновлення STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Натисніть для припинення процесу оновлення потягів, що вибрані ліворуч -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Оновлення: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Переключення між вікнами заміни потягів та вагонів. STR_REPLACE_ENGINES :Локомотиви STR_REPLACE_WAGONS :Вагони @@ -3784,7 +3776,6 @@ STR_VEHICLE_INFO_AGE :{COMMA} р{P і STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} р{P ік оки оків} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Макс. швидкість: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Макс. швидкість: {LTBLUE}{VELOCITY} {BLACK}Дальність: {LTBLUE}{COMMA} клітинок STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Вага: {LTBLUE}{WEIGHT_SHORT} {BLACK}Потужність: {LTBLUE}{POWER}{BLACK} Макс. швидкість: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Вага: {LTBLUE}{WEIGHT_SHORT} {BLACK}Потужність: {LTBLUE}{POWER}{BLACK} Макс. швидкість: {LTBLUE}{VELOCITY} {BLACK}Макс. тяга: {LTBLUE}{FORCE} @@ -3804,7 +3795,7 @@ STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Інте STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}Збільшити інтервал техогляду на 10. Ctrl+клац мишою збільшує інтервал техогляду на 5 STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}Зменшити період техогляду на 10. Ctrl+клац мишою зменшує інтервал техогляду на 5 -STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :Відлік інтервалу між техоглядами +STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Відлік інтервалу між техоглядами STR_VEHICLE_DETAILS_DEFAULT :Стандартно STR_VEHICLE_DETAILS_DAYS :Дні STR_VEHICLE_DETAILS_PERCENT :Проценти @@ -4096,7 +4087,7 @@ STR_AI_DEBUG_RELOAD_TOOLTIP :{BLACK}Знищ STR_AI_DEBUG_BREAK_STR_ON_OFF_TOOLTIP :{BLACK}Увімкнути/вимкнути паузу при появі сигнального рядку в журналі АІ STR_AI_DEBUG_BREAK_ON_LABEL :{BLACK}Рядок: STR_AI_DEBUG_BREAK_STR_OSKTITLE :{BLACK}Рядок -STR_AI_DEBUG_BREAK_STR_TOOLTIP :{BLACK}У разі появи в журналі АІ цього рядку гра зупиняється +STR_AI_DEBUG_BREAK_STR_TOOLTIP :{BLACK}У разі появи в журналі АІ цього рядка гра призупиняється STR_AI_DEBUG_MATCH_CASE :{BLACK}Регістр STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}Перемкнути перевірку регістру при порівнянні рядків журналу АІ з сигнальним рядком STR_AI_DEBUG_CONTINUE :{BLACK}Продовжити @@ -4343,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 7cdd9cef41..474c328f96 100644 --- a/src/lang/unfinished/chuvash.txt +++ b/src/lang/unfinished/chuvash.txt @@ -403,7 +403,6 @@ STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKG STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Кӗвӗ STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Ят - # Playlist window STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Тасат @@ -971,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 @@ -1112,6 +1118,7 @@ STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Ҫу ############ range for requires starts ############ range for requires ends + ############ range for produces starts ############ range for produces ends @@ -1132,6 +1139,7 @@ STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Ҫу + # Build vehicle window diff --git a/src/lang/unfinished/frisian.txt b/src/lang/unfinished/frisian.txt index fe77940bce..624eec2f33 100644 --- a/src/lang/unfinished/frisian.txt +++ b/src/lang/unfinished/frisian.txt @@ -669,10 +669,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Selektea STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Set musyk mjokselje oan/út STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Lit musykseleksjeskerm sjen. -STR_ERROR_NO_SONGS :{WHITE}In musykset sûnder nûmers is selektearre. Gjin nûmers sille spile wurden - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Musykprogramseleksje STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Nûmeryndeks STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Program - '{STRING}' @@ -1329,8 +1326,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Kleur fan it l STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Grien STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Donker grien STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Fiolet -STR_CONFIG_SETTING_REVERSE_SCROLLING :Draai scrollrjochtig om: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :By útskeakeljen beweecht de mûs de kamera. By ynskeakeljen beweecht de mûs de kaart STR_CONFIG_SETTING_SMOOTH_SCROLLING :Loaitsfinster floeiend scrolle : {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Bepaalt hoe it haadfinster scrollt. By ynskeakeljen sil dit floeiend wêze. By útskeakeljen ljept it byld direktst nei de selektearre lokaasje STR_CONFIG_SETTING_MEASURE_TOOLTIP :Under it gebrûk fan de ferskate bou-arken diminsjes sjen litte: {STRING} @@ -1362,8 +1357,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Kommando+Klik STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Klik STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Ut -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Scrolle mei lofter mûsknop: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Skeakel scrollen mei de lofter mûsknop oan. Dit is brûksum foar scollen op oanreitsskermen STR_CONFIG_SETTING_AUTOSAVE :Automatysk bewarje: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Selektearje de tiid tusken automatysk bewarje fan it spul @@ -1624,6 +1617,7 @@ STR_CONFIG_SETTING_INTERFACE_GENERAL :{ORANGE}Algemie STR_CONFIG_SETTING_INTERFACE_CONSTRUCTION :{ORANGE}konstruksje STR_CONFIG_SETTING_ADVISORS :{ORANGE}Nijs / Adviseurs STR_CONFIG_SETTING_COMPANY :{ORANGE}Bedriuw +STR_CONFIG_SETTING_ACCOUNTING :{ORANGE}Boekhâlding STR_CONFIG_SETTING_VEHICLES :{ORANGE}Auto's STR_CONFIG_SETTING_VEHICLES_PHYSICS :{ORANGE}Natuerkundig model STR_CONFIG_SETTING_VEHICLES_ROUTING :{ORANGE}Route @@ -1840,19 +1834,24 @@ STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Datum STR_NETWORK_SERVER_LIST_YEARS_CAPTION :{BLACK}Jieren STR_NETWORK_SERVER_LIST_LAST_JOINED_SERVER :{BLACK}Server wert dast it lêst op spiele hast +STR_NETWORK_SERVER_LIST_CLICK_TO_SELECT_LAST :{BLACK}Klik om tsjinner wert dast it lêst op spiele hast te selektearje STR_NETWORK_SERVER_LIST_GAME_INFO :{SILVER}Spul INFO +STR_NETWORK_SERVER_LIST_CLIENTS :{SILVER}Kliïnten: {WHITE}{COMMA} / {COMMA} - {COMMA} / {COMMA} STR_NETWORK_SERVER_LIST_LANGUAGE :{SILVER}Taal: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_LANDSCAPE :{SILVER}Lânskip: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_MAP_SIZE :{SILVER}Lângrutte: {WHITE}{COMMA}x{COMMA} STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}Tsjinnerferzje: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Tsjinneradres: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Start datum: {WHITE}{DATE_SHORT} +STR_NETWORK_SERVER_LIST_PASSWORD :{BLACK}Mei wachtwurd beskerme! STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}SERVER NET BESKIKBER STR_NETWORK_SERVER_LIST_SERVER_FULL :{SILVER}SERVER VOL STR_NETWORK_SERVER_LIST_VERSION_MISMATCH :{SILVER}FERKEARDE FERZJE STR_NETWORK_SERVER_LIST_GRF_MISMATCH :{SILVER}FERKEARDE NEWGRF +STR_NETWORK_SERVER_LIST_JOIN_GAME :{BLACK}Meidwaan mei spul +STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Laad tsjinner ynfo opnij STR_NETWORK_SERVER_LIST_FIND_SERVER :{BLACK}Server sykje STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Tsjinner tafoegje @@ -1870,6 +1869,8 @@ STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Wachtwur STR_NETWORK_START_SERVER_UNADVERTISED :Nee STR_NETWORK_START_SERVER_ADVERTISED :Ja +STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} kliïnt{P "" en} +STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Maksimaal oantal kliïnten: STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} bedriuw{P "" en} STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Maksimaal tal bedriuwen: STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} taskôger{P "" s} @@ -1934,6 +1935,7 @@ STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nei Bedr STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Nei bedriuw oprjochtsje STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Spul taskôgje STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Spul besjen as taskôger +STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Meidwaan mei dit bedriuw STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Help dit bedriuw bestjoeren # Network connecting window @@ -1966,14 +1968,18 @@ STR_NETWORK_COMPANY_LIST_NEW_COMPANY :{WHITE}Nei Bedr # Network client list STR_NETWORK_CLIENTLIST_KICK :Skoppe STR_NETWORK_CLIENTLIST_GIVE_MONEY :Jouw jild +STR_NETWORK_CLIENTLIST_SPEAK_TO_ALL :Tsjin elkenien prate +STR_NETWORK_CLIENTLIST_SPEAK_TO_COMPANY :Praat mei bedriuw STR_NETWORK_CLIENTLIST_SPEAK_TO_CLIENT :Priveeberjocht STR_NETWORK_SERVER :Tsjinner +STR_NETWORK_CLIENT :Kliïnt STR_NETWORK_SPECTATORS :Taskôgers STR_NETWORK_TOOLBAR_LIST_SPECTATOR :{BLACK}Taskôger # Network set password +STR_COMPANY_PASSWORD_OK :{BLACK}Jou it bedriuw it nije wachtwurd STR_COMPANY_PASSWORD_CAPTION :{WHITE}Bedriuwswachtwurd STR_COMPANY_PASSWORD_MAKE_DEFAULT_TOOLTIP :{BLACK}Brûk dit bedriuwswachtwurd gewoanwei foar alle nije bedriuwen @@ -1997,6 +2003,8 @@ STR_NETWORK_CHAT_OSKTITLE :{BLACK}Skriuw b # Network messages STR_NETWORK_ERROR_NOSERVER :{WHITE}Koe gjin networkspullen fine +STR_NETWORK_ERROR_NEWGRF_MISMATCH :{WHITE}Koe gjin ferbyning meitsje fanwegen ferkearde NewGRF +STR_NETWORK_ERROR_DESYNC :{WHITE}Koe net synchronisearje mei netwurkspul STR_NETWORK_ERROR_LOSTCONNECTION :{WHITE}Networkspul ferbining kwyt STR_NETWORK_ERROR_SAVEGAMEERROR :{WHITE}Koe opslein spul net laden STR_NETWORK_ERROR_SERVER_START :{WHITE}Koe de tsjinner net starte @@ -2012,6 +2020,7 @@ STR_NETWORK_ERROR_TOO_MANY_COMMANDS :{WHITE}Do stjoe STR_NETWORK_ERROR_CLIENT_GENERAL :algemiene flater STR_NETWORK_ERROR_CLIENT_SAVEGAME :koe it lân net lade STR_NETWORK_ERROR_CLIENT_CONNECTION_LOST :ferbining kwyt +STR_NETWORK_ERROR_CLIENT_PROTOCOL_ERROR :protokol flater STR_NETWORK_ERROR_CLIENT_NEWGRF_MISMATCH :Ferkearde NewGRF STR_NETWORK_ERROR_CLIENT_NOT_AUTHORIZED :net autorisearre STR_NETWORK_ERROR_CLIENT_NOT_EXPECTED :ûnjildich of ûnferwacht pakket ûnfange @@ -2029,6 +2038,8 @@ STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION :{WHITE}De lêst # Network related errors STR_NETWORK_SERVER_MESSAGE :*** {1:STRING} ############ Leave those lines in this order!! +STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_1 :Spul stiet noch yn rêst ({STRING}) +STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_2 :Spul stiet noch yn rêst ({STRING}, {STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_4 :Spul stiet nog yn rêst ({STRING}, {STRING}, {STRING}, {STRING}) STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :hânmjittich STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :spulskript @@ -2048,6 +2059,7 @@ STR_CONTENT_UNSELECT_ALL_CAPTION :{BLACK}Alles de STR_CONTENT_OPEN_URL :{BLACK}Webside besykje STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Webside foar dizze ynhâld besykje STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Delhelje +STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Begjinne mei delheljen fan selektearre ynhâld STR_CONTENT_DETAIL_TITLE :{SILVER}KONTENT INFO STR_CONTENT_DETAIL_NAME :{SILVER}Namme: {WHITE}{STRING} STR_CONTENT_DETAIL_VERSION :{SILVER}Ferzje: {WHITE}{STRING} @@ -2060,8 +2072,10 @@ STR_CONTENT_NO_ZLIB_SUB :{WHITE}... delh # Order of these is important! STR_CONTENT_TYPE_NEWGRF :NewGRF STR_CONTENT_TYPE_AI :AI +STR_CONTENT_TYPE_AI_LIBRARY :AI biblioteek STR_CONTENT_TYPE_SCENARIO :Lânskip STR_CONTENT_TYPE_HEIGHTMAP :Hichtemap +STR_CONTENT_TYPE_BASE_SOUNDS :Basislûden STR_CONTENT_TYPE_GAME_SCRIPT :Spulskript STR_CONTENT_TYPE_GS_LIBRARY :GS biblioteek @@ -2073,6 +2087,7 @@ STR_CONTENT_DOWNLOAD_COMPLETE :{WHITE}Delhelje STR_CONTENT_DOWNLOAD_PROGRESS_SIZE :{WHITE}{BYTES} fan {BYTES} delhelle ({NUM} %) # Content downloading error messages +STR_CONTENT_ERROR_COULD_NOT_CONNECT :{WHITE}Koe gjin ferbyning mei ynhâldtsjinner meitsje... STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD :{WHITE}Delheljen net slagge... STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_CONNECTION_LOST :{WHITE}... ferbining kwyt STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_FILE_NOT_WRITABLE :{WHITE}... bestân koe net opslein wurde @@ -2084,6 +2099,8 @@ STR_MISSING_GRAPHICS_NO_QUIT :{BLACK}Nee, Ope # Transparency settings window STR_TRANSPARENCY_CAPTION :{WHITE}Trochsichtigenopsjes +STR_TRANSPARENT_SIGNS_TOOLTIP :{BLACK}Skeakelje trochsichtigens fan seinen. Brûk Ctrl+Klik om fêste te setten +STR_TRANSPARENT_TREES_TOOLTIP :{BLACK}Skeakelje trochsichtigens fan beammen. Brûk Ctrl+Klik om fêste te setten # Linkgraph legend window STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Frachtstreamleginda @@ -2124,6 +2141,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Bou spoa STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Bou in spoarbrêge STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Bou in spoartunnel STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Set bouen/fuortheljen foar spoaren en stopljochten oan/út +STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Soart spoar ombouwe/opwurdearje. Shift skeakelt tusken bouwe/taksearje fan de kosten STR_RAIL_NAME_RAILROAD :Spoarwei STR_RAIL_NAME_ELRAIL :Elektrifisearre spoarwei @@ -2180,9 +2198,11 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Bou auto STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Bou busstasjon STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Bou laadstasjon foar frachtauto's STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Bou autobrêge +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Bou in trambrêge. Shift skeakelt tusken bouwe/taksearje fan de kosten STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Bou autotunnel STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Bou in tramtunnel. Brûk Shift foar ferwachte kosten. STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Wikselje tusken bou en fuortheljen fan dyken +STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Wikselje tusken bou en fuortheljen fan tramwei # Road depot construction window STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION :{WHITE}Autodepot rjochting @@ -2194,12 +2214,16 @@ STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP :{BLACK}Kies rjo STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Busstation Rjochting STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP :{BLACK}Selektearje rjochting fan busstasjon STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Frachtstasjon Rjochting +STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Kies rjochting foar frachtweinstasjon +STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Rjochting Passazjiertramstasjon +STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Kies rjochting passazjiertramstasjon STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Rjochting fan Tramstasjon STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Kies rjochting fan frachttramstasjon # Waterways toolbar (last two for SE only) STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Wetterwei Konstruksje STR_WATERWAYS_TOOLBAR_CAPTION_SE :{WHITE}Wetterwei +STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Bou kanalen. Shift skeakelt tusken bouwe/taksearje fan de kosten STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Bou in slûs. Brûk Shift foar ferwachte kosten. STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Bou skipmakkerij (Foar bou en ûnderhâld fan skippen). Brûk Shift foar ferwachte kosten STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Bou akwadukt. Shift skeakelt tusken bouwe/taksearje fan de kosten @@ -2218,6 +2242,7 @@ STR_TOOLBAR_AIRCRAFT_CAPTION :{WHITE}Fleanfji # Airport construction window STR_STATION_BUILD_AIRPORT_CAPTION :{WHITE}Fleanfjild Seleksje STR_STATION_BUILD_AIRPORT_TOOLTIP :{BLACK}Kies grutte/type fleanfjild +STR_STATION_BUILD_AIRPORT_CLASS_LABEL :{BLACK}Fleanfjild klasse STR_STATION_BUILD_AIRPORT_LAYOUT_NAME :{BLACK}Patroan {NUM} STR_AIRPORT_SMALL :Lyts @@ -2235,6 +2260,7 @@ STR_AIRPORT_CLASS_LARGE :Grut fleanfjild STR_AIRPORT_CLASS_HUB :Hubfleansjilden STR_AIRPORT_CLASS_HELIPORTS :Helikopter fleanfjild +STR_STATION_BUILD_NOISE :{BLACK}Lûdsoerlêst: {GOLD}{COMMA} # Landscaping toolbar STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Ferleech in hoekje lân @@ -2254,6 +2280,7 @@ STR_OBJECT_CLASS_TRNS :Stjoerders # Tree planting window (last two for SE only) STR_PLANT_TREE_CAPTION :{WHITE}Beammen STR_PLANT_TREE_TOOLTIP :{BLACK}Selektear soart beam. As it fakje al in beam hat, sil dit mear beamen tafoege fan it mixed soart ûnôfhinklike fan it selekteare soart +STR_TREES_RANDOM_TYPE :{BLACK}Samar in soart beam STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Samar wat beammen STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Plantsje beammen samar troch it lânskip @@ -2310,6 +2337,8 @@ STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY :{BLACK}Bouwe STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}Finansierje # Industry cargoes window +STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Yndustrykeatlings foar {STRING} yndustry +STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Yndustrykeatlings foar {STRING} fracht STR_INDUSTRY_CARGOES_PRODUCERS :produksje yndustry STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Yndustry aksepteare STR_INDUSTRY_CARGOES_HOUSES :{WHITE}Hûzen @@ -2334,6 +2363,7 @@ STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Treinspo STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Gemiente: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Neat STR_LAND_AREA_INFORMATION_BUILD_DATE :{BLACK}Boud: {LTBLUE}{DATE_LONG} +STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Stasjonstype: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_AIRPORT_CLASS :{BLACK}Fleanfjild klasse: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_AIRPORT_NAME :{BLACK}Fleanfjild namme: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Fleanfjild tile namme: {LTBLUE}{STRING} @@ -2352,29 +2382,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Fjilden STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Snie STR_LAI_CLEAR_DESCRIPTION_DESERT :Woastine -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} spoarbaan -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} spoarbaan mei blokseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} spoarbaan mei foar-seinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} spoarbaan mei útgong-seinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} spoarbaan mei kombi-seinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} spoarbaan mei paadseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} spoarbaan mei ienrjochtings paadseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} spoarbaan mei blok- en foar-seinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} spoarbaan mei blok- en útgong-seinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} spoarbaan mei blok- en kombi-seinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} spoarbaan mei blok- en paadseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} spoarbaan mei blok- en ienrjochtings paadseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} spoarbaan mei foar- en útgong-seinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} spoarbaan mei foar- en kombi-seinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} spoarbaan mei foar- en paadseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} spoarbaan mei foar en ienrjochtings paadseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} spoarbaan mei útgong- en kombi-seinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} spoarbaan mei útgong- en paadseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} spoarbaan mei útgong en ienrjochtings paadseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} spoarbaan mei kombi- en paadseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} spoarbaan mei kombi- en ienrjochtings paadseinen -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} spoarbaan mei paad- en ienrjochtings paadseinen -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} treindepot +STR_LAI_RAIL_DESCRIPTION_TRACK :Spoarwei spoarbaan +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Spoarwei spoarbaan mei blokseinen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Spoarwei spoarbaan mei foar-seinen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Spoarwei spoarbaan mei útgong-seinen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Spoarwei spoarbaan mei kombi-seinen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Spoarwei spoarbaan mei paadseinen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Spoarwei spoarbaan mei ienrjochtings paadseinen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Spoarwei spoarbaan mei blok- en foar-seinen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Spoarwei spoarbaan mei blok- en útgong-seinen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Spoarwei spoarbaan mei blok- en kombi-seinen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Spoarwei spoarbaan mei blok- en paadseinen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Spoarwei spoarbaan mei blok- en ienrjochtings paadseinen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Spoarwei spoarbaan mei foar- en útgong-seinen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Spoarwei spoarbaan mei foar- en kombi-seinen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Spoarwei spoarbaan mei foar- en paadseinen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Spoarwei spoarbaan mei foar en ienrjochtings paadseinen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Spoarwei spoarbaan mei útgong- en kombi-seinen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Spoarwei spoarbaan mei útgong- en paadseinen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Spoarwei spoarbaan mei útgong en ienrjochtings paadseinen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Spoarwei spoarbaan mei kombi- en paadseinen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Spoarwei spoarbaan mei kombi- en ienrjochtings paadseinen +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Spoarwei spoarbaan mei paad- en ienrjochtings paadseinen +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Spoarwei treindepot STR_LAI_ROAD_DESCRIPTION_ROAD :Wei STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Wei mei strjitteljochten @@ -2438,7 +2468,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Lân fan bedriu STR_ABOUT_OPENTTD :{WHITE}Oer OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Orizjineel copyright {COPYRIGHT} 1995 Chris Sawyer, All rights reserved STR_ABOUT_VERSION :{BLACK}OpenTTD-ferzje {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2015 It OpenTTD team +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 @@ -2551,15 +2588,15 @@ STR_NEWGRF_SETTINGS_PRESET_SAVE_QUERY :{BLACK}Jou dizz STR_NEWGRF_SETTINGS_PRESET_DELETE :{BLACK}Ferwiderje ynstellings STR_NEWGRF_SETTINGS_PRESET_DELETE_TOOLTIP :{BLACK}Ferwiderje de selektearre ynstellings STR_NEWGRF_SETTINGS_ADD :{BLACK}Tafoeging -STR_NEWGRF_SETTINGS_ADD_FILE_TOOLTIP :{BLACK}Foeg de selektjere NewGRF ta oan dyn ynstellings +STR_NEWGRF_SETTINGS_ADD_FILE_TOOLTIP :{BLACK}Foeg de selektearre NewGRF oan dyn ynstellings ta STR_NEWGRF_SETTINGS_RESCAN_FILES :{BLACK}Lit sykje ny nije bestanden STR_NEWGRF_SETTINGS_RESCAN_FILES_TOOLTIP :{BLACK}Fernij list my beskikbere NewGRF bestanden STR_NEWGRF_SETTINGS_REMOVE :{BLACK}Fuorthelje STR_NEWGRF_SETTINGS_REMOVE_TOOLTIP :{BLACK}Smyt de selektearre NewGRF út de list STR_NEWGRF_SETTINGS_MOVEUP :{BLACK}Pleats heger -STR_NEWGRF_SETTINGS_MOVEUP_TOOLTIP :{BLACK}Set selektjere NewGRF boppe oan de list +STR_NEWGRF_SETTINGS_MOVEUP_TOOLTIP :{BLACK}Set selektearre NewGRF boppenoan de list STR_NEWGRF_SETTINGS_MOVEDOWN :{BLACK}Pleats leger -STR_NEWGRF_SETTINGS_MOVEDOWN_TOOLTIP :{BLACK}Set selektjere NewGRF ûnderoan de list +STR_NEWGRF_SETTINGS_MOVEDOWN_TOOLTIP :{BLACK}Set selektearre NewGRF ûnderoan de list STR_NEWGRF_SETTINGS_UPGRADE :{BLACK}Upwurdearje STR_NEWGRF_SETTINGS_FILE_TOOLTIP :{BLACK}In list fan ynstalearre NewGRF bestânen @@ -2652,7 +2689,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Hat besocht in STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} befettet in korrupte ôfbylding. Alle korrupte ôfbyldings sille mei in read fraachteken markearre wurde (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Befet meardere Aksje-8 fermeldings (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Ein fan pseudo-ôfbylding lêze (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}It hjoeddeiske basisôfbyldingspakket misset in oantal ôfbylding.{}Besykje dit ôfbyldingspakket te fernijen STR_NEWGRF_ERROR_GRM_FAILED :Oanfrege GRF-bron is net beskikber (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} wie útskeakele troch {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Unjildich/ûnbekind ôfbyldingsútlisformaat (sprite {3:NUM}) @@ -2684,6 +2720,7 @@ STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Hy hat d # 'User removed essential NewGRFs'-placeholders for stuff without specs STR_NEWGRF_INVALID_CARGO : STR_NEWGRF_INVALID_CARGO_ABBREV :?? +STR_NEWGRF_INVALID_CARGO_QUANTITY :{COMMA} fan <ûnjildiche fracht> STR_NEWGRF_INVALID_ENGINE : STR_NEWGRF_INVALID_INDUSTRYTYPE : @@ -2691,6 +2728,7 @@ STR_NEWGRF_INVALID_INDUSTRYTYPE : # NewGRF scanning window +STR_NEWGRF_SCAN_CAPTION :{WHITE}NewGRFs neisjen STR_NEWGRF_SCAN_MESSAGE :{BLACK}Sykje nei NewGRFs. Dit kin in skoftke duorje. # Sign list window @@ -2716,8 +2754,6 @@ STR_TOWN_POPULATION :{BLACK}Wrâldpo STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (City) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Ynwenners: {ORANGE}{COMMA}{BLACK} Hûzen: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Passazjiers lêste moanne: {ORANGE}{COMMA}{BLACK} maks: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Post lêste moanne: {ORANGE}{COMMA}{BLACK} maks: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Guod nedich foar stêdsgroei: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} ferplichte STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} ferplichte yn de winter @@ -2796,6 +2832,7 @@ STR_GOAL_QUESTION_BUTTON_STOP :Stopje STR_GOAL_QUESTION_BUTTON_START :Start STR_GOAL_QUESTION_BUTTON_GO :Gean STR_GOAL_QUESTION_BUTTON_CONTINUE :Trjochgean +STR_GOAL_QUESTION_BUTTON_RESTART :Herstarte STR_GOAL_QUESTION_BUTTON_POSTPONE :Utstelle STR_GOAL_QUESTION_BUTTON_SURRENDER :Oerjaan STR_GOAL_QUESTION_BUTTON_CLOSE :Slute @@ -2838,7 +2875,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK} STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Akseptearre fracht sjen litte STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Aksepteart: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Dit stasjon hat eksklusyfe transportrjochten in dizze plak. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Dit stasjon hat eksklusyfe transportrjochten in dizze plak. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} Hat eksklusyfe transportrjochten in dizze plak kocht. STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Stasjonwurdearing sjen litte STR_STATION_VIEW_SUPPLY_RATINGS_TITLE :{BLACK}Moanlikse foarried en wurdearring: @@ -2935,11 +2973,13 @@ STR_COMPANY_VIEW_VEHICLES_TITLE :{GOLD}Fiertúch STR_COMPANY_VIEW_TRAINS :{WHITE}{COMMA} trein{P "" en} STR_COMPANY_VIEW_ROAD_VEHICLES :{WHITE}{COMMA} Wein{P "" en} STR_COMPANY_VIEW_AIRCRAFT :{WHITE}{COMMA} fleantugen +STR_COMPANY_VIEW_SHIPS :{WHITE}{COMMA} sk{P ip epen} STR_COMPANY_VIEW_VEHICLES_NONE :{WHITE}Gjin STR_COMPANY_VIEW_COMPANY_VALUE :{GOLD}Bedriuwswearde: {WHITE}{CURRENCY_LONG} STR_COMPANY_VIEW_SHARES_OWNED_BY :{WHITE}({COMMA}% besit fan {COMPANY}) STR_COMPANY_VIEW_INFRASTRUCTURE :{GOLD}Ynfrastruktuer: STR_COMPANY_VIEW_INFRASTRUCTURE_ROAD :{WHITE}{COMMA} stikje dyk{P "" s} +STR_COMPANY_VIEW_INFRASTRUCTURE_STATION :{WHITE}{COMMA} stasjontegel{P "" s} STR_COMPANY_VIEW_INFRASTRUCTURE_AIRPORT :{WHITE}{COMMA} fleanfjild{P "" en} STR_COMPANY_VIEW_INFRASTRUCTURE_NONE :{WHITE}Gjin @@ -2976,6 +3016,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Stikjes d STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Dyk STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tramwei STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stasjons: +STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS :{WHITE}Stasjontegels STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS :{WHITE}Fleanfjilden STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL :{WHITE}{CURRENCY_LONG}/jr @@ -3000,8 +3041,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Nedich: STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Nedich: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produseart: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Produseart: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3043,6 +3084,7 @@ STR_GROUP_ALL_ROAD_VEHICLES :Alle weinen STR_GROUP_ALL_SHIPS :Alle skepen STR_GROUP_ALL_AIRCRAFTS :Alle fleantugen +STR_GROUP_DEFAULT_SHIPS :Net groepearre skepen STR_GROUP_CREATE_TOOLTIP :{BLACK}Klik om in groep oan te meitsje STR_GROUP_DELETE_TOOLTIP :{BLACK}Smit de selektearre groep fuort @@ -3053,8 +3095,11 @@ STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Ferwider STR_GROUP_REMOVE_ALL_VEHICLES :Alle fiertugen weihelje + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nije spoar weinen +STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nije elektryske treinen +STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :Nije Maglev Treinen STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Nije Weinen STR_BUY_VEHICLE_SHIP_CAPTION :Nije Skepen @@ -3062,6 +3107,7 @@ STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Nije fleantugen STR_PURCHASE_INFO_SPEED_POWER :{BLACK}Snelheid: {GOLD}{VELOCITY}{BLACK} Kracht: {GOLD}{POWER} STR_PURCHASE_INFO_SPEED :{BLACK}Snelheid: {GOLD}{VELOCITY} +STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}Faasje op see: {GOLD}{VELOCITY} STR_PURCHASE_INFO_RUNNINGCOST :{BLACK}Underhâldskosten: {GOLD}{CURRENCY_LONG}/jr STR_PURCHASE_INFO_CAPACITY :{BLACK}Kapasiteit: {GOLD}{CARGO_LONG} {STRING} STR_PURCHASE_INFO_REFITTABLE :(kin omboud wurde) @@ -3073,6 +3119,8 @@ STR_PURCHASE_INFO_COST_SPEED :{BLACK}Kosten: STR_PURCHASE_INFO_AIRCRAFT_CAPACITY :{BLACK}Kapasiteit: {GOLD}{CARGO_LONG}, {CARGO_LONG} STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Kin omboud wurde nei: {GOLD}{STRING} STR_PURCHASE_INFO_ALL_TYPES :Alle frachttypen +STR_PURCHASE_INFO_ALL_BUT :Alles útsein {CARGO_LIST} +STR_PURCHASE_INFO_MAX_TE :{BLACK}Maks. Lûkkrêft: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Berik: {GOLD}{COMMA} flakken @@ -3094,7 +3142,7 @@ STR_BUY_VEHICLE_AIRCRAFT_RENAME_BUTTON :{BLACK}Jow in n STR_BUY_VEHICLE_TRAIN_RENAME_TOOLTIP :{BLACK}Jow trein in nije namme STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_TOOLTIP :{BLACK}Jow auto in nije namme STR_BUY_VEHICLE_SHIP_RENAME_TOOLTIP :{BLACK}Jow boat type in nije namme -STR_BUY_VEHICLE_AIRCRAFT_RENAME_TOOLTIP :{BLACK}Jow fleantúg type in nije namme +STR_BUY_VEHICLE_AIRCRAFT_RENAME_TOOLTIP :{BLACK}Fleantúch type in nije nammer jaan STR_BUY_VEHICLE_TRAIN_HIDE_TOGGLE_BUTTON :{BLACK}Ferbergje STR_BUY_VEHICLE_ROAD_VEHICLE_HIDE_TOGGLE_BUTTON :{BLACK}Ferbergje @@ -3112,6 +3160,7 @@ STR_BUY_VEHICLE_SHIP_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Wikselje STR_BUY_VEHICLE_AIRCRAFT_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Wikselje tusken it ferbergje/sjen litte fan it soart fleanmasine STR_QUERY_RENAME_TRAIN_TYPE_CAPTION :{WHITE}Jou treinmodel in oare namme +STR_QUERY_RENAME_AIRCRAFT_TYPE_CAPTION :{WHITE}Fleantúch type in nije namme jaan # Depot window STR_DEPOT_CAPTION :{WHITE}{DEPOT} @@ -3124,13 +3173,17 @@ STR_DEPOT_VEHICLE_TOOLTIP :{BLACK}{ENGINE} STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG} ({CARGO_SHORT}) STR_DEPOT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Weinen - Brûk rjochter mûsklik op de wein foar ynformaasje +STR_DEPOT_SHIP_LIST_TOOLTIP :{BLACK}Skepen - Brûk rjochter mûsklik op it skip foar ynformaasje STR_DEPOT_TRAIN_SELL_TOOLTIP :{BLACK}tôgje trein hjirhinne om it te ferkeapjen. STR_DEPOT_ROAD_VEHICLE_SELL_TOOLTIP :{BLACK}tôgje wein hjirhinne om it te ferkeapjen. +STR_DEPOT_SHIP_SELL_TOOLTIP :{BLACK}Tôgje skip hjirhinne om it te ferkeapjen STR_DEPOT_AIRCRAFT_SELL_TOOLTIP :{BLACK}tôgje fleantúg hjirhinne om it te ferkeapjen. +STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TOOLTIP :{BLACK}Ferkeapje alle treinen yn dit depot STR_DEPOT_SELL_ALL_BUTTON_ROAD_VEHICLE_TOOLTIP :Ferkeapje alle weinen yn disse garage +STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TOOLTIP :{BLACK}Ferkeapje alle fleantugen yn hangar STR_DEPOT_AUTOREPLACE_SHIP_TOOLTIP :{BLACK}Ferfang automatysk skippen yn de skipmakkerij STR_DEPOT_AUTOREPLACE_AIRCRAFT_TOOLTIP :{BLACK}Ferfang automatysk alle fleantúgen yn disse fleantúchhangaar @@ -3148,8 +3201,11 @@ STR_DEPOT_AIRCRAFT_NEW_VEHICLES_TOOLTIP :{BLACK}Nij flea -STR_DEPOT_MASS_STOP_DEPOT_TRAIN_TOOLTIP :{BLACK}Klik om alle treinen binnen dit depot te stoppen +STR_DEPOT_MASS_STOP_DEPOT_TRAIN_TOOLTIP :{BLACK}Klik om alle treinen yn dit depot te stopjen +STR_DEPOT_MASS_STOP_DEPOT_ROAD_VEHICLE_TOOLTIP :{BLACK}Klik om alle weinen yn dizze garaazje te stopjen +STR_DEPOT_MASS_STOP_HANGAR_TOOLTIP :{BLACK}Klik om alle fleantugen yn dizze hangar te stopje +STR_DEPOT_MASS_START_DEPOT_SHIP_TOOLTIP :{BLACK}Klik om alle skepen te starte # Engine preview window @@ -3163,6 +3219,7 @@ STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :monorail lokomo STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :maglevlokomotyf STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Kosten: {CURRENCY_LONG} Gewicht: {WEIGHT_SHORT}{}Snelheid: {VELOCITY} Kracht: {POWER}{}Underhâldskosten: {CURRENCY_LONG}/jr{}Kapasiteit: {CARGO_LONG} +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Kosten: {CURRENCY_LONG} Maks. Faasje: {VELOCITY}{}Kapasiteit: {CARGO_LONG}{}Underhâldskosten: {CURRENCY_LONG}/jr # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Ferfang {STRING} - {STRING} @@ -3176,27 +3233,40 @@ STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES :{YELLOW}Beskikb STR_REPLACE_HELP_LEFT_ARRAY :{BLACK}Selektearje it type lokomotyf om te ferfangen +STR_REPLACE_VEHICLES_NOW :No alle fiertugen ferfange STR_REPLACE_VEHICLES_WHEN_OLD :Ferfang allinech âlde weinen STR_REPLACE_MONORAIL_VEHICLES :Monorail weinen +STR_REPLACE_MAGLEV_VEHICLES :Maglev treinen # Vehicle view STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE} STR_VEHICLE_VIEW_TRAIN_LOCATION_TOOLTIP :{BLACK}Sintrearje it byld op de lokaasje fan disse trein. bij Ctrl+Click bliuwst it skip folgjen +STR_VEHICLE_VIEW_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Sintrearje it byld op de lokaasje van dizze wein. Brûk Ctrl+klik om dizze wein te folgjen STR_VEHICLE_VIEW_SHIP_LOCATION_TOOLTIP :{BLACK}Sintrearje it byld op de lokaasje fan dit skip. bij Ctrl+Click bliuwst it skip folgjen STR_VEHICLE_VIEW_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Sintrearje it byld op de lokaasje fan dit fleantúch +STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Stjoer trein nei depot. Brûk Ctrl+Klik om allinich ûnderhâld te jaan +STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}Stjoer wein nei garaazje. Brûk Ctrl+Klik om allinich ûnderhâld te jaan STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Stjoer skip nij skipmakkerij. Brûk Ctrl+klik om skip ûnderhâld te jaan +STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}Stjoer fleantúch nei hanger. Brûk Ctrl+klik om allinich ûnderhald te jaan +STR_VEHICLE_VIEW_TRAIN_REFIT_TOOLTIP :{BLACK}Trein ombouwe om in oar soart fracht mei te nimmen +STR_VEHICLE_VIEW_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Wein ombouwe om in oar soart fracht mei te nimmen +STR_VEHICLE_VIEW_SHIP_REFIT_TOOLTIP :{BLACK}Skip ombouwe nei in oar saort fracht +STR_VEHICLE_VIEW_TRAIN_REVERSE_TOOLTIP :{BLACK}Rydrjochting fan trein omkeare +STR_VEHICLE_VIEW_ROAD_VEHICLE_ORDERS_TOOLTIP :{BLACK}Lit oarders fan'e wein sjen. Brûk Ctrl+Klik om de tjinstregeling te sjen STR_VEHICLE_VIEW_SHIP_ORDERS_TOOLTIP :{BLACK}Lit de rûte fan dit skip sjen. Ctrl+Click lit tsjinstregeling sjen +STR_VEHICLE_VIEW_AIRCRAFT_ORDERS_TOOLTIP :{BLACK}Lit oarders fan fleantúch sjen. Brûk Ctrl+Klik om de tjinstregeling te sjen +STR_VEHICLE_VIEW_AIRCRAFT_SHOW_DETAILS_TOOLTIP :{BLACK}Fleantúch details sjen litte # Messages in the start stop button in the vehicle view @@ -3206,6 +3276,7 @@ STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}Stikken STR_VEHICLE_STATUS_STOPPED :{RED}Stoppe STR_VEHICLE_STATUS_TRAIN_STOPPING_VEL :{RED}Stoppet, {VELOCITY} STR_VEHICLE_STATUS_TRAIN_NO_POWER :{RED}Gjin enerzjy +STR_VEHICLE_STATUS_TRAIN_STUCK :{ORANGE}Wachtsje op frije rûte STR_VEHICLE_STATUS_AIRCRAFT_TOO_FAR :{ORANGE}Te fier nei folgjende bestimming STR_VEHICLE_STATUS_HEADING_FOR_STATION_VEL :{LTBLUE}Ûnderweis nei {STATION}, {VELOCITY} @@ -3216,18 +3287,23 @@ STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}ûnderh # Vehicle stopped/started animations STR_VEHICLE_COMMAND_STOPPED_SMALL :{TINY_FONT}{RED}Stoppe STR_VEHICLE_COMMAND_STOPPED :{RED}Stoppe +STR_VEHICLE_COMMAND_STARTED_SMALL :{TINY_FONT}{GREEN}Starte +STR_VEHICLE_COMMAND_STARTED :{GREEN}Starte # Vehicle details STR_VEHICLE_DETAILS_CAPTION :{WHITE}{VEHICLE} (Details) STR_VEHICLE_NAME_BUTTON :{BLACK}Namme +STR_VEHICLE_DETAILS_TRAIN_RENAME :{BLACK}Jou trein in namme STR_VEHICLE_DETAILS_ROAD_VEHICLE_RENAME :{BLACK}Namme fan de wein +STR_VEHICLE_DETAILS_SHIP_RENAME :{BLACK}Skip in namme jaan # The next two need to stay in this order STR_VEHICLE_INFO_AGE :{COMMA} jier{P "" ren} ({COMMA}) STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} jier{P "" ren} ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Maks. snelheid: {LTBLUE}{VELOCITY} +STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Gewicht: {LTBLUE}{WEIGHT_SHORT} {BLACK}Krêft: {LTBLUE}{POWER}{BLACK} Maks. faasje: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}betrouberens: {LTBLUE}{COMMA}% {BLACK}Stikken west sûnt lêste ûnderhâld: {LTBLUE}{COMMA} @@ -3243,6 +3319,7 @@ STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Underhâ STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}Underhâldsinterval ferheegje mei 10. Ctrl+Klik ferheegt underhâldsinterval mei 5 STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}Tiid tusken ûnderhâldsbeurten ferleegje mei 10. Ctrl+Klik ferleegt de tiid tusken ûnderhâldsbeurten mei 5. +STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Feroarje tiid tusken ûnderhâldsbeurten STR_VEHICLE_DETAILS_DEFAULT :Standert STR_VEHICLE_DETAILS_DAYS :Dagen STR_VEHICLE_DETAILS_PERCENT :Persintaazje @@ -3253,6 +3330,8 @@ STR_QUERY_RENAME_SHIP_CAPTION :{WHITE}Namme fa STR_QUERY_RENAME_AIRCRAFT_CAPTION :{WHITE}Namme fan fleantúch feroarje # Extra buttons for train details windows +STR_VEHICLE_DETAILS_TRAIN_ENGINE_BUILT_AND_VALUE :{LTBLUE}{ENGINE}{BLACK} Makke: {LTBLUE}{NUM}{BLACK} Wearde: {LTBLUE}{CURRENCY_LONG} +STR_VEHICLE_DETAILS_TRAIN_WAGON_VALUE :{LTBLUE}{ENGINE}{BLACK} Wearde: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_TEXT :{BLACK}Totale kapasiteit fan dizze trein: STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY :{LTBLUE}- {CARGO_LONG} ({CARGO_SHORT}) @@ -3264,30 +3343,40 @@ STR_VEHICLE_DETAILS_CARGO_FROM_MULT :{LTBLUE}{CARGO_ STR_VEHICLE_DETAIL_TAB_CARGO :{BLACK}Fracht STR_VEHICLE_DETAIL_TAB_INFORMATION :{BLACK}Ynformaasje +STR_VEHICLE_DETAILS_TRAIN_INFORMATION_TOOLTIP :{BLACK}Treindetails sjen litte STR_VEHICLE_DETAIL_TAB_CAPACITIES :{BLACK}Kapasiteit STR_VEHICLE_DETAIL_TAB_TOTAL_CARGO :{BLACK}Totale Fracht STR_VEHICLE_DETAILS_TRAIN_ARTICULATED_RV_CAPACITY :{BLACK}Kapasiteit: {LTBLUE} # Vehicle refit +STR_REFIT_TITLE :{GOLD}Selektearje it soart fracht om mei te nimmen: +STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Nije kapasiteit: {GOLD}{CARGO_LONG}{}{BLACK}Kosten fan ombou: {RED}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Nije kapasiteit: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}kosten fan werfolje: {RED}{CURRENCY_LONG} STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Selektearje in ferfiermiddel foar reparaasje. sleep mei de mûs om meardere ferfiermiddels te selekttearjen. Ctrl+klick sil in ferfiermiddel selektearje en de neikommende rige STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}selektearje soart fracht foar de trein om mei te nimmen +STR_REFIT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Selektearje it soart fracht foar wein om mei te nimmen +STR_REFIT_SHIP_LIST_TOOLTIP :{BLACK}Selektearje it soart fracht foar it skip om mei te nimmen +STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Selektearje it soart fracht foar it fleantúch om mei te nimmen STR_REFIT_TRAIN_REFIT_BUTTON :{BLACK}Trein ombouwe STR_REFIT_ROAD_VEHICLE_REFIT_BUTTON :{BLACK}Wein ombouwe STR_REFIT_SHIP_REFIT_BUTTON :{BLACK}Skip ombouwe STR_REFIT_AIRCRAFT_REFIT_BUTTON :{BLACK}Fleantúch ombouwe +STR_REFIT_TRAIN_REFIT_TOOLTIP :{BLACK}Trein ombouwe nei selektearre fracht STR_REFIT_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Wein ombouwe nij selektearre fracht -STR_REFIT_SHIP_REFIT_TOOLTIP :{BLACK}Skip ombouwe nij selektearre fracht +STR_REFIT_SHIP_REFIT_TOOLTIP :{BLACK}Skip ombouwe nei selektearre fracht +STR_REFIT_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Fleantúch ombouwe nei selektearre fracht # Order view +STR_ORDERS_TIMETABLE_VIEW :{BLACK}Tjinstregeling STR_ORDER_INDEX :{COMMA}:{NBSP} STR_ORDER_TEXT :{STRING} {STRING} {STRING} +STR_ORDERS_END_OF_ORDERS :--Ein fan de Oarders-- # Order bottom buttons STR_ORDER_GO_TO :Gean nei @@ -3296,7 +3385,9 @@ STR_ORDER_GO_VIA :Gean via STR_ORDER_GO_NON_STOP_VIA :Gean non-stop fia STR_ORDER_TOOLTIP_NON_STOP :{BLACK}Feroarje it stop gedrach fan selektearre opdracht -STR_ORDER_DROP_FULL_LOAD_ANY :Folslein lade fan alle fracht +STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}Alle fracht folslein lade +STR_ORDER_DROP_LOAD_IF_POSSIBLE :Lade as beskikber +STR_ORDER_DROP_FULL_LOAD_ANY :Samar in fracht folslein lade STR_ORDER_DROP_NO_LOADING :Net laden STR_ORDER_TOGGLE_UNLOAD :{BLACK}Alles losse @@ -3340,7 +3431,13 @@ STR_ORDER_SHARE :Dielde Bestimmi STR_ORDER_GO_TO_WAYPOINT :Lâns {WAYPOINT} STR_ORDER_GO_NON_STOP_TO_WAYPOINT :Oanienwei lâns {WAYPOINT} +STR_ORDER_SERVICE_AT :Underhâld by +STR_ORDER_NEAREST_DEPOT :de tichtstbye +STR_ORDER_NEAREST_HANGAR :de tichtstbye Hangar +STR_ORDER_TRAIN_DEPOT :Treindepot +STR_ORDER_ROAD_VEHICLE_DEPOT :Garaazje +STR_ORDER_SHIP_DEPOT :Skip Depot STR_ORDER_GO_TO_NEAREST_DEPOT_FORMAT :{STRING} {STRING} {STRING} STR_ORDER_GO_TO_DEPOT_FORMAT :{STRING} {DEPOT} @@ -3352,19 +3449,25 @@ STR_ORDER_GO_TO_STATION :{STRING} {STATI STR_ORDER_IMPLICIT :(Ymplisyt) STR_ORDER_FULL_LOAD :(Folle fracht) -STR_ORDER_FULL_LOAD_ANY :(Folle fracht elke lading) +STR_ORDER_FULL_LOAD_ANY :(Samar in fracht folslein lade) STR_ORDER_NO_LOAD :(Gjin lading) STR_ORDER_UNLOAD :(Afladen en nim lading STR_ORDER_UNLOAD_FULL_LOAD :(Afladen en wacht foar folle fracht) -STR_ORDER_UNLOAD_FULL_LOAD_ANY :(Afladen en wacht foar elke folle fracht) +STR_ORDER_UNLOAD_FULL_LOAD_ANY :(Losse en wachtsje foar ien folle fracht) STR_ORDER_UNLOAD_NO_LOAD :(Oflade en lit leech) STR_ORDER_TRANSFER :(Oerladen en fracht meinimme) +STR_ORDER_TRANSFER_FULL_LOAD :(Oerlade en wachtsje foar folle fracht) STR_ORDER_TRANSFER_NO_LOAD :(Oerladen en lit leech) STR_ORDER_NO_UNLOAD :(Net losse en fracht meinimme) STR_ORDER_NO_UNLOAD_FULL_LOAD :(Net losse en wacht foar folle fracht) +STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY :(Net losse en wachtsje foar samar in folle fracht) STR_ORDER_NO_UNLOAD_NO_LOAD :(net lade of losse) STR_ORDER_AUTO_REFIT :(Ombouwe nei {STRING}) +STR_ORDER_FULL_LOAD_REFIT :(Folslein lade mei ombou nei {STRING}) +STR_ORDER_FULL_LOAD_ANY_REFIT :(Folslein samar in fracht lade mei ombou nei {STRING}) +STR_ORDER_UNLOAD_REFIT :(Losse en fracht meinimme mei ombou nei {STRING}) +STR_ORDER_UNLOAD_FULL_LOAD_REFIT :(Losse en folslein lade mei ombou nei {STRING}) STR_ORDER_NO_UNLOAD_REFIT :(Net losse en fracht meinimme mei ombou nei {STRING}) STR_ORDER_NO_UNLOAD_FULL_LOAD_REFIT :(Net losse en folslein lade mei ombou nei {STRING}) STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY_REFIT :(Net losse en ien fracht folslein lade mei ombou nei {STRING}) @@ -3400,6 +3503,7 @@ STR_TIMETABLE_TICKS :{COMMA}{NBSP}ti STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Dit fiertûg is op tiid +STR_TIMETABLE_STARTING_DATE :{BLACK}Begjin datum STR_TIMETABLE_CHANGE_TIME :{BLACK}Tiid Feroarje @@ -3435,6 +3539,8 @@ STR_AI_DEBUG_NAME_AND_VERSION :{BLACK}{STRING} STR_AI_DEBUG_NAME_TOOLTIP :{BLACK}Skriptnamme STR_AI_DEBUG_SETTINGS :{BLACK}Ynstellings STR_AI_DEBUG_SETTINGS_TOOLTIP :{BLACK}Ynstellings fan it skript feroarje +STR_AI_DEBUG_RELOAD :{BLACK}AI opnij lade +STR_AI_DEBUG_MATCH_CASE :{BLACK}Wol as net op haadletters lette STR_AI_DEBUG_CONTINUE :{BLACK}Trjochgean STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}Lit debug output fan dizze AI sjen STR_AI_GAME_SCRIPT :{BLACK}Spulskript @@ -3444,11 +3550,15 @@ STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}AI/Spul # AI configuration window STR_AI_CONFIG_CAPTION :{WHITE}AI/Spulskript konfiguraasje +STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}It spulskript dat yn it folgjende spul laden sil wurde +STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}AIs dy't yn it folgjende spul laden sille wurde STR_AI_CONFIG_HUMAN_PLAYER :Minslike spiler STR_AI_CONFIG_RANDOM_AI :Samar in AI STR_AI_CONFIG_NONE :(gjin) STR_AI_CONFIG_MOVE_UP :{BLACK}Pleats heger +STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Set selektearre AI boppenoan de list +STR_AI_CONFIG_MOVE_DOWN :{BLACK}Pleats leger STR_AI_CONFIG_GAMESCRIPT :{SILVER}Spulskript STR_AI_CONFIG_AI :{SILVER}AIs @@ -3458,6 +3568,8 @@ STR_AI_CONFIG_CHANGE_NONE : STR_AI_CONFIG_CHANGE_AI :AI STR_AI_CONFIG_CHANGE_GAMESCRIPT :Spulskript STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}in oar script lade +STR_AI_CONFIG_CONFIGURE :{BLACK}Ynstelle +STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Parameters fan it skript ynstelle # Available AIs window STR_AI_LIST_CAPTION :{WHITE}Beskikber {STRING} @@ -3484,8 +3596,10 @@ STR_AI_SETTINGS_SETTING :{STRING}: {ORAN # Textfile window +STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} feroarings fan {STRING} STR_TEXTFILE_LICENCE_CAPTION :{WHITE}{STRING} lisinsje fan {STRING} STR_TEXTFILE_WRAP_TEXT :{WHITE}Omwikkelje tekst +STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Feroarings STR_TEXTFILE_VIEW_LICENCE :{BLACK}Lisinsje @@ -3505,6 +3619,9 @@ STR_INCOME_FLOAT_COST :{RED}Kostet: {C STR_INCOME_FLOAT_INCOME_SMALL :{TINY_FONT}{GREEN}Opbringst: {CURRENCY_LONG} STR_INCOME_FLOAT_INCOME :{GREEN}Opbringst: {CURRENCY_LONG} STR_FEEDER_TINY :{TINY_FONT}{YELLOW}Omwikselje: {CURRENCY_LONG} +STR_FEEDER_INCOME_TINY :{TINY_FONT}{YELLOW}Oerdracht: {CURRENCY_LONG}{WHITE} / {GREEN}Opbringst: {CURRENCY_LONG} +STR_FEEDER_INCOME :{YELLOW}Oerdracht: {CURRENCY_LONG}{WHITE} / {GREEN}Opbringst: {CURRENCY_LONG} +STR_FEEDER_COST :{YELLOW}Oerdracht: {CURRENCY_LONG}{WHITE} / {RED}Kosten: {CURRENCY_LONG} STR_MESSAGE_ESTIMATED_COST :{WHITE}Dit gjit {CURRENCY_LONG} kosten. STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Dit gjit {CURRENCY_LONG} opbringen. @@ -3531,6 +3648,7 @@ STR_ERROR_HEIGHTMAP_TOO_LARGE :{WHITE}... ôfb # Soundset messages # Screenshot related messages +STR_WARNING_SCREENSHOT_SIZE_CAPTION :{WHITE}Grutte skermôfbylding STR_MESSAGE_SCREENSHOT_SUCCESSFULLY :{WHITE}Skermfoto opslein as '{STRING}' STR_ERROR_SCREENSHOT_FAILED :{WHITE}Koe gjin skermfoto meitsje! @@ -3638,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 3ec243f079..114c434f36 100644 --- a/src/lang/unfinished/ido.txt +++ b/src/lang/unfinished/ido.txt @@ -377,7 +377,6 @@ STR_MUSIC_TRACK_DIGIT :{TINY_FONT}{DKG STR_MUSIC_TITLE_NONE :{TINY_FONT}{DKGREEN}------ STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}" - # Playlist window # Highscore window @@ -776,7 +775,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_HEADQUARTERS :Stabeyo di komp # About OpenTTD window STR_ABOUT_VERSION :{BLACK}OpenTTD versiono {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2015 La kruo OpenTTD +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 @@ -921,6 +927,7 @@ STR_COMPANY_VIEW_VEHICLES_TITLE :{GOLD}Vehili: ############ range for requires starts ############ range for requires ends + ############ range for produces starts ############ range for produces ends @@ -966,6 +973,7 @@ STR_GROUP_DEFAULT_AIRCRAFTS :Negrupigita aer + # Build vehicle window diff --git a/src/lang/unfinished/macedonian.txt b/src/lang/unfinished/macedonian.txt index 7df355626d..30a0f142b1 100644 --- a/src/lang/unfinished/macedonian.txt +++ b/src/lang/unfinished/macedonian.txt @@ -641,10 +641,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Избе STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Вклучи/исклучи мешање за програм STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Прикажи диалог за избор на песна -STR_ERROR_NO_SONGS :{WHITE}Музички сет без песни е избран. Не песни ќе се одигра - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Избор на музички програм STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Индекс на песната STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Програм - '{STRING}' @@ -1202,7 +1199,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Компани STR_ABOUT_OPENTTD :{WHITE}За OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Оригинален copyright {COPYRIGHT} 1995 Chris Sawyer, Сите права се задржани STR_ABOUT_VERSION :{BLACK}OpenTTD верзија {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2015 OpenTTD тимот +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}Оптоварување @@ -1270,7 +1274,6 @@ STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_OBJECT :Објекто # NewGRF (self) generated warnings/errors STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING} -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Во моментов се користат база графики поставени недостасува голем број на sprites.{}Надградете ја основата графика во собата. # NewGRF related 'general' warnings STR_NEWGRF_POPUP_CAUTION_CAPTION :{WHITE}Внимание! @@ -1413,6 +1416,7 @@ STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Прои ############ range for requires starts ############ range for requires ends + ############ range for produces starts ############ range for produces ends @@ -1448,6 +1452,7 @@ STR_VEHICLE_LIST_SEND_SHIP_TO_DEPOT :Испрати + # Build vehicle window STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Шински возила @@ -1501,8 +1506,6 @@ STR_DEPOT_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Цент # Engine preview window -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Цена: {CURRENCY_LONG} Макс. брзина: {VELOCITY} Опсег: {COMMA} плочки{}Капацитет: {CARGO_LONG}, {CARGO_LONG}{}Вклучување Цена: {CURRENCY_LONG}/год -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Цена: {CURRENCY_LONG} Макс. брзина: {VELOCITY} Опсег: {COMMA}плочки{}капацитет: {CARGO_LONG}{}Вклучување Цена: {CURRENCY_LONG}/год # Autoreplace window STR_REPLACE_VEHICLE_TRAIN :Воз @@ -1549,7 +1552,6 @@ STR_VEHICLE_DETAILS_AIRCRAFT_RENAME :{BLACK}Име STR_VEHICLE_INFO_AGE :{COMMA} година{P "" s} ({COMMA}) STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} година{P "" s} ({COMMA}) -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Макс. брзина: {LTBLUE}{VELOCITY} {BLACK}Опсег: {LTBLUE}{COMMA} плочки diff --git a/src/lang/unfinished/maltese.txt b/src/lang/unfinished/maltese.txt index 8796505385..4fc0e8cb10 100644 --- a/src/lang/unfinished/maltese.txt +++ b/src/lang/unfinished/maltese.txt @@ -346,7 +346,6 @@ STR_MUSIC_TRACK_DIGIT :{TINY_FONT}{DKG STR_MUSIC_TITLE_NONE :{TINY_FONT}{DKGREEN}------ STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}" - # Playlist window # Highscore window @@ -683,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 @@ -818,6 +824,7 @@ STR_FINANCES_POSITIVE_INCOME :{BLACK}+{CURREN ############ range for requires starts ############ range for requires ends + ############ range for produces starts ############ range for produces ends @@ -838,6 +845,7 @@ STR_FINANCES_POSITIVE_INCOME :{BLACK}+{CURREN + # Build vehicle window diff --git a/src/lang/unfinished/marathi.txt b/src/lang/unfinished/marathi.txt index 3125899304..4576bccbae 100644 --- a/src/lang/unfinished/marathi.txt +++ b/src/lang/unfinished/marathi.txt @@ -628,10 +628,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}'कस STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}कार्यक्रम चुळबूळ - प्रारंभ / बंद STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}संगीत ट्रॅक निवड दाखवा -STR_ERROR_NO_SONGS :{WHITE}संगीत न संगीत संच निवडले गेले आहे. एकही गाणी खेळला जाईल. - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}संगीत कार्यक्रम निवड. STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}गाणे क्रमांक STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}कार्यक्रम - '{STRING}' @@ -1110,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} @@ -1279,8 +1283,8 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}ला STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}लाग्त: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}बनव्त: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}बनव्त: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -1310,6 +1314,7 @@ STR_GROUP_ALL_AIRCRAFTS :सर्व STR_GROUP_REMOVE_ALL_VEHICLES :सगळे वाहने काढा + # Build vehicle window STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :नवीन रस्त्यावरचे वाहन diff --git a/src/lang/unfinished/persian.txt b/src/lang/unfinished/persian.txt index 2934a8a1d0..231f11af81 100644 --- a/src/lang/unfinished/persian.txt +++ b/src/lang/unfinished/persian.txt @@ -658,10 +658,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}انتخ STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}پخش به صورت لیست برهم ریخته STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}نمایش پنجره لیست آهنگهای انتخابی -STR_ERROR_NO_SONGS :{WHITE}در مجموعه موسیقی آهنگی انتخاب نشده است. هیچ آهنگی پخش نخواهد شد - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}انتخاب برنامه پخش موسیقی STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}شماره ی آهنگ STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}برنامه - '{STRING}' @@ -970,6 +967,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}وضوح STR_GAME_OPTIONS_RESOLUTION_OTHER :دیگر +STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :دو برابر STR_GAME_OPTIONS_BASE_GRF :{BLACK}بسته گرافیک پایه STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}بسته گرافیک پایه را انتخاب کنید @@ -1226,7 +1224,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR :رنگ استف 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_REVERSE_SCROLLING :برعکس کردن جهت حرکت کردن صفحه: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING :تصویر صاف در نمای اضافه: {STRING} STR_CONFIG_SETTING_MEASURE_TOOLTIP :نمایش متن کمکی وقتی از چندین ابزار استفاده می شود: {STRING} STR_CONFIG_SETTING_LIVERIES :نمایش طراحی مخصوص وسیله نقلیه : {STRING} @@ -1246,7 +1243,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :دستور+کل STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :کنترل+کلیک STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :خاموش -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :حرکت در نقشه با کلیک چپ:: {STRING} STR_CONFIG_SETTING_AUTOSAVE :ذخیره خودکار: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :انتخاب فاصله زمانی بین ذخیره کردن های خودکار @@ -2302,29 +2298,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :زمین ها STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :زمین پوشیده از برف STR_LAI_CLEAR_DESCRIPTION_DESERT :صحرا -STR_LAI_RAIL_DESCRIPTION_TRACK :{STRING} ریل -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :{STRING} ریل با نشانگر توقف -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :{STRING} ریل با پیش نشانگر -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :{STRING} ریل با نشانگر خروج -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :{STRING} ریل با نشانگر چندگانه -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :{STRING} ریل با نشانگر مسیر -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :{STRING} ریل با نشانگر مسیر یکطرفه -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :{STRING} ریل با نشانگرهای توقف و پیش نشانگر -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :{STRING} ریل با نشانگرهای توقف و خروج -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :{STRING} ریل با نشانگرهای توقف و چندگانه -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :{STRING} ریل با نشانگرهای توقف و مسیر -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :{STRING} ریل با نشانگرهای توقف و مسیر یکطرفه -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :{STRING} ریل با پیش نشانگر و نشانگرخروج -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :{STRING} ریل با پیش نشانگر و نشانگرچندگانه -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :{STRING} ریل با پیش نشانگر و نشانگز مسیر -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :{STRING} ریل با پیش نشانگر و نشانگر مسیر یکطرفه -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :{STRING} ریل با نشانگرهای خروج و چندگانه -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :{STRING} ریل با نشانگرهای خروج و مسیر -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :{STRING} ریل با نشانگرهای خروج و مسیر یکطرفه -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :{STRING} ریل با نشانگرهای چندگانه و مسیر -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :{STRING} ریل با نشانگرهای چندگانه و مسیر یکطرفه -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :{STRING} ریل با نشانگرهای مسیر و مسیر یکطرفه -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :{STRING} گاراژ قطار +STR_LAI_RAIL_DESCRIPTION_TRACK :راه‌آهن ریل +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :راه‌آهن ریل با نشانگر توقف +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :راه‌آهن ریل با پیش نشانگر +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :راه‌آهن ریل با نشانگر خروج +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :راه‌آهن ریل با نشانگر چندگانه +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :راه‌آهن ریل با نشانگر مسیر +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :راه‌آهن ریل با نشانگر مسیر یکطرفه +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :راه‌آهن ریل با نشانگرهای توقف و پیش نشانگر +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :راه‌آهن ریل با نشانگرهای توقف و خروج +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :راه‌آهن ریل با نشانگرهای توقف و چندگانه +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :راه‌آهن ریل با نشانگرهای توقف و مسیر +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :راه‌آهن ریل با نشانگرهای توقف و مسیر یکطرفه +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :راه‌آهن ریل با پیش نشانگر و نشانگرخروج +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :راه‌آهن ریل با پیش نشانگر و نشانگرچندگانه +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :راه‌آهن ریل با پیش نشانگر و نشانگز مسیر +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :راه‌آهن ریل با پیش نشانگر و نشانگر مسیر یکطرفه +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :راه‌آهن ریل با نشانگرهای خروج و چندگانه +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :راه‌آهن ریل با نشانگرهای خروج و مسیر +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :راه‌آهن ریل با نشانگرهای خروج و مسیر یکطرفه +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :راه‌آهن ریل با نشانگرهای چندگانه و مسیر +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :راه‌آهن ریل با نشانگرهای چندگانه و مسیر یکطرفه +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :راه‌آهن ریل با نشانگرهای مسیر و مسیر یکطرفه +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :راه‌آهن گاراژ قطار STR_LAI_ROAD_DESCRIPTION_ROAD :جاده STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :جاده با چراغ راهنمایی رانندگی @@ -2388,7 +2384,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :زمین خری STR_ABOUT_OPENTTD :{WHITE}OpenTTD در باره ی STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original copyright {COPYRIGHT} 1995 Chris Sawyer, All rights reserved STR_ABOUT_VERSION :{BLACK}OpenTTD ویرایش {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2015 The OpenTTD team +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}ذخیره ی بازی @@ -2592,7 +2595,6 @@ STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :فایل GRF ب STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :تعداد NewGRF بیشتر از حد می باشد STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :در حال بارگزاری {1:STRING} به عنوان NewGRF ایستا با {STRING} مشکل همخوانی دارد STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} دارای یک تصویر خراب می باشد. تصویرهای خراب با علامت سوال قرمز (؟) نشان داده شدند. -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}بسته گرافیک استفاده شده تعدادی از تصاوبر را ندارد.{}لطفا بسته گرافیکی را به روز کنید STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} غیر فعال گردیده توسط {STRING} # NewGRF related 'general' warnings @@ -2663,8 +2665,6 @@ 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_PASSENGERS_LAST_MONTH_MAX :{BLACK}مسافران در ماه گذشته: {ORANGE}{COMMA}{BLACK} حداکثر: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}نامه ها در ماه گذشته: {ORANGE}{COMMA}{BLACK} حداکثر: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}نوع بار برای رشد شهر: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} ضروری STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} در زمستان ضروری است @@ -2908,6 +2908,7 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}مواد STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}مواد اولیه: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends + ############ range for produces starts STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}محصولات: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}محصولات: {YELLOW}{STRING}{STRING}, {STRING}{STRING} @@ -2950,6 +2951,7 @@ STR_VEHICLE_LIST_SEND_AIRCRAFT_TO_HANGAR :فرستادن + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :قطار جدید STR_BUY_VEHICLE_TRAIN_MONORAIL_CAPTION :قطار جدید مونوریل @@ -3053,8 +3055,6 @@ STR_ENGINE_PREVIEW_SHIP :کشتی STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :لوکوموتیو مونوریل STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :لوکوموتیو ریل مغناطیسی -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}قیمت: {CURRENCY_LONG} بیشینه سرعت: {VELOCITY} برد: {COMMA} قطعه{}ظرفیت: {CARGO_LONG}, {CARGO_LONG}{}هزینه نگهداری: {CURRENCY_LONG}/درسال -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}قیمت: {CURRENCY_LONG} بیشینه سرعت: {VELOCITY} برد: {COMMA} قطعه{}ظرفیت: {CARGO_LONG}{}هزینه نگهداری: {CURRENCY_LONG}/درسال # Autoreplace window STR_REPLACE_VEHICLE_TRAIN :قطار @@ -3071,6 +3071,7 @@ STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES_TOOLTIP :{BLACK} ستو STR_REPLACE_HELP_STOP_BUTTON :{BLACK}برای توقف جایگزین کردن برای نوع انتخاب شده در سمت چپ کلیک کنید +STR_REPLACE_ELRAIL_VEHICLES :وسایل نقلیه ریلی برقی # Vehicle view @@ -3126,7 +3127,6 @@ STR_VEHICLE_DETAILS_AIRCRAFT_RENAME :{BLACK}نامگ STR_VEHICLE_INFO_AGE :{COMMA}سال ({COMMA}) STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} سال ({COMMA}) -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}بیشینه سرعت: {LTBLUE}{VELOCITY} {BLACK}برد: {LTBLUE}{COMMA} قطعه STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}ظرفیت: {LTBLUE}{CARGO_LONG}, {CARGO_LONG}{STRING} @@ -3412,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 3864e74d2b..b5fd180e01 100644 --- a/src/lang/unfinished/urdu.txt +++ b/src/lang/unfinished/urdu.txt @@ -649,10 +649,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}'اپن STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}پروگرام ہلانے کی تدویم کیجئیے STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}گانا چننے کا اختیار دینے والی ونڈو دکھائیں -STR_ERROR_NO_SONGS :{WHITE}کوئی گانا دستیاب نہیں ہے - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}موسیقی کے پروگرام کا انتخاب کریں STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}گانوں کی فہرست STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}پروگرام - '{STRING}' @@ -1049,6 +1046,7 @@ STR_CITY_APPROVAL_HOSTILE :مخالفان # Settings tree window STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(کوئی وضاحت موجود نہیں) +STR_CONFIG_SETTING_TYPE :{LTBLUE}ترتیب قسم: {ORANGE}{STRING} @@ -1200,6 +1198,7 @@ STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION :مخصوص پٹ STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :تعمیراتی ٹول کو استعمال کے بعد فعال رکھیں: {STRING} STR_CONFIG_SETTING_EXPENSES_LAYOUT :کمپنی کی مالیاتی ونڈو میں اخراجات کو اکٹھا دکھائیں: {STRING} +STR_CONFIG_SETTING_SOUND_AMBIENT_HELPTEXT :وسیع آواز چلایں STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING :موزوں گاڑیاں نہ ہونے کی صورت میں عمارت کو غیر فعال کر دیں: {STRING} STR_CONFIG_SETTING_MAX_TRAINS :کمپنی کی زیادہ سے زیادہ ریل گاڑیاں: {STRING} @@ -2125,6 +2124,14 @@ STR_FOUND_TOWN_SELECT_LAYOUT_RANDOM :{G=f}{BLACK}ک # About OpenTTD window 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 @@ -2183,6 +2190,7 @@ STR_SPRITE_ALIGNER_GOTO_CAPTION :{WHITE} جای # NewGRF (self) generated warnings/errors STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING} +STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :غیر متوقع سپرائٹ (sprite {3:NUM}) # NewGRF related 'general' warnings @@ -2264,6 +2272,7 @@ STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}منظو ############ range for rating starts +STR_CARGO_RATING_APPALLING :انتہائی خراب ############ range for rating ends @@ -2276,6 +2285,7 @@ STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOIN # Finances window STR_FINANCES_YEAR :{WHITE}{NUM} +STR_FINANCES_SECTION_PROPERTY_MAINTENANCE :{GOLD}پراپرٹی کی بحالی STR_FINANCES_NEGATIVE_INCOME :{BLACK}-{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :{BLACK}+{CURRENCY_LONG} @@ -2310,10 +2320,12 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL :{WHITE}{CURRENC # Industry directory # Industry view +STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}گزشتہ ماہ کی پیداوار: ############ range for requires starts ############ range for requires ends + ############ range for produces starts ############ range for produces ends @@ -2336,12 +2348,15 @@ STR_VEHICLE_LIST_MANAGE_LIST :{BLACK}فہرس # Group window +STR_GROUPS_CLICK_ON_GROUP_FOR_TOOLTIP :{BLACK}گروپ ۔ اس گروپ ک تمام گاڑیاں دیکھنے کے لیے اسے دبایں۔ پکڑ کے اوپر نیچے بھی کر سکتے ہیں۔ + # Build vehicle window +STR_BUY_VEHICLE_AIRCRAFT_CAPTION :نیا طیارہ STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}پہنچ: {GOLD}{COMMA} ٹائلیں @@ -2395,8 +2410,6 @@ STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG} # Engine preview window -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}قیمت: {CURRENCY_LONG} حد رفتار: {VELOCITY} پہنچ: {COMMA} ٹائلیں{} گنجائش: {CARGO_LONG}, {CARGO_LONG}{}چلانے کا خرچہ: {CURRENCY_LONG} سالانہ -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}قیمت: {CURRENCY_LONG} حد رفتار: {VELOCITY} پہنچ: {COMMA} ٹائلیں{} گنجائش: {CARGO_LONG}{}چلانے کا خرچہ: {CURRENCY_LONG} سالانہ # Autoreplace window @@ -2437,7 +2450,6 @@ STR_VEHICLE_COMMAND_STARTED :{GREEN} شرو # The next two need to stay in this order -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}حد رفتار: {LTBLUE}{VELOCITY} {BLACK} پہنچ: {LTBLUE}{COMMA} ٹائلیں @@ -2449,6 +2461,7 @@ STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}حد ر +STR_VEHICLE_DETAIL_TAB_CARGO :{BLACK}سامان # Vehicle refit @@ -2528,6 +2541,7 @@ STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK} وقف # AI configuration window +STR_AI_CONFIG_GAMESCRIPT :{SILVER}کھیل کا سکرپٹ STR_AI_CONFIG_CHANGE_NONE : @@ -2548,6 +2562,7 @@ STR_TEXTFILE_VIEW_LICENCE :{BLACK}لائس # Vehicle loading indicators +STR_PERCENT_NONE :{WHITE}{NUM}% # Income 'floats' @@ -2591,6 +2606,7 @@ STR_ERROR_LOCAL_AUTHORITY_REFUSES_AIRPORT :{WHITE}{TOWN} # Town related errors +STR_ERROR_CAN_T_RENAME_TOWN :{WHITE} شہر کا نام تبدیل نہی کیا جاسکتا # Industry related errors STR_ERROR_CAN_ONLY_BE_BUILT_IN_TOWNS_WITH_POPULATION_OF_1200 :{G=m}{WHITE}... صرف ان شہروں میں بن سکتا ہے جن کی آبادی ۱۲۰۰ سے زیادہ ہے @@ -2598,6 +2614,7 @@ STR_ERROR_CAN_ONLY_BE_BUILT_IN_TOWNS_WITH_POPULATION_OF_1200 :{G=m}{WHITE}... # Station construction related errors +STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :ایک اور گودی کے قریب # Station destruction related errors @@ -2627,6 +2644,8 @@ STR_ERROR_CAN_T_RENAME_DEPOT :{WHITE} ڈیپ STR_ERROR_TREE_WRONG_TERRAIN_FOR_TREE_TYPE :{WHITE} ۔۔۔ طرزِ پیڑ کے لیئے غلط طرزِ زپین # Bridge related errors +STR_ERROR_CAN_T_START_AND_END_ON :{WHITE}اسی جگہ شروع اور ختم نہیں کر سکتے +STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}شروع اور ختم سیدھ میں ہو STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... پل کے دونوں کنارے زمین پر ہونے چاہییں STR_ERROR_BRIDGE_TOO_LONG :{WHITE} ۔۔۔ پل زیادھ لمبی ھے @@ -2713,9 +2732,11 @@ STR_DESKTOP_SHORTCUT_COMMENT :Transport Tycoo ##id 0x2000 # Town building names +STR_TOWN_BUILDING_NAME_CHURCH_1 :چرچ ##id 0x4800 # industry names +STR_INDUSTRY_NAME_POWER_STATION :بجلی گھر ############ WARNING, using range 0x6000 for strings that are stored in the savegame ############ These strings may never get a new id, or savegames will break! @@ -2734,7 +2755,9 @@ STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_PLODDYPHUT_CHOO_CHOO :Ploddyphut Choo STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_POWERNAUT_CHOO_CHOO :Powernaut Choo-Choo STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_MIGHTYMOVER_CHOO_CHOO :MightyMover Choo-Choo STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_WIZZOWOW_Z99 :Wizzowow Z99 +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COAL_CAR :کوئلے کا ٹرک STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_WIZZOWOW_ROCKETEER :Wizzowow Rocketeer +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_FRUIT_TRUCK :پھلوں کا ٹرک STR_VEHICLE_NAME_ROAD_VEHICLE_BALOGH_COAL_TRUCK :Balogh کوئلے کا ٹرک STR_VEHICLE_NAME_ROAD_VEHICLE_UHL_COAL_TRUCK :Uhl کوئلے کا ٹرک STR_VEHICLE_NAME_ROAD_VEHICLE_DW_COAL_TRUCK :DW کوئلے کا ٹرک diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index 2b4fcff17c..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 @@ -669,15 +671,15 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Chọn k STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Bật/tắt chơi nhạc ngẫu nhiên STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Hiện cửa số chọn bài nhạc -STR_ERROR_NO_SONGS :{WHITE}Đã chọn gói nhạc chuẩn nhưng không có bài nào. Không có bài nào để chơi - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Chọn Kiểu Chơi Nhạc +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") @@ -813,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}! @@ -880,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 @@ -925,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ộ @@ -1337,8 +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_REVERSE_SCROLLING :Đảo ngược hướng cuộn: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Phản ứng khi cuộn bản đồ bằng nút chuột phải. Nếu tắt, thì chuột di chuyển theo vùng nhìn. Nếu bật thì chuột di chuyển theo bản đồ +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} @@ -1370,8 +1378,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+Click STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Click STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Tắt -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Cuộn chuột trái: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Cho phép cuộn bản đồ bằng cách kéo với nút trái chuột. Tùy chọn này sẽ hữu ích khi dùng màn hình cảm ứng +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Đóng cửa số khi click chuột phải: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Đóng cửa sổ bằng cách bấm chuột phải vào đó. Ngăn tooltip bằng cách bấm phải! STR_CONFIG_SETTING_AUTOSAVE :Tự động save: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Chọn chu kỳ giữa mỗi lần tự động save @@ -1761,6 +1769,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Kiểm t STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Hiển thị thiết lập AI và Game script STR_INTRO_TOOLTIP_QUIT :{BLACK}Thoát 'OpenTTD' +STR_INTRO_BASESET :{BLACK}Gói đồ họa cơ sở đang chọn bị thiếu {NUM} sprite. Hãy cập nhật gói cơ sở này. STR_INTRO_TRANSLATION :{BLACK}Bản dịch này thiếu {NUM} chuỗi. Hãy giúp OpenTTD hoàn thiện hơn bằng cách đăng ký làm biên dịch viên. Xem readme.txt để biết thêm chi tiết. # Quit window @@ -2282,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 @@ -2589,6 +2599,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Tên sâ STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Hàng hoá chấp nhận: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Kiểu đường ray: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Giới hạn tốc độ đường ray: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Hạn chế tốc độ đường bộ: {LTBLUE}{VELOCITY} @@ -2601,29 +2612,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Cánh đồng STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Đất tuyết phủ STR_LAI_CLEAR_DESCRIPTION_DESERT :Hoang mạc -STR_LAI_RAIL_DESCRIPTION_TRACK :Đường ray {STRING} -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Đường ray {STRING} với đèn hiệu khóa -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Đường ray {STRING} với đèn tín hiệu báo trước -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Đường ray {STRING} với đèn tín hiệu cửa thoát -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Đường ray {STRING} với đèn tín hiệu kết hợp -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Đường ray {STRING} với đèn dẫn đường -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Đường ray {STRING} với đèn dẫn đường 1-chiều -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Đường ray {STRING} với đèn hiệu khóa và đèn tín hiệu báo trước -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Đường ray {STRING} với đèn hiệu khóa và đèn tín hiệu cửa thoát -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Đường ray {STRING} với đèn hiệu khóa và đèn tín hiệu kết hợp -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Đường ray {STRING} với đèn hiệu khóa và đèn dẫn đường -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Đường ray {STRING} với đèn hiệu khóa và đèn dẫn đường 1-chiều -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Đường ray {STRING} với đèn tín hiệu báo trước và đèn tín hiệu cửa thoát -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Đường ray {STRING} với đèn tín hiệu báo trước và đèn tín hiệu kết hợp -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Đường ray {STRING} với đèn tín hiệu báo trước và đèn dẫn đường -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Đường ray {STRING} với đèn tín hiệu báo trước và đèn dẫn đường 1-chiều -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Đường ray {STRING} với đèn tín hiệu cửa thoát và đèn tín hiệu kết hợp -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Đường ray {STRING} với đèn tín hiệu cửa thoát và đèn dẫn đường -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Đường ray {STRING} với đèn tín hiệu cửa thoát và đèn dẫn đường 1-chiều -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Đường ray {STRING} với đèn tín hiệu kết hợp và đèn dẫn đường -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Đường ray {STRING} với đèn tín hiệu kết hợp và đèn dẫn đường 1-chiều -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Đường ray {STRING} với đèn dẫn đường và đèn dẫn đường 1-chiều -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Xưởng tàu hỏa {STRING} +STR_LAI_RAIL_DESCRIPTION_TRACK :Đường ray +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Đường ray với đèn hiệu khóa +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Đường ray với đèn tín hiệu báo trước +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Đường ray với đèn tín hiệu cửa thoát +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Đường ray với đèn tín hiệu kết hợp +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Đường ray với đèn dẫn đường +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Đường ray với đèn dẫn đường 1-chiều +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Đường ray với đèn hiệu khóa và đèn tín hiệu báo trước +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Đường ray với đèn hiệu khóa và đèn tín hiệu cửa thoát +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Đường ray với đèn hiệu khóa và đèn tín hiệu kết hợp +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Đường ray với đèn hiệu khóa và đèn dẫn đường +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Đường ray với đèn hiệu khóa và đèn dẫn đường 1-chiều +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Đường ray với đèn tín hiệu báo trước và đèn tín hiệu cửa thoát +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Đường ray với đèn tín hiệu báo trước và đèn tín hiệu kết hợp +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Đường ray với đèn tín hiệu báo trước và đèn dẫn đường +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Đường ray với đèn tín hiệu báo trước và đèn dẫn đường 1-chiều +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Đường ray với đèn tín hiệu cửa thoát và đèn tín hiệu kết hợp +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Đường ray với đèn tín hiệu cửa thoát và đèn dẫn đường +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Đường ray với đèn tín hiệu cửa thoát và đèn dẫn đường 1-chiều +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Đường ray với đèn tín hiệu kết hợp và đèn dẫn đường +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Đường ray với đèn tín hiệu kết hợp và đèn dẫn đường 1-chiều +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Đường ray với đèn dẫn đường và đèn dẫn đường 1-chiều +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Xưởng tàu hỏa STR_LAI_ROAD_DESCRIPTION_ROAD :Đường bộ STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Đường phố có đèn @@ -2687,7 +2698,57 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Đất công ty STR_ABOUT_OPENTTD :{WHITE}Về OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Nguyên tác bản quyền {COPYRIGHT} 1995 Chris Sawyer, All rights reserved STR_ABOUT_VERSION :{BLACK}OpenTTD phiên bản {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2015 Nhóm OpenTTD +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 @@ -2906,8 +2967,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Sử dụng IT STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} bị hỏng sprite. Tất cả các sprite sẽ hiện thị với dấu hỏi (?) màu đỏ. STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Có nhiều mục thực thi 8 (sprite {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Đọc quá giới hạn của sprite giả (sprite {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Gói đồ họa bạn đang dùng thiếu một số mẫu đồ họa.{}Hãy cập nhật gói đồ họa lên phiên bản mới. -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Bộ file đồ họa hiện tại thiết một số sprites.{}Hãy cập nhật phiên bản mới.{}Bởi vì bạn chơi {YELLOW}một phiên bản thử nghiệm đang phát triển OpenTTD{WHITE}, bạn cần phải có cả {YELLOW}bộ file đồ họa đang được phát triển nữa{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Dữ liệu GRF theo yêu cầu không hợp lệ (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} bị tắt bởi {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Định dạng Sprite không hợp lệ hoặc chưa định nghĩa (sprite {3:NUM}) @@ -2975,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} @@ -2982,8 +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_PASSENGERS_LAST_MONTH_MAX :{BLACK}Du khách tháng trước: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Bưu kiện tháng trước: {ORANGE}{COMMA}{BLACK} max: {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 @@ -3114,8 +3173,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Chấp n STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Liệt kê hàng hoá được chấp nhận STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Chấp nhận: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Trạm này độc quyền vận tải tại thị trấn này. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} đã mua quyền vận tải độc quyền ở đô thị này. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Trạm này độc quyền vận tải tại thị trấn này. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} đã mua quyền vận tải độc quyền ở đô thị này. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Uy tín STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Hiện uy tín ga, bến, cảng @@ -3294,9 +3353,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Yêu c STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Yêu cầu: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Cần cung cấp: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} đang chờ{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Toa xe đợi để xử lý: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Sản xuất: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Sản xuất: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3363,6 +3424,11 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Xoá tất cả STR_GROUP_RENAME_CAPTION :{BLACK}Đổi tên nhóm +STR_GROUP_PROFIT_THIS_YEAR :Lợi nhuận năm nay: +STR_GROUP_PROFIT_LAST_YEAR :Lợi nhuận năm trước: +STR_GROUP_OCCUPANCY :Hiện đang dùng: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Tàu Hỏa Mới STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Tàu Điện Mới @@ -3394,6 +3460,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Tất cả ki STR_PURCHASE_INFO_ALL_BUT :Tất cả trừ {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Lực kéo tối đa: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Tầm xa: {GOLD}{COMMA} ô +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Kiểu máy bay: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Danh sách tàu hỏa có thể chọn. Click vào tàu hỏa để xem thông tin. Ctrl+Click để ẩn/hiện loại được chọn STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Danh sách xe có thể chọn. Click vào xe để xem thông tin. Ctrl+Click để ẩn/hiện loại được chọn @@ -3527,10 +3594,11 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :đầu máy đ STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Giá thành: {CURRENCY_LONG} Tải trọng: {WEIGHT_SHORT}{}Tốc độ: {VELOCITY} Công suất: {POWER}{}Chi phí hoạt động: {CURRENCY_LONG}/năm{}Sức chứa: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Giá: {CURRENCY_LONG} Nặng: {WEIGHT_SHORT}{}Tốc độ: {VELOCITY} Công suất: {POWER} Max. T.E.: {6:FORCE}{}Giá vận hành: {4:CURRENCY_LONG}/yr{}Năng suất: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Giá thành: {CURRENCY_LONG} Tốc độ tối đa: {VELOCITY}{}Sức chứa: {CARGO_LONG}, {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Giá thành: {CURRENCY_LONG} Tốc độ tối đa: {VELOCITY}{}Sức chứa: {CARGO_LONG}{}Chi phí hoạt động: {CURRENCY_LONG}/năm -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Gía: {CURRENCY_LONG} Tốc độ max: {VELOCITY} Tầm xa: {COMMA} ô{}Trọng tải: {CARGO_LONG}, {CARGO_LONG}{}Chi phí hoạt động: {CURRENCY_LONG}/năm -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Giá: {CURRENCY_LONG} Tốc độ max: {VELOCITY} Tầm xa: {COMMA} ô{}Trọng tải: {CARGO_LONG}{}Chi phí hoạt động: {CURRENCY_LONG}/năm +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Giá thành: {CURRENCY_LONG} Tốc độ tối đa: {VELOCITY}{}Sức chứa: {CARGO_LONG}{}Chi phí hoạt động: {CURRENCY_LONG}/năm +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Giá: {CURRENCY_LONG} Tốc độ tối đa: {VELOCITY}{}Kiểu máy bay: {STRING}{}Sức chứa: {CARGO_LONG}, {CARGO_LONG}{}Chi phí hoạt động: {CURRENCY_LONG}/năm +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}GIá: {CURRENCY_LONG} Tốc độ tối đa: {VELOCITY}{}Kiểu máy bay: {STRING}{}Sức chứa: {CARGO_LONG}{}Chi phí hoạt động: {CURRENCY_LONG}/năm +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Giá: {CURRENCY_LONG} Tốc độ tối đa: {VELOCITY}{}Kiểu máy bay: {STRING} Tầm xa: {COMMA} ô{}Sức chứa: {CARGO_LONG}, {CARGO_LONG}{}Chi phí hoạt động: {CURRENCY_LONG}/năm +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Giá: {CURRENCY_LONG} Tốc độ tối đa: {VELOCITY}{}Kiểu máy bay: {STRING} Tầm xa: {COMMA} ô{}Sức chứa: {CARGO_LONG}{}Chi phí hoạt động: {CURRENCY_LONG}/năm # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Thay thế {STRING} - {STRING} @@ -3557,10 +3625,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} khi đ STR_REPLACE_VEHICLES_STOP :{BLACK}Ngừng thay thế phương tiện STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Bấm để ngừng việc thay thế kiểu đầu máy đã chọn -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Thay thế: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Chuyển qua lại cửa sổ thay thế đầu máy và toa xe STR_REPLACE_ENGINES :Đầu máy STR_REPLACE_WAGONS :Toa xe +STR_REPLACE_ALL_RAILTYPE :Tất cả toa xe đầu máy STR_REPLACE_HELP_RAILTYPE :{BLACK}Chọn kiểu đường ray bạn muốn thay thế STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Hiện thị đầu máy nào đang được thay thế, nếu có @@ -3653,7 +3721,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} năm ({ STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} năm ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Tốc độ tối đa: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Tốc độ max: {LTBLUE}{VELOCITY} {BLACK} Tầm xa: {LTBLUE}{COMMA} ô +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Tốc độ tối đa: {LTBLUE}{VELOCITY} {BLACK}Kiểu máy bay: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Tốc độ tối đa: {LTBLUE}{VELOCITY} {BLACK}Kiểu máy bay: {LTBLUE}{STRING} {BLACK}Tầm bay: {LTBLUE}{COMMA} ô STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Tải trọng: {LTBLUE}{WEIGHT_SHORT} {BLACK}Công suất: {LTBLUE}{POWER}{BLACK} Tốc độ tối đa: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Tải trọng: {LTBLUE}{WEIGHT_SHORT} {BLACK}Công suất: {LTBLUE}{POWER}{BLACK} Tốc độ tối đa: {LTBLUE}{VELOCITY} {BLACK}Max. T.E.: {LTBLUE}{FORCE} @@ -4212,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... @@ -4220,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... @@ -4471,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 2c181234ea..9561354fb0 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -669,10 +669,7 @@ STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Dewis y STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Toglu cymysgu trefn rhaglen ymlaen neu i ffwrdd STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Dangos y ffenestr dewis traciau cerddoriaeth -STR_ERROR_NO_SONGS :{WHITE}Dewiswyd set caneuon heb ganeuon ynddo. Ni chwaraeir unrhyw ganeuon - # Playlist window -STR_PLAYLIST_MUSIC_PROGRAM_SELECTION :{WHITE}Dewisiadau Rhaglen Gerddoriaeth STR_PLAYLIST_TRACK_NAME :{TINY_FONT}{LTBLUE}{ZEROFILL_NUM} "{STRING}" STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLACK}Indecs Traciau STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Rhaglen - '{STRING}' @@ -1337,8 +1334,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Lliw y tirwedd STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Gwyrdd STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Gwyrdd tywyll STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Fioled -STR_CONFIG_SETTING_REVERSE_SCROLLING :Gwrthdroi'r cyfeiriad sgrolio: {STRING} -STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT :Ymddygiad pan yn sgrolio gyda botwm dde y llygoden. Pan yr analluogir, bydd y llygoden yn symyd y camera. Pan y galluogir, bydd y llygoden yn symyd y map STR_CONFIG_SETTING_SMOOTH_SCROLLING :Sgrolio prif ffenestr llyfn: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Rheoli syt y mae'r prif olygfa'n sgrolio at leoliad penodol pan yn clicio ar y map bychan neu yn rhoi gorchymyn i sgrolio at wrthrych penodol STR_CONFIG_SETTING_MEASURE_TOOLTIP :Dangos cymorth mesur wrth ddefnyddio'r offer adeiladu amrywiol: {STRING} @@ -1370,8 +1365,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command-clic STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Clic STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :I ffwrdd -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Sgrolio Clic-chwith: {STRING} -STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Galluogi sgrolio ar y map drwy ei lusgo gyda botwm chwith y llygoden. Mae hyn yn arbennig o ddefnyddiol pan yn defnyddio sgrin-gyffwrdd ar gyfer sgrolio +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Cau ffenest wrth dde-glicio: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Cau ffenest wrth dde-glicio tu fewn iddo. Mae hyn yn analluogi dangos gwybodaeth ar dde-clicio! STR_CONFIG_SETTING_AUTOSAVE :Awtogadw: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Dewis pa mor aml y dylid awtogadw gemau @@ -1761,6 +1756,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Gwirio a STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Dangos gosodiadau AI a sgript Gêm STR_INTRO_TOOLTIP_QUIT :{BLACK}Gadael 'OpenTTD' +STR_INTRO_BASESET :{BLACK}Mae {NUM} corlun ar goll o'r set raffeg sylfaenol a ddewiswyd. Gwiriwch am ddiweddariadau i'r set raffeg. STR_INTRO_TRANSLATION :{BLACK}Mae'r cyfieithiad yma'n brin o {NUM} llinyn. Helpwch wella OpenTTD drwy ymaelodi fel cyfieithydd. Gweler readme.txt am fanylion. # Quit window @@ -2312,7 +2308,7 @@ STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Adeiladu Maglef STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Adeiladu trac rheilffordd. Mae Ctrl yn toglo adeiladu/codi'r rheilffordd, tra fo Shift yn toglo adeiladu/dangos amcangyfrif o'r gost STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Adeiladu trac yn defnyddio'r modd Awtoreilffordd. Mae Ctrl yn toglo adeiladu/codi'r rheilffordd, tra fo Shift yn toglo adeiladu/dangos amcangyfrif o'r gost -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Adeiladu trên depo (ar gyfer adeiladu a rhoi gwasanaeth i drenau). Mae Shift yn toglo adeiladu/dangos amcangyfrif o'r gost +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Adeiladu depo trenau (ar gyfer adeiladu a rhoi gwasanaeth i drenau). Mae Shift yn toglo adeiladu/dangos amcangyfrif o'r gost STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Newid rheilffordd yn bwynt llwybro. Mae Ctrl yn galluogi uno pwyntiau llwybro, tra fod Shift yn toglo adeiladu/dangos amcangyfrif o'r gost STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Adeiladu gorsaf reilffordd. Mae Ctrl yn galluogi uno gorsafoedd, tra fo Shift yn toglo adeiladu/dangos amcangyfrif o'r gost STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Adeiladu signalau rheilffordd. Mae Ctrl yn toglo signalau semafor/golau lliw{}Mae llusgo'n adeiladu signalau ar hyd trac syth. Mae Ctrl yn adeiladu signalau hyd y gyffordd nesaf{}Mae Ctrl+Clic yn toglo agor y ffenestr dewis signalau. Mae Shift yn toglo adeiladu/amcangyfrif y gost @@ -2323,7 +2319,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Trosi/Di STR_RAIL_NAME_RAILROAD :Rheilffordd STR_RAIL_NAME_ELRAIL :rheilffordd drydan -STR_RAIL_NAME_MONORAIL :monoreilffordd +STR_RAIL_NAME_MONORAIL :Monoreilffordd STR_RAIL_NAME_MAGLEV :maglef # Rail depot construction window @@ -2589,6 +2585,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Enw teil STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Llwythi a dderbynir: {LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Math rheilffordd: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Terfyn cyflymder rheilffordd: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Terfyn cyflymder ffordd: {LTBLUE}{VELOCITY} @@ -2601,29 +2598,29 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Caeau STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Tir ag eira STR_LAI_CLEAR_DESCRIPTION_DESERT :Anialdir -STR_LAI_RAIL_DESCRIPTION_TRACK :Cledrau {STRING} -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Cledrau {STRING} gyda signalau bloc -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Cledrau {STRING} gyda rhagsignalau -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Cledrau {STRING} gyda signalau gadael -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Cledrau {STRING} gyda signalau cyfun -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Cledrau {STRING} gyda signalau llwybro -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Cledrau {STRING} gyda signalau llwybro unffordd -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Cledrau {STRING} gyda signalau bloc a rhagsignalau -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Cledrau {STRING} gyda signalau bloc a signalau gadael -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Cledrau {STRING} gyda signalau bloc a signalau cyfun -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Cledrau {STRING} gyda signalau bloc a signalau llwybro -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Cledrau {STRING} gyda signalau bloc a signalau llwybro unffordd -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Cledrau {STRING} gyda rhagsignalau a signalau gadael -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Cledrau {STRING} gyda rhagsignalau a signalau cyfun -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Cledrau {STRING} gyda rhagsignalau a signalau llwybro -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Cledrau {STRING} gyda rhag-signalau a signalau llwybro unffordd -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Cledrau {STRING} gyda signalau gadael a signalau cyfun -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Cledrau {STRING} gyda signalau gadael a signalau llwybro -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Cledrau {STRING} gyda signalau gadael a signalau llwybro unffordd -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Cledrau {STRING} gyda signalau cyfun a llwybro -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Cledrau {STRING} gyda signalau cyfun a signalau llwybr unffordd -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Cledrau {STRING} gyda signalau llwybro a signalau llwybro unffordd -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Depo trên {STRING} +STR_LAI_RAIL_DESCRIPTION_TRACK :Cledrau rheilffordd +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Cledrau rheilffordd gyda signalau bloc +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Cledrau rheilffordd gyda rhagsignalau +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Cledrau rheilffordd gyda signalau gadael +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Cledrau rheilffordd gyda signalau cyfun +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Cledrau rheilffordd gyda signalau llwybro +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Cledrau rheilffordd gyda signalau llwybro unffordd +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Cledrau rheilffordd gyda signalau bloc a rhagsignalau +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Cledrau rheilffordd gyda signalau bloc a signalau gadael +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Cledrau rheilffordd gyda signalau bloc a signalau cyfun +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Cledrau rheilffordd gyda signalau bloc a signalau llwybro +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Cledrau rheilffordd gyda signalau bloc a signalau llwybro unffordd +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Cledrau rheilffordd gyda rhagsignalau a signalau gadael +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Cledrau rheilffordd gyda rhagsignalau a signalau cyfun +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Cledrau rheilffordd gyda rhagsignalau a signalau llwybro +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Cledrau rheilffordd gyda rhag-signalau a signalau llwybro unffordd +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Cledrau rheilffordd gyda signalau gadael a signalau cyfun +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Cledrau rheilffordd gyda signalau gadael a signalau llwybro +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Cledrau rheilffordd gyda signalau gadael a signalau llwybro unffordd +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Cledrau rheilffordd gyda signalau cyfun a llwybro +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Cledrau rheilffordd gyda signalau cyfun a signalau llwybr unffordd +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Cledrau rheilffordd gyda signalau llwybro a signalau llwybro unffordd +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Depo trenau rheilffordd STR_LAI_ROAD_DESCRIPTION_ROAD :Ffordd STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Ffordd gyda goleuadau stryd @@ -2687,7 +2684,14 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Tir cwmni STR_ABOUT_OPENTTD :{WHITE}Gwybodaeth am OpenTTD STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Hawlfraint Wreiddiol {COPYRIGHT} 1995 Chris Sawyer, Holl cedwir pob hawl STR_ABOUT_VERSION :{BLACK}fersiwn OpenTTD {REV} -STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2015 Y tîm OpenTTD +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 @@ -2906,8 +2910,6 @@ STR_NEWGRF_ERROR_INVALID_ID :Ceisio defnyddi STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}Mae'r {STRING} yn cynnwys corlun llygredig. Bydd corluniau llygredig yn cael eu dynodi gan farc cwestiwn coch (?) STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Yn cynnwys sawl cofnod Gweithred 8 (corlun {3:NUM}) STR_NEWGRF_ERROR_READ_BOUNDS :Darllen heibio i ddiwedd llid-gorlun (corlun {3:NUM}) -STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Mae'r set raffeg sylfaenol a ddefnyddir ar hyn o bryd yn brin o sawl corlun{}Diweddarwch y set raffeg sylfaenol i ddatrys hyn -STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE :{WHITE}Mae nifer o gorluniau ar goll o'r set graffeg sylfaenol mewn defnydd.{}Diweddarwch y set graffeg sylfaenol.{}Gane eich bod yn chwarae {YELLOW}ciplun datblygiadol o OpenTTD{WHITE}, efallai y byddwch angen {YELLOW}ciplun ddatblygiadol o'r grafffeg sylfaenol{WHITE} STR_NEWGRF_ERROR_GRM_FAILED :Nid yw'r adnoddau GRF a geisiwyd ar gael (corlun {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :Fe analluogwyd {1:STRING} gan {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Fformat cynllun corlun annilys/anhysbys (corlun {3:NUM}) @@ -2982,8 +2984,6 @@ STR_TOWN_POPULATION :{BLACK}Poblogae STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Dinas) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Poblogaeth: {ORANGE}{COMMA}{BLACK} Tai: {ORANGE}{COMMA} -STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX :{BLACK}Teithwyr mis diwethaf: {ORANGE}{COMMA}{BLACK} uchafswm: {ORANGE}{COMMA} -STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX :{BLACK}Post mis diwethaf: {ORANGE}{COMMA}{BLACK} uchafswm: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Nwyddau angenrheidiol ar gyfer tyfiant y dref: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{RED}Angen {ORANGE}{STRING} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} ei angen yn y gaeaf @@ -3101,7 +3101,7 @@ STR_STATION_LIST_STATION :{YELLOW}{STATIO STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOINT} STR_STATION_LIST_NONE :{YELLOW}- Dim - STR_STATION_LIST_SELECT_ALL_FACILITIES :{BLACK}Dewis pob cyfleuster -STR_STATION_LIST_SELECT_ALL_TYPES :{BLACK}Dewis pob math llwyth (gan gynnwys llwythi dim aros) +STR_STATION_LIST_SELECT_ALL_TYPES :{BLACK}Dewis pob math llwyth (gan gynnwys llwythi lle nad oes dim yn disgwyl) STR_STATION_LIST_NO_WAITING_CARGO :{BLACK}Nid oes llwyth o unrhyw fath yn disgwyl # Station view window @@ -3114,8 +3114,8 @@ STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Derbyn STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Dangos rhestr o'r llwythi sy'n cael eu derbyn STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Derbyn: {WHITE}{CARGO_LIST} -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Mae gan yr orsaf hon hawliau cludo cyfyngol yn y dref hon. -STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :Mae {YELLOW}{COMPANY}{BLACK} wedi prynnu hawliau cludo cyfyngol yn y dref hon. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Mae gan yr orsaf hon hawliau cludo cyfyngol yn y dref hon. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :Mae {YELLOW}{COMPANY}{BLACK} wedi prynnu hawliau cludo cyfyngol yn y dref hon. STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Perfformiad STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Dangos graddfeydd gorsaf @@ -3294,9 +3294,11 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Angen: { STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Angen: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING} ############ range for requires ends +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Angen: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} yn disgwyl{STRING} + ############ range for produces starts -STR_INDUSTRY_VIEW_WAITING_FOR_PROCESSING :{BLACK}Llwythi yn aros i gael ei brosesu: -STR_INDUSTRY_VIEW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO_LONG}{STRING}{BLACK} STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Cynhyrchu: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_PRODUCES_CARGO_CARGO :{BLACK}Cynhyrchu: {YELLOW}{STRING}{STRING}, {STRING}{STRING} ############ range for produces ends @@ -3363,13 +3365,18 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Dileu pob cerby STR_GROUP_RENAME_CAPTION :{BLACK}Ailenwi grŵp +STR_GROUP_PROFIT_THIS_YEAR :Elw eleni: +STR_GROUP_PROFIT_LAST_YEAR :Elw llynedd: +STR_GROUP_OCCUPANCY :Defnydd presennol: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% + # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Cerbydau Rheilffordd Newydd STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Cerbydau Rheilffordd Trydan Newydd STR_BUY_VEHICLE_TRAIN_MONORAIL_CAPTION :Cerbydau Monoreilffordd Newydd STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :Cerbydau Maglef Newydd -STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Cerbydau Rheilffordd +STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Cerbydau Rheilffordd Newydd STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Cerbydau Ffordd Newydd STR_BUY_VEHICLE_SHIP_CAPTION :Llongau Newydd STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Awyrennau Newydd @@ -3394,6 +3401,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Pob math o lwyt STR_PURCHASE_INFO_ALL_BUT :Popeth ond{CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Grym Tynnu Uchaf: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Pellter cyrhaeddiad: {GOLD}{COMMA} teil +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Math awyren: {GOLD}{STRING} STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Rhestr dewis trenau. Cliciwch ar gerbyd am wybodaeth. Mae Ctrl+Clicio'n toglu cuddio'r math cerbyd STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Rhestr dewis cerbydau ffordd. Cliciwch ar gerbyd am wybodaeth. Mae Ctrl+Clicio'n toglu cuddio'r math cerbyd @@ -3527,10 +3535,11 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :trên maglef STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Côst: {CURRENCY_LONG} Pwysau: {WEIGHT_SHORT}{}Cyflymder: {VELOCITY} Pŵer: {POWER}{}Côst Rhedeg: {CURRENCY_LONG}/bl{}Gallu cludo: {CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cost: {CURRENCY_LONG} Pwysau: {WEIGHT_SHORT}{}Cyflymder: {VELOCITY} Pŵer: {POWER} Grym Uchaf: {6:FORCE}{}Cost Rhedeg: {4:CURRENCY_LONG}/bl{}Cynhwysedd: {5:CARGO_LONG} -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Cyflym. Uchaf: {VELOCITY}{}Cynhwysedd: {CARGO_LONG}, {CARGO_LONG}{}Côst Rhedeg: {CURRENCY_LONG}/bl -STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Cyflym. Uchaf: {VELOCITY}{}Cynhwysedd: {CARGO_LONG}{}Cost Rhedeg: {CURRENCY_LONG}/bl -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST:{BLACK}Cost: {CURRENCY_LONG} Cyf. Uchaf: {VELOCITY} Pellter: {COMMA} teil{}Cynhwysedd: {CARGO_LONG}, {CARGO_LONG}{}Cost Rhedeg: {CURRENCY_LONG}/bl -STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Cyf. Uchaf: {VELOCITY} Pellter: {COMMA} teil{}Cynhwysedd: {CARGO_LONG}{}Cost Rhedeg: {CURRENCY_LONG}/bl +STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Cyflym. Uchaf: {VELOCITY}{}Cynhwysedd: {CARGO_LONG}{}Cost Rhedeg: {CURRENCY_LONG}/bl +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Cyflym. Uchaf: {VELOCITY}{}Math awyren: {STRING}{}Cynhwysedd: {CARGO_LONG}, {CARGO_LONG}{}Cost rhedeg: {CURRENCY_LONG}/bl +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Cyflym. Uchaf: {VELOCITY}{}Math awyren: {STRING}{}Cynhwysedd: {CARGO_LONG}{}Cost Rhedeg: {CURRENCY_LONG}/bl +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Cyflym. Uchaf: {VELOCITY}{}Math awyren: {STRING} Pellter hedfan: {COMMA} teil{}Cynhwysedd: {CARGO_LONG}, {CARGO_LONG}{}Cost Rhedeg: {CURRENCY_LONG}/bl +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Cyflym. Uchaf: {VELOCITY}{}Math awyren: {STRING} Pellter hedfan: {COMMA} teil{}Cynhwysedd: {CARGO_LONG}{}Cost Rhedeg: {CURRENCY_LONG}/bl # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Disodli {STRING} - {STRING} @@ -3557,10 +3566,10 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} pan yn STR_REPLACE_VEHICLES_STOP :{BLACK}Gorffen Disodli Cerbydau STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Gwasgwch i atal disodli'r math injan sydd wedi'i ddewis ar y chwith -STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Disodli: {ORANGE}{STRING} STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Newid rhwng y ffenest disodli wagenni a'r un injanau STR_REPLACE_ENGINES :Injanau STR_REPLACE_WAGONS :Wagenni +STR_REPLACE_ALL_RAILTYPE :Pob cerbyd rheilffordd STR_REPLACE_HELP_RAILTYPE :{BLACK}Dewiswch y math o reilffordd yr hoffech chi ddisodli injans ar ei gyfer STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Dangoswch pa injan (os unrhyw) y mae'r injan ar y chwith yn cael ei disodli gyda @@ -3653,7 +3662,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} blwyddy STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} blwyddyn ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}cyflymder uchaf: {LTBLUE}{VELOCITY} -STR_VEHICLE_INFO_MAX_SPEED_RANGE :{BLACK}Cyf. uchaf: {LTBLUE}{VELOCITY} {BLACK}Pell. Cyrraedd: {LTBLUE}{COMMA} teil +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Cyflym. uchaf: {LTBLUE}{VELOCITY} {BLACK}Math awyren: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Cyflym. uchaf: {LTBLUE}{VELOCITY} {BLACK}Math awyren: {LTBLUE}{STRING} {BLACK}Pellter hedfan: {LTBLUE}{COMMA} teil STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Pwys: {LTBLUE}{WEIGHT_SHORT} {BLACK}Pŵer: {LTBLUE}{POWER}{BLACK} Cyflym. Max: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Pwys: {LTBLUE}{WEIGHT_SHORT} {BLACK}Pŵer: {LTBLUE}{POWER}{BLACK} Cyflym. Max: {LTBLUE}{VELOCITY} {BLACK}Max. T.E.: {LTBLUE}{FORCE} @@ -4212,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... @@ -4253,7 +4262,7 @@ STR_ERROR_BUOY_IN_THE_WAY :{WHITE}... bwï STR_ERROR_BUOY_IS_IN_USE :{WHITE}... bwï mewn defnydd gan cwmni arall! # Depot related errors -STR_ERROR_CAN_T_BUILD_TRAIN_DEPOT :{WHITE}Methu adeiladu trên depo yma... +STR_ERROR_CAN_T_BUILD_TRAIN_DEPOT :{WHITE}Methu adeiladu depo trenau yma... STR_ERROR_CAN_T_BUILD_ROAD_DEPOT :{WHITE}Methu adeiladu depo cerbydau ffordd yma... STR_ERROR_CAN_T_BUILD_TRAM_DEPOT :{WHITE}Methu adeiladu depo cerbyd tramiau yma... STR_ERROR_CAN_T_BUILD_SHIP_DEPOT :{WHITE}Methu adeiladu depo llong yma... diff --git a/src/language.h b/src/language.h index fed138e635..ec241dbd8c 100644 --- a/src/language.h +++ b/src/language.h @@ -16,18 +16,12 @@ #ifdef WITH_ICU_SORT #include #endif /* WITH_ICU_SORT */ +#include "strings_type.h" static const uint8 CASE_GENDER_LEN = 16; ///< The (maximum) length of a case/gender string. static const uint8 MAX_NUM_GENDERS = 8; ///< Maximum number of supported genders. static const uint8 MAX_NUM_CASES = 16; ///< Maximum number of supported cases. -static const uint TAB_SIZE_OFFSET = 0; ///< The offset for the tab size. -static const uint TAB_SIZE_BITS = 11; ///< The number of bits used for the tab size. -static const uint TAB_SIZE = 1 << TAB_SIZE_BITS; ///< The number of values in a tab. -static const uint TAB_COUNT_OFFSET = TAB_SIZE_BITS; ///< The offset for the tab count. -static const uint TAB_COUNT_BITS = 5; ///< The number of bits used for the amount of tabs. -static const uint TAB_COUNT = 1 << TAB_COUNT_BITS; ///< The amount of tabs. - /** Header of a language file. */ struct LanguagePackHeader { static const uint32 IDENT = 0x474E414C; ///< Identifier for OpenTTD language files, big endian for "LANG" @@ -37,7 +31,7 @@ struct LanguagePackHeader { char name[32]; ///< the international name of this language char own_name[32]; ///< the localized name of this language char isocode[16]; ///< the ISO code for the language (not country code) - uint16 offsets[TAB_COUNT]; ///< the offsets + uint16 offsets[TEXT_TAB_END]; ///< the offsets /** Thousand separator used for anything not currencies */ char digit_group_separator[8]; @@ -111,7 +105,7 @@ extern LanguageList _languages; extern const LanguageMetadata *_current_language; #ifdef WITH_ICU_SORT -extern Collator *_current_collator; +extern icu::Collator *_current_collator; #endif /* WITH_ICU_SORT */ bool ReadLanguagePack(const LanguageMetadata *lang); diff --git a/src/linkgraph/demands.cpp b/src/linkgraph/demands.cpp index 767bec2c9f..f1b714820b 100644 --- a/src/linkgraph/demands.cpp +++ b/src/linkgraph/demands.cpp @@ -2,11 +2,11 @@ #include "../stdafx.h" #include "demands.h" -#include +#include #include "../safeguards.h" -typedef std::list NodeList; +typedef std::queue NodeList; /** * Scale various things according to symmetric/asymmetric distribution. @@ -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; } }; @@ -172,11 +171,11 @@ void DemandCalculator::CalcDemand(LinkGraphJob &job, Tscaler scaler) for (NodeID node = 0; node < job.Size(); node++) { scaler.AddNode(job[node]); if (job[node].Supply() > 0) { - supplies.push_back(node); + supplies.push(node); num_supplies++; } if (job[node].Demand() > 0) { - demands.push_back(node); + demands.push(node); num_demands++; } } @@ -191,17 +190,17 @@ void DemandCalculator::CalcDemand(LinkGraphJob &job, Tscaler scaler) while (!supplies.empty() && !demands.empty()) { NodeID from_id = supplies.front(); - supplies.pop_front(); + supplies.pop(); for (uint i = 0; i < num_demands; ++i) { assert(!demands.empty()); NodeID to_id = demands.front(); - demands.pop_front(); + demands.pop(); if (from_id == to_id) { /* Only one node with supply and demand left */ if (demands.empty() && supplies.empty()) return; - demands.push_back(to_id); + demands.push(to_id); continue; } @@ -236,7 +235,7 @@ void DemandCalculator::CalcDemand(LinkGraphJob &job, Tscaler scaler) scaler.SetDemands(job, from_id, to_id, demand_forw); if (scaler.HasDemandLeft(job[to_id])) { - demands.push_back(to_id); + demands.push(to_id); } else { num_demands--; } @@ -245,7 +244,7 @@ void DemandCalculator::CalcDemand(LinkGraphJob &job, Tscaler scaler) } if (job[from_id].UndeliveredSupply() != 0) { - supplies.push_back(from_id); + supplies.push(from_id); } else { num_supplies--; } 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 1fe34fe79c..30c4451ee7 100644 --- a/src/linkgraph/linkgraph_gui.cpp +++ b/src/linkgraph/linkgraph_gui.cpp @@ -298,7 +298,7 @@ Point LinkGraphOverlay::GetStationMiddle(const Station *st) const * Set a new cargo mask and rebuild the cache. * @param cargo_mask New cargo mask. */ -void LinkGraphOverlay::SetCargoMask(uint32 cargo_mask) +void LinkGraphOverlay::SetCargoMask(CargoTypes cargo_mask) { this->cargo_mask = cargo_mask; this->RebuildCache(); @@ -319,7 +319,7 @@ void LinkGraphOverlay::SetCompanyMask(uint32 company_mask) /** Make a number of rows with buttons for each company for the linkgraph legend window. */ NWidgetBase *MakeCompanyButtonRowsLinkGraphGUI(int *biggest_index) { - return MakeCompanyButtonRows(biggest_index, WID_LGL_COMPANY_FIRST, WID_LGL_COMPANY_LAST, 3, STR_LINKGRAPH_LEGEND_SELECT_COMPANIES); + return MakeCompanyButtonRows(biggest_index, WID_LGL_COMPANY_FIRST, WID_LGL_COMPANY_LAST, 3, STR_NULL); } NWidgetBase *MakeSaturationLegendLinkGraphGUI(int *biggest_index) @@ -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; @@ -435,7 +435,7 @@ void LinkGraphLegendWindow::SetOverlay(LinkGraphOverlay *overlay) { this->SetWidgetLoweredState(WID_LGL_COMPANY_FIRST + c, HasBit(companies, c)); } } - uint32 cargoes = this->overlay->GetCargoMask(); + CargoTypes cargoes = this->overlay->GetCargoMask(); for (uint c = 0; c < NUM_CARGO; c++) { if (!this->IsWidgetDisabled(WID_LGL_CARGO_FIRST + c)) { this->SetWidgetLoweredState(WID_LGL_CARGO_FIRST + c, HasBit(cargoes, c)); @@ -496,10 +496,48 @@ void LinkGraphLegendWindow::DrawWidget(const Rect &r, int widget) const if (this->IsWidgetDisabled(widget)) return; CargoSpec *cargo = CargoSpec::Get(widget - WID_LGL_CARGO_FIRST); GfxFillRect(r.left + 2, r.top + 2, r.right - 2, r.bottom - 2, cargo->legend_colour); - DrawString(r.left, r.right, (r.top + r.bottom + 1 - FONT_HEIGHT_SMALL) / 2, cargo->abbrev, TC_BLACK, SA_HOR_CENTER); + DrawString(r.left, r.right, (r.top + r.bottom + 1 - FONT_HEIGHT_SMALL) / 2, cargo->abbrev, GetContrastColour(cargo->legend_colour, 73), SA_HOR_CENTER); } } +bool LinkGraphLegendWindow::OnHoverCommon(Point pt, int widget, TooltipCloseCondition close_cond) +{ + if (IsInsideMM(widget, WID_LGL_COMPANY_FIRST, WID_LGL_COMPANY_LAST + 1)) { + if (this->IsWidgetDisabled(widget)) { + GuiShowTooltips(this, STR_LINKGRAPH_LEGEND_SELECT_COMPANIES, 0, NULL, close_cond); + } else { + uint64 params[2]; + CompanyID cid = (CompanyID)(widget - WID_LGL_COMPANY_FIRST); + params[0] = STR_LINKGRAPH_LEGEND_SELECT_COMPANIES; + params[1] = cid; + GuiShowTooltips(this, STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP, 2, params, close_cond); + } + return true; + } + if (IsInsideMM(widget, WID_LGL_CARGO_FIRST, WID_LGL_CARGO_LAST + 1)) { + if (this->IsWidgetDisabled(widget)) return false; + CargoSpec *cargo = CargoSpec::Get(widget - WID_LGL_CARGO_FIRST); + uint64 params[1]; + params[0] = cargo->name; + GuiShowTooltips(this, STR_BLACK_STRING, 1, params, close_cond); + return true; + } + return false; +} + +void LinkGraphLegendWindow::OnHover(Point pt, int widget) +{ + this->OnHoverCommon(pt, widget, TCC_HOVER); +} + +bool LinkGraphLegendWindow::OnRightClick(Point pt, int widget) +{ + if (_settings_client.gui.hover_delay_ms == 0) { + return this->OnHoverCommon(pt, widget, TCC_RIGHT_CLICK); + } + return false; +} + /** * Update the overlay with the new company selection. */ @@ -519,7 +557,7 @@ void LinkGraphLegendWindow::UpdateOverlayCompanies() */ void LinkGraphLegendWindow::UpdateOverlayCargoes() { - uint32 mask = 0; + CargoTypes mask = 0; for (uint c = 0; c < NUM_CARGO; c++) { if (this->IsWidgetDisabled(c + WID_LGL_CARGO_FIRST)) continue; if (!this->IsWidgetLowered(c + WID_LGL_CARGO_FIRST)) continue; diff --git a/src/linkgraph/linkgraph_gui.h b/src/linkgraph/linkgraph_gui.h index fcf81817f7..a933bfc683 100644 --- a/src/linkgraph/linkgraph_gui.h +++ b/src/linkgraph/linkgraph_gui.h @@ -15,9 +15,10 @@ #include "../company_func.h" #include "../station_base.h" #include "../widget_type.h" +#include "../window_gui.h" #include "linkgraph_base.h" #include -#include +#include /** * Properties of a link between two stations. @@ -39,7 +40,7 @@ class LinkGraphOverlay { public: typedef std::map StationLinkMap; typedef std::map LinkMap; - typedef std::list > StationSupplyList; + typedef std::vector > StationSupplyList; static const uint8 LINK_COLOURS[]; @@ -51,17 +52,17 @@ public: * @param company_mask Bitmask of companies to be shown. * @param scale Desired thickness of lines and size of station dots. */ - LinkGraphOverlay(const Window *w, uint wid, uint32 cargo_mask, uint32 company_mask, uint scale) : + LinkGraphOverlay(const Window *w, uint wid, CargoTypes cargo_mask, uint32 company_mask, uint scale) : window(w), widget_id(wid), cargo_mask(cargo_mask), company_mask(company_mask), scale(scale) {} void RebuildCache(); void Draw(const DrawPixelInfo *dpi) const; - void SetCargoMask(uint32 cargo_mask); + void SetCargoMask(CargoTypes cargo_mask); void SetCompanyMask(uint32 company_mask); /** Get a bitmask of the currently shown cargoes. */ - uint32 GetCargoMask() { return this->cargo_mask; } + CargoTypes GetCargoMask() { return this->cargo_mask; } /** Get a bitmask of the currently shown companies. */ uint32 GetCompanyMask() { return this->company_mask; } @@ -69,7 +70,7 @@ public: protected: const Window *window; ///< Window to be drawn into. const uint widget_id; ///< ID of Widget in Window to be drawn to. - uint32 cargo_mask; ///< Bitmask of cargos to be displayed. + CargoTypes cargo_mask; ///< Bitmask of cargos to be displayed. uint32 company_mask; ///< Bitmask of companies to be displayed. LinkMap cached_links; ///< Cache for links to reduce recalculation. StationSupplyList cached_stations; ///< Cache for stations to be drawn. @@ -77,7 +78,6 @@ protected: Point GetStationMiddle(const Station *st) const; - void DrawForwBackLinks(Point pta, StationID sta, Point ptb, StationID stb) const; void AddLinks(const Station *sta, const Station *stb); void DrawLinks(const DrawPixelInfo *dpi) const; void DrawStationDots(const DrawPixelInfo *dpi) const; @@ -102,6 +102,8 @@ public: virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize); virtual void DrawWidget(const Rect &r, int widget) const; + virtual void OnHover(Point pt, int widget); + virtual bool OnRightClick(Point pt, int widget); virtual void OnClick(Point pt, int widget, int click_count); virtual void OnInvalidateData(int data = 0, bool gui_scope = true); @@ -110,6 +112,7 @@ private: void UpdateOverlayCompanies(); void UpdateOverlayCargoes(); + bool OnHoverCommon(Point pt, int widget, TooltipCloseCondition close_cond); }; #endif /* LINKGRAPH_GUI_H */ diff --git a/src/linkgraph/linkgraphjob.cpp b/src/linkgraph/linkgraphjob.cpp index 20cbf3f64d..537303cf35 100644 --- a/src/linkgraph/linkgraphjob.cpp +++ b/src/linkgraph/linkgraphjob.cpp @@ -61,7 +61,7 @@ void LinkGraphJob::EraseFlows(NodeID from) */ void LinkGraphJob::SpawnThread() { - if (!ThreadObject::New(&(LinkGraphSchedule::Run), this, &this->thread)) { + if (!ThreadObject::New(&(LinkGraphSchedule::Run), this, &this->thread, "ottd:linkgraph")) { this->thread = NULL; /* Of course this will hang a bit. * On the other hand, if you want to play games which make this hang noticably 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 6fed7adead..544584ef61 100644 --- a/src/linkgraph/mcf.cpp +++ b/src/linkgraph/mcf.cpp @@ -32,6 +32,11 @@ public: */ inline uint GetAnnotation() const { return this->distance; } + /** + * Update the cached annotation value + */ + inline void UpdateAnnotation() { } + /** * Comparator for std containers. */ @@ -47,6 +52,8 @@ public: * can only decrease or stay the same if you add more edges. */ class CapacityAnnotation : public Path { + int cached_annotation; + public: /** @@ -62,7 +69,15 @@ public: * Return the actual value of the annotation, in this case the capacity. * @return Capacity. */ - inline int GetAnnotation() const { return this->GetCapacityRatio(); } + inline int GetAnnotation() const { return this->cached_annotation; } + + /** + * Update the cached annotation value + */ + inline void UpdateAnnotation() + { + this->cached_annotation = this->GetCapacityRatio(); + } /** * Comparator for std containers. @@ -121,7 +136,7 @@ private: LinkGraphJob &job; ///< Link graph job we're working with. /** Lookup table for getting NodeIDs from StationIDs. */ - std::map station_to_node; + std::vector station_to_node; /** Current iterator in the shares map. */ FlowStat::SharesMap::const_iterator it; @@ -137,7 +152,11 @@ public: FlowEdgeIterator(LinkGraphJob &job) : job(job) { for (NodeID i = 0; i < job.Size(); ++i) { - this->station_to_node[job[i].Station()] = i; + StationID st = job[i].Station(); + if (st >= this->station_to_node.size()) { + this->station_to_node.resize(st + 1); + } + this->station_to_node[st] = i; } } @@ -174,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. @@ -208,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. @@ -246,6 +265,7 @@ void MultiCommodityFlow::Dijkstra(NodeID source_node, PathVector &paths) paths.resize(size, NULL); for (NodeID node = 0; node < size; ++node) { Tannotation *anno = new Tannotation(node, node == source_node); + anno->UpdateAnnotation(); annos.insert(anno); paths[node] = anno; } @@ -270,6 +290,7 @@ void MultiCommodityFlow::Dijkstra(NodeID source_node, PathVector &paths) if (dest->IsBetter(source, capacity, capacity - edge.Flow(), distance)) { annos.erase(dest); dest->Fork(source, capacity, capacity - edge.Flow(), distance); + dest->UpdateAnnotation(); annos.insert(dest); } } diff --git a/src/linkgraph/refresh.cpp b/src/linkgraph/refresh.cpp index 02f27f40c1..501f063520 100644 --- a/src/linkgraph/refresh.cpp +++ b/src/linkgraph/refresh.cpp @@ -72,10 +72,15 @@ LinkRefresher::LinkRefresher(Vehicle *vehicle, HopSet *seen_hops, bool allow_mer vehicle(vehicle), seen_hops(seen_hops), cargo(CT_INVALID), allow_merge(allow_merge), is_full_loading(is_full_loading) { + memset(this->capacities, 0, sizeof(this->capacities)); + /* Assemble list of capacities and set last loading stations to 0. */ for (Vehicle *v = this->vehicle; v != NULL; v = v->Next()) { this->refit_capacities.push_back(RefitDesc(v->cargo_type, v->cargo_cap, v->refit_cap)); - if (v->refit_cap > 0) this->capacities[v->cargo_type] += v->refit_cap; + if (v->refit_cap > 0) { + assert(v->cargo_type < NUM_CARGO); + this->capacities[v->cargo_type] += v->refit_cap; + } } } @@ -200,11 +205,11 @@ void LinkRefresher::RefreshStats(const Order *cur, const Order *next) StationID next_station = next->GetDestination(); Station *st = Station::GetIfValid(cur->GetDestination()); if (st != NULL && next_station != INVALID_STATION && next_station != st->index) { - for (CapacitiesMap::const_iterator i = this->capacities.begin(); i != this->capacities.end(); ++i) { + for (CargoID c = 0; c < NUM_CARGO; c++) { /* Refresh the link and give it a minimum capacity. */ - if (i->second == 0) continue; - CargoID c = i->first; + uint cargo_quantity = this->capacities[c]; + if (cargo_quantity == 0) continue; /* If not allowed to merge link graphs, make sure the stations are * already in the same link graph. */ @@ -225,7 +230,7 @@ void LinkRefresher::RefreshStats(const Order *cur, const Order *next) st->index == vehicle->last_station_visited && this->vehicle->orders.list->GetTotalDuration() > (Ticks)this->vehicle->current_order_time) { - uint effective_capacity = i->second * this->vehicle->load_unload_ticks; + uint effective_capacity = cargo_quantity * this->vehicle->load_unload_ticks; if (effective_capacity > (uint)this->vehicle->orders.list->GetTotalDuration()) { IncreaseStats(st, c, next_station, effective_capacity / this->vehicle->orders.list->GetTotalDuration(), 0, @@ -233,10 +238,10 @@ void LinkRefresher::RefreshStats(const Order *cur, const Order *next) } else if (RandomRange(this->vehicle->orders.list->GetTotalDuration()) < effective_capacity) { IncreaseStats(st, c, next_station, 1, 0, EUM_INCREASE | restricted_mode); } else { - IncreaseStats(st, c, next_station, i->second, 0, EUM_REFRESH | restricted_mode); + IncreaseStats(st, c, next_station, cargo_quantity, 0, EUM_REFRESH | restricted_mode); } } else { - IncreaseStats(st, c, next_station, i->second, 0, EUM_REFRESH | restricted_mode); + IncreaseStats(st, c, next_station, cargo_quantity, 0, EUM_REFRESH | restricted_mode); } } } diff --git a/src/linkgraph/refresh.h b/src/linkgraph/refresh.h index 496729df7f..42067ebcf9 100644 --- a/src/linkgraph/refresh.h +++ b/src/linkgraph/refresh.h @@ -14,7 +14,7 @@ #include "../cargo_type.h" #include "../vehicle_base.h" -#include +#include #include #include @@ -79,12 +79,11 @@ protected: bool operator<(const Hop &other) const; }; - typedef std::list RefitList; - typedef std::map CapacitiesMap; + typedef std::vector RefitList; typedef std::set HopSet; Vehicle *vehicle; ///< Vehicle for which the links should be refreshed. - CapacitiesMap capacities; ///< Current added capacities per cargo ID in the consist. + uint capacities[NUM_CARGO]; ///< Current added capacities per cargo ID in the consist. RefitList refit_capacities; ///< Current state of capacity remaining from previous refits versus overall capacity per vehicle in the consist. HopSet *seen_hops; ///< Hops already seen. If the same hop is seen twice we stop the algorithm. This is shared between all Refreshers of the same run. CargoID cargo; ///< Cargo given in last refit order. diff --git a/src/main_gui.cpp b/src/main_gui.cpp index cdef1e6a6e..199546d439 100644 --- a/src/main_gui.cpp +++ b/src/main_gui.cpp @@ -118,7 +118,7 @@ bool HandlePlacePushButton(Window *w, int widget, CursorID cursor, HighLightStyl } -void CcPlaySound10(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2) +void CcPlaySound_EXPLOSION(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2) { if (result.Succeeded() && _settings_client.sound.confirm) SndPlayTileFx(SND_12_EXPLOSION, tile); } @@ -439,7 +439,7 @@ struct MainWindow : Window virtual void OnMouseWheel(int wheel) { - if (_settings_client.gui.scrollwheel_scrolling == 0) { + if (_settings_client.gui.scrollwheel_scrolling != 2) { ZoomInOrOutToCursorWindow(wheel < 0, this); } } diff --git a/src/map.cpp b/src/map.cpp index 252f20b607..85590c3e88 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -87,7 +87,7 @@ TileIndex TileAdd(TileIndex tile, TileIndexDiff add, seprintf(buf, lastof(buf), "TILE_ADD(%s) when adding 0x%.4X and 0x%.4X failed", exp, tile, add); -#if !defined(_MSC_VER) || defined(WINCE) +#if !defined(_MSC_VER) fprintf(stderr, "%s:%d %s\n", file, line, buf); #else _assert(buf, (char*)file, line); @@ -269,7 +269,7 @@ bool CircularTileSearch(TileIndex *tile, uint size, TestTileOnSearchProc proc, v /* If tile test is not successful, get one tile up, * ready for a test in first circle around center tile */ - *tile = TILE_ADD(*tile, TileOffsByDir(DIR_N)); + *tile = TileAddByDir(*tile, DIR_N); return CircularTileSearch(tile, size / 2, 1, 1, proc, user_data); } else { return CircularTileSearch(tile, size / 2, 0, 0, proc, user_data); diff --git a/src/map_func.h b/src/map_func.h index 9198c2cd1f..21d69b1382 100644 --- a/src/map_func.h +++ b/src/map_func.h @@ -147,7 +147,7 @@ static inline uint ScaleByMapSize1D(uint n) * An offset value between to tiles. * * This value is used for the difference between - * to tiles. It can be added to a tileindex to get + * two tiles. It can be added to a tileindex to get * the resulting tileindex of the start tile applied * with this saved difference. * @@ -362,6 +362,18 @@ static inline TileIndexDiff TileOffsByDir(Direction dir) return ToTileIndexDiff(_tileoffs_by_dir[dir]); } +/** + * Adds a Direction to a tile. + * + * @param tile The current tile + * @param dir The direction in which we want to step + * @return the moved tile + */ +static inline TileIndex TileAddByDir(TileIndex tile, Direction dir) +{ + return TILE_ADD(tile, TileOffsByDir(dir)); +} + /** * Adds a DiagDir to a tile. * 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/hashtable.hpp b/src/misc/hashtable.hpp index 1afe58cac7..1078f1861d 100644 --- a/src/misc/hashtable.hpp +++ b/src/misc/hashtable.hpp @@ -161,12 +161,10 @@ protected: /** static helper - return hash for the given key modulo number of slots */ inline static int CalcHash(const Tkey &key) { - int32 hash = key.CalcHash(); - if ((8 * Thash_bits) < 32) hash ^= hash >> (min(8 * Thash_bits, 31)); - if ((4 * Thash_bits) < 32) hash ^= hash >> (min(4 * Thash_bits, 31)); - if ((2 * Thash_bits) < 32) hash ^= hash >> (min(2 * Thash_bits, 31)); - if ((1 * Thash_bits) < 32) hash ^= hash >> (min(1 * Thash_bits, 31)); - hash &= (1 << Thash_bits) - 1; + uint32 hash = key.CalcHash(); + hash -= (hash >> 17); // hash * 131071 / 131072 + hash -= (hash >> 5); // * 31 / 32 + hash &= (1 << Thash_bits) - 1; // modulo slots return hash; } diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index 5bb8c7e319..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 } @@ -162,6 +163,7 @@ public: td.airport_class = STR_NULL; td.airport_name = STR_NULL; td.airport_tile_name = STR_NULL; + td.railtype = STR_NULL; td.rail_speed = 0; td.road_speed = 0; @@ -192,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) { @@ -272,6 +271,13 @@ public: line_nr++; } + /* Rail type name */ + if (td.railtype != STR_NULL) { + SetDParam(0, td.railtype); + GetString(this->landinfo_data[line_nr], STR_LANG_AREA_INFORMATION_RAIL_TYPE, lastof(this->landinfo_data[line_nr])); + line_nr++; + } + /* Rail speed limit */ if (td.rail_speed != 0) { SetDParam(0, td.rail_speed); @@ -305,10 +311,7 @@ public: for (CargoID i = 0; i < NUM_CARGO; ++i) { if (acceptance[i] > 0) { /* Add a comma between each item. */ - if (found) { - *strp++ = ','; - *strp++ = ' '; - } + if (found) strp = strecpy(strp, ", ", lastof(this->landinfo_data[LAND_INFO_MULTICENTER_LINE])); found = true; /* If the accepted value is less than 8, show it in 1/8:ths */ @@ -389,12 +392,14 @@ static const char * const _credits[] = { "Original graphics by Simon Foster", "", "The OpenTTD team (in alphabetical order):", + " Grzegorz Duczy\xC5\x84ski (adf88) - General coding (since 1.7.2)", " Albert Hofkamp (Alberth) - GUI expert (since 0.7)", " Matthijs Kooijman (blathijs) - Pathfinder-guru, Debian port (since 0.3)", " Ulf Hermann (fonsinchen) - Cargo Distribution (since 1.3)", " 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)", @@ -603,7 +608,7 @@ TextEffectID ShowFillingPercent(int x, int y, int z, uint8 percent, StringID str /** * Update vehicle loading indicators. * @param te_id TextEffectID to be updated. - * @param string String wich is printed. + * @param string String which is printed. */ void UpdateFillingPercent(TextEffectID te_id, uint8 percent, StringID string) { @@ -650,7 +655,7 @@ struct TooltipsWindow : public Window this->string_id = str; assert_compile(sizeof(this->params[0]) == sizeof(params[0])); assert(paramcount <= lengthof(this->params)); - memcpy(this->params, params, sizeof(this->params[0]) * paramcount); + if (paramcount > 0) memcpy(this->params, params, sizeof(this->params[0]) * paramcount); this->paramcount = paramcount; this->close_cond = close_tooltip; @@ -672,8 +677,8 @@ struct TooltipsWindow : public Window /* Correctly position the tooltip position, watch out for window and cursor size * Clamp value to below main toolbar and above statusbar. If tooltip would * go below window, flip it so it is shown above the cursor */ - pt.y = Clamp(_cursor.pos.y + _cursor.size.y + _cursor.offs.y + 5, scr_top, scr_bot); - if (pt.y + sm_height > scr_bot) pt.y = min(_cursor.pos.y + _cursor.offs.y - 5, scr_bot) - sm_height; + pt.y = Clamp(_cursor.pos.y + _cursor.total_size.y + _cursor.total_offs.y + 5, scr_top, scr_bot); + if (pt.y + sm_height > scr_bot) pt.y = min(_cursor.pos.y + _cursor.total_offs.y - 5, scr_bot) - sm_height; pt.x = sm_width >= _screen.width ? 0 : Clamp(_cursor.pos.x - (sm_width >> 1), 0, _screen.width - sm_width); return pt; @@ -728,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) { @@ -999,10 +1004,12 @@ struct QueryStringWindow : public Window switch (widget) { case WID_QS_DEFAULT: this->editbox.text.DeleteAll(); - /* FALL THROUGH */ + FALLTHROUGH; + case WID_QS_OK: this->OnOk(); - /* FALL THROUGH */ + FALLTHROUGH; + case WID_QS_CANCEL: delete this; break; @@ -1062,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 @@ -1152,7 +1159,8 @@ struct QueryWindow : public Window { this->proc(this->parent, true); this->proc = NULL; } - /* FALL THROUGH */ + FALLTHROUGH; + case WKC_ESC: delete this; return ES_HANDLED; 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.cpp b/src/music.cpp index 4001e621e1..3d0e40bf9b 100644 --- a/src/music.cpp +++ b/src/music.cpp @@ -11,11 +11,69 @@ #include "stdafx.h" + /** The type of set we're replacing */ #define SET_TYPE "music" #include "base_media_func.h" #include "safeguards.h" +#include "fios.h" + + +/** + * Read the name of a music CAT file entry. + * @param filename Name of CAT file to read from + * @param entrynum Index of entry whose name to read + * @return Pointer to string, caller is responsible for freeing memory, + * NULL if entrynum does not exist. + */ +char *GetMusicCatEntryName(const char *filename, size_t entrynum) +{ + if (!FioCheckFileExists(filename, BASESET_DIR)) return NULL; + + FioOpenFile(CONFIG_SLOT, filename, BASESET_DIR); + uint32 ofs = FioReadDword(); + size_t entry_count = ofs / 8; + if (entrynum < entry_count) { + FioSeekTo(entrynum * 8, SEEK_SET); + FioSeekTo(FioReadDword(), SEEK_SET); + byte namelen = FioReadByte(); + char *name = MallocT(namelen + 1); + FioReadBlock(name, namelen); + name[namelen] = '\0'; + return name; + } + return NULL; +} + +/** + * Read the full data of a music CAT file entry. + * @param filename Name of CAT file to read from. + * @param entrynum Index of entry to read + * @param[out] entrylen Receives length of data read + * @return Pointer to buffer with data read, caller is responsible for freeind memory, + * NULL if entrynum does not exist. + */ +byte *GetMusicCatEntryData(const char *filename, size_t entrynum, size_t &entrylen) +{ + entrylen = 0; + if (!FioCheckFileExists(filename, BASESET_DIR)) return NULL; + + FioOpenFile(CONFIG_SLOT, filename, BASESET_DIR); + uint32 ofs = FioReadDword(); + size_t entry_count = ofs / 8; + if (entrynum < entry_count) { + FioSeekTo(entrynum * 8, SEEK_SET); + size_t entrypos = FioReadDword(); + entrylen = FioReadDword(); + FioSeekTo(entrypos, SEEK_SET); + FioSkipBytes(FioReadByte()); + byte *data = MallocT(entrylen); + FioReadBlock(data, entrylen); + return data; + } + return NULL; +} INSTANTIATE_BASE_MEDIA_METHODS(BaseMedia, MusicSet) @@ -66,34 +124,73 @@ bool MusicSet::FillSetDetails(IniFile *ini, const char *path, const char *full_f if (ret) { this->num_available = 0; IniGroup *names = ini->GetGroup("names"); - for (uint i = 0, j = 1; i < lengthof(this->song_name); i++) { + IniGroup *catindex = ini->GetGroup("catindex"); + IniGroup *timingtrim = ini->GetGroup("timingtrim"); + uint tracknr = 1; + for (uint i = 0; i < lengthof(this->songinfo); i++) { const char *filename = this->files[i].filename; - if (names == NULL || StrEmpty(filename)) { - this->song_name[i][0] = '\0'; + if (names == NULL || StrEmpty(filename) || this->files[i].check_result == MD5File::CR_NO_FILE) { + this->songinfo[i].songname[0] = '\0'; continue; } - IniItem *item = NULL; + this->songinfo[i].filename = filename; // non-owned pointer + + IniItem *item = catindex->GetItem(_music_file_names[i], false); + if (item != NULL && !StrEmpty(item->value)) { + /* Song has a CAT file index, assume it's MPS MIDI format */ + this->songinfo[i].filetype = MTT_MPSMIDI; + this->songinfo[i].cat_index = atoi(item->value); + char *songname = GetMusicCatEntryName(filename, this->songinfo[i].cat_index); + if (songname == NULL) { + DEBUG(grf, 0, "Base music set song missing from CAT file: %s/%d", filename, this->songinfo[i].cat_index); + this->songinfo[i].songname[0] = '\0'; + continue; + } + strecpy(this->songinfo[i].songname, songname, lastof(this->songinfo[i].songname)); + free(songname); + } else { + this->songinfo[i].filetype = MTT_STANDARDMIDI; + } + + const char *trimmed_filename = filename; /* As we possibly add a path to the filename and we compare * on the filename with the path as in the .obm, we need to * keep stripping path elements until we find a match. */ - for (const char *p = filename; p != NULL; p = strchr(p, PATHSEPCHAR)) { + for (; trimmed_filename != NULL; trimmed_filename = strchr(trimmed_filename, PATHSEPCHAR)) { /* Remove possible double path separator characters from * the beginning, so we don't start reading e.g. root. */ - while (*p == PATHSEPCHAR) p++; + while (*trimmed_filename == PATHSEPCHAR) trimmed_filename++; - item = names->GetItem(p, false); + item = names->GetItem(trimmed_filename, false); if (item != NULL && !StrEmpty(item->value)) break; } - if (item == NULL || StrEmpty(item->value)) { - DEBUG(grf, 0, "Base music set song name missing: %s", filename); - return false; + if (this->songinfo[i].filetype == MTT_STANDARDMIDI) { + if (item != NULL && !StrEmpty(item->value)) { + strecpy(this->songinfo[i].songname, item->value, lastof(this->songinfo[i].songname)); + } else { + DEBUG(grf, 0, "Base music set song name missing: %s", filename); + return false; + } + } + this->num_available++; + + /* Number the theme song (if any) track 0, rest are normal */ + if (i == 0) { + this->songinfo[i].tracknr = 0; + } else { + this->songinfo[i].tracknr = tracknr++; } - strecpy(this->song_name[i], item->value, lastof(this->song_name[i])); - this->track_nr[i] = j++; - this->num_available++; + item = timingtrim->GetItem(trimmed_filename, false); + if (item != NULL && !StrEmpty(item->value)) { + const char *endpos = strchr(item->value, ':'); + if (endpos != NULL) { + this->songinfo[i].override_start = atoi(item->value); + this->songinfo[i].override_end = atoi(endpos + 1); + } + } } } return ret; diff --git a/src/music/allegro_m.cpp b/src/music/allegro_m.cpp index 77b488186a..906aec84fc 100644 --- a/src/music/allegro_m.cpp +++ b/src/music/allegro_m.cpp @@ -14,6 +14,7 @@ #include "../stdafx.h" #include "../debug.h" #include "allegro_m.h" +#include "midifile.hpp" #include #include "../safeguards.h" @@ -58,11 +59,17 @@ void MusicDriver_Allegro::Stop() if (--_allegro_instance_count == 0) allegro_exit(); } -void MusicDriver_Allegro::PlaySong(const char *filename) +void MusicDriver_Allegro::PlaySong(const MusicSongInfo &song) { + std::string filename = MidiFile::GetSMFFile(song); + if (_midi != NULL) destroy_midi(_midi); - _midi = load_midi(filename); - play_midi(_midi, false); + if (!filename.empty()) { + _midi = load_midi(filename.c_str()); + play_midi(_midi, false); + } else { + _midi = NULL; + } } void MusicDriver_Allegro::StopSong() diff --git a/src/music/allegro_m.h b/src/music/allegro_m.h index 69cf59569a..65d8ab811d 100644 --- a/src/music/allegro_m.h +++ b/src/music/allegro_m.h @@ -21,7 +21,7 @@ public: /* virtual */ void Stop(); - /* virtual */ void PlaySong(const char *filename); + /* virtual */ void PlaySong(const MusicSongInfo &song); /* virtual */ void StopSong(); diff --git a/src/music/bemidi.cpp b/src/music/bemidi.cpp index 2bc2074763..ff56d787f1 100644 --- a/src/music/bemidi.cpp +++ b/src/music/bemidi.cpp @@ -12,6 +12,8 @@ #include "../stdafx.h" #include "../openttd.h" #include "bemidi.h" +#include "../base_media_base.h" +#include "midifile.hpp" /* BeOS System Includes */ #include @@ -34,13 +36,17 @@ void MusicDriver_BeMidi::Stop() midiSynthFile.UnloadFile(); } -void MusicDriver_BeMidi::PlaySong(const char *filename) +void MusicDriver_BeMidi::PlaySong(const MusicSongInfo &song) { + std::string filename = MidiFile::GetSMFFile(song); + this->Stop(); - entry_ref midiRef; - get_ref_for_path(filename, &midiRef); - midiSynthFile.LoadFile(&midiRef); - midiSynthFile.Start(); + if (!filename.empty()) { + entry_ref midiRef; + get_ref_for_path(filename.c_str(), &midiRef); + midiSynthFile.LoadFile(&midiRef); + midiSynthFile.Start(); + } } void MusicDriver_BeMidi::StopSong() diff --git a/src/music/bemidi.h b/src/music/bemidi.h index 23c6249d59..7c546525d2 100644 --- a/src/music/bemidi.h +++ b/src/music/bemidi.h @@ -21,7 +21,7 @@ public: /* virtual */ void Stop(); - /* virtual */ void PlaySong(const char *filename); + /* virtual */ void PlaySong(const MusicSongInfo &song); /* virtual */ void StopSong(); diff --git a/src/music/cocoa_m.cpp b/src/music/cocoa_m.cpp index a201984ae1..2416cade0f 100644 --- a/src/music/cocoa_m.cpp +++ b/src/music/cocoa_m.cpp @@ -18,18 +18,20 @@ #include "../stdafx.h" #include "../os/macosx/macos.h" #include "cocoa_m.h" +#include "midifile.hpp" #include "../debug.h" +#include "../base_media_base.h" -#define Rect OTTDRect -#define Point OTTDPoint #include #include #include -#undef Rect -#undef Point #include "../safeguards.h" +#if !defined(HAVE_OSX_1011_SDK) +#define kMusicSequenceFile_AnyType 0 +#endif + static FMusicDriver_Cocoa iFMusicDriver_Cocoa; @@ -68,7 +70,7 @@ static void DoSetVolume() * risk compilation errors. The header AudioComponent.h * was introduced in 10.6 so use it to decide which * type definition to use. */ -#ifdef __AUDIOCOMPONENT_H__ +#if defined(__AUDIOCOMPONENT_H__) || defined(HAVE_OSX_107_SDK) AudioComponentDescription desc; #else ComponentDescription desc; @@ -137,11 +139,13 @@ void MusicDriver_Cocoa::Stop() /** * Starts playing a new song. * - * @param filename Path to a MIDI file. + * @param song Description of music to load and play */ -void MusicDriver_Cocoa::PlaySong(const char *filename) +void MusicDriver_Cocoa::PlaySong(const MusicSongInfo &song) { - DEBUG(driver, 2, "cocoa_m: trying to play '%s'", filename); + std::string filename = MidiFile::GetSMFFile(song); + + DEBUG(driver, 2, "cocoa_m: trying to play '%s'", filename.c_str()); this->StopSong(); if (_sequence != NULL) { @@ -149,17 +153,19 @@ void MusicDriver_Cocoa::PlaySong(const char *filename) _sequence = NULL; } + if (filename.empty()) return; + if (NewMusicSequence(&_sequence) != noErr) { DEBUG(driver, 0, "cocoa_m: Failed to create music sequence"); return; } - const char *os_file = OTTD2FS(filename); + const char *os_file = OTTD2FS(filename.c_str()); CFURLRef url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (const UInt8*)os_file, strlen(os_file), false); #if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) if (MacOSVersionIsAtLeast(10, 5, 0)) { - if (MusicSequenceFileLoad(_sequence, url, 0, 0) != noErr) { + if (MusicSequenceFileLoad(_sequence, url, kMusicSequenceFile_AnyType, 0) != noErr) { DEBUG(driver, 0, "cocoa_m: Failed to load MIDI file"); CFRelease(url); return; @@ -214,7 +220,7 @@ void MusicDriver_Cocoa::PlaySong(const char *filename) if (MusicPlayerStart(_player) != noErr) return; _playing = true; - DEBUG(driver, 3, "cocoa_m: playing '%s'", filename); + DEBUG(driver, 3, "cocoa_m: playing '%s'", filename.c_str()); } diff --git a/src/music/cocoa_m.h b/src/music/cocoa_m.h index 1963bef5b7..fdb10b84e6 100644 --- a/src/music/cocoa_m.h +++ b/src/music/cocoa_m.h @@ -20,7 +20,7 @@ public: /* virtual */ void Stop(); - /* virtual */ void PlaySong(const char *filename); + /* virtual */ void PlaySong(const MusicSongInfo &song); /* virtual */ void StopSong(); diff --git a/src/music/dmusic.cpp b/src/music/dmusic.cpp index de3bda843e..fece709fda 100644 --- a/src/music/dmusic.cpp +++ b/src/music/dmusic.cpp @@ -19,87 +19,1099 @@ #include "../debug.h" #include "../os/windows/win32.h" #include "../core/mem_func.hpp" +#include "../thread/thread.h" +#include "../fileio_func.h" +#include "../base_media_base.h" #include "dmusic.h" +#include "midifile.hpp" +#include "midi.h" #include -#undef FACILITY_DIRECTMUSIC // Needed for newer Windows SDK version. #include -#include #include -#include +#include #include "../safeguards.h" -static FMusicDriver_DMusic iFMusicDriver_DMusic; +#if defined(_MSC_VER) +# pragma comment(lib, "ole32.lib") +#endif /* defined(_MSC_VER) */ -/** the direct music object manages buffers and ports */ -static IDirectMusic *music = NULL; - -/** the performance object controls manipulation of the segments */ -static IDirectMusicPerformance *performance = NULL; - -/** the loader object can load many types of DMusic related files */ -static IDirectMusicLoader *loader = NULL; - -/** the segment object is where the MIDI data is stored for playback */ -static IDirectMusicSegment *segment = NULL; - -static bool seeking = false; +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. -#define M(x) x "\0" -static const char ole_files[] = - M("ole32.dll") - M("CoCreateInstance") - M("CoInitialize") - M("CoUninitialize") - M("") -; -#undef M +#define FOURCC_INFO mmioFOURCC('I','N','F','O') +#define FOURCC_fmt mmioFOURCC('f','m','t',' ') +#define FOURCC_data mmioFOURCC('d','a','t','a') -struct ProcPtrs { - unsigned long (WINAPI * CoCreateInstance)(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID *ppv); - HRESULT (WINAPI * CoInitialize)(LPVOID pvReserved); - void (WINAPI * CoUninitialize)(); +/** A DLS file. */ +struct DLSFile { + /** An instrument region maps a note range to wave data. */ + struct DLSRegion { + RGNHEADER hdr; + WAVELINK wave; + WSMPL wave_sample; + + std::vector wave_loops; + std::vector articulators; + }; + + /** Instrument definition read from a DLS file. */ + struct DLSInstrument { + INSTHEADER hdr; + + std::vector articulators; + std::vector regions; + }; + + /** Wave data definition from a DLS file. */ + struct DLSWave { + long file_offset; + + PCMWAVEFORMAT fmt; + std::vector data; + + WSMPL wave_sample; + std::vector wave_loops; + + bool operator ==(long offset) const { + return this->file_offset == offset; + } + }; + + std::vector instruments; + std::vector pool_cues; + std::vector waves; + + /** Try loading a DLS file into memory. */ + bool LoadFile(const TCHAR *file); + +private: + /** Load an articulation structure from a DLS file. */ + bool ReadDLSArticulation(FILE *f, DWORD list_length, std::vector &out); + /** Load a list of regions from a DLS file. */ + bool ReadDLSRegionList(FILE *f, DWORD list_length, DLSInstrument &instrument); + /** Load a single region from a DLS file. */ + bool ReadDLSRegion(FILE *f, DWORD list_length, std::vector &out); + /** Load a list of instruments from a DLS file. */ + bool ReadDLSInstrumentList(FILE *f, DWORD list_length); + /** Load a single instrument from a DLS file. */ + bool ReadDLSInstrument(FILE *f, DWORD list_length); + /** Load a list of waves from a DLS file. */ + bool ReadDLSWaveList(FILE *f, DWORD list_length); + /** Load a single wave from a DLS file. */ + bool ReadDLSWave(FILE *f, DWORD list_length, long offset); }; -static ProcPtrs proc; +/** A RIFF chunk header. */ +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. */ +PACK_N(struct WAVE_DOWNLOAD { + DMUS_DOWNLOADINFO dlInfo; + ULONG ulOffsetTable[2]; + DMUS_WAVE dmWave; + DMUS_WAVEDATA dmWaveData; +}, 2); + +struct PlaybackSegment { + uint32 start, end; + size_t start_block; + bool loop; +}; + +static struct { + bool shutdown; ///< flag to indicate playback thread shutdown + bool playing; ///< flag indicating that playback is active + bool do_start; ///< flag for starting playback of next_file at next opportunity + bool do_stop; ///< flag for stopping playback at next opportunity + + int preload_time; ///< preload time for music blocks. + byte new_volume; ///< volume setting to change to + + MidiFile next_file; ///< upcoming file to play + PlaybackSegment next_segment; ///< segment info for upcoming file +} _playback; + +/** Handle to our worker thread. */ +static ThreadObject *_dmusic_thread = NULL; +/** Event to signal the thread that it should look at a state change. */ +static HANDLE _thread_event = NULL; +/** Lock access to playback data that is not thread-safe. */ +static ThreadMutex *_thread_mutex = NULL; + +/** The direct music object manages buffers and ports. */ +static IDirectMusic *_music = NULL; +/** The port object lets us send MIDI data to the synthesizer. */ +static IDirectMusicPort *_port = NULL; +/** The buffer object collects the data to sent. */ +static IDirectMusicBuffer *_buffer = NULL; +/** List of downloaded DLS instruments. */ +static std::vector _dls_downloads; + + +static FMusicDriver_DMusic iFMusicDriver_DMusic; + + +bool DLSFile::ReadDLSArticulation(FILE *f, DWORD list_length, std::vector &out) +{ + while (list_length > 0) { + ChunkHeader chunk; + if (fread(&chunk, sizeof(chunk), 1, f) != 1) return false; + list_length -= chunk.length + sizeof(chunk); + + if (chunk.type == FOURCC_ART1) { + CONNECTIONLIST conns; + if (fread(&conns, sizeof(conns), 1, f) != 1) return false; + fseek(f, conns.cbSize - sizeof(conns), SEEK_CUR); + + /* Read all defined articulations. */ + for (ULONG i = 0; i < conns.cConnections; i++) { + CONNECTION con; + if (fread(&con, sizeof(con), 1, f) != 1) return false; + out.push_back(con); + } + } else { + fseek(f, chunk.length, SEEK_CUR); + } + } + + return true; +} + +bool DLSFile::ReadDLSRegion(FILE *f, DWORD list_length, std::vector &out) +{ + out.push_back(DLSRegion()); + DLSRegion ®ion = out.back(); + + /* Set default values. */ + region.wave_sample.cbSize = 0; + + while (list_length > 0) { + ChunkHeader chunk; + if (fread(&chunk, sizeof(chunk), 1, f) != 1) return false; + list_length -= chunk.length + sizeof(chunk); + + if (chunk.type == FOURCC_LIST) { + /* Unwrap list header. */ + if (fread(&chunk.type, sizeof(chunk.type), 1, f) != 1) return false; + chunk.length -= sizeof(chunk.type); + } + + switch (chunk.type) { + case FOURCC_RGNH: + if (fread(®ion.hdr, sizeof(region.hdr), 1, f) != 1) return false; + break; + + case FOURCC_WSMP: + if (fread(®ion.wave_sample, sizeof(region.wave_sample), 1, f) != 1) return false; + fseek(f, region.wave_sample.cbSize - sizeof(region.wave_sample), SEEK_CUR); + + /* Read all defined sample loops. */ + for (ULONG i = 0; i < region.wave_sample.cSampleLoops; i++) { + WLOOP loop; + if (fread(&loop, sizeof(loop), 1, f) != 1) return false; + region.wave_loops.push_back(loop); + } + break; + + case FOURCC_WLNK: + if (fread(®ion.wave, sizeof(region.wave), 1, f) != 1) return false; + break; + + case FOURCC_LART: // List chunk + if (!this->ReadDLSArticulation(f, chunk.length, region.articulators)) return false; + break; + + case FOURCC_INFO: + /* We don't care about info stuff. */ + fseek(f, chunk.length, SEEK_CUR); + break; + + default: + 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; + } + } + + return true; +} + +bool DLSFile::ReadDLSRegionList(FILE *f, DWORD list_length, DLSInstrument &instrument) +{ + while (list_length > 0) { + ChunkHeader chunk; + if (fread(&chunk, sizeof(chunk), 1, f) != 1) return false; + list_length -= chunk.length + sizeof(chunk); + + if (chunk.type == FOURCC_LIST) { + FOURCC list_type; + if (fread(&list_type, sizeof(list_type), 1, f) != 1) return false; + + 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", (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", (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); + } + } + + return true; +} + +bool DLSFile::ReadDLSInstrument(FILE *f, DWORD list_length) +{ + this->instruments.push_back(DLSInstrument()); + DLSInstrument &instrument = this->instruments.back(); + + while (list_length > 0) { + ChunkHeader chunk; + if (fread(&chunk, sizeof(chunk), 1, f) != 1) return false; + list_length -= chunk.length + sizeof(chunk); + + if (chunk.type == FOURCC_LIST) { + /* Unwrap list header. */ + if (fread(&chunk.type, sizeof(chunk.type), 1, f) != 1) return false; + chunk.length -= sizeof(chunk.type); + } + + switch (chunk.type) { + case FOURCC_INSH: + if (fread(&instrument.hdr, sizeof(instrument.hdr), 1, f) != 1) return false; + break; + + case FOURCC_LART: // List chunk + if (!this->ReadDLSArticulation(f, chunk.length, instrument.articulators)) return false; + break; + + case FOURCC_LRGN: // List chunk + if (!this->ReadDLSRegionList(f, chunk.length, instrument)) return false; + break; + + case FOURCC_INFO: + /* We don't care about info stuff. */ + fseek(f, chunk.length, SEEK_CUR); + break; + + default: + 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; + } + } + + return true; +} + +bool DLSFile::ReadDLSInstrumentList(FILE *f, DWORD list_length) +{ + while (list_length > 0) { + ChunkHeader chunk; + if (fread(&chunk, sizeof(chunk), 1, f) != 1) return false; + list_length -= chunk.length + sizeof(chunk); + + if (chunk.type == FOURCC_LIST) { + FOURCC list_type; + if (fread(&list_type, sizeof(list_type), 1, f) != 1) return false; + + if (list_type == FOURCC_INS) { + DEBUG(driver, 6, "DLS: Reading instrument %d", (int)instruments.size()); + + 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", (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", (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); + } + } + + return true; +} + +bool DLSFile::ReadDLSWave(FILE *f, DWORD list_length, long offset) +{ + this->waves.push_back(DLSWave()); + DLSWave &wave = this->waves.back(); + + /* Set default values. */ + MemSetT(&wave.wave_sample, 0); + wave.wave_sample.cbSize = sizeof(WSMPL); + wave.wave_sample.usUnityNote = 60; + wave.file_offset = offset; // Store file offset so we can resolve the wave pool table later on. + + while (list_length > 0) { + ChunkHeader chunk; + if (fread(&chunk, sizeof(chunk), 1, f) != 1) return false; + list_length -= chunk.length + sizeof(chunk); + + if (chunk.type == FOURCC_LIST) { + /* Unwrap list header. */ + if (fread(&chunk.type, sizeof(chunk.type), 1, f) != 1) return false; + chunk.length -= sizeof(chunk.type); + } + + switch (chunk.type) { + case FOURCC_fmt: + if (fread(&wave.fmt, sizeof(wave.fmt), 1, f) != 1) return false; + if (chunk.length > sizeof(wave.fmt)) fseek(f, chunk.length - sizeof(wave.fmt), SEEK_CUR); + break; + + case FOURCC_WSMP: + if (fread(&wave.wave_sample, sizeof(wave.wave_sample), 1, f) != 1) return false; + fseek(f, wave.wave_sample.cbSize - sizeof(wave.wave_sample), SEEK_CUR); + + /* Read all defined sample loops. */ + for (ULONG i = 0; i < wave.wave_sample.cSampleLoops; i++) { + WLOOP loop; + if (fread(&loop, sizeof(loop), 1, f) != 1) return false; + wave.wave_loops.push_back(loop); + } + break; + + case FOURCC_data: + wave.data.resize(chunk.length); + if (fread(&wave.data[0], sizeof(BYTE), wave.data.size(), f) != wave.data.size()) return false; + break; + + case FOURCC_INFO: + /* We don't care about info stuff. */ + fseek(f, chunk.length, SEEK_CUR); + break; + + default: + 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; + } + } + + return true; +} + +bool DLSFile::ReadDLSWaveList(FILE *f, DWORD list_length) +{ + long base_offset = ftell(f); + + while (list_length > 0) { + long chunk_offset = ftell(f); + + ChunkHeader chunk; + if (fread(&chunk, sizeof(chunk), 1, f) != 1) return false; + list_length -= chunk.length + sizeof(chunk); + + if (chunk.type == FOURCC_LIST) { + FOURCC list_type; + if (fread(&list_type, sizeof(list_type), 1, f) != 1) return false; + + if (list_type == FOURCC_wave) { + DEBUG(driver, 6, "DLS: Reading wave %d", (int)waves.size()); + + 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", (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", (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); + } + } + + return true; +} + +bool DLSFile::LoadFile(const TCHAR *file) +{ + DEBUG(driver, 2, "DMusic: Try to load DLS file %s", FS2OTTD(file)); + + FILE *f = _tfopen(file, _T("rb")); + if (f == NULL) return false; + + FileCloser f_scope(f); + + /* Check DLS file header. */ + ChunkHeader hdr; + FOURCC dls_type; + if (fread(&hdr, sizeof(hdr), 1, f) != 1) return false; + if (fread(&dls_type, sizeof(dls_type), 1, f) != 1) return false; + if (hdr.type != FOURCC_RIFF || dls_type != FOURCC_DLS) return false; + + hdr.length -= sizeof(FOURCC); + + DEBUG(driver, 2, "DMusic: Parsing DLS file"); + + DLSHEADER header; + MemSetT(&header, 0); + + /* Iterate over all chunks in the file. */ + while (hdr.length > 0) { + ChunkHeader chunk; + if (fread(&chunk, sizeof(chunk), 1, f) != 1) return false; + hdr.length -= chunk.length + sizeof(chunk); + + if (chunk.type == FOURCC_LIST) { + /* Unwrap list header. */ + if (fread(&chunk.type, sizeof(chunk.type), 1, f) != 1) return false; + chunk.length -= sizeof(chunk.type); + } + + switch (chunk.type) { + case FOURCC_COLH: + if (fread(&header, sizeof(header), 1, f) != 1) return false; + break; + + case FOURCC_LINS: // List chunk + if (!this->ReadDLSInstrumentList(f, chunk.length)) return false; + break; + + case FOURCC_WVPL: // List chunk + if (!this->ReadDLSWaveList(f, chunk.length)) return false; + break; + + case FOURCC_PTBL: + POOLTABLE ptbl; + if (fread(&ptbl, sizeof(ptbl), 1, f) != 1) return false; + fseek(f, ptbl.cbSize - sizeof(ptbl), SEEK_CUR); + + /* Read all defined cues. */ + for (ULONG i = 0; i < ptbl.cCues; i++) { + POOLCUE cue; + if (fread(&cue, sizeof(cue), 1, f) != 1) return false; + this->pool_cues.push_back(cue); + } + break; + + case FOURCC_INFO: + /* We don't care about info stuff. */ + fseek(f, chunk.length, SEEK_CUR); + break; + + default: + 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; + } + } + + /* Have we read as many instruments as indicated? */ + if (header.cInstruments != this->instruments.size()) return false; + + /* Resolve wave pool table. */ + for (std::vector::iterator cue = this->pool_cues.begin(); cue != this->pool_cues.end(); cue++) { + std::vector::iterator w = std::find(this->waves.begin(), this->waves.end(), cue->ulOffset); + if (w != this->waves.end()) { + cue->ulOffset = (ULONG)(w - this->waves.begin()); + } else { + cue->ulOffset = 0; + } + } + + return true; +} + + +static byte ScaleVolume(byte original, byte scale) +{ + return original * scale / 127; +} + +static void TransmitChannelMsg(IDirectMusicBuffer *buffer, REFERENCE_TIME rt, byte status, byte p1, byte p2 = 0) +{ + if (buffer->PackStructured(rt, 0, status | (p1 << 8) | (p2 << 16)) == E_OUTOFMEMORY) { + /* Buffer is full, clear it and try again. */ + _port->PlayBuffer(buffer); + buffer->Flush(); + + buffer->PackStructured(rt, 0, status | (p1 << 8) | (p2 << 16)); + } +} + +static void TransmitSysex(IDirectMusicBuffer *buffer, REFERENCE_TIME rt, byte *&msg_start, size_t &remaining) +{ + /* Find end of message. */ + byte *msg_end = msg_start; + while (*msg_end != MIDIST_ENDSYSEX) msg_end++; + msg_end++; // Also include SysEx end byte. + + if (buffer->PackUnstructured(rt, 0, msg_end - msg_start, msg_start) == E_OUTOFMEMORY) { + /* Buffer is full, clear it and try again. */ + _port->PlayBuffer(buffer); + buffer->Flush(); + + buffer->PackUnstructured(rt, 0, msg_end - msg_start, msg_start); + } + + /* Update position in buffer. */ + remaining -= msg_end - msg_start; + msg_start = msg_end; +} + +static void TransmitSysexConst(IDirectMusicBuffer *buffer, REFERENCE_TIME rt, byte *msg_start, size_t length) +{ + TransmitSysex(buffer, rt, msg_start, length); +} + +/** Transmit 'Note off' messages to all MIDI channels. */ +static void TransmitNotesOff(IDirectMusicBuffer *buffer, REFERENCE_TIME block_time, REFERENCE_TIME cur_time) +{ + for (int ch = 0; ch < 16; ch++) { + TransmitChannelMsg(_buffer, block_time + 10, MIDIST_CONTROLLER | ch, MIDICT_MODE_ALLNOTESOFF, 0); + TransmitChannelMsg(_buffer, block_time + 10, MIDIST_CONTROLLER | ch, MIDICT_SUSTAINSW, 0); + TransmitChannelMsg(_buffer, block_time + 10, MIDIST_CONTROLLER | ch, MIDICT_MODE_RESETALLCTRL, 0); + } + /* Explicitly flush buffer to make sure the note off messages are processed + * before we send any additional control messages. */ + _port->PlayBuffer(_buffer); + _buffer->Flush(); + + /* Some songs change the "Pitch bend range" registered parameter. If + * this doesn't get reset, everything else will start sounding wrong. */ + for (int ch = 0; ch < 16; ch++) { + /* Running status, only need status for first message + * Select RPN 00.00, set value to 02.00, and de-select again */ + TransmitChannelMsg(_buffer, block_time + 10, MIDIST_CONTROLLER | ch, MIDICT_RPN_SELECT_LO, 0x00); + TransmitChannelMsg(_buffer, block_time + 10, MIDICT_RPN_SELECT_HI, 0x00); + TransmitChannelMsg(_buffer, block_time + 10, MIDICT_DATAENTRY, 0x02); + TransmitChannelMsg(_buffer, block_time + 10, MIDICT_DATAENTRY_LO, 0x00); + TransmitChannelMsg(_buffer, block_time + 10, MIDICT_RPN_SELECT_LO, 0x7F); + TransmitChannelMsg(_buffer, block_time + 10, MIDICT_RPN_SELECT_HI, 0x7F); + + _port->PlayBuffer(_buffer); + _buffer->Flush(); + } + + /* Wait until message time has passed. */ + Sleep(Clamp((block_time - cur_time) / MS_TO_REFTIME, 5, 1000)); +} + +static void MidiThreadProc(void *) +{ + DEBUG(driver, 2, "DMusic: Entering playback thread"); + + REFERENCE_TIME last_volume_time = 0; // timestamp of the last volume change + REFERENCE_TIME block_time = 0; // timestamp of the last block sent to the port + 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 = 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 + + /* Get pointer to the reference clock of our output port. */ + IReferenceClock *clock; + _port->GetLatencyClock(&clock); + + REFERENCE_TIME cur_time; + clock->GetTime(&cur_time); + + /* Standard "Enable General MIDI" message */ + static byte gm_enable_sysex[] = { 0xF0, 0x7E, 0x00, 0x09, 0x01, 0xF7 }; + TransmitSysexConst(_buffer, cur_time, &gm_enable_sysex[0], sizeof(gm_enable_sysex)); + /* Roland-specific reverb room control, used by the original game */ + static byte roland_reverb_sysex[] = { 0xF0, 0x41, 0x10, 0x42, 0x12, 0x40, 0x01, 0x30, 0x02, 0x04, 0x00, 0x40, 0x40, 0x00, 0x00, 0x09, 0xF7 }; + TransmitSysexConst(_buffer, cur_time, &roland_reverb_sysex[0], sizeof(roland_reverb_sysex)); + + _port->PlayBuffer(_buffer); + _buffer->Flush(); + + DWORD next_timeout = 1000; + while (true) { + /* Wait for a signal from the GUI thread or until the time for the next event has come. */ + DWORD wfso = WaitForSingleObject(_thread_event, next_timeout); + + if (_playback.shutdown) { + _playback.playing = false; + break; + } + + if (_playback.do_stop) { + DEBUG(driver, 2, "DMusic thread: Stopping playback"); + + /* Turn all notes off and wait a bit to allow the messages to be handled. */ + clock->GetTime(&cur_time); + TransmitNotesOff(_buffer, block_time, cur_time); + + _playback.playing = false; + _playback.do_stop = false; + block_time = 0; + next_timeout = 1000; + continue; + } + + if (wfso == WAIT_OBJECT_0) { + if (_playback.do_start) { + DEBUG(driver, 2, "DMusic thread: Starting playback"); + { + /* New scope to limit the time the mutex is locked. */ + ThreadMutexLocker lock(_thread_mutex); + + current_file.MoveFrom(_playback.next_file); + std::swap(_playback.next_segment, current_segment); + current_segment.start_block = 0; + current_block = 0; + _playback.playing = true; + _playback.do_start = false; + } + + /* Turn all notes off in case we are seeking between music titles. */ + clock->GetTime(&cur_time); + TransmitNotesOff(_buffer, block_time, cur_time); + + MemSetT(channel_volumes, 127, lengthof(channel_volumes)); + + /* Take the current time plus the preload time as the music start time. */ + clock->GetTime(&playback_start_time); + playback_start_time += _playback.preload_time * MS_TO_REFTIME; + } + } + + if (_playback.playing) { + /* skip beginning of file? */ + if (current_segment.start > 0 && current_block == 0 && current_segment.start_block == 0) { + /* find first block after start time and pretend playback started earlier + * this is to allow all blocks prior to the actual start to still affect playback, + * as they may contain important controller and program changes */ + size_t preload_bytes = 0; + for (size_t bl = 0; bl < current_file.blocks.size(); bl++) { + MidiFile::DataBlock &block = current_file.blocks[bl]; + preload_bytes += block.data.Length(); + if (block.ticktime >= current_segment.start) { + if (current_segment.loop) { + DEBUG(driver, 2, "DMusic: timer: loop from block %d (ticktime %d, realtime %.3f, bytes %d)", (int)bl, (int)block.ticktime, ((int)block.realtime) / 1000.0, (int)preload_bytes); + current_segment.start_block = bl; + break; + } else { + /* Skip the transmission delay compensation performed in the Win32 MIDI driver. + * The DMusic driver will most likely be used with the MS softsynth, which is not subject to transmission delays. + */ + DEBUG(driver, 2, "DMusic: timer: start from block %d (ticktime %d, realtime %.3f, bytes %d)", (int)bl, (int)block.ticktime, ((int)block.realtime) / 1000.0, (int)preload_bytes); + playback_start_time -= block.realtime * MIDITIME_TO_REFTIME; + break; + } + } + } + } + + /* Get current playback timestamp. */ + REFERENCE_TIME current_time; + clock->GetTime(¤t_time); + + /* Check for volume change. */ + if (current_volume != _playback.new_volume) { + if (current_time - last_volume_time > 10 * MS_TO_REFTIME) { + DEBUG(driver, 2, "DMusic thread: volume change"); + current_volume = _playback.new_volume; + last_volume_time = current_time; + for (int ch = 0; ch < 16; ch++) { + int vol = ScaleVolume(channel_volumes[ch], current_volume); + TransmitChannelMsg(_buffer, block_time + 1, MIDIST_CONTROLLER | ch, MIDICT_CHANVOLUME, vol); + } + _port->PlayBuffer(_buffer); + _buffer->Flush(); + } + } + + while (current_block < current_file.blocks.size()) { + MidiFile::DataBlock &block = current_file.blocks[current_block]; + + /* check that block isn't at end-of-song override */ + if (current_segment.end > 0 && block.ticktime >= current_segment.end) { + if (current_segment.loop) { + DEBUG(driver, 2, "DMusic thread: Looping song"); + current_block = current_segment.start_block; + playback_start_time = current_time - current_file.blocks[current_block].realtime * MIDITIME_TO_REFTIME; + } else { + _playback.do_stop = true; + } + next_timeout = 0; + break; + } + /* check that block is not in the future */ + REFERENCE_TIME playback_time = current_time - playback_start_time; + 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 %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 " 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(); + byte last_status = 0; + while (remaining > 0) { + /* MidiFile ought to have converted everything out of running status, + * but handle it anyway just to be safe */ + byte status = data[0]; + if (status & 0x80) { + last_status = status; + data++; + remaining--; + } else { + status = last_status; + } + switch (status & 0xF0) { + case MIDIST_PROGCHG: + case MIDIST_CHANPRESS: + /* 2 byte channel messages */ + TransmitChannelMsg(_buffer, block_time, status, data[0]); + data++; + remaining--; + break; + case MIDIST_NOTEOFF: + case MIDIST_NOTEON: + case MIDIST_POLYPRESS: + case MIDIST_PITCHBEND: + /* 3 byte channel messages */ + TransmitChannelMsg(_buffer, block_time, status, data[0], data[1]); + data += 2; + remaining -= 2; + break; + case MIDIST_CONTROLLER: + /* controller change */ + if (data[0] == MIDICT_CHANVOLUME) { + /* volume controller, adjust for user volume */ + channel_volumes[status & 0x0F] = data[1]; + int vol = ScaleVolume(data[1], current_volume); + TransmitChannelMsg(_buffer, block_time, status, data[0], vol); + } else { + /* handle other controllers normally */ + TransmitChannelMsg(_buffer, block_time, status, data[0], data[1]); + } + data += 2; + remaining -= 2; + break; + case 0xF0: + /* system messages */ + switch (status) { + case MIDIST_SYSEX: /* system exclusive */ + TransmitSysex(_buffer, block_time, data, remaining); + break; + case MIDIST_TC_QFRAME: /* time code quarter frame */ + case MIDIST_SONGSEL: /* song select */ + data++; + remaining--; + break; + case MIDIST_SONGPOSPTR: /* song position pointer */ + data += 2; + remaining -= 2; + break; + default: /* remaining have no data bytes */ + break; + } + break; + } + } + + current_block++; + } + + /* Anything in the playback buffer? Send it down the port. */ + DWORD used_buffer = 0; + _buffer->GetUsedBytes(&used_buffer); + if (used_buffer > 0) { + _port->PlayBuffer(_buffer); + _buffer->Flush(); + } + + /* end? */ + if (current_block == current_file.blocks.size()) { + if (current_segment.loop) { + current_block = current_segment.start_block; + playback_start_time = block_time - current_file.blocks[current_block].realtime * MIDITIME_TO_REFTIME; + } else { + _playback.do_stop = true; + } + next_timeout = 0; + } + } + } + + DEBUG(driver, 2, "DMusic: Exiting playback thread"); + + /* Turn all notes off and wait a bit to allow the messages to be handled by real hardware. */ + clock->GetTime(&cur_time); + TransmitNotesOff(_buffer, block_time, cur_time); + Sleep(_playback.preload_time * 4); + + clock->Release(); +} + +static void * DownloadArticulationData(int base_offset, void *data, const std::vector &artic) +{ + DMUS_ARTICULATION2 *art = (DMUS_ARTICULATION2 *)data; + art->ulArtIdx = base_offset + 1; + art->ulFirstExtCkIdx = 0; + art->ulNextArtIdx = 0; + + CONNECTIONLIST *con_list = (CONNECTIONLIST *)(art + 1); + con_list->cbSize = sizeof(CONNECTIONLIST); + con_list->cConnections = (ULONG)artic.size(); + MemCpyT((CONNECTION *)(con_list + 1), &artic.front(), artic.size()); + + return (CONNECTION *)(con_list + 1) + artic.size(); +} + +static const char *LoadDefaultDLSFile(const char *user_dls) +{ + DMUS_PORTCAPS caps; + MemSetT(&caps, 0); + caps.dwSize = sizeof(DMUS_PORTCAPS); + _port->GetCaps(&caps); + + /* Nothing to unless it is a synth with instrument download that doesn't come with GM voices by default. */ + if ((caps.dwFlags & (DMUS_PC_DLS | DMUS_PC_DLS2)) != 0 && (caps.dwFlags & DMUS_PC_GMINHARDWARE) == 0) { + DLSFile dls_file; + + if (user_dls == NULL) { + /* Try loading the default GM DLS file stored in the registry. */ + HKEY hkDM; + if (SUCCEEDED(RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\DirectMusic"), 0, KEY_READ, &hkDM))) { + TCHAR dls_path[MAX_PATH]; + DWORD buf_size = sizeof(dls_path); // Buffer size as to be given in bytes! + if (SUCCEEDED(RegQueryValueEx(hkDM, _T("GMFilePath"), NULL, NULL, (LPBYTE)dls_path, &buf_size))) { + TCHAR expand_path[MAX_PATH * 2]; + ExpandEnvironmentStrings(dls_path, expand_path, lengthof(expand_path)); + if (!dls_file.LoadFile(expand_path)) DEBUG(driver, 1, "Failed to load default GM DLS file from registry"); + } + RegCloseKey(hkDM); + } + + /* If we couldn't load the file from the registry, try again at the default install path of the GM DLS file. */ + if (dls_file.instruments.size() == 0) { + static const TCHAR *DLS_GM_FILE = _T("%windir%\\System32\\drivers\\gm.dls"); + TCHAR path[MAX_PATH]; + ExpandEnvironmentStrings(DLS_GM_FILE, path, lengthof(path)); + + if (!dls_file.LoadFile(path)) return "Can't load GM DLS collection"; + } + } else { + if (!dls_file.LoadFile(OTTD2FS(user_dls))) return "Can't load GM DLS collection"; + } + + /* Get download port and allocate download IDs. */ + IDirectMusicPortDownload *download_port = NULL; + if (FAILED(_port->QueryInterface(IID_IDirectMusicPortDownload, (LPVOID *)&download_port))) return "Can't get download port"; + + DWORD dlid_wave = 0, dlid_inst = 0; + if (FAILED(download_port->GetDLId(&dlid_wave, (DWORD)dls_file.waves.size())) || FAILED(download_port->GetDLId(&dlid_inst, (DWORD)dls_file.instruments.size()))) { + download_port->Release(); + return "Can't get enough DLS ids"; + } + + DWORD dwAppend = 0; + download_port->GetAppend(&dwAppend); + + /* Download wave data. */ + for (DWORD i = 0; i < dls_file.waves.size(); i++) { + IDirectMusicDownload *dl_wave = NULL; + if (FAILED(download_port->AllocateBuffer((DWORD)(sizeof(WAVE_DOWNLOAD) + dwAppend * dls_file.waves[i].fmt.wf.nBlockAlign + dls_file.waves[i].data.size()), &dl_wave))) { + download_port->Release(); + return "Can't allocate wave download buffer"; + } + + WAVE_DOWNLOAD *wave; + DWORD wave_size = 0; + if (FAILED(dl_wave->GetBuffer((LPVOID *)&wave, &wave_size))) { + dl_wave->Release(); + download_port->Release(); + return "Can't get wave download buffer"; + } + + /* Fill download data. */ + MemSetT(wave, 0); + wave->dlInfo.dwDLType = DMUS_DOWNLOADINFO_WAVE; + wave->dlInfo.cbSize = wave_size; + wave->dlInfo.dwDLId = dlid_wave + i; + wave->dlInfo.dwNumOffsetTableEntries = 2; + wave->ulOffsetTable[0] = offsetof(WAVE_DOWNLOAD, dmWave); + wave->ulOffsetTable[1] = offsetof(WAVE_DOWNLOAD, dmWaveData); + wave->dmWave.ulWaveDataIdx = 1; + MemCpyT((PCMWAVEFORMAT *)&wave->dmWave.WaveformatEx, &dls_file.waves[i].fmt, 1); + wave->dmWaveData.cbSize = (DWORD)dls_file.waves[i].data.size(); + MemCpyT(wave->dmWaveData.byData, &dls_file.waves[i].data[0], dls_file.waves[i].data.size()); + + _dls_downloads.push_back(dl_wave); + if (FAILED(download_port->Download(dl_wave))) { + download_port->Release(); + return "Downloading DLS wave failed"; + } + } + + /* Download instrument data. */ + for (DWORD i = 0; i < dls_file.instruments.size(); i++) { + DWORD offsets = 1 + (DWORD)dls_file.instruments[i].regions.size(); + + /* Calculate download size for the instrument. */ + size_t i_size = sizeof(DMUS_DOWNLOADINFO) + sizeof(DMUS_INSTRUMENT); + if (dls_file.instruments[i].articulators.size() > 0) { + /* Articulations are stored as two chunks, one containing meta data and one with the actual articulation data. */ + offsets += 2; + i_size += sizeof(DMUS_ARTICULATION2) + sizeof(CONNECTIONLIST) + sizeof(CONNECTION) * dls_file.instruments[i].articulators.size(); + } + + for (std::vector::iterator rgn = dls_file.instruments[i].regions.begin(); rgn != dls_file.instruments[i].regions.end(); rgn++) { + if (rgn->articulators.size() > 0) { + offsets += 2; + i_size += sizeof(DMUS_ARTICULATION2) + sizeof(CONNECTIONLIST) + sizeof(CONNECTION) * rgn->articulators.size(); + } + + /* Region size depends on the number of wave loops. The size of the + * declared structure already accounts for one loop. */ + if (rgn->wave_sample.cbSize != 0) { + i_size += sizeof(DMUS_REGION) - sizeof(DMUS_REGION::WLOOP) + sizeof(WLOOP) * rgn->wave_loops.size(); + } else { + i_size += sizeof(DMUS_REGION) - sizeof(DMUS_REGION::WLOOP) + sizeof(WLOOP) * dls_file.waves[dls_file.pool_cues[rgn->wave.ulTableIndex].ulOffset].wave_loops.size(); + } + } + + i_size += offsets * sizeof(ULONG); + + /* Allocate download buffer. */ + IDirectMusicDownload *dl_inst = NULL; + if (FAILED(download_port->AllocateBuffer((DWORD)i_size, &dl_inst))) { + download_port->Release(); + return "Can't allocate instrument download buffer"; + } + + void *instrument; + DWORD inst_size = 0; + if (FAILED(dl_inst->GetBuffer((LPVOID *)&instrument, &inst_size))) { + dl_inst->Release(); + download_port->Release(); + return "Can't get instrument download buffer"; + } + char *inst_base = (char *)instrument; + + /* Fill download header. */ + DMUS_DOWNLOADINFO *d_info = (DMUS_DOWNLOADINFO *)instrument; + d_info->dwDLType = DMUS_DOWNLOADINFO_INSTRUMENT2; + d_info->cbSize = inst_size; + d_info->dwDLId = dlid_inst + i; + d_info->dwNumOffsetTableEntries = offsets; + instrument = d_info + 1; + + /* Download offset table; contains the offsets of all chunks relative to the buffer start. */ + ULONG *offset_table = (ULONG *)instrument; + instrument = offset_table + offsets; + int last_offset = 0; + + /* Instrument header. */ + 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); + instrument = inst_data + 1; + + /* Write global articulations. */ + if (dls_file.instruments[i].articulators.size() > 0) { + inst_data->ulGlobalArtIdx = last_offset; + offset_table[last_offset++] = (char *)instrument - inst_base; + offset_table[last_offset++] = (char *)instrument + sizeof(DMUS_ARTICULATION2) - inst_base; + + instrument = DownloadArticulationData(inst_data->ulGlobalArtIdx, instrument, dls_file.instruments[i].articulators); + assert((char *)instrument - inst_base <= (ptrdiff_t)inst_size); + } + + /* Write out regions. */ + inst_data->ulFirstRegionIdx = last_offset; + for (uint j = 0; j < dls_file.instruments[i].regions.size(); j++) { + DLSFile::DLSRegion &rgn = dls_file.instruments[i].regions[j]; + + DMUS_REGION *inst_region = (DMUS_REGION *)instrument; + offset_table[last_offset++] = (char *)inst_region - inst_base; + inst_region->RangeKey = rgn.hdr.RangeKey; + inst_region->RangeVelocity = rgn.hdr.RangeVelocity; + inst_region->fusOptions = rgn.hdr.fusOptions; + inst_region->usKeyGroup = rgn.hdr.usKeyGroup; + inst_region->ulFirstExtCkIdx = 0; + + ULONG wave_id = dls_file.pool_cues[rgn.wave.ulTableIndex].ulOffset; + inst_region->WaveLink = rgn.wave; + inst_region->WaveLink.ulTableIndex = wave_id + dlid_wave; + + /* The wave sample data will be taken from the region, if defined, otherwise from the wave itself. */ + if (rgn.wave_sample.cbSize != 0) { + inst_region->WSMP = rgn.wave_sample; + if (rgn.wave_loops.size() > 0) MemCpyT(inst_region->WLOOP, &rgn.wave_loops.front(), rgn.wave_loops.size()); + + instrument = (char *)(inst_region + 1) - sizeof(DMUS_REGION::WLOOP) + sizeof(WLOOP) * rgn.wave_loops.size(); + } else { + inst_region->WSMP = rgn.wave_sample; + if (dls_file.waves[wave_id].wave_loops.size() > 0) MemCpyT(inst_region->WLOOP, &dls_file.waves[wave_id].wave_loops.front(), dls_file.waves[wave_id].wave_loops.size()); + + instrument = (char *)(inst_region + 1) - sizeof(DMUS_REGION::WLOOP) + sizeof(WLOOP) * dls_file.waves[wave_id].wave_loops.size(); + } + + /* Write local articulator data. */ + if (rgn.articulators.size() > 0) { + inst_region->ulRegionArtIdx = last_offset; + offset_table[last_offset++] = (char *)instrument - inst_base; + offset_table[last_offset++] = (char *)instrument + sizeof(DMUS_ARTICULATION2) - inst_base; + + instrument = DownloadArticulationData(inst_region->ulRegionArtIdx, instrument, rgn.articulators); + } else { + inst_region->ulRegionArtIdx = 0; + } + assert((char *)instrument - inst_base <= (ptrdiff_t)inst_size); + + /* Link to the next region unless this was the last one.*/ + inst_region->ulNextRegionIdx = j < dls_file.instruments[i].regions.size() - 1 ? last_offset : 0; + } + + _dls_downloads.push_back(dl_inst); + if (FAILED(download_port->Download(dl_inst))) { + download_port->Release(); + return "Downloading DLS instrument failed"; + } + } + + download_port->Release(); + } + + return NULL; +} const char *MusicDriver_DMusic::Start(const char * const *parm) { - if (performance != NULL) return NULL; - - if (proc.CoCreateInstance == NULL) { - if (!LoadLibraryList((Function*)&proc, ole_files)) { - return "ole32.dll load failed"; - } - } - /* Initialize COM */ - if (FAILED(proc.CoInitialize(NULL))) { - return "COM initialization failed"; - } + if (FAILED(CoInitializeEx(NULL, COINITBASE_MULTITHREADED))) return "COM initialization failed"; - /* create the performance object */ - if (FAILED(proc.CoCreateInstance( - CLSID_DirectMusicPerformance, + /* Create the DirectMusic object */ + if (FAILED(CoCreateInstance( + CLSID_DirectMusic, NULL, CLSCTX_INPROC, - IID_IDirectMusicPerformance, - (LPVOID*)&performance + IID_IDirectMusic, + (LPVOID*)&_music ))) { - return "Failed to create the performance object"; + return "Failed to create the music object"; } - /* initialize it */ - if (FAILED(performance->Init(&music, NULL, NULL))) { - return "Failed to initialize performance object"; - } + /* Assign sound output device. */ + if (FAILED(_music->SetDirectSound(NULL, NULL))) return "Can't set DirectSound interface"; - int port = GetDriverParamInt(parm, "port", -1); + /* MIDI events need to be send to the synth in time before their playback time + * has come. By default, we try send any events at least 50 ms before playback. */ + _playback.preload_time = GetDriverParamInt(parm, "preload", 50); -#ifndef NO_DEBUG_MESSAGES + int pIdx = GetDriverParamInt(parm, "port", -1); if (_debug_driver_level > 0) { /* Print all valid output ports. */ char desc[DMUS_MAX_DESCRIPTION]; @@ -109,70 +1121,56 @@ const char *MusicDriver_DMusic::Start(const char * const *parm) caps.dwSize = sizeof(DMUS_PORTCAPS); DEBUG(driver, 1, "Detected DirectMusic ports:"); - for (int i = 0; music->EnumPort(i, &caps) == S_OK; i++) { + for (int i = 0; _music->EnumPort(i, &caps) == S_OK; i++) { if (caps.dwClass == DMUS_PC_OUTPUTCLASS) { /* Description is UNICODE even for ANSI build. */ - DEBUG(driver, 1, " %d: %s%s", i, convert_from_fs(caps.wszDescription, desc, lengthof(desc)), i == port ? " (selected)" : ""); + DEBUG(driver, 1, " %d: %s%s", i, convert_from_fs(caps.wszDescription, desc, lengthof(desc)), i == pIdx ? " (selected)" : ""); } } } -#endif - IDirectMusicPort *music_port = NULL; // NULL means 'use default port'. - - if (port >= 0) { + GUID guidPort; + if (pIdx >= 0) { /* Check if the passed port is a valid port. */ DMUS_PORTCAPS caps; MemSetT(&caps, 0); caps.dwSize = sizeof(DMUS_PORTCAPS); - if (FAILED(music->EnumPort(port, &caps))) return "Supplied port parameter is not a valid port"; + if (FAILED(_music->EnumPort(pIdx, &caps))) return "Supplied port parameter is not a valid port"; if (caps.dwClass != DMUS_PC_OUTPUTCLASS) return "Supplied port parameter is not an output port"; - - /* Create new port. */ - DMUS_PORTPARAMS params; - MemSetT(¶ms, 0); - params.dwSize = sizeof(DMUS_PORTPARAMS); - params.dwValidParams = DMUS_PORTPARAMS_CHANNELGROUPS; - params.dwChannelGroups = 1; - - if (FAILED(music->CreatePort(caps.guidPort, ¶ms, &music_port, NULL))) { - return "Failed to create port"; - } - - /* Activate port. */ - if (FAILED(music_port->Activate(TRUE))) { - music_port->Release(); - return "Failed to activate port"; - } + guidPort = caps.guidPort; + } else { + if (FAILED(_music->GetDefaultPort(&guidPort))) return "Can't query default music port"; } - /* Add port to performance. */ - if (FAILED(performance->AddPort(music_port))) { - if (music_port != NULL) music_port->Release(); - return "AddPort failed"; - } + /* Create new port. */ + DMUS_PORTPARAMS params; + MemSetT(¶ms, 0); + params.dwSize = sizeof(DMUS_PORTPARAMS); + params.dwValidParams = DMUS_PORTPARAMS_CHANNELGROUPS; + params.dwChannelGroups = 1; + if (FAILED(_music->CreatePort(guidPort, ¶ms, &_port, NULL))) return "Failed to create port"; + /* Activate port. */ + if (FAILED(_port->Activate(TRUE))) return "Failed to activate port"; - /* Assign a performance channel block to the performance if we added - * a custom port to the performance. */ - if (music_port != NULL) { - if (FAILED(performance->AssignPChannelBlock(0, music_port, 1))) { - music_port->Release(); - return "Failed to assign PChannel block"; - } - /* We don't need the port anymore. */ - music_port->Release(); - } + /* Create playback buffer. */ + DMUS_BUFFERDESC desc; + MemSetT(&desc, 0); + desc.dwSize = sizeof(DMUS_BUFFERDESC); + desc.guidBufferFormat = KSDATAFORMAT_SUBTYPE_DIRECTMUSIC; + desc.cbBuffer = 1024; + if (FAILED(_music->CreateMusicBuffer(&desc, &_buffer, NULL))) return "Failed to create music buffer"; - /* create the loader object; this will be used to load the MIDI file */ - if (FAILED(proc.CoCreateInstance( - CLSID_DirectMusicLoader, - NULL, - CLSCTX_INPROC, - IID_IDirectMusicLoader, - (LPVOID*)&loader - ))) { - return "Failed to create loader object"; - } + /* On soft-synths (e.g. the default DirectMusic one), we might need to load a wavetable set to get music. */ + const char *dls = LoadDefaultDLSFile(GetDriverParam(parm, "dls")); + if (dls != NULL) return dls; + + /* Create playback thread and synchronization primitives. */ + _thread_event = CreateEvent(NULL, FALSE, FALSE, NULL); + if (_thread_event == NULL) return "Can't create thread shutdown event"; + _thread_mutex = ThreadMutex::New(); + if (_thread_mutex == NULL) return "Can't create thread mutex"; + + if (!ThreadObject::New(&MidiThreadProc, this, &_dmusic_thread, "ottd:dmusic")) return "Can't create MIDI output thread"; return NULL; } @@ -186,114 +1184,82 @@ MusicDriver_DMusic::~MusicDriver_DMusic() void MusicDriver_DMusic::Stop() { - seeking = false; - - if (performance != NULL) performance->Stop(NULL, NULL, 0, 0); - - if (segment != NULL) { - segment->SetParam(GUID_Unload, 0xFFFFFFFF, 0, 0, performance); - segment->Release(); - segment = NULL; + if (_dmusic_thread != NULL) { + _playback.shutdown = true; + SetEvent(_thread_event); + _dmusic_thread->Join(); } - if (music != NULL) { - music->Release(); - music = NULL; + /* Unloaded any instruments we loaded. */ + if (_dls_downloads.size() > 0) { + IDirectMusicPortDownload *download_port = NULL; + _port->QueryInterface(IID_IDirectMusicPortDownload, (LPVOID *)&download_port); + + /* Instruments refer to waves. As the waves are at the beginning of the download list, + * do the unload from the back so that references are cleared properly. */ + for (std::vector::reverse_iterator i = _dls_downloads.rbegin(); download_port != NULL && i != _dls_downloads.rend(); i++) { + download_port->Unload(*i); + (*i)->Release(); + } + _dls_downloads.clear(); + + if (download_port != NULL) download_port->Release(); } - if (performance != NULL) { - performance->CloseDown(); - performance->Release(); - performance = NULL; + if (_buffer != NULL) { + _buffer->Release(); + _buffer = NULL; } - if (loader != NULL) { - loader->Release(); - loader = NULL; + if (_port != NULL) { + _port->Activate(FALSE); + _port->Release(); + _port = NULL; } - proc.CoUninitialize(); + if (_music != NULL) { + _music->Release(); + _music = NULL; + } + + CloseHandle(_thread_event); + delete _thread_mutex; + + CoUninitialize(); } -void MusicDriver_DMusic::PlaySong(const char *filename) +void MusicDriver_DMusic::PlaySong(const MusicSongInfo &song) { - /* set up the loader object info */ - DMUS_OBJECTDESC obj_desc; - ZeroMemory(&obj_desc, sizeof(obj_desc)); - obj_desc.dwSize = sizeof(obj_desc); - obj_desc.guidClass = CLSID_DirectMusicSegment; - obj_desc.dwValidData = DMUS_OBJ_CLASS | DMUS_OBJ_FILENAME | DMUS_OBJ_FULLPATH; - MultiByteToWideChar( - CP_ACP, MB_PRECOMPOSED, - filename, -1, - obj_desc.wszFileName, lengthof(obj_desc.wszFileName) - ); + ThreadMutexLocker lock(_thread_mutex); - /* release the existing segment if we have any */ - if (segment != NULL) { - segment->Release(); - segment = NULL; - } + if (!_playback.next_file.LoadSong(song)) return; - /* make a new segment */ - if (FAILED(loader->GetObject( - &obj_desc, IID_IDirectMusicSegment, (LPVOID*)&segment - ))) { - DEBUG(driver, 0, "DirectMusic: GetObject failed"); - return; - } + _playback.next_segment.start = song.override_start; + _playback.next_segment.end = song.override_end; + _playback.next_segment.loop = song.loop; - /* tell the segment what kind of data it contains */ - if (FAILED(segment->SetParam( - GUID_StandardMIDIFile, 0xFFFFFFFF, 0, 0, performance - ))) { - DEBUG(driver, 0, "DirectMusic: SetParam (MIDI file) failed"); - return; - } - - /* tell the segment to 'download' the instruments */ - if (FAILED(segment->SetParam(GUID_Download, 0xFFFFFFFF, 0, 0, performance))) { - DEBUG(driver, 0, "DirectMusic: failed to download instruments"); - return; - } - - /* start playing the MIDI file */ - if (FAILED(performance->PlaySegment(segment, 0, 0, NULL))) { - DEBUG(driver, 0, "DirectMusic: PlaySegment failed"); - return; - } - - seeking = true; + _playback.do_start = true; + SetEvent(_thread_event); } void MusicDriver_DMusic::StopSong() { - if (FAILED(performance->Stop(segment, NULL, 0, 0))) { - DEBUG(driver, 0, "DirectMusic: StopSegment failed"); - } - seeking = false; + _playback.do_stop = true; + SetEvent(_thread_event); } bool MusicDriver_DMusic::IsSongPlaying() { - /* Not the nicest code, but there is a short delay before playing actually - * starts. OpenTTD makes no provision for this. */ - if (performance->IsPlaying(segment, NULL) == S_OK) { - seeking = false; - return true; - } else { - return seeking; - } + return _playback.playing || _playback.do_start; } void MusicDriver_DMusic::SetVolume(byte vol) { - long db = vol * 2000 / 127 - 2000; ///< 0 - 127 -> -2000 - 0 - performance->SetGlobalParam(GUID_PerfMasterVolume, &db, sizeof(db)); + _playback.new_volume = vol; } diff --git a/src/music/dmusic.h b/src/music/dmusic.h index 7287623e48..527e064e49 100644 --- a/src/music/dmusic.h +++ b/src/music/dmusic.h @@ -23,7 +23,7 @@ public: /* virtual */ void Stop(); - /* virtual */ void PlaySong(const char *filename); + /* virtual */ void PlaySong(const MusicSongInfo &song); /* virtual */ void StopSong(); diff --git a/src/music/extmidi.cpp b/src/music/extmidi.cpp index f4a35360c0..9d07761b73 100644 --- a/src/music/extmidi.cpp +++ b/src/music/extmidi.cpp @@ -12,10 +12,13 @@ #include "../stdafx.h" #include "../debug.h" #include "../string_func.h" +#include "../core/alloc_func.hpp" #include "../sound/sound_driver.hpp" #include "../video/video_driver.hpp" #include "../gfx_func.h" #include "extmidi.h" +#include "../base_media_base.h" +#include "midifile.hpp" #include #include #include @@ -42,9 +45,33 @@ const char *MusicDriver_ExtMidi::Start(const char * const * parm) } const char *command = GetDriverParam(parm, "cmd"); +#ifndef MIDI_ARG if (StrEmpty(command)) command = EXTERNAL_PLAYER; +#else + if (StrEmpty(command)) command = EXTERNAL_PLAYER " " MIDI_ARG; +#endif + + /* Count number of arguments, but include 3 extra slots: 1st for command, 2nd for song title, and 3rd for terminating NULL. */ + uint num_args = 3; + for (const char *t = command; *t != '\0'; t++) if (*t == ' ') num_args++; + + this->params = CallocT(num_args); + this->params[0] = stredup(command); + + /* Replace space with \0 and add next arg to params */ + uint p = 1; + while (true) { + this->params[p] = strchr(this->params[p - 1], ' '); + if (this->params[p] == NULL) break; + + this->params[p][0] = '\0'; + this->params[p]++; + p++; + } + + /* Last parameter is the song file. */ + this->params[p] = this->song; - this->command = stredup(command); this->song[0] = '\0'; this->pid = -1; return NULL; @@ -52,15 +79,19 @@ const char *MusicDriver_ExtMidi::Start(const char * const * parm) void MusicDriver_ExtMidi::Stop() { - free(command); + free(params[0]); + free(params); this->song[0] = '\0'; this->DoStop(); } -void MusicDriver_ExtMidi::PlaySong(const char *filename) +void MusicDriver_ExtMidi::PlaySong(const MusicSongInfo &song) { - strecpy(this->song, filename, lastof(this->song)); - this->DoStop(); + std::string filename = MidiFile::GetSMFFile(song); + if (!filename.empty()) { + strecpy(this->song, filename.c_str(), lastof(this->song)); + this->DoStop(); + } } void MusicDriver_ExtMidi::StopSong() @@ -91,18 +122,14 @@ void MusicDriver_ExtMidi::DoPlay() close(0); int d = open("/dev/null", O_RDONLY); if (d != -1 && dup2(d, 1) != -1 && dup2(d, 2) != -1) { - #if defined(MIDI_ARG) - execlp(this->command, "extmidi", MIDI_ARG, this->song, (char*)0); - #else - execlp(this->command, "extmidi", this->song, (char*)0); - #endif + execvp(this->params[0], this->params); } _exit(1); } case -1: DEBUG(driver, 0, "extmidi: couldn't fork: %s", strerror(errno)); - /* FALL THROUGH */ + FALLTHROUGH; default: this->song[0] = '\0'; diff --git a/src/music/extmidi.h b/src/music/extmidi.h index c6a9e08f8d..e174dc9b08 100644 --- a/src/music/extmidi.h +++ b/src/music/extmidi.h @@ -16,7 +16,7 @@ class MusicDriver_ExtMidi : public MusicDriver { private: - char *command; + char **params; char song[MAX_PATH]; pid_t pid; @@ -28,7 +28,7 @@ public: /* virtual */ void Stop(); - /* virtual */ void PlaySong(const char *filename); + /* virtual */ void PlaySong(const MusicSongInfo &song); /* virtual */ void StopSong(); 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/libtimidity.cpp b/src/music/libtimidity.cpp index 1cb2adc0f9..42c1e3c155 100644 --- a/src/music/libtimidity.cpp +++ b/src/music/libtimidity.cpp @@ -14,6 +14,8 @@ #include "../sound_type.h" #include "../debug.h" #include "libtimidity.h" +#include "midifile.hpp" +#include "../base_media_base.h" #include #include #include @@ -22,9 +24,6 @@ #include #include #include -#if defined(PSP) -#include -#endif /* PSP */ #include "../safeguards.h" @@ -44,16 +43,6 @@ static struct { uint32 song_position; } _midi; ///< Metadata about the midi we're playing. -#if defined(PSP) -static void AudioOutCallback(void *buf, unsigned int _reqn, void *userdata) -{ - memset(buf, 0, _reqn * PSP_NUM_AUDIO_CHANNELS); - if (_midi.status == MIDI_PLAYING) { - mid_song_read_wave(_midi.song, buf, _reqn * PSP_NUM_AUDIO_CHANNELS); - } -} -#endif /* PSP */ - /** Factory for the libtimidity driver. */ static FMusicDriver_LibTimidity iFMusicDriver_LibTimidity; @@ -75,17 +64,7 @@ const char *MusicDriver_LibTimidity::Start(const char * const *param) _midi.options.rate = 44100; _midi.options.format = MID_AUDIO_S16LSB; _midi.options.channels = 2; -#if defined(PSP) - _midi.options.buffer_size = PSP_NUM_AUDIO_SAMPLES; -#else _midi.options.buffer_size = _midi.options.rate; -#endif - -#if defined(PSP) - pspAudioInit(); - pspAudioSetChannelCallback(_midi.options.channels, &AudioOutCallback, NULL); - pspAudioSetVolume(_midi.options.channels, PSP_VOLUME_MAX, PSP_VOLUME_MAX); -#endif /* PSP */ return NULL; } @@ -96,11 +75,14 @@ void MusicDriver_LibTimidity::Stop() mid_exit(); } -void MusicDriver_LibTimidity::PlaySong(const char *filename) +void MusicDriver_LibTimidity::PlaySong(const MusicSongInfo &song) { - this->StopSong(); + std::string filename = MidiFile::GetSMFFile(song); - _midi.stream = mid_istream_open_file(filename); + this->StopSong(); + if (filename.empty()) return; + + _midi.stream = mid_istream_open_file(filename.c_str()); if (_midi.stream == NULL) { DEBUG(driver, 0, "Could not open music file"); return; diff --git a/src/music/libtimidity.h b/src/music/libtimidity.h index abe17e7703..badb05bab2 100644 --- a/src/music/libtimidity.h +++ b/src/music/libtimidity.h @@ -21,7 +21,7 @@ public: /* virtual */ void Stop(); - /* virtual */ void PlaySong(const char *filename); + /* virtual */ void PlaySong(const MusicSongInfo &song); /* virtual */ void StopSong(); diff --git a/src/music/midi.h b/src/music/midi.h new file mode 100644 index 0000000000..473f7f18bb --- /dev/null +++ b/src/music/midi.h @@ -0,0 +1,144 @@ +/* $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 midi.h Declarations for MIDI data */ + +#ifndef MUSIC_MIDI_H +#define MUSIC_MIDI_H + +#include "../stdafx.h" + +/** Header of a Stanard MIDI File */ +struct SMFHeader { + uint16 format; + uint16 tracks; + uint16 tickdiv; +}; + +/** MIDI status byte codes */ +enum MidiStatus { + /* Bytes with top bit unset are data bytes i.e. not status bytes */ + /* Channel status messages, require channel number in lower nibble */ + MIDIST_NOTEOFF = 0x80, + MIDIST_NOTEON = 0x90, + MIDIST_POLYPRESS = 0xA0, + MIDIST_CONTROLLER = 0xB0, + MIDIST_PROGCHG = 0xC0, + MIDIST_CHANPRESS = 0xD0, + MIDIST_PITCHBEND = 0xE0, + /* Full byte status messages */ + MIDIST_SYSEX = 0xF0, + MIDIST_TC_QFRAME = 0xF1, + MIDIST_SONGPOSPTR = 0xF2, + MIDIST_SONGSEL = 0xF3, + /* not defined: 0xF4, */ + /* not defined: 0xF5, */ + MIDIST_TUNEREQ = 0xF6, + MIDIST_ENDSYSEX = 0xF7, ///< only occurs in realtime data + MIDIST_SMF_ESCAPE = 0xF7, ///< only occurs in SMF data + MIDIST_RT_CLOCK = 0xF8, + /* not defined: 0xF9, */ + MIDIST_RT_START = 0xFA, + MIDIST_RT_CONTINUE = 0xFB, + MIDIST_RT_STOP = 0xFC, + /* not defined: 0xFD, */ + MIDIST_RT_ACTSENS = 0xFE, + MIDIST_SYSRESET = 0xFF, ///< only occurs in realtime data + MIDIST_SMF_META = 0xFF, ///< only occurs in SMF data +}; + +/** + * MIDI controller numbers. + * Complete list per General MIDI, missing values are not defined. + */ +enum MidiController { + /* Standard continuous controllers (MSB control) */ + MIDICT_BANKSELECT = 0, + MIDICT_MODWHEEL = 1, + MIDICT_BREATH = 2, + MIDICT_FOOT = 4, + MIDICT_PORTAMENTO = 5, + MIDICT_DATAENTRY = 6, + MIDICT_CHANVOLUME = 7, + MIDICT_BALANCE = 8, + MIDICT_PAN = 10, + MIDICT_EXPRESSION = 11, + MIDICT_EFFECT1 = 12, + MIDICT_EFFECT2 = 13, + MIDICT_GENERAL1 = 16, + MIDICT_GENERAL2 = 17, + MIDICT_GENERAL3 = 18, + MIDICT_GENERAL4 = 19, + /* Offset from MSB to LSB of continuous controllers */ + MIDICTOFS_HIGHRES = 32, + /* Stanard continuous controllers (LSB control) */ + MIDICT_BANKSELECT_LO = MIDICTOFS_HIGHRES + MIDICT_BANKSELECT, + MIDICT_MODWHEEL_LO = MIDICTOFS_HIGHRES + MIDICT_MODWHEEL, + MIDICT_BREATH_LO = MIDICTOFS_HIGHRES + MIDICT_BREATH, + MIDICT_FOOT_LO = MIDICTOFS_HIGHRES + MIDICT_FOOT, + MIDICT_PORTAMENTO_LO = MIDICTOFS_HIGHRES + MIDICT_PORTAMENTO, + MIDICT_DATAENTRY_LO = MIDICTOFS_HIGHRES + MIDICT_DATAENTRY, + MIDICT_CHANVOLUME_LO = MIDICTOFS_HIGHRES + MIDICT_CHANVOLUME, + MIDICT_BALANCE_LO = MIDICTOFS_HIGHRES + MIDICT_BALANCE, + MIDICT_PAN_LO = MIDICTOFS_HIGHRES + MIDICT_PAN, + MIDICT_EXPRESSION_LO = MIDICTOFS_HIGHRES + MIDICT_EXPRESSION, + MIDICT_EFFECT1_LO = MIDICTOFS_HIGHRES + MIDICT_EFFECT1, + MIDICT_EFFECT2_LO = MIDICTOFS_HIGHRES + MIDICT_EFFECT2, + MIDICT_GENERAL1_LO = MIDICTOFS_HIGHRES + MIDICT_GENERAL1, + MIDICT_GENERAL2_LO = MIDICTOFS_HIGHRES + MIDICT_GENERAL2, + MIDICT_GENERAL3_LO = MIDICTOFS_HIGHRES + MIDICT_GENERAL3, + MIDICT_GENERAL4_LO = MIDICTOFS_HIGHRES + MIDICT_GENERAL4, + /* Switch controllers */ + MIDICT_SUSTAINSW = 64, + MIDICT_PORTAMENTOSW = 65, + MIDICT_SOSTENUTOSW = 66, + MIDICT_SOFTPEDALSW = 67, + MIDICT_LEGATOSW = 68, + MIDICT_HOLD2SW = 69, + /* Standard low-resolution controllers */ + MIDICT_SOUND1 = 70, + MIDICT_SOUND2 = 71, + MIDICT_SOUND3 = 72, + MIDICT_SOUND4 = 73, + MIDICT_SOUND5 = 74, + MIDICT_SOUND6 = 75, + MIDICT_SOUND7 = 76, + MIDICT_SOUND8 = 77, + MIDICT_SOUND9 = 78, + MIDICT_SOUND10 = 79, + MIDICT_GENERAL5 = 80, + MIDICT_GENERAL6 = 81, + MIDICT_GENERAL7 = 82, + MIDICT_GENERAL8 = 83, + MIDICT_PORTAMENTOCTL = 84, + MIDICT_PRF_HIGHRESVEL = 88, + MIDICT_EFFECTS1 = 91, + MIDICT_EFFECTS2 = 92, + MIDICT_EFFECTS3 = 93, + MIDICT_EFFECTS4 = 94, + MIDICT_EFFECTS5 = 95, + /* Registered/unregistered parameters control */ + MIDICT_DATA_INCREMENT = 96, + MIDICT_DATA_DECREMENT = 97, + MIDICT_NRPN_SELECT_LO = 98, + MIDICT_NRPN_SELECT_HI = 99, + MIDICT_RPN_SELECT_LO = 100, + MIDICT_RPN_SELECT_HI = 101, + /* Channel mode messages */ + MIDICT_MODE_ALLSOUNDOFF = 120, + MIDICT_MODE_RESETALLCTRL = 121, + MIDICT_MODE_LOCALCTL = 122, + MIDICT_MODE_ALLNOTESOFF = 123, + MIDICT_MODE_OMNI_OFF = 124, + MIDICT_MODE_OMNI_ON = 125, + MIDICT_MODE_MONO = 126, + MIDICT_MODE_POLY = 127, +}; + +#endif /* MUSIC_MIDI_H */ diff --git a/src/music/midifile.cpp b/src/music/midifile.cpp new file mode 100644 index 0000000000..91f83c529d --- /dev/null +++ b/src/music/midifile.cpp @@ -0,0 +1,1127 @@ +/* $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 midifile.cpp Parser for standard MIDI files */ + +#include "midifile.hpp" +#include "../fileio_func.h" +#include "../fileio_type.h" +#include "../string_func.h" +#include "../core/endian_func.hpp" +#include "../base_media_base.h" +#include "midi.h" +#include + +#include "../console_func.h" +#include "../console_internal.h" + + +/* SMF reader based on description at: http://www.somascape.org/midi/tech/mfile.html */ + + +static MidiFile *_midifile_instance = NULL; + +/** + * Owning byte buffer readable as a stream. + * RAII-compliant to make teardown in error situations easier. + */ +class ByteBuffer { + byte *buf; + size_t buflen; + size_t pos; +public: + /** + * Construct buffer from data in a file. + * If file does not have sufficient bytes available, the object is constructed + * in an error state, that causes all further function calls to fail. + * @param file file to read from at current position + * @param len number of bytes to read + */ + ByteBuffer(FILE *file, size_t len) + { + this->buf = MallocT(len); + if (fread(this->buf, 1, len, file) == len) { + this->buflen = len; + this->pos = 0; + } else { + /* invalid state */ + this->buflen = 0; + } + } + + /** + * Destructor, frees the buffer. + */ + ~ByteBuffer() + { + free(this->buf); + } + + /** + * Return whether the buffer was constructed successfully. + * @return true is the buffer contains data + */ + bool IsValid() const + { + return this->buflen > 0; + } + + /** + * Return whether reading has reached the end of the buffer. + * @return true if there are no more bytes available to read + */ + bool IsEnd() const + { + return this->pos >= this->buflen; + } + + /** + * Read a single byte from the buffer. + * @param[out] b returns the read value + * @return true if a byte was available for reading + */ + bool ReadByte(byte &b) + { + if (this->IsEnd()) return false; + b = this->buf[this->pos++]; + return true; + } + + /** + * Read a MIDI file variable length value. + * Each byte encodes 7 bits of the value, most-significant bits are encoded first. + * If the most significant bit in a byte is set, there are further bytes encoding the value. + * @param[out] res returns the read value + * @return true if there was data available + */ + bool ReadVariableLength(uint32 &res) + { + res = 0; + byte b = 0; + do { + if (this->IsEnd()) return false; + b = this->buf[this->pos++]; + res = (res << 7) | (b & 0x7F); + } while (b & 0x80); + return true; + } + + /** + * Read bytes into a buffer. + * @param[out] dest buffer to copy info + * @param length number of bytes to read + * @return true if the requested number of bytes were available + */ + bool ReadBuffer(byte *dest, size_t length) + { + if (this->IsEnd()) return false; + if (this->buflen - this->pos < length) return false; + memcpy(dest, this->buf + this->pos, length); + this->pos += length; + return true; + } + + /** + * Skip over a number of bytes in the buffer. + * @param count number of bytes to skip over + * @return true if there were enough bytes available + */ + bool Skip(size_t count) + { + if (this->IsEnd()) return false; + if (this->buflen - this->pos < count) return false; + this->pos += count; + return true; + } + + /** + * Go a number of bytes back to re-read. + * @param count number of bytes to go back + * @return true if at least count bytes had been read previously + */ + bool Rewind(size_t count) + { + if (count > this->pos) return false; + this->pos -= count; + return true; + } +}; + +static bool ReadTrackChunk(FILE *file, MidiFile &target) +{ + byte buf[4]; + + const byte magic[] = { 'M', 'T', 'r', 'k' }; + if (fread(buf, sizeof(magic), 1, file) != 1) { + return false; + } + if (memcmp(magic, buf, sizeof(magic)) != 0) { + return false; + } + + /* Read chunk length and then the whole chunk */ + uint32 chunk_length; + if (fread(&chunk_length, 1, 4, file) != 4) { + return false; + } + chunk_length = FROM_BE32(chunk_length); + + ByteBuffer chunk(file, chunk_length); + if (!chunk.IsValid()) { + return false; + } + + target.blocks.push_back(MidiFile::DataBlock()); + MidiFile::DataBlock *block = &target.blocks.back(); + + byte last_status = 0; + bool running_sysex = false; + while (!chunk.IsEnd()) { + /* Read deltatime for event, start new block */ + uint32 deltatime = 0; + if (!chunk.ReadVariableLength(deltatime)) { + return false; + } + if (deltatime > 0) { + target.blocks.push_back(MidiFile::DataBlock(block->ticktime + deltatime)); + block = &target.blocks.back(); + } + + /* Read status byte */ + byte status; + if (!chunk.ReadByte(status)) { + return false; + } + + if ((status & 0x80) == 0) { + /* High bit not set means running status message, status is same as last + * convert to explicit status */ + chunk.Rewind(1); + status = last_status; + goto running_status; + } else if ((status & 0xF0) != 0xF0) { + /* Regular channel message */ + last_status = status; + running_status: + byte *data; + switch (status & 0xF0) { + case MIDIST_NOTEOFF: + case MIDIST_NOTEON: + case MIDIST_POLYPRESS: + case MIDIST_CONTROLLER: + case MIDIST_PITCHBEND: + /* 3 byte messages */ + data = block->data.Append(3); + data[0] = status; + if (!chunk.ReadBuffer(&data[1], 2)) { + return false; + } + break; + case MIDIST_PROGCHG: + case MIDIST_CHANPRESS: + /* 2 byte messages */ + data = block->data.Append(2); + data[0] = status; + if (!chunk.ReadByte(data[1])) { + return false; + } + break; + default: + NOT_REACHED(); + } + } else if (status == MIDIST_SMF_META) { + /* Meta event, read event type byte and data length */ + if (!chunk.ReadByte(buf[0])) { + return false; + } + uint32 length = 0; + if (!chunk.ReadVariableLength(length)) { + return false; + } + switch (buf[0]) { + case 0x2F: + /* end of track, no more data (length != 0 is illegal) */ + return (length == 0); + case 0x51: + /* tempo change */ + if (length != 3) return false; + if (!chunk.ReadBuffer(buf, 3)) return false; + target.tempos.push_back(MidiFile::TempoChange(block->ticktime, buf[0] << 16 | buf[1] << 8 | buf[2])); + break; + default: + /* unimportant meta event, skip over it */ + if (!chunk.Skip(length)) { + return false; + } + break; + } + } else if (status == MIDIST_SYSEX || (status == MIDIST_SMF_ESCAPE && running_sysex)) { + /* System exclusive message */ + uint32 length = 0; + if (!chunk.ReadVariableLength(length)) { + return false; + } + byte *data = block->data.Append(length + 1); + data[0] = 0xF0; + if (!chunk.ReadBuffer(data + 1, length)) { + return false; + } + if (data[length] != 0xF7) { + /* Engage Casio weirdo mode - convert to normal sysex */ + running_sysex = true; + *block->data.Append() = 0xF7; + } else { + running_sysex = false; + } + } else if (status == MIDIST_SMF_ESCAPE) { + /* Escape sequence */ + uint32 length = 0; + if (!chunk.ReadVariableLength(length)) { + return false; + } + byte *data = block->data.Append(length); + if (!chunk.ReadBuffer(data, length)) { + return false; + } + } else { + /* Messages undefined in standard midi files: + * 0xF1 - MIDI time code quarter frame + * 0xF2 - Song position pointer + * 0xF3 - Song select + * 0xF4 - undefined/reserved + * 0xF5 - undefined/reserved + * 0xF6 - Tune request for analog synths + * 0xF8..0xFE - System real-time messages + */ + return false; + } + } + + NOT_REACHED(); +} + +template +bool TicktimeAscending(const T &a, const T &b) +{ + return a.ticktime < b.ticktime; +} + +static bool FixupMidiData(MidiFile &target) +{ + /* Sort all tempo changes and events */ + std::sort(target.tempos.begin(), target.tempos.end(), TicktimeAscending); + std::sort(target.blocks.begin(), target.blocks.end(), TicktimeAscending); + + if (target.tempos.size() == 0) { + /* No tempo information, assume 120 bpm (500,000 microseconds per beat */ + target.tempos.push_back(MidiFile::TempoChange(0, 500000)); + } + /* Add sentinel tempo at end */ + target.tempos.push_back(MidiFile::TempoChange(UINT32_MAX, 0)); + + /* Merge blocks with identical tick times */ + std::vector merged_blocks; + uint32 last_ticktime = 0; + for (size_t i = 0; i < target.blocks.size(); i++) { + MidiFile::DataBlock &block = target.blocks[i]; + if (block.data.Length() == 0) { + continue; + } else if (block.ticktime > last_ticktime || merged_blocks.size() == 0) { + merged_blocks.push_back(block); + last_ticktime = block.ticktime; + } else { + byte *datadest = merged_blocks.back().data.Append(block.data.Length()); + memcpy(datadest, block.data.Begin(), block.data.Length()); + } + } + std::swap(merged_blocks, target.blocks); + + /* Annotate blocks with real time */ + last_ticktime = 0; + uint32 last_realtime = 0; + size_t cur_tempo = 0, cur_block = 0; + while (cur_block < target.blocks.size()) { + MidiFile::DataBlock &block = target.blocks[cur_block]; + MidiFile::TempoChange &tempo = target.tempos[cur_tempo]; + MidiFile::TempoChange &next_tempo = target.tempos[cur_tempo+1]; + if (block.ticktime <= next_tempo.ticktime) { + /* block is within the current tempo */ + int64 tickdiff = block.ticktime - last_ticktime; + last_ticktime = block.ticktime; + last_realtime += uint32(tickdiff * tempo.tempo / target.tickdiv); + block.realtime = last_realtime; + cur_block++; + } else { + /* tempo change occurs before this block */ + int64 tickdiff = next_tempo.ticktime - last_ticktime; + last_ticktime = next_tempo.ticktime; + last_realtime += uint32(tickdiff * tempo.tempo / target.tickdiv); // current tempo until the tempo change + cur_tempo++; + } + } + + return true; +} + +/** + * Read the header of a standard MIDI file. + * @param[in] filename name of file to read from + * @param[out] header filled with data read + * @return true if the file could be opened and contained a header with correct format + */ +bool MidiFile::ReadSMFHeader(const char *filename, SMFHeader &header) +{ + FILE *file = FioFOpenFile(filename, "rb", Subdirectory::BASESET_DIR); + if (!file) return false; + bool result = ReadSMFHeader(file, header); + FioFCloseFile(file); + return result; +} + +/** + * Read the header of a standard MIDI file. + * The function will consume 14 bytes from the current file pointer position. + * @param[in] file open file to read from (should be in binary mode) + * @param[out] header filled with data read + * @return true if a header in correct format could be read from the file + */ +bool MidiFile::ReadSMFHeader(FILE *file, SMFHeader &header) +{ + /* Try to read header, fixed size */ + byte buffer[14]; + if (fread(buffer, sizeof(buffer), 1, file) != 1) { + return false; + } + + /* Check magic, 'MThd' followed by 4 byte length indicator (always = 6 in SMF) */ + const byte magic[] = { 'M', 'T', 'h', 'd', 0x00, 0x00, 0x00, 0x06 }; + if (MemCmpT(buffer, magic, sizeof(magic)) != 0) { + return false; + } + + /* Read the parameters of the file */ + header.format = (buffer[8] << 8) | buffer[9]; + header.tracks = (buffer[10] << 8) | buffer[11]; + header.tickdiv = (buffer[12] << 8) | buffer[13]; + return true; +} + +/** + * Load a standard MIDI file. + * @param filename name of the file to load + * @returns true if loaded was successful + */ +bool MidiFile::LoadFile(const char *filename) +{ + _midifile_instance = this; + + this->blocks.clear(); + this->tempos.clear(); + this->tickdiv = 0; + + bool success = false; + FILE *file = FioFOpenFile(filename, "rb", Subdirectory::BASESET_DIR); + if (file == NULL) return false; + + SMFHeader header; + if (!ReadSMFHeader(file, header)) goto cleanup; + + /* Only format 0 (single-track) and format 1 (multi-track single-song) are accepted for now */ + if (header.format != 0 && header.format != 1) goto cleanup; + /* Doesn't support SMPTE timecode files */ + if ((header.tickdiv & 0x8000) != 0) goto cleanup; + + this->tickdiv = header.tickdiv; + + for (; header.tracks > 0; header.tracks--) { + if (!ReadTrackChunk(file, *this)) { + goto cleanup; + } + } + + success = FixupMidiData(*this); + +cleanup: + FioFCloseFile(file); + return success; +} + + +/** + * Decoder for "MPS MIDI" format data. + * This format for MIDI music is also used in a few other Microprose games contemporary with Transport Tycoon. + * + * The song data are usually packed inside a CAT file, with one CAT chunk per song. The song titles are used as names for the CAT chunks. + * + * Unlike the Standard MIDI File format, which is based on the IFF structure, the MPS MIDI format is best described as two linked lists of sub-tracks, + * the first list contains a number of reusable "segments", and the second list contains the "master tracks". Each list is prefixed with a byte + * giving the number of elements in the list, and the actual list is just a byte count (BE16 format) for the segment/track followed by the actual data, + * there is no index as such, so the entire data must be seeked through to build an index. + * + * The actual MIDI data inside each track is almost standard MIDI, prefixing every event with a delay, encoded using the same variable-length format + * used in SMF. A few status codes have changed meaning in MPS MIDI: 0xFE changes control from master track to a segment, 0xFD returns from a segment + * to the master track, and 0xFF is used to end the song. (In Standard MIDI all those values must only occur in real-time data.) + * + * As implemented in the original decoder, there is no support for recursively calling segments from segments, i.e. code 0xFE must only occur in + * a master track, and code 0xFD must only occur in a segment. There are no checks made for this, it's assumed that the only input data will ever + * be the original game music, not music from other games, or new productions. + * + * Additionally, some program change and controller events are given special meaning, see comments in the code. + */ +struct MpsMachine { + /** Starting parameter and playback status for one channel/track */ + struct Channel { + byte cur_program; ///< program selected, used for velocity scaling (lookup into programvelocities array) + byte running_status; ///< last midi status code seen + uint16 delay; ///< frames until next command + uint32 playpos; ///< next byte to play this channel from + uint32 startpos; ///< start position of master track + uint32 returnpos; ///< next return position after playing a segment + Channel() : cur_program(0xFF), running_status(0), delay(0), playpos(0), startpos(0), returnpos(0) { } + }; + Channel channels[16]; ///< playback status for each MIDI channel + std::vector segments; ///< pointers into songdata to repeatable data segments + int16 tempo_ticks; ///< ticker that increments when playing a frame, decrements before playing a frame + int16 current_tempo; ///< threshold for actually playing a frame + int16 initial_tempo; ///< starting tempo of song + bool shouldplayflag; ///< not-end-of-song flag + + static const int TEMPO_RATE; + static const byte programvelocities[128]; + + const byte *songdata; ///< raw data array + size_t songdatalen; ///< length of song data + MidiFile ⌖ ///< recipient of data + + /** Overridden MIDI status codes used in the data format */ + enum MpsMidiStatus { + MPSMIDIST_SEGMENT_RETURN = 0xFD, ///< resume playing master track from stored position + MPSMIDIST_SEGMENT_CALL = 0xFE, ///< store current position of master track playback, and begin playback of a segment + MPSMIDIST_ENDSONG = 0xFF, ///< immediately end the song + }; + + static void AddMidiData(MidiFile::DataBlock &block, byte b1, byte b2) + { + *block.data.Append() = b1; + *block.data.Append() = b2; + } + static void AddMidiData(MidiFile::DataBlock &block, byte b1, byte b2, byte b3) + { + *block.data.Append() = b1; + *block.data.Append() = b2; + *block.data.Append() = b3; + } + + /** + * Construct a TTD DOS music format decoder. + * @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) + : songdata(data), songdatalen(length), target(target) + { + uint32 pos = 0; + int loopmax; + int loopidx; + + /* First byte is the initial "tempo" */ + this->initial_tempo = this->songdata[pos++]; + + /* Next byte is a count of callable segments */ + loopmax = this->songdata[pos++]; + for (loopidx = 0; loopidx < loopmax; loopidx++) { + /* Segments form a linked list in the stream, + * first two bytes in each is an offset to the next. + * Two bytes between offset to next and start of data + * are unaccounted for. */ + this->segments.push_back(pos + 4); + pos += FROM_LE16(*(const int16 *)(this->songdata + pos)); + } + + /* After segments follows list of master tracks for each channel, + * also prefixed with a byte counting actual tracks. */ + loopmax = this->songdata[pos++]; + for (loopidx = 0; loopidx < loopmax; loopidx++) { + /* Similar structure to segments list, but also has + * the MIDI channel number as a byte before the offset + * to next track. */ + byte ch = this->songdata[pos++]; + this->channels[ch].startpos = pos + 4; + pos += FROM_LE16(*(const int16 *)(this->songdata + pos)); + } + } + + /** + * Read an SMF-style variable length value (note duration) from songdata. + * @param pos Position to read from, updated to point to next byte after the value read + * @return Value read from data stream + */ + uint16 ReadVariableLength(uint32 &pos) + { + byte b = 0; + uint16 res = 0; + do { + b = this->songdata[pos++]; + res = (res << 7) + (b & 0x7F); + } while (b & 0x80); + return res; + } + + /** + * Prepare for playback from the beginning. Resets the song pointer for every track to the beginning. + */ + void RestartSong() + { + for (int ch = 0; ch < 16; ch++) { + Channel &chandata = this->channels[ch]; + if (chandata.startpos != 0) { + /* Active track, set position to beginning */ + chandata.playpos = chandata.startpos; + chandata.delay = this->ReadVariableLength(chandata.playpos); + } else { + /* Inactive track, mark as such */ + chandata.playpos = 0; + chandata.delay = 0; + } + } + } + + /** + * Play one frame of data from one channel + */ + uint16 PlayChannelFrame(MidiFile::DataBlock &outblock, int channel) + { + uint16 newdelay = 0; + byte b1, b2; + Channel &chandata = this->channels[channel]; + + do { + /* Read command/status byte */ + b1 = this->songdata[chandata.playpos++]; + + /* Command 0xFE, call segment from master track */ + if (b1 == MPSMIDIST_SEGMENT_CALL) { + b1 = this->songdata[chandata.playpos++]; + chandata.returnpos = chandata.playpos; + chandata.playpos = this->segments[b1]; + newdelay = this->ReadVariableLength(chandata.playpos); + if (newdelay == 0) { + continue; + } + return newdelay; + } + + /* Command 0xFD, return from segment to master track */ + if (b1 == MPSMIDIST_SEGMENT_RETURN) { + chandata.playpos = chandata.returnpos; + chandata.returnpos = 0; + newdelay = this->ReadVariableLength(chandata.playpos); + if (newdelay == 0) { + continue; + } + return newdelay; + } + + /* Command 0xFF, end of song */ + if (b1 == MPSMIDIST_ENDSONG) { + this->shouldplayflag = false; + return 0; + } + + /* Regular MIDI channel message status byte */ + if (b1 >= 0x80) { + /* Save the status byte as running status for the channel + * and read another byte for first parameter to command */ + chandata.running_status = b1; + b1 = this->songdata[chandata.playpos++]; + } + + switch (chandata.running_status & 0xF0) { + case MIDIST_NOTEOFF: + case MIDIST_NOTEON: + b2 = this->songdata[chandata.playpos++]; + if (b2 != 0) { + /* Note on, read velocity and scale according to rules */ + int16 velocity; + if (channel == 9) { + /* Percussion channel, fixed velocity scaling not in the table */ + velocity = (int16)b2 * 0x50; + } else { + /* Regular channel, use scaling from table */ + velocity = b2 * programvelocities[chandata.cur_program]; + } + b2 = (velocity / 128) & 0x00FF; + AddMidiData(outblock, MIDIST_NOTEON + channel, b1, b2); + } else { + /* Note off */ + AddMidiData(outblock, MIDIST_NOTEON + channel, b1, 0); + } + break; + case MIDIST_CONTROLLER: + b2 = this->songdata[chandata.playpos++]; + if (b1 == MIDICT_MODE_MONO) { + /* Unknown what the purpose of this is. + * Occurs in "Can't get There from Here" and in "Aliens Ate my Railway" a few times each. + * Possibly intended to give hints to other (non-GM) music drivers decoding the song. + */ + break; + } else if (b1 == 0) { + /* Standard MIDI controller 0 is "bank select", override meaning to change tempo. + * This is not actually used in any of the original songs. */ + if (b2 != 0) { + this->current_tempo = ((int)b2) * 48 / 60; + } + break; + } else if (b1 == MIDICT_EFFECTS1) { + /* Override value of this controller, default mapping is Reverb Send Level according to MMA RP-023. + * Unknown what the purpose of this particular value is. */ + b2 = 30; + } + AddMidiData(outblock, MIDIST_CONTROLLER + channel, b1, b2); + break; + case MIDIST_PROGCHG: + if (b1 == 0x7E) { + /* Program change to "Applause" is originally used + * to cause the song to loop, but that gets handled + * separately in the output driver here. + * Just end the song. */ + this->shouldplayflag = false; + break; + } + /* Used for note velocity scaling lookup */ + chandata.cur_program = b1; + /* Two programs translated to a third, this is likely to + * provide three different velocity scalings of "brass". */ + if (b1 == 0x57 || b1 == 0x3F) { + b1 = 0x3E; + } + AddMidiData(outblock, MIDIST_PROGCHG + channel, b1); + break; + case MIDIST_PITCHBEND: + b2 = this->songdata[chandata.playpos++]; + AddMidiData(outblock, MIDIST_PITCHBEND + channel, b1, b2); + break; + default: + break; + } + + newdelay = this->ReadVariableLength(chandata.playpos); + } while (newdelay == 0); + + return newdelay; + } + + /** + * Play one frame of data into a block. + */ + bool PlayFrame(MidiFile::DataBlock &block) + { + /* Update tempo/ticks counter */ + this->tempo_ticks -= this->current_tempo; + if (this->tempo_ticks > 0) { + return true; + } + this->tempo_ticks += TEMPO_RATE; + + /* Look over all channels, play those active */ + for (int ch = 0; ch < 16; ch++) { + Channel &chandata = this->channels[ch]; + if (chandata.playpos != 0) { + if (chandata.delay == 0) { + chandata.delay = this->PlayChannelFrame(block, ch); + } + chandata.delay--; + } + } + + return this->shouldplayflag; + } + + /** + * Perform playback of whole song. + */ + bool PlayInto() + { + /* Tempo seems to be handled as TEMPO_RATE = 148 ticks per second. + * Use this as the tickdiv, and define the tempo to be one second (1M microseconds) per tickdiv. + * MIDI software loading exported files will show a bogus tempo, but playback will be correct. */ + this->target.tickdiv = TEMPO_RATE; + this->target.tempos.push_back(MidiFile::TempoChange(0, 1000000)); + + /* Initialize playback simulation */ + this->RestartSong(); + this->shouldplayflag = true; + this->current_tempo = (int32)this->initial_tempo * 24 / 60; + this->tempo_ticks = this->current_tempo; + + /* Always reset percussion channel to program 0 */ + this->target.blocks.push_back(MidiFile::DataBlock()); + AddMidiData(this->target.blocks.back(), MIDIST_PROGCHG+9, 0x00); + + /* Technically should be an endless loop, but having + * a maximum (about 10 minutes) avoids getting stuck, + * in case of corrupted data. */ + for (uint32 tick = 0; tick < 100000; tick+=1) { + this->target.blocks.push_back(MidiFile::DataBlock()); + auto &block = this->target.blocks.back(); + block.ticktime = tick; + if (!this->PlayFrame(block)) { + break; + } + } + return true; + } +}; +/** Frames/ticks per second for music playback */ +const int MpsMachine::TEMPO_RATE = 148; +/** Base note velocities for various GM programs */ +const byte MpsMachine::programvelocities[128] = { + 100, 100, 100, 100, 100, 90, 100, 100, 100, 100, 100, 90, 100, 100, 100, 100, + 100, 100, 85, 100, 100, 100, 100, 100, 100, 100, 100, 100, 90, 90, 110, 80, + 100, 100, 100, 90, 70, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 90, 100, 100, 100, 100, 100, 100, 120, 100, 100, 100, 120, 100, 127, + 100, 100, 90, 100, 100, 100, 100, 100, 100, 95, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 115, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, +}; + +/** + * Create MIDI data from song data for the original Microprose music drivers. + * @param data pointer to block of data + * @param length size of data in bytes + * @return true if the data could be loaded + */ +bool MidiFile::LoadMpsData(const byte *data, size_t length) +{ + _midifile_instance = this; + + MpsMachine machine(data, length, *this); + return machine.PlayInto() && FixupMidiData(*this); +} + +bool MidiFile::LoadSong(const MusicSongInfo &song) +{ + switch (song.filetype) { + case MTT_STANDARDMIDI: + return this->LoadFile(song.filename); + case MTT_MPSMIDI: + { + size_t songdatalen = 0; + byte *songdata = GetMusicCatEntryData(song.filename, song.cat_index, songdatalen); + if (songdata != NULL) { + bool result = this->LoadMpsData(songdata, songdatalen); + free(songdata); + return result; + } else { + return false; + } + } + default: + NOT_REACHED(); + } +} + +/** + * Move data from other to this, and clears other. + * @param other object containing loaded data to take over + */ +void MidiFile::MoveFrom(MidiFile &other) +{ + std::swap(this->blocks, other.blocks); + std::swap(this->tempos, other.tempos); + this->tickdiv = other.tickdiv; + + _midifile_instance = this; + + other.blocks.clear(); + other.tempos.clear(); + other.tickdiv = 0; +} + +static void WriteVariableLen(FILE *f, uint32 value) +{ + if (value < 0x7F) { + byte tb = value; + fwrite(&tb, 1, 1, f); + } else if (value < 0x3FFF) { + byte tb[2]; + tb[1] = value & 0x7F; value >>= 7; + tb[0] = (value & 0x7F) | 0x80; value >>= 7; + fwrite(tb, 1, sizeof(tb), f); + } else if (value < 0x1FFFFF) { + byte tb[3]; + tb[2] = value & 0x7F; value >>= 7; + tb[1] = (value & 0x7F) | 0x80; value >>= 7; + tb[0] = (value & 0x7F) | 0x80; value >>= 7; + fwrite(tb, 1, sizeof(tb), f); + } else if (value < 0x0FFFFFFF) { + byte tb[4]; + tb[3] = value & 0x7F; value >>= 7; + tb[2] = (value & 0x7F) | 0x80; value >>= 7; + tb[1] = (value & 0x7F) | 0x80; value >>= 7; + tb[0] = (value & 0x7F) | 0x80; value >>= 7; + fwrite(tb, 1, sizeof(tb), f); + } +} + +/** + * Write a Standard MIDI File containing the decoded music. + * @param filename Name of file to write to + * @return True if the file was written to completion + */ +bool MidiFile::WriteSMF(const char *filename) +{ + FILE *f = FioFOpenFile(filename, "wb", Subdirectory::NO_DIRECTORY); + if (!f) { + return false; + } + + /* SMF header */ + const byte fileheader[] = { + 'M', 'T', 'h', 'd', // block name + 0x00, 0x00, 0x00, 0x06, // BE32 block length, always 6 bytes + 0x00, 0x00, // writing format 0 (all in one track) + 0x00, 0x01, // containing 1 track (BE16) + (byte)(this->tickdiv >> 8), (byte)this->tickdiv, // tickdiv in BE16 + }; + fwrite(fileheader, sizeof(fileheader), 1, f); + + /* Track header */ + const byte trackheader[] = { + 'M', 'T', 'r', 'k', // block name + 0, 0, 0, 0, // BE32 block length, unknown at this time + }; + fwrite(trackheader, sizeof(trackheader), 1, f); + /* Determine position to write the actual track block length at */ + size_t tracksizepos = ftell(f) - 4; + + /* Write blocks in sequence */ + uint32 lasttime = 0; + size_t nexttempoindex = 0; + for (size_t bi = 0; bi < this->blocks.size(); bi++) { + DataBlock &block = this->blocks[bi]; + TempoChange &nexttempo = this->tempos[nexttempoindex]; + + uint32 timediff = block.ticktime - lasttime; + + /* Check if there is a tempo change before this block */ + if (nexttempo.ticktime < block.ticktime) { + timediff = nexttempo.ticktime - lasttime; + } + + /* Write delta time for block */ + lasttime += timediff; + bool needtime = false; + WriteVariableLen(f, timediff); + + /* Write tempo change if there is one */ + if (nexttempo.ticktime <= block.ticktime) { + byte tempobuf[6] = { MIDIST_SMF_META, 0x51, 0x03, 0, 0, 0 }; + tempobuf[3] = (nexttempo.tempo & 0x00FF0000) >> 16; + tempobuf[4] = (nexttempo.tempo & 0x0000FF00) >> 8; + tempobuf[5] = (nexttempo.tempo & 0x000000FF); + fwrite(tempobuf, sizeof(tempobuf), 1, f); + nexttempoindex++; + needtime = true; + } + /* If a tempo change occurred between two blocks, rather than + * at start of this one, start over with delta time for the block. */ + if (nexttempo.ticktime < block.ticktime) { + /* Start loop over at same index */ + bi--; + continue; + } + + /* Write each block data command */ + byte *dp = block.data.Begin(); + while (dp < block.data.End()) { + /* Always zero delta time inside blocks */ + if (needtime) { + fputc(0, f); + } + needtime = true; + + /* Check message type and write appropriate number of bytes */ + switch (*dp & 0xF0) { + case MIDIST_NOTEOFF: + case MIDIST_NOTEON: + case MIDIST_POLYPRESS: + case MIDIST_CONTROLLER: + case MIDIST_PITCHBEND: + fwrite(dp, 1, 3, f); + dp += 3; + continue; + case MIDIST_PROGCHG: + case MIDIST_CHANPRESS: + fwrite(dp, 1, 2, f); + dp += 2; + continue; + } + + /* Sysex needs to measure length and write that as well */ + if (*dp == MIDIST_SYSEX) { + fwrite(dp, 1, 1, f); + dp++; + byte *sysexend = dp; + while (*sysexend != MIDIST_ENDSYSEX) sysexend++; + ptrdiff_t sysexlen = sysexend - dp; + WriteVariableLen(f, sysexlen); + fwrite(dp, 1, sysexend - dp, f); + dp = sysexend; + continue; + } + + /* Fail for any other commands */ + fclose(f); + return false; + } + } + + /* End of track marker */ + static const byte track_end_marker[] = { 0x00, MIDIST_SMF_META, 0x2F, 0x00 }; + fwrite(&track_end_marker, sizeof(track_end_marker), 1, f); + + /* Fill out the RIFF block length */ + size_t trackendpos = ftell(f); + fseek(f, tracksizepos, SEEK_SET); + uint32 tracksize = (uint32)(trackendpos - tracksizepos - 4); // blindly assume we never produce files larger than 2 GB + tracksize = TO_BE32(tracksize); + fwrite(&tracksize, 4, 1, f); + + fclose(f); + return true; +} + +/** + * Get the name of a Standard MIDI File for a given song. + * For songs already in SMF format, just returns the original. + * Otherwise the song is converted, written to a temporary-ish file, and the written filename is returned. + * @param song Song definition to query + * @return Full filename string, empty string if failed + */ +std::string MidiFile::GetSMFFile(const MusicSongInfo &song) +{ + if (song.filetype == MTT_STANDARDMIDI) { + 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(); + + 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 = fnstart; *rp != '\0'; rp++) { + if (*rp != '.') *wp++ = *rp; + } + *wp++ = '\0'; + } + + char tempdirname[MAX_PATH]; + FioGetFullPath(tempdirname, lastof(tempdirname), Searchpath::SP_AUTODOWNLOAD_DIR, Subdirectory::BASESET_DIR, basename); + if (!AppendPathSeparator(tempdirname, lastof(tempdirname))) return std::string(); + FioCreateDirectory(tempdirname); + + char output_filename[MAX_PATH]; + seprintf(output_filename, lastof(output_filename), "%s%d.mid", tempdirname, song.cat_index); + + if (FileExists(output_filename)) { + /* If the file already exists, assume it's the correct decoded data */ + return std::string(output_filename); + } + + byte *data; + size_t datalen; + data = GetMusicCatEntryData(song.filename, song.cat_index, datalen); + if (data == NULL) return std::string(); + + MidiFile midifile; + if (!midifile.LoadMpsData(data, datalen)) { + free(data); + return std::string(); + } + free(data); + + if (midifile.WriteSMF(output_filename)) { + return std::string(output_filename); + } else { + return std::string(); + } +} + + +static bool CmdDumpSMF(byte argc, char *argv[]) +{ + if (argc == 0) { + IConsolePrint(CC_WARNING, "Write the current song to a Standard MIDI File. Usage: 'dumpsmf '"); + return true; + } + if (argc != 2) { + IConsolePrint(CC_WARNING, "You must specify a filename to write MIDI data to."); + return false; + } + + if (_midifile_instance == NULL) { + IConsolePrint(CC_ERROR, "There is no MIDI file loaded currently, make sure music is playing, and you're using a driver that works with raw MIDI."); + return false; + } + + char fnbuf[MAX_PATH] = { 0 }; + if (seprintf(fnbuf, lastof(fnbuf), "%s%s", FiosGetScreenshotDir(), argv[1]) >= (int)lengthof(fnbuf)) { + IConsolePrint(CC_ERROR, "Filename too long."); + return false; + } + IConsolePrintF(CC_INFO, "Dumping MIDI to: %s", fnbuf); + + if (_midifile_instance->WriteSMF(fnbuf)) { + IConsolePrint(CC_INFO, "File written successfully."); + return true; + } else { + IConsolePrint(CC_ERROR, "An error occurred writing MIDI file."); + return false; + } +} + +static void RegisterConsoleMidiCommands() +{ + static bool registered = false; + if (!registered) { + IConsoleCmdRegister("dumpsmf", CmdDumpSMF); + registered = true; + } +} + +MidiFile::MidiFile() +{ + RegisterConsoleMidiCommands(); +} + +MidiFile::~MidiFile() +{ + if (_midifile_instance == this) { + _midifile_instance = NULL; + } +} + diff --git a/src/music/midifile.hpp b/src/music/midifile.hpp new file mode 100644 index 0000000000..0016be86ca --- /dev/null +++ b/src/music/midifile.hpp @@ -0,0 +1,55 @@ +/* $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 midifile.hpp Parser for standard MIDI files */ + +#ifndef MUSIC_MIDIFILE_HPP +#define MUSIC_MIDIFILE_HPP + +#include "../stdafx.h" +#include "../core/smallvec_type.hpp" +#include "midi.h" +#include +#include + +struct MusicSongInfo; + +struct MidiFile { + struct DataBlock { + uint32 ticktime; ///< tick number since start of file this block should be triggered at + uint32 realtime; ///< real-time (microseconds) since start of file this block should be triggered at + SmallVector data; ///< raw midi data contained in block + DataBlock(uint32 _ticktime = 0) : ticktime(_ticktime) { } + }; + struct TempoChange { + uint32 ticktime; ///< tick number since start of file this tempo change occurs at + uint32 tempo; ///< new tempo in microseconds per tick + TempoChange(uint32 _ticktime, uint32 _tempo) : ticktime(_ticktime), tempo(_tempo) { } + }; + + std::vector blocks; ///< sequential time-annotated data of file, merged to a single track + std::vector tempos; ///< list of tempo changes in file + uint16 tickdiv; ///< ticks per quarter note + + MidiFile(); + ~MidiFile(); + + bool LoadFile(const char *filename); + bool LoadMpsData(const byte *data, size_t length); + bool LoadSong(const MusicSongInfo &song); + void MoveFrom(MidiFile &other); + + bool WriteSMF(const char *filename); + + static std::string GetSMFFile(const MusicSongInfo &song); + static bool ReadSMFHeader(const char *filename, SMFHeader &header); + static bool ReadSMFHeader(FILE *file, SMFHeader &header); +}; + +#endif /* MUSIC_MIDIFILE_HPP */ diff --git a/src/music/music_driver.hpp b/src/music/music_driver.hpp index be09d3ea2b..f4d3d7dd36 100644 --- a/src/music/music_driver.hpp +++ b/src/music/music_driver.hpp @@ -14,14 +14,16 @@ #include "../driver.h" +struct MusicSongInfo; + /** Driver for all music playback. */ 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 char *filename) = 0; + virtual void PlaySong(const MusicSongInfo &song) = 0; /** * Stop playing the current song. diff --git a/src/music/null_m.h b/src/music/null_m.h index df9f7d80d5..51e1a06656 100644 --- a/src/music/null_m.h +++ b/src/music/null_m.h @@ -21,7 +21,7 @@ public: /* virtual */ void Stop() { } - /* virtual */ void PlaySong(const char *filename) { } + /* virtual */ void PlaySong(const MusicSongInfo &song) { } /* virtual */ void StopSong() { } diff --git a/src/music/os2_m.cpp b/src/music/os2_m.cpp index d7fb97d2d3..1689f00a64 100644 --- a/src/music/os2_m.cpp +++ b/src/music/os2_m.cpp @@ -12,6 +12,8 @@ #include "../stdafx.h" #include "../openttd.h" #include "os2_m.h" +#include "midifile.hpp" +#include "../base_media_base.h" #define INCL_DOS #define INCL_OS2MM @@ -49,11 +51,14 @@ static long CDECL MidiSendCommand(const char *cmd, ...) /** OS/2's music player's factory. */ static FMusicDriver_OS2 iFMusicDriver_OS2; -void MusicDriver_OS2::PlaySong(const char *filename) +void MusicDriver_OS2::PlaySong(const MusicSongInfo &song) { - MidiSendCommand("close all"); + std::string filename = MidiFile::GetSMFFile(song); - if (MidiSendCommand("open %s type sequencer alias song", filename) != 0) { + MidiSendCommand("close all"); + if (filename.empty()) return; + + if (MidiSendCommand("open %s type sequencer alias song", filename.c_str()) != 0) { return; } diff --git a/src/music/os2_m.h b/src/music/os2_m.h index f35e2fdcf6..ac7cd03197 100644 --- a/src/music/os2_m.h +++ b/src/music/os2_m.h @@ -21,7 +21,7 @@ public: /* virtual */ void Stop(); - /* virtual */ void PlaySong(const char *filename); + /* virtual */ void PlaySong(const MusicSongInfo &song); /* virtual */ void StopSong(); diff --git a/src/music/qtmidi.cpp b/src/music/qtmidi.cpp index dfd6f16eb3..f8ab150e79 100644 --- a/src/music/qtmidi.cpp +++ b/src/music/qtmidi.cpp @@ -30,7 +30,9 @@ #include "../stdafx.h" #include "qtmidi.h" +#include "midifile.hpp" #include "../debug.h" +#include "../base_media_base.h" #define Rect OTTDRect #define Point OTTDPoint @@ -242,7 +244,7 @@ void MusicDriver_QtMidi::Stop() case QT_STATE_PLAY: StopSong(); - /* FALL THROUGH */ + FALLTHROUGH; case QT_STATE_STOP: DisposeMovie(_quicktime_movie); @@ -258,30 +260,33 @@ void MusicDriver_QtMidi::Stop() * * @param filename Path to a MIDI file. */ -void MusicDriver_QtMidi::PlaySong(const char *filename) +void MusicDriver_QtMidi::PlaySong(const MusicSongInfo &song) { if (!_quicktime_started) return; - DEBUG(driver, 2, "qtmidi: trying to play '%s'", filename); + std::string filename = MidiFile::GetSMFFile(song); + if (filename.empty()) return; + + DEBUG(driver, 2, "qtmidi: trying to play '%s'", filename.c_str()); switch (_quicktime_state) { case QT_STATE_PLAY: StopSong(); DEBUG(driver, 3, "qtmidi: previous tune stopped"); - /* FALL THROUGH */ + FALLTHROUGH; case QT_STATE_STOP: DisposeMovie(_quicktime_movie); DEBUG(driver, 3, "qtmidi: previous tune disposed"); _quicktime_state = QT_STATE_IDLE; - /* FALL THROUGH */ + FALLTHROUGH; case QT_STATE_IDLE: - LoadMovieForMIDIFile(filename, &_quicktime_movie); + LoadMovieForMIDIFile(filename.c_str(), &_quicktime_movie); SetMovieVolume(_quicktime_movie, VOLUME); StartMovie(_quicktime_movie); _quicktime_state = QT_STATE_PLAY; } - DEBUG(driver, 3, "qtmidi: playing '%s'", filename); + DEBUG(driver, 3, "qtmidi: playing '%s'", filename.c_str()); } @@ -294,7 +299,7 @@ void MusicDriver_QtMidi::StopSong() switch (_quicktime_state) { case QT_STATE_IDLE: - /* FALL THROUGH */ + FALLTHROUGH; case QT_STATE_STOP: DEBUG(driver, 3, "qtmidi: stop requested, but already idle"); diff --git a/src/music/qtmidi.h b/src/music/qtmidi.h index f0e17086e4..32163db939 100644 --- a/src/music/qtmidi.h +++ b/src/music/qtmidi.h @@ -20,7 +20,7 @@ public: /* virtual */ void Stop(); - /* virtual */ void PlaySong(const char *filename); + /* virtual */ void PlaySong(const MusicSongInfo &song); /* virtual */ void StopSong(); diff --git a/src/music/win32_m.cpp b/src/music/win32_m.cpp index d3a7019a0f..a32318db12 100644 --- a/src/music/win32_m.cpp +++ b/src/music/win32_m.cpp @@ -14,168 +14,408 @@ #include "win32_m.h" #include #include +#include "../os/windows/win32.h" +#include "../debug.h" +#include "midifile.hpp" +#include "midi.h" +#include "../base_media_base.h" #include "../safeguards.h" +struct PlaybackSegment { + uint32 start, end; + size_t start_block; + bool loop; +}; + static struct { - bool stop_song; - bool terminate; - bool playing; - int new_vol; - HANDLE wait_obj; - HANDLE thread; - UINT_PTR devid; - char start_song[MAX_PATH]; + UINT time_period; ///< obtained timer precision value + HMIDIOUT midi_out; ///< handle to open midiOut + UINT timer_id; ///< ID of active multimedia timer + CRITICAL_SECTION lock; ///< synchronization for playback status fields + + bool playing; ///< flag indicating that playback is active + bool do_start; ///< flag for starting playback of next_file at next opportunity + bool do_stop; ///< flag for stopping playback at next opportunity + byte current_volume; ///< current effective volume setting + byte new_volume; ///< volume setting to change to + + MidiFile current_file; ///< file currently being played from + PlaybackSegment current_segment; ///< segment info for current playback + DWORD playback_start_time; ///< timestamp current file began playback + size_t current_block; ///< next block index to send + MidiFile next_file; ///< upcoming file to play + PlaybackSegment next_segment; ///< segment info for upcoming file + + byte channel_volumes[16]; ///< last seen volume controller values in raw data } _midi; static FMusicDriver_Win32 iFMusicDriver_Win32; -void MusicDriver_Win32::PlaySong(const char *filename) + +static byte ScaleVolume(byte original, byte scale) { - assert(filename != NULL); - strecpy(_midi.start_song, filename, lastof(_midi.start_song)); - _midi.playing = true; - _midi.stop_song = false; - SetEvent(_midi.wait_obj); + return original * scale / 127; +} + + +void CALLBACK MidiOutProc(HMIDIOUT hmo, UINT wMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) +{ + if (wMsg == MOM_DONE) { + MIDIHDR *hdr = (LPMIDIHDR)dwParam1; + midiOutUnprepareHeader(hmo, hdr, sizeof(*hdr)); + free(hdr); + } +} + +static void TransmitChannelMsg(byte status, byte p1, byte p2 = 0) +{ + midiOutShortMsg(_midi.midi_out, status | (p1 << 8) | (p2 << 16)); +} + +static void TransmitSysex(byte *&msg_start, size_t &remaining) +{ + /* find end of message */ + byte *msg_end = msg_start; + while (*msg_end != MIDIST_ENDSYSEX) msg_end++; + msg_end++; /* also include sysex end byte */ + + /* prepare header */ + MIDIHDR *hdr = CallocT(1); + hdr->lpData = (LPSTR)msg_start; + hdr->dwBufferLength = msg_end - msg_start; + if (midiOutPrepareHeader(_midi.midi_out, hdr, sizeof(*hdr)) == MMSYSERR_NOERROR) { + /* transmit - just point directly into the data buffer */ + hdr->dwBytesRecorded = hdr->dwBufferLength; + midiOutLongMsg(_midi.midi_out, hdr, sizeof(*hdr)); + } else { + free(hdr); + } + + /* update position in buffer */ + remaining -= msg_end - msg_start; + msg_start = msg_end; +} + +static void TransmitSysexConst(byte *msg_start, size_t length) +{ + TransmitSysex(msg_start, length); +} + +/** + * Realtime MIDI playback service routine. + * This is called by the multimedia timer. + */ +void CALLBACK TimerCallback(UINT uTimerID, UINT, DWORD_PTR dwUser, DWORD_PTR, DWORD_PTR) +{ + /* Try to check playback status changes. + * If _midi is already locked, skip checking for this cycle and try again + * next cycle, instead of waiting for locks in the realtime callback. */ + if (TryEnterCriticalSection(&_midi.lock)) { + /* check for stop */ + if (_midi.do_stop) { + DEBUG(driver, 2, "Win32-MIDI: timer: do_stop is set"); + midiOutReset(_midi.midi_out); + _midi.playing = false; + _midi.do_stop = false; + LeaveCriticalSection(&_midi.lock); + return; + } + + /* check for start/restart/change song */ + if (_midi.do_start) { + DEBUG(driver, 2, "Win32-MIDI: timer: do_start is set"); + if (_midi.playing) { + midiOutReset(_midi.midi_out); + /* Some songs change the "Pitch bend range" registered + * parameter. If this doesn't get reset, everything else + * will start sounding wrong. */ + for (int ch = 0; ch < 16; ch++) { + /* Running status, only need status for first message */ + /* Select RPN 00.00, set value to 02.00, and unselect again */ + TransmitChannelMsg(MIDIST_CONTROLLER | ch, MIDICT_RPN_SELECT_LO, 0x00); + TransmitChannelMsg(MIDICT_RPN_SELECT_HI, 0x00); + TransmitChannelMsg(MIDICT_DATAENTRY, 0x02); + TransmitChannelMsg(MIDICT_DATAENTRY_LO, 0x00); + TransmitChannelMsg(MIDICT_RPN_SELECT_LO, 0x7F); + TransmitChannelMsg(MIDICT_RPN_SELECT_HI, 0x7F); + } + } + _midi.current_file.MoveFrom(_midi.next_file); + std::swap(_midi.next_segment, _midi.current_segment); + _midi.current_segment.start_block = 0; + _midi.playback_start_time = timeGetTime(); + _midi.playing = true; + _midi.do_start = false; + _midi.current_block = 0; + + MemSetT(_midi.channel_volumes, 127, lengthof(_midi.channel_volumes)); + } else if (!_midi.playing) { + /* not playing, stop the timer */ + DEBUG(driver, 2, "Win32-MIDI: timer: not playing, stopping timer"); + timeKillEvent(uTimerID); + _midi.timer_id = 0; + LeaveCriticalSection(&_midi.lock); + return; + } + + /* check for volume change */ + static int volume_throttle = 0; + if (_midi.current_volume != _midi.new_volume) { + if (volume_throttle == 0) { + DEBUG(driver, 2, "Win32-MIDI: timer: volume change"); + _midi.current_volume = _midi.new_volume; + volume_throttle = 20 / _midi.time_period; + for (int ch = 0; ch < 16; ch++) { + int vol = ScaleVolume(_midi.channel_volumes[ch], _midi.current_volume); + TransmitChannelMsg(MIDIST_CONTROLLER | ch, MIDICT_CHANVOLUME, vol); + } + } + else { + volume_throttle--; + } + } + + LeaveCriticalSection(&_midi.lock); + } + + /* skip beginning of file? */ + if (_midi.current_segment.start > 0 && _midi.current_block == 0 && _midi.current_segment.start_block == 0) { + /* find first block after start time and pretend playback started earlier + * this is to allow all blocks prior to the actual start to still affect playback, + * as they may contain important controller and program changes */ + uint preload_bytes = 0; + for (size_t bl = 0; bl < _midi.current_file.blocks.size(); bl++) { + MidiFile::DataBlock &block = _midi.current_file.blocks[bl]; + preload_bytes += block.data.Length(); + if (block.ticktime >= _midi.current_segment.start) { + if (_midi.current_segment.loop) { + DEBUG(driver, 2, "Win32-MIDI: timer: loop from block %d (ticktime %d, realtime %.3f, bytes %d)", (int)bl, (int)block.ticktime, ((int)block.realtime)/1000.0, (int)preload_bytes); + _midi.current_segment.start_block = bl; + break; + } else { + /* Calculate offset start time for playback. + * The preload_bytes are used to compensate for delay in transmission over traditional serial MIDI interfaces, + * which have a bitrate of 31,250 bits/sec, and transmit 1+8+1 start/data/stop bits per byte. + * The delay compensation is needed to avoid time-compression of following messages. + */ + DEBUG(driver, 2, "Win32-MIDI: timer: start from block %d (ticktime %d, realtime %.3f, bytes %d)", (int)bl, (int)block.ticktime, ((int)block.realtime) / 1000.0, (int)preload_bytes); + _midi.playback_start_time -= block.realtime / 1000 - preload_bytes * 1000 / 3125; + break; + } + } + } + } + + + /* play pending blocks */ + DWORD current_time = timeGetTime(); + DWORD playback_time = current_time - _midi.playback_start_time; + while (_midi.current_block < _midi.current_file.blocks.size()) { + MidiFile::DataBlock &block = _midi.current_file.blocks[_midi.current_block]; + + /* check that block isn't at end-of-song override */ + if (_midi.current_segment.end > 0 && block.ticktime >= _midi.current_segment.end) { + if (_midi.current_segment.loop) { + _midi.current_block = _midi.current_segment.start_block; + _midi.playback_start_time = timeGetTime() - _midi.current_file.blocks[_midi.current_block].realtime / 1000; + } else { + _midi.do_stop = true; + } + break; + } + /* check that block is not in the future */ + if (block.realtime / 1000 > playback_time) { + break; + } + + byte *data = block.data.Begin(); + size_t remaining = block.data.Length(); + byte last_status = 0; + while (remaining > 0) { + /* MidiFile ought to have converted everything out of running status, + * but handle it anyway just to be safe */ + byte status = data[0]; + if (status & 0x80) { + last_status = status; + data++; + remaining--; + } else { + status = last_status; + } + switch (status & 0xF0) { + case MIDIST_PROGCHG: + case MIDIST_CHANPRESS: + /* 2 byte channel messages */ + TransmitChannelMsg(status, data[0]); + data++; + remaining--; + break; + case MIDIST_NOTEOFF: + case MIDIST_NOTEON: + case MIDIST_POLYPRESS: + case MIDIST_PITCHBEND: + /* 3 byte channel messages */ + TransmitChannelMsg(status, data[0], data[1]); + data += 2; + remaining -= 2; + break; + case MIDIST_CONTROLLER: + /* controller change */ + if (data[0] == MIDICT_CHANVOLUME) { + /* volume controller, adjust for user volume */ + _midi.channel_volumes[status & 0x0F] = data[1]; + int vol = ScaleVolume(data[1], _midi.current_volume); + TransmitChannelMsg(status, data[0], vol); + } else { + /* handle other controllers normally */ + TransmitChannelMsg(status, data[0], data[1]); + } + data += 2; + remaining -= 2; + break; + case 0xF0: + /* system messages */ + switch (status) { + case MIDIST_SYSEX: /* system exclusive */ + TransmitSysex(data, remaining); + break; + case MIDIST_TC_QFRAME: /* time code quarter frame */ + case MIDIST_SONGSEL: /* song select */ + data++; + remaining--; + break; + case MIDIST_SONGPOSPTR: /* song position pointer */ + data += 2; + remaining -= 2; + break; + default: /* remaining have no data bytes */ + break; + } + break; + } + } + + _midi.current_block++; + } + + /* end? */ + if (_midi.current_block == _midi.current_file.blocks.size()) { + if (_midi.current_segment.loop) { + _midi.current_block = _midi.current_segment.start_block; + _midi.playback_start_time = timeGetTime() - _midi.current_file.blocks[_midi.current_block].realtime / 1000; + } else { + _midi.do_stop = true; + } + } +} + +void MusicDriver_Win32::PlaySong(const MusicSongInfo &song) +{ + DEBUG(driver, 2, "Win32-MIDI: PlaySong: entry"); + EnterCriticalSection(&_midi.lock); + + if (!_midi.next_file.LoadSong(song)) { + LeaveCriticalSection(&_midi.lock); + return; + } + + _midi.next_segment.start = song.override_start; + _midi.next_segment.end = song.override_end; + _midi.next_segment.loop = song.loop; + + DEBUG(driver, 2, "Win32-MIDI: PlaySong: setting flag"); + _midi.do_stop = _midi.playing; + _midi.do_start = true; + + if (_midi.timer_id == 0) { + DEBUG(driver, 2, "Win32-MIDI: PlaySong: starting timer"); + _midi.timer_id = timeSetEvent(_midi.time_period, _midi.time_period, TimerCallback, (DWORD_PTR)this, TIME_PERIODIC | TIME_CALLBACK_FUNCTION); + } + + LeaveCriticalSection(&_midi.lock); } void MusicDriver_Win32::StopSong() { - if (_midi.playing) { - _midi.stop_song = true; - _midi.start_song[0] = '\0'; - SetEvent(_midi.wait_obj); - } + DEBUG(driver, 2, "Win32-MIDI: StopSong: entry"); + EnterCriticalSection(&_midi.lock); + DEBUG(driver, 2, "Win32-MIDI: StopSong: setting flag"); + _midi.do_stop = true; + LeaveCriticalSection(&_midi.lock); } bool MusicDriver_Win32::IsSongPlaying() { - return _midi.playing; + return _midi.playing || _midi.do_start; } void MusicDriver_Win32::SetVolume(byte vol) { - _midi.new_vol = vol; - SetEvent(_midi.wait_obj); -} - -static MCIERROR CDECL MidiSendCommand(const TCHAR *cmd, ...) -{ - va_list va; - TCHAR buf[512]; - - va_start(va, cmd); - _vsntprintf(buf, lengthof(buf), cmd, va); - va_end(va); - return mciSendString(buf, NULL, 0, 0); -} - -static bool MidiIntPlaySong(const char *filename) -{ - MidiSendCommand(_T("close all")); - - if (MidiSendCommand(_T("open \"%s\" type sequencer alias song"), OTTD2FS(filename)) != 0) { - /* Let's try the "short name" */ - TCHAR buf[MAX_PATH]; - if (GetShortPathName(OTTD2FS(filename), buf, MAX_PATH) == 0) return false; - if (MidiSendCommand(_T("open \"%s\" type sequencer alias song"), buf) != 0) return false; - } - - MidiSendCommand(_T("seek song to start wait")); - return MidiSendCommand(_T("play song")) == 0; -} - -static void MidiIntStopSong() -{ - MidiSendCommand(_T("close all")); -} - -static void MidiIntSetVolume(int vol) -{ - DWORD v = (vol * 65535 / 127); - midiOutSetVolume((HMIDIOUT)_midi.devid, v + (v << 16)); -} - -static bool MidiIntIsSongPlaying() -{ - char buf[16]; - mciSendStringA("status song mode", buf, sizeof(buf), 0); - return strcmp(buf, "playing") == 0 || strcmp(buf, "seeking") == 0; -} - -static DWORD WINAPI MidiThread(LPVOID arg) -{ - do { - char *s; - int vol; - - vol = _midi.new_vol; - if (vol != -1) { - _midi.new_vol = -1; - MidiIntSetVolume(vol); - } - - s = _midi.start_song; - if (s[0] != '\0') { - _midi.playing = MidiIntPlaySong(s); - s[0] = '\0'; - - /* Delay somewhat in case we don't manage to play. */ - if (!_midi.playing) WaitForMultipleObjects(1, &_midi.wait_obj, FALSE, 5000); - } - - if (_midi.stop_song && _midi.playing) { - _midi.stop_song = false; - _midi.playing = false; - MidiIntStopSong(); - } - - if (_midi.playing && !MidiIntIsSongPlaying()) _midi.playing = false; - - WaitForMultipleObjects(1, &_midi.wait_obj, FALSE, 1000); - } while (!_midi.terminate); - - MidiIntStopSong(); - return 0; + EnterCriticalSection(&_midi.lock); + _midi.new_volume = vol; + LeaveCriticalSection(&_midi.lock); } const char *MusicDriver_Win32::Start(const char * const *parm) { - MIDIOUTCAPS midicaps; - UINT nbdev; - UINT_PTR dev; - char buf[16]; + DEBUG(driver, 2, "Win32-MIDI: Start: initializing"); - mciSendStringA("capability sequencer has audio", buf, lengthof(buf), 0); - if (strcmp(buf, "true") != 0) return "MCI sequencer can't play audio"; + InitializeCriticalSection(&_midi.lock); - memset(&_midi, 0, sizeof(_midi)); - _midi.new_vol = -1; + int resolution = GetDriverParamInt(parm, "resolution", 5); + int port = GetDriverParamInt(parm, "port", -1); - /* Get midi device */ - _midi.devid = MIDI_MAPPER; - for (dev = 0, nbdev = midiOutGetNumDevs(); dev < nbdev; dev++) { - if (midiOutGetDevCaps(dev, &midicaps, sizeof(midicaps)) == 0 && (midicaps.dwSupport & MIDICAPS_VOLUME)) { - _midi.devid = dev; - break; - } + UINT devid; + if (port < 0) { + devid = MIDI_MAPPER; + } else { + devid = (UINT)port; } - if (NULL == (_midi.wait_obj = CreateEvent(NULL, FALSE, FALSE, NULL))) return "Failed to create event"; + resolution = Clamp(resolution, 1, 20); - /* The lpThreadId parameter of CreateThread (the last parameter) - * may NOT be NULL on Windows 95, 98 and ME. */ - DWORD threadId; - if (NULL == (_midi.thread = CreateThread(NULL, 8192, MidiThread, 0, 0, &threadId))) return "Failed to create thread"; + if (midiOutOpen(&_midi.midi_out, devid, (DWORD_PTR)&MidiOutProc, (DWORD_PTR)this, CALLBACK_FUNCTION) != MMSYSERR_NOERROR) { + return "could not open midi device"; + } - return NULL; + midiOutReset(_midi.midi_out); + + /* Standard "Enable General MIDI" message */ + static byte gm_enable_sysex[] = { 0xF0, 0x7E, 0x00, 0x09, 0x01, 0xF7 }; + TransmitSysexConst(&gm_enable_sysex[0], sizeof(gm_enable_sysex)); + + /* Roland-specific reverb room control, used by the original game */ + static byte roland_reverb_sysex[] = { 0xF0, 0x41, 0x10, 0x42, 0x12, 0x40, 0x01, 0x30, 0x02, 0x04, 0x00, 0x40, 0x40, 0x00, 0x00, 0x09, 0xF7 }; + TransmitSysexConst(&roland_reverb_sysex[0], sizeof(roland_reverb_sysex)); + + /* prepare multimedia timer */ + TIMECAPS timecaps; + if (timeGetDevCaps(&timecaps, sizeof(timecaps)) == MMSYSERR_NOERROR) { + _midi.time_period = min(max((UINT)resolution, timecaps.wPeriodMin), timecaps.wPeriodMax); + if (timeBeginPeriod(_midi.time_period) == MMSYSERR_NOERROR) { + /* success */ + DEBUG(driver, 2, "Win32-MIDI: Start: timer resolution is %d", (int)_midi.time_period); + return NULL; + } + } + midiOutClose(_midi.midi_out); + return "could not set timer resolution"; } void MusicDriver_Win32::Stop() { - _midi.terminate = true; - SetEvent(_midi.wait_obj); - WaitForMultipleObjects(1, &_midi.thread, true, INFINITE); - CloseHandle(_midi.wait_obj); - CloseHandle(_midi.thread); + EnterCriticalSection(&_midi.lock); + + if (_midi.timer_id) { + timeKillEvent(_midi.timer_id); + _midi.timer_id = 0; + } + + timeEndPeriod(_midi.time_period); + midiOutReset(_midi.midi_out); + midiOutClose(_midi.midi_out); + + LeaveCriticalSection(&_midi.lock); + DeleteCriticalSection(&_midi.lock); } diff --git a/src/music/win32_m.h b/src/music/win32_m.h index 3efee3243a..1ac8ae69e4 100644 --- a/src/music/win32_m.h +++ b/src/music/win32_m.h @@ -21,7 +21,7 @@ public: /* virtual */ void Stop(); - /* virtual */ void PlaySong(const char *filename); + /* virtual */ void PlaySong(const MusicSongInfo &song); /* virtual */ void StopSong(); diff --git a/src/music_gui.cpp b/src/music_gui.cpp index 279f376525..87a073b0a7 100644 --- a/src/music_gui.cpp +++ b/src/music_gui.cpp @@ -10,6 +10,7 @@ /** @file music_gui.cpp GUI for the music playback. */ #include "stdafx.h" +#include #include "openttd.h" #include "base_media_base.h" #include "music/music_driver.hpp" @@ -18,11 +19,15 @@ #include "window_func.h" #include "sound_func.h" #include "gfx_func.h" +#include "zoom_func.h" #include "core/random_func.hpp" #include "error.h" #include "core/geometry_func.hpp" #include "string_func.h" #include "settings_type.h" +#include "settings_gui.h" +#include "widgets/dropdown_func.h" +#include "widgets/dropdown_type.h" #include "widgets/music_widget.h" @@ -31,271 +36,419 @@ #include "safeguards.h" -/** - * Get the name of the song. - * @param index of the song. - * @return the name of the song. - */ -static const char *GetSongName(int index) -{ - return BaseMusic::GetUsedSet()->song_name[index]; -} -/** - * Get the track number of the song. - * @param index of the song. - * @return the track number of the song. - */ -static int GetTrackNumber(int index) -{ - return BaseMusic::GetUsedSet()->track_nr[index]; -} +struct MusicSystem { + struct PlaylistEntry : MusicSongInfo { + const MusicSet *set; ///< music set the song comes from + uint set_index; ///< index of song in set -/** The currently played song */ -static byte _music_wnd_cursong = 1; -/** Whether a song is currently played */ -static bool _song_is_active = false; + PlaylistEntry(const MusicSet *set, uint set_index) : MusicSongInfo(set->songinfo[set_index]), set(set), set_index(set_index) { } + bool IsValid() const { return !StrEmpty(this->songname); } + }; + typedef std::vector Playlist; -/** Indices of the songs in the current playlist */ -static byte _cur_playlist[NUM_SONGS_PLAYLIST + 1]; + enum PlaylistChoices { + PLCH_ALLMUSIC, + PLCH_OLDSTYLE, + PLCH_NEWSTYLE, + PLCH_EZYSTREET, + PLCH_CUSTOM1, + PLCH_CUSTOM2, + PLCH_THEMEONLY, + PLCH_MAX, + }; -/** Indices of all songs */ -static byte _playlist_all[NUM_SONGS_AVAILABLE + 1]; -/** Indices of all old style songs */ -static byte _playlist_old_style[NUM_SONGS_CLASS + 1]; -/** Indices of all new style songs */ -static byte _playlist_new_style[NUM_SONGS_CLASS + 1]; -/** Indices of all ezy street songs */ -static byte _playlist_ezy_street[NUM_SONGS_CLASS + 1]; + Playlist active_playlist; ///< current play order of songs, including any shuffle + Playlist displayed_playlist; ///< current playlist as displayed in GUI, never in shuffled order + Playlist music_set; ///< all songs in current music set, in set order -assert_compile(lengthof(_settings_client.music.custom_1) == NUM_SONGS_PLAYLIST + 1); -assert_compile(lengthof(_settings_client.music.custom_2) == NUM_SONGS_PLAYLIST + 1); + PlaylistChoices selected_playlist; -/** The different playlists that can be played. */ -static byte * const _playlists[] = { - _playlist_all, - _playlist_old_style, - _playlist_new_style, - _playlist_ezy_street, - _settings_client.music.custom_1, - _settings_client.music.custom_2, + void BuildPlaylists(); + + void ChangePlaylist(PlaylistChoices pl); + void ChangeMusicSet(const char *set_name); + void Shuffle(); + void Unshuffle(); + + void Play(); + void Stop(); + void Next(); + void Prev(); + void CheckStatus(); + + bool IsPlaying() const; + bool IsShuffle() const; + PlaylistEntry GetCurrentSong() const; + + bool IsCustomPlaylist() const; + void PlaylistAdd(size_t song_index); + void PlaylistRemove(size_t song_index); + void PlaylistClear(); + +private: + void ChangePlaylistPosition(int ofs); + int playlist_position; + + void SaveCustomPlaylist(PlaylistChoices pl); + + Playlist standard_playlists[PLCH_MAX]; }; -/** - * Validate a playlist. - * @param playlist The playlist to validate. - * @param last The last location in the list. - */ -void ValidatePlaylist(byte *playlist, byte *last) -{ - while (*playlist != 0 && playlist <= last) { - /* Song indices are saved off-by-one so 0 is "nothing". */ - if (*playlist <= NUM_SONGS_AVAILABLE && !StrEmpty(GetSongName(*playlist - 1))) { - playlist++; - continue; - } - for (byte *p = playlist; *p != 0 && p <= last; p++) { - p[0] = p[1]; - } - } +MusicSystem _music; - /* Make sure the list is null terminated. */ - *last = 0; -} -/** Initialize the playlists */ -void InitializeMusic() +/** Rebuild all playlists for the current music set */ +void MusicSystem::BuildPlaylists() { - uint j = 0; + const MusicSet *set = BaseMusic::GetUsedSet(); + + /* Clear current playlists */ + for (size_t i = 0; i < lengthof(this->standard_playlists); ++i) this->standard_playlists[i].clear(); + this->music_set.clear(); + + /* Build standard playlists, and a list of available music */ for (uint i = 0; i < NUM_SONGS_AVAILABLE; i++) { - if (StrEmpty(GetSongName(i))) continue; - _playlist_all[j++] = i + 1; - } - /* Terminate the list */ - _playlist_all[j] = 0; + PlaylistEntry entry(set, i); + if (!entry.IsValid()) continue; - /* Now make the 'styled' playlists */ - for (uint k = 0; k < NUM_SONG_CLASSES; k++) { - j = 0; - for (uint i = 0; i < NUM_SONGS_CLASS; i++) { - int id = k * NUM_SONGS_CLASS + i + 1; - if (StrEmpty(GetSongName(id))) continue; - _playlists[k + 1][j++] = id + 1; - } - /* Terminate the list */ - _playlists[k + 1][j] = 0; - } + this->music_set.push_back(entry); - ValidatePlaylist(_settings_client.music.custom_1, lastof(_settings_client.music.custom_1)); - ValidatePlaylist(_settings_client.music.custom_2, lastof(_settings_client.music.custom_2)); + /* Add theme song to theme-only playlist */ + if (i == 0) this->standard_playlists[PLCH_THEMEONLY].push_back(entry); - if (BaseMusic::GetUsedSet()->num_available < _music_wnd_cursong) { - /* If there are less songs than the currently played song, - * just pause and reset to no song. */ - _music_wnd_cursong = 0; - _song_is_active = false; - } -} - -static void SkipToPrevSong() -{ - byte *b = _cur_playlist; - byte *p = b; - byte t; - - if (b[0] == 0) return; // empty playlist - - do p++; while (p[0] != 0); // find the end - - t = *--p; // and copy the bytes - while (p != b) { - p--; - p[1] = p[0]; - } - *b = t; - - _song_is_active = false; -} - -static void SkipToNextSong() -{ - byte *b = _cur_playlist; - byte t; - - t = b[0]; - if (t != 0) { - while (b[1] != 0) { - b[0] = b[1]; - b++; - } - b[0] = t; - } - - _song_is_active = false; -} - -static void MusicVolumeChanged(byte new_vol) -{ - MusicDriver::GetInstance()->SetVolume(new_vol); -} - -static void DoPlaySong() -{ - char filename[MAX_PATH]; - if (FioFindFullPath(filename, lastof(filename), BASESET_DIR, BaseMusic::GetUsedSet()->files[_music_wnd_cursong - 1].filename) == NULL) { - FioFindFullPath(filename, lastof(filename), OLD_GM_DIR, BaseMusic::GetUsedSet()->files[_music_wnd_cursong - 1].filename); - } - MusicDriver::GetInstance()->PlaySong(filename); - SetWindowDirty(WC_MUSIC_WINDOW, 0); -} - -static void DoStopMusic() -{ - MusicDriver::GetInstance()->StopSong(); - SetWindowDirty(WC_MUSIC_WINDOW, 0); -} - -static void SelectSongToPlay() -{ - uint i = 0; - uint j = 0; - - memset(_cur_playlist, 0, sizeof(_cur_playlist)); - do { - /* File is the index into the file table of the music set. The play list uses 0 as 'no entry', - * so we need to subtract 1. In case of 'no entry' (file = -1), just skip adding it outright. */ - int file = _playlists[_settings_client.music.playlist][i] - 1; - if (file >= 0) { - const char *filename = BaseMusic::GetUsedSet()->files[file].filename; - /* We are now checking for the existence of that file prior - * to add it to the list of available songs */ - if (!StrEmpty(filename) && FioCheckFileExists(filename, BASESET_DIR)) { - _cur_playlist[j] = _playlists[_settings_client.music.playlist][i]; - j++; - } - } - } while (_playlists[_settings_client.music.playlist][++i] != 0 && j < lengthof(_cur_playlist) - 1); - - /* Do not shuffle when on the intro-start window, as the song to play has to be the original TTD Theme*/ - if (_settings_client.music.shuffle && _game_mode != GM_MENU) { - i = 500; - do { - uint32 r = InteractiveRandom(); - byte *a = &_cur_playlist[GB(r, 0, 5)]; - byte *b = &_cur_playlist[GB(r, 8, 5)]; - - if (*a != 0 && *b != 0) { - byte t = *a; - *a = *b; - *b = t; - } - } while (--i); - } -} - -static void StopMusic() -{ - _music_wnd_cursong = 0; - DoStopMusic(); - _song_is_active = false; - SetWindowWidgetDirty(WC_MUSIC_WINDOW, 0, 9); -} - -static void PlayPlaylistSong() -{ - if (_cur_playlist[0] == 0) { - SelectSongToPlay(); - /* if there is not songs in the playlist, it may indicate - * no file on the gm folder, or even no gm folder. - * Stop the playback, then */ - if (_cur_playlist[0] == 0) { - _song_is_active = false; - _music_wnd_cursong = 0; - _settings_client.music.playing = false; - return; + /* Don't add the theme song to standard playlists */ + if (i > 0) { + this->standard_playlists[PLCH_ALLMUSIC].push_back(entry); + uint theme = (i - 1) / NUM_SONGS_CLASS; + this->standard_playlists[PLCH_OLDSTYLE + theme].push_back(entry); } } - _music_wnd_cursong = _cur_playlist[0]; - DoPlaySong(); - _song_is_active = true; - SetWindowWidgetDirty(WC_MUSIC_WINDOW, 0, 9); -} - -void ResetMusic() -{ - _music_wnd_cursong = 1; - DoPlaySong(); -} - -void MusicLoop() -{ - if (!_settings_client.music.playing && _song_is_active) { - StopMusic(); - } else if (_settings_client.music.playing && !_song_is_active) { - PlayPlaylistSong(); - } - - if (!_song_is_active) return; - - if (!MusicDriver::GetInstance()->IsSongPlaying()) { - if (_game_mode != GM_MENU) { - StopMusic(); - SkipToNextSong(); - PlayPlaylistSong(); - } else { - ResetMusic(); + /* Load custom playlists + * Song index offsets are 1-based, zero indicates invalid/end-of-list value */ + for (uint i = 0; i < NUM_SONGS_PLAYLIST; i++) { + if (_settings_client.music.custom_1[i] > 0) { + PlaylistEntry entry(set, _settings_client.music.custom_1[i] - 1); + if (entry.IsValid()) this->standard_playlists[PLCH_CUSTOM1].push_back(entry); + } + if (_settings_client.music.custom_2[i] > 0) { + PlaylistEntry entry(set, _settings_client.music.custom_2[i] - 1); + if (entry.IsValid()) this->standard_playlists[PLCH_CUSTOM2].push_back(entry); } } } -static void SelectPlaylist(byte list) +/** + * Switch to another playlist, or reload the current one. + * @param pl Playlist to select + */ +void MusicSystem::ChangePlaylist(PlaylistChoices pl) { - _settings_client.music.playlist = list; + assert(pl < PLCH_MAX && pl >= PLCH_ALLMUSIC); + + this->displayed_playlist = this->standard_playlists[pl]; + this->active_playlist = this->displayed_playlist; + this->selected_playlist = pl; + this->playlist_position = 0; + + if (this->selected_playlist != PLCH_THEMEONLY) _settings_client.music.playlist = this->selected_playlist; + + if (_settings_client.music.shuffle) { + this->Shuffle(); + /* Shuffle() will also Play() if necessary, only start once */ + } else if (_settings_client.music.playing) { + this->Play(); + } + InvalidateWindowData(WC_MUSIC_TRACK_SELECTION, 0); InvalidateWindowData(WC_MUSIC_WINDOW, 0); } +/** + * Change to named music set, and reset playback. + * @param set_name Name of music set to select + */ +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); + + InvalidateWindowData(WC_GAME_OPTIONS, WN_GAME_OPTIONS_GAME_OPTIONS, 0, true); +} + +/** Enable shuffle mode and restart playback */ +void MusicSystem::Shuffle() +{ + _settings_client.music.shuffle = true; + + this->active_playlist = this->displayed_playlist; + for (size_t i = 0; i < this->active_playlist.size(); i++) { + size_t shuffle_index = InteractiveRandom() % (this->active_playlist.size() - i); + std::swap(this->active_playlist[i], this->active_playlist[i + shuffle_index]); + } + + if (_settings_client.music.playing) this->Play(); + + InvalidateWindowData(WC_MUSIC_WINDOW, 0); +} + +/** Disable shuffle and restart playback */ +void MusicSystem::Unshuffle() +{ + _settings_client.music.shuffle = false; + this->active_playlist = this->displayed_playlist; + + if (_settings_client.music.playing) this->Play(); + + InvalidateWindowData(WC_MUSIC_WINDOW, 0); +} + +/** Start/restart playback at current song */ +void MusicSystem::Play() +{ + /* Always set the playing flag, even if there is no music */ + _settings_client.music.playing = true; + MusicDriver::GetInstance()->StopSong(); + /* Make sure playlist_position is a valid index, if playlist has changed etc. */ + this->ChangePlaylistPosition(0); + + /* If there is no music, don't try to play it */ + if (this->active_playlist.empty()) return; + + MusicSongInfo song = this->active_playlist[this->playlist_position]; + if (_game_mode == GM_MENU && this->selected_playlist == PLCH_THEMEONLY) song.loop = true; + MusicDriver::GetInstance()->PlaySong(song); + + InvalidateWindowData(WC_MUSIC_WINDOW, 0); +} + +/** Stop playback and set flag that we don't intend to play music */ +void MusicSystem::Stop() +{ + MusicDriver::GetInstance()->StopSong(); + _settings_client.music.playing = false; + + InvalidateWindowData(WC_MUSIC_WINDOW, 0); +} + +/** Skip to next track */ +void MusicSystem::Next() +{ + this->ChangePlaylistPosition(+1); + if (_settings_client.music.playing) this->Play(); + + InvalidateWindowData(WC_MUSIC_WINDOW, 0); +} + +/** Skip to previous track */ +void MusicSystem::Prev() +{ + this->ChangePlaylistPosition(-1); + if (_settings_client.music.playing) this->Play(); + + InvalidateWindowData(WC_MUSIC_WINDOW, 0); +} + +/** Check that music is playing if it should, and that appropriate playlist is active for game/main menu */ +void MusicSystem::CheckStatus() +{ + if ((_game_mode == GM_MENU) != (this->selected_playlist == PLCH_THEMEONLY)) { + /* Make sure the theme-only playlist is active when on the title screen, and not during gameplay */ + this->ChangePlaylist((_game_mode == GM_MENU) ? PLCH_THEMEONLY : (PlaylistChoices)_settings_client.music.playlist); + } + if (this->active_playlist.empty()) return; + /* If we were supposed to be playing, but music has stopped, move to next song */ + if (this->IsPlaying() && !MusicDriver::GetInstance()->IsSongPlaying()) this->Next(); +} + +/** Is the player getting music right now? */ +bool MusicSystem::IsPlaying() const +{ + return _settings_client.music.playing && !this->active_playlist.empty(); +} + +/** Is shuffle mode enabled? */ +bool MusicSystem::IsShuffle() const +{ + return _settings_client.music.shuffle; +} + +/** Return the current song, or a dummy if none */ +MusicSystem::PlaylistEntry MusicSystem::GetCurrentSong() const +{ + if (!this->IsPlaying()) return PlaylistEntry(BaseMusic::GetUsedSet(), 0); + return this->active_playlist[this->playlist_position]; +} + +/** Is one of the custom playlists selected? */ +bool MusicSystem::IsCustomPlaylist() const +{ + return (this->selected_playlist == PLCH_CUSTOM1) || (this->selected_playlist == PLCH_CUSTOM2); +} + +/** + * Append a song to a custom playlist. + * Always adds to the currently active playlist. + * @param song_index Index of song in the current music set to add + */ +void MusicSystem::PlaylistAdd(size_t song_index) +{ + if (!this->IsCustomPlaylist()) return; + + /* Pick out song from the music set */ + if (song_index >= this->music_set.size()) return; + PlaylistEntry entry = this->music_set[song_index]; + + /* Check for maximum length */ + if (this->standard_playlists[this->selected_playlist].size() >= NUM_SONGS_PLAYLIST) return; + + /* Add it to the appropriate playlist, and the display */ + this->standard_playlists[this->selected_playlist].push_back(entry); + this->displayed_playlist.push_back(entry); + + /* Add it to the active playlist, if playback is shuffled select a random position to add at */ + if (this->active_playlist.empty()) { + this->active_playlist.push_back(entry); + if (this->IsPlaying()) this->Play(); + } else if (this->IsShuffle()) { + /* Generate a random position between 0 and n (inclusive, new length) to insert at */ + size_t maxpos = this->displayed_playlist.size(); + size_t newpos = InteractiveRandom() % maxpos; + this->active_playlist.insert(this->active_playlist.begin() + newpos, entry); + /* Make sure to shift up the current playback position if the song was inserted before it */ + if ((int)newpos <= this->playlist_position) this->playlist_position++; + } else { + this->active_playlist.push_back(entry); + } + + this->SaveCustomPlaylist(this->selected_playlist); + + InvalidateWindowData(WC_MUSIC_TRACK_SELECTION, 0); +} + +/** + * Remove a song from a custom playlist. + * @param song_index Index in the custom playlist to remove. + */ +void MusicSystem::PlaylistRemove(size_t song_index) +{ + if (!this->IsCustomPlaylist()) return; + + Playlist &pl = this->standard_playlists[this->selected_playlist]; + if (song_index >= pl.size()) return; + + /* Remove from "simple" playlists */ + PlaylistEntry song = pl[song_index]; + pl.erase(pl.begin() + song_index); + this->displayed_playlist.erase(this->displayed_playlist.begin() + song_index); + + /* Find in actual active playlist (may be shuffled) and remove, + * if it's the current song restart playback */ + for (size_t i = 0; i < this->active_playlist.size(); i++) { + Playlist::iterator s2 = this->active_playlist.begin() + i; + if (s2->filename == song.filename && s2->cat_index == song.cat_index) { + this->active_playlist.erase(s2); + if ((int)i == this->playlist_position && this->IsPlaying()) this->Play(); + break; + } + } + + this->SaveCustomPlaylist(this->selected_playlist); + + InvalidateWindowData(WC_MUSIC_TRACK_SELECTION, 0); +} + +/** + * Remove all songs from the current custom playlist. + * Effectively stops playback too. + */ +void MusicSystem::PlaylistClear() +{ + if (!this->IsCustomPlaylist()) return; + + this->standard_playlists[this->selected_playlist].clear(); + this->ChangePlaylist(this->selected_playlist); + + this->SaveCustomPlaylist(this->selected_playlist); +} + +/** + * Change playlist position pointer by the given offset, making sure to keep it within valid range. + * If the playlist is empty, position is always set to 0. + * @param ofs Amount to move playlist position by. + */ +void MusicSystem::ChangePlaylistPosition(int ofs) +{ + if (this->active_playlist.empty()) { + this->playlist_position = 0; + } else { + this->playlist_position += ofs; + while (this->playlist_position >= (int)this->active_playlist.size()) this->playlist_position -= (int)this->active_playlist.size(); + while (this->playlist_position < 0) this->playlist_position += (int)this->active_playlist.size(); + } +} + +/** + * Save a custom playlist to settings after modification. + * @param pl Playlist to store back + */ +void MusicSystem::SaveCustomPlaylist(PlaylistChoices pl) +{ + byte *settings_pl; + if (pl == PLCH_CUSTOM1) { + settings_pl = _settings_client.music.custom_1; + } else if (pl == PLCH_CUSTOM2) { + settings_pl = _settings_client.music.custom_2; + } else { + return; + } + + size_t num = 0; + MemSetT(settings_pl, 0, NUM_SONGS_PLAYLIST); + + for (Playlist::const_iterator song = this->standard_playlists[pl].begin(); song != this->standard_playlists[pl].end(); ++song) { + /* Music set indices in the settings playlist are 1-based, 0 means unused slot */ + settings_pl[num++] = (byte)song->set_index + 1; + } +} + + +/** + * Check music playback status and start/stop/song-finished. + * Called from main loop. + */ +void MusicLoop() +{ + _music.CheckStatus(); +} + +/** + * Change the configured music set and reset playback + * @param index Index of music set to switch to + */ +void ChangeMusicSet(int index) +{ + if (BaseMusic::GetIndexOfUsedSet() == index) return; + const char *name = BaseMusic::GetSet(index)->name; + _music.ChangeMusicSet(name); +} + +/** + * Prepare the music system for use. + * Called from \c InitializeGame + */ +void InitializeMusic() +{ + _music.BuildPlaylists(); +} + + struct MusicTrackSelectionWindow : public Window { MusicTrackSelectionWindow(WindowDesc *desc, WindowNumber number) : Window(desc) { @@ -312,6 +465,9 @@ struct MusicTrackSelectionWindow : public Window { case WID_MTS_PLAYLIST: SetDParam(0, STR_MUSIC_PLAYLIST_ALL + _settings_client.music.playlist); break; + case WID_MTS_CAPTION: + SetDParamStr(0, BaseMusic::GetUsedSet()->name); + break; } } @@ -349,13 +505,10 @@ struct MusicTrackSelectionWindow : public Window { case WID_MTS_LIST_LEFT: case WID_MTS_LIST_RIGHT: { Dimension d = {0, 0}; - for (uint i = 0; i < NUM_SONGS_AVAILABLE; i++) { - const char *song_name = GetSongName(i); - if (StrEmpty(song_name)) continue; - - SetDParam(0, GetTrackNumber(i)); + for (MusicSystem::Playlist::const_iterator song = _music.music_set.begin(); song != _music.music_set.end(); ++song) { + SetDParam(0, song->tracknr); SetDParam(1, 2); - SetDParamStr(2, GetSongName(i)); + SetDParamStr(2, song->songname); Dimension d2 = GetStringBoundingBox(STR_PLAYLIST_TRACK_NAME); d.width = max(d.width, d2.width); d.height += d2.height; @@ -375,13 +528,10 @@ struct MusicTrackSelectionWindow : public Window { GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, PC_BLACK); int y = r.top + WD_FRAMERECT_TOP; - for (uint i = 0; i < NUM_SONGS_AVAILABLE; i++) { - const char *song_name = GetSongName(i); - if (StrEmpty(song_name)) continue; - - SetDParam(0, GetTrackNumber(i)); + for (MusicSystem::Playlist::const_iterator song = _music.music_set.begin(); song != _music.music_set.end(); ++song) { + SetDParam(0, song->tracknr); SetDParam(1, 2); - SetDParamStr(2, song_name); + SetDParamStr(2, song->songname); DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_PLAYLIST_TRACK_NAME); y += FONT_HEIGHT_SMALL; } @@ -392,11 +542,10 @@ struct MusicTrackSelectionWindow : public Window { GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, PC_BLACK); int y = r.top + WD_FRAMERECT_TOP; - for (const byte *p = _playlists[_settings_client.music.playlist]; *p != 0; p++) { - uint i = *p - 1; - SetDParam(0, GetTrackNumber(i)); + for (MusicSystem::Playlist::const_iterator song = _music.active_playlist.begin(); song != _music.active_playlist.end(); ++song) { + SetDParam(0, song->tracknr); SetDParam(1, 2); - SetDParamStr(2, GetSongName(i)); + SetDParamStr(2, song->songname); DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_PLAYLIST_TRACK_NAME); y += FONT_HEIGHT_SMALL; } @@ -410,66 +559,51 @@ struct MusicTrackSelectionWindow : public Window { switch (widget) { case WID_MTS_LIST_LEFT: { // add to playlist int y = this->GetRowFromWidget(pt.y, widget, 0, FONT_HEIGHT_SMALL); - - if (_settings_client.music.playlist < 4) return; - if (!IsInsideMM(y, 0, BaseMusic::GetUsedSet()->num_available)) return; - - byte *p = _playlists[_settings_client.music.playlist]; - for (uint i = 0; i != NUM_SONGS_PLAYLIST - 1; i++) { - if (p[i] == 0) { - /* Find the actual song number */ - for (uint j = 0; j < NUM_SONGS_AVAILABLE; j++) { - if (GetTrackNumber(j) == y + 1) { - p[i] = j + 1; - break; - } - } - p[i + 1] = 0; - this->SetDirty(); - SelectSongToPlay(); - break; - } - } + _music.PlaylistAdd(y); break; } case WID_MTS_LIST_RIGHT: { // remove from playlist int y = this->GetRowFromWidget(pt.y, widget, 0, FONT_HEIGHT_SMALL); + _music.PlaylistRemove(y); + break; + } - if (_settings_client.music.playlist < 4) return; - if (!IsInsideMM(y, 0, NUM_SONGS_PLAYLIST)) return; - - byte *p = _playlists[_settings_client.music.playlist]; - for (uint i = y; i != NUM_SONGS_PLAYLIST - 1; i++) { - p[i] = p[i + 1]; - } - - this->SetDirty(); - SelectSongToPlay(); + case WID_MTS_MUSICSET: { + int selected = 0; + DropDownList *dropdown = BuildMusicSetDropDownList(&selected); + ShowDropDownList(this, dropdown, selected, widget, 0, true, false); break; } case WID_MTS_CLEAR: // clear - for (uint i = 0; _playlists[_settings_client.music.playlist][i] != 0; i++) _playlists[_settings_client.music.playlist][i] = 0; - this->SetDirty(); - StopMusic(); - SelectSongToPlay(); + _music.PlaylistClear(); break; case WID_MTS_ALL: case WID_MTS_OLD: case WID_MTS_NEW: case WID_MTS_EZY: case WID_MTS_CUSTOM1: case WID_MTS_CUSTOM2: // set playlist - SelectPlaylist(widget - WID_MTS_ALL); - StopMusic(); - SelectSongToPlay(); + _music.ChangePlaylist((MusicSystem::PlaylistChoices)(widget - WID_MTS_ALL)); break; } } + + virtual void OnDropdownSelect(int widget, int index) + { + switch (widget) { + case WID_MTS_MUSICSET: + ChangeMusicSet(index); + break; + default: + NOT_REACHED(); + } + } }; static const NWidgetPart _nested_music_track_selection_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), - NWidget(WWT_CAPTION, COLOUR_GREY), SetDataTip(STR_PLAYLIST_MUSIC_PROGRAM_SELECTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), + NWidget(WWT_CAPTION, COLOUR_GREY, WID_MTS_CAPTION), SetDataTip(STR_PLAYLIST_MUSIC_SELECTION_SETNAME, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_MTS_MUSICSET), SetDataTip(STR_PLAYLIST_CHANGE_SET, STR_PLAYLIST_TOOLTIP_CHANGE_SET), EndContainer(), NWidget(WWT_PANEL, COLOUR_GREY), NWidget(NWID_HORIZONTAL), SetPIP(2, 4, 2), @@ -522,6 +656,20 @@ struct MusicWindow : public Window { this->InitNested(number); this->LowerWidget(_settings_client.music.playlist + WID_M_ALL); this->SetWidgetLoweredState(WID_M_SHUFFLE, _settings_client.music.shuffle); + + UpdateDisabledButtons(); + } + + void UpdateDisabledButtons() + { + /* Disable music control widgets if there is no music + * -- except Programme button! So you can still select a music set. */ + this->SetWidgetsDisabledState( + BaseMusic::GetUsedSet()->num_available == 0, + WID_M_PREV, WID_M_NEXT, WID_M_STOP, WID_M_PLAY, WID_M_SHUFFLE, + WID_M_ALL, WID_M_OLD, WID_M_NEW, WID_M_EZY, WID_M_CUSTOM1, WID_M_CUSTOM2, + WIDGET_LIST_END + ); } virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) @@ -548,8 +696,8 @@ struct MusicWindow : public Window { case WID_M_TRACK_NAME: { Dimension d = GetStringBoundingBox(STR_MUSIC_TITLE_NONE); - for (uint i = 0; i < NUM_SONGS_AVAILABLE; i++) { - SetDParamStr(0, GetSongName(i)); + for (MusicSystem::Playlist::const_iterator song = _music.music_set.begin(); song != _music.music_set.end(); ++song) { + SetDParamStr(0, song->songname); d = maxdim(d, GetStringBoundingBox(STR_MUSIC_TITLE_NAME)); } d.width += WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; @@ -571,9 +719,12 @@ struct MusicWindow : public Window { switch (widget) { case WID_M_TRACK_NR: { GfxFillRect(r.left + 1, r.top + 1, r.right, r.bottom, PC_BLACK); + if (BaseMusic::GetUsedSet()->num_available == 0) { + break; + } StringID str = STR_MUSIC_TRACK_NONE; - if (_song_is_active != 0 && _music_wnd_cursong != 0) { - SetDParam(0, GetTrackNumber(_music_wnd_cursong - 1)); + if (_music.IsPlaying()) { + SetDParam(0, _music.GetCurrentSong().tracknr); SetDParam(1, 2); str = STR_MUSIC_TRACK_DIGIT; } @@ -584,24 +735,24 @@ struct MusicWindow : public Window { case WID_M_TRACK_NAME: { GfxFillRect(r.left, r.top + 1, r.right - 1, r.bottom, PC_BLACK); StringID str = STR_MUSIC_TITLE_NONE; - if (_song_is_active != 0 && _music_wnd_cursong != 0) { + if (BaseMusic::GetUsedSet()->num_available == 0) { + str = STR_MUSIC_TITLE_NOMUSIC; + } else if (_music.IsPlaying()) { str = STR_MUSIC_TITLE_NAME; - SetDParamStr(0, GetSongName(_music_wnd_cursong - 1)); + SetDParamStr(0, _music.GetCurrentSong().songname); } DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, str, TC_FROMSTRING, SA_HOR_CENTER); break; } case WID_M_MUSIC_VOL: case WID_M_EFFECT_VOL: { - DrawFrameRect(r.left, r.top + 2, r.right, r.bottom - 2, COLOUR_GREY, FR_LOWERED); + int sw = ScaleGUITrad(slider_width); + int hsw = sw / 2; + DrawFrameRect(r.left + hsw, r.top + 2, r.right - hsw, r.bottom - 2, COLOUR_GREY, FR_LOWERED); byte volume = (widget == WID_M_MUSIC_VOL) ? _settings_client.music.music_vol : _settings_client.music.effect_vol; - int x = (volume * (r.right - r.left) / 127); - if (_current_text_dir == TD_RTL) { - x = r.right - x; - } else { - x += r.left; - } - DrawFrameRect(x, r.top, x + slider_width, r.bottom, COLOUR_GREY, FR_NONE); + if (_current_text_dir == TD_RTL) volume = 127 - volume; + int x = r.left + (volume * (r.right - r.left - sw) / 127); + DrawFrameRect(x, r.top, x + sw, r.bottom, COLOUR_GREY, FR_NONE); break; } } @@ -618,6 +769,9 @@ struct MusicWindow : public Window { for (int i = 0; i < 6; i++) { this->SetWidgetLoweredState(WID_M_ALL + i, i == _settings_client.music.playlist); } + + UpdateDisabledButtons(); + this->SetDirty(); } @@ -625,23 +779,19 @@ struct MusicWindow : public Window { { switch (widget) { case WID_M_PREV: // skip to prev - if (!_song_is_active) return; - SkipToPrevSong(); - this->SetDirty(); + _music.Prev(); break; case WID_M_NEXT: // skip to next - if (!_song_is_active) return; - SkipToNextSong(); - this->SetDirty(); + _music.Next(); break; case WID_M_STOP: // stop playing - _settings_client.music.playing = false; + _music.Stop(); break; case WID_M_PLAY: // start playing - _settings_client.music.playing = true; + _music.Play(); break; case WID_M_MUSIC_VOL: case WID_M_EFFECT_VOL: { // volume sliders @@ -651,9 +801,12 @@ struct MusicWindow : public Window { byte new_vol = x * 127 / this->GetWidget(widget)->current_x; if (_current_text_dir == TD_RTL) new_vol = 127 - new_vol; + /* Clamp to make sure min and max are properly settable */ + if (new_vol > 124) new_vol = 127; + if (new_vol < 3) new_vol = 0; if (new_vol != *vol) { *vol = new_vol; - if (widget == WID_M_MUSIC_VOL) MusicVolumeChanged(new_vol); + if (widget == WID_M_MUSIC_VOL) MusicDriver::GetInstance()->SetVolume(new_vol); this->SetDirty(); } @@ -662,12 +815,13 @@ struct MusicWindow : public Window { } case WID_M_SHUFFLE: // toggle shuffle - _settings_client.music.shuffle ^= 1; - this->SetWidgetLoweredState(WID_M_SHUFFLE, _settings_client.music.shuffle); + if (_music.IsShuffle()) { + _music.Unshuffle(); + } else { + _music.Shuffle(); + } + this->SetWidgetLoweredState(WID_M_SHUFFLE, _music.IsShuffle()); this->SetWidgetDirty(WID_M_SHUFFLE); - StopMusic(); - SelectSongToPlay(); - this->SetDirty(); break; case WID_M_PROGRAMME: // show track selection @@ -676,10 +830,7 @@ struct MusicWindow : public Window { case WID_M_ALL: case WID_M_OLD: case WID_M_NEW: case WID_M_EZY: case WID_M_CUSTOM1: case WID_M_CUSTOM2: // playlist - SelectPlaylist(widget - WID_M_ALL); - StopMusic(); - SelectSongToPlay(); - this->SetDirty(); + _music.ChangePlaylist((MusicSystem::PlaylistChoices)(widget - WID_M_ALL)); break; } } @@ -776,6 +927,5 @@ static WindowDesc _music_window_desc( void ShowMusicWindow() { - if (BaseMusic::GetUsedSet()->num_available == 0) ShowErrorMessage(STR_ERROR_NO_SONGS, INVALID_STRING_ID, WL_WARNING); AllocateWindowDescFront(&_music_window_desc, 0); } diff --git a/src/network/core/config.h b/src/network/core/config.h index 93f75e3776..f5e73dd12d 100644 --- a/src/network/core/config.h +++ b/src/network/core/config.h @@ -55,8 +55,7 @@ static const uint NETWORK_GRF_NAME_LENGTH = 80; ///< Maximum l /** * Maximum number of GRFs that can be sent. - * This value is related to number of handles (files) OpenTTD can open. - * This is currently 64. Two are used for configuration and sound. + * This limit is reached when PACKET_UDP_SERVER_RESPONSE reaches the maximum size of SEND_MTU bytes. */ static const uint NETWORK_MAX_GRF_COUNT = 62; 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 cf98239f86..216839032b 100644 --- a/src/network/core/host.cpp +++ b/src/network/core/host.cpp @@ -24,12 +24,7 @@ */ static void NetworkFindBroadcastIPsInternal(NetworkAddressList *broadcast); -#if defined(PSP) -static void NetworkFindBroadcastIPsInternal(NetworkAddressList *broadcast) // PSP implementation -{ -} - -#elif defined(BEOS_NET_SERVER) || defined(__HAIKU__) /* doesn't have neither getifaddrs or net/if.h */ +#if defined(BEOS_NET_SERVER) || defined(__HAIKU__) /* doesn't have neither getifaddrs or net/if.h */ /* Based on Andrew Bachmann's netstat+.c. Big thanks to him! */ extern "C" int _netstat(int fd, char **output, int verbose); @@ -112,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 9608f08fa7..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__) @@ -194,29 +194,6 @@ static inline void OTTDfreeaddrinfo(struct addrinfo *ai) #define IPV6_V6ONLY 27 #endif -#if defined(PSP) -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include - -# define TCP_NODELAY 1 -# define SO_NONBLOCK 0x1009 -# define SOCKET int -# define INVALID_SOCKET -1 -# define INADDR_NONE 0xffffffff -# define closesocket close -# define GET_LAST_ERROR() sceNetInetGetErrno() -#endif /* PSP */ - /* OS/2 stuff */ #if defined(__OS2__) # define SOCKET int @@ -313,12 +290,12 @@ typedef unsigned long in_addr_t; */ static inline bool SetNonBlocking(SOCKET d) { -#ifdef WIN32 +#ifdef _WIN32 u_long nonblocking = 1; #else int nonblocking = 1; #endif -#if (defined(__BEOS__) && defined(BEOS_NET_SERVER)) || defined(PSP) +#if (defined(__BEOS__) && defined(BEOS_NET_SERVER)) return setsockopt(d, SOL_SOCKET, SO_NONBLOCK, &nonblocking, sizeof(nonblocking)) == 0; #else return ioctlsocket(d, FIONBIO, &nonblocking) == 0; diff --git a/src/network/core/tcp_connect.cpp b/src/network/core/tcp_connect.cpp index ccbf93f3c3..2dc7898824 100644 --- a/src/network/core/tcp_connect.cpp +++ b/src/network/core/tcp_connect.cpp @@ -35,7 +35,7 @@ TCPConnecter::TCPConnecter(const NetworkAddress &address) : address(address) { *_tcp_connecters.Append() = this; - if (!ThreadObject::New(TCPConnecter::ThreadEntry, this, &this->thread)) { + if (!ThreadObject::New(TCPConnecter::ThreadEntry, this, &this->thread, "ottd:tcp")) { this->Connect(); } } diff --git a/src/network/core/tcp_game.cpp b/src/network/core/tcp_game.cpp index 9b3f7b5ef3..caa378fc4c 100644 --- a/src/network/core/tcp_game.cpp +++ b/src/network/core/tcp_game.cpp @@ -45,6 +45,8 @@ NetworkRecvStatus NetworkGameSocketHandler::CloseConnection(bool error) { /* Clients drop back to the main menu */ if (!_network_server && _networking) { + extern void ClientNetworkEmergencySave(); // from network_client.cpp + ClientNetworkEmergencySave(); _switch_mode = SM_MENU; _networking = false; ShowErrorMessage(STR_NETWORK_ERROR_LOSTCONNECTION, INVALID_STRING_ID, WL_CRITICAL); diff --git a/src/network/core/udp.cpp b/src/network/core/udp.cpp index ce5f06b1f2..d2dc15d427 100644 --- a/src/network/core/udp.cpp +++ b/src/network/core/udp.cpp @@ -252,17 +252,20 @@ void NetworkUDPSocketHandler::ReceiveNetworkGameInfo(Packet *p, NetworkGameInfo *dst = c; dst = &c->next; } - /* FALL THROUGH */ + FALLTHROUGH; } + case 3: info->game_date = Clamp(p->Recv_uint32(), 0, MAX_DATE); info->start_date = Clamp(p->Recv_uint32(), 0, MAX_DATE); - /* FALL THROUGH */ + FALLTHROUGH; + case 2: info->companies_max = p->Recv_uint8 (); info->companies_on = p->Recv_uint8 (); info->spectators_max = p->Recv_uint8 (); - /* FALL THROUGH */ + FALLTHROUGH; + case 1: p->Recv_string(info->server_name, sizeof(info->server_name)); p->Recv_string(info->server_revision, sizeof(info->server_revision)); diff --git a/src/network/network_chat_gui.cpp b/src/network/network_chat_gui.cpp index 3416762d02..68e1489874 100644 --- a/src/network/network_chat_gui.cpp +++ b/src/network/network_chat_gui.cpp @@ -110,7 +110,7 @@ void CDECL NetworkAddChatMessage(TextColour colour, uint duration, const char *m void NetworkReInitChatBoxSize() { _chatmsg_box.y = 3 * FONT_HEIGHT_NORMAL; - _chatmsg_box.height = MAX_CHAT_MESSAGES * (FONT_HEIGHT_NORMAL + NETWORK_CHAT_LINE_SPACING) + 2; + _chatmsg_box.height = MAX_CHAT_MESSAGES * (FONT_HEIGHT_NORMAL + NETWORK_CHAT_LINE_SPACING) + 4; _chatmessage_backup = ReallocT(_chatmessage_backup, _chatmsg_box.width * _chatmsg_box.height * BlitterFactory::GetCurrentBlitter()->GetBytesPerPixel()); } @@ -492,10 +492,13 @@ struct NetworkChatWindow : public Window { virtual void OnClick(Point pt, int widget, int click_count) { switch (widget) { - /* Send */ - case WID_NC_SENDBUTTON: SendChat(this->message_editbox.text.buf, this->dtype, this->dest); - /* FALL THROUGH */ - case WID_NC_CLOSE: /* Cancel */ delete this; break; + case WID_NC_SENDBUTTON: /* Send */ + SendChat(this->message_editbox.text.buf, this->dtype, this->dest); + FALLTHROUGH; + + case WID_NC_CLOSE: /* Cancel */ + delete this; + break; } } diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index d4d294146e..4b066681d7 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -119,6 +119,19 @@ struct PacketReader : LoadFilter { }; +/** + * Create an emergency savegame when the network connection is lost. + */ +void ClientNetworkEmergencySave() +{ + if (!_settings_client.gui.autosave_on_network_disconnect) return; + + const char *filename = "netsave.sav"; + DEBUG(net, 0, "Client: Performing emergency save (%s)", filename); + SaveOrLoad(filename, SLO_SAVE, DFT_GAME_FILE, AUTOSAVE_DIR, false); +} + + /** * Create a new socket for the client side of the game connection. * @param s The socket to connect with. @@ -520,7 +533,7 @@ bool ClientNetworkGameSocketHandler::IsConnected() * DEF_CLIENT_RECEIVE_COMMAND has parameter: Packet *p ************/ -extern bool SafeLoad(const char *filename, int mode, GameMode newgm, Subdirectory subdir, struct LoadFilter *lf = NULL); +extern bool SafeLoad(const char *filename, SaveLoadOperation fop, DetailedFileType dft, GameMode newgm, Subdirectory subdir, struct LoadFilter *lf = NULL); NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *p) { @@ -670,6 +683,9 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p ShowErrorMessage(err, INVALID_STRING_ID, WL_CRITICAL); + /* Perform an emergency save if we had already entered the game */ + if (this->status == STATUS_ACTIVE) ClientNetworkEmergencySave(); + DeleteWindowById(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN); return NETWORK_RECV_STATUS_SERVER_ERROR; @@ -836,7 +852,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet /* The map is done downloading, load it */ ClearErrorMessages(); - bool load_success = SafeLoad(NULL, SL_LOAD, GM_NORMAL, NO_DIRECTORY, lf); + bool load_success = SafeLoad(NULL, SLO_LOAD, DFT_GAME_FILE, GM_NORMAL, NO_DIRECTORY, lf); /* Long savegame loads shouldn't affect the lag calculation! */ this->last_packet = _realtime_tick; @@ -965,7 +981,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHAT(Packet *p) /* For speaking to company or giving money, we need the company-name */ case NETWORK_ACTION_GIVE_MONEY: if (!Company::IsValidID(ci_to->client_playas)) return NETWORK_RECV_STATUS_OKAY; - /* FALL THROUGH */ + FALLTHROUGH; + case NETWORK_ACTION_CHAT_COMPANY: { StringID str = Company::IsValidID(ci_to->client_playas) ? STR_COMPANY_NAME : STR_NETWORK_SPECTATORS; SetDParam(0, ci_to->client_playas); @@ -1050,6 +1067,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SHUTDOWN(Packet ShowErrorMessage(STR_NETWORK_MESSAGE_SERVER_SHUTDOWN, INVALID_STRING_ID, WL_CRITICAL); } + if (this->status == STATUS_ACTIVE) ClientNetworkEmergencySave(); + return NETWORK_RECV_STATUS_SERVER_ERROR; } @@ -1065,6 +1084,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEWGAME(Packet ShowErrorMessage(STR_NETWORK_MESSAGE_SERVER_REBOOT, INVALID_STRING_ID, WL_CRITICAL); } + if (this->status == STATUS_ACTIVE) ClientNetworkEmergencySave(); + return NETWORK_RECV_STATUS_SERVER_ERROR; } @@ -1152,6 +1173,7 @@ void ClientNetworkGameSocketHandler::CheckConnection() if (lag > 20) { this->NetworkGameSocketHandler::CloseConnection(); ShowErrorMessage(STR_NETWORK_ERROR_LOSTCONNECTION, INVALID_STRING_ID, WL_CRITICAL); + ClientNetworkEmergencySave(); return; } diff --git a/src/network/network_command.cpp b/src/network/network_command.cpp index 6e5458fd86..bc08bc5f14 100644 --- a/src/network/network_command.cpp +++ b/src/network/network_command.cpp @@ -27,7 +27,7 @@ static CommandCallback * const _callback_table[] = { /* 0x01 */ CcBuildPrimaryVehicle, /* 0x02 */ CcBuildAirport, /* 0x03 */ CcBuildBridge, - /* 0x04 */ CcBuildCanal, + /* 0x04 */ CcPlaySound_SPLAT_WATER, /* 0x05 */ CcBuildDocks, /* 0x06 */ CcFoundTown, /* 0x07 */ CcBuildRoadTunnel, @@ -36,9 +36,9 @@ static CommandCallback * const _callback_table[] = { /* 0x0A */ CcRoadDepot, /* 0x0B */ CcRailDepot, /* 0x0C */ CcPlaceSign, - /* 0x0D */ CcPlaySound10, - /* 0x0E */ CcPlaySound1D, - /* 0x0F */ CcPlaySound1E, + /* 0x0D */ CcPlaySound_EXPLOSION, + /* 0x0E */ CcPlaySound_SPLAT_OTHER, + /* 0x0F */ CcPlaySound_SPLAT_RAIL, /* 0x10 */ CcStation, /* 0x11 */ CcTerraform, /* 0x12 */ CcAI, diff --git a/src/network/network_content.cpp b/src/network/network_content.cpp index 174dbdafe6..e998aaeaf1 100644 --- a/src/network/network_content.cpp +++ b/src/network/network_content.cpp @@ -57,7 +57,7 @@ bool ClientNetworkContentSocketHandler::Receive_SERVER_INFO(Packet *p) ci->filesize = p->Recv_uint32(); p->Recv_string(ci->name, lengthof(ci->name)); - p->Recv_string(ci->version, lengthof(ci->name)); + p->Recv_string(ci->version, lengthof(ci->version)); p->Recv_string(ci->url, lengthof(ci->url)); p->Recv_string(ci->description, lengthof(ci->description), SVS_REPLACE_WITH_QUESTION_MARK | SVS_ALLOW_NEWLINE); @@ -220,10 +220,9 @@ void ClientNetworkContentSocketHandler::RequestContentList(uint count, const Con while (count > 0) { /* We can "only" send a limited number of IDs in a single packet. * A packet begins with the packet size and a byte for the type. - * Then this packet adds a byte for the content type and a uint16 - * for the count in this packet. The rest of the packet can be - * used for the IDs. */ - uint p_count = min(count, (SEND_MTU - sizeof(PacketSize) - sizeof(byte) - sizeof(byte) - sizeof(uint16)) / sizeof(uint32)); + * Then this packet adds a uint16 for the count in this packet. + * The rest of the packet can be used for the IDs. */ + uint p_count = min(count, (SEND_MTU - sizeof(PacketSize) - sizeof(byte) - sizeof(uint16)) / sizeof(uint32)); Packet *p = new Packet(PACKET_CONTENT_CLIENT_INFO_ID); p->Send_uint16(p_count); @@ -249,9 +248,9 @@ void ClientNetworkContentSocketHandler::RequestContentList(ContentVector *cv, bo this->Connect(); - /* 20 is sizeof(uint32) + sizeof(md5sum (byte[16])) */ assert(cv->Length() < 255); - assert(cv->Length() < (SEND_MTU - sizeof(PacketSize) - sizeof(byte) - sizeof(uint8)) / (send_md5sum ? 20 : sizeof(uint32))); + assert(cv->Length() < (SEND_MTU - sizeof(PacketSize) - sizeof(byte) - sizeof(uint8)) / + (sizeof(uint8) + sizeof(uint32) + (send_md5sum ? /*sizeof(ContentInfo::md5sum)*/16 : 0))); Packet *p = new Packet(send_md5sum ? PACKET_CONTENT_CLIENT_INFO_EXTID_MD5 : PACKET_CONTENT_CLIENT_INFO_EXTID); p->Send_uint8(cv->Length()); diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp index 1227d43dbb..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. @@ -908,7 +908,8 @@ public: } return ES_HANDLED; } - /* FALL THROUGH, space is pressed and filter is focused. */ + /* space is pressed and filter is focused. */ + FALLTHROUGH; default: return ES_NOT_HANDLED; diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 795d28e139..3e4a4b0501 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -1187,17 +1187,17 @@ struct NetworkStartServerWindow : public Window { case WID_NSS_LOAD_GAME: _is_network_server = true; - ShowSaveLoadDialog(SLD_LOAD_GAME); + ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break; case WID_NSS_PLAY_SCENARIO: _is_network_server = true; - ShowSaveLoadDialog(SLD_LOAD_SCENARIO); + ShowSaveLoadDialog(FT_SCENARIO, SLO_LOAD); break; case WID_NSS_PLAY_HEIGHTMAP: _is_network_server = true; - ShowSaveLoadDialog(SLD_LOAD_HEIGHTMAP); + ShowSaveLoadDialog(FT_HEIGHTMAP,SLO_LOAD); break; } } @@ -1892,7 +1892,7 @@ struct NetworkClientListWindow : Window { int diff = (num + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM) - (this->GetWidget(WID_CL_PANEL)->current_y); /* If height is changed */ if (diff != 0) { - ResizeWindow(this, 0, diff); + ResizeWindow(this, 0, diff, false); return false; } return true; @@ -2053,7 +2053,8 @@ struct NetworkJoinStatusWindow : Window { progress = 15; // We don't have the final size yet; the server is still compressing! break; } - /* FALL THROUGH */ + FALLTHROUGH; + default: // Waiting is 15%, so the resting receivement of map is maximum 70% progress = 15 + _network_join_bytes * (100 - 15) / _network_join_bytes_total; } @@ -2182,7 +2183,7 @@ struct NetworkCompanyPasswordWindow : public Window { switch (widget) { case WID_NCP_OK: this->OnOk(); - /* FALL THROUGH */ + FALLTHROUGH; case WID_NCP_CANCEL: delete this; diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 6a33c73d89..275b6200eb 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -1115,7 +1115,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet } if ((GetCommandFlags(cp.cmd) & CMD_SPECTATOR) == 0 && !Company::IsValidID(cp.company) && ci->client_id != CLIENT_ID_SERVER) { - IConsolePrintF(CC_ERROR, "WARNING: spectator issueing command from client %d (IP: %s), kicking...", ci->client_id, this->GetClientIP()); + IConsolePrintF(CC_ERROR, "WARNING: spectator issuing command from client %d (IP: %s), kicking...", ci->client_id, this->GetClientIP()); return this->SendError(NETWORK_ERROR_KICKED); } @@ -1361,7 +1361,8 @@ void NetworkServerSendChat(NetworkAction action, DestType desttype, int dest, co } default: DEBUG(net, 0, "[server] received unknown chat destination type %d. Doing broadcast instead", desttype); - /* FALL THROUGH */ + FALLTHROUGH; + case DESTTYPE_BROADCAST: FOR_ALL_CLIENT_SOCKETS(cs) { cs->SendChat(action, from_id, false, msg, data); @@ -1396,7 +1397,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_CHAT(Packet *p) switch (action) { case NETWORK_ACTION_GIVE_MONEY: if (!Company::IsValidID(ci->client_playas)) break; - /* FALL THROUGH */ + FALLTHROUGH; case NETWORK_ACTION_CHAT: case NETWORK_ACTION_CHAT_CLIENT: case NETWORK_ACTION_CHAT_COMPANY: @@ -2136,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/network/network_udp.cpp b/src/network/network_udp.cpp index 1cccbf6441..1dc6960659 100644 --- a/src/network/network_udp.cpp +++ b/src/network/network_udp.cpp @@ -109,7 +109,7 @@ static void NetworkUDPQueryServerThread(void *pntr) void NetworkUDPQueryServer(NetworkAddress address, bool manually) { NetworkUDPQueryServerInfo *info = new NetworkUDPQueryServerInfo(address, manually); - if (address.IsResolved() || !ThreadObject::New(NetworkUDPQueryServerThread, info)) { + if (address.IsResolved() || !ThreadObject::New(NetworkUDPQueryServerThread, info, NULL, "ottd:udp-query")) { NetworkUDPQueryServerThread(info); } } @@ -565,7 +565,7 @@ void NetworkUDPRemoveAdvertise(bool blocking) /* Check if we are advertising */ if (!_networking || !_network_server || !_network_udp_server) return; - if (blocking || !ThreadObject::New(NetworkUDPRemoveAdvertiseThread, NULL)) { + if (blocking || !ThreadObject::New(NetworkUDPRemoveAdvertiseThread, NULL, NULL, "ottd:udp-advert")) { NetworkUDPRemoveAdvertiseThread(NULL); } } @@ -648,7 +648,7 @@ void NetworkUDPAdvertise() if (_next_advertisement < _last_advertisement) _next_advertisement = UINT32_MAX; if (_next_retry < _last_advertisement) _next_retry = UINT32_MAX; - if (!ThreadObject::New(NetworkUDPAdvertiseThread, NULL)) { + if (!ThreadObject::New(NetworkUDPAdvertiseThread, NULL, NULL, "ottd:udp-advert")) { NetworkUDPAdvertiseThread(NULL); } } diff --git a/src/newgrf.cpp b/src/newgrf.cpp index cf45608b63..57dcb41ca5 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -12,6 +12,7 @@ #include "stdafx.h" #include +#include #include "debug.h" #include "fileio_func.h" @@ -193,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). */ @@ -312,8 +313,8 @@ struct GRFTempEngineData { Refittability refittability; ///< Did the newgrf set any refittability property? If not, default refittability will be applied. bool prop27_set; ///< Did the NewGRF set property 27 (misc flags)? uint8 rv_max_speed; ///< Temporary storage of RV prop 15, maximum speed in mph/0.8 - uint32 ctt_include_mask; ///< Cargo types always included in the refit mask. - uint32 ctt_exclude_mask; ///< Cargo types always excluded from the refit mask. + CargoTypes ctt_include_mask; ///< Cargo types always included in the refit mask. + CargoTypes ctt_exclude_mask; ///< Cargo types always excluded from the refit mask. /** * Update the summary refittability on setting a refittability property. @@ -550,24 +551,29 @@ static StringID TTDPStringIDToOTTDStringIDMapping(StringID str) */ StringID MapGRFStringID(uint32 grfid, StringID str) { - /* 0xD0 and 0xDC stand for all the TextIDs in the range - * of 0xD000 (misc graphics texts) and 0xDC00 (misc persistent texts). - * These strings are unique to each grf file, and thus require to be used with the - * grfid in which they are declared */ - switch (GB(str, 8, 8)) { - case 0xD0: case 0xD1: case 0xD2: case 0xD3: - case 0xDC: - return GetGRFStringID(grfid, str); - - case 0xD4: case 0xD5: case 0xD6: case 0xD7: - /* Strings embedded via 0x81 have 0x400 added to them (no real - * explanation why...) */ - return GetGRFStringID(grfid, str - 0x400); - - default: break; + if (IsInsideMM(str, 0xD800, 0xE000)) { + /* General text provided by NewGRF. + * In the specs this is called the 0xDCxx range (misc presistent texts), + * but we meanwhile extended the range to 0xD800-0xDFFF. + * Note: We are not involved in the "persistent" business, since we do not store + * any NewGRF strings in savegames. */ + return GetGRFStringID(grfid, str); + } else if (IsInsideMM(str, 0xD000, 0xD800)) { + /* Callback text provided by NewGRF. + * In the specs this is called the 0xD0xx range (misc graphics texts). + * These texts can be returned by various callbacks. + * + * Due to how TTDP implements the GRF-local- to global-textid translation + * texts included via 0x80 or 0x81 control codes have to add 0x400 to the textid. + * We do not care about that difference and just mask out the 0x400 bit. + */ + str &= ~0x400; + return GetGRFStringID(grfid, str); + } else { + /* The NewGRF wants to include/reference an original TTD string. + * Try our best to find an equivalent one. */ + return TTDPStringIDToOTTDStringIDMapping(str); } - - return TTDPStringIDToOTTDStringIDMapping(str); } static std::map _grf_id_overrides; @@ -728,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) @@ -937,11 +943,11 @@ static bool ReadSpriteLayout(ByteReader *buf, uint num_building_sprites, bool us } /** - * Translate the refit mask. + * Translate the refit mask. refit_mask is uint32 as it has not been mapped to CargoTypes. */ -static uint32 TranslateRefitMask(uint32 refit_mask) +static CargoTypes TranslateRefitMask(uint32 refit_mask) { - uint32 result = 0; + CargoTypes result = 0; uint8 bit; FOR_EACH_SET_BIT(bit, refit_mask) { CargoID cargo = GetCargoTranslation(bit, _cur.grffile, true); @@ -1304,7 +1310,7 @@ static ChangeInfoResult RailVehicleChangeInfo(uint engine, int numinfo, int prop uint8 count = buf->ReadByte(); _gted[e->index].UpdateRefittability(prop == 0x2C && count != 0); if (prop == 0x2C) _gted[e->index].defaultcargo_grf = _cur.grffile; - uint32 &ctt = prop == 0x2C ? _gted[e->index].ctt_include_mask : _gted[e->index].ctt_exclude_mask; + CargoTypes &ctt = prop == 0x2C ? _gted[e->index].ctt_include_mask : _gted[e->index].ctt_exclude_mask; ctt = 0; while (count--) { CargoID ctype = GetCargoTranslation(buf->ReadByte(), _cur.grffile); @@ -1402,7 +1408,7 @@ static ChangeInfoResult RoadVehicleChangeInfo(uint engine, int numinfo, int prop break; case 0x12: // SFX - rvi->sfx = buf->ReadByte(); + rvi->sfx = GetNewGRFSoundID(_cur.grffile, buf->ReadByte()); break; case PROP_ROADVEH_POWER: // Power in units of 10 HP. @@ -1492,7 +1498,7 @@ static ChangeInfoResult RoadVehicleChangeInfo(uint engine, int numinfo, int prop uint8 count = buf->ReadByte(); _gted[e->index].UpdateRefittability(prop == 0x24 && count != 0); if (prop == 0x24) _gted[e->index].defaultcargo_grf = _cur.grffile; - uint32 &ctt = prop == 0x24 ? _gted[e->index].ctt_include_mask : _gted[e->index].ctt_exclude_mask; + CargoTypes &ctt = prop == 0x24 ? _gted[e->index].ctt_include_mask : _gted[e->index].ctt_exclude_mask; ctt = 0; while (count--) { CargoID ctype = GetCargoTranslation(buf->ReadByte(), _cur.grffile); @@ -1590,7 +1596,7 @@ static ChangeInfoResult ShipVehicleChangeInfo(uint engine, int numinfo, int prop break; case 0x10: // SFX - svi->sfx = buf->ReadByte(); + svi->sfx = GetNewGRFSoundID(_cur.grffile, buf->ReadByte()); break; case 0x11: { // Cargoes available for refitting @@ -1664,7 +1670,7 @@ static ChangeInfoResult ShipVehicleChangeInfo(uint engine, int numinfo, int prop uint8 count = buf->ReadByte(); _gted[e->index].UpdateRefittability(prop == 0x1E && count != 0); if (prop == 0x1E) _gted[e->index].defaultcargo_grf = _cur.grffile; - uint32 &ctt = prop == 0x1E ? _gted[e->index].ctt_include_mask : _gted[e->index].ctt_exclude_mask; + CargoTypes &ctt = prop == 0x1E ? _gted[e->index].ctt_include_mask : _gted[e->index].ctt_exclude_mask; ctt = 0; while (count--) { CargoID ctype = GetCargoTranslation(buf->ReadByte(), _cur.grffile); @@ -1758,7 +1764,7 @@ static ChangeInfoResult AircraftVehicleChangeInfo(uint engine, int numinfo, int break; case 0x12: // SFX - avi->sfx = buf->ReadByte(); + avi->sfx = GetNewGRFSoundID(_cur.grffile, buf->ReadByte()); break; case 0x13: { // Cargoes available for refitting @@ -1814,7 +1820,7 @@ static ChangeInfoResult AircraftVehicleChangeInfo(uint engine, int numinfo, int uint8 count = buf->ReadByte(); _gted[e->index].UpdateRefittability(prop == 0x1D && count != 0); if (prop == 0x1D) _gted[e->index].defaultcargo_grf = _cur.grffile; - uint32 &ctt = prop == 0x1D ? _gted[e->index].ctt_include_mask : _gted[e->index].ctt_exclude_mask; + CargoTypes &ctt = prop == 0x1D ? _gted[e->index].ctt_include_mask : _gted[e->index].ctt_exclude_mask; ctt = 0; while (count--) { CargoID ctype = GetCargoTranslation(buf->ReadByte(), _cur.grffile); @@ -1839,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. @@ -1965,12 +1971,12 @@ static ChangeInfoResult StationChangeInfo(uint stid, int numinfo, int prop, Byte if (length == 0 || number == 0) break; if (length > statspec->lengths) { + byte diff_length = length - statspec->lengths; statspec->platforms = ReallocT(statspec->platforms, length); - memset(statspec->platforms + statspec->lengths, 0, length - statspec->lengths); + memset(statspec->platforms + statspec->lengths, 0, diff_length); statspec->layouts = ReallocT(statspec->layouts, length); - memset(statspec->layouts + statspec->lengths, 0, - (length - statspec->lengths) * sizeof(*statspec->layouts)); + memset(statspec->layouts + statspec->lengths, 0, diff_length * sizeof(*statspec->layouts)); statspec->lengths = length; } @@ -2030,9 +2036,10 @@ static ChangeInfoResult StationChangeInfo(uint stid, int numinfo, int prop, Byte break; case 0x12: // Cargo types for random triggers - statspec->cargo_triggers = buf->ReadDWord(); if (_cur.grffile->grf_version >= 7) { - statspec->cargo_triggers = TranslateRefitMask(statspec->cargo_triggers); + statspec->cargo_triggers = TranslateRefitMask(buf->ReadDWord()); + } else { + statspec->cargo_triggers = (CargoTypes)buf->ReadDWord(); } break; @@ -2546,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. */ @@ -2964,7 +2971,7 @@ static ChangeInfoResult CargoChangeInfo(uint cid, int numinfo, int prop, ByteRea case 0x0B: cs->town_effect = TE_FOOD; break; default: grfmsg(1, "CargoChangeInfo: Unknown town growth substitute value %d, setting to none.", substitute_type); - /* FALL THROUGH */ + FALLTHROUGH; case 0xFF: cs->town_effect = TE_NONE; break; } break; @@ -3010,7 +3017,7 @@ static ChangeInfoResult SoundEffectChangeInfo(uint sid, int numinfo, int prop, B } if (sid + numinfo - ORIGINAL_SAMPLE_COUNT > _cur.grffile->num_sounds) { - grfmsg(1, "SoundEffectChangeInfo: Attemting to change undefined sound effect (%u), max (%u). Ignoring.", sid + numinfo, ORIGINAL_SAMPLE_COUNT + _cur.grffile->num_sounds); + grfmsg(1, "SoundEffectChangeInfo: Attempting to change undefined sound effect (%u), max (%u). Ignoring.", sid + numinfo, ORIGINAL_SAMPLE_COUNT + _cur.grffile->num_sounds); return CIR_INVALID_ID; } @@ -3076,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; @@ -3165,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; } @@ -3194,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; @@ -3273,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; } @@ -3465,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); @@ -3637,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; @@ -3667,6 +3773,9 @@ static void DuplicateTileTable(AirportSpec *as) HangarTileTable *depot_table = MallocT(as->nof_depots); MemCpyT(depot_table, as->depot_table, as->nof_depots); as->depot_table = depot_table; + Direction *rotation = MallocT(as->num_table); + MemCpyT(rotation, as->rotation, as->num_table); + as->rotation = rotation; } /** @@ -3736,6 +3845,7 @@ static ChangeInfoResult AirportChangeInfo(uint airport, int numinfo, int prop, B } case 0x0A: { // Set airport layout + free(as->rotation); as->num_table = buf->ReadByte(); // Number of layaouts as->rotation = MallocT(as->num_table); uint32 defsize = buf->ReadDWord(); // Total size of the definition @@ -3745,7 +3855,7 @@ static ChangeInfoResult AirportChangeInfo(uint airport, int numinfo, int prop, B const AirportTileTable *copy_from; try { for (byte j = 0; j < as->num_table; j++) { - as->rotation[j] = (Direction)buf->ReadByte(); + const_cast(as->rotation[j]) = (Direction)buf->ReadByte(); for (int k = 0;; k++) { att[k].ti.x = buf->ReadByte(); // Offsets from northermost tile att[k].ti.y = buf->ReadByte(); @@ -3776,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); @@ -4089,7 +4197,7 @@ static ChangeInfoResult RailTypeChangeInfo(uint id, int numinfo, int prop, ByteR RailType rt = GetRailTypeByLabel(BSWAP32(label), false); if (rt != INVALID_RAILTYPE) { switch (prop) { - case 0x0F: SetBit(rti->powered_railtypes, rt); // Powered implies compatible. + case 0x0F: SetBit(rti->powered_railtypes, rt); FALLTHROUGH; // Powered implies compatible. case 0x0E: SetBit(rti->compatible_railtypes, rt); break; case 0x18: SetBit(rti->introduction_required_railtypes, rt); break; case 0x19: SetBit(rti->introduces_railtypes, rt); break; @@ -4206,7 +4314,7 @@ static ChangeInfoResult RailTypeReserveInfo(uint id, int numinfo, int prop, Byte break; } grfmsg(1, "RailTypeReserveInfo: Ignoring property 1D for rail type %u because no label was set", id + i); - /* FALL THROUGH */ + FALLTHROUGH; case 0x0E: // Compatible railtype list case 0x0F: // Powered railtype list @@ -4345,7 +4453,7 @@ static bool HandleChangeInfoResult(const char *caller, ChangeInfoResult cir, uin case CIR_UNKNOWN: grfmsg(0, "%s: Unknown property 0x%02X of feature 0x%02X, disabling", caller, property, feature); - /* FALL THROUGH */ + FALLTHROUGH; case CIR_INVALID_ID: { /* No debug message for an invalid ID, as it has already been output */ @@ -4678,16 +4786,63 @@ static void NewSpriteGroup(ByteReader *buf) group->adjusts = MallocT(group->num_adjusts); MemCpyT(group->adjusts, adjusts.Begin(), group->num_adjusts); - group->num_ranges = buf->ReadByte(); - if (group->num_ranges > 0) group->ranges = CallocT(group->num_ranges); - - for (uint i = 0; i < group->num_ranges; i++) { - group->ranges[i].group = GetGroupFromGroupID(setid, type, buf->ReadWord()); - group->ranges[i].low = buf->ReadVarSize(varsize); - group->ranges[i].high = buf->ReadVarSize(varsize); + std::vector ranges; + ranges.resize(buf->ReadByte()); + for (uint i = 0; i < ranges.size(); i++) { + ranges[i].group = GetGroupFromGroupID(setid, type, buf->ReadWord()); + ranges[i].low = buf->ReadVarSize(varsize); + ranges[i].high = buf->ReadVarSize(varsize); } group->default_group = GetGroupFromGroupID(setid, type, buf->ReadWord()); + group->error_group = ranges.size() > 0 ? ranges[0].group : group->default_group; + /* nvar == 0 is a special case -- we turn our value into a callback result */ + group->calculated_result = ranges.size() == 0; + + /* Sort ranges ascending. When ranges overlap, this may required clamping or splitting them */ + std::vector bounds; + for (uint i = 0; i < ranges.size(); i++) { + bounds.push_back(ranges[i].low); + if (ranges[i].high != UINT32_MAX) bounds.push_back(ranges[i].high + 1); + } + std::sort(bounds.begin(), bounds.end()); + bounds.erase(std::unique(bounds.begin(), bounds.end()), bounds.end()); + + std::vector target; + for (uint j = 0; j < bounds.size(); ++j) { + uint32 v = bounds[j]; + const SpriteGroup *t = group->default_group; + for (uint i = 0; i < ranges.size(); i++) { + if (ranges[i].low <= v && v <= ranges[i].high) { + t = ranges[i].group; + break; + } + } + target.push_back(t); + } + assert(target.size() == bounds.size()); + + std::vector optimised; + for (uint j = 0; j < bounds.size(); ) { + if (target[j] != group->default_group) { + DeterministicSpriteGroupRange r; + r.group = target[j]; + r.low = bounds[j]; + while (j < bounds.size() && target[j] == r.group) { + j++; + } + r.high = j < bounds.size() ? bounds[j] - 1 : UINT32_MAX; + optimised.push_back(r); + } else { + j++; + } + } + + group->num_ranges = (uint)optimised.size(); // cast is safe, there should never be 2**31 elements here + if (group->num_ranges > 0) { + group->ranges = MallocT(group->num_ranges); + MemCpyT(group->ranges, &optimised.front(), group->num_ranges); + } break; } @@ -4785,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; } @@ -4795,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; } @@ -5474,13 +5671,12 @@ static void FeatureNewName(ByteReader *buf) } break; - case GSF_INDUSTRIES: { - AddGRFString(_cur.grffile->grfid, id, lang, new_scheme, true, name, STR_UNDEFINED); - break; - } - - case GSF_HOUSES: default: + if (IsInsideMM(id, 0xD000, 0xD400) || IsInsideMM(id, 0xD800, 0xE000)) { + AddGRFString(_cur.grffile->grfid, id, lang, new_scheme, true, name, STR_UNDEFINED); + break; + } + switch (GB(id, 8, 8)) { case 0xC4: // Station class name if (_cur.grffile->stations == NULL || _cur.grffile->stations[GB(id, 0, 8)] == NULL) { @@ -5515,14 +5711,6 @@ static void FeatureNewName(ByteReader *buf) } break; - case 0xD0: - case 0xD1: - case 0xD2: - case 0xD3: - case 0xDC: - AddGRFString(_cur.grffile->grfid, id, lang, new_scheme, true, name, STR_UNDEFINED); - break; - default: grfmsg(7, "FeatureNewName: Unsupported ID (0x%04X)", id); break; @@ -5584,7 +5772,7 @@ static const Action5Type _action5_types[] = { /* 0x02 */ { A5BLOCK_INVALID, 0, 0, 0, "Type 0x02" }, /* 0x03 */ { A5BLOCK_INVALID, 0, 0, 0, "Type 0x03" }, /* 0x04 */ { A5BLOCK_ALLOW_OFFSET, SPR_SIGNALS_BASE, 1, PRESIGNAL_SEMAPHORE_AND_PBS_SPRITE_COUNT, "Signal graphics" }, - /* 0x05 */ { A5BLOCK_ALLOW_OFFSET, SPR_ELRAIL_BASE, 1, ELRAIL_SPRITE_COUNT, "Catenary graphics" }, + /* 0x05 */ { A5BLOCK_ALLOW_OFFSET, SPR_ELRAIL_BASE, 1, ELRAIL_SPRITE_COUNT, "Rail catenary graphics" }, /* 0x06 */ { A5BLOCK_ALLOW_OFFSET, SPR_SLOPES_BASE, 1, NORMAL_AND_HALFTILE_FOUNDATION_SPRITE_COUNT, "Foundation graphics" }, /* 0x07 */ { A5BLOCK_INVALID, 0, 75, 0, "TTDP GUI graphics" }, // Not used by OTTD. /* 0x08 */ { A5BLOCK_ALLOW_OFFSET, SPR_CANALS_BASE, 1, CANALS_SPRITE_COUNT, "Canal graphics" }, @@ -5621,7 +5809,7 @@ static void GraphicsNew(ByteReader *buf) uint16 offset = HasBit(type, 7) ? buf->ReadExtendedByte() : 0; ClrBit(type, 7); // Clear the high bit as that only indicates whether there is an offset. - if ((type == 0x0D) && (num == 10) && _cur.grffile->is_ottdfile) { + if ((type == 0x0D) && (num == 10) && HasBit(_cur.grfconfig->flags, GCF_SYSTEM)) { /* Special not-TTDP-compatible case used in openttd.grf * Missing shore sprites and initialisation of SPR_SHORE_BASE */ grfmsg(2, "GraphicsNew: Loading 10 missing shore sprites from extra grf."); @@ -5693,35 +5881,6 @@ static void SkipAct5(ByteReader *buf) grfmsg(3, "SkipAct5: Skipping %d sprites", _cur.skip_sprites); } -/** - * Check whether we are (obviously) missing some of the extra - * (Action 0x05) sprites that we like to use. - * When missing sprites are found a warning will be shown. - */ -void CheckForMissingSprites() -{ - /* Don't break out quickly, but allow to check the other - * sprites as well, so we can give the best information. */ - bool missing = false; - for (uint8 i = 0; i < lengthof(_action5_types); i++) { - const Action5Type *type = &_action5_types[i]; - if (type->block_type == A5BLOCK_INVALID) continue; - - for (uint j = 0; j < type->max_sprites; j++) { - if (!SpriteExists(type->sprite_base + j)) { - DEBUG(grf, 0, "%s sprites are missing", type->name); - missing = true; - /* No need to log more of the same. */ - break; - } - } - } - - if (missing) { - ShowErrorMessage(IsReleasedVersion() ? STR_NEWGRF_ERROR_MISSING_SPRITES : STR_NEWGRF_ERROR_MISSING_SPRITES_UNSTABLE, INVALID_STRING_ID, WL_CRITICAL); - } -} - /** * Reads a variable common to VarAction2 and Action7/9/D. * @@ -5887,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; } @@ -6199,7 +6359,7 @@ static void ScanInfo(ByteReader *buf) } /* GRF IDs starting with 0xFF are reserved for internal TTDPatch use */ - if (GB(grfid, 24, 8) == 0xFF) SetBit(_cur.grfconfig->flags, GCF_SYSTEM); + if (GB(grfid, 0, 8) == 0xFF) SetBit(_cur.grfconfig->flags, GCF_SYSTEM); AddGRFTextToList(&_cur.grfconfig->name->text, 0x7F, grfid, false, name); @@ -7273,7 +7433,7 @@ static void TranslateGRFStrings(ByteReader *buf) byte num_strings = buf->ReadByte(); uint16 first_id = buf->ReadWord(); - if (!((first_id >= 0xD000 && first_id + num_strings <= 0xD3FF) || (first_id >= 0xDC00 && first_id + num_strings <= 0xDCFF))) { + if (!((first_id >= 0xD000 && first_id + num_strings <= 0xD400) || (first_id >= 0xD800 && first_id + num_strings <= 0xE000))) { grfmsg(7, "TranslateGRFStrings: Attempting to set out-of-range string IDs in action 13 (first: 0x%4X, number: 0x%2X)", first_id, num_strings); return; } @@ -7877,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 */ @@ -7948,6 +8110,7 @@ static void ResetCustomAirports() } free(as->table); free(as->depot_table); + free(as->rotation); free(as); } @@ -8285,9 +8448,9 @@ static void CalculateRefitMasks() /* Did the newgrf specify any refitting? If not, use defaults. */ if (_gted[engine].refittability != GRFTempEngineData::UNSET) { - uint32 mask = 0; - uint32 not_mask = 0; - uint32 xor_mask = ei->refit_mask; + CargoTypes mask = 0; + CargoTypes not_mask = 0; + CargoTypes xor_mask = ei->refit_mask; /* If the original masks set by the grf are zero, the vehicle shall only carry the default cargo. * Note: After applying the translations, the vehicle may end up carrying no defined cargo. It becomes unavailable in that case. */ @@ -8308,7 +8471,7 @@ static void CalculateRefitMasks() ei->refit_mask |= _gted[engine].ctt_include_mask; ei->refit_mask &= ~_gted[engine].ctt_exclude_mask; } else { - uint32 xor_mask = 0; + CargoTypes xor_mask = 0; /* Don't apply default refit mask to wagons nor engines with no capacity */ if (e->type != VEH_TRAIN || (e->u.rail.capacity != 0 && e->u.rail.railveh_type != RAILVEH_WAGON)) { @@ -8858,11 +9021,10 @@ void LoadNewGRFFile(GRFConfig *config, uint file_index, GrfLoadingStage stage, S if (_cur.grffile == NULL) usererror("File '%s' lost in cache.\n", filename); if (stage == GLS_RESERVE && config->status != GCS_INITIALISED) return; if (stage == GLS_ACTIVATION && !HasBit(config->flags, GCF_RESERVED)) return; - _cur.grffile->is_ottdfile = config->IsOpenTTDBaseGRF(); } - if (file_index > LAST_GRF_SLOT) { - DEBUG(grf, 0, "'%s' is not loaded as the maximum number of GRFs has been reached", filename); + if (file_index >= MAX_FILE_SLOTS) { + DEBUG(grf, 0, "'%s' is not loaded as the maximum number of file slots has been reached", filename); config->status = GCS_DISABLED; config->error = new GRFError(STR_NEWGRF_ERROR_MSG_FATAL, STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED); return; @@ -9204,8 +9366,9 @@ static void AfterLoadGRFs() * Load all the NewGRFs. * @param load_index The offset for the first sprite to add. * @param file_index The Fio index of the first NewGRF to load. + * @param num_baseset Number of NewGRFs at the front of the list to look up in the baseset dir instead of the newgrf dir. */ -void LoadNewGRF(uint load_index, uint file_index) +void LoadNewGRF(uint load_index, uint file_index, uint num_baseset) { /* In case of networking we need to "sync" the start values * so all NewGRFs are loaded equally. For this we use the @@ -9264,13 +9427,14 @@ void LoadNewGRF(uint load_index, uint file_index) } uint slot = file_index; + uint num_non_static = 0; _cur.stage = stage; for (GRFConfig *c = _grfconfig; c != NULL; c = c->next) { if (c->status == GCS_DISABLED || c->status == GCS_NOT_FOUND) continue; if (stage > GLS_INIT && HasBit(c->flags, GCF_INIT_ONLY)) continue; - Subdirectory subdir = slot == file_index ? BASESET_DIR : NEWGRF_DIR; + Subdirectory subdir = slot < file_index + num_baseset ? BASESET_DIR : NEWGRF_DIR; if (!FioCheckFileExists(c->filename, subdir)) { DEBUG(grf, 0, "NewGRF file is missing '%s'; disabling", c->filename); c->status = GCS_NOT_FOUND; @@ -9278,6 +9442,16 @@ void LoadNewGRF(uint load_index, uint file_index) } if (stage == GLS_LABELSCAN) InitNewGRFFile(c); + + if (!HasBit(c->flags, GCF_STATIC) && !HasBit(c->flags, GCF_SYSTEM)) { + if (num_non_static == NETWORK_MAX_GRF_COUNT) { + DEBUG(grf, 0, "'%s' is not loaded as the maximum number of non-static GRFs has been reached", c->filename); + c->status = GCS_DISABLED; + c->error = new GRFError(STR_NEWGRF_ERROR_MSG_FATAL, STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED); + continue; + } + num_non_static++; + } LoadNewGRFFile(c, slot++, stage, subdir); if (stage == GLS_RESERVE) { SetBit(c->flags, GCF_RESERVED); diff --git a/src/newgrf.h b/src/newgrf.h index 752873a60e..1ab55dd044 100644 --- a/src/newgrf.h +++ b/src/newgrf.h @@ -103,7 +103,6 @@ struct GRFLabel { /** Dynamic data of a loaded NewGRF */ struct GRFFile : ZeroedMemoryAllocator { char *filename; - bool is_ottdfile; uint32 grfid; byte grf_version; @@ -184,7 +183,7 @@ extern GRFLoadedFeatures _loaded_newgrf_features; byte GetGRFContainerVersion(); void LoadNewGRFFile(struct GRFConfig *config, uint file_index, GrfLoadingStage stage, Subdirectory subdir); -void LoadNewGRF(uint load_index, uint file_index); +void LoadNewGRF(uint load_index, uint file_index, uint num_baseset); void ReloadNewGRFData(); // in saveload/afterload.cpp void ResetNewGRFData(); void ResetPersistentNewGRFData(); diff --git a/src/newgrf_airport.cpp b/src/newgrf_airport.cpp index 6db12f7373..6213097bd0 100644 --- a/src/newgrf_airport.cpp +++ b/src/newgrf_airport.cpp @@ -26,7 +26,18 @@ struct AirportScopeResolver : public ScopeResolver { byte layout; ///< Layout of the airport to build. TileIndex tile; ///< Tile for the callback, only valid for airporttile callbacks. - AirportScopeResolver(ResolverObject &ro, TileIndex tile, Station *st, byte airport_id, byte layout); + /** + * Constructor of the scope resolver for an airport. + * @param ro Surrounding resolver. + * @param tile %Tile for the callback, only valid for airporttile callbacks. + * @param st %Station of the airport for which the callback is run, or \c NULL for build gui. + * @param airport_id Type of airport for which the callback is run. + * @param layout Layout of the airport to build. + */ + AirportScopeResolver(ResolverObject &ro, TileIndex tile, Station *st, byte airport_id, byte layout) + : ScopeResolver(ro), st(st), airport_id(airport_id), layout(layout), tile(tile) + { + } /* virtual */ uint32 GetRandomBits() const; /* virtual */ uint32 GetVariable(byte variable, uint32 parameter, bool *available) const; @@ -205,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. */ @@ -242,22 +252,6 @@ AirportResolverObject::AirportResolverObject(TileIndex tile, Station *st, byte a this->root_spritegroup = AirportSpec::Get(airport_id)->grf_prop.spritegroup[0]; } -/** - * Constructor of the scope resolver for an airport. - * @param ro Surrounding resolver. - * @param tile %Tile for the callback, only valid for airporttile callbacks. - * @param st %Station of the airport for which the callback is run, or \c NULL for build gui. - * @param airport_id Type of airport for which the callback is run. - * @param layout Layout of the airport to build. - */ -AirportScopeResolver::AirportScopeResolver(ResolverObject &ro, TileIndex tile, Station *st, byte airport_id, byte layout) : ScopeResolver(ro) -{ - this->st = st; - this->airport_id = airport_id; - this->layout = layout; - this->tile = tile; -} - SpriteID GetCustomAirportSprite(const AirportSpec *as, byte layout) { AirportResolverObject object(INVALID_TILE, NULL, as->GetIndex(), layout); diff --git a/src/newgrf_airport.h b/src/newgrf_airport.h index 5a917c6bd1..867362e9ad 100644 --- a/src/newgrf_airport.h +++ b/src/newgrf_airport.h @@ -100,7 +100,7 @@ struct HangarTileTable { struct AirportSpec { const struct AirportFTAClass *fsm; ///< the finite statemachine for the default airports const AirportTileTable * const *table; ///< list of the tiles composing the airport - Direction *rotation; ///< the rotation of each tiletable + const Direction *rotation; ///< the rotation of each tiletable byte num_table; ///< number of elements in the table const HangarTileTable *depot_table; ///< gives the position of the depots on the airports byte nof_depots; ///< the number of hangar tiles in this airport @@ -133,7 +133,7 @@ struct AirportSpec { return (byte)(this - specs); } - static AirportSpec dummy; ///< The dummy airport. + static const AirportSpec dummy; ///< The dummy airport. private: static AirportSpec specs[NUM_AIRPORTS]; ///< Specs of the airports. diff --git a/src/newgrf_airporttiles.cpp b/src/newgrf_airporttiles.cpp index 5eb24f670f..2d3a5129c9 100644 --- a/src/newgrf_airporttiles.cpp +++ b/src/newgrf_airporttiles.cpp @@ -222,21 +222,6 @@ AirportTileResolverObject::AirportTileResolverObject(const AirportTileSpec *ats, this->root_spritegroup = ats->grf_prop.spritegroup[0]; } -/** - * Constructor of the scope resolver specific for airport tiles. - * @param ats Specification of the airport tiles. - * @param tile %Tile for the callback, only valid for airporttile callbacks. - * @param st Station of the airport for which the callback is run, or \c NULL for build gui. - */ -AirportTileScopeResolver::AirportTileScopeResolver(ResolverObject &ro, const AirportTileSpec *ats, TileIndex tile, Station *st) : ScopeResolver(ro) -{ - assert(st != NULL); - - this->st = st; - this->airport_id = st->airport.type; - this->tile = tile; -} - uint16 GetAirportTileCallback(CallbackID callback, uint32 param1, uint32 param2, const AirportTileSpec *ats, Station *st, TileIndex tile, int extra_data = 0) { AirportTileResolverObject object(ats, tile, st, callback, param1, param2); diff --git a/src/newgrf_airporttiles.h b/src/newgrf_airporttiles.h index 4d25aa9240..dc04642037 100644 --- a/src/newgrf_airporttiles.h +++ b/src/newgrf_airporttiles.h @@ -17,6 +17,7 @@ #include "newgrf_animation_type.h" #include "newgrf_commons.h" #include "newgrf_spritegroup.h" +#include "station_base.h" /** Scope resolver for handling the tiles of an airport. */ struct AirportTileScopeResolver : public ScopeResolver { @@ -24,7 +25,18 @@ struct AirportTileScopeResolver : public ScopeResolver { byte airport_id; ///< Type of airport for which the callback is run. TileIndex tile; ///< Tile for the callback, only valid for airporttile callbacks. - AirportTileScopeResolver(ResolverObject &ro, const AirportTileSpec *ats, TileIndex tile, Station *st); + /** + * Constructor of the scope resolver specific for airport tiles. + * @param ats Specification of the airport tiles. + * @param tile %Tile for the callback, only valid for airporttile callbacks. + * @param st Station of the airport for which the callback is run, or \c NULL for build gui. + */ + AirportTileScopeResolver(ResolverObject &ro, const AirportTileSpec *ats, TileIndex tile, Station *st) + : ScopeResolver(ro), st(st), tile(tile) + { + assert(st != NULL); + this->airport_id = st->airport.type; + } /* virtual */ uint32 GetRandomBits() const; /* virtual */ uint32 GetVariable(byte variable, uint32 parameter, bool *available) const; 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 loaded[0]; } -CanalScopeResolver::CanalScopeResolver(ResolverObject &ro, TileIndex tile) : ScopeResolver(ro) -{ - this->tile = tile; -} - /** * Canal resolver constructor. * @param feature Which canal feature we want. diff --git a/src/newgrf_commons.h b/src/newgrf_commons.h index 4202c18dbe..5721b7eb20 100644 --- a/src/newgrf_commons.h +++ b/src/newgrf_commons.h @@ -49,7 +49,7 @@ enum TileLayoutFlags { TLF_SPRITE_VAR10 = 0x40, ///< Resolve sprite with a specific value in variable 10. TLF_PALETTE_VAR10 = 0x80, ///< Resolve palette with a specific value in variable 10. - TLF_KNOWN_FLAGS = 0x7F, ///< Known flags. Any unknown set flag will disable the GRF. + TLF_KNOWN_FLAGS = 0xFF, ///< Known flags. Any unknown set flag will disable the GRF. /** Flags which are still required after loading the GRF. */ TLF_DRAWING_FLAGS = ~TLF_CUSTOM_PALETTE, diff --git a/src/newgrf_config.cpp b/src/newgrf_config.cpp index bd95373d91..593851e288 100644 --- a/src/newgrf_config.cpp +++ b/src/newgrf_config.cpp @@ -192,6 +192,7 @@ GRFConfig *_all_grfs; GRFConfig *_grfconfig; GRFConfig *_grfconfig_newgame; GRFConfig *_grfconfig_static; +uint _missing_extra_graphics = 0; /** * Construct a new GRFError. @@ -420,12 +421,12 @@ bool FillGRFDetails(GRFConfig *config, bool is_static, Subdirectory subdir) config->SetSuitablePalette(); config->FinalizeParameterInfo(); - /* Skip if the grfid is 0 (not read) or 0xFFFFFFFF (ttdp system grf) */ - if (config->ident.grfid == 0 || config->ident.grfid == 0xFFFFFFFF || config->IsOpenTTDBaseGRF()) return false; + /* Skip if the grfid is 0 (not read) or if it is an internal GRF */ + if (config->ident.grfid == 0 || HasBit(config->flags, GCF_SYSTEM)) return false; if (is_static) { /* Perform a 'safety scan' for static GRFs */ - LoadNewGRFFile(config, 62, GLS_SAFETYSCAN, subdir); + LoadNewGRFFile(config, CONFIG_SLOT, GLS_SAFETYSCAN, subdir); /* GCF_UNSAFE is set if GLS_SAFETYSCAN finds unsafe actions */ if (HasBit(config->flags, GCF_UNSAFE)) return false; @@ -786,7 +787,7 @@ void ScanNewGRFFiles(NewGRFScanCallback *callback) /* Only then can we really start, especially by marking the whole screen dirty. Get those other windows hidden!. */ MarkWholeScreenDirty(); - if (!VideoDriver::GetInstance()->HasGUI() || !ThreadObject::New(&DoScanNewGRFFiles, callback, NULL)) { + if (!VideoDriver::GetInstance()->HasGUI() || !ThreadObject::New(&DoScanNewGRFFiles, callback, NULL, "ottd:newgrf-scan")) { _modal_progress_work_mutex->EndCritical(); _modal_progress_paint_mutex->EndCritical(); DoScanNewGRFFiles(callback); @@ -915,15 +916,6 @@ char *GRFBuildParamList(char *dst, const GRFConfig *c, const char *last) /** Base GRF ID for OpenTTD's base graphics GRFs. */ static const uint32 OPENTTD_GRAPHICS_BASE_GRF_ID = BSWAP32(0xFF4F5400); -/** - * Checks whether this GRF is a OpenTTD base graphic GRF. - * @return true if and only if it is a base GRF. - */ -bool GRFConfig::IsOpenTTDBaseGRF() const -{ - return (this->ident.grfid & 0x00FFFFFF) == OPENTTD_GRAPHICS_BASE_GRF_ID; -} - /** * Search a textfile file next to this NewGRF. * @param type The type of the textfile to search for. diff --git a/src/newgrf_config.h b/src/newgrf_config.h index e19d8d6085..dc3b884dd3 100644 --- a/src/newgrf_config.h +++ b/src/newgrf_config.h @@ -179,8 +179,6 @@ struct GRFConfig : ZeroedMemoryAllocator { void CopyParams(const GRFConfig &src); - bool IsOpenTTDBaseGRF() const; - const char *GetTextfile(TextfileType type) const; const char *GetName() const; const char *GetDescription() const; @@ -204,6 +202,7 @@ extern GRFConfig *_all_grfs; ///< First item in list of all scanned New extern GRFConfig *_grfconfig; ///< First item in list of current GRF set up extern GRFConfig *_grfconfig_newgame; ///< First item in list of default GRF set up extern GRFConfig *_grfconfig_static; ///< First item in list of static GRF set up +extern uint _missing_extra_graphics; ///< Number of sprites provided by the fallback extra GRF, i.e. missing in the baseset. /** Callback for NewGRF scanning. */ struct NewGRFScanCallback { @@ -216,7 +215,6 @@ struct NewGRFScanCallback { size_t GRFGetSizeOfDataSection(FILE *f); void ScanNewGRFFiles(NewGRFScanCallback *callback); -void CheckForMissingSprites(); const GRFConfig *FindGRFConfig(uint32 grfid, FindGRFConfigMode mode, const uint8 *md5sum = NULL, uint32 desired_version = 0); GRFConfig *GetGRFConfig(uint32 grfid, uint32 mask = 0xFFFFFFFF); GRFConfig **CopyGRFConfigList(GRFConfig **dst, const GRFConfig *src, bool init_only); diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp index 4aafa10f9f..660b7e476b 100644 --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -347,21 +347,6 @@ static byte MapAircraftMovementAction(const Aircraft *v) return this->v == NULL ? 0 : this->v->waiting_triggers; } -/* virtual */ void VehicleScopeResolver::SetTriggers(int triggers) const -{ - /* Evil cast to get around const-ness. This used to be achieved by an - * innocent looking function pointer cast... Currently I cannot see a - * way of avoiding this without removing consts deep within gui code. - */ - Vehicle *v = const_cast(this->v); - - /* This function must only be called when processing triggers -- any - * other time is an error. */ - assert(this->ro.trigger != 0); - - if (v != NULL) v->waiting_triggers = triggers; -} - /* virtual */ ScopeResolver *VehicleResolverObject::GetScope(VarSpriteGroupScope scope, byte relative) { @@ -952,21 +937,6 @@ static uint32 VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *object, return in_motion ? group->loaded[set] : group->loading[set]; } -/** - * Scope resolver of a single vehicle. - * @param ro Surrounding resolver. - * @param engine_type Engine type - * @param v %Vehicle being resolved. - * @param info_view Indicates if the item is being drawn in an info window. - */ -VehicleScopeResolver::VehicleScopeResolver(ResolverObject &ro, EngineID engine_type, const Vehicle *v, bool info_view) - : ScopeResolver(ro) -{ - this->v = v; - this->self_type = engine_type; - this->info_view = info_view; -} - /** * Get the grf file associated with an engine type. * @param engine_type Engine to query. @@ -1023,17 +993,29 @@ VehicleResolverObject::VehicleResolverObject(EngineID engine_type, const Vehicle -SpriteID GetCustomEngineSprite(EngineID engine, const Vehicle *v, Direction direction, EngineImageType image_type) +void GetCustomEngineSprite(EngineID engine, const Vehicle *v, Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) { - VehicleResolverObject object(engine, v, VehicleResolverObject::WO_CACHED, false, CBID_NO_CALLBACK, image_type); - const SpriteGroup *group = object.Resolve(); - if (group == NULL || group->GetNumResults() == 0) return 0; + VehicleResolverObject object(engine, v, VehicleResolverObject::WO_CACHED, false, CBID_NO_CALLBACK); + result->Clear(); - return group->GetResult() + (direction % group->GetNumResults()); + bool sprite_stack = HasBit(EngInfo(engine)->misc_flags, EF_SPRITE_STACK); + uint max_stack = sprite_stack ? lengthof(result->seq) : 1; + for (uint stack = 0; stack < max_stack; ++stack) { + object.ResetState(); + object.callback_param1 = image_type | (stack << 8); + const SpriteGroup *group = object.Resolve(); + uint32 reg100 = sprite_stack ? GetRegister(0x100) : 0; + if (group != NULL && group->GetNumResults() != 0) { + result->seq[result->count].sprite = group->GetResult() + (direction % group->GetNumResults()); + result->seq[result->count].pal = GB(reg100, 0, 16); // zero means default recolouring + result->count++; + } + if (!HasBit(reg100, 31)) break; + } } -SpriteID GetRotorOverrideSprite(EngineID engine, const Aircraft *v, bool info_view, EngineImageType image_type) +void GetRotorOverrideSprite(EngineID engine, const struct Aircraft *v, bool info_view, EngineImageType image_type, VehicleSpriteSeq *result) { const Engine *e = Engine::Get(engine); @@ -1041,14 +1023,24 @@ SpriteID GetRotorOverrideSprite(EngineID engine, const Aircraft *v, bool info_vi assert(e->type == VEH_AIRCRAFT); assert(!(e->u.air.subtype & AIR_CTOL)); - VehicleResolverObject object(engine, v, VehicleResolverObject::WO_SELF, info_view, CBID_NO_CALLBACK, image_type); - const SpriteGroup *group = object.Resolve(); + VehicleResolverObject object(engine, v, VehicleResolverObject::WO_SELF, info_view, CBID_NO_CALLBACK); + result->Clear(); + uint rotor_pos = v == NULL || info_view ? 0 : v->Next()->Next()->state; - if (group == NULL || group->GetNumResults() == 0) return 0; - - if (v == NULL || info_view) return group->GetResult(); - - return group->GetResult() + (v->Next()->Next()->state % group->GetNumResults()); + bool sprite_stack = HasBit(e->info.misc_flags, EF_SPRITE_STACK); + uint max_stack = sprite_stack ? lengthof(result->seq) : 1; + for (uint stack = 0; stack < max_stack; ++stack) { + object.ResetState(); + object.callback_param1 = image_type | (stack << 8); + const SpriteGroup *group = object.Resolve(); + uint32 reg100 = sprite_stack ? GetRegister(0x100) : 0; + if (group != NULL && group->GetNumResults() != 0) { + result->seq[result->count].sprite = group->GetResult() + (rotor_pos % group->GetNumResults()); + result->seq[result->count].pal = GB(reg100, 0, 16); // zero means default recolouring + result->count++; + } + if (!HasBit(reg100, 31)) break; + } } @@ -1118,13 +1110,18 @@ static void DoTriggerVehicle(Vehicle *v, VehicleTrigger trigger, byte base_rando assert(v != NULL); VehicleResolverObject object(v->engine_type, v, VehicleResolverObject::WO_CACHED, false, CBID_RANDOM_TRIGGER); - object.trigger = trigger; + object.waiting_triggers = v->waiting_triggers | trigger; + v->waiting_triggers = object.waiting_triggers; // store now for var 5F const SpriteGroup *group = object.Resolve(); if (group == NULL) return; + /* Store remaining triggers. */ + v->waiting_triggers = object.GetRemainingTriggers(); + + /* Rerandomise bits. Scopes other than SELF are invalid for rerandomisation. For bug-to-bug-compatibility with TTDP we ignore the scope. */ byte new_random_bits = Random(); - uint32 reseed = object.GetReseedSum(); // The scope only affects triggers, not the reseeding + uint32 reseed = object.GetReseedSum(); v->random_bits &= ~reseed; v->random_bits |= (first ? new_random_bits : base_random_bits) & reseed; diff --git a/src/newgrf_engine.h b/src/newgrf_engine.h index 4a6f211c49..51adb0b7fb 100644 --- a/src/newgrf_engine.h +++ b/src/newgrf_engine.h @@ -26,14 +26,23 @@ struct VehicleScopeResolver : public ScopeResolver { EngineID self_type; ///< Type of the vehicle. bool info_view; ///< Indicates if the item is being drawn in an info window. - VehicleScopeResolver(ResolverObject &ro, EngineID engine_type, const Vehicle *v, bool info_view); + /** + * Scope resolver of a single vehicle. + * @param ro Surrounding resolver. + * @param engine_type Engine type + * @param v %Vehicle being resolved. + * @param info_view Indicates if the item is being drawn in an info window. + */ + VehicleScopeResolver(ResolverObject &ro, EngineID engine_type, const Vehicle *v, bool info_view) + : ScopeResolver(ro), v(v), self_type(engine_type), info_view(info_view) + { + } void SetVehicle(const Vehicle *v) { this->v = v; } /* virtual */ uint32 GetRandomBits() const; /* virtual */ uint32 GetVariable(byte variable, uint32 parameter, bool *available) const; /* virtual */ uint32 GetTriggers() const; - /* virtual */ void SetTriggers(int triggers) const; }; /** Resolver for a vehicle (chain) */ @@ -64,13 +73,19 @@ static const uint TRAININFO_DEFAULT_VEHICLE_WIDTH = 29; static const uint ROADVEHINFO_DEFAULT_VEHICLE_WIDTH = 32; static const uint VEHICLEINFO_FULL_VEHICLE_WIDTH = 32; +struct VehicleSpriteSeq; + void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const struct SpriteGroup *group, EngineID *train_id, uint trains); const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, EngineID overriding_engine); void SetCustomEngineSprites(EngineID engine, byte cargo, const struct SpriteGroup *group); -SpriteID GetCustomEngineSprite(EngineID engine, const Vehicle *v, Direction direction, EngineImageType image_type); -SpriteID GetRotorOverrideSprite(EngineID engine, const struct Aircraft *v, bool info_view, EngineImageType image_type); -#define GetCustomRotorSprite(v, i, image_type) GetRotorOverrideSprite(v->engine_type, v, i, image_type) -#define GetCustomRotorIcon(et, image_type) GetRotorOverrideSprite(et, NULL, true, image_type) + +void GetCustomEngineSprite(EngineID engine, const Vehicle *v, Direction direction, EngineImageType image_type, VehicleSpriteSeq *result); +#define GetCustomVehicleSprite(v, direction, image_type, result) GetCustomEngineSprite(v->engine_type, v, direction, image_type, result) +#define GetCustomVehicleIcon(et, direction, image_type, result) GetCustomEngineSprite(et, NULL, direction, image_type, result) + +void GetRotorOverrideSprite(EngineID engine, const struct Aircraft *v, bool info_view, EngineImageType image_type, VehicleSpriteSeq *result); +#define GetCustomRotorSprite(v, i, image_type, result) GetRotorOverrideSprite(v->engine_type, v, i, image_type, result) +#define GetCustomRotorIcon(et, image_type, result) GetRotorOverrideSprite(et, NULL, true, image_type, result) /* Forward declaration of GRFFile, to avoid unnecessary inclusion of newgrf.h * elsewhere... */ @@ -81,8 +96,6 @@ void SetEngineGRF(EngineID engine, const struct GRFFile *file); uint16 GetVehicleCallback(CallbackID callback, uint32 param1, uint32 param2, EngineID engine, const Vehicle *v); uint16 GetVehicleCallbackParent(CallbackID callback, uint32 param1, uint32 param2, EngineID engine, const Vehicle *v, const Vehicle *parent); bool UsesWagonOverride(const Vehicle *v); -#define GetCustomVehicleSprite(v, direction, image_type) GetCustomEngineSprite(v->engine_type, v, direction, image_type) -#define GetCustomVehicleIcon(et, direction, image_type) GetCustomEngineSprite(et, NULL, direction, image_type) /* Handler to Evaluate callback 36. If the callback fails (i.e. most of the * time) orig_value is returned */ diff --git a/src/newgrf_generic.cpp b/src/newgrf_generic.cpp index 9bd77239aa..eb2cbf08f1 100644 --- a/src/newgrf_generic.cpp +++ b/src/newgrf_generic.cpp @@ -31,7 +31,16 @@ struct GenericScopeResolver : public ScopeResolver { uint8 count; uint8 station_size; - GenericScopeResolver(ResolverObject &ro, bool ai_callback); + /** + * Generic scope resolver. + * @param ro Surrounding resolver. + * @param ai_callback Callback comes from the AI. + */ + GenericScopeResolver(ResolverObject &ro, bool ai_callback) + : ScopeResolver(ro), cargo_type(0), default_selection(0), src_industry(0), dst_industry(0), distance(0), + event(), count(0), station_size(0), ai_callback(ai_callback) + { + } /* virtual */ uint32 GetVariable(byte variable, uint32 parameter, bool *available) const; @@ -145,24 +154,6 @@ GenericResolverObject::GenericResolverObject(bool ai_callback, CallbackID callba { } -/** - * Generic scope resolver. - * @param ro Surrounding resolver. - * @param ai_callback Callback comes from the AI. - */ -GenericScopeResolver::GenericScopeResolver(ResolverObject &ro, bool ai_callback) : ScopeResolver(ro) -{ - this->cargo_type = 0; - this->default_selection = 0; - this->src_industry = 0; - this->dst_industry = 0; - this->distance = 0; - this->event = (AIConstructionEvent)0; - this->count = 0; - this->station_size = 0; - this->ai_callback = ai_callback; -} - /** * Follow a generic feature callback list and return the first successful @@ -171,8 +162,7 @@ GenericScopeResolver::GenericScopeResolver(ResolverObject &ro, bool ai_callback) * @param object pre-populated resolver object * @param param1_grfv7 callback_param1 for GRFs up to version 7. * @param param1_grfv8 callback_param1 for GRFs from version 8 on. - * @param [out] file Optionally returns the GRFFile which made the final decision for the callback result. - * May be NULL if not required. + * @param[out] file Optionally returns the GRFFile which made the final decision for the callback result. May be NULL if not required. * @return callback value if successful or CALLBACK_FAILED */ static uint16 GetGenericCallbackResult(uint8 feature, ResolverObject &object, uint32 param1_grfv7, uint32 param1_grfv8, const GRFFile **file) @@ -211,8 +201,7 @@ static uint16 GetGenericCallbackResult(uint8 feature, ResolverObject &object, ui * @param event 'AI construction event' to pass to callback. (Variable 86) * @param count 'Construction number' to pass to callback. (Variable 87) * @param station_size 'Station size' to pass to callback. (Variable 88) - * @param [out] file Optionally returns the GRFFile which made the final decision for the callback result. - * May be NULL if not required. + * @param[out] file Optionally returns the GRFFile which made the final decision for the callback result. May be NULL if not required. * @return callback value if successful or CALLBACK_FAILED */ uint16 GetAiPurchaseCallbackResult(uint8 feature, CargoID cargo_type, uint8 default_selection, IndustryType src_industry, IndustryType dst_industry, uint8 distance, AIConstructionEvent event, uint8 count, uint8 station_size, const GRFFile **file) diff --git a/src/newgrf_gui.cpp b/src/newgrf_gui.cpp index cc63f7b577..d506eb026c 100644 --- a/src/newgrf_gui.cpp +++ b/src/newgrf_gui.cpp @@ -39,10 +39,6 @@ #include #include "safeguards.h" -/* Maximum number of NewGRFs that may be loaded. Six reserved slots are: - * 0 - config, 1 - sound, 2 - base, 3 - logos, 4 - climate, 5 - extra */ -static const int MAX_NEWGRFS = MAX_FILE_SLOTS - 6; - /** * Show the first NewGRF error we can find. */ @@ -1036,7 +1032,8 @@ struct NewGRFWindow : public Window, NewGRFScanCallback { if (this->editable && this->active_sel != NULL) SetObjectToPlaceWnd(SPR_CURSOR_MOUSE, PAL_NONE, HT_DRAG, this); break; } - /* FALL THROUGH, with double click. */ + /* With double click, continue */ + FALLTHROUGH; } case WID_NS_REMOVE: { // Remove GRF @@ -1091,7 +1088,8 @@ struct NewGRFWindow : public Window, NewGRFScanCallback { if (this->editable && this->avail_sel != NULL && !HasBit(this->avail_sel->flags, GCF_INVALID)) SetObjectToPlaceWnd(SPR_CURSOR_MOUSE, PAL_NONE, HT_DRAG, this); break; } - /* FALL THROUGH, with double click. */ + /* With double click, continue */ + FALLTHROUGH; } case WID_NS_ADD: @@ -1229,10 +1227,12 @@ struct NewGRFWindow : public Window, NewGRFScanCallback { } this->avails.ForceRebuild(); - /* FALL THROUGH */ + FALLTHROUGH; + case GOID_NEWGRF_LIST_EDITED: this->preset = -1; - /* FALL THROUGH */ + FALLTHROUGH; + case GOID_NEWGRF_PRESET_LOADED: { /* Update scrollbars */ int i = 0; @@ -1279,7 +1279,6 @@ struct NewGRFWindow : public Window, NewGRFScanCallback { /* All widgets are now enabled, so disable widgets we can't use */ if (this->active_sel == this->actives) this->DisableWidget(WID_NS_MOVE_UP); if (this->active_sel->next == NULL) this->DisableWidget(WID_NS_MOVE_DOWN); - if (this->active_sel->IsOpenTTDBaseGRF()) this->DisableWidget(WID_NS_REMOVE); } this->SetWidgetDisabledState(WID_NS_PRESET_DELETE, this->preset == -1); @@ -1510,7 +1509,7 @@ private: { if (this->avail_sel == NULL || !this->editable || HasBit(this->avail_sel->flags, GCF_INVALID)) return false; - int count = 0; + uint count = 0; GRFConfig **entry = NULL; GRFConfig **list; /* Find last entry in the list, checking for duplicate grfid on the way */ @@ -1520,10 +1519,10 @@ private: ShowErrorMessage(STR_NEWGRF_DUPLICATE_GRFID, INVALID_STRING_ID, WL_INFO); return false; } - count++; + if (!HasBit((*list)->flags, GCF_STATIC)) count++; } if (entry == NULL) entry = list; - if (count >= MAX_NEWGRFS) { + if (count >= NETWORK_MAX_GRF_COUNT) { ShowErrorMessage(STR_NEWGRF_TOO_MANY_NEWGRFS, INVALID_STRING_ID, WL_INFO); return false; } @@ -1585,8 +1584,8 @@ NewGRFWindow::GUIGRFConfigList::FilterFunction * const NewGRFWindow::filter_func /** * Custom nested widget container for the NewGRF gui. * Depending on the space in the gui, it uses either - * - two column mode, put the #acs and the #avs underneath each other and the #info next to it, or - * - three column mode, put the #avs, #acs, and #info each in its own column. + * - two column mode, put the #acs and the #avs underneath each other and the #inf next to it, or + * - three column mode, put the #avs, #acs, and #inf each in its own column. */ class NWidgetNewGRFDisplay : public NWidgetContainer { public: diff --git a/src/newgrf_house.cpp b/src/newgrf_house.cpp index 6c9c614af9..314f02b3dc 100644 --- a/src/newgrf_house.cpp +++ b/src/newgrf_house.cpp @@ -31,28 +31,6 @@ static HouseClassMapping _class_mapping[HOUSE_CLASS_MAX]; HouseOverrideManager _house_mngr(NEW_HOUSE_OFFSET, NUM_HOUSES, INVALID_HOUSE_ID); -/** - * Constructor of a house scope resolver. - * @param ro Surrounding resolver. - * @param house_id House type being queried. - * @param tile %Tile containing the house. - * @param town %Town containing the house. - * @param not_yet_constructed House is still under construction. - * @param initial_random_bits Random bits during construction checks. - * @param watched_cargo_triggers Cargo types that triggered the watched cargo callback. - */ -HouseScopeResolver::HouseScopeResolver(ResolverObject &ro, HouseID house_id, TileIndex tile, Town *town, - bool not_yet_constructed, uint8 initial_random_bits, uint32 watched_cargo_triggers) - : ScopeResolver(ro) -{ - this->house_id = house_id; - this->tile = tile; - this->town = town; - this->not_yet_constructed = not_yet_constructed; - this->initial_random_bits = initial_random_bits; - this->watched_cargo_triggers = watched_cargo_triggers; -} - /** * Retrieve the grf file associated with a house. * @param house_id House to query. @@ -78,7 +56,7 @@ static const GRFFile *GetHouseSpecGrf(HouseID house_id) */ HouseResolverObject::HouseResolverObject(HouseID house_id, TileIndex tile, Town *town, CallbackID callback, uint32 param1, uint32 param2, - bool not_yet_constructed, uint8 initial_random_bits, uint32 watched_cargo_triggers) + bool not_yet_constructed, uint8 initial_random_bits, CargoTypes watched_cargo_triggers) : ResolverObject(GetHouseSpecGrf(house_id), callback, param1, param2), house_scope(*this, house_id, tile, town, not_yet_constructed, initial_random_bits, watched_cargo_triggers), town_scope(*this, town, not_yet_constructed) // Don't access StorePSA if house is not yet constructed. @@ -169,12 +147,6 @@ void DecreaseBuildingCount(Town *t, HouseID house_id) return this->not_yet_constructed ? 0 : GetHouseTriggers(this->tile); } -/* virtual */ void HouseScopeResolver::SetTriggers(int triggers) const -{ - assert(!this->not_yet_constructed && IsValidTile(this->tile) && IsTileType(this->tile, MP_HOUSE)); - SetHouseTriggers(this->tile, triggers); -} - static uint32 GetNumHouses(HouseID house_id, const Town *town) { uint8 map_id_count, town_id_count, map_class_count, town_class_count; @@ -399,7 +371,8 @@ static uint32 GetDistanceFromNearbyHouse(uint8 parameter, TileIndex tile, HouseI case 0x66: { TileIndex testtile = GetNearbyTile(parameter, this->tile); if (!IsTileType(testtile, MP_HOUSE)) return 0xFFFFFFFF; - HouseSpec *hs = HouseSpec::Get(GetHouseType(testtile)); + HouseID nearby_house_id = GetHouseType(testtile); + HouseSpec *hs = HouseSpec::Get(nearby_house_id); /* Information about the grf local classid if the house has a class */ uint houseclass = 0; if (hs->class_id != HOUSE_NO_CLASS) { @@ -408,8 +381,8 @@ static uint32 GetDistanceFromNearbyHouse(uint8 parameter, TileIndex tile, HouseI } /* old house type or grf-local houseid */ uint local_houseid = 0; - if (this->house_id < NEW_HOUSE_OFFSET) { - local_houseid = this->house_id; + if (nearby_house_id < NEW_HOUSE_OFFSET) { + local_houseid = nearby_house_id; } else { local_houseid = (hs->grf_prop.grffile == this->ro.grffile ? 1 : 2) << 8; local_houseid |= hs->grf_prop.local_id; @@ -436,7 +409,7 @@ static uint32 GetDistanceFromNearbyHouse(uint8 parameter, TileIndex tile, HouseI } uint16 GetHouseCallback(CallbackID callback, uint32 param1, uint32 param2, HouseID house_id, Town *town, TileIndex tile, - bool not_yet_constructed, uint8 initial_random_bits, uint32 watched_cargo_triggers) + bool not_yet_constructed, uint8 initial_random_bits, CargoTypes watched_cargo_triggers) { assert(IsValidTile(tile) && (not_yet_constructed || IsTileType(tile, MP_HOUSE))); @@ -499,13 +472,13 @@ void DrawNewHouseTile(TileInfo *ti, HouseID house_id) } /* Simple wrapper for GetHouseCallback to keep the animation unified. */ -uint16 GetSimpleHouseCallback(CallbackID callback, uint32 param1, uint32 param2, const HouseSpec *spec, Town *town, TileIndex tile, uint32 extra_data) +uint16 GetSimpleHouseCallback(CallbackID callback, uint32 param1, uint32 param2, const HouseSpec *spec, Town *town, TileIndex tile, CargoTypes extra_data) { return GetHouseCallback(callback, param1, param2, spec - HouseSpec::Get(0), town, tile, false, 0, extra_data); } /** Helper class for animation control. */ -struct HouseAnimationBase : public AnimationBase { +struct HouseAnimationBase : public AnimationBase { static const CallbackID cb_animation_speed = CBID_HOUSE_ANIMATION_SPEED; static const CallbackID cb_animation_next_frame = CBID_HOUSE_ANIMATION_NEXT_FRAME; @@ -612,14 +585,19 @@ static void DoTriggerHouse(TileIndex tile, HouseTrigger trigger, byte base_rando if (hs->grf_prop.spritegroup[0] == NULL) return; HouseResolverObject object(hid, tile, Town::GetByTile(tile), CBID_RANDOM_TRIGGER); - object.trigger = trigger; + object.waiting_triggers = GetHouseTriggers(tile) | trigger; + SetHouseTriggers(tile, object.waiting_triggers); // store now for var 5F const SpriteGroup *group = object.Resolve(); if (group == NULL) return; + /* Store remaining triggers. */ + SetHouseTriggers(tile, object.GetRemainingTriggers()); + + /* Rerandomise bits. Scopes other than SELF are invalid for houses. For bug-to-bug-compatibility with TTDP we ignore the scope. */ byte new_random_bits = Random(); byte random_bits = GetHouseRandomBits(tile); - uint32 reseed = object.GetReseedSum(); // The scope only affects triggers, not the reseeding + uint32 reseed = object.GetReseedSum(); random_bits &= ~reseed; random_bits |= (first ? new_random_bits : base_random) & reseed; SetHouseRandomBits(tile, random_bits); @@ -655,7 +633,7 @@ void TriggerHouse(TileIndex t, HouseTrigger trigger) * @param trigger_cargoes Cargo types that triggered the callback. * @param random Random bits. */ -void DoWatchedCargoCallback(TileIndex tile, TileIndex origin, uint32 trigger_cargoes, uint16 random) +void DoWatchedCargoCallback(TileIndex tile, TileIndex origin, CargoTypes trigger_cargoes, uint16 random) { TileIndexDiffC diff = TileIndexToTileIndexDiffC(origin, tile); uint32 cb_info = random << 16 | (uint8)diff.y << 8 | (uint8)diff.x; @@ -668,7 +646,7 @@ void DoWatchedCargoCallback(TileIndex tile, TileIndex origin, uint32 trigger_car * @param trigger_cargoes Triggering cargo types. * @pre IsTileType(t, MP_HOUSE) */ -void WatchedCargoCallback(TileIndex tile, uint32 trigger_cargoes) +void WatchedCargoCallback(TileIndex tile, CargoTypes trigger_cargoes) { assert(IsTileType(tile, MP_HOUSE)); HouseID id = GetHouseType(tile); diff --git a/src/newgrf_house.h b/src/newgrf_house.h index 37c1679470..bb364f6fc6 100644 --- a/src/newgrf_house.h +++ b/src/newgrf_house.h @@ -25,15 +25,28 @@ struct HouseScopeResolver : public ScopeResolver { Town *town; ///< Town of this house. bool not_yet_constructed; ///< True for construction check. uint16 initial_random_bits; ///< Random bits during construction checks. - uint32 watched_cargo_triggers; ///< Cargo types that triggered the watched cargo callback. + CargoTypes watched_cargo_triggers; ///< Cargo types that triggered the watched cargo callback. + /** + * Constructor of a house scope resolver. + * @param ro Surrounding resolver. + * @param house_id House type being queried. + * @param tile %Tile containing the house. + * @param town %Town containing the house. + * @param not_yet_constructed House is still under construction. + * @param initial_random_bits Random bits during construction checks. + * @param watched_cargo_triggers Cargo types that triggered the watched cargo callback. + */ HouseScopeResolver(ResolverObject &ro, HouseID house_id, TileIndex tile, Town *town, - bool not_yet_constructed, uint8 initial_random_bits, uint32 watched_cargo_triggers); + bool not_yet_constructed, uint8 initial_random_bits, CargoTypes watched_cargo_triggers) + : ScopeResolver(ro), house_id(house_id), tile(tile), town(town), not_yet_constructed(not_yet_constructed), + initial_random_bits(initial_random_bits), watched_cargo_triggers(watched_cargo_triggers) + { + } /* virtual */ uint32 GetRandomBits() const; /* virtual */ uint32 GetVariable(byte variable, uint32 parameter, bool *available) const; /* virtual */ uint32 GetTriggers() const; - /* virtual */ void SetTriggers(int triggers) const; }; /** Resolver object to be used for houses (feature 07 spritegroups). */ @@ -43,7 +56,7 @@ struct HouseResolverObject : public ResolverObject { HouseResolverObject(HouseID house_id, TileIndex tile, Town *town, CallbackID callback = CBID_NO_CALLBACK, uint32 param1 = 0, uint32 param2 = 0, - bool not_yet_constructed = false, uint8 initial_random_bits = 0, uint32 watched_cargo_triggers = 0); + bool not_yet_constructed = false, uint8 initial_random_bits = 0, CargoTypes watched_cargo_triggers = 0); /* virtual */ ScopeResolver *GetScope(VarSpriteGroupScope scope = VSG_SCOPE_SELF, byte relative = 0) { @@ -84,8 +97,8 @@ void AnimateNewHouseTile(TileIndex tile); void AnimateNewHouseConstruction(TileIndex tile); uint16 GetHouseCallback(CallbackID callback, uint32 param1, uint32 param2, HouseID house_id, Town *town, TileIndex tile, - bool not_yet_constructed = false, uint8 initial_random_bits = 0, uint32 watched_cargo_triggers = 0); -void WatchedCargoCallback(TileIndex tile, uint32 trigger_cargoes); + bool not_yet_constructed = false, uint8 initial_random_bits = 0, CargoTypes watched_cargo_triggers = 0); +void WatchedCargoCallback(TileIndex tile, CargoTypes trigger_cargoes); bool CanDeleteHouse(TileIndex tile); diff --git a/src/newgrf_industries.cpp b/src/newgrf_industries.cpp index ef8e9fa9b7..de388c0234 100644 --- a/src/newgrf_industries.cpp +++ b/src/newgrf_industries.cpp @@ -128,7 +128,7 @@ static uint32 GetCountAndDistanceOfClosestInstance(byte param_setID, byte layout case 0xFFFFFFFF: // current grf GrfID = GetIndustrySpec(current->type)->grf_prop.grffile->grfid; - /* FALL THROUGH */ + FALLTHROUGH; default: // use the grfid specified in register 100h SetBit(param_setID, 7); // bit 7 means it is not an old type @@ -304,6 +304,33 @@ static uint32 GetCountAndDistanceOfClosestInstance(byte param_setID, byte layout return GetCountAndDistanceOfClosestInstance(parameter, layout_filter, town_filter, this->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); @@ -380,13 +410,7 @@ static uint32 GetCountAndDistanceOfClosestInstance(byte param_setID, byte layout /* virtual */ uint32 IndustriesScopeResolver::GetTriggers() const { - return this->industry != NULL ? this->industry->random_triggers : 0; -} - -/* virtual */ void IndustriesScopeResolver::SetTriggers(int triggers) const -{ - assert(this->industry != NULL && this->industry->index != INVALID_INDUSTRY); - this->industry->random_triggers = triggers; + return 0; } /* virtual */ void IndustriesScopeResolver::StorePSA(uint pos, int32 value) @@ -421,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. @@ -463,23 +487,6 @@ TownScopeResolver *IndustriesResolverObject::GetTown() return this->town_scope; } -/** - * Scope resolver for industries. - * @param ro Surrounding resolver. - * @param tile %Tile owned by the industry. - * @param industry %Industry being resolved. - * @param type Type of the industry. - * @param random_bits Random bits of the new industry. - */ -IndustriesScopeResolver::IndustriesScopeResolver(ResolverObject &ro, TileIndex tile, Industry *industry, IndustryType type, uint32 random_bits) - : ScopeResolver(ro) -{ - this->tile = tile; - this->industry = industry; - this->type = type; - this->random_bits = random_bits; -} - /** * Perform an industry callback. * @param callback The callback to perform. @@ -598,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); @@ -625,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_industries.h b/src/newgrf_industries.h index 57e44e8c05..fa809fcd73 100644 --- a/src/newgrf_industries.h +++ b/src/newgrf_industries.h @@ -21,12 +21,22 @@ struct IndustriesScopeResolver : public ScopeResolver { IndustryType type; ///< Type of the industry. uint32 random_bits; ///< Random bits of the new industry. - IndustriesScopeResolver(ResolverObject &ro, TileIndex tile, Industry *industry, IndustryType type, uint32 random_bits = 0); + /** + * Scope resolver for industries. + * @param ro Surrounding resolver. + * @param tile %Tile owned by the industry. + * @param industry %Industry being resolved. + * @param type Type of the industry. + * @param random_bits Random bits of the new industry. + */ + IndustriesScopeResolver(ResolverObject &ro, TileIndex tile, Industry *industry, IndustryType type, uint32 random_bits = 0) + : ScopeResolver(ro), tile(tile), industry(industry), type(type), random_bits(random_bits) + { + } /* virtual */ uint32 GetRandomBits() const; /* virtual */ uint32 GetVariable(byte variable, uint32 parameter, bool *available) const; /* virtual */ uint32 GetTriggers() const; - /* virtual */ void SetTriggers(int triggers) const; /* virtual */ void StorePSA(uint pos, int32 value); }; @@ -48,9 +58,11 @@ struct IndustriesResolverObject : public ResolverObject { case VSG_SCOPE_PARENT: { TownScopeResolver *tsr = this->GetTown(); if (tsr != NULL) return tsr; - /* FALL-THROUGH */ } - default: return ResolverObject::GetScope(scope, relative); + FALLTHROUGH; + + default: + return ResolverObject::GetScope(scope, relative); } } }; diff --git a/src/newgrf_industrytiles.cpp b/src/newgrf_industrytiles.cpp index 90a17550d0..0b2a55000e 100644 --- a/src/newgrf_industrytiles.cpp +++ b/src/newgrf_industrytiles.cpp @@ -117,12 +117,6 @@ uint32 GetRelativePosition(TileIndex tile, TileIndex ind_tile) return GetIndustryTriggers(this->tile); } -/* virtual */ void IndustryTileScopeResolver::SetTriggers(int triggers) const -{ - assert(this->industry != NULL && this->industry->index != INVALID_INDUSTRY && IsValidTile(this->tile) && IsTileType(this->tile, MP_INDUSTRY)); - SetIndustryTriggers(this->tile, triggers); -} - /** * Get the associated NewGRF file from the industry graphics. * @param gfx Graphics to query. @@ -152,18 +146,6 @@ IndustryTileResolverObject::IndustryTileResolverObject(IndustryGfx gfx, TileInde this->root_spritegroup = GetIndustryTileSpec(gfx)->grf_prop.spritegroup[0]; } -/** - * Constructor of the scope resolver for the industry tile. - * @param ro Surrounding resolver. - * @param industry %Industry owning the tile. - * @param tile %Tile of the industry. - */ -IndustryTileScopeResolver::IndustryTileScopeResolver(ResolverObject &ro, Industry *industry, TileIndex tile) : ScopeResolver(ro) -{ - this->industry = industry; - this->tile = tile; -} - static void IndustryDrawTileLayout(const TileInfo *ti, const TileLayoutSpriteGroup *group, byte rnd_colour, byte stage, IndustryGfx gfx) { const DrawTileSprites *dts = group->ProcessRegisters(&stage); @@ -314,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) { @@ -326,11 +308,16 @@ static void DoTriggerIndustryTile(TileIndex tile, IndustryTileTrigger trigger, I if (itspec->grf_prop.spritegroup[0] == NULL) return; IndustryTileResolverObject object(gfx, tile, ind, CBID_RANDOM_TRIGGER); - object.trigger = trigger; + object.waiting_triggers = GetIndustryTriggers(tile) | trigger; + SetIndustryTriggers(tile, object.waiting_triggers); // store now for var 5F const SpriteGroup *group = object.Resolve(); if (group == NULL) return; + /* Store remaining triggers. */ + SetIndustryTriggers(tile, object.GetRemainingTriggers()); + + /* Rerandomise tile bits */ byte new_random_bits = Random(); byte random_bits = GetIndustryRandomBits(tile); random_bits &= ~object.reseed[VSG_SCOPE_SELF]; diff --git a/src/newgrf_industrytiles.h b/src/newgrf_industrytiles.h index 394f75e1c6..6051c1062b 100644 --- a/src/newgrf_industrytiles.h +++ b/src/newgrf_industrytiles.h @@ -21,12 +21,20 @@ struct IndustryTileScopeResolver : public ScopeResolver { Industry *industry; ///< Industry owning the tiles. TileIndex tile; ///< %Tile being resolved. - IndustryTileScopeResolver(ResolverObject &ro, Industry *industry, TileIndex tile); + /** + * Constructor of the scope resolver for the industry tile. + * @param ro Surrounding resolver. + * @param industry %Industry owning the tile. + * @param tile %Tile of the industry. + */ + IndustryTileScopeResolver(ResolverObject &ro, Industry *industry, TileIndex tile) + : ScopeResolver(ro), industry(industry), tile(tile) + { + } /* virtual */ uint32 GetRandomBits() const; /* virtual */ uint32 GetVariable(byte variable, uint32 parameter, bool *available) const; /* virtual */ uint32 GetTriggers() const; - /* virtual */ void SetTriggers(int triggers) const; }; /** Resolver for industry tiles. */ diff --git a/src/newgrf_object.cpp b/src/newgrf_object.cpp index 3f48a819f5..1501cb9b8a 100644 --- a/src/newgrf_object.cpp +++ b/src/newgrf_object.cpp @@ -96,7 +96,9 @@ uint ObjectSpec::Index() const void ResetObjects() { /* Clean the pool. */ - MemSetT(_object_specs, 0, lengthof(_object_specs)); + for (uint16 i = 0; i < NUM_OBJECTS; i++) { + _object_specs[i] = {}; + } /* And add our originals. */ MemCpyT(_object_specs, _original_objects, lengthof(_original_objects)); @@ -128,21 +130,6 @@ bool NewGRFClass::IsUIAvailable(uint index) const INSTANTIATE_NEWGRF_CLASS_METHODS(ObjectClass, ObjectSpec, ObjectClassID, OBJECT_CLASS_MAX) -/** - * Constructor of an object scope resolver. - * @param ro Surrounding resolver. - * @param obj Object being resolved. - * @param tile %Tile of the object. - * @param view View of the object. - */ -ObjectScopeResolver::ObjectScopeResolver(ResolverObject &ro, Object *obj, TileIndex tile, uint8 view) - : ScopeResolver(ro) -{ - this->obj = obj; - this->tile = tile; - this->view = view; -} - /* virtual */ uint32 ObjectScopeResolver::GetRandomBits() const { return IsValidTile(this->tile) && IsTileType(this->tile, MP_OBJECT) ? GetObjectRandomBits(this->tile) : 0; @@ -232,7 +219,7 @@ static uint32 GetCountAndDistanceOfClosestInstance(byte local_id, uint32 grfid, case 0xFFFFFFFF: // current grf grf_id = grfid; - /* FALL THROUGH */ + FALLTHROUGH; default: // use the grfid specified in register 100h idx = _object_mngr.GetID(local_id, grf_id); @@ -363,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_object.h b/src/newgrf_object.h index 4a3b770d29..43c8de031c 100644 --- a/src/newgrf_object.h +++ b/src/newgrf_object.h @@ -104,7 +104,17 @@ struct ObjectScopeResolver : public ScopeResolver { TileIndex tile; ///< The tile related to the object. uint8 view; ///< The view of the object. - ObjectScopeResolver(ResolverObject &ro, Object *obj, TileIndex tile, uint8 view = 0); + /** + * Constructor of an object scope resolver. + * @param ro Surrounding resolver. + * @param obj Object being resolved. + * @param tile %Tile of the object. + * @param view View of the object. + */ + ObjectScopeResolver(ResolverObject &ro, Object *obj, TileIndex tile, uint8 view = 0) + : ScopeResolver(ro), obj(obj), tile(tile), view(view) + { + } /* virtual */ uint32 GetRandomBits() const; /* virtual */ uint32 GetVariable(byte variable, uint32 parameter, bool *available) const; @@ -128,10 +138,11 @@ struct ObjectResolverObject : public ResolverObject { case VSG_SCOPE_PARENT: { TownScopeResolver *tsr = this->GetTown(); if (tsr != NULL) return tsr; - /* FALL-THROUGH */ + FALLTHROUGH; } - default: return ResolverObject::GetScope(scope, relative); + default: + return ResolverObject::GetScope(scope, relative); } } diff --git a/src/newgrf_railtype.cpp b/src/newgrf_railtype.cpp index 8a074db974..8421844717 100644 --- a/src/newgrf_railtype.cpp +++ b/src/newgrf_railtype.cpp @@ -67,18 +67,6 @@ return NULL; } -/** - * Constructor of the railtype scope resolvers. - * @param ro Surrounding resolver. - * @param tile %Tile containing the track. For track on a bridge this is the southern bridgehead. - * @param context Are we resolving sprites for the upper halftile, or on a bridge? - */ -RailTypeScopeResolver::RailTypeScopeResolver(ResolverObject &ro, TileIndex tile, TileContext context) : ScopeResolver(ro) -{ - this->tile = tile; - this->context = context; -} - /** * Resolver object for rail types. * @param rti Railtype. NULL in NewGRF Inspect window. @@ -99,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_railtype.h b/src/newgrf_railtype.h index 4c68e7d1db..5fadcd2ab5 100644 --- a/src/newgrf_railtype.h +++ b/src/newgrf_railtype.h @@ -21,7 +21,16 @@ struct RailTypeScopeResolver : public ScopeResolver { TileIndex tile; ///< Tracktile. For track on a bridge this is the southern bridgehead. TileContext context; ///< Are we resolving sprites for the upper halftile, or on a bridge? - RailTypeScopeResolver(ResolverObject &ro, TileIndex tile, TileContext context); + /** + * Constructor of the railtype scope resolvers. + * @param ro Surrounding resolver. + * @param tile %Tile containing the track. For track on a bridge this is the southern bridgehead. + * @param context Are we resolving sprites for the upper halftile, or on a bridge? + */ + RailTypeScopeResolver(ResolverObject &ro, TileIndex tile, TileContext context) + : ScopeResolver(ro), tile(tile), context(context) + { + } /* virtual */ uint32 GetRandomBits() const; /* virtual */ uint32 GetVariable(byte variable, uint32 parameter, bool *available) const; diff --git a/src/newgrf_sound.cpp b/src/newgrf_sound.cpp index 60ee609165..0cc113d9df 100644 --- a/src/newgrf_sound.cpp +++ b/src/newgrf_sound.cpp @@ -161,6 +161,22 @@ bool LoadNewGRFSound(SoundEntry *sound) return false; } +/** + * Resolve NewGRF sound ID. + * @param file NewGRF to get sound from. + * @param sound_id GRF-specific sound ID. (GRF-local for IDs above ORIGINAL_SAMPLE_COUNT) + * @return Translated (global) sound ID, or INVALID_SOUND. + */ +SoundID GetNewGRFSoundID(const GRFFile *file, SoundID sound_id) +{ + /* Global sound? */ + if (sound_id < ORIGINAL_SAMPLE_COUNT) return sound_id; + + sound_id -= ORIGINAL_SAMPLE_COUNT; + if (file == NULL || sound_id >= file->num_sounds) return INVALID_SOUND; + + return file->sound_offset + sound_id; +} /** * Checks whether a NewGRF wants to play a different vehicle sound effect. @@ -185,14 +201,10 @@ bool PlayVehicleSound(const Vehicle *v, VehicleSoundEvent event) /* Play default sound if callback fails */ if (callback == CALLBACK_FAILED) return false; - if (callback >= ORIGINAL_SAMPLE_COUNT) { - callback -= ORIGINAL_SAMPLE_COUNT; + callback = GetNewGRFSoundID(file, callback); - /* Play no sound if result is out of range */ - if (callback > file->num_sounds) return true; - - callback += file->sound_offset; - } + /* Play no sound, if result is invalid */ + if (callback == INVALID_SOUND) return true; assert(callback < GetNumSounds()); SndPlayVehicleFx(callback, v); @@ -207,11 +219,8 @@ bool PlayVehicleSound(const Vehicle *v, VehicleSoundEvent event) */ void PlayTileSound(const GRFFile *file, SoundID sound_id, TileIndex tile) { - if (sound_id >= ORIGINAL_SAMPLE_COUNT) { - sound_id -= ORIGINAL_SAMPLE_COUNT; - if (sound_id > file->num_sounds) return; - sound_id += file->sound_offset; - } + sound_id = GetNewGRFSoundID(file, sound_id); + if (sound_id == INVALID_SOUND) return; assert(sound_id < GetNumSounds()); SndPlayTileFx(sound_id, tile); diff --git a/src/newgrf_sound.h b/src/newgrf_sound.h index 0d32953274..efded063c8 100644 --- a/src/newgrf_sound.h +++ b/src/newgrf_sound.h @@ -33,6 +33,7 @@ enum VehicleSoundEvent { SoundEntry *AllocateSound(uint num); void InitializeSoundPool(); bool LoadNewGRFSound(SoundEntry *sound); +SoundID GetNewGRFSoundID(const struct GRFFile *file, SoundID sound_id); SoundEntry *GetSound(SoundID sound_id); uint GetNumSounds(); bool PlayVehicleSound(const Vehicle *v, VehicleSoundEvent event); diff --git a/src/newgrf_spritegroup.cpp b/src/newgrf_spritegroup.cpp index 624b4d5474..1bcb4a0359 100644 --- a/src/newgrf_spritegroup.cpp +++ b/src/newgrf_spritegroup.cpp @@ -10,6 +10,7 @@ /** @file newgrf_spritegroup.cpp Handling of primarily NewGRF action 2. */ #include "stdafx.h" +#include #include "debug.h" #include "newgrf_spritegroup.h" #include "core/pool_func.hpp" @@ -60,11 +61,7 @@ RandomizedSpriteGroup::~RandomizedSpriteGroup() static inline uint32 GetVariable(const ResolverObject &object, ScopeResolver *scope, byte variable, uint32 parameter, bool *available) { - /* First handle variables common with Action7/9/D */ uint32 value; - if (GetGlobalVariable(variable, &value, object.grffile)) return value; - - /* Non-common variable */ switch (variable) { case 0x0C: return object.callback; case 0x10: return object.callback_param1; @@ -79,18 +76,14 @@ static inline uint32 GetVariable(const ResolverObject &object, ScopeResolver *sc if (object.grffile == NULL) return 0; return object.grffile->GetParam(parameter); - /* Not a common variable, so evaluate the feature specific variables */ - default: return scope->GetVariable(variable, parameter, available); + default: + /* First handle variables common with Action7/9/D */ + if (variable < 0x40 && GetGlobalVariable(variable, &value, object.grffile)) return value; + /* Not a common variable, so evaluate the feature specific variables */ + return scope->GetVariable(variable, parameter, available); } } -ScopeResolver::ScopeResolver(ResolverObject &ro) - : ro(ro) -{ -} - -ScopeResolver::~ScopeResolver() {} - /** * Get a few random bits. Default implementation has no random bits. * @return Random bits. @@ -109,12 +102,6 @@ ScopeResolver::~ScopeResolver() {} return 0; } -/** - * Set the triggers. Base class implementation does nothing. - * @param triggers Triggers to set. - */ -/* virtual */ void ScopeResolver::SetTriggers(int triggers) const {} - /** * Get a variable value. Default implementation has no available variables. * @param variable Variable to read @@ -131,32 +118,11 @@ ScopeResolver::~ScopeResolver() {} /** * 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) {} -/** - * Resolver constructor. - * @param grffile NewGRF file associated with the object (or \c NULL if none). - * @param callback Callback code being resolved (default value is #CBID_NO_CALLBACK). - * @param callback_param1 First parameter (var 10) of the callback (only used when \a callback is also set). - * @param callback_param2 Second parameter (var 18) of the callback (only used when \a callback is also set). - */ -ResolverObject::ResolverObject(const GRFFile *grffile, CallbackID callback, uint32 callback_param1, uint32 callback_param2) - : default_scope(*this) -{ - this->callback = callback; - this->callback_param1 = callback_param1; - this->callback_param2 = callback_param2; - this->ResetState(); - - this->grffile = grffile; - this->root_spritegroup = NULL; -} - -ResolverObject::~ResolverObject() {} - /** * Get the real sprites of the grf. * @param group Group to get. @@ -178,21 +144,6 @@ ResolverObject::~ResolverObject() {} 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 @@ -201,11 +152,9 @@ static U EvalAdjustT(const DeterministicSpriteGroupAdjust *adjust, ScopeResolver value >>= adjust->shift_num; value &= adjust->and_mask; - if (adjust->type != DSGA_TYPE_NONE) value += (S)adjust->add_val; - switch (adjust->type) { - case DSGA_TYPE_DIV: value /= (S)adjust->divmod_val; break; - case DSGA_TYPE_MOD: value %= (U)adjust->divmod_val; break; + case DSGA_TYPE_DIV: value = ((S)value + (S)adjust->add_val) / (S)adjust->divmod_val; break; + case DSGA_TYPE_MOD: value = ((S)value + (S)adjust->add_val) % (S)adjust->divmod_val; break; case DSGA_TYPE_NONE: break; } @@ -227,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. @@ -238,6 +187,11 @@ static U EvalAdjustT(const DeterministicSpriteGroupAdjust *adjust, ScopeResolver } +static bool RangeHighComparator(const DeterministicSpriteGroupRange& range, uint32 value) +{ + return range.high < value; +} + const SpriteGroup *DeterministicSpriteGroup::Resolve(ResolverObject &object) const { uint32 last_value = 0; @@ -269,7 +223,7 @@ const SpriteGroup *DeterministicSpriteGroup::Resolve(ResolverObject &object) con if (!available) { /* Unsupported variable: skip further processing and return either * the group from the first range or the default group. */ - return SpriteGroup::Resolve(this->num_ranges > 0 ? this->ranges[0].group : this->default_group, object, false); + return SpriteGroup::Resolve(this->error_group, object, false); } switch (this->size) { @@ -283,7 +237,7 @@ const SpriteGroup *DeterministicSpriteGroup::Resolve(ResolverObject &object) con object.last_value = last_value; - if (this->num_ranges == 0) { + if (this->calculated_result) { /* nvar == 0 is a special case -- we turn our value into a callback result */ if (value != CALLBACK_FAILED) value = GB(value, 0, 15); static CallbackResultSpriteGroup nvarzero(0, true); @@ -291,9 +245,17 @@ const SpriteGroup *DeterministicSpriteGroup::Resolve(ResolverObject &object) con return &nvarzero; } - for (i = 0; i < this->num_ranges; i++) { - if (this->ranges[i].low <= value && value <= this->ranges[i].high) { - return SpriteGroup::Resolve(this->ranges[i].group, object, false); + if (this->num_ranges > 4) { + DeterministicSpriteGroupRange *lower = std::lower_bound(this->ranges + 0, this->ranges + this->num_ranges, value, RangeHighComparator); + if (lower != this->ranges + this->num_ranges && lower->low <= value) { + assert(lower->low <= value && value <= lower->high); + return SpriteGroup::Resolve(lower->group, object, false); + } + } else { + for (i = 0; i < this->num_ranges; i++) { + if (this->ranges[i].low <= value && value <= this->ranges[i].high) { + return SpriteGroup::Resolve(this->ranges[i].group, object, false); + } } } @@ -304,21 +266,15 @@ const SpriteGroup *DeterministicSpriteGroup::Resolve(ResolverObject &object) con const SpriteGroup *RandomizedSpriteGroup::Resolve(ResolverObject &object) const { ScopeResolver *scope = object.GetScope(this->var_scope, this->count); - if (object.trigger != 0) { + if (object.callback == CBID_RANDOM_TRIGGER) { /* Handle triggers */ - /* Magic code that may or may not do the right things... */ - byte waiting_triggers = scope->GetTriggers(); - byte match = this->triggers & (waiting_triggers | object.trigger); + byte match = this->triggers & object.waiting_triggers; bool res = (this->cmp_mode == RSG_CMP_ANY) ? (match != 0) : (match == this->triggers); if (res) { - waiting_triggers &= ~match; + object.used_triggers |= match; object.reseed[this->var_scope] |= (this->num_groups - 1) << this->lowest_randbit; - } else { - waiting_triggers |= object.trigger; } - - scope->SetTriggers(waiting_triggers); } uint32 mask = (this->num_groups - 1) << this->lowest_randbit; @@ -337,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 0a7705d667..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" @@ -174,13 +175,16 @@ struct DeterministicSpriteGroup : SpriteGroup { VarSpriteGroupScope var_scope; DeterministicSpriteGroupSize size; uint num_adjusts; - byte num_ranges; + uint num_ranges; + bool calculated_result; DeterministicSpriteGroupAdjust *adjusts; DeterministicSpriteGroupRange *ranges; // Dynamically allocated /* Dynamically allocated, this is the sole owner */ const SpriteGroup *default_group; + const SpriteGroup *error_group; // was first range, before sorting ranges + protected: const SpriteGroup *Resolve(ResolverObject &object) const; }; @@ -274,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; + }; /** @@ -288,12 +297,11 @@ struct IndustryProductionSpriteGroup : SpriteGroup { struct ScopeResolver { ResolverObject &ro; ///< Surrounding resolver object. - ScopeResolver(ResolverObject &ro); - virtual ~ScopeResolver(); + ScopeResolver(ResolverObject &ro) : ro(ro) {} + virtual ~ScopeResolver() {} virtual uint32 GetRandomBits() const; virtual uint32 GetTriggers() const; - virtual void SetTriggers(int triggers) const; virtual uint32 GetVariable(byte variable, uint32 parameter, bool *available) const; virtual void StorePSA(uint reg, int32 value); @@ -306,8 +314,20 @@ struct ScopeResolver { * to get the results of callbacks, rerandomisations or normal sprite lookups. */ struct ResolverObject { - ResolverObject(const GRFFile *grffile, CallbackID callback = CBID_NO_CALLBACK, uint32 callback_param1 = 0, uint32 callback_param2 = 0); - virtual ~ResolverObject(); + /** + * Resolver constructor. + * @param grffile NewGRF file associated with the object (or \c NULL if none). + * @param callback Callback code being resolved (default value is #CBID_NO_CALLBACK). + * @param callback_param1 First parameter (var 10) of the callback (only used when \a callback is also set). + * @param callback_param2 Second parameter (var 18) of the callback (only used when \a callback is also set). + */ + ResolverObject(const GRFFile *grffile, CallbackID callback = CBID_NO_CALLBACK, uint32 callback_param1 = 0, uint32 callback_param2 = 0) + : default_scope(*this), callback(callback), callback_param1(callback_param1), callback_param2(callback_param2), grffile(grffile), root_spritegroup(NULL) + { + this->ResetState(); + } + + virtual ~ResolverObject() {} ScopeResolver default_scope; ///< Default implementation of the grf scope. @@ -315,9 +335,10 @@ struct ResolverObject { uint32 callback_param1; ///< First parameter (var 10) of the callback. uint32 callback_param2; ///< Second parameter (var 18) of the callback. - byte trigger; - uint32 last_value; ///< Result of most recent DeterministicSpriteGroup (including procedure calls) + + uint32 waiting_triggers; ///< Waiting triggers to be used by any rerandomisation. (scope independent) + uint32 used_triggers; ///< Subset of cur_triggers, which actually triggered some rerandomisation. (scope independent) uint32 reseed[VSG_END]; ///< Collects bits to rerandomise while triggering triggers. const GRFFile *grffile; ///< GRFFile the resolved SpriteGroup belongs to @@ -346,6 +367,14 @@ struct ResolverObject { virtual ScopeResolver *GetScope(VarSpriteGroupScope scope = VSG_SCOPE_SELF, byte relative = 0); + /** + * Returns the waiting triggers that did not trigger any rerandomisation. + */ + uint32 GetRemainingTriggers() const + { + return this->waiting_triggers & ~this->used_triggers; + } + /** * Returns the OR-sum of all bits that need reseeding * independent of the scope they were accessed with. @@ -367,7 +396,8 @@ struct ResolverObject { void ResetState() { this->last_value = 0; - this->trigger = 0; + this->waiting_triggers = 0; + this->used_triggers = 0; memset(this->reseed, 0, sizeof(this->reseed)); } }; diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp index cd5dad7b47..d9b79c55a1 100644 --- a/src/newgrf_station.cpp +++ b/src/newgrf_station.cpp @@ -235,13 +235,6 @@ static uint32 GetRailContinuationInfo(TileIndex tile) } -/* virtual */ void StationScopeResolver::SetTriggers(int triggers) const -{ - BaseStation *st = const_cast(this->st); - assert(st != NULL); - st->waiting_triggers = triggers; -} - /** * Station variable cache * This caches 'expensive' station variable lookups which iterate over @@ -585,23 +578,6 @@ StationResolverObject::~StationResolverObject() delete this->town_scope; } -/** - * Constructor for station scopes. - * @param ro Surrounding resolver. - * @param statspec Station (type) specification. - * @param st Instance of the station. - * @param tile %Tile of the station. - */ -StationScopeResolver::StationScopeResolver(ResolverObject &ro, const StationSpec *statspec, BaseStation *st, TileIndex tile) - : ScopeResolver(ro) -{ - this->tile = tile; - this->st = st; - this->statspec = statspec; - this->cargo_type = CT_INVALID; - this->axis = INVALID_AXIS; -} - /** * Resolve sprites for drawing a station tile. * @param statspec Station spec @@ -905,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); @@ -987,7 +963,7 @@ void TriggerStationRandomisation(Station *st, TileIndex tile, StationRandomTrigg uint32 whole_reseed = 0; ETileArea area = ETileArea(st, tile, tas[trigger]); - uint32 empty_mask = 0; + CargoTypes empty_mask = 0; if (trigger == SRT_CARGO_TAKEN) { /* Create a bitmask of completely empty cargo types to be matched */ for (CargoID i = 0; i < NUM_CARGO; i++) { @@ -997,8 +973,9 @@ void TriggerStationRandomisation(Station *st, TileIndex tile, StationRandomTrigg } } - /* Convert trigger to bit */ - uint8 trigger_bit = 1 << trigger; + /* Store triggers now for var 5F */ + SetBit(st->waiting_triggers, trigger); + uint32 used_triggers = 0; /* Check all tiles over the station to check if the specindex is still in use */ TILE_AREA_LOOP(tile, area) { @@ -1014,11 +991,13 @@ void TriggerStationRandomisation(Station *st, TileIndex tile, StationRandomTrigg if (cargo_type == CT_INVALID || HasBit(ss->cargo_triggers, cargo_type)) { StationResolverObject object(ss, st, tile, CBID_RANDOM_TRIGGER, 0); - object.trigger = trigger_bit; + object.waiting_triggers = st->waiting_triggers; const SpriteGroup *group = object.Resolve(); if (group == NULL) continue; + used_triggers |= object.used_triggers; + uint32 reseed = object.GetReseedSum(); if (reseed != 0) { whole_reseed |= reseed; @@ -1037,6 +1016,7 @@ void TriggerStationRandomisation(Station *st, TileIndex tile, StationRandomTrigg } /* Update whole station random bits */ + st->waiting_triggers &= ~used_triggers; if ((whole_reseed & 0xFFFF) != 0) { st->random_bits &= ~whole_reseed; st->random_bits |= Random() & whole_reseed; diff --git a/src/newgrf_station.h b/src/newgrf_station.h index ffb827cb3b..123330d0ad 100644 --- a/src/newgrf_station.h +++ b/src/newgrf_station.h @@ -30,11 +30,20 @@ struct StationScopeResolver : public ScopeResolver { CargoID cargo_type; ///< Type of cargo of the station. Axis axis; ///< Station axis, used only for the slope check callback. - StationScopeResolver(ResolverObject &ro, const StationSpec *statspec, BaseStation *st, TileIndex tile); + /** + * Constructor for station scopes. + * @param ro Surrounding resolver. + * @param statspec Station (type) specification. + * @param st Instance of the station. + * @param tile %Tile of the station. + */ + StationScopeResolver(ResolverObject &ro, const StationSpec *statspec, BaseStation *st, TileIndex tile) + : ScopeResolver(ro), tile(tile), st(st), statspec(statspec), cargo_type(CT_INVALID), axis(INVALID_AXIS) + { + } /* virtual */ uint32 GetRandomBits() const; /* virtual */ uint32 GetTriggers() const; - /* virtual */ void SetTriggers(int triggers) const; /* virtual */ uint32 GetVariable(byte variable, uint32 parameter, bool *available) const; }; @@ -59,7 +68,7 @@ struct StationResolverObject : public ResolverObject { case VSG_SCOPE_PARENT: { TownScopeResolver *tsr = this->GetTown(); if (tsr != NULL) return tsr; - /* FALL-THROUGH */ + FALLTHROUGH; } default: @@ -144,7 +153,7 @@ struct StationSpec { */ uint16 cargo_threshold; - uint32 cargo_triggers; ///< Bitmask of cargo types which cause trigger re-randomizing + CargoTypes cargo_triggers; ///< Bitmask of cargo types which cause trigger re-randomizing byte callback_mask; ///< Bitmask of station callbacks that have to be called 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 daf9db4433..b92b84355a 100644 --- a/src/newgrf_text.cpp +++ b/src/newgrf_text.cpp @@ -35,9 +35,6 @@ #include "safeguards.h" -#define GRFTAB 28 -#define TABSIZE 11 - /** * Explains the newgrf shift bit positioning. * the grf base will not be used in order to find the string, but rather for @@ -159,7 +156,7 @@ struct GRFTextEntry { static uint _num_grf_texts = 0; -static GRFTextEntry _grf_text[(1 << TABSIZE) * 3]; +static GRFTextEntry _grf_text[TAB_SIZE_NEWGRF]; static byte _currentLangID = GRFLX_ENGLISH; ///< by default, english is used. /** @@ -332,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. */ @@ -527,6 +524,7 @@ char *TranslateTTDPatchCodes(uint32 grfid, uint8 language_id, bool allow_newline case 0x1B: case 0x1C: case 0x1D: + case 0x1E: d += Utf8Encode(d, SCC_NEWGRF_PRINT_DWORD_DATE_LONG + code - 0x16); break; @@ -693,19 +691,19 @@ StringID AddGRFString(uint32 grfid, uint16 stringid, byte langid_to_add, bool ne } AddGRFTextToList(&_grf_text[id].textholder, newtext); - grfmsg(3, "Added 0x%X: grfid %08X string 0x%X lang 0x%X string '%s'", id, grfid, stringid, newtext->langid, newtext->text); + grfmsg(3, "Added 0x%X: grfid %08X string 0x%X lang 0x%X string '%s' (%X)", id, grfid, stringid, newtext->langid, newtext->text, MakeStringID(TEXT_TAB_NEWGRF_START, id)); - return (GRFTAB << TABSIZE) + id; + return MakeStringID(TEXT_TAB_NEWGRF_START, id); } /** * Returns the index for this stringid associated with its grfID */ -StringID GetGRFStringID(uint32 grfid, uint16 stringid) +StringID GetGRFStringID(uint32 grfid, StringID stringid) { for (uint id = 0; id < _num_grf_texts; id++) { if (_grf_text[id].grfid == grfid && _grf_text[id].stringid == stringid) { - return (GRFTAB << TABSIZE) + id; + return MakeStringID(TEXT_TAB_NEWGRF_START, id); } } @@ -996,6 +994,7 @@ uint RemapNewGRFStringControlCode(uint scc, char *buf_start, char **buff, const case SCC_NEWGRF_PRINT_WORD_WEIGHT_SHORT: case SCC_NEWGRF_PRINT_WORD_POWER: case SCC_NEWGRF_PRINT_WORD_STATION_NAME: + case SCC_NEWGRF_PRINT_WORD_CARGO_NAME: if (argv_size < 1) { DEBUG(misc, 0, "Too many NewGRF string parameters."); return 0; @@ -1059,6 +1058,12 @@ uint RemapNewGRFStringControlCode(uint scc, char *buf_start, char **buff, const case SCC_NEWGRF_PRINT_WORD_STRING_ID: *argv = MapGRFStringID(_newgrf_textrefstack.grffile->grfid, _newgrf_textrefstack.PopUnsignedWord()); break; + + case SCC_NEWGRF_PRINT_WORD_CARGO_NAME: { + CargoID cargo = GetCargoTranslation(_newgrf_textrefstack.PopUnsignedWord(), _newgrf_textrefstack.grffile); + *argv = cargo < NUM_CARGO ? 1 << cargo : 0; + break; + } } } else { /* Consume additional parameter characters */ @@ -1128,6 +1133,9 @@ uint RemapNewGRFStringControlCode(uint scc, char *buf_start, char **buff, const case SCC_NEWGRF_PRINT_WORD_CARGO_TINY: return SCC_CARGO_TINY; + case SCC_NEWGRF_PRINT_WORD_CARGO_NAME: + return SCC_CARGO_LIST; + case SCC_NEWGRF_PRINT_WORD_STATION_NAME: return SCC_STATION_NAME; diff --git a/src/newgrf_text.h b/src/newgrf_text.h index 6587fc1fed..033967d307 100644 --- a/src/newgrf_text.h +++ b/src/newgrf_text.h @@ -21,7 +21,7 @@ static const WChar NFO_UTF8_IDENTIFIER = 0x00DE; StringID AddGRFString(uint32 grfid, uint16 stringid, byte langid, bool new_scheme, bool allow_newlines, const char *text_to_add, StringID def_string); -StringID GetGRFStringID(uint32 grfid, uint16 stringid); +StringID GetGRFStringID(uint32 grfid, StringID stringid); const char *GetGRFStringFromGRFText(const struct GRFText *text); const char *GetGRFStringPtr(uint16 stringid); void CleanUpStrings(); diff --git a/src/newgrf_town.cpp b/src/newgrf_town.cpp index 2f48eb757d..00fcf76b63 100644 --- a/src/newgrf_town.cpp +++ b/src/newgrf_town.cpp @@ -16,18 +16,6 @@ #include "safeguards.h" -/** - * Resolver of a town scope. - * @param ro Surrounding resolver. - * @param t %Town of the scope. - * @param readonly Scope may change persistent storage of the town. - */ -TownScopeResolver::TownScopeResolver(ResolverObject &ro, Town *t, bool readonly) : ScopeResolver(ro) -{ - this->t = t; - this->readonly = readonly; -} - /* virtual */ uint32 TownScopeResolver::GetVariable(byte variable, uint32 parameter, bool *available) const { switch (variable) { @@ -62,7 +50,7 @@ TownScopeResolver::TownScopeResolver(ResolverObject &ro, Town *t, bool readonly) case 0x81: return GB(this->t->xy, 8, 8); case 0x82: return ClampToU16(this->t->cache.population); case 0x83: return GB(ClampToU16(this->t->cache.population), 8, 8); - case 0x8A: return this->t->grow_counter; + case 0x8A: return this->t->grow_counter / TOWN_GROWTH_TICKS; case 0x92: return this->t->flags; // In original game, 0x92 and 0x93 are really one word. Since flags is a byte, this is to adjust case 0x93: return 0; case 0x94: return ClampToU16(this->t->cache.squared_town_zone_radius[0]); @@ -94,7 +82,7 @@ TownScopeResolver::TownScopeResolver(ResolverObject &ro, Town *t, bool readonly) case 0xAE: return this->t->have_ratings; case 0xB2: return this->t->statues; case 0xB6: return ClampToU16(this->t->cache.num_houses); - case 0xB9: return this->t->growth_rate & (~TOWN_GROW_RATE_CUSTOM); + case 0xB9: return this->t->growth_rate / TOWN_GROWTH_TICKS; case 0xBA: return ClampToU16(this->t->supplied[CT_PASSENGERS].new_max); case 0xBB: return GB(ClampToU16(this->t->supplied[CT_PASSENGERS].new_max), 8, 8); case 0xBC: return ClampToU16(this->t->supplied[CT_MAIL].new_max); diff --git a/src/newgrf_town.h b/src/newgrf_town.h index 145571e8ae..7c4fb5395c 100644 --- a/src/newgrf_town.h +++ b/src/newgrf_town.h @@ -25,7 +25,16 @@ struct TownScopeResolver : public ScopeResolver { Town *t; ///< %Town of the scope. bool readonly; ///< When set, persistent storage of the town is read-only, - TownScopeResolver(ResolverObject &ro, Town *t, bool readonly); + /** + * Resolver of a town scope. + * @param ro Surrounding resolver. + * @param t %Town of the scope. + * @param readonly Scope may change persistent storage of the town. + */ + TownScopeResolver(ResolverObject &ro, Town *t, bool readonly) + : ScopeResolver(ro), t(t), readonly(readonly) + { + } virtual uint32 GetVariable(byte variable, uint32 parameter, bool *available) const; virtual void StorePSA(uint reg, int32 value); diff --git a/src/news_gui.cpp b/src/news_gui.cpp index 3800af8b57..71a39eb3a9 100644 --- a/src/news_gui.cpp +++ b/src/news_gui.cpp @@ -42,10 +42,10 @@ const NewsItem *_statusbar_news_item = NULL; -static uint MIN_NEWS_AMOUNT = 30; ///< preferred minimum amount of news messages -static uint _total_news = 0; ///< current number of news items -static NewsItem *_oldest_news = NULL; ///< head of news items queue -static NewsItem *_latest_news = NULL; ///< tail of news items queue +static uint MIN_NEWS_AMOUNT = 30; ///< preferred minimum amount of news messages +static uint _total_news = 0; ///< current number of news items +NewsItem *_oldest_news = NULL; ///< head of news items queue +static NewsItem *_latest_news = NULL; ///< tail of news items queue /** * Forced news item. @@ -313,6 +313,15 @@ struct NewsWindow : Window { { StringID str = STR_NULL; switch (widget) { + case WID_N_CAPTION: { + /* Caption is not a real caption (so that the window cannot be moved) + * thus it doesn't get the default sizing of a caption. */ + Dimension d2 = GetStringBoundingBox(STR_NEWS_MESSAGE_CAPTION); + d2.height += WD_CAPTIONTEXT_TOP + WD_CAPTIONTEXT_BOTTOM; + *size = maxdim(*size, d2); + return; + } + case WID_N_MGR_FACE: *size = maxdim(*size, GetSpriteSize(SPR_GRADIENT)); break; @@ -485,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) @@ -953,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_gui.h b/src/news_gui.h index f0b28a734c..0f42c68c6c 100644 --- a/src/news_gui.h +++ b/src/news_gui.h @@ -12,7 +12,11 @@ #ifndef NEWS_GUI_H #define NEWS_GUI_H +#include "news_type.h" + void ShowLastNewsMessage(); void ShowMessageHistory(); +extern NewsItem *_oldest_news; + #endif /* NEWS_GUI_H */ 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_cmd.cpp b/src/object_cmd.cpp index b5b9921525..9f03813dfb 100644 --- a/src/object_cmd.cpp +++ b/src/object_cmd.cpp @@ -540,7 +540,7 @@ static CommandCost ClearTile_Object(TileIndex tile, DoCommandFlag flags) return cost; } -static void AddAcceptedCargo_Object(TileIndex tile, CargoArray &acceptance, uint32 *always_accepted) +static void AddAcceptedCargo_Object(TileIndex tile, CargoArray &acceptance, CargoTypes *always_accepted) { if (!IsObjectType(tile, OBJECT_HQ)) return; @@ -770,6 +770,8 @@ static void ChangeTileOwner_Object(TileIndex tile, Owner old_owner, Owner new_ow { if (!IsTileOwner(tile, old_owner)) return; + bool do_clear = false; + if (IsObjectType(tile, OBJECT_OWNED_LAND) && new_owner != INVALID_OWNER) { SetTileOwner(tile, new_owner); } else if (IsObjectType(tile, OBJECT_STATUE)) { @@ -780,12 +782,18 @@ static void ChangeTileOwner_Object(TileIndex tile, Owner old_owner, Owner new_ow SetBit(t->statues, new_owner); SetTileOwner(tile, new_owner); } else { - ReallyClearObjectTile(Object::GetByTile(tile)); + do_clear = true; } SetWindowDirty(WC_TOWN_AUTHORITY, t->index); } else { + do_clear = true; + } + + if (do_clear) { ReallyClearObjectTile(Object::GetByTile(tile)); + /* When clearing objects, they may turn into canal, which may require transfering ownership. */ + ChangeTileOwner(tile, old_owner, new_owner); } } 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 c149ebbd4d..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" @@ -123,6 +124,25 @@ void CDECL error(const char *s, ...) abort(); } +void CDECL assert_msg_error(int line, const char *file, const char *expr, const char *str, ...) +{ + va_list va; + char buf[2048]; + + char *b = buf; + b += seprintf(b, lastof(buf), "Assertion failed at line %i of %s: %s\n\t", line, file, expr); + + va_start(va, str); + vseprintf(b, lastof(buf), str, va); + va_end(va); + + ShowOSErrorBox(buf, true); + + /* Set the error message for the crash log and then invoke it. */ + CrashLog::SetErrorMessage(buf); + abort(); +} + /** * Shows some information on the console/a popup box depending on the OS. * @param str the text to show. @@ -167,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 */ @@ -211,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); @@ -230,7 +250,20 @@ static void WriteSavegameInfo(const char *name) char buf[8192]; char *p = buf; p += seprintf(p, lastof(buf), "Name: %s\n", name); - p += seprintf(p, lastof(buf), "Savegame ver: %d\n", _sl_version); + const char *type = ""; + extern bool _sl_is_faked_ext; + extern bool _sl_is_ext_version; + if (_sl_is_faked_ext) { + type = " (fake extended)"; + } else if (_sl_is_ext_version) { + type = " (extended)"; + } + p += seprintf(p, lastof(buf), "Savegame ver: %d%s\n", _sl_version, type); + for (size_t i = 0; i < XSLFI_SIZE; i++) { + if (_sl_xv_feature_versions[i] > 0) { + p += seprintf(p, lastof(buf), " Feature: %s = %d\n", SlXvGetFeatureName((SlXvFeatureIndex) i), _sl_xv_feature_versions[i]); + } + } p += seprintf(p, lastof(buf), "NewGRF ver: 0x%08X\n", last_ottd_rev); p += seprintf(p, lastof(buf), "Modified: %d\n", ever_modified); @@ -249,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); @@ -328,7 +361,7 @@ static void LoadIntroGame(bool load_newgrfs = true) SetupColoursAndInitialWindow(); /* Load the default opening screen savegame */ - if (SaveOrLoad("opntitle.dat", SL_LOAD, BASESET_DIR) != SL_OK) { + if (SaveOrLoad("opntitle.dat", SLO_LOAD, DFT_GAME_FILE, BASESET_DIR) != SL_OK) { GenerateWorld(GWM_EMPTY, 64, 64); // if failed loading, make empty world. WaitTillGeneratedWorld(); SetLocalCompany(COMPANY_SPECTATOR); @@ -339,11 +372,9 @@ static void LoadIntroGame(bool load_newgrfs = true) _pause_mode = PM_UNPAUSED; _cursor.fix_at = false; - if (load_newgrfs) CheckForMissingSprites(); CheckForMissingGlyphs(); - /* Play main theme */ - if (MusicDriver::GetInstance()->IsSongPlaying()) ResetMusic(); + MusicLoop(); // ensure music is correct } void MakeNewgameSettingsLive() @@ -366,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; @@ -386,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. @@ -406,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() @@ -509,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 */ @@ -609,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); @@ -618,15 +655,16 @@ int openttd_main(int argc, char *argv[]) case 'e': _switch_mode = (_switch_mode == SM_LOAD_GAME || _switch_mode == SM_LOAD_SCENARIO ? SM_LOAD_SCENARIO : SM_EDITOR); break; case 'g': if (mgo.opt != NULL) { - strecpy(_file_to_saveload.name, mgo.opt, lastof(_file_to_saveload.name)); - _switch_mode = (_switch_mode == SM_EDITOR || _switch_mode == SM_LOAD_SCENARIO ? SM_LOAD_SCENARIO : SM_LOAD_GAME); - _file_to_saveload.mode = SL_LOAD; + _file_to_saveload.SetName(mgo.opt); + bool is_scenario = _switch_mode == SM_EDITOR || _switch_mode == SM_LOAD_SCENARIO; + _switch_mode = is_scenario ? SM_LOAD_SCENARIO : SM_LOAD_GAME; + _file_to_saveload.SetMode(SLO_LOAD, is_scenario ? FT_SCENARIO : FT_SAVEGAME, DFT_GAME_FILE); /* if the file doesn't exist or it is not a valid savegame, let the saveload code show an error */ const char *t = strrchr(_file_to_saveload.name, '.'); if (t != NULL) { - FiosType ft = FiosGetSavegameListCallback(SLD_LOAD_GAME, _file_to_saveload.name, t, NULL, NULL); - if (ft != FIOS_TYPE_INVALID) SetFiosType(ft); + FiosType ft = FiosGetSavegameListCallback(SLO_LOAD, _file_to_saveload.name, t, NULL, NULL); + if (ft != FIOS_TYPE_INVALID) _file_to_saveload.SetMode(ft); } break; @@ -647,10 +685,10 @@ int openttd_main(int argc, char *argv[]) char title[80]; title[0] = '\0'; - FiosGetSavegameListCallback(SLD_LOAD_GAME, mgo.opt, strrchr(mgo.opt, '.'), title, lastof(title)); + FiosGetSavegameListCallback(SLO_LOAD, mgo.opt, strrchr(mgo.opt, '.'), title, lastof(title)); _load_check_data.Clear(); - SaveOrLoadResult res = SaveOrLoad(mgo.opt, SL_LOAD_CHECK, SAVE_DIR, false); + SaveOrLoadResult res = SaveOrLoad(mgo.opt, SLO_CHECK, DFT_GAME_FILE, SAVE_DIR, false); if (res != SL_OK || _load_check_data.HasErrors()) { fprintf(stderr, "Failed to open savegame\n"); if (_load_check_data.HasErrors()) { @@ -666,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': @@ -692,11 +730,6 @@ int openttd_main(int argc, char *argv[]) goto exit_noshutdown; } -#if defined(WINCE) && defined(_DEBUG) - /* Switch on debug lvl 4 for WinCE if Debug release, as you can't give params, and you most likely do want this information */ - SetDebugString("4"); -#endif - DeterminePaths(argv[0]); TarScanner::DoScan(TarScanner::BASESET); @@ -815,7 +848,7 @@ int openttd_main(int argc, char *argv[]) if (sounds_set == NULL && BaseSounds::ini_set != NULL) sounds_set = stredup(BaseSounds::ini_set); if (!BaseSounds::SetSet(sounds_set)) { if (StrEmpty(sounds_set) || !BaseSounds::SetSet(NULL)) { - usererror("Failed to find a sounds set. Please acquire a sounds set for OpenTTD. See section 4.1 of readme.txt."); + usererror("Failed to find a sounds set. Please acquire a sounds set for OpenTTD. See section 4.1 of README.md."); } else { ErrorMessageData msg(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_BASE_SOUNDS_NOT_FOUND); msg.SetDParamStr(0, sounds_set); @@ -828,7 +861,7 @@ int openttd_main(int argc, char *argv[]) if (music_set == NULL && BaseMusic::ini_set != NULL) music_set = stredup(BaseMusic::ini_set); if (!BaseMusic::SetSet(music_set)) { if (StrEmpty(music_set) || !BaseMusic::SetSet(NULL)) { - usererror("Failed to find a music set. Please acquire a music set for OpenTTD. See section 4.1 of readme.txt."); + usererror("Failed to find a music set. Please acquire a music set for OpenTTD. See section 4.1 of README.md."); } else { ErrorMessageData msg(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_BASE_MUSIC_NOT_FOUND); msg.SetDParamStr(0, music_set); @@ -991,20 +1024,21 @@ 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. */ -bool SafeLoad(const char *filename, int mode, GameMode newgm, Subdirectory subdir, struct LoadFilter *lf = NULL) +bool SafeLoad(const char *filename, SaveLoadOperation fop, DetailedFileType dft, GameMode newgm, Subdirectory subdir, struct LoadFilter *lf = NULL) { - assert(mode == SL_LOAD || (lf == NULL && mode == SL_OLD_LOAD)); + assert(fop == SLO_LOAD); + assert(dft == DFT_GAME_FILE || (lf == NULL && dft == DFT_OLD_GAME_FILE)); GameMode ogm = _game_mode; _game_mode = newgm; - switch (lf == NULL ? SaveOrLoad(filename, mode, subdir) : LoadWithFilter(lf)) { + switch (lf == NULL ? SaveOrLoad(filename, fop, dft, subdir) : LoadWithFilter(lf)) { case SL_OK: return true; case SL_REINIT: @@ -1093,11 +1127,11 @@ void SwitchToMode(SwitchMode new_mode) ResetGRFConfig(true); ResetWindowSystem(); - if (!SafeLoad(_file_to_saveload.name, _file_to_saveload.mode, GM_NORMAL, NO_DIRECTORY)) { + if (!SafeLoad(_file_to_saveload.name, _file_to_saveload.file_op, _file_to_saveload.detail_ftype, GM_NORMAL, NO_DIRECTORY)) { SetDParamStr(0, GetSaveLoadErrorString()); ShowErrorMessage(STR_JUST_RAW_STRING, INVALID_STRING_ID, WL_ERROR); } else { - if (_saveload_mode == SLD_LOAD_SCENARIO) { + if (_file_to_saveload.abstract_ftype == FT_SCENARIO) { /* Reset engine pool to simplify changing engine NewGRFs in scenario editor. */ EngineOverrideManager::ResetToCurrentNewGRFConfig(); } @@ -1134,7 +1168,7 @@ void SwitchToMode(SwitchMode new_mode) break; case SM_LOAD_SCENARIO: { // Load scenario from scenario editor - if (SafeLoad(_file_to_saveload.name, _file_to_saveload.mode, GM_EDITOR, NO_DIRECTORY)) { + if (SafeLoad(_file_to_saveload.name, _file_to_saveload.file_op, _file_to_saveload.detail_ftype, GM_EDITOR, NO_DIRECTORY)) { SetLocalCompany(OWNER_NONE); _settings_newgame.game_creation.starting_year = _cur_year; /* Cancel the saveload pausing */ @@ -1156,7 +1190,7 @@ void SwitchToMode(SwitchMode new_mode) case SM_SAVE_GAME: // Save game. /* Make network saved games on pause compatible to singleplayer */ - if (SaveOrLoad(_file_to_saveload.name, SL_SAVE, NO_DIRECTORY) != SL_OK) { + if (SaveOrLoad(_file_to_saveload.name, SLO_SAVE, DFT_GAME_FILE, NO_DIRECTORY) != SL_OK) { SetDParamStr(0, GetSaveLoadErrorString()); ShowErrorMessage(STR_JUST_RAW_STRING, INVALID_STRING_ID, WL_ERROR); } else { @@ -1341,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(); @@ -1348,6 +1390,9 @@ void StateGameLoop() CallWindowTickEvent(); return; } + + PerformanceMeasurer framerate(PFE_GAMELOOP); + PerformanceAccumulator::Reset(PFE_GL_LANDSCAPE); if (HasModalProgress()) return; Layouter::ReduceLineCache(); @@ -1367,7 +1412,7 @@ void StateGameLoop() /* Save the desync savegame if needed. */ char name[MAX_PATH]; seprintf(name, lastof(name), "dmp_cmds_%08x_%08x.sav", _settings_game.game_creation.generation_seed, _date); - SaveOrLoad(name, SL_SAVE, AUTOSAVE_DIR, false); + SaveOrLoad(name, SLO_SAVE, DFT_GAME_FILE, AUTOSAVE_DIR, false); } CheckCaches(); @@ -1406,11 +1451,6 @@ static void DoAutosave() { char buf[MAX_PATH]; -#if defined(PSP) - /* Autosaving in networking is too time expensive for the PSP */ - if (_networking) return; -#endif /* PSP */ - if (_settings_client.gui.keep_all_autosave) { GenerateDefaultSaveName(buf, lastof(buf)); strecat(buf, ".sav", lastof(buf)); @@ -1424,7 +1464,7 @@ static void DoAutosave() } DEBUG(sl, 2, "Autosaving to '%s'", buf); - if (SaveOrLoad(buf, SL_SAVE, AUTOSAVE_DIR) != SL_OK) { + if (SaveOrLoad(buf, SLO_SAVE, DFT_GAME_FILE, AUTOSAVE_DIR) != SL_OK) { ShowErrorMessage(STR_ERROR_AUTOSAVE_FAILED, INVALID_STRING_ID, WL_ERROR); } } diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index 7f889ba53f..bfc8c897c6 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -799,7 +799,8 @@ CommandCost CmdInsertOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 case OSL_PLATFORM_NEAR_END: case OSL_PLATFORM_MIDDLE: if (v->type != VEH_TRAIN) return CMD_ERROR; - /* FALL THROUGH */ + FALLTHROUGH; + case OSL_PLATFORM_FAR_END: break; @@ -919,7 +920,8 @@ CommandCost CmdInsertOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 case OCV_LOAD_PERCENTAGE: case OCV_RELIABILITY: if (new_order.GetConditionValue() > 100) return CMD_ERROR; - /* FALL THROUGH */ + FALLTHROUGH; + default: if (occ == OCC_IS_TRUE || occ == OCC_IS_FALSE) return CMD_ERROR; break; @@ -1539,7 +1541,8 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 case OCV_LOAD_PERCENTAGE: case OCV_RELIABILITY: if (order->GetConditionValue() > 100) order->SetConditionValue(100); - /* FALL THROUGH */ + FALLTHROUGH; + default: if (old_var_was_cargo) order->SetConditionValue(0); if (occ == OCC_IS_TRUE || occ == OCC_IS_FALSE) order->SetConditionComparator(OCC_EQUALS); @@ -2019,7 +2022,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) @@ -2135,6 +2137,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 fc7a1668e1..73cd6ae983 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, @@ -577,8 +578,6 @@ private: Scrollbar *vscroll; bool can_do_refit; ///< Vehicle chain can be refitted in depot. bool can_do_autorefit; ///< Vehicle chain can be auto-refitted. - StringID cargo_names_list[NUM_CARGO + 1]; - uint32 cargo_bitmask; /** * Return the memorised selected order. @@ -911,18 +910,6 @@ public: break; } } - - - /* Create cargo bitmask */ - assert_compile(NUM_CARGO <= 32); - for (CargoID c = 0; c < NUM_CARGO; c++) { - if (CargoSpec::Get(c)->IsValid()) { - this->cargo_names_list[c] = CargoSpec::Get(c)->name; - SetBit(this->cargo_bitmask, c); - } - } - this->cargo_bitmask = ~this->cargo_bitmask; - this->cargo_names_list[NUM_CARGO] = INVALID_STRING_ID; } /** @@ -939,7 +926,7 @@ public: case VIWD_AUTOREPLACE: /* Autoreplace replaced the vehicle */ this->vehicle = Vehicle::Get(this->window_number); - /* FALL THROUGH */ + FALLTHROUGH; case VIWD_CONSIST_CHANGED: /* Vehicle composition was changed. */ @@ -1137,7 +1124,11 @@ public: bool is_cargo = (ocv == OCV_CARGO_ACCEPTANCE || ocv == OCV_CARGO_WAITING); if (is_cargo) { - this->GetWidget(WID_O_COND_CARGO)->widget_data = cargo_names_list[(order == NULL) ? 0 : order->GetConditionValue()]; + if (order == NULL || !CargoSpec::Get(order->GetConditionValue())->IsValid()) { + this->GetWidget(WID_O_COND_CARGO)->widget_data = STR_NEWGRF_INVALID_CARGO; + } else { + this->GetWidget(WID_O_COND_CARGO)->widget_data = CargoSpec::Get(order->GetConditionValue())->name; + } this->GetWidget(WID_O_SEL_COND_VALUE)->SetDisplayedPlane(DP_COND_VALUE_CARGO); } else { this->GetWidget(WID_O_SEL_COND_VALUE)->SetDisplayedPlane(DP_COND_VALUE_NUMBER); @@ -1396,7 +1387,16 @@ public: case WID_O_COND_CARGO: { uint value = this->vehicle->GetOrder(this->OrderGetSel())->GetConditionValue(); - ShowDropDownMenu(this, cargo_names_list, value, WID_O_COND_CARGO, 0, cargo_bitmask); + DropDownList *list = new DropDownList(); + for (size_t i = 0; i < _sorted_standard_cargo_specs_size; ++i) { + const CargoSpec *cs = _sorted_cargo_specs[i]; + *list->Append() = new DropDownListStringItem(cs->name, cs->Index(), false); + } + if (list->Length() == 0) { + delete list; + return; + } + ShowDropDownList(this, list, value, WID_O_COND_CARGO, 0); break; } diff --git a/src/order_type.h b/src/order_type.h index 09248d684a..d3e57f5590 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_CARGO_WAITING, ///< Skip if specified cargo is waiting at next station OCV_CARGO_ACCEPTANCE, ///< Skip if specified cargo is accepted at next station OCV_FREE_PLATFORMS, ///< Skip based on free platforms at next station diff --git a/src/os/macosx/macos.h b/src/os/macosx/macos.h index 1e6729f121..4204d93bb6 100644 --- a/src/os/macosx/macos.h +++ b/src/os/macosx/macos.h @@ -38,4 +38,6 @@ static inline bool MacOSVersionIsAtLeast(long major, long minor, long bugfix) bool IsMonospaceFont(CFStringRef name); +void MacOSSetThreadName(const char *name); + #endif /* MACOS_H */ diff --git a/src/os/macosx/macos.mm b/src/os/macosx/macos.mm index 8d34cda58a..7fb71fe9ee 100644 --- a/src/os/macosx/macos.mm +++ b/src/os/macosx/macos.mm @@ -14,6 +14,7 @@ #include "../../rev.h" #include "macos.h" #include "../../string_func.h" +#include #define Rect OTTDRect #define Point OTTDPoint @@ -21,12 +22,26 @@ #undef Rect #undef Point +#ifndef __clang__ +#define __bridge +#endif + /* * This file contains objective C * Apple uses objective C instead of plain C to interact with OS specific/native functions */ +#if (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_10) +typedef struct { + NSInteger majorVersion; + NSInteger minorVersion; + NSInteger patchVersion; +} OTTDOperatingSystemVersion; + +#define NSOperatingSystemVersion OTTDOperatingSystemVersion +#endif + /** * Get the version of the MacOS we are running under. Code adopted * from http://www.cocoadev.com/index.pl?DeterminingOSVersion @@ -40,6 +55,19 @@ void GetMacOSVersion(int *return_major, int *return_minor, int *return_bugfix) *return_major = -1; *return_minor = -1; *return_bugfix = -1; + + if ([[ NSProcessInfo processInfo] respondsToSelector:@selector(operatingSystemVersion) ]) { + IMP sel = [ [ NSProcessInfo processInfo] methodForSelector:@selector(operatingSystemVersion) ]; + NSOperatingSystemVersion ver = ((NSOperatingSystemVersion (*)(id, SEL))sel)([ NSProcessInfo processInfo], @selector(operatingSystemVersion)); + + *return_major = (int)ver.majorVersion; + *return_minor = (int)ver.minorVersion; + *return_bugfix = (int)ver.patchVersion; + + return; + } + +#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_10) SInt32 systemVersion, version_major, version_minor, version_bugfix; if (Gestalt(gestaltSystemVersion, &systemVersion) == noErr) { if (systemVersion >= 0x1040) { @@ -52,6 +80,7 @@ void GetMacOSVersion(int *return_major, int *return_minor, int *return_bugfix) *return_bugfix = (int)GB(systemVersion, 0, 4); } } +#endif } #ifdef WITH_SDL @@ -182,7 +211,7 @@ uint GetCPUCoreCount() uint count = 1; #if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) if (MacOSVersionIsAtLeast(10, 5, 0)) { - count = [ [ NSProcessInfo processInfo ] activeProcessorCount ]; + count = (uint)[ [ NSProcessInfo processInfo ] activeProcessorCount ]; } else #endif { @@ -201,7 +230,25 @@ uint GetCPUCoreCount() */ bool IsMonospaceFont(CFStringRef name) { - NSFont *font = [ NSFont fontWithName:(NSString *)name size:0.0f ]; + NSFont *font = [ NSFont fontWithName:(__bridge NSString *)name size:0.0f ]; return font != NULL ? [ font isFixedPitch ] : false; } + +/** + * Set the name of the current thread for the debugger. + * @param name The new name of the current thread. + */ +void MacOSSetThreadName(const char *name) +{ +#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6) + if (MacOSVersionIsAtLeast(10, 6, 0)) { + pthread_setname_np(name); + } +#endif + + NSThread *cur = [ NSThread currentThread ]; + if (cur != NULL && [ cur respondsToSelector:@selector(setName:) ]) { + [ cur performSelector:@selector(setName:) withObject:[ NSString stringWithUTF8String:name ] ]; + } +} diff --git a/src/os/macosx/osx_stdafx.h b/src/os/macosx/osx_stdafx.h index 35b3f434a1..70dc8030cc 100644 --- a/src/os/macosx/osx_stdafx.h +++ b/src/os/macosx/osx_stdafx.h @@ -13,6 +13,17 @@ #define MACOS_STDAFX_H +#include + +/* We assume if these macros are defined, the SDK is also at least this version or later. */ +#ifdef MAC_OS_X_VERSION_10_7 +#define HAVE_OSX_107_SDK +#endif + +#ifdef MAC_OS_X_VERSION_10_11 +#define HAVE_OSX_1011_SDK +#endif + /* It would seem that to ensure backward compability we have to ensure that we have defined MAC_OS_X_VERSION_10_x everywhere */ #ifndef MAC_OS_X_VERSION_10_3 #define MAC_OS_X_VERSION_10_3 1030 @@ -42,6 +53,13 @@ #define MAC_OS_X_VERSION_10_9 1090 #endif +#ifndef MAC_OS_X_VERSION_10_10 +#define MAC_OS_X_VERSION_10_10 101000 +#endif + +#ifndef MAC_OS_X_VERSION_10_11 +#define MAC_OS_X_VERSION_10_11 101100 +#endif #define __STDC_LIMIT_MACROS #include @@ -57,8 +75,6 @@ # error "Compiling 64 bits without _SQ64 set! (or vice versa)" #endif -#include - /* Name conflict */ #define Rect OTTDRect #define Point OTTDPoint 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/os2/os2.cpp b/src/os/os2/os2.cpp index 386cc4dbb7..7b34f528a6 100644 --- a/src/os/os2/os2.cpp +++ b/src/os/os2/os2.cpp @@ -45,7 +45,7 @@ bool FiosIsRoot(const char *file) return file[3] == '\0'; } -void FiosGetDrives() +void FiosGetDrives(FileList &file_list) { uint disk, disk2, save, total; @@ -75,7 +75,7 @@ void FiosGetDrives() #endif if (disk == disk2) { - FiosItem *fios = _fios_items.Append(); + FiosItem *fios = file_list.Append(); fios->type = FIOS_TYPE_DRIVE; fios->mtime = 0; #ifndef __INNOTEK_LIBC__ diff --git a/src/os/unix/unix.cpp b/src/os/unix/unix.cpp index 24dedb2ee1..bea69ec931 100644 --- a/src/os/unix/unix.cpp +++ b/src/os/unix/unix.cpp @@ -16,6 +16,7 @@ #include "../../core/random_func.hpp" #include "../../debug.h" #include "../../string_func.h" +#include "../../fios.h" #include @@ -77,7 +78,7 @@ bool FiosIsRoot(const char *path) #endif } -void FiosGetDrives() +void FiosGetDrives(FileList &file_list) { return; } @@ -307,9 +308,7 @@ bool GetClipboardContents(char *buffer, const char *last) void CSleep(int milliseconds) { - #if defined(PSP) - sceKernelDelayThread(milliseconds * 1000); - #elif defined(__BEOS__) + #if defined(__BEOS__) snooze(milliseconds * 1000); #elif defined(__AMIGA__) { diff --git a/src/os/windows/ottdres.rc.in b/src/os/windows/ottdres.rc.in index 8384b91e7c..616d8bb3eb 100644 --- a/src/os/windows/ottdres.rc.in +++ b/src/os/windows/ottdres.rc.in @@ -79,8 +79,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,6,0,!!REVISION!! - PRODUCTVERSION 1,6,0,!!REVISION!! + FILEVERSION 1,9,0,!!ISODATE!! + PRODUCTVERSION 1,9,0,!!ISODATE!! FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -100,7 +100,7 @@ BEGIN VALUE "FileDescription", "OpenTTD\0" VALUE "FileVersion", "!!VERSION!!\0" VALUE "InternalName", "openttd\0" - VALUE "LegalCopyright", "Copyright \xA9 OpenTTD Developers 2002-2015. All Rights Reserved.\0" + VALUE "LegalCopyright", "Copyright \xA9 OpenTTD Developers 2002-2018. All Rights Reserved.\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "openttd.exe\0" VALUE "PrivateBuild", "\0" diff --git a/src/os/windows/string_uniscribe.cpp b/src/os/windows/string_uniscribe.cpp new file mode 100644 index 0000000000..ce61537b2b --- /dev/null +++ b/src/os/windows/string_uniscribe.cpp @@ -0,0 +1,611 @@ +/* $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_uniscribe.cpp Functions related to laying out text on Win32. */ + +#if defined(WITH_UNISCRIBE) + +#include "../../stdafx.h" +#include "../../debug.h" +#include "string_uniscribe.h" +#include "../../language.h" +#include "../../strings_func.h" +#include "../../string_func.h" +#include "../../table/control_codes.h" +#include "win32.h" +#include + +#include +#include + +#include "../../safeguards.h" + +#ifdef _MSC_VER +# pragma comment(lib, "usp10") +#endif + + +/** Uniscribe cache for internal font information, cleared when OTTD changes fonts. */ +static SCRIPT_CACHE _script_cache[FS_END]; + +/** + * Contains all information about a run of characters. A run are consecutive + * characters that share a single font and language. + */ +struct UniscribeRun { + int pos; + int len; + Font *font; + + std::vector ft_glyphs; + + SCRIPT_ANALYSIS sa; + std::vector char_to_glyph; + + std::vector vis_attribs; + std::vector glyphs; + std::vector advances; + std::vector offsets; + int total_advance; + + UniscribeRun(int pos, int len, Font *font, SCRIPT_ANALYSIS &sa) : pos(pos), len(len), font(font), sa(sa) {} +}; + +/** Break a string into language formatting ranges. */ +static std::vector UniscribeItemizeString(UniscribeParagraphLayoutFactory::CharType *buff, int32 length); +/** Generate and place glyphs for a run of characters. */ +static bool UniscribeShapeRun(const UniscribeParagraphLayoutFactory::CharType *buff, UniscribeRun &range); + +/** + * Wrapper for doing layouts with Uniscribe. + */ +class UniscribeParagraphLayout : public ParagraphLayouter { +private: + const UniscribeParagraphLayoutFactory::CharType *text_buffer; + + std::vector ranges; ///< All runs of the text. + std::vector::iterator cur_range; ///< The next run to be output. + int cur_range_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 UniscribeVisualRun : public ParagraphLayouter::VisualRun { + private: + std::vector glyphs; + std::vector positions; + std::vector char_to_glyph; + + int start_pos; + int total_advance; + int num_glyphs; + Font *font; + + mutable int *glyph_to_char = NULL; + + public: + UniscribeVisualRun(const UniscribeRun &range, int x); + virtual ~UniscribeVisualRun() + { + free(this->glyph_to_char); + } + + virtual const GlyphID *GetGlyphs() const { return &this->glyphs[0]; } + virtual const float *GetPositions() const { return &this->positions[0]; } + virtual const int *GetGlyphToCharMap() const; + + virtual const Font *GetFont() const { return this->font; } + virtual int GetLeading() const { return this->font->fc->GetHeight(); } + virtual int GetGlyphCount() const { return this->num_glyphs; } + int GetAdvance() const { return this->total_advance; } + }; + + /** A single line worth of VisualRuns. */ + class UniscribeLine : public AutoDeleteSmallVector, public ParagraphLayouter::Line { + public: + 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 + { + /* Uniscribe uses UTF-16 internally which means we need to account for surrogate pairs. */ + return c >= 0x010000U ? 2 : 1; + } + }; + + UniscribeParagraphLayout(std::vector &ranges, const UniscribeParagraphLayoutFactory::CharType *buffer) : text_buffer(buffer), ranges(ranges) + { + this->Reflow(); + } + + virtual ~UniscribeParagraphLayout() {} + + virtual void Reflow() + { + this->cur_range = this->ranges.begin(); + this->cur_range_offset = 0; + } + + virtual const Line *NextLine(int max_width); +}; + +void UniscribeResetScriptCache(FontSize size) +{ + if (_script_cache[size] != NULL) { + ScriptFreeCache(&_script_cache[size]); + _script_cache[size] = NULL; + } +} + +/** Load the matching native Windows font. */ +static HFONT HFontFromFont(Font *font) +{ + LOGFONT logfont; + ZeroMemory(&logfont, sizeof(LOGFONT)); + logfont.lfHeight = font->fc->GetHeight(); + logfont.lfWeight = FW_NORMAL; + logfont.lfCharSet = DEFAULT_CHARSET; + convert_to_fs(font->fc->GetFontName(), logfont.lfFaceName, lengthof(logfont.lfFaceName)); + + return CreateFontIndirect(&logfont); +} + +/** Determine the glyph positions for a run. */ +static bool UniscribeShapeRun(const UniscribeParagraphLayoutFactory::CharType *buff, UniscribeRun &range) +{ + /* Initial size guess for the number of glyphs recommended by Uniscribe. */ + range.glyphs.resize(range.len * 3 / 2 + 16); + range.vis_attribs.resize(range.glyphs.size()); + + /* The char-to-glyph array is the same size as the input. */ + range.char_to_glyph.resize(range.len); + + HDC temp_dc = NULL; + HFONT old_font = NULL; + HFONT cur_font = NULL; + + while (true) { + /* Shape the text run by determining the glyphs needed for display. */ + int glyphs_used = 0; + HRESULT hr = ScriptShape(temp_dc, &_script_cache[range.font->fc->GetSize()], buff + range.pos, range.len, (int)range.glyphs.size(), &range.sa, &range.glyphs[0], &range.char_to_glyph[0], &range.vis_attribs[0], &glyphs_used); + + if (SUCCEEDED(hr)) { + range.glyphs.resize(glyphs_used); + range.vis_attribs.resize(glyphs_used); + + /* Calculate the glyph positions. */ + ABC abc; + range.advances.resize(range.glyphs.size()); + range.offsets.resize(range.glyphs.size()); + hr = ScriptPlace(temp_dc, &_script_cache[range.font->fc->GetSize()], &range.glyphs[0], (int)range.glyphs.size(), &range.vis_attribs[0], &range.sa, &range.advances[0], &range.offsets[0], &abc); + if (SUCCEEDED(hr)) { + /* We map our special sprite chars to values that don't fit into a WORD. Copy the glyphs + * into a new vector and query the real glyph to use for these special chars. */ + range.ft_glyphs.resize(range.glyphs.size()); + for (size_t g_id = 0; g_id < range.glyphs.size(); g_id++) { + range.ft_glyphs[g_id] = range.glyphs[g_id]; + } + 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. + } + } + + /* FreeType and GDI/Uniscribe seems to occasionally disagree over the width of a glyph. */ + range.total_advance = 0; + for (size_t i = 0; i < range.advances.size(); i++) { + if (range.advances[i] > 0 && range.ft_glyphs[i] != 0xFFFF) range.advances[i] = range.font->fc->GetGlyphWidth(range.ft_glyphs[i]); + range.total_advance += range.advances[i]; + } + break; + } + } + + if (hr == E_OUTOFMEMORY) { + /* The glyph buffer needs to be larger. Just double it every time. */ + range.glyphs.resize(range.glyphs.size() * 2); + range.vis_attribs.resize(range.vis_attribs.size() * 2); + } else if (hr == E_PENDING) { + /* Glyph data is not in cache, load native font. */ + cur_font = HFontFromFont(range.font); + if (cur_font == NULL) return false; // Sorry, no dice. + + temp_dc = CreateCompatibleDC(NULL); + SetMapMode(temp_dc, MM_TEXT); + old_font = (HFONT)SelectObject(temp_dc, cur_font); + } else if (hr == USP_E_SCRIPT_NOT_IN_FONT && range.sa.eScript != SCRIPT_UNDEFINED) { + /* Try again with the generic shaping engine. */ + range.sa.eScript = SCRIPT_UNDEFINED; + } else { + /* Some unknown other error. */ + if (temp_dc != NULL) { + SelectObject(temp_dc, old_font); + DeleteObject(cur_font); + ReleaseDC(NULL, temp_dc); + } + return false; + } + } + + if (temp_dc != NULL) { + SelectObject(temp_dc, old_font); + DeleteObject(cur_font); + ReleaseDC(NULL, temp_dc); + } + + return true; +} + +static std::vector UniscribeItemizeString(UniscribeParagraphLayoutFactory::CharType *buff, int32 length) +{ + /* Itemize text. */ + SCRIPT_CONTROL control; + ZeroMemory(&control, sizeof(SCRIPT_CONTROL)); + control.uDefaultLanguage = _current_language->winlangid; + + SCRIPT_STATE state; + ZeroMemory(&state, sizeof(SCRIPT_STATE)); + state.uBidiLevel = _current_text_dir == TD_RTL ? 1 : 0; + + std::vector items(16); + while (true) { + /* We subtract one from max_items to work around a buffer overflow on some older versions of Windows. */ + int generated = 0; + HRESULT hr = ScriptItemize(buff, length, (int)items.size() - 1, &control, &state, &items[0], &generated); + + if (SUCCEEDED(hr)) { + /* Resize the item buffer. Note that Uniscribe will always add an additional end sentinel item. */ + items.resize(generated + 1); + break; + } + /* Some kind of error except item buffer too small. */ + if (hr != E_OUTOFMEMORY) return std::vector(); + + items.resize(items.size() * 2); + } + + return items; +} + +/* static */ ParagraphLayouter *UniscribeParagraphLayoutFactory::GetParagraphLayout(CharType *buff, CharType *buff_end, FontMap &fontMapping) +{ + int32 length = buff_end - buff; + /* Can't layout an empty string. */ + 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; + } + + /* Itemize text. */ + std::vector items = UniscribeItemizeString(buff, length); + if (items.size() == 0) return NULL; + + /* Build ranges from the items and the font map. A range is a run of text + * that is part of a single item and formatted using a single font style. */ + std::vector ranges; + + int cur_pos = 0; + std::vector::iterator cur_item = items.begin(); + for (FontMap::const_iterator i = fontMapping.Begin(); i != fontMapping.End(); i++) { + while (cur_pos < i->first && cur_item != items.end() - 1) { + /* Add a range that spans the intersection of the remaining item and font run. */ + int stop_pos = min(i->first, (cur_item + 1)->iCharPos); + assert(stop_pos - cur_pos > 0); + ranges.push_back(UniscribeRun(cur_pos, stop_pos - cur_pos, i->second, cur_item->a)); + + /* Shape the range. */ + if (!UniscribeShapeRun(buff, ranges.back())) { + return NULL; + } + + /* If we are at the end of the current item, advance to the next item. */ + if (stop_pos == (cur_item + 1)->iCharPos) cur_item++; + cur_pos = stop_pos; + } + } + + return new UniscribeParagraphLayout(ranges, buff); +} + +/* virtual */ const ParagraphLayouter::Line *UniscribeParagraphLayout::NextLine(int max_width) +{ + std::vector::iterator start_run = this->cur_range; + std::vector::iterator last_run = this->cur_range; + + if (start_run == this->ranges.end()) return NULL; + + /* Add remaining width of the first run if it is a broken run. */ + int cur_width = 0; + if (this->cur_range_offset != 0) { + std::vector dx(start_run->len); + ScriptGetLogicalWidths(&start_run->sa, start_run->len, (int)start_run->glyphs.size(), &start_run->advances[0], &start_run->char_to_glyph[0], &start_run->vis_attribs[0], &dx[0]); + + for (std::vector::const_iterator c = dx.begin() + this->cur_range_offset; c != dx.end(); c++) { + cur_width += *c; + } + ++last_run; + } + + /* Gather runs until the line is full. */ + while (last_run != this->ranges.end() && cur_width < max_width) { + cur_width += last_run->total_advance; + ++last_run; + } + + /* If the text does not fit into the available width, find a suitable breaking point. */ + int remaing_offset = (last_run - 1)->len; + if (cur_width > max_width) { + std::vector log_attribs; + + /* Get word break information. */ + int width_avail = max_width; + int num_chars = this->cur_range_offset; + int start_offs = this->cur_range_offset; + int last_cluster = this->cur_range_offset + 1; + for (std::vector::iterator r = start_run; r != last_run; r++) { + log_attribs.resize(r->pos - start_run->pos + r->len); + if (FAILED(ScriptBreak(this->text_buffer + r->pos + start_offs, r->len - start_offs, &r->sa, &log_attribs[r->pos - start_run->pos + start_offs]))) return NULL; + + std::vector dx(r->len); + ScriptGetLogicalWidths(&r->sa, r->len, (int)r->glyphs.size(), &r->advances[0], &r->char_to_glyph[0], &r->vis_attribs[0], &dx[0]); + + /* Count absolute max character count on the line. */ + for (int c = start_offs; c < r->len && width_avail > 0; c++, num_chars++) { + if (c > start_offs && log_attribs[num_chars].fCharStop) last_cluster = num_chars; + width_avail -= dx[c]; + } + + start_offs = 0; + } + + /* Walk backwards to find the last suitable breaking point. */ + while (--num_chars > this->cur_range_offset && !log_attribs[num_chars].fSoftBreak && !log_attribs[num_chars].fWhiteSpace) {} + + if (num_chars == this->cur_range_offset) { + /* Didn't find any suitable word break point, just break on the last cluster boundary. */ + num_chars = last_cluster; + } + + /* Include whitespace characters after the breaking point. */ + while (num_chars < (int)log_attribs.size() && log_attribs[num_chars].fWhiteSpace) { + num_chars++; + } + + /* Get last run that corresponds to the number of characters to show. */ + for (std::vector::iterator run = start_run; run != last_run; run++) { + num_chars -= run->len; + + if (num_chars <= 0) { + remaing_offset = num_chars + run->len + 1; + last_run = run + 1; + assert(remaing_offset - 1 > 0); + break; + } + } + } + + /* Build display order from the runs. */ + std::vector bidi_level; + for (std::vector::iterator r = start_run; r != last_run; r++) { + bidi_level.push_back(r->sa.s.uBidiLevel); + } + std::vector vis_to_log(bidi_level.size()); + if (FAILED(ScriptLayout((int)bidi_level.size(), &bidi_level[0], &vis_to_log[0], NULL))) return NULL; + + /* Create line. */ + UniscribeLine *line = new UniscribeLine(); + + int cur_pos = 0; + for (std::vector::iterator l = vis_to_log.begin(); l != vis_to_log.end(); l++) { + std::vector::iterator i_run = start_run + *l; + UniscribeRun run = *i_run; + + /* Partial run after line break (either start or end)? Reshape run to get the first/last glyphs right. */ + if (i_run == last_run - 1 && remaing_offset < (last_run - 1)->len) { + run.len = remaing_offset - 1; + + if (!UniscribeShapeRun(this->text_buffer, run)) return NULL; + } + if (i_run == start_run && this->cur_range_offset > 0) { + assert(run.len - this->cur_range_offset > 0); + run.pos += this->cur_range_offset; + run.len -= this->cur_range_offset; + + if (!UniscribeShapeRun(this->text_buffer, run)) return NULL; + } + + *line->Append() = new UniscribeVisualRun(run, cur_pos); + cur_pos += run.total_advance; + } + + if (remaing_offset < (last_run - 1)->len) { + /* We didn't use up all of the last run, store remainder for the next line. */ + this->cur_range_offset = remaing_offset - 1; + this->cur_range = last_run - 1; + assert(this->cur_range->len > this->cur_range_offset); + } else { + this->cur_range_offset = 0; + this->cur_range = last_run; + } + + return line; +} + +/** + * Get the height of the line. + * @return The maximum height of the line. + */ +int UniscribeParagraphLayout::UniscribeLine::GetLeading() const +{ + int leading = 0; + for (const UniscribeVisualRun * 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 UniscribeParagraphLayout::UniscribeLine::GetWidth() const +{ + int length = 0; + for (const UniscribeVisualRun * const *run = this->Begin(); run != this->End(); run++) { + length += (*run)->GetAdvance(); + } + + return length; +} + +UniscribeParagraphLayout::UniscribeVisualRun::UniscribeVisualRun(const UniscribeRun &range, int x) : glyphs(range.ft_glyphs), char_to_glyph(range.char_to_glyph), start_pos(range.pos), total_advance(range.total_advance), font(range.font) +{ + this->num_glyphs = (int)glyphs.size(); + this->positions.resize(this->num_glyphs * 2 + 2); + + int advance = 0; + for (int i = 0; i < this->num_glyphs; i++) { + this->positions[i * 2 + 0] = range.offsets[i].du + advance + x; + this->positions[i * 2 + 1] = range.offsets[i].dv; + + advance += range.advances[i]; + } + this->positions[this->num_glyphs * 2] = advance + x; +} + +const int *UniscribeParagraphLayout::UniscribeVisualRun::GetGlyphToCharMap() const +{ + if (this->glyph_to_char == NULL) { + this->glyph_to_char = CallocT(this->GetGlyphCount()); + + /* The char to glyph array contains the first glyph index of the cluster that is associated + * with each character. It is possible for a cluster to be formed of several chars. */ + for (int c = 0; c < (int)this->char_to_glyph.size(); c++) { + /* If multiple chars map to one glyph, only refer back to the first character. */ + if (this->glyph_to_char[this->char_to_glyph[c]] == 0) this->glyph_to_char[this->char_to_glyph[c]] = c + this->start_pos; + } + + /* We only marked the first glyph of each cluster in the loop above. Fill the gaps. */ + int last_char = this->glyph_to_char[0]; + for (int g = 0; g < this->GetGlyphCount(); g++) { + if (this->glyph_to_char[g] != 0) last_char = this->glyph_to_char[g]; + this->glyph_to_char[g] = last_char; + } + } + + return this->glyph_to_char; +} + + +/* virtual */ void UniscribeStringIterator::SetString(const char *s) +{ + const char *string_base = s; + + this->utf16_to_utf8.clear(); + this->str_info.clear(); + this->cur_pos = 0; + + /* Uniscribe 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((wchar_t)c); + } else { + /* Make a surrogate pair. */ + utf16_str.push_back((wchar_t)(0xD800 + ((c - 0x10000) >> 10))); + utf16_str.push_back((wchar_t)(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 Uniscribe for word and cluster break information. */ + this->str_info.resize(utf16_to_utf8.size()); + + if (utf16_str.size() > 0) { + /* Itemize string into language runs. */ + std::vector runs = UniscribeItemizeString(&utf16_str[0], (int32)utf16_str.size()); + + for (std::vector::const_iterator run = runs.begin(); runs.size() > 0 && run != runs.end() - 1; run++) { + /* Get information on valid word and character break.s */ + int len = (run + 1)->iCharPos - run->iCharPos; + std::vector attr(len); + ScriptBreak(&utf16_str[run->iCharPos], len, &run->a, &attr[0]); + + /* Extract the information we're interested in. */ + for (size_t c = 0; c < attr.size(); c++) { + /* First character of a run is always a valid word break. */ + this->str_info[c + run->iCharPos].word_stop = attr[c].fWordStop || c == 0; + this->str_info[c + run->iCharPos].char_stop = attr[c].fCharStop; + } + } + } + + /* 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 UniscribeStringIterator::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 UniscribeStringIterator::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 UniscribeStringIterator::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]; +} + +#endif /* defined(WITH_UNISCRIBE) */ diff --git a/src/os/windows/string_uniscribe.h b/src/os/windows/string_uniscribe.h new file mode 100644 index 0000000000..6af858a88f --- /dev/null +++ b/src/os/windows/string_uniscribe.h @@ -0,0 +1,92 @@ +/* $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_uniscribe.h Functions related to laying out text on Win32. */ + +#ifndef STRING_UNISCRIBE_H +#define STRING_UNISCRIBE_H + +#if defined(WITH_UNISCRIBE) + +#include "../../gfx_layout.h" +#include "../../string_base.h" +#include + + +void UniscribeResetScriptCache(FontSize size); + + +/** + * Helper class to construct a new #UniscribeParagraphLayout. + */ +class UniscribeParagraphLayoutFactory { +public: + /** Helper for GetLayouter, to get the right type. */ + typedef wchar_t 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; + } + } +}; + +/** String iterator using Uniscribe as a backend. */ +class UniscribeStringIterator : public StringIterator { + /** */ + 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); +}; + +#endif /* defined(WITH_UNISCRIBE) */ + +#endif /* STRING_UNISCRIBE_H */ diff --git a/src/os/windows/win32.cpp b/src/os/windows/win32.cpp index 041468a139..bb1a0a4209 100644 --- a/src/os/windows/win32.cpp +++ b/src/os/windows/win32.cpp @@ -28,6 +28,7 @@ #include "../../crashlog.h" #include #include +#include "../../language.h" /* Due to TCHAR, strncat and strncpy have to remain (for a while). */ #include "../../safeguards.h" @@ -67,11 +68,7 @@ bool LoadLibraryList(Function proc[], const char *dll) while (*dll++ != '\0') { /* Nothing */ } if (*dll == '\0') break; -#if defined(WINCE) - p = GetProcAddress(lib, MB_TO_WIDE(dll)); -#else p = GetProcAddress(lib, dll); -#endif if (p == NULL) return false; *proc++ = (Function)p; } @@ -208,29 +205,20 @@ bool FiosIsRoot(const char *file) return file[3] == '\0'; // C:\... } -void FiosGetDrives() +void FiosGetDrives(FileList &file_list) { -#if defined(WINCE) - /* WinCE only knows one drive: / */ - FiosItem *fios = _fios_items.Append(); - fios->type = FIOS_TYPE_DRIVE; - fios->mtime = 0; - seprintf(fios->name, lastof(fios->name), PATHSEP ""); - strecpy(fios->title, fios->name, lastof(fios->title)); -#else TCHAR drives[256]; const TCHAR *s; GetLogicalDriveStrings(lengthof(drives), drives); for (s = drives; *s != '\0';) { - FiosItem *fios = _fios_items.Append(); + FiosItem *fios = file_list.Append(); fios->type = FIOS_TYPE_DRIVE; fios->mtime = 0; seprintf(fios->name, lastof(fios->name), "%c:", s[0] & 0xFF); strecpy(fios->title, fios->name, lastof(fios->title)); while (*s++ != '\0') { /* Nothing */ } } -#endif } bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb) @@ -306,16 +294,13 @@ static int ParseCommandLine(char *line, char **argv, int max_argc) void CreateConsole() { -#if defined(WINCE) - /* WinCE doesn't support console stuff */ -#else HANDLE hand; CONSOLE_SCREEN_BUFFER_INFO coninfo; if (_has_console) return; _has_console = true; - AllocConsole(); + if (!AllocConsole()) return; hand = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(hand, &coninfo); @@ -358,7 +343,6 @@ void CreateConsole() setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stderr, NULL, _IONBF, 0); -#endif } /** Temporary pointer to get the help message to the window */ @@ -426,18 +410,14 @@ void ShowInfo(const char *str) } } -#if defined(WINCE) -int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) -#else int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) -#endif { int argc; char *argv[64]; // max 64 command line arguments CrashLog::InitialiseCrashLog(); -#if defined(UNICODE) && !defined(WINCE) +#if defined(UNICODE) /* Check if a win9x user started the win32 version */ if (HasBit(GetVersion(), 31)) usererror("This version of OpenTTD doesn't run on windows 95/98/ME.\nPlease download the win9x binary and try again."); #endif @@ -451,9 +431,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi CreateConsole(); #endif -#if !defined(WINCE) _set_error_mode(_OUT_TO_MSGBOX); // force assertion output to messagebox -#endif /* setup random seed to something quite random */ SetRandomSeed(GetTickCount()); @@ -468,35 +446,11 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi return 0; } -#if defined(WINCE) -void GetCurrentDirectoryW(int length, wchar_t *path) -{ - /* Get the name of this module */ - GetModuleFileName(NULL, path, length); - - /* Remove the executable name, this we call CurrentDir */ - wchar_t *pDest = wcsrchr(path, '\\'); - if (pDest != NULL) { - int result = pDest - path + 1; - path[result] = '\0'; - } -} -#endif - char *getcwd(char *buf, size_t size) { -#if defined(WINCE) - TCHAR path[MAX_PATH]; - GetModuleFileName(NULL, path, MAX_PATH); - convert_from_fs(path, buf, size); - /* GetModuleFileName returns dir with file, so remove everything behind latest '\\' */ - char *p = strrchr(buf, '\\'); - if (p != NULL) *p = '\0'; -#else TCHAR path[MAX_PATH]; GetCurrentDirectory(MAX_PATH - 1, path); convert_from_fs(path, buf, size); -#endif return buf; } @@ -671,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) { @@ -785,3 +739,99 @@ uint GetCPUCoreCount() GetSystemInfo(&info); return info.dwNumberOfProcessors; } + + +static WCHAR _cur_iso_locale[16] = L""; + +void Win32SetCurrentLocaleName(const char *iso_code) +{ + /* Convert the iso code into the format that windows expects. */ + char iso[16]; + if (strcmp(iso_code, "zh_TW") == 0) { + strecpy(iso, "zh-Hant", lastof(iso)); + } else if (strcmp(iso_code, "zh_CN") == 0) { + strecpy(iso, "zh-Hans", lastof(iso)); + } else { + /* Windows expects a '-' between language and country code, but we use a '_'. */ + strecpy(iso, iso_code, lastof(iso)); + for (char *c = iso; *c != '\0'; c++) { + if (*c == '_') *c = '-'; + } + } + + MultiByteToWideChar(CP_UTF8, 0, iso, -1, _cur_iso_locale, lengthof(_cur_iso_locale)); +} + +int OTTDStringCompare(const char *s1, const char *s2) +{ + typedef int (WINAPI *PFNCOMPARESTRINGEX)(LPCWSTR, DWORD, LPCWCH, int, LPCWCH, int, LPVOID, LPVOID, LPARAM); + static PFNCOMPARESTRINGEX _CompareStringEx = NULL; + static bool first_time = true; + +#ifndef SORT_DIGITSASNUMBERS +# define SORT_DIGITSASNUMBERS 0x00000008 // use digits as numbers sort method +#endif +#ifndef LINGUISTIC_IGNORECASE +# define LINGUISTIC_IGNORECASE 0x00000010 // linguistically appropriate 'ignore case' +#endif + + if (first_time) { + _CompareStringEx = (PFNCOMPARESTRINGEX)GetProcAddress(GetModuleHandle(_T("Kernel32")), "CompareStringEx"); + first_time = false; + } + + if (_CompareStringEx != NULL) { + /* CompareStringEx takes UTF-16 strings, even in ANSI-builds. */ + int len_s1 = MultiByteToWideChar(CP_UTF8, 0, s1, -1, NULL, 0); + int len_s2 = MultiByteToWideChar(CP_UTF8, 0, s2, -1, NULL, 0); + + if (len_s1 != 0 && len_s2 != 0) { + LPWSTR str_s1 = AllocaM(WCHAR, len_s1); + LPWSTR str_s2 = AllocaM(WCHAR, len_s2); + + MultiByteToWideChar(CP_UTF8, 0, s1, -1, str_s1, len_s1); + MultiByteToWideChar(CP_UTF8, 0, s2, -1, str_s2, len_s2); + + int result = _CompareStringEx(_cur_iso_locale, LINGUISTIC_IGNORECASE | SORT_DIGITSASNUMBERS, str_s1, -1, str_s2, -1, NULL, NULL, 0); + if (result != 0) return result; + } + } + + TCHAR s1_buf[512], s2_buf[512]; + convert_to_fs(s1, s1_buf, lengthof(s1_buf)); + convert_to_fs(s2, s2_buf, lengthof(s2_buf)); + + return CompareString(MAKELCID(_current_language->winlangid, SORT_DEFAULT), NORM_IGNORECASE, s1_buf, -1, s2_buf, -1); +} + +#ifdef _MSC_VER +/* Based on code from MSDN: https://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx */ +const DWORD MS_VC_EXCEPTION = 0x406D1388; + +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. +}, 8); + +/** + * Signal thread name to any attached debuggers. + */ +void SetWin32ThreadName(DWORD dwThreadID, const char* threadName) +{ + THREADNAME_INFO info; + info.dwType = 0x1000; + info.szName = threadName; + info.dwThreadID = dwThreadID; + info.dwFlags = 0; + +#pragma warning(push) +#pragma warning(disable: 6320 6322) + __try { + RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR*)&info); + } __except (EXCEPTION_EXECUTE_HANDLER) { + } +#pragma warning(pop) +} +#endif diff --git a/src/os/windows/win32.h b/src/os/windows/win32.h index 4e53879cf0..4f813c4a6f 100644 --- a/src/os/windows/win32.h +++ b/src/os/windows/win32.h @@ -39,4 +39,13 @@ HRESULT OTTDSHGetFolderPath(HWND, int, HANDLE, DWORD, LPTSTR); #define SHGFP_TYPE_CURRENT 0 #endif /* __MINGW32__ */ +#ifdef _MSC_VER +void SetWin32ThreadName(DWORD dwThreadID, const char* threadName); +#else +static inline void SetWin32ThreadName(DWORD dwThreadID, const char* threadName) {} +#endif + +void Win32SetCurrentLocaleName(const char *iso_code); +int OTTDStringCompare(const char *s1, const char *s2); + #endif /* WIN32_H */ 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 9f19b029c0..9b4377248e 100644 --- a/src/pathfinder/follow_track.hpp +++ b/src/pathfinder/follow_track.hpp @@ -73,7 +73,8 @@ struct CFollowTrackT inline void Init(Owner o, RailTypes railtype_override, CPerformanceTimer *pPerf) { - assert((!IsRoadTT() || m_veh != NULL) && (!IsRailTT() || railtype_override != INVALID_RAILTYPES)); + assert(!IsRoadTT() || m_veh != NULL); + assert(!IsRailTT() || railtype_override != INVALID_RAILTYPES); m_veh_owner = o; m_pPerf = pPerf; /* don't worry, all is inlined so compiler should remove unnecessary initializations */ @@ -123,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; @@ -219,16 +224,13 @@ protected: } /* normal or station tile, do one step */ - TileIndexDiff diff = TileOffsByDiagDir(m_exitdir); - m_new_tile = TILE_ADD(m_old_tile, diff); + m_new_tile = TileAddByDiagDir(m_old_tile, m_exitdir); /* special handling for stations */ if (IsRailTT() && HasStationTileRail(m_new_tile)) { m_is_station = true; } else if (IsRoadTT() && IsRoadStopTile(m_new_tile)) { m_is_station = true; - } else { - m_is_station = false; } } @@ -241,7 +243,7 @@ protected: } else { m_new_td_bits = TrackStatusToTrackdirBits(GetTileTrackStatus(m_new_tile, TT(), IsRoadTT() ? RoadVehicle::From(m_veh)->compatible_roadtypes : 0)); - if (IsTram() && m_new_td_bits == 0) { + if (IsTram() && m_new_td_bits == TRACKDIR_BIT_NONE) { /* GetTileTrackStatus() returns 0 for single tram bits. * As we cannot change it there (easily) without breaking something, change it here */ switch (GetSingleTramBit(m_new_tile)) { @@ -408,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 f9dd1a4ff1..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); @@ -133,7 +133,7 @@ struct AyStar { * everything */ void *user_path; void *user_target; - uint user_data[10]; + void *user_data; byte loops_per_tick; ///< How many loops are there called before Main() gives control back to the caller. 0 = until done. uint max_path_cost; ///< If the g-value goes over this number, it stops searching, 0 = infinite. diff --git a/src/pathfinder/npf/npf.cpp b/src/pathfinder/npf/npf.cpp index bb705e5f4a..9535ac0636 100644 --- a/src/pathfinder/npf/npf.cpp +++ b/src/pathfinder/npf/npf.cpp @@ -38,11 +38,11 @@ struct NPFFindStationOrTileData { }; /** Indices into AyStar.userdata[] */ -enum AyStarUserDataType { - NPF_TYPE = 0, ///< Contains a TransportTypes value - NPF_SUB_TYPE, ///< Contains the sub transport type - NPF_OWNER, ///< Contains an Owner value - NPF_RAILTYPES, ///< Contains a bitmask the compatible RailTypes of the engine when NPF_TYPE == TRANSPORT_RAIL. Unused otherwise. +struct AyStarUserData { + Owner owner; + TransportType type; + RailTypes railtypes; + RoadTypes roadtypes; }; /** Indices into AyStarNode.userdata[] */ @@ -157,13 +157,14 @@ static int32 NPFCalcStationOrTileHeuristic(AyStar *as, AyStarNode *current, Open TileIndex from = current->tile; TileIndex to = fstd->dest_coords; uint dist; + AyStarUserData *user = (AyStarUserData *)as->user_data; /* for train-stations, we are going to aim for the closest station tile */ - if (as->user_data[NPF_TYPE] != TRANSPORT_WATER && fstd->station_index != INVALID_STATION) { + if (user->type != TRANSPORT_WATER && fstd->station_index != INVALID_STATION) { to = CalcClosestStationTile(fstd->station_index, from, fstd->station_type); } - if (as->user_data[NPF_TYPE] == TRANSPORT_ROAD) { + if (user->type == TRANSPORT_ROAD) { /* Since roads only have diagonal pieces, we use manhattan distance here */ dist = DistanceManhattan(from, to) * NPF_TILE_LENGTH; } else { @@ -274,7 +275,6 @@ static uint NPFReservedTrackCost(AyStarNode *current) */ static void NPFMarkTile(TileIndex tile) { -#ifndef NO_DEBUG_MESSAGES if (_debug_npf_level < 1 || _networking) return; switch (GetTileType(tile)) { case MP_RAILWAY: @@ -295,7 +295,6 @@ static void NPFMarkTile(TileIndex tile) default: break; } -#endif } static int32 NPFWaterPathCost(AyStar *as, AyStarNode *current, OpenListNode *parent) @@ -532,9 +531,10 @@ static int32 NPFRailPathCost(AyStar *as, AyStarNode *current, OpenListNode *pare /* Will find any depot */ static int32 NPFFindDepot(AyStar *as, OpenListNode *current) { + AyStarUserData *user = (AyStarUserData *)as->user_data; /* It's not worth caching the result with NPF_FLAG_IS_TARGET here as below, * since checking the cache not that much faster than the actual check */ - return IsDepotTypeTile(current->path.node.tile, (TransportType)as->user_data[NPF_TYPE]) ? + return IsDepotTypeTile(current->path.node.tile, user->type) ? AYSTAR_FOUND_END_NODE : AYSTAR_DONE; } @@ -612,6 +612,7 @@ static void ClearPathReservation(const PathNode *start, const PathNode *end) */ static void NPFSaveTargetData(AyStar *as, OpenListNode *current) { + AyStarUserData *user = (AyStarUserData *)as->user_data; NPFFoundTargetData *ftd = (NPFFoundTargetData*)as->user_path; ftd->best_trackdir = (Trackdir)current->path.node.user_data[NPF_TRACKDIR_CHOICE]; ftd->best_path_dist = current->g; @@ -619,7 +620,7 @@ static void NPFSaveTargetData(AyStar *as, OpenListNode *current) ftd->node = current->path.node; ftd->res_okay = false; - if (as->user_target != NULL && ((NPFFindStationOrTileData*)as->user_target)->reserve_path && as->user_data[NPF_TYPE] == TRANSPORT_RAIL) { + if (as->user_target != NULL && ((NPFFindStationOrTileData*)as->user_target)->reserve_path && user->type == TRANSPORT_RAIL) { /* Path reservation is requested. */ const Train *v = Train::From(((NPFFindStationOrTileData *)as->user_target)->v); @@ -767,28 +768,25 @@ static inline bool ForceReverse(TileIndex tile, DiagDirection dir, TransportType * * @param tile The tile of interest. * @param dir The direction in which the vehicle drives onto a tile. - * @param type The transporttype of the vehicle. - * @param subtype For TRANSPORT_ROAD the compatible RoadTypes of the vehicle. - * @param railtypes For TRANSPORT_RAIL the compatible RailTypes of the vehicle. - * @param owner The owner of the vehicle. + * @param user Vehicle information. * @return true iff the vehicle can enter the tile. */ -static bool CanEnterTile(TileIndex tile, DiagDirection dir, TransportType type, uint subtype, RailTypes railtypes, Owner owner) +static bool CanEnterTile(TileIndex tile, DiagDirection dir, AyStarUserData *user) { /* Check tunnel entries and bridge ramps */ if (IsTileType(tile, MP_TUNNELBRIDGE) && GetTunnelBridgeDirection(tile) != dir) return false; /* Test ownership */ - if (!CanEnterTileOwnerCheck(owner, tile, dir)) return false; + if (!CanEnterTileOwnerCheck(user->owner, tile, dir)) return false; /* check correct rail type (mono, maglev, etc) */ - if (type == TRANSPORT_RAIL) { + if (user->type == TRANSPORT_RAIL) { RailType rail_type = GetTileRailType(tile); - if (!HasBit(railtypes, rail_type)) return false; + if (!HasBit(user->railtypes, rail_type)) return false; } /* Depots, standard roadstops and single tram bits can only be entered from one direction */ - DiagDirection single_entry = GetTileSingleEntry(tile, type, subtype); + DiagDirection single_entry = GetTileSingleEntry(tile, user->type, user->roadtypes); if (single_entry != INVALID_DIAGDIR && single_entry != ReverseDiagDir(dir)) return false; return true; @@ -809,7 +807,7 @@ static TrackdirBits GetDriveableTrackdirBits(TileIndex dst_tile, Trackdir src_tr { TrackdirBits trackdirbits = TrackStatusToTrackdirBits(GetTileTrackStatus(dst_tile, type, subtype)); - if (trackdirbits == 0 && type == TRANSPORT_ROAD && HasBit(subtype, ROADTYPE_TRAM)) { + if (trackdirbits == TRACKDIR_BIT_NONE && type == TRANSPORT_ROAD && HasBit(subtype, ROADTYPE_TRAM)) { /* GetTileTrackStatus() returns 0 for single tram bits. * As we cannot change it there (easily) without breaking something, change it here */ switch (GetSingleTramBit(dst_tile)) { @@ -849,6 +847,7 @@ static TrackdirBits GetDriveableTrackdirBits(TileIndex dst_tile, Trackdir src_tr * copy AyStarNode.user_data[NPF_NODE_FLAGS] from the parent */ static void NPFFollowTrack(AyStar *aystar, OpenListNode *current) { + AyStarUserData *user = (AyStarUserData *)aystar->user_data; /* We leave src_tile on track src_trackdir in direction src_exitdir */ Trackdir src_trackdir = current->path.node.direction; TileIndex src_tile = current->path.node.tile; @@ -860,8 +859,8 @@ static void NPFFollowTrack(AyStar *aystar, OpenListNode *current) bool ignore_src_tile = (current->path.parent == NULL && NPFGetFlag(¤t->path.node, NPF_FLAG_IGNORE_START_TILE)); /* Information about the vehicle: TransportType (road/rail/water) and SubType (compatible rail/road types) */ - TransportType type = (TransportType)aystar->user_data[NPF_TYPE]; - uint subtype = aystar->user_data[NPF_SUB_TYPE]; + TransportType type = user->type; + uint subtype = user->roadtypes; /* Initialize to 0, so we can jump out (return) somewhere an have no neighbours */ aystar->num_neighbours = 0; @@ -889,7 +888,7 @@ static void NPFFollowTrack(AyStar *aystar, OpenListNode *current) /* We leave src_tile in src_exitdir and reach dst_tile */ dst_tile = AddTileIndexDiffCWrap(src_tile, TileIndexDiffCByDiagDir(src_exitdir)); - if (dst_tile != INVALID_TILE && !CanEnterTile(dst_tile, src_exitdir, type, subtype, (RailTypes)aystar->user_data[NPF_RAILTYPES], (Owner)aystar->user_data[NPF_OWNER])) dst_tile = INVALID_TILE; + if (dst_tile != INVALID_TILE && !CanEnterTile(dst_tile, src_exitdir, user)) dst_tile = INVALID_TILE; if (dst_tile == INVALID_TILE) { /* We cannot enter the next tile. Road vehicles can reverse, others reach dead end */ @@ -901,7 +900,7 @@ static void NPFFollowTrack(AyStar *aystar, OpenListNode *current) trackdirbits = GetDriveableTrackdirBits(dst_tile, src_trackdir, type, subtype); - if (trackdirbits == 0) { + if (trackdirbits == TRACKDIR_BIT_NONE) { /* We cannot enter the next tile. Road vehicles can reverse, others reach dead end */ if (type != TRANSPORT_ROAD || HasBit(subtype, ROADTYPE_TRAM)) return; @@ -925,7 +924,7 @@ static void NPFFollowTrack(AyStar *aystar, OpenListNode *current) /* Enumerate possible track */ uint i = 0; - while (trackdirbits != 0) { + while (trackdirbits != TRACKDIR_BIT_NONE) { Trackdir dst_trackdir = RemoveFirstTrackdir(&trackdirbits); DEBUG(npf, 5, "Expanded into trackdir: %d, remaining trackdirs: 0x%X", dst_trackdir, trackdirbits); @@ -960,17 +959,18 @@ 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, TransportType type, uint sub_type, Owner owner, RailTypes railtypes, uint reverse_penalty) +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; _npf_aystar.GetNeighbours = NPFFollowTrack; - switch (type) { + switch (user->type) { default: NOT_REACHED(); case TRANSPORT_RAIL: _npf_aystar.CalculateG = NPFRailPathCost; break; case TRANSPORT_ROAD: _npf_aystar.CalculateG = NPFRoadPathCost; break; @@ -981,12 +981,14 @@ static NPFFoundTargetData NPFRouteInternal(AyStarNode *start1, bool ignore_start start1->user_data[NPF_TRACKDIR_CHOICE] = INVALID_TRACKDIR; start1->user_data[NPF_NODE_FLAGS] = 0; NPFSetFlag(start1, NPF_FLAG_IGNORE_START_TILE, ignore_start_tile1); + NPFSetFlag(start1, NPF_FLAG_IGNORE_RESERVED, ignore_reserved); _npf_aystar.AddStartNode(start1, 0); if (start2 != NULL) { start2->user_data[NPF_TRACKDIR_CHOICE] = INVALID_TRACKDIR; start2->user_data[NPF_NODE_FLAGS] = 0; NPFSetFlag(start2, NPF_FLAG_IGNORE_START_TILE, ignore_start_tile2); NPFSetFlag(start2, NPF_FLAG_REVERSE, true); + NPFSetFlag(start2, NPF_FLAG_IGNORE_RESERVED, ignore_reserved); _npf_aystar.AddStartNode(start2, reverse_penalty); } @@ -1002,10 +1004,7 @@ static NPFFoundTargetData NPFRouteInternal(AyStarNode *start1, bool ignore_start _npf_aystar.user_target = target; /* Initialize user_data */ - _npf_aystar.user_data[NPF_TYPE] = type; - _npf_aystar.user_data[NPF_SUB_TYPE] = sub_type; - _npf_aystar.user_data[NPF_OWNER] = owner; - _npf_aystar.user_data[NPF_RAILTYPES] = railtypes; + _npf_aystar.user_data = user; /* GO! */ r = _npf_aystar.Main(); @@ -1026,29 +1025,25 @@ static NPFFoundTargetData NPFRouteInternal(AyStarNode *start1, bool ignore_start /* Will search as below, but with two start nodes, the second being the * reverse. Look at the NPF_FLAG_REVERSE flag in the result node to see which * direction was taken (NPFGetFlag(result.node, NPF_FLAG_REVERSE)) */ -static NPFFoundTargetData NPFRouteToStationOrTileTwoWay(TileIndex tile1, Trackdir trackdir1, bool ignore_start_tile1, TileIndex tile2, Trackdir trackdir2, bool ignore_start_tile2, NPFFindStationOrTileData *target, TransportType type, uint sub_type, Owner owner, RailTypes railtypes) +static NPFFoundTargetData NPFRouteToStationOrTileTwoWay(TileIndex tile1, Trackdir trackdir1, bool ignore_start_tile1, TileIndex tile2, Trackdir trackdir2, bool ignore_start_tile2, NPFFindStationOrTileData *target, AyStarUserData *user) { AyStarNode start1; AyStarNode start2; start1.tile = tile1; start2.tile = tile2; - /* We set this in case the target is also the start tile, we will just - * return a not found then */ - start1.user_data[NPF_TRACKDIR_CHOICE] = INVALID_TRACKDIR; start1.direction = trackdir1; start2.direction = trackdir2; - start2.user_data[NPF_TRACKDIR_CHOICE] = INVALID_TRACKDIR; - return NPFRouteInternal(&start1, ignore_start_tile1, (IsValidTile(tile2) ? &start2 : NULL), ignore_start_tile2, target, NPFFindStationOrTile, NPFCalcStationOrTileHeuristic, type, sub_type, owner, railtypes, 0); + return NPFRouteInternal(&start1, ignore_start_tile1, (IsValidTile(tile2) ? &start2 : NULL), ignore_start_tile2, target, NPFFindStationOrTile, NPFCalcStationOrTileHeuristic, user, 0); } /* Will search from the given tile and direction, for a route to the given * station for the given transport type. See the declaration of * NPFFoundTargetData above for the meaning of the result. */ -static NPFFoundTargetData NPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, bool ignore_start_tile, NPFFindStationOrTileData *target, TransportType type, uint sub_type, Owner owner, RailTypes railtypes) +static NPFFoundTargetData NPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, bool ignore_start_tile, NPFFindStationOrTileData *target, AyStarUserData *user) { - return NPFRouteToStationOrTileTwoWay(tile, trackdir, ignore_start_tile, INVALID_TILE, INVALID_TRACKDIR, false, target, type, sub_type, owner, railtypes); + return NPFRouteToStationOrTileTwoWay(tile, trackdir, ignore_start_tile, INVALID_TILE, INVALID_TRACKDIR, false, target, user); } /* Search using breadth first. Good for little track choice and inaccurate @@ -1058,23 +1053,19 @@ 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, TransportType type, uint sub_type, Owner owner, RailTypes railtypes, 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; start1.tile = tile1; start2.tile = tile2; - /* We set this in case the target is also the start tile, we will just - * return a not found then */ - start1.user_data[NPF_TRACKDIR_CHOICE] = INVALID_TRACKDIR; start1.direction = trackdir1; start2.direction = trackdir2; - start2.user_data[NPF_TRACKDIR_CHOICE] = INVALID_TRACKDIR; /* 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, type, sub_type, owner, railtypes, 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() @@ -1123,7 +1114,8 @@ FindDepotData NPFRoadVehicleFindNearestDepot(const RoadVehicle *v, int max_penal { Trackdir trackdir = v->GetVehicleTrackdir(); - NPFFoundTargetData ftd = NPFRouteToDepotBreadthFirstTwoWay(v->tile, trackdir, false, v->tile, ReverseTrackdir(trackdir), false, NULL, TRANSPORT_ROAD, v->compatible_roadtypes, v->owner, INVALID_RAILTYPES, 0); + AyStarUserData user = { v->owner, TRANSPORT_ROAD, INVALID_RAILTYPES, v->compatible_roadtypes }; + 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(); @@ -1142,7 +1134,8 @@ Trackdir NPFRoadVehicleChooseTrack(const RoadVehicle *v, TileIndex tile, DiagDir NPFFillWithOrderData(&fstd, v); Trackdir trackdir = DiagDirToDiagTrackdir(enterdir); - NPFFoundTargetData ftd = NPFRouteToStationOrTile(tile - TileOffsByDiagDir(enterdir), trackdir, true, &fstd, TRANSPORT_ROAD, v->compatible_roadtypes, v->owner, INVALID_RAILTYPES); + AyStarUserData user = { v->owner, TRANSPORT_ROAD, INVALID_RAILTYPES, v->compatible_roadtypes }; + NPFFoundTargetData ftd = NPFRouteToStationOrTile(tile - TileOffsByDiagDir(enterdir), trackdir, true, &fstd, &user); if (ftd.best_trackdir == INVALID_TRACKDIR) { /* We are already at our target. Just do something * @todo: maybe display error? @@ -1169,14 +1162,15 @@ Track NPFShipChooseTrack(const Ship *v, TileIndex tile, DiagDirection enterdir, NPFFillWithOrderData(&fstd, v); - NPFFoundTargetData ftd = NPFRouteToStationOrTile(tile - TileOffsByDiagDir(enterdir), trackdir, true, &fstd, TRANSPORT_WATER, 0, v->owner, INVALID_RAILTYPES); + AyStarUserData user = { v->owner, TRANSPORT_WATER, INVALID_RAILTYPES, ROADTYPES_NONE }; + NPFFoundTargetData ftd = NPFRouteToStationOrTile(tile - TileOffsByDiagDir(enterdir), trackdir, true, &fstd, &user); /* If ftd.best_bird_dist is 0, we found our target and ftd.best_trackdir contains * the direction we need to take to get there, if ftd.best_bird_dist is not 0, * 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); } @@ -1192,7 +1186,8 @@ bool NPFShipCheckReverse(const Ship *v) assert(trackdir != INVALID_TRACKDIR); assert(trackdir_rev != INVALID_TRACKDIR); - ftd = NPFRouteToStationOrTileTwoWay(v->tile, trackdir, false, v->tile, trackdir_rev, false, &fstd, TRANSPORT_WATER, 0, v->owner, INVALID_RAILTYPES); + AyStarUserData user = { v->owner, TRANSPORT_WATER, INVALID_RAILTYPES, ROADTYPES_NONE }; + ftd = NPFRouteToStationOrTileTwoWay(v->tile, trackdir, false, v->tile, trackdir_rev, false, &fstd, &user); /* If we didn't find anything, just keep on going straight ahead, otherwise take the reverse flag */ return ftd.best_bird_dist == 0 && NPFGetFlag(&ftd.node, NPF_FLAG_REVERSE); } @@ -1209,7 +1204,8 @@ FindDepotData NPFTrainFindNearestDepot(const Train *v, int max_penalty) fstd.reserve_path = false; assert(trackdir != INVALID_TRACKDIR); - NPFFoundTargetData ftd = NPFRouteToDepotBreadthFirstTwoWay(v->tile, trackdir, false, last->tile, trackdir_rev, false, &fstd, TRANSPORT_RAIL, 0, v->owner, v->compatible_railtypes, NPF_INFINITE_PENALTY); + 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, max_penalty); if (ftd.best_bird_dist != 0) return FindDepotData(); /* Found target */ @@ -1230,18 +1226,15 @@ bool NPFTrainFindNearestSafeTile(const Train *v, TileIndex tile, Trackdir trackd AyStarNode start1; start1.tile = tile; - /* We set this in case the target is also the start tile, we will just - * return a not found then */ - start1.user_data[NPF_TRACKDIR_CHOICE] = INVALID_TRACKDIR; start1.direction = trackdir; - NPFSetFlag(&start1, NPF_FLAG_IGNORE_RESERVED, true); RailTypes railtypes = v->compatible_railtypes; if (override_railtype) railtypes |= GetRailTypeInfo(v->railtype)->compatible_railtypes; /* perform a breadth first search. Target is NULL, * since we are just looking for any safe tile...*/ - return NPFRouteInternal(&start1, true, NULL, false, &fstd, NPFFindSafeTile, NPFCalcZero, TRANSPORT_RAIL, 0, v->owner, railtypes, 0).res_okay; + AyStarUserData user = { v->owner, TRANSPORT_RAIL, railtypes, ROADTYPES_NONE }; + return NPFRouteInternal(&start1, true, NULL, false, &fstd, NPFFindSafeTile, NPFCalcZero, &user, 0, true).res_okay; } bool NPFTrainCheckReverse(const Train *v) @@ -1257,7 +1250,8 @@ bool NPFTrainCheckReverse(const Train *v) assert(trackdir != INVALID_TRACKDIR); assert(trackdir_rev != INVALID_TRACKDIR); - ftd = NPFRouteToStationOrTileTwoWay(v->tile, trackdir, false, last->tile, trackdir_rev, false, &fstd, TRANSPORT_RAIL, 0, v->owner, v->compatible_railtypes); + AyStarUserData user = { v->owner, TRANSPORT_RAIL, v->compatible_railtypes, ROADTYPES_NONE }; + ftd = NPFRouteToStationOrTileTwoWay(v->tile, trackdir, false, last->tile, trackdir_rev, false, &fstd, &user); /* If we didn't find anything, just keep on going straight ahead, otherwise take the reverse flag */ return ftd.best_bird_dist == 0 && NPFGetFlag(&ftd.node, NPF_FLAG_REVERSE); } @@ -1270,7 +1264,8 @@ Track NPFTrainChooseTrack(const Train *v, TileIndex tile, DiagDirection enterdir PBSTileInfo origin = FollowTrainReservation(v); assert(IsValidTrackdir(origin.trackdir)); - NPFFoundTargetData ftd = NPFRouteToStationOrTile(origin.tile, origin.trackdir, true, &fstd, TRANSPORT_RAIL, 0, v->owner, v->compatible_railtypes); + AyStarUserData user = { v->owner, TRANSPORT_RAIL, v->compatible_railtypes, ROADTYPES_NONE }; + NPFFoundTargetData ftd = NPFRouteToStationOrTile(origin.tile, origin.trackdir, true, &fstd, &user); if (target != NULL) { target->tile = ftd.node.tile; diff --git a/src/pathfinder/opf/opf_ship.cpp b/src/pathfinder/opf/opf_ship.cpp index 023c6a4a09..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,16 +177,21 @@ good:; best_length = pfs.best_length; bad:; - } while (bits != 0); + } while (bits != TRACK_BIT_NONE); *track = best_track; return best_bird_dist; } /** - * returns the track to choose on the next tile, or -1 when it's better to - * reverse. The tile given is the tile we are about to enter, enterdir is the - * direction in which we are entering the tile + * Finds the best track to choose on the next tile and + * returns INVALID_TRACK when it is better to reverse. + * @param v The ship. + * @param tile The tile we are about to enter. + * @param enterdir The direction entering the tile. + * @param tracks The tracks available on new tile. + * @param[out] path_found Whether a path has been found. + * @return Best track on next tile or INVALID_TRACK when better to reverse. */ Track OPFShipChooseTrack(const Ship *v, TileIndex tile, DiagDirection enterdir, TrackBits tracks, bool &path_found) { @@ -195,13 +201,15 @@ Track OPFShipChooseTrack(const Ship *v, TileIndex tile, DiagDirection enterdir, Track track; /* Let's find out how far it would be if we would reverse first */ - Trackdir trackdir = v->GetVehicleTrackdir(); - TrackBits b = TrackStatusToTrackBits(GetTileTrackStatus(tile2, TRANSPORT_WATER, 0)) & DiagdirReachesTracks(ReverseDiagDir(enterdir)) & TrackdirBitsToTrackBits(TrackdirToTrackdirBits(trackdir)); + uint rev_dist = UINT_MAX; // distance if we reverse + Track cur_track = TrackdirToTrack(v->GetVehicleTrackdir()); // track on the current tile + DiagDirection rev_enterdir = ReverseDiagDir(enterdir); + TrackBits rev_tracks = TrackStatusToTrackBits(GetTileTrackStatus(tile2, TRANSPORT_WATER, 0)) & + DiagdirReachesTracks(rev_enterdir); - uint distr = UINT_MAX; // distance if we reversed - if (b != 0) { - distr = FindShipTrack(v, tile2, ReverseDiagDir(enterdir), b, tile, &track); - if (distr != UINT_MAX) distr++; // penalty for reversing + if (HasTrack(rev_tracks, cur_track)) { + rev_dist = FindShipTrack(v, tile2, rev_enterdir, TrackToTrackBits(cur_track), tile, &track); + if (rev_dist != UINT_MAX) rev_dist++; // penalty for reversing } /* And if we would not reverse? */ @@ -209,6 +217,6 @@ Track OPFShipChooseTrack(const Ship *v, TileIndex tile, DiagDirection enterdir, /* Due to the way this pathfinder works we cannot determine whether we're lost or not. */ path_found = true; - if (dist <= distr) return track; + if (dist <= rev_dist) return track; return INVALID_TRACK; // We could better reverse } 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_base.hpp b/src/pathfinder/yapf/yapf_base.hpp index 713e3755aa..6360567bb2 100644 --- a/src/pathfinder/yapf/yapf_base.hpp +++ b/src/pathfinder/yapf/yapf_base.hpp @@ -122,10 +122,8 @@ public: { m_veh = v; -#ifndef NO_DEBUG_MESSAGES CPerformanceTimer perf; perf.Start(); -#endif /* !NO_DEBUG_MESSAGES */ Yapf().PfSetStartupNodes(); bool bDestFound = true; @@ -154,7 +152,6 @@ public: bDestFound &= (m_pBestDestNode != NULL); -#ifndef NO_DEBUG_MESSAGES perf.Stop(); if (_debug_yapf_level >= 2) { int t = perf.Get(1000000); @@ -174,7 +171,6 @@ public: ); } } -#endif /* !NO_DEBUG_MESSAGES */ return bDestFound; } diff --git a/src/pathfinder/yapf/yapf_common.hpp b/src/pathfinder/yapf/yapf_common.hpp index 660c231161..8ff69b3f6b 100644 --- a/src/pathfinder/yapf/yapf_common.hpp +++ b/src/pathfinder/yapf/yapf_common.hpp @@ -142,8 +142,7 @@ public: /** Called by YAPF to detect if node ends in the desired destination */ inline bool PfDetectDestination(Node &n) { - bool bDest = (n.m_key.m_tile == m_destTile) && ((m_destTrackdirs & TrackdirToTrackdirBits(n.GetTrackdir())) != TRACKDIR_BIT_NONE); - return bDest; + return (n.m_key.m_tile == m_destTile) && HasTrackdir(m_destTrackdirs, n.GetTrackdir()); } /** diff --git a/src/pathfinder/yapf/yapf_costrail.hpp b/src/pathfinder/yapf/yapf_costrail.hpp index 64cf963800..022b9a1678 100644 --- a/src/pathfinder/yapf/yapf_costrail.hpp +++ b/src/pathfinder/yapf/yapf_costrail.hpp @@ -104,7 +104,7 @@ public: assert(IsValidTrackdir(td2)); int cost = 0; if (TrackFollower::Allow90degTurns() - && ((TrackdirToTrackdirBits(td2) & (TrackdirBits)TrackdirCrossesTrackdirs(td1)) != 0)) { + && HasTrackdir(TrackdirCrossesTrackdirs(td1), td2)) { /* 90-deg curve penalty */ cost += Yapf().PfGetSettings().rail_curve90_penalty; } else if (td2 != NextTrackdir(td1)) { @@ -280,7 +280,7 @@ public: { assert(!n.flags_u.flags_s.m_targed_seen); assert(tf->m_new_tile == n.m_key.m_tile); - assert((TrackdirToTrackdirBits(n.m_key.m_td) & tf->m_new_td_bits) != TRACKDIR_BIT_NONE); + assert((HasTrackdir(tf->m_new_td_bits, n.m_key.m_td))); CPerfStart perf_cost(Yapf().m_perf_cost); @@ -403,6 +403,8 @@ no_entry_cost: // jump here at the beginning if the node has no parent (it is th /* Penalty for reversing in a depot. */ assert(IsRailDepot(cur.tile)); segment_cost += Yapf().PfGetSettings().rail_depot_reverse_penalty; + + } else if (IsRailDepotTile(cur.tile)) { /* We will end in this pass (depot is possible target) */ end_segment_reason |= ESRB_DEPOT; @@ -416,9 +418,16 @@ no_entry_cost: // jump here at the beginning if the node has no parent (it is th CFollowTrackRail ft(v); TileIndex t = cur.tile; Trackdir td = cur.td; + /* Arbitrary maximum tiles to follow to avoid infinite loops. */ + uint max_tiles = 20; while (ft.Follow(t, td)) { assert(t != ft.m_new_tile); t = ft.m_new_tile; + if (t == cur.tile || --max_tiles == 0) { + /* We looped back on ourself or found another loop, bail out. */ + td = INVALID_TRACKDIR; + break; + } if (KillFirstBit(ft.m_new_td_bits) != TRACKDIR_BIT_NONE) { /* We encountered a junction; it's going to be too complex to * handle this perfectly, so just bail out. There is no simple @@ -553,6 +562,9 @@ no_entry_cost: // jump here at the beginning if the node has no parent (it is th } // for (;;) + /* Don't consider path any further it if exceeded max_cost. */ + if (end_segment_reason & ESRB_PATH_TOO_LONG) return false; + bool target_seen = false; if ((end_segment_reason & ESRB_POSSIBLE_TARGET) != ESRB_NONE) { /* Depot, station or waypoint. */ diff --git a/src/pathfinder/yapf/yapf_destrail.hpp b/src/pathfinder/yapf/yapf_destrail.hpp index 681034a2f5..1d1833fbfd 100644 --- a/src/pathfinder/yapf/yapf_destrail.hpp +++ b/src/pathfinder/yapf/yapf_destrail.hpp @@ -140,7 +140,8 @@ public: * waypoint. */ Yapf().DisableCache(true); } - /* FALL THROUGH */ + FALLTHROUGH; + case OT_GOTO_STATION: m_destTile = CalcClosestStationTile(v->current_order.GetDestination(), v->tile, v->current_order.IsType(OT_GOTO_STATION) ? STATION_RAIL : STATION_WAYPOINT); m_dest_station_id = v->current_order.GetDestination(); @@ -165,16 +166,13 @@ public: /** Called by YAPF to detect if node ends in the desired destination */ inline bool PfDetectDestination(TileIndex tile, Trackdir td) { - bool bDest; if (m_dest_station_id != INVALID_STATION) { - bDest = HasStationTileRail(tile) + return HasStationTileRail(tile) && (GetStationIndex(tile) == m_dest_station_id) && (GetRailStationTrack(tile) == TrackdirToTrack(td)); - } else { - bDest = (tile == m_destTile) - && ((m_destTrackdirs & TrackdirToTrackdirBits(td)) != TRACKDIR_BIT_NONE); } - return bDest; + + return (tile == m_destTile) && HasTrackdir(m_destTrackdirs, td); } /** diff --git a/src/pathfinder/yapf/yapf_rail.cpp b/src/pathfinder/yapf/yapf_rail.cpp index 5324e4fc87..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); @@ -223,7 +225,7 @@ public: return 't'; } - static bool stFindNearestDepotTwoWay(const Train *v, TileIndex t1, Trackdir td1, TileIndex t2, Trackdir td2, int max_penalty, int reverse_penalty, TileIndex *depot_tile, bool *reversed) + static FindDepotData stFindNearestDepotTwoWay(const Train *v, TileIndex t1, Trackdir td1, TileIndex t2, Trackdir td2, int max_penalty, int reverse_penalty) { Tpf pf1; /* @@ -236,16 +238,16 @@ public: * depot orders and you do not disable automatic servicing. */ if (max_penalty != 0) pf1.DisableCache(true); - bool result1 = pf1.FindNearestDepotTwoWay(v, t1, td1, t2, td2, max_penalty, reverse_penalty, depot_tile, reversed); + FindDepotData result1 = pf1.FindNearestDepotTwoWay(v, t1, td1, t2, td2, max_penalty, reverse_penalty); if (_debug_desync_level >= 2) { Tpf pf2; - TileIndex depot_tile2 = INVALID_TILE; - bool reversed2 = false; pf2.DisableCache(true); - bool result2 = pf2.FindNearestDepotTwoWay(v, t1, td1, t2, td2, max_penalty, reverse_penalty, &depot_tile2, &reversed2); - if (result1 != result2 || (result1 && (*depot_tile != depot_tile2 || *reversed != reversed2))) { - DEBUG(desync, 2, "CACHE ERROR: FindNearestDepotTwoWay() = [%s, %s]", result1 ? "T" : "F", result2 ? "T" : "F"); + FindDepotData result2 = pf2.FindNearestDepotTwoWay(v, t1, td1, t2, td2, max_penalty, reverse_penalty); + if (result1.tile != result2.tile || (result1.reverse != result2.reverse)) { + DEBUG(desync, 2, "CACHE ERROR: FindNearestDepotTwoWay() = [%s, %s]", + result1.tile != INVALID_TILE ? "T" : "F", + result2.tile != INVALID_TILE ? "T" : "F"); DumpState(pf1, pf2); } } @@ -253,7 +255,7 @@ public: return result1; } - inline bool FindNearestDepotTwoWay(const Train *v, TileIndex t1, Trackdir td1, TileIndex t2, Trackdir td2, int max_penalty, int reverse_penalty, TileIndex *depot_tile, bool *reversed) + inline FindDepotData FindNearestDepotTwoWay(const Train *v, TileIndex t1, Trackdir td1, TileIndex t2, Trackdir td2, int max_penalty, int reverse_penalty) { /* set origin and destination nodes */ Yapf().SetOrigin(t1, td1, t2, td2, reverse_penalty, true); @@ -261,13 +263,10 @@ public: Yapf().SetMaxCost(max_penalty); /* find the best path */ - bool bFound = Yapf().FindPath(v); - if (!bFound) return false; + if (!Yapf().FindPath(v)) return FindDepotData(); - /* some path found - * get found depot tile */ + /* Some path found. */ Node *n = Yapf().GetBestNode(); - *depot_tile = n->GetLastTile(); /* walk through the path back to the origin */ Node *pNode = n; @@ -277,9 +276,7 @@ public: /* if the origin node is our front vehicle tile/Trackdir then we didn't reverse * but we can also look at the cost (== 0 -> not reversed, == reverse_penalty -> reversed) */ - *reversed = (pNode->m_cost != 0); - - return true; + return FindDepotData(n->GetLastTile(), n->m_cost, pNode->m_cost != 0); } }; @@ -611,15 +608,13 @@ bool YapfTrainCheckReverse(const Train *v) FindDepotData YapfTrainFindNearestDepot(const Train *v, int max_penalty) { - FindDepotData fdd; - const Train *last_veh = v->Last(); PBSTileInfo origin = FollowTrainReservation(v); TileIndex last_tile = last_veh->tile; Trackdir td_rev = ReverseTrackdir(last_veh->GetVehicleTrackdir()); - typedef bool (*PfnFindNearestDepotTwoWay)(const Train*, TileIndex, Trackdir, TileIndex, Trackdir, int, int, TileIndex*, bool*); + typedef FindDepotData (*PfnFindNearestDepotTwoWay)(const Train*, TileIndex, Trackdir, TileIndex, Trackdir, int, int); PfnFindNearestDepotTwoWay pfnFindNearestDepotTwoWay = &CYapfAnyDepotRail1::stFindNearestDepotTwoWay; /* check if non-default YAPF type needed */ @@ -627,9 +622,7 @@ FindDepotData YapfTrainFindNearestDepot(const Train *v, int max_penalty) pfnFindNearestDepotTwoWay = &CYapfAnyDepotRail2::stFindNearestDepotTwoWay; // Trackdir, forbid 90-deg } - bool ret = pfnFindNearestDepotTwoWay(v, origin.tile, origin.trackdir, last_tile, td_rev, max_penalty, YAPF_INFINITE_PENALTY, &fdd.tile, &fdd.reverse); - fdd.best_length = ret ? max_penalty / 2 : UINT_MAX; // some fake distance or NOT_FOUND - return fdd; + return pfnFindNearestDepotTwoWay(v, origin.tile, origin.trackdir, last_tile, td_rev, max_penalty, YAPF_INFINITE_PENALTY); } bool YapfTrainFindNearestSafeTile(const Train *v, TileIndex tile, Trackdir td, bool override_railtype) diff --git a/src/pathfinder/yapf/yapf_road.cpp b/src/pathfinder/yapf/yapf_road.cpp index 4c26d7b095..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; } @@ -185,8 +201,7 @@ public: /** Called by YAPF to detect if node ends in the desired destination */ inline bool PfDetectDestination(Node &n) { - bool bDest = IsRoadDepotTile(n.m_segment_last_tile); - return bDest; + return IsRoadDepotTile(n.m_segment_last_tile); } inline bool PfDetectDestinationTile(TileIndex tile, Trackdir trackdir) @@ -261,7 +276,7 @@ public: (m_non_artic || IsDriveThroughStopTile(tile)); } - return tile == m_destTile && ((m_destTrackdirs & TrackdirToTrackdirBits(trackdir)) != TRACKDIR_BIT_NONE); + return tile == m_destTile && HasTrackdir(m_destTrackdirs, trackdir); } /** @@ -421,7 +436,7 @@ public: /* set origin (tile, trackdir) */ TileIndex src_tile = v->tile; Trackdir src_td = v->GetVehicleTrackdir(); - if ((TrackStatusToTrackdirBits(GetTileTrackStatus(src_tile, TRANSPORT_ROAD, v->compatible_roadtypes)) & TrackdirToTrackdirBits(src_td)) == 0) { + if (!HasTrackdir(TrackStatusToTrackdirBits(GetTileTrackStatus(src_tile, TRANSPORT_ROAD, v->compatible_roadtypes)), src_td)) { /* sometimes the roadveh is not on the road (it resides on non-existing track) * how should we handle that situation? */ return false; @@ -430,29 +445,31 @@ public: return true; } - static bool stFindNearestDepot(const RoadVehicle *v, TileIndex tile, Trackdir td, int max_distance, TileIndex *depot_tile) + static FindDepotData stFindNearestDepot(const RoadVehicle *v, TileIndex tile, Trackdir td, int max_distance) { Tpf pf; - return pf.FindNearestDepot(v, tile, td, max_distance, depot_tile); + return pf.FindNearestDepot(v, tile, td, max_distance); } - inline bool FindNearestDepot(const RoadVehicle *v, TileIndex tile, Trackdir td, int max_distance, TileIndex *depot_tile) + /** + * Find the best depot for a road vehicle. + * @param v Vehicle + * @param tile Tile of the vehicle. + * @param td Trackdir of the vehicle. + * @param max_distance max length (penalty) for paths. + */ + inline FindDepotData FindNearestDepot(const RoadVehicle *v, TileIndex tile, Trackdir td, int max_distance) { - /* set origin and destination nodes */ + /* Set origin. */ Yapf().SetOrigin(tile, TrackdirToTrackdirBits(td)); + Yapf().SetMaxCost(max_distance); - /* find the best path */ - bool bFound = Yapf().FindPath(v); - if (!bFound) return false; + /* Find the best path and return if no depot is found. */ + if (!Yapf().FindPath(v)) return FindDepotData(); - /* some path found - * get found depot tile */ + /* Return the cost of the best path and its depot. */ Node *n = Yapf().GetBestNode(); - - if (max_distance > 0 && n->m_cost > max_distance * YAPF_TILE_LENGTH) return false; - - *depot_tile = n->m_segment_last_tile; - return true; + return FindDepotData(n->m_segment_last_tile, n->m_cost); } }; @@ -499,12 +516,12 @@ FindDepotData YapfRoadVehicleFindNearestDepot(const RoadVehicle *v, int max_dist { TileIndex tile = v->tile; Trackdir trackdir = v->GetVehicleTrackdir(); - if ((TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_ROAD, v->compatible_roadtypes)) & TrackdirToTrackdirBits(trackdir)) == 0) { + if (!HasTrackdir(TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_ROAD, v->compatible_roadtypes)), trackdir)) { return FindDepotData(); } /* default is YAPF type 2 */ - typedef bool (*PfnFindNearestDepot)(const RoadVehicle*, TileIndex, Trackdir, int, TileIndex*); + typedef FindDepotData (*PfnFindNearestDepot)(const RoadVehicle*, TileIndex, Trackdir, int); PfnFindNearestDepot pfnFindNearestDepot = &CYapfRoadAnyDepot2::stFindNearestDepot; /* check if non-default YAPF type should be used */ @@ -512,8 +529,5 @@ FindDepotData YapfRoadVehicleFindNearestDepot(const RoadVehicle *v, int max_dist pfnFindNearestDepot = &CYapfRoadAnyDepot1::stFindNearestDepot; // Trackdir, allow 90-deg } - FindDepotData fdd; - bool ret = pfnFindNearestDepot(v, tile, trackdir, max_distance, &fdd.tile); - fdd.best_length = ret ? max_distance / 2 : UINT_MAX; // some fake distance or NOT_FOUND - return fdd; + return pfnFindNearestDepot(v, tile, trackdir, max_distance); } diff --git a/src/pathfinder/yapf/yapf_ship.cpp b/src/pathfinder/yapf/yapf_ship.cpp index e4b99462d2..44a5c0cfa7 100644 --- a/src/pathfinder/yapf/yapf_ship.cpp +++ b/src/pathfinder/yapf/yapf_ship.cpp @@ -65,11 +65,11 @@ public: /* use vehicle's current direction if that's possible, otherwise use first usable one. */ Trackdir veh_dir = v->GetVehicleTrackdir(); - return ((trackdirs & TrackdirToTrackdirBits(veh_dir)) != 0) ? veh_dir : (Trackdir)FindFirstBit2x64(trackdirs); + return (HasTrackdir(trackdirs, veh_dir)) ? veh_dir : (Trackdir)FindFirstBit2x64(trackdirs); } /* move back to the old tile/trackdir (where ship is coming from) */ - TileIndex src_tile = TILE_ADD(tile, TileOffsByDiagDir(ReverseDiagDir(enterdir))); + TileIndex src_tile = TileAddByDiagDir(tile, ReverseDiagDir(enterdir)); Trackdir trackdir = v->GetVehicleTrackdir(); assert(IsValidTrackdir(trackdir)); diff --git a/src/pbs.cpp b/src/pbs.cpp index 133293909f..6bb35a6964 100644 --- a/src/pbs.cpp +++ b/src/pbs.cpp @@ -81,7 +81,7 @@ void SetRailStationPlatformReservation(TileIndex start, DiagDirection dir, bool */ bool TryReserveRailTrack(TileIndex tile, Track t, bool trigger_stations) { - assert((GetTileTrackStatus(tile, TRANSPORT_RAIL, 0) & TrackToTrackBits(t)) != 0); + assert(HasTrack(TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)), t)); if (_settings_client.gui.show_track_reservation) { /* show the reserved rail if needed */ @@ -142,7 +142,7 @@ bool TryReserveRailTrack(TileIndex tile, Track t, bool trigger_stations) */ void UnreserveRailTrack(TileIndex tile, Track t) { - assert((GetTileTrackStatus(tile, TRANSPORT_RAIL, 0) & TrackToTrackBits(t)) != 0); + assert(HasTrack(TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)), t)); if (_settings_client.gui.show_track_reservation) { if (IsBridgeTile(tile)) { diff --git a/src/rail.cpp b/src/rail.cpp index 79598ec4a1..1664f78e9a 100644 --- a/src/rail.cpp +++ b/src/rail.cpp @@ -56,7 +56,7 @@ extern const Trackdir _next_trackdir[TRACKDIR_END] = { }; /* Maps a trackdir to all trackdirs that make 90 deg turns with it. */ -extern const TrackdirBits _track_crosses_trackdirs[TRACKDIR_END] = { +extern const TrackdirBits _track_crosses_trackdirs[TRACK_END] = { TRACKDIR_BIT_Y_SE | TRACKDIR_BIT_Y_NW, // TRACK_X TRACKDIR_BIT_X_NE | TRACKDIR_BIT_X_SW, // TRACK_Y TRACKDIR_BIT_RIGHT_N | TRACKDIR_BIT_RIGHT_S | TRACKDIR_BIT_LEFT_N | TRACKDIR_BIT_LEFT_S, // TRACK_UPPER @@ -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 320d24a9a0..b7258d3016 100644 --- a/src/rail.h +++ b/src/rail.h @@ -113,7 +113,8 @@ typedef SmallVector RailTypeLabelList; /** * This struct contains all the info that is needed to draw and construct tracks. */ -struct RailtypeInfo { +class RailtypeInfo { +public: /** * Struct containing the main sprites. @note not all sprites are listed, but only * the ones used directly in the code @@ -238,7 +239,7 @@ struct RailtypeInfo { * 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 2010f9b305..a0fd968cc6 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -47,8 +47,6 @@ RailtypeInfo _railtypes[RAILTYPE_END]; RailType _sorted_railtypes[RAILTYPE_END]; uint8 _sorted_railtypes_size; -assert_compile(sizeof(_original_railtypes) <= sizeof(_railtypes)); - /** Enum holding the signal offset in the sprite sheet according to the side it is representing. */ enum SignalOffsets { SIGNAL_TO_SOUTHWEST, @@ -66,8 +64,20 @@ enum SignalOffsets { */ void ResetRailTypes() { - memset(_railtypes, 0, sizeof(_railtypes)); - memcpy(_railtypes, _original_railtypes, sizeof(_original_railtypes)); + assert_compile(lengthof(_original_railtypes) <= lengthof(_railtypes)); + + uint i = 0; + for (; i < lengthof(_original_railtypes); i++) _railtypes[i] = _original_railtypes[i]; + + static const RailtypeInfo empty_railtype = { + {0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,{}}, + {0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0}, + 0, RAILTYPES_NONE, RAILTYPES_NONE, 0, 0, 0, RTFB_NONE, 0, 0, 0, 0, 0, + RailTypeLabelList(), 0, 0, RAILTYPES_NONE, RAILTYPES_NONE, 0, + {}, {} }; + for (; i < lengthof(_railtypes); i++) _railtypes[i] = empty_railtype; } void ResolveRailTypeGUISprites(RailtypeInfo *rti) @@ -151,18 +161,16 @@ RailType AllocateRailType(RailTypeLabel label) if (rti->label == 0) { /* Set up new rail type */ - memcpy(rti, &_railtypes[RAILTYPE_RAIL], sizeof(*rti)); + *rti = _original_railtypes[RAILTYPE_RAIL]; rti->label = label; - /* Clear alternate label list. Can't use Reset() here as that would free - * the data pointer of RAILTYPE_RAIL and not our new rail type. */ - new (&rti->alternate_labels) RailTypeLabelList; + 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 @@ -433,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(p2); CommandCost cost(EXPENSES_CONSTRUCTION); @@ -447,7 +455,7 @@ CommandCost CmdBuildSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1, u CommandCost ret = CheckTileOwnership(tile); if (ret.Failed()) return ret; - if (!IsPlainRail(tile)) return CMD_ERROR; + if (!IsPlainRail(tile)) return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR); // just get appropriate error message if (!IsCompatibleRail(GetRailType(tile), railtype)) return_cmd_error(STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION); @@ -546,7 +554,7 @@ CommandCost CmdBuildSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1, u if (IsLevelCrossing(tile) && GetCrossingRailBits(tile) == trackbit) { return_cmd_error(STR_ERROR_ALREADY_BUILT); } - /* FALL THROUGH */ + FALLTHROUGH; } default: { @@ -846,19 +854,19 @@ static CommandCost ValidateAutoDrag(Trackdir *trackdir, TileIndex start, TileInd * @param flags operation to perform * @param p1 end tile of drag * @param p2 various bitstuffed elements - * - p2 = (bit 0-3) - railroad type normal/maglev (0 = normal, 1 = mono, 2 = maglev), only used for building - * - p2 = (bit 4-6) - track-orientation, valid values: 0-5 (Track enum) - * - p2 = (bit 7) - 0 = build, 1 = remove tracks - * - p2 = (bit 8) - 0 = build up to an obstacle, 1 = fail if an obstacle is found (used for AIs). + * - p2 = (bit 0-5) - railroad type normal/maglev (0 = normal, 1 = mono, 2 = maglev), only used for building + * - p2 = (bit 6-8) - track-orientation, valid values: 0-5 (Track enum) + * - p2 = (bit 9) - 0 = build, 1 = remove tracks + * - p2 = (bit 10) - 0 = build up to an obstacle, 1 = fail if an obstacle is found (used for AIs). * @param text unused * @return the cost of this operation or an error */ static CommandCost CmdRailTrackHelper(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) { CommandCost total_cost(EXPENSES_CONSTRUCTION); - Track track = Extract(p2); - bool remove = HasBit(p2, 7); - RailType railtype = Extract(p2); + Track track = Extract(p2); + bool remove = HasBit(p2, 9); + RailType railtype = Extract(p2); if ((!remove && !ValParamRailtype(railtype)) || !ValParamTrackOrientation(track)) return CMD_ERROR; if (p1 >= MapSize()) return CMD_ERROR; @@ -876,7 +884,7 @@ static CommandCost CmdRailTrackHelper(TileIndex tile, DoCommandFlag flags, uint3 if (ret.Failed()) { last_error = ret; if (last_error.GetErrorMessage() != STR_ERROR_ALREADY_BUILT && !remove) { - if (HasBit(p2, 8)) return last_error; + if (HasBit(p2, 10)) return last_error; break; } @@ -906,16 +914,16 @@ static CommandCost CmdRailTrackHelper(TileIndex tile, DoCommandFlag flags, uint3 * @param flags operation to perform * @param p1 end tile of drag * @param p2 various bitstuffed elements - * - p2 = (bit 0-3) - railroad type normal/maglev (0 = normal, 1 = mono, 2 = maglev) - * - p2 = (bit 4-6) - track-orientation, valid values: 0-5 (Track enum) - * - p2 = (bit 7) - 0 = build, 1 = remove tracks + * - p2 = (bit 0-5) - railroad type normal/maglev (0 = normal, 1 = mono, 2 = maglev) + * - p2 = (bit 6-8) - track-orientation, valid values: 0-5 (Track enum) + * - p2 = (bit 9) - 0 = build, 1 = remove tracks * @param text unused * @return the cost of this operation or an error * @see CmdRailTrackHelper */ CommandCost CmdBuildRailroadTrack(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) { - return CmdRailTrackHelper(tile, flags, p1, ClrBit(p2, 7), text); + return CmdRailTrackHelper(tile, flags, p1, ClrBit(p2, 9), text); } /** @@ -925,16 +933,16 @@ CommandCost CmdBuildRailroadTrack(TileIndex tile, DoCommandFlag flags, uint32 p1 * @param flags operation to perform * @param p1 end tile of drag * @param p2 various bitstuffed elements - * - p2 = (bit 0-3) - railroad type normal/maglev (0 = normal, 1 = mono, 2 = maglev), only used for building - * - p2 = (bit 4-6) - track-orientation, valid values: 0-5 (Track enum) - * - p2 = (bit 7) - 0 = build, 1 = remove tracks + * - p2 = (bit 0-5) - railroad type normal/maglev (0 = normal, 1 = mono, 2 = maglev), only used for building + * - p2 = (bit 6-8) - track-orientation, valid values: 0-5 (Track enum) + * - p2 = (bit 9) - 0 = build, 1 = remove tracks * @param text unused * @return the cost of this operation or an error * @see CmdRailTrackHelper */ CommandCost CmdRemoveRailroadTrack(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) { - return CmdRailTrackHelper(tile, flags, p1, SetBit(p2, 7), text); + return CmdRailTrackHelper(tile, flags, p1, SetBit(p2, 9), text); } /** @@ -952,13 +960,15 @@ CommandCost CmdRemoveRailroadTrack(TileIndex tile, DoCommandFlag flags, uint32 p CommandCost CmdBuildTrainDepot(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) { /* check railtype and valid direction for depot (0 through 3), 4 in total */ - RailType railtype = Extract(p1); + RailType railtype = Extract(p1); if (!ValParamRailtype(railtype)) return CMD_ERROR; Slope tileh = GetTileSlope(tile); DiagDirection dir = Extract(p2); + CommandCost cost(EXPENSES_CONSTRUCTION); + /* Prohibit construction if * The tile is non-flat AND * 1) build-on-slopes is disabled @@ -966,14 +976,14 @@ CommandCost CmdBuildTrainDepot(TileIndex tile, DoCommandFlag flags, uint32 p1, u * 3) the exit points in the wrong direction */ - if (tileh != SLOPE_FLAT && ( - !_settings_game.construction.build_on_slopes || - !CanBuildDepotByTileh(dir, tileh) - )) { - return_cmd_error(STR_ERROR_FLAT_LAND_REQUIRED); + if (tileh != SLOPE_FLAT) { + if (!_settings_game.construction.build_on_slopes || !CanBuildDepotByTileh(dir, tileh)) { + return_cmd_error(STR_ERROR_FLAT_LAND_REQUIRED); + } + cost.AddCost(_price[PR_BUILD_FOUNDATION]); } - CommandCost cost = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR); + cost.AddCost(DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR)); if (cost.Failed()) return cost; if (IsBridgeAbove(tile)) return_cmd_error(STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST); @@ -1532,17 +1542,17 @@ static Vehicle *UpdateTrainPowerProc(Vehicle *v, void *data) * @param flags operation to perform * @param p1 start tile of drag * @param p2 various bitstuffed elements: - * - p2 = (bit 0- 3) new railtype to convert to. - * - p2 = (bit 4) build diagonally or not. + * - p2 = (bit 0- 5) new railtype to convert to. + * - p2 = (bit 6) build diagonally or not. * @param text unused * @return the cost of this operation or an error */ CommandCost CmdConvertRail(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) { - RailType totype = Extract(p2); + RailType totype = Extract(p2); TileIndex area_start = p1; TileIndex area_end = tile; - bool diagonal = HasBit(p2, 4); + bool diagonal = HasBit(p2, 6); if (!ValParamRailtype(totype)) return CMD_ERROR; if (area_start >= MapSize()) return CMD_ERROR; @@ -1595,7 +1605,7 @@ CommandCost CmdConvertRail(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 * Tunnels and bridges have special check later */ if (tt != MP_TUNNELBRIDGE) { if (!IsCompatibleRail(type, totype)) { - CommandCost ret = EnsureNoVehicleOnGround(tile); + CommandCost ret = IsPlainRailTile(tile) ? EnsureNoTrainOnTrackBits(tile, GetTrackBits(tile)) : EnsureNoVehicleOnGround(tile); if (ret.Failed()) { error = ret; continue; @@ -2394,7 +2404,7 @@ static void DrawTile_Track(TileInfo *ti) if (HasBit(_display_opt, DO_FULL_DETAIL)) DrawTrackDetails(ti, rti); - if (HasCatenaryDrawn(GetRailType(ti->tile))) DrawCatenary(ti); + if (HasRailCatenaryDrawn(GetRailType(ti->tile))) DrawRailCatenary(ti); if (HasSignals(ti->tile)) DrawSignals(ti->tile, rails, rti); } else { @@ -2436,40 +2446,67 @@ static void DrawTile_Track(TileInfo *ti) SpriteID ground = GetCustomRailSprite(rti, ti->tile, RTSG_GROUND); switch (GetRailDepotDirection(ti->tile)) { - case DIAGDIR_NE: if (!IsInvisibilitySet(TO_BUILDINGS)) break; // else FALL THROUGH - case DIAGDIR_SW: DrawGroundSprite(ground + RTO_X, PAL_NONE); break; - case DIAGDIR_NW: if (!IsInvisibilitySet(TO_BUILDINGS)) break; // else FALL THROUGH - case DIAGDIR_SE: DrawGroundSprite(ground + RTO_Y, PAL_NONE); break; - default: break; + case DIAGDIR_NE: + if (!IsInvisibilitySet(TO_BUILDINGS)) break; + FALLTHROUGH; + case DIAGDIR_SW: + DrawGroundSprite(ground + RTO_X, PAL_NONE); + break; + case DIAGDIR_NW: + if (!IsInvisibilitySet(TO_BUILDINGS)) break; + FALLTHROUGH; + case DIAGDIR_SE: + DrawGroundSprite(ground + RTO_Y, PAL_NONE); + break; + default: + break; } if (_settings_client.gui.show_track_reservation && HasDepotReservation(ti->tile)) { SpriteID overlay = GetCustomRailSprite(rti, ti->tile, RTSG_OVERLAY); switch (GetRailDepotDirection(ti->tile)) { - case DIAGDIR_NE: if (!IsInvisibilitySet(TO_BUILDINGS)) break; // else FALL THROUGH - case DIAGDIR_SW: DrawGroundSprite(overlay + RTO_X, PALETTE_CRASH); break; - case DIAGDIR_NW: if (!IsInvisibilitySet(TO_BUILDINGS)) break; // else FALL THROUGH - case DIAGDIR_SE: DrawGroundSprite(overlay + RTO_Y, PALETTE_CRASH); break; - default: break; + case DIAGDIR_NE: + if (!IsInvisibilitySet(TO_BUILDINGS)) break; + FALLTHROUGH; + case DIAGDIR_SW: + DrawGroundSprite(overlay + RTO_X, PALETTE_CRASH); + break; + case DIAGDIR_NW: + if (!IsInvisibilitySet(TO_BUILDINGS)) break; + FALLTHROUGH; + case DIAGDIR_SE: + DrawGroundSprite(overlay + RTO_Y, PALETTE_CRASH); + break; + default: + break; } } } else { /* PBS debugging, draw reserved tracks darker */ if (_game_mode != GM_MENU && _settings_client.gui.show_track_reservation && HasDepotReservation(ti->tile)) { switch (GetRailDepotDirection(ti->tile)) { - case DIAGDIR_NE: if (!IsInvisibilitySet(TO_BUILDINGS)) break; // else FALL THROUGH - case DIAGDIR_SW: DrawGroundSprite(rti->base_sprites.single_x, PALETTE_CRASH); break; - case DIAGDIR_NW: if (!IsInvisibilitySet(TO_BUILDINGS)) break; // else FALL THROUGH - case DIAGDIR_SE: DrawGroundSprite(rti->base_sprites.single_y, PALETTE_CRASH); break; - default: break; + case DIAGDIR_NE: + if (!IsInvisibilitySet(TO_BUILDINGS)) break; + FALLTHROUGH; + case DIAGDIR_SW: + DrawGroundSprite(rti->base_sprites.single_x, PALETTE_CRASH); + break; + case DIAGDIR_NW: + if (!IsInvisibilitySet(TO_BUILDINGS)) break; + FALLTHROUGH; + case DIAGDIR_SE: + DrawGroundSprite(rti->base_sprites.single_y, PALETTE_CRASH); + break; + default: + break; } } } int depot_sprite = GetCustomRailSprite(rti, ti->tile, RTSG_DEPOT); relocation = depot_sprite != 0 ? depot_sprite - SPR_RAIL_DEPOT_SE_1 : rti->GetRailtypeSpriteOffset(); - if (HasCatenaryDrawn(GetRailType(ti->tile))) DrawCatenary(ti); + if (HasRailCatenaryDrawn(GetRailType(ti->tile))) DrawRailCatenary(ti); DrawRailTileSeq(ti, dts, TO_BUILDINGS, relocation, 0, _drawtile_track_palette); } @@ -2720,8 +2757,8 @@ static void GetTileDesc_Track(TileIndex tile, TileDesc *td) { const RailtypeInfo *rti = GetRailTypeInfo(GetRailType(tile)); td->rail_speed = rti->max_speed; + td->railtype = rti->strings.name; td->owner[0] = GetTileOwner(tile); - SetDParamX(td->dparam, 0, rti->strings.name); switch (GetRailTileType(tile)) { case RAIL_TILE_NORMAL: td->str = STR_LAI_RAIL_DESCRIPTION_TRACK; @@ -2860,11 +2897,9 @@ int TicksToLeaveDepot(const Train *v) case DIAGDIR_NE: return ((int)(v->x_pos & 0x0F) - ((_fractcoords_enter[dir] & 0x0F) - (length + 1))); case DIAGDIR_SE: return -((int)(v->y_pos & 0x0F) - ((_fractcoords_enter[dir] >> 4) + (length + 1))); case DIAGDIR_SW: return -((int)(v->x_pos & 0x0F) - ((_fractcoords_enter[dir] & 0x0F) + (length + 1))); - default: case DIAGDIR_NW: return ((int)(v->y_pos & 0x0F) - ((_fractcoords_enter[dir] >> 4) - (length + 1))); + default: NOT_REACHED(); } - - return 0; // make compilers happy } /** diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index a48abd29cc..5a533e5c55 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -86,7 +86,7 @@ static bool IsStationAvailable(const StationSpec *statspec) return Convert8bitBooleanCallback(statspec->grf_prop.grffile, CBID_STATION_AVAILABILITY, cb_res); } -void CcPlaySound1E(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2) +void CcPlaySound_SPLAT_RAIL(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2) { if (result.Succeeded() && _settings_client.sound.confirm) SndPlayTileFx(SND_20_SPLAT_RAIL, tile); } @@ -97,7 +97,7 @@ static void GenericPlaceRail(TileIndex tile, int cmd) _remove_button_clicked ? CMD_REMOVE_SINGLE_RAIL | CMD_MSG(STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK) : CMD_BUILD_SINGLE_RAIL | CMD_MSG(STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK), - CcPlaySound1E); + CcPlaySound_SPLAT_RAIL); } /** @@ -161,7 +161,8 @@ static void PlaceRail_Waypoint(TileIndex tile) Axis axis = GetAxisForNewWaypoint(tile); if (IsValidAxis(axis)) { /* Valid tile for waypoints */ - VpStartPlaceSizing(tile, axis == AXIS_X ? VPM_FIX_X : VPM_FIX_Y, DDSP_BUILD_STATION); + VpStartPlaceSizing(tile, axis == AXIS_X ? VPM_X_LIMITED : VPM_Y_LIMITED, DDSP_BUILD_STATION); + VpSetPlaceSizingLimit(_settings_game.station.station_spread); } else { /* Tile where we can't build rail waypoints. This is always going to fail, * but provides the user with a proper error message. */ @@ -191,7 +192,7 @@ static void PlaceRail_Station(TileIndex tile) VpStartPlaceSizing(tile, VPM_X_AND_Y_LIMITED, DDSP_BUILD_STATION); VpSetPlaceSizingLimit(_settings_game.station.station_spread); } else { - uint32 p1 = _cur_railtype | _railstation.orientation << 4 | _settings_client.gui.station_numtracks << 8 | _settings_client.gui.station_platlength << 16 | _ctrl_pressed << 24; + uint32 p1 = _cur_railtype | _railstation.orientation << 6 | _settings_client.gui.station_numtracks << 8 | _settings_client.gui.station_platlength << 16 | _ctrl_pressed << 24; uint32 p2 = _railstation.station_class | _railstation.station_type << 8 | INVALID_STATION << 16; int w = _settings_client.gui.station_numtracks; @@ -223,7 +224,7 @@ static void GenericPlaceSignals(TileIndex tile) Track track = FindFirstTrack(trackbits); if (_remove_button_clicked) { - DoCommandP(tile, track, 0, CMD_REMOVE_SIGNALS | CMD_MSG(STR_ERROR_CAN_T_REMOVE_SIGNALS_FROM), CcPlaySound1E); + DoCommandP(tile, track, 0, CMD_REMOVE_SIGNALS | CMD_MSG(STR_ERROR_CAN_T_REMOVE_SIGNALS_FROM), CcPlaySound_SPLAT_RAIL); } else { const Window *w = FindWindowById(WC_BUILD_SIGNAL, 0); @@ -250,7 +251,7 @@ static void GenericPlaceSignals(TileIndex tile) DoCommandP(tile, p1, 0, CMD_BUILD_SIGNALS | CMD_MSG((w != NULL && _convert_signal_button) ? STR_ERROR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE : STR_ERROR_CAN_T_BUILD_SIGNALS_HERE), - CcPlaySound1E); + CcPlaySound_SPLAT_RAIL); } } @@ -351,11 +352,11 @@ static void BuildRailClick_Remove(Window *w) static void DoRailroadTrack(int mode) { - DoCommandP(TileVirtXY(_thd.selstart.x, _thd.selstart.y), TileVirtXY(_thd.selend.x, _thd.selend.y), _cur_railtype | (mode << 4), + DoCommandP(TileVirtXY(_thd.selstart.x, _thd.selstart.y), TileVirtXY(_thd.selend.x, _thd.selend.y), _cur_railtype | (mode << 6), _remove_button_clicked ? CMD_REMOVE_RAILROAD_TRACK | CMD_MSG(STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK) : CMD_BUILD_RAILROAD_TRACK | CMD_MSG(STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK), - CcPlaySound1E); + CcPlaySound_SPLAT_RAIL); } static void HandleAutodirPlacement() @@ -410,7 +411,7 @@ static void HandleAutoSignalPlacement() _remove_button_clicked ? CMD_REMOVE_SIGNAL_TRACK | CMD_MSG(STR_ERROR_CAN_T_REMOVE_SIGNALS_FROM) : CMD_BUILD_SIGNAL_TRACK | CMD_MSG(STR_ERROR_CAN_T_BUILD_SIGNALS_HERE), - CcPlaySound1E); + CcPlaySound_SPLAT_RAIL); } @@ -710,7 +711,7 @@ struct BuildRailToolbarWindow : Window { break; case DDSP_CONVERT_RAIL: - DoCommandP(end_tile, start_tile, _cur_railtype | (_ctrl_pressed ? 0x10 : 0), CMD_CONVERT_RAIL | CMD_MSG(STR_ERROR_CAN_T_CONVERT_RAIL), CcPlaySound10); + DoCommandP(end_tile, start_tile, _cur_railtype | (_ctrl_pressed ? 1 << 6 : 0), CMD_CONVERT_RAIL | CMD_MSG(STR_ERROR_CAN_T_CONVERT_RAIL), CcPlaySound_SPLAT_RAIL); break; case DDSP_REMOVE_STATION: @@ -718,20 +719,20 @@ struct BuildRailToolbarWindow : Window { if (this->IsWidgetLowered(WID_RAT_BUILD_STATION)) { /* Station */ if (_remove_button_clicked) { - DoCommandP(end_tile, start_tile, _ctrl_pressed ? 0 : 1, CMD_REMOVE_FROM_RAIL_STATION | CMD_MSG(STR_ERROR_CAN_T_REMOVE_PART_OF_STATION), CcPlaySound1E); + DoCommandP(end_tile, start_tile, _ctrl_pressed ? 0 : 1, CMD_REMOVE_FROM_RAIL_STATION | CMD_MSG(STR_ERROR_CAN_T_REMOVE_PART_OF_STATION), CcPlaySound_SPLAT_RAIL); } else { HandleStationPlacement(start_tile, end_tile); } } else { /* Waypoint */ if (_remove_button_clicked) { - DoCommandP(end_tile, start_tile, _ctrl_pressed ? 0 : 1, CMD_REMOVE_FROM_RAIL_WAYPOINT | CMD_MSG(STR_ERROR_CAN_T_REMOVE_TRAIN_WAYPOINT), CcPlaySound1E); + DoCommandP(end_tile, start_tile, _ctrl_pressed ? 0 : 1, CMD_REMOVE_FROM_RAIL_WAYPOINT | CMD_MSG(STR_ERROR_CAN_T_REMOVE_TRAIN_WAYPOINT), CcPlaySound_SPLAT_RAIL); } else { TileArea ta(start_tile, end_tile); - uint32 p1 = _cur_railtype | (select_method == VPM_FIX_X ? AXIS_X : AXIS_Y) << 4 | ta.w << 8 | ta.h << 16 | _ctrl_pressed << 24; + uint32 p1 = _cur_railtype | (select_method == VPM_X_LIMITED ? AXIS_X : AXIS_Y) << 6 | ta.w << 8 | ta.h << 16 | _ctrl_pressed << 24; uint32 p2 = STAT_CLASS_WAYP | _cur_waypoint_type << 8 | INVALID_STATION << 16; - CommandContainer cmdcont = { ta.tile, p1, p2, CMD_BUILD_RAIL_WAYPOINT | CMD_MSG(STR_ERROR_CAN_T_BUILD_TRAIN_WAYPOINT), CcPlaySound1E, "" }; + CommandContainer cmdcont = { ta.tile, p1, p2, CMD_BUILD_RAIL_WAYPOINT | CMD_MSG(STR_ERROR_CAN_T_BUILD_TRAIN_WAYPOINT), CcPlaySound_SPLAT_RAIL, "" }; ShowSelectWaypointIfNeeded(cmdcont, ta); } } @@ -885,7 +886,7 @@ static void HandleStationPlacement(TileIndex start, TileIndex end) if (_railstation.orientation == AXIS_X) Swap(numtracks, platlength); - uint32 p1 = _cur_railtype | _railstation.orientation << 4 | numtracks << 8 | platlength << 16 | _ctrl_pressed << 24; + uint32 p1 = _cur_railtype | _railstation.orientation << 6 | numtracks << 8 | platlength << 16 | _ctrl_pressed << 24; uint32 p2 = _railstation.station_class | _railstation.station_type << 8 | INVALID_STATION << 16; CommandContainer cmdcont = { ta.tile, p1, p2, CMD_BUILD_RAIL_STATION | CMD_MSG(STR_ERROR_CAN_T_BUILD_RAILROAD_STATION), CcStation, "" }; @@ -1907,7 +1908,7 @@ static void SetDefaultRailGui() RailType rt = (RailType)(_settings_client.gui.default_rail_type + RAILTYPE_END); if (rt == DEF_RAILTYPE_MOST_USED) { /* Find the most used rail type */ - RailType count[RAILTYPE_END]; + uint count[RAILTYPE_END]; memset(count, 0, sizeof(count)); for (TileIndex t = 0; t < MapSize(); t++) { if (IsTileType(t, MP_RAILWAY) || IsLevelCrossingTile(t) || HasStationTileRail(t) || @@ -1981,9 +1982,10 @@ void InitializeRailGUI() /** * Create a drop down list for all the rail types of the local company. * @param for_replacement Whether this list is for the replacement window. + * @param all_option Whether to add an 'all types' item. * @return The populated and sorted #DropDownList. */ -DropDownList *GetRailTypeDropDownList(bool for_replacement) +DropDownList *GetRailTypeDropDownList(bool for_replacement, bool all_option) { RailTypes used_railtypes = RAILTYPES_NONE; @@ -2000,6 +2002,12 @@ DropDownList *GetRailTypeDropDownList(bool for_replacement) const Company *c = Company::Get(_local_company); DropDownList *list = new DropDownList(); + + if (all_option) { + DropDownListStringItem *item = new DropDownListStringItem(STR_REPLACE_ALL_RAILTYPE, INVALID_RAILTYPE, false); + *list->Append() = item; + } + RailType rt; FOR_ALL_SORTED_RAILTYPES(rt) { /* If it's not used ever, don't show it to the user. */ diff --git a/src/rail_gui.h b/src/rail_gui.h index f51e8aa273..e7a03b9120 100644 --- a/src/rail_gui.h +++ b/src/rail_gui.h @@ -19,6 +19,6 @@ struct Window *ShowBuildRailToolbar(RailType railtype); void ReinitGuiAfterToggleElrail(bool disable); bool ResetSignalVariant(int32 = 0); void InitializeRailGUI(); -DropDownList *GetRailTypeDropDownList(bool for_replacement = false); +DropDownList *GetRailTypeDropDownList(bool for_replacement = false, bool all_option = false); #endif /* RAIL_GUI_H */ diff --git a/src/rail_map.h b/src/rail_map.h index 2431a79202..74afe5ace5 100644 --- a/src/rail_map.h +++ b/src/rail_map.h @@ -115,7 +115,7 @@ static inline bool IsRailDepotTile(TileIndex t) */ static inline RailType GetRailType(TileIndex t) { - return (RailType)GB(_m[t].m3, 0, 4); + return (RailType)GB(_me[t].m8, 0, 6); } /** @@ -125,7 +125,7 @@ static inline RailType GetRailType(TileIndex t) */ static inline void SetRailType(TileIndex t, RailType r) { - SB(_m[t].m3, 0, 4, r); + SB(_me[t].m8, 0, 6, r); } @@ -522,11 +522,12 @@ static inline void MakeRailNormal(TileIndex t, Owner o, TrackBits b, RailType r) SetTileType(t, MP_RAILWAY); SetTileOwner(t, o); _m[t].m2 = 0; - _m[t].m3 = r; + _m[t].m3 = 0; _m[t].m4 = 0; _m[t].m5 = RAIL_TILE_NORMAL << 6 | b; SB(_me[t].m6, 2, 4, 0); _me[t].m7 = 0; + _me[t].m8 = r; } @@ -535,11 +536,12 @@ static inline void MakeRailDepot(TileIndex t, Owner o, DepotID did, DiagDirectio SetTileType(t, MP_RAILWAY); SetTileOwner(t, o); _m[t].m2 = did; - _m[t].m3 = r; + _m[t].m3 = 0; _m[t].m4 = 0; _m[t].m5 = RAIL_TILE_DEPOT << 6 | d; SB(_me[t].m6, 2, 4, 0); _me[t].m7 = 0; + _me[t].m8 = r; } #endif /* RAIL_MAP_H */ diff --git a/src/rail_type.h b/src/rail_type.h index ee589898b8..2bd602a37e 100644 --- a/src/rail_type.h +++ b/src/rail_type.h @@ -32,7 +32,7 @@ enum RailType { RAILTYPE_ELECTRIC = 1, ///< Electric rails RAILTYPE_MONO = 2, ///< Monorail RAILTYPE_MAGLEV = 3, ///< Maglev - RAILTYPE_END = 16, ///< Used for iterations + RAILTYPE_END = 64, ///< Used for iterations INVALID_RAILTYPE = 0xFF, ///< Flag for invalid railtype DEF_RAILTYPE_FIRST = RAILTYPE_END, ///< Default railtype: first available @@ -43,19 +43,20 @@ enum RailType { /** Allow incrementing of Track variables */ DECLARE_POSTFIX_INCREMENT(RailType) /** Define basic enum properties */ -template <> struct EnumPropsT : MakeEnumPropsT {}; +template <> struct EnumPropsT : MakeEnumPropsT {}; typedef TinyEnumT RailTypeByte; /** - * The different roadtypes we support, but then a bitmask of them + * The different railtypes we support, but then a bitmask of them. + * @note Must be treated as a uint64 type, narrowing it causes bit membership tests to give wrong results, as in bug #6951. */ -enum RailTypes { +enum RailTypes : uint64 { RAILTYPES_NONE = 0, ///< No rail types RAILTYPES_RAIL = 1 << RAILTYPE_RAIL, ///< Non-electrified rails RAILTYPES_ELECTRIC = 1 << RAILTYPE_ELECTRIC, ///< Electrified rails RAILTYPES_MONO = 1 << RAILTYPE_MONO, ///< Monorail! RAILTYPES_MAGLEV = 1 << RAILTYPE_MAGLEV, ///< Ever fast maglev - INVALID_RAILTYPES = UINT_MAX, ///< Invalid railtypes + INVALID_RAILTYPES = UINT64_MAX, ///< Invalid railtypes }; DECLARE_ENUM_AS_BIT_SET(RailTypes) diff --git a/src/rev.cpp.in b/src/rev.cpp.in index 7e27859ce0..0f4b2a6b57 100644 --- a/src/rev.cpp.in +++ b/src/rev.cpp.in @@ -26,18 +26,16 @@ bool IsReleasedVersion() /** * The text version of OpenTTD's revision. - * This will be either "..[-RC]", - * "r[M][-]" or "norev000". + * This will be either + * - "", like "..[-RC]", + * - "-g" in "master", + * - "--g" in other branches, or + * - "norev000", if the version is unknown. * * The major, minor and build are the numbers that describe releases of * OpenTTD (like 0.5.3). "-RC" is used to flag release candidates. * - * The revision number is fairly straight forward. The M is to show that - * the binary is made from modified source code. The branch shows the - * branch the revision is of and will not be there when it is trunk. - * - * norev000 is for non-releases that are made on systems without - * subversion or sources that are not a checkout of subversion. + * shows a "M", if the binary is made from modified source code. */ const char _openttd_revision[] = "!!VERSION!!"; @@ -66,13 +64,13 @@ const byte _openttd_revision_modified = !!MODIFIED!!; * 24-27 minor version * 20-23 build * 19 1 if it is a release, 0 if it is not. - * 0-18 revision number; 0 for releases and when the revision is unknown. + * 0-18 used to be the SVN revision, now just last revision before switch to git * * The 19th bit is there so the development/betas/alpha, etc. leading to a * final release will always have a lower version number than the released * version, thus making comparisons on specific revisions easy. */ -const uint32 _openttd_newgrf_version = 1 << 28 | 6 << 24 | 0 << 20 | 0 << 19 | (!!REVISION!! & ((1 << 19) - 1)); +const uint32 _openttd_newgrf_version = 1 << 28 | 9 << 24 | 0 << 20 | 0 << 19 | 28004; #ifdef __MORPHOS__ /** diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index aa445eb91a..bdc8ce7f30 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -224,7 +224,7 @@ static CommandCost RemoveRoad(TileIndex tile, DoCommandFlag flags, RoadBits piec TileIndex other_end = GetOtherTunnelBridgeEnd(tile); /* Pay for *every* tile of the bridge or tunnel */ uint len = GetTunnelBridgeLength(other_end, tile) + 2; - cost.AddCost(len * _price[PR_CLEAR_ROAD]); + cost.AddCost(len * 2 * _price[PR_CLEAR_ROAD]); if (flags & DC_EXEC) { Company *c = Company::GetIfValid(GetRoadOwner(tile, rt)); if (c != NULL) { @@ -1017,15 +1017,17 @@ CommandCost CmdBuildRoadDepot(TileIndex tile, DoCommandFlag flags, uint32 p1, ui if (!IsValidRoadType(rt) || !ValParamRoadType(rt)) return CMD_ERROR; + CommandCost cost(EXPENSES_CONSTRUCTION); + Slope tileh = GetTileSlope(tile); - if (tileh != SLOPE_FLAT && ( - !_settings_game.construction.build_on_slopes || - !CanBuildDepotByTileh(dir, tileh) - )) { - return_cmd_error(STR_ERROR_FLAT_LAND_REQUIRED); + if (tileh != SLOPE_FLAT) { + if (!_settings_game.construction.build_on_slopes || !CanBuildDepotByTileh(dir, tileh)) { + return_cmd_error(STR_ERROR_FLAT_LAND_REQUIRED); + } + cost.AddCost(_price[PR_BUILD_FOUNDATION]); } - CommandCost cost = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR); + cost.AddCost(DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR)); if (cost.Failed()) return cost; if (IsBridgeAbove(tile)) return_cmd_error(STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST); @@ -1191,7 +1193,7 @@ static bool DrawRoadAsSnowDesert(TileIndex tile, Roadside roadside) * @param ti information about the tile (slopes, height etc) * @param tram the roadbits for the tram */ -void DrawTramCatenary(const TileInfo *ti, RoadBits tram) +void DrawRoadCatenary(const TileInfo *ti, RoadBits tram) { /* Do not draw catenary if it is invisible */ if (IsInvisibilitySet(TO_CATENARY)) return; @@ -1298,7 +1300,7 @@ static void DrawRoadBits(TileInfo *ti) return; } - if (tram != ROAD_NONE) DrawTramCatenary(ti, tram); + if (tram != ROAD_NONE) DrawRoadCatenary(ti, tram); /* Return if full detail is disabled, or we are zoomed fully out. */ if (!HasBit(_display_opt, DO_FULL_DETAIL) || _cur_dpi->zoom > ZOOM_LVL_DETAIL) return; @@ -1388,9 +1390,9 @@ static void DrawTile_Road(TileInfo *ti) if (HasTileRoadType(ti->tile, ROADTYPE_TRAM)) { DrawGroundSprite(SPR_TRAMWAY_OVERLAY + (GetCrossingRoadAxis(ti->tile) ^ 1), pal); - DrawTramCatenary(ti, GetCrossingRoadBits(ti->tile)); + DrawRoadCatenary(ti, GetCrossingRoadBits(ti->tile)); } - if (HasCatenaryDrawn(GetRailType(ti->tile))) DrawCatenary(ti); + if (HasRailCatenaryDrawn(GetRailType(ti->tile))) DrawRailCatenary(ti); break; } @@ -1684,6 +1686,7 @@ static void GetTileDesc_Road(TileIndex tile, TileDesc *td) if (HasBit(rts, ROADTYPE_TRAM)) tram_owner = GetRoadOwner(tile, ROADTYPE_TRAM); const RailtypeInfo *rti = GetRailTypeInfo(GetRailType(tile)); + td->railtype = rti->strings.name; td->rail_speed = rti->max_speed; break; diff --git a/src/road_func.h b/src/road_func.h index c4af229d53..06be7c4aa0 100644 --- a/src/road_func.h +++ b/src/road_func.h @@ -39,7 +39,7 @@ static inline bool IsValidRoadType(RoadType rt) /** * Whether the given roadtype is valid. - * @param rt the roadtype to check for validness + * @param r the roadtype to check for validness * @return true if and only if valid */ static inline bool IsValidRoadBits(RoadBits r) diff --git a/src/road_gui.cpp b/src/road_gui.cpp index 92c660e8a3..6faa422627 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -64,7 +64,7 @@ static RoadType _cur_roadtype; static DiagDirection _road_depot_orientation; static DiagDirection _road_station_picker_orientation; -void CcPlaySound1D(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2) +void CcPlaySound_SPLAT_OTHER(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2) { if (result.Succeeded() && _settings_client.sound.confirm) SndPlayTileFx(SND_1F_SPLAT_OTHER, tile); } @@ -629,28 +629,32 @@ struct BuildRoadToolbarWindow : Window { DoCommandP(start_tile, end_tile, _place_road_flag | (_cur_roadtype << 3) | (_one_way_button_clicked << 5), _remove_button_clicked ? CMD_REMOVE_LONG_ROAD | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_road) : - CMD_BUILD_LONG_ROAD | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_road), CcPlaySound1D); + CMD_BUILD_LONG_ROAD | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_road), CcPlaySound_SPLAT_OTHER); break; case DDSP_BUILD_BUSSTOP: - PlaceRoadStop(start_tile, end_tile, (_ctrl_pressed << 5) | RoadTypeToRoadTypes(_cur_roadtype) << 2 | ROADSTOP_BUS, CMD_BUILD_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_station[ROADSTOP_BUS])); + case DDSP_REMOVE_BUSSTOP: + if (this->IsWidgetLowered(WID_ROT_BUS_STATION)) { + if (_remove_button_clicked) { + TileArea ta(start_tile, end_tile); + DoCommandP(ta.tile, ta.w | ta.h << 8, (_ctrl_pressed << 1) | ROADSTOP_BUS, CMD_REMOVE_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_station[ROADSTOP_BUS]), CcPlaySound_SPLAT_OTHER); + } else { + PlaceRoadStop(start_tile, end_tile, (_ctrl_pressed << 5) | RoadTypeToRoadTypes(_cur_roadtype) << 2 | ROADSTOP_BUS, CMD_BUILD_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_station[ROADSTOP_BUS])); + } + } break; case DDSP_BUILD_TRUCKSTOP: - PlaceRoadStop(start_tile, end_tile, (_ctrl_pressed << 5) | RoadTypeToRoadTypes(_cur_roadtype) << 2 | ROADSTOP_TRUCK, CMD_BUILD_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_station[ROADSTOP_TRUCK])); + case DDSP_REMOVE_TRUCKSTOP: + if (this->IsWidgetLowered(WID_ROT_TRUCK_STATION)) { + if (_remove_button_clicked) { + TileArea ta(start_tile, end_tile); + DoCommandP(ta.tile, ta.w | ta.h << 8, (_ctrl_pressed << 1) | ROADSTOP_TRUCK, CMD_REMOVE_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_station[ROADSTOP_TRUCK]), CcPlaySound_SPLAT_OTHER); + } else { + PlaceRoadStop(start_tile, end_tile, (_ctrl_pressed << 5) | RoadTypeToRoadTypes(_cur_roadtype) << 2 | ROADSTOP_TRUCK, CMD_BUILD_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_station[ROADSTOP_TRUCK])); + } + } break; - - case DDSP_REMOVE_BUSSTOP: { - TileArea ta(start_tile, end_tile); - DoCommandP(ta.tile, ta.w | ta.h << 8, (_ctrl_pressed << 1) | ROADSTOP_BUS, CMD_REMOVE_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_station[ROADSTOP_BUS]), CcPlaySound1D); - break; - } - - case DDSP_REMOVE_TRUCKSTOP: { - TileArea ta(start_tile, end_tile); - DoCommandP(ta.tile, ta.w | ta.h << 8, (_ctrl_pressed << 1) | ROADSTOP_TRUCK, CMD_REMOVE_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_station[ROADSTOP_TRUCK]), CcPlaySound1D); - break; - } } } } @@ -956,15 +960,11 @@ struct BuildRoadStationWindow : public PickerWindowBase { if (_cur_roadtype == ROADTYPE_TRAM && _road_station_picker_orientation < DIAGDIR_END) { _road_station_picker_orientation = DIAGDIR_END; } - this->SetWidgetsDisabledState(_cur_roadtype == ROADTYPE_TRAM, - WID_BROS_STATION_NE, - WID_BROS_STATION_SE, - WID_BROS_STATION_SW, - WID_BROS_STATION_NW, - WIDGET_LIST_END); this->GetWidget(WID_BROS_CAPTION)->widget_data = _road_type_infos[_cur_roadtype].picker_title[rs]; - for (uint i = WID_BROS_STATION_NE; i < WID_BROS_LT_OFF; i++) this->GetWidget(i)->tool_tip = _road_type_infos[_cur_roadtype].picker_tooltip[rs]; + for (uint i = (_cur_roadtype == ROADTYPE_TRAM ? WID_BROS_STATION_X : WID_BROS_STATION_NE); i < WID_BROS_LT_OFF; i++) { + this->GetWidget(i)->tool_tip = _road_type_infos[_cur_roadtype].picker_tooltip[rs]; + } this->LowerWidget(_road_station_picker_orientation + WID_BROS_STATION_NE); this->LowerWidget(_settings_client.gui.station_show_coverage + WID_BROS_LT_OFF); @@ -1002,7 +1002,7 @@ struct BuildRoadStationWindow : public PickerWindowBase { * Never make the window smaller to avoid oscillating if the size change affects the acceptance. * (This is the case, if making the window bigger moves the mouse into the window.) */ if (top > bottom) { - ResizeWindow(this, 0, top - bottom); + ResizeWindow(this, 0, top - bottom, false); } } @@ -1060,7 +1060,7 @@ struct BuildRoadStationWindow : public PickerWindowBase { }; /** Widget definition of the build road station window */ -static const NWidgetPart _nested_rv_station_picker_widgets[] = { +static const NWidgetPart _nested_road_station_picker_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_BROS_CAPTION), @@ -1069,17 +1069,17 @@ static const NWidgetPart _nested_rv_station_picker_widgets[] = { NWidget(NWID_SPACER), SetMinimalSize(0, 3), NWidget(NWID_HORIZONTAL), SetPIP(0, 2, 0), NWidget(NWID_SPACER), SetFill(1, 0), - NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_NW), SetMinimalSize(66, 50), EndContainer(), - NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_NE), SetMinimalSize(66, 50), EndContainer(), - NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_X), SetMinimalSize(66, 50), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_NW), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_NE), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_X), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), NWidget(NWID_SPACER), SetFill(1, 0), EndContainer(), NWidget(NWID_SPACER), SetMinimalSize(0, 2), NWidget(NWID_HORIZONTAL), SetPIP(0, 2, 0), NWidget(NWID_SPACER), SetFill(1, 0), - NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_SW), SetMinimalSize(66, 50), EndContainer(), - NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_SE), SetMinimalSize(66, 50), EndContainer(), - NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_Y), SetMinimalSize(66, 50), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_SW), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_SE), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_Y), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), NWidget(NWID_SPACER), SetFill(1, 0), EndContainer(), NWidget(NWID_SPACER), SetMinimalSize(0, 1), @@ -1099,16 +1099,54 @@ static const NWidgetPart _nested_rv_station_picker_widgets[] = { EndContainer(), }; -static WindowDesc _rv_station_picker_desc( +static WindowDesc _road_station_picker_desc( WDP_AUTO, NULL, 0, 0, WC_BUS_STATION, WC_BUILD_TOOLBAR, WDF_CONSTRUCTION, - _nested_rv_station_picker_widgets, lengthof(_nested_rv_station_picker_widgets) + _nested_road_station_picker_widgets, lengthof(_nested_road_station_picker_widgets) +); + +/** Widget definition of the build tram station window */ +static const NWidgetPart _nested_tram_station_picker_widgets[] = { + NWidget(NWID_HORIZONTAL), + NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), + NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_BROS_CAPTION), + EndContainer(), + NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BROS_BACKGROUND), + NWidget(NWID_SPACER), SetMinimalSize(0, 3), + NWidget(NWID_HORIZONTAL), SetPIP(0, 2, 0), + NWidget(NWID_SPACER), SetFill(1, 0), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_X), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_BROS_STATION_Y), SetMinimalSize(66, 50), SetFill(0, 0), EndContainer(), + NWidget(NWID_SPACER), SetFill(1, 0), + EndContainer(), + NWidget(NWID_SPACER), SetMinimalSize(0, 1), + NWidget(NWID_HORIZONTAL), SetPIP(2, 0, 2), + NWidget(WWT_LABEL, COLOUR_DARK_GREEN, WID_BROS_INFO), SetMinimalSize(140, 14), SetDataTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE, STR_NULL), + NWidget(NWID_SPACER), SetFill(1, 0), + EndContainer(), + NWidget(NWID_HORIZONTAL), SetPIP(2, 0, 2), + NWidget(NWID_SPACER), SetFill(1, 0), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BROS_LT_OFF), SetMinimalSize(60, 12), + SetDataTip(STR_STATION_BUILD_COVERAGE_OFF, STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BROS_LT_ON), SetMinimalSize(60, 12), + SetDataTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP), + NWidget(NWID_SPACER), SetFill(1, 0), + EndContainer(), + NWidget(NWID_SPACER), SetMinimalSize(0, 10), SetResize(0, 1), + EndContainer(), +}; + +static WindowDesc _tram_station_picker_desc( + WDP_AUTO, NULL, 0, 0, + WC_BUS_STATION, WC_BUILD_TOOLBAR, + WDF_CONSTRUCTION, + _nested_tram_station_picker_widgets, lengthof(_nested_tram_station_picker_widgets) ); static void ShowRVStationPicker(Window *parent, RoadStopType rs) { - new BuildRoadStationWindow(&_rv_station_picker_desc, parent, rs); + new BuildRoadStationWindow(_cur_roadtype == ROADTYPE_ROAD ? &_road_station_picker_desc : &_tram_station_picker_desc, parent, rs); } void InitializeRoadGui() diff --git a/src/road_internal.h b/src/road_internal.h index c8cae84224..8da909e94a 100644 --- a/src/road_internal.h +++ b/src/road_internal.h @@ -19,6 +19,6 @@ RoadBits CleanUpRoadBits(const TileIndex tile, RoadBits org_rb); CommandCost CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, RoadType rt, DoCommandFlag flags, bool town_check = true); -void DrawTramCatenary(const TileInfo *ti, RoadBits tram); +void DrawRoadCatenary(const TileInfo *ti, RoadBits tram); #endif /* ROAD_INTERNAL_H */ diff --git a/src/road_map.h b/src/road_map.h index 693730294e..49526d37f2 100644 --- a/src/road_map.h +++ b/src/road_map.h @@ -449,6 +449,7 @@ enum Roadside { ROADSIDE_GRASS = 1, ///< Road on grass ROADSIDE_PAVED = 2, ///< Road with paved sidewalks ROADSIDE_STREET_LIGHTS = 3, ///< Road with street lights on paved sidewalks + // 4 is unused for historical reasons ROADSIDE_TREES = 5, ///< Road with trees on paved sidewalks ROADSIDE_GRASS_ROAD_WORKS = 6, ///< Road on grass with road works ROADSIDE_PAVED_ROAD_WORKS = 7, ///< Road with sidewalks and road works @@ -579,11 +580,12 @@ static inline void MakeRoadCrossing(TileIndex t, Owner road, Owner tram, Owner r SetTileType(t, MP_ROAD); SetTileOwner(t, rail); _m[t].m2 = town; - _m[t].m3 = rat; + _m[t].m3 = 0; _m[t].m4 = 0; _m[t].m5 = ROAD_TILE_CROSSING << 6 | roaddir; SB(_me[t].m6, 2, 4, 0); _me[t].m7 = rot << 6 | road; + _me[t].m8 = rat; SetRoadOwner(t, ROADTYPE_TRAM, tram); } diff --git a/src/roadveh.h b/src/roadveh.h index 5b265f0470..ca069b7acf 100644 --- a/src/roadveh.h +++ b/src/roadveh.h @@ -105,10 +105,10 @@ struct RoadVehicle FINAL : public GroundVehicle { friend struct GroundVehicle; // GroundVehicle needs to use the acceleration functions defined at RoadVehicle. void MarkDirty(); - void UpdateDeltaXY(Direction direction); + void UpdateDeltaXY(); ExpensesType GetExpenseType(bool income) const { return income ? EXPENSES_ROADVEH_INC : EXPENSES_ROADVEH_RUN; } bool IsPrimaryVehicle() const { return this->IsFrontEngine(); } - SpriteID GetImage(Direction direction, EngineImageType image_type) const; + void GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const; int GetDisplaySpeed() const { return this->gcache.last_speed / 2; } int GetDisplayMaxSpeed() const { return this->vcache.cached_max_speed / 2; } Money GetRunningCost() const; diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp index 35c671d355..207a3f23b2 100644 --- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -35,6 +35,7 @@ #include "core/backup_type.hpp" #include "newgrf.h" #include "zoom_func.h" +#include "framerate_type.h" #include "table/strings.h" @@ -69,24 +70,10 @@ bool IsValidImageIndex(uint8 image_index) return image_index < lengthof(_roadveh_images); } -/** 'Convert' the DiagDirection where a road vehicle enters to the trackdirs it can drive onto */ -static const TrackdirBits _road_enter_dir_to_reachable_trackdirs[DIAGDIR_END] = { - TRACKDIR_BIT_LEFT_N | TRACKDIR_BIT_LOWER_E | TRACKDIR_BIT_X_NE, // Enter from north east - TRACKDIR_BIT_LEFT_S | TRACKDIR_BIT_UPPER_E | TRACKDIR_BIT_Y_SE, // Enter from south east - TRACKDIR_BIT_UPPER_W | TRACKDIR_BIT_X_SW | TRACKDIR_BIT_RIGHT_S, // Enter from south west - TRACKDIR_BIT_RIGHT_N | TRACKDIR_BIT_LOWER_W | TRACKDIR_BIT_Y_NW // Enter from north west -}; - static const Trackdir _road_reverse_table[DIAGDIR_END] = { TRACKDIR_RVREV_NE, TRACKDIR_RVREV_SE, TRACKDIR_RVREV_SW, TRACKDIR_RVREV_NW }; -/** Converts the exit direction of a depot to trackdir the vehicle is going to drive to */ -static const Trackdir _roadveh_depot_exit_trackdir[DIAGDIR_END] = { - TRACKDIR_X_NE, TRACKDIR_Y_SE, TRACKDIR_X_SW, TRACKDIR_Y_NW -}; - - /** * Check whether a roadvehicle is a bus * @return true if bus @@ -113,40 +100,39 @@ int RoadVehicle::GetDisplayImageWidth(Point *offset) const return ScaleGUITrad(this->gcache.cached_veh_length * reference_width / VEHICLE_LENGTH); } -static SpriteID GetRoadVehIcon(EngineID engine, EngineImageType image_type) +static void GetRoadVehIcon(EngineID engine, EngineImageType image_type, VehicleSpriteSeq *result) { const Engine *e = Engine::Get(engine); uint8 spritenum = e->u.road.image_index; if (is_custom_sprite(spritenum)) { - SpriteID sprite = GetCustomVehicleIcon(engine, DIR_W, image_type); - if (sprite != 0) return sprite; + GetCustomVehicleIcon(engine, DIR_W, image_type, result); + if (result->IsValid()) return; spritenum = e->original_image_index; } assert(IsValidImageIndex(spritenum)); - return DIR_W + _roadveh_images[spritenum]; + result->Set(DIR_W + _roadveh_images[spritenum]); } -SpriteID RoadVehicle::GetImage(Direction direction, EngineImageType image_type) const +void RoadVehicle::GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const { uint8 spritenum = this->spritenum; - SpriteID sprite; if (is_custom_sprite(spritenum)) { - sprite = GetCustomVehicleSprite(this, (Direction)(direction + 4 * IS_CUSTOM_SECONDHEAD_SPRITE(spritenum)), image_type); - if (sprite != 0) return sprite; + GetCustomVehicleSprite(this, (Direction)(direction + 4 * IS_CUSTOM_SECONDHEAD_SPRITE(spritenum)), image_type, result); + if (result->IsValid()) return; spritenum = this->GetEngine()->original_image_index; } assert(IsValidImageIndex(spritenum)); - sprite = direction + _roadveh_images[spritenum]; + SpriteID sprite = direction + _roadveh_images[spritenum]; if (this->cargo.StoredCount() >= this->cargo_cap / 2U) sprite += _roadveh_full_adder[spritenum]; - return sprite; + result->Set(sprite); } /** @@ -160,12 +146,16 @@ SpriteID RoadVehicle::GetImage(Direction direction, EngineImageType image_type) */ void DrawRoadVehEngine(int left, int right, int preferred_x, int y, EngineID engine, PaletteID pal, EngineImageType image_type) { - SpriteID sprite = GetRoadVehIcon(engine, image_type); - const Sprite *real_sprite = GetSprite(sprite, ST_NORMAL); + VehicleSpriteSeq seq; + GetRoadVehIcon(engine, image_type, &seq); + + Rect rect; + seq.GetBounds(&rect); preferred_x = Clamp(preferred_x, - left - UnScaleGUI(real_sprite->x_offs), - right - UnScaleGUI(real_sprite->width) - UnScaleGUI(real_sprite->x_offs)); - DrawSprite(sprite, pal, preferred_x, y); + left - UnScaleGUI(rect.left), + right - UnScaleGUI(rect.right)); + + seq.Draw(preferred_x, y, pal, pal == PALETTE_CRASH); } /** @@ -179,12 +169,16 @@ void DrawRoadVehEngine(int left, int right, int preferred_x, int y, EngineID eng */ void GetRoadVehSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, int &yoffs, EngineImageType image_type) { - const Sprite *spr = GetSprite(GetRoadVehIcon(engine, image_type), ST_NORMAL); + VehicleSpriteSeq seq; + GetRoadVehIcon(engine, image_type, &seq); - width = UnScaleGUI(spr->width); - height = UnScaleGUI(spr->height); - xoffs = UnScaleGUI(spr->x_offs); - yoffs = UnScaleGUI(spr->y_offs); + Rect rect; + seq.GetBounds(&rect); + + width = UnScaleGUI(rect.right - rect.left + 1); + height = UnScaleGUI(rect.bottom - rect.top + 1); + xoffs = UnScaleGUI(rect.left); + yoffs = UnScaleGUI(rect.top); } /** @@ -261,7 +255,7 @@ void RoadVehUpdateCache(RoadVehicle *v, bool same_length) * @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 CmdBuildRoadVehicle(TileIndex tile, DoCommandFlag flags, const Engine *e, uint16 data, Vehicle **ret) @@ -306,7 +300,7 @@ CommandCost CmdBuildRoadVehicle(TileIndex tile, DoCommandFlag flags, const Engin v->date_of_last_service = _date; v->build_year = _cur_year; - v->cur_image = SPR_IMG_QUERY; + v->sprite_seq.Set(SPR_IMG_QUERY); v->random_bits = VehicleRandomBits(); v->SetFrontEngine(); @@ -410,7 +404,7 @@ void RoadVehicle::MarkDirty() this->CargoChanged(); } -void RoadVehicle::UpdateDeltaXY(Direction direction) +void RoadVehicle::UpdateDeltaXY() { static const int8 _delta_xy_table[8][10] = { /* y_extent, x_extent, y_offs, x_offs, y_bb_offs, x_bb_offs, y_extent_shorten, x_extent_shorten, y_bb_offs_shorten, x_bb_offs_shorten */ @@ -425,9 +419,9 @@ void RoadVehicle::UpdateDeltaXY(Direction direction) }; int shorten = VEHICLE_LENGTH - this->gcache.cached_veh_length; - if (!IsDiagonalDirection(direction)) shorten >>= 1; + if (!IsDiagonalDirection(this->direction)) shorten >>= 1; - const int8 *bb = _delta_xy_table[direction]; + const int8 *bb = _delta_xy_table[this->direction]; this->x_bb_offs = bb[5] + bb[9] * shorten; this->y_bb_offs = bb[4] + bb[8] * shorten;; this->x_offs = bb[3]; @@ -928,7 +922,7 @@ static Trackdir RoadFindPathToDest(RoadVehicle *v, TileIndex tile, DiagDirection */ /* Remove tracks unreachable from the enter dir */ - trackdirs &= _road_enter_dir_to_reachable_trackdirs[enterdir]; + trackdirs &= DiagdirReachesTrackdirs(enterdir); if (trackdirs == TRACKDIR_BIT_NONE) { /* No reachable tracks, so we'll reverse */ return_track(_road_reverse_table[enterdir]); @@ -994,7 +988,7 @@ static bool RoadVehLeaveDepot(RoadVehicle *v, bool first) DiagDirection dir = GetRoadDepotDirection(v->tile); v->direction = DiagDirToDir(dir); - Trackdir tdir = _roadveh_depot_exit_trackdir[dir]; + Trackdir tdir = DiagDirToDiagTrackdir(dir); const RoadDriveEntry *rdp = _road_drive_data[v->roadtype][(_settings_game.vehicle.road_side << RVS_DRIVE_SIDE) + tdir]; int x = TileX(v->tile) * TILE_SIZE + (rdp[RVC_DEPOT_START_FRAME].x & 0xF); @@ -1456,7 +1450,7 @@ again: /* Vehicle has arrived at a bay in a road stop */ if (IsDriveThroughStopTile(v->tile)) { - TileIndex next_tile = TILE_ADD(v->tile, TileOffsByDir(v->direction)); + TileIndex next_tile = TileAddByDir(v->tile, v->direction); /* Check if next inline bay is free and has compatible road. */ if (RoadStop::IsDriveThroughRoadStopContinuation(v->tile, next_tile) && (GetRoadTypes(next_tile) & v->compatible_roadtypes) != 0) { @@ -1594,6 +1588,8 @@ Money RoadVehicle::GetRunningCost() const bool RoadVehicle::Tick() { + PerformanceAccumulator framerate(PFE_GL_ROADVEHS); + this->tick_counter++; if (this->IsFrontEngine()) { diff --git a/src/roadveh_gui.cpp b/src/roadveh_gui.cpp index 46ff6cea78..63e0549582 100644 --- a/src/roadveh_gui.cpp +++ b/src/roadveh_gui.cpp @@ -149,7 +149,9 @@ void DrawRoadVehImage(const Vehicle *v, int left, int right, int y, VehicleID se if (rtl ? px + width > 0 : px - width < max_width) { PaletteID pal = (u->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(u); - DrawSprite(u->GetImage(dir, image_type), pal, px + (rtl ? -offset.x : offset.x), ScaleGUITrad(6) + offset.y); + VehicleSpriteSeq seq; + u->GetImage(dir, image_type, &seq); + seq.Draw(px + (rtl ? -offset.x : offset.x), ScaleGUITrad(6) + offset.y, pal, (u->vehstatus & VS_CRASHED) != 0); } px += rtl ? -width : width; diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 9690481154..58141d89dd 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -154,7 +154,7 @@ static void ConvertTownOwner() if (GB(_m[tile].m5, 4, 2) == ROAD_TILE_CROSSING && HasBit(_m[tile].m3, 7)) { _m[tile].m3 = OWNER_TOWN; } - /* FALL THROUGH */ + FALLTHROUGH; case MP_TUNNELBRIDGE: if (_m[tile].m1 & 0x80) SetTileOwner(tile, OWNER_TOWN); @@ -248,7 +248,7 @@ static void InitializeWindowsAndCaches() /* For each company, verify (while loading a scenario) that the inauguration date is the current year and set it * accordingly if it is not the case. No need to set it on companies that are not been used already, * thus the MIN_YEAR (which is really nothing more than Zero, initialized value) test */ - if (_file_to_saveload.filetype == FT_SCENARIO && c->inaugurated_year != MIN_YEAR) { + if (_file_to_saveload.abstract_ftype == FT_SCENARIO && c->inaugurated_year != MIN_YEAR) { c->inaugurated_year = _cur_year; } } @@ -718,12 +718,14 @@ bool AfterLoadGame() if (IsSavegameVersionBefore(95)) _settings_game.vehicle.dynamic_engines = 0; if (IsSavegameVersionBefore(96)) _settings_game.economy.station_noise_level = false; if (IsSavegameVersionBefore(133)) { - _settings_game.vehicle.roadveh_acceleration_model = 0; _settings_game.vehicle.train_slope_steepness = 3; } if (IsSavegameVersionBefore(134)) _settings_game.economy.feeder_payment_share = 75; if (IsSavegameVersionBefore(138)) _settings_game.vehicle.plane_crashes = 2; - if (IsSavegameVersionBefore(139)) _settings_game.vehicle.roadveh_slope_steepness = 7; + if (IsSavegameVersionBefore(139)) { + _settings_game.vehicle.roadveh_acceleration_model = 0; + _settings_game.vehicle.roadveh_slope_steepness = 7; + } if (IsSavegameVersionBefore(143)) _settings_game.economy.allow_town_level_crossings = true; if (IsSavegameVersionBefore(159)) { _settings_game.vehicle.max_train_length = 50; @@ -1212,6 +1214,38 @@ bool AfterLoadGame() } } + /* Railtype moved from m3 to m8 in version 200. */ + if (IsSavegameVersionBefore(200)) { + for (TileIndex t = 0; t < map_size; t++) { + switch (GetTileType(t)) { + case MP_RAILWAY: + SetRailType(t, (RailType)GB(_m[t].m3, 0, 4)); + break; + + case MP_ROAD: + if (IsLevelCrossing(t)) { + SetRailType(t, (RailType)GB(_m[t].m3, 0, 4)); + } + break; + + case MP_STATION: + if (HasStationRail(t)) { + SetRailType(t, (RailType)GB(_m[t].m3, 0, 4)); + } + break; + + case MP_TUNNELBRIDGE: + if (GetTunnelBridgeTransportType(t) == TRANSPORT_RAIL) { + SetRailType(t, (RailType)GB(_m[t].m3, 0, 4)); + } + break; + + default: + break; + } + } + } + /* Elrails got added in rev 24 */ if (IsSavegameVersionBefore(24)) { RailType min_rail = RAILTYPE_ELECTRIC; @@ -2155,22 +2189,21 @@ bool AfterLoadGame() /* Animated tiles would sometimes not be actually animated or * in case of old savegames duplicate. */ - extern TileIndex *_animated_tile_list; - extern uint _animated_tile_count; + extern SmallVector _animated_tiles; - for (uint i = 0; i < _animated_tile_count; /* Nothing */) { + for (TileIndex *tile = _animated_tiles.Begin(); tile < _animated_tiles.End(); /* Nothing */) { /* Remove if tile is not animated */ - bool remove = _tile_type_procs[GetTileType(_animated_tile_list[i])]->animate_tile_proc == NULL; + bool remove = _tile_type_procs[GetTileType(*tile)]->animate_tile_proc == NULL; /* and remove if duplicate */ - for (uint j = 0; !remove && j < i; j++) { - remove = _animated_tile_list[i] == _animated_tile_list[j]; + for (TileIndex *j = _animated_tiles.Begin(); !remove && j < tile; j++) { + remove = *tile == *j; } if (remove) { - DeleteAnimatedTile(_animated_tile_list[i]); + DeleteAnimatedTile(*tile); } else { - i++; + tile++; } } } @@ -2968,6 +3001,59 @@ bool AfterLoadGame() #endif } + if (IsSavegameVersionBefore(198)) { + /* Convert towns growth_rate and grow_counter to ticks */ + Town *t; + FOR_ALL_TOWNS(t) { + /* 0x8000 = TOWN_GROWTH_RATE_CUSTOM previously */ + if (t->growth_rate & 0x8000) SetBit(t->flags, TOWN_CUSTOM_GROWTH); + if (t->growth_rate != TOWN_GROWTH_RATE_NONE) { + t->growth_rate = TownTicksToGameTicks(t->growth_rate & ~0x8000); + } + /* Add t->index % TOWN_GROWTH_TICKS to spread growth across ticks. */ + t->grow_counter = TownTicksToGameTicks(t->grow_counter) + t->index % TOWN_GROWTH_TICKS; + } + } + + if (IsSavegameVersionBefore(202)) { + /* Make sure added industry cargo slots are cleared */ + Industry *i; + FOR_ALL_INDUSTRIES(i) { + for (size_t ci = 2; ci < lengthof(i->produced_cargo); ci++) { + i->produced_cargo[ci] = CT_INVALID; + i->produced_cargo_waiting[ci] = 0; + i->production_rate[ci] = 0; + i->last_month_production[ci] = 0; + i->last_month_transported[ci] = 0; + i->last_month_pct_transported[ci] = 0; + i->this_month_production[ci] = 0; + i->this_month_transported[ci] = 0; + } + for (size_t ci = 3; ci < lengthof(i->accepts_cargo); ci++) { + i->accepts_cargo[ci] = CT_INVALID; + i->incoming_cargo_waiting[ci] = 0; + } + /* Make sure last_cargo_accepted_at is copied to elements for every valid input cargo. + * The loading routine should put the original singular value into the first array element. */ + for (size_t ci = 0; ci < lengthof(i->accepts_cargo); ci++) { + if (i->accepts_cargo[ci] != CT_INVALID) { + i->last_cargo_accepted_at[ci] = i->last_cargo_accepted_at[0]; + } else { + i->last_cargo_accepted_at[ci] = 0; + } + } + } + } + + if (SlXvIsFeaturePresent(XSLFI_MORE_COND_ORDERS, 1, 1)) { + Order *order; + FOR_ALL_ORDERS(order) { + // Insertion of OCV_MAX_RELIABILITY between OCV_REMAINING_LIFETIME and OCV_CARGO_WAITING + if (order->IsType(OT_CONDITIONAL) && order->GetConditionVariable() > OCV_REMAINING_LIFETIME) { + order->SetConditionVariable(static_cast((uint)order->GetConditionVariable() + 1)); + } + } + } /* Station acceptance is some kind of cache */ if (IsSavegameVersionBefore(127)) { diff --git a/src/saveload/animated_tile_sl.cpp b/src/saveload/animated_tile_sl.cpp index 3fc5f61753..2152c42e34 100644 --- a/src/saveload/animated_tile_sl.cpp +++ b/src/saveload/animated_tile_sl.cpp @@ -12,22 +12,21 @@ #include "../stdafx.h" #include "../tile_type.h" #include "../core/alloc_func.hpp" +#include "../core/smallvec_type.hpp" #include "saveload.h" #include "../safeguards.h" -extern TileIndex *_animated_tile_list; -extern uint _animated_tile_count; -extern uint _animated_tile_allocated; +extern SmallVector _animated_tiles; /** * Save the ANIT chunk. */ static void Save_ANIT() { - SlSetLength(_animated_tile_count * sizeof(*_animated_tile_list)); - SlArray(_animated_tile_list, _animated_tile_count, SLE_UINT32); + SlSetLength(_animated_tiles.Length() * sizeof(*_animated_tiles.Begin())); + SlArray(_animated_tiles.Begin(), _animated_tiles.Length(), SLE_UINT32); } /** @@ -38,22 +37,20 @@ static void Load_ANIT() /* Before version 80 we did NOT have a variable length animated tile table */ if (IsSavegameVersionBefore(80)) { /* In pre version 6, we has 16bit per tile, now we have 32bit per tile, convert it ;) */ - SlArray(_animated_tile_list, 256, IsSavegameVersionBefore(6) ? (SLE_FILE_U16 | SLE_VAR_U32) : SLE_UINT32); + TileIndex anim_list[256]; + SlArray(anim_list, 256, IsSavegameVersionBefore(6) ? (SLE_FILE_U16 | SLE_VAR_U32) : SLE_UINT32); - for (_animated_tile_count = 0; _animated_tile_count < 256; _animated_tile_count++) { - if (_animated_tile_list[_animated_tile_count] == 0) break; + for (int i = 0; i < 256; i++) { + if (anim_list[i] == 0) break; + *_animated_tiles.Append() = anim_list[i]; } return; } - _animated_tile_count = (uint)SlGetFieldLength() / sizeof(*_animated_tile_list); - - /* Determine a nice rounded size for the amount of allocated tiles */ - _animated_tile_allocated = 256; - while (_animated_tile_allocated < _animated_tile_count) _animated_tile_allocated *= 2; - - _animated_tile_list = ReallocT(_animated_tile_list, _animated_tile_allocated); - SlArray(_animated_tile_list, _animated_tile_count, SLE_UINT32); + uint count = (uint)SlGetFieldLength() / sizeof(*_animated_tiles.Begin()); + _animated_tiles.Clear(); + _animated_tiles.Append(count); + SlArray(_animated_tiles.Begin(), count, SLE_UINT32); } /** diff --git a/src/saveload/company_sl.cpp b/src/saveload/company_sl.cpp index 6ac22c2685..edc2c4f7ee 100644 --- a/src/saveload/company_sl.cpp +++ b/src/saveload/company_sl.cpp @@ -16,6 +16,8 @@ #include "../tunnelbridge_map.h" #include "../tunnelbridge.h" #include "../station_base.h" +#include "../strings_func.h" +#include "../settings_func.h" #include "saveload.h" @@ -184,7 +186,7 @@ void AfterLoadCompanyStats() } } } - /* FALL THROUGH */ + FALLTHROUGH; case MP_OBJECT: if (GetWaterClass(tile) == WATER_CLASS_CANAL) { @@ -243,7 +245,7 @@ static const SaveLoad _company_desc[] = { SLE_VAR(CompanyProperties, name_1, SLE_STRINGID), SLE_CONDSTR(CompanyProperties, name, SLE_STR | SLF_ALLOW_CONTROL, 0, 84, SL_MAX_VERSION), - SLE_VAR(CompanyProperties, president_name_1, SLE_UINT16), + SLE_VAR(CompanyProperties, president_name_1, SLE_STRINGID), SLE_VAR(CompanyProperties, president_name_2, SLE_UINT32), SLE_CONDSTR(CompanyProperties, president_name, SLE_STR | SLF_ALLOW_CONTROL, 0, 84, SL_MAX_VERSION), @@ -258,7 +260,7 @@ static const SaveLoad _company_desc[] = { SLE_VAR(CompanyProperties, colour, SLE_UINT8), SLE_VAR(CompanyProperties, money_fraction, SLE_UINT8), - SLE_CONDVAR(CompanyProperties, avail_railtypes, SLE_VAR_I32 | SLE_FILE_I8, 0, 57), + SLE_CONDNULL(1, 0, 57), ///< avail_railtypes SLE_VAR(CompanyProperties, block_preview, SLE_UINT8), SLE_CONDNULL(2, 0, 93), ///< cargo_types @@ -349,7 +351,8 @@ static const SaveLoad _company_economy_desc[] = { SLE_CONDVAR(CompanyEconomyEntry, company_value, SLE_INT64, 2, SL_MAX_VERSION), SLE_CONDVAR(CompanyEconomyEntry, delivered_cargo[NUM_CARGO - 1], SLE_INT32, 0, 169), - SLE_CONDARR(CompanyEconomyEntry, delivered_cargo, SLE_UINT32, NUM_CARGO, 170, SL_MAX_VERSION), + SLE_CONDARR(CompanyEconomyEntry, delivered_cargo, SLE_UINT32, 32, 170, 198), + SLE_CONDARR(CompanyEconomyEntry, delivered_cargo, SLE_UINT32, NUM_CARGO, 199, SL_MAX_VERSION), SLE_VAR(CompanyEconomyEntry, performance_history, SLE_INT32), SLE_END() @@ -486,6 +489,7 @@ static void Load_PLYR() int index; while ((index = SlIterateArray()) != -1) { Company *c = new (index) Company(); + SetDefaultCompanySettings(c->index); SaveLoad_PLYR(c); _company_colours[index] = (Colours)c->colour; } @@ -496,16 +500,15 @@ static void Check_PLYR() int index; while ((index = SlIterateArray()) != -1) { CompanyProperties *cprops = new CompanyProperties(); - memset(cprops, 0, sizeof(*cprops)); SaveLoad_PLYR_common(NULL, cprops); /* We do not load old custom names */ if (IsSavegameVersionBefore(84)) { - if (GB(cprops->name_1, 11, 5) == 15) { + if (GetStringTab(cprops->name_1) == TEXT_TAB_OLD_CUSTOM) { cprops->name_1 = STR_GAME_SAVELOAD_NOT_AVAILABLE; } - if (GB(cprops->president_name_1, 11, 5) == 15) { + if (GetStringTab(cprops->president_name_1) == TEXT_TAB_OLD_CUSTOM) { cprops->president_name_1 = STR_GAME_SAVELOAD_NOT_AVAILABLE; } } @@ -529,7 +532,25 @@ static void Ptrs_PLYR() } } +extern void LoadSettingsPlyx(bool skip); +extern void SaveSettingsPlyx(); + +static void Load_PLYX() +{ + LoadSettingsPlyx(false); +} + +static void Check_PLYX() +{ + LoadSettingsPlyx(true); +} + +static void Save_PLYX() +{ + SaveSettingsPlyx(); +} extern const ChunkHandler _company_chunk_handlers[] = { - { 'PLYR', Save_PLYR, Load_PLYR, Ptrs_PLYR, Check_PLYR, CH_ARRAY | CH_LAST}, + { 'PLYR', Save_PLYR, Load_PLYR, Ptrs_PLYR, Check_PLYR, CH_ARRAY }, + { 'PLYX', Save_PLYX, Load_PLYX, NULL, Check_PLYX, CH_RIFF | CH_LAST}, }; diff --git a/src/saveload/economy_sl.cpp b/src/saveload/economy_sl.cpp index dabf120fca..d1235f0d36 100644 --- a/src/saveload/economy_sl.cpp +++ b/src/saveload/economy_sl.cpp @@ -29,7 +29,7 @@ static void Load_PRIC() /** Cargo payment rates in pre 126 savegames */ static void Load_CAPR() { - uint num_cargo = IsSavegameVersionBefore(55) ? 12 : NUM_CARGO; + uint num_cargo = IsSavegameVersionBefore(55) ? 12 : IsSavegameVersionBefore(199) ? 32 : NUM_CARGO; int vt = IsSavegameVersionBefore(65) ? SLE_FILE_I32 : SLE_FILE_I64; SlArray(NULL, num_cargo, vt | SLE_VAR_NULL); SlArray(NULL, num_cargo, SLE_FILE_U16 | SLE_VAR_NULL); @@ -102,7 +102,7 @@ static void Ptrs_CAPY() extern const ChunkHandler _economy_chunk_handlers[] = { { 'CAPY', Save_CAPY, Load_CAPY, Ptrs_CAPY, NULL, CH_ARRAY}, - { 'PRIC', NULL, Load_PRIC, NULL, NULL, CH_RIFF | CH_AUTO_LENGTH}, - { 'CAPR', NULL, Load_CAPR, NULL, NULL, CH_RIFF | CH_AUTO_LENGTH}, + { 'PRIC', NULL, Load_PRIC, NULL, NULL, CH_RIFF }, + { 'CAPR', NULL, Load_CAPR, NULL, NULL, CH_RIFF }, { 'ECMY', Save_ECMY, Load_ECMY, NULL, NULL, CH_RIFF | CH_LAST}, }; diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index 3777891d8f..1659127e2a 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -45,7 +45,7 @@ std::vector _sl_xv_discardable_chunk_ids; ///< list of chunks static const uint32 _sl_xv_slxi_chunk_version = 0; ///< current version os SLXI chunk const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { - { XSLFI_MORE_COND_ORDERS, XSCF_NULL, 1, 1, "more_cond_orders", NULL, NULL, NULL }, + { XSLFI_MORE_COND_ORDERS, XSCF_NULL, 2, 2, "more_cond_orders", NULL, NULL, NULL }, { XSLFI_NULL, XSCF_NULL, 0, 0, NULL, NULL, NULL, NULL },// This is the end marker }; @@ -61,6 +61,8 @@ bool SlXvFeatureTest::IsFeaturePresent(uint16 savegame_version, uint16 savegame_ { bool savegame_version_ok = savegame_version >= savegame_version_from && savegame_version <= savegame_version_to; + if (this->functor) return (*this->functor)(savegame_version, savegame_version_ok); + if (this->feature == XSLFI_NULL) return savegame_version_ok; bool feature_ok = SlXvIsFeaturePresent(this->feature, this->min_version, this->max_version); @@ -87,6 +89,20 @@ bool SlXvIsFeaturePresent(SlXvFeatureIndex feature, uint16 min_version, uint16 m return _sl_xv_feature_versions[feature] >= min_version && _sl_xv_feature_versions[feature] <= max_version; } +/** + * Returns true if @p feature is present and has a version inclusively bounded by @p min_version and @p max_version + */ +const char *SlXvGetFeatureName(SlXvFeatureIndex feature) +{ + const SlxiSubChunkInfo *info = _sl_xv_sub_chunk_infos; + for (; info->index != XSLFI_NULL; ++info) { + if (info->index == feature) { + return info->name; + } + } + return "(unknown feature)"; +} + /** * Resets all extended feature versions to 0 */ @@ -94,6 +110,7 @@ void SlXvResetState() { _sl_is_ext_version = false; _sl_is_faked_ext = false; + _sl_xv_discardable_chunk_ids.clear(); memset(_sl_xv_feature_versions, 0, sizeof(_sl_xv_feature_versions)); } @@ -116,9 +133,7 @@ void SlXvSetCurrentState() */ void SlXvCheckSpecialSavegameVersions() { - extern uint16 _sl_version; - - // TODO: check for savegame versions + // Checks for special savegame versions go here } /** @@ -165,7 +180,6 @@ static void Save_SLXI() SlXvSetCurrentState(); static const SaveLoad _xlsi_sub_chunk_desc[] = { - SLE_VAR(SlxiSubChunkInfo, save_version, SLE_UINT16), SLE_STR(SlxiSubChunkInfo, name, SLE_STR, 0), SLE_END() }; @@ -179,9 +193,9 @@ static void Save_SLXI() chunk_counts.resize(XSLFI_SIZE); const SlxiSubChunkInfo *info = _sl_xv_sub_chunk_infos; for (; info->index != XSLFI_NULL; ++info) { - if (info->save_version > 0) { + if (_sl_xv_feature_versions[info->index] > 0) { item_count++; - length += 4; + length += 6; length += SlCalcObjLength(info, _xlsi_sub_chunk_desc); if (info->save_proc) { uint32 extra_data_length = info->save_proc(info, true); @@ -209,7 +223,8 @@ static void Save_SLXI() // write data info = _sl_xv_sub_chunk_infos; for (; info->index != XSLFI_NULL; ++info) { - if (info->save_version > 0) { + uint16 save_version = _sl_xv_feature_versions[info->index]; + if (save_version > 0) { SlxiSubChunkFlags flags = info->flags; assert(!(flags & (XSCF_EXTRA_DATA_PRESENT | XSCF_CHUNK_ID_LIST_PRESENT))); uint32 extra_data_length = extra_data_lengths[info->index]; @@ -217,6 +232,7 @@ static void Save_SLXI() if (extra_data_length > 0) flags |= XSCF_EXTRA_DATA_PRESENT; if (chunk_count > 0) flags |= XSCF_CHUNK_ID_LIST_PRESENT; SlWriteUint32(flags); + SlWriteUint16(save_version); SlObject(const_cast(info), _xlsi_sub_chunk_desc); if (extra_data_length > 0) { diff --git a/src/saveload/extended_ver_sl.h b/src/saveload/extended_ver_sl.h index 10652c0e07..5afa1f30d4 100644 --- a/src/saveload/extended_ver_sl.h +++ b/src/saveload/extended_ver_sl.h @@ -40,11 +40,14 @@ enum SlXvFeatureTestOperator { * Structure to describe an extended feature version test, and how it combines with a traditional savegame version test */ struct SlXvFeatureTest { + using TestFunctorPtr = bool (*)(uint16, bool); ///< Return true if feature present, first parameter is standard savegame version, second is whether standard savegame version is within bounds + private: uint16 min_version; uint16 max_version; SlXvFeatureIndex feature; SlXvFeatureTestOperator op; + TestFunctorPtr functor = nullptr; public: SlXvFeatureTest() @@ -53,6 +56,9 @@ struct SlXvFeatureTest { SlXvFeatureTest(SlXvFeatureTestOperator op_, SlXvFeatureIndex feature_, uint16 min_version_ = 1, uint16 max_version_ = 0xFFFF) : min_version(min_version_), max_version(max_version_), feature(feature_), op(op_) { } + SlXvFeatureTest(TestFunctorPtr functor_) + : min_version(0), max_version(0), feature(XSLFI_NULL), op(XSLFTO_OR), functor(functor_) { } + bool IsFeaturePresent(uint16 savegame_version, uint16 savegame_version_from, uint16 savegame_version_to) const; }; @@ -66,6 +72,8 @@ inline bool SlXvIsFeatureMissing(SlXvFeatureIndex feature) return !SlXvIsFeaturePresent(feature); } +const char *SlXvGetFeatureName(SlXvFeatureIndex feature); + /** * sub chunk flags, this is saved as-is * (XSCF_EXTRA_DATA_PRESENT and XSCF_CHUNK_ID_LIST_PRESENT must only be set by the save code, and read by the load code) diff --git a/src/saveload/industry_sl.cpp b/src/saveload/industry_sl.cpp index c5ddadfdd0..a9c84e62ab 100644 --- a/src/saveload/industry_sl.cpp +++ b/src/saveload/industry_sl.cpp @@ -26,18 +26,28 @@ static const SaveLoad _industry_desc[] = { SLE_VAR(Industry, location.h, SLE_FILE_U8 | SLE_VAR_U16), SLE_REF(Industry, town, REF_TOWN), SLE_CONDNULL( 2, 0, 60), ///< used to be industry's produced_cargo - SLE_CONDARR(Industry, produced_cargo, SLE_UINT8, 2, 78, SL_MAX_VERSION), - SLE_CONDARR(Industry, incoming_cargo_waiting, SLE_UINT16, 3, 70, SL_MAX_VERSION), - SLE_ARR(Industry, produced_cargo_waiting, SLE_UINT16, 2), - SLE_ARR(Industry, production_rate, SLE_UINT8, 2), + SLE_CONDARR(Industry, produced_cargo, SLE_UINT8, 2, 78, 201), + SLE_CONDARR(Industry, produced_cargo, SLE_UINT8, 16, 202, SL_MAX_VERSION), + SLE_CONDARR(Industry, incoming_cargo_waiting, SLE_UINT16, 3, 70, 201), + SLE_CONDARR(Industry, incoming_cargo_waiting, SLE_UINT16, 16, 202, SL_MAX_VERSION), + SLE_CONDARR(Industry, produced_cargo_waiting, SLE_UINT16, 2, 0, 201), + SLE_CONDARR(Industry, produced_cargo_waiting, SLE_UINT16, 16, 202, SL_MAX_VERSION), + SLE_CONDARR(Industry, production_rate, SLE_UINT8, 2, 0, 201), + SLE_CONDARR(Industry, production_rate, SLE_UINT8, 16, 202, SL_MAX_VERSION), SLE_CONDNULL( 3, 0, 60), ///< used to be industry's accepts_cargo - SLE_CONDARR(Industry, accepts_cargo, SLE_UINT8, 3, 78, SL_MAX_VERSION), + SLE_CONDARR(Industry, accepts_cargo, SLE_UINT8, 3, 78, 201), + SLE_CONDARR(Industry, accepts_cargo, SLE_UINT8, 16, 202, SL_MAX_VERSION), SLE_VAR(Industry, prod_level, SLE_UINT8), - SLE_ARR(Industry, this_month_production, SLE_UINT16, 2), - SLE_ARR(Industry, this_month_transported, SLE_UINT16, 2), - SLE_ARR(Industry, last_month_pct_transported, SLE_UINT8, 2), - SLE_ARR(Industry, last_month_production, SLE_UINT16, 2), - SLE_ARR(Industry, last_month_transported, SLE_UINT16, 2), + SLE_CONDARR(Industry, this_month_production, SLE_UINT16, 2, 0, 201), + SLE_CONDARR(Industry, this_month_production, SLE_UINT16, 16, 202, SL_MAX_VERSION), + SLE_CONDARR(Industry, this_month_transported, SLE_UINT16, 2, 0, 201), + SLE_CONDARR(Industry, this_month_transported, SLE_UINT16, 16, 202, SL_MAX_VERSION), + SLE_CONDARR(Industry, last_month_pct_transported, SLE_UINT8, 2, 0, 201), + SLE_CONDARR(Industry, last_month_pct_transported, SLE_UINT8, 16, 202, SL_MAX_VERSION), + SLE_CONDARR(Industry, last_month_production, SLE_UINT16, 2, 0, 201), + SLE_CONDARR(Industry, last_month_production, SLE_UINT16, 16, 202, SL_MAX_VERSION), + SLE_CONDARR(Industry, last_month_transported, SLE_UINT16, 2, 0, 201), + SLE_CONDARR(Industry, last_month_transported, SLE_UINT16, 16, 202, SL_MAX_VERSION), SLE_VAR(Industry, counter, SLE_UINT16), @@ -51,13 +61,14 @@ static const SaveLoad _industry_desc[] = { SLE_CONDVAR(Industry, founder, SLE_UINT8, 70, SL_MAX_VERSION), SLE_CONDVAR(Industry, construction_date, SLE_INT32, 70, SL_MAX_VERSION), SLE_CONDVAR(Industry, construction_type, SLE_UINT8, 70, SL_MAX_VERSION), - SLE_CONDVAR(Industry, last_cargo_accepted_at, SLE_INT32, 70, SL_MAX_VERSION), + SLE_CONDVAR(Industry, last_cargo_accepted_at[0], SLE_INT32, 70, 201), + SLE_CONDARR(Industry, last_cargo_accepted_at, SLE_INT32, 16, 202, SL_MAX_VERSION), SLE_CONDVAR(Industry, selected_layout, SLE_UINT8, 73, SL_MAX_VERSION), SLEG_CONDARR(_old_ind_persistent_storage.storage, SLE_UINT32, 16, 76, 160), SLE_CONDREF(Industry, psa, REF_STORAGE, 161, SL_MAX_VERSION), - SLE_CONDVAR(Industry, random_triggers, SLE_UINT8, 82, SL_MAX_VERSION), + SLE_CONDNULL(1, 82, 196), // random_triggers SLE_CONDVAR(Industry, random, SLE_UINT16, 82, SL_MAX_VERSION), SLE_CONDNULL(32, 2, 143), // old reserved space @@ -101,7 +112,7 @@ static void Load_INDY() /* Store the old persistent storage. The GRFID will be added later. */ assert(PersistentStorage::CanAllocateItem()); i->psa = new PersistentStorage(0, 0, 0); - memcpy(i->psa->storage, _old_ind_persistent_storage.storage, sizeof(i->psa->storage)); + memcpy(i->psa->storage, _old_ind_persistent_storage.storage, sizeof(_old_ind_persistent_storage.storage)); } Industry::IncIndustryTypeCount(i->type); } diff --git a/src/saveload/linkgraph_sl.cpp b/src/saveload/linkgraph_sl.cpp index a65f4fc8a5..6044316a47 100644 --- a/src/saveload/linkgraph_sl.cpp +++ b/src/saveload/linkgraph_sl.cpp @@ -132,7 +132,7 @@ static const SaveLoad _edge_desc[] = { /** * Save/load a link graph. - * @param comp Link graph to be saved or loaded. + * @param lg Link graph to be saved or loaded. */ void SaveLoad_LinkGraph(LinkGraph &lg) { diff --git a/src/saveload/map_sl.cpp b/src/saveload/map_sl.cpp index 86a185ca42..693ddb7ce3 100644 --- a/src/saveload/map_sl.cpp +++ b/src/saveload/map_sl.cpp @@ -272,6 +272,30 @@ static void Save_MAP7() } } +static void Load_MAP8() +{ + SmallStackSafeStackAlloc buf; + TileIndex size = MapSize(); + + for (TileIndex i = 0; i != size;) { + SlArray(buf, MAP_SL_BUF_SIZE, SLE_UINT16); + for (uint j = 0; j != MAP_SL_BUF_SIZE; j++) _me[i++].m8 = buf[j]; + } +} + +static void Save_MAP8() +{ + SmallStackSafeStackAlloc buf; + TileIndex size = MapSize(); + + SlSetLength(size * sizeof(uint16)); + for (TileIndex i = 0; i != size;) { + for (uint j = 0; j != MAP_SL_BUF_SIZE; j++) buf[j] = _me[i++].m8; + SlArray(buf, MAP_SL_BUF_SIZE, SLE_UINT16); + } +} + + extern const ChunkHandler _map_chunk_handlers[] = { { 'MAPS', Save_MAPS, Load_MAPS, NULL, Check_MAPS, CH_RIFF }, { 'MAPT', Save_MAPT, Load_MAPT, NULL, NULL, CH_RIFF }, @@ -282,5 +306,6 @@ extern const ChunkHandler _map_chunk_handlers[] = { { 'M3HI', Save_MAP4, Load_MAP4, NULL, NULL, CH_RIFF }, { 'MAP5', Save_MAP5, Load_MAP5, NULL, NULL, CH_RIFF }, { 'MAPE', Save_MAP6, Load_MAP6, NULL, NULL, CH_RIFF }, - { 'MAP7', Save_MAP7, Load_MAP7, NULL, NULL, CH_RIFF | CH_LAST }, + { 'MAP7', Save_MAP7, Load_MAP7, NULL, NULL, CH_RIFF }, + { 'MAP8', Save_MAP8, Load_MAP8, NULL, NULL, CH_RIFF | CH_LAST }, }; diff --git a/src/saveload/newgrf_sl.cpp b/src/saveload/newgrf_sl.cpp index dacc127ea0..de261f02aa 100644 --- a/src/saveload/newgrf_sl.cpp +++ b/src/saveload/newgrf_sl.cpp @@ -96,8 +96,16 @@ static void Load_NGRF() { Load_NGRF_common(_grfconfig); - /* Append static NewGRF configuration, but only if there are some NewGRFs. */ - if (_game_mode != GM_MENU || _all_grfs != NULL) AppendStaticGRFConfigs(&_grfconfig); + if (_game_mode == GM_MENU) { + /* Intro game must not have NewGRF. */ + if (_grfconfig != NULL) SlErrorCorrupt("The intro game must not use NewGRF"); + + /* Activate intro NewGRFs (townnames) */ + ResetGRFConfig(false); + } else { + /* Append static NewGRF configuration */ + AppendStaticGRFConfigs(&_grfconfig); + } } static void Check_NGRF() diff --git a/src/saveload/oldloader.cpp b/src/saveload/oldloader.cpp index 13ee0e5b06..e0ad0e732a 100644 --- a/src/saveload/oldloader.cpp +++ b/src/saveload/oldloader.cpp @@ -265,7 +265,7 @@ static SavegameType DetermineOldSavegameType(FILE *f, char *title, const char *l case SGT_TTD: title = strecpy(title, "(TTD) ", last); break; default: title = strecpy(title, "(broken) ", last); break; } - title = strecpy(title, temp, last); + strecpy(title, temp, last); } return type; diff --git a/src/saveload/oldloader_sl.cpp b/src/saveload/oldloader_sl.cpp index 4afbe6033d..1974bb31fa 100644 --- a/src/saveload/oldloader_sl.cpp +++ b/src/saveload/oldloader_sl.cpp @@ -28,6 +28,7 @@ #include "../engine_func.h" #include "../company_base.h" #include "../disaster_vehicle.h" +#include "../core/smallvec_type.hpp" #include "saveload_internal.h" #include "oldloader.h" @@ -490,8 +491,7 @@ static inline uint RemapOrderIndex(uint x) return _savegame_type == SGT_TTO ? (x - 0x1AC4) / 2 : (x - 0x1C18) / 2; } -extern TileIndex *_animated_tile_list; -extern uint _animated_tile_count; +extern SmallVector _animated_tiles; extern char *_old_name_array; static uint32 _old_town_index; @@ -640,22 +640,18 @@ static bool LoadOldOrder(LoadgameState *ls, int num) static bool LoadOldAnimTileList(LoadgameState *ls, int num) { - /* This is slightly hackish - we must load a chunk into an array whose - * address isn't static, but instead pointed to by _animated_tile_list. - * To achieve that, create an OldChunks list on the stack on the fly. - * The list cannot be static because the value of _animated_tile_list - * can change between calls. */ - + TileIndex anim_list[256]; const OldChunks anim_chunk[] = { - OCL_VAR ( OC_TILE, 256, _animated_tile_list ), + OCL_VAR ( OC_TILE, 256, anim_list ), OCL_END () }; if (!LoadChunk(ls, NULL, anim_chunk)) return false; - /* Update the animated tile counter by counting till the first zero in the array */ - for (_animated_tile_count = 0; _animated_tile_count < 256; _animated_tile_count++) { - if (_animated_tile_list[_animated_tile_count] == 0) break; + /* The first zero in the loaded array indicates the end of the list. */ + for (int i = 0; i < 256; i++) { + if (anim_list[i] == 0) break; + *_animated_tiles.Append() = anim_list[i]; } return true; @@ -950,7 +946,7 @@ static const OldChunks _company_chunk[] = { OCL_SVAR( OC_UINT8, Company, block_preview ), OCL_CNULL( OC_TTD, 1 ), // Old AI - OCL_SVAR( OC_TTD | OC_UINT8, Company, avail_railtypes ), + OCL_CNULL( OC_TTD, 1 ), // avail_railtypes OCL_SVAR( OC_TILE, Company, location_of_HQ ), OCL_SVAR( OC_TTD | OC_UINT8, Company, share_owners[0] ), OCL_SVAR( OC_TTD | OC_UINT8, Company, share_owners[1] ), @@ -1165,7 +1161,7 @@ static const OldChunks vehicle_chunk[] = { OCL_SVAR( OC_UINT8, Vehicle, owner ), OCL_SVAR( OC_TILE, Vehicle, tile ), - OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Vehicle, cur_image ), + OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Vehicle, sprite_seq.seq[0].sprite ), OCL_NULL( 8 ), ///< Vehicle sprite box, calculated automatically @@ -1258,7 +1254,7 @@ bool LoadOldVehicle(LoadgameState *ls, int num) if (v == NULL) continue; v->refit_cap = v->cargo_cap; - SpriteID sprite = v->cur_image; + SpriteID sprite = v->sprite_seq.seq[0].sprite; /* no need to override other sprites */ if (IsInsideMM(sprite, 1460, 1465)) { sprite += 580; // aircraft smoke puff @@ -1269,7 +1265,7 @@ bool LoadOldVehicle(LoadgameState *ls, int num) } else if (IsInsideMM(sprite, 2516, 2539)) { sprite += 1385; // rotor or disaster-related vehicles } - v->cur_image = sprite; + v->sprite_seq.seq[0].sprite = sprite; switch (v->type) { case VEH_TRAIN: { diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 74f6fba1e2..9e43c5eef1 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -41,6 +41,7 @@ #include "../fileio_func.h" #include "../gamelog.h" #include "../string_func.h" +#include "../string_func_extra.h" #include "../fios.h" #include "../error.h" @@ -48,10 +49,12 @@ #include "saveload_internal.h" #include "saveload_filter.h" +#include "saveload_buffer.h" #include "extended_ver_sl.h" #include "../safeguards.h" +#include #include /* @@ -264,12 +267,21 @@ * 191 26646 * 192 26700 * 193 26802 - * 194 26881 1.5.x + * 194 26881 1.5.x, 1.6.0 + * 195 27572 1.6.x + * 196 27778 1.7.x + * 197 27978 1.8.x + * 198 + * 199 + * 200 #6805 Extend railtypes to 64, adding uint16 to map array. + * 201 #6885 Extend NewGRF persistant storages. + * 202 #6867 Increase industry cargo slots to 16 in, 16 out */ -extern const uint16 SAVEGAME_VERSION = 194; ///< Current savegame version of OpenTTD. +extern const uint16 SAVEGAME_VERSION = 202; ///< Current savegame version of OpenTTD. const uint16 SAVEGAME_VERSION_EXT = 0x8000; ///< Savegame extension indicator mask SavegameType _savegame_type; ///< type of savegame we are loading +FileToSaveLoad _file_to_saveload; ///< File to save or load in the openttd loop. uint32 _ttdp_version; ///< version of TTDP savegame (if applicable) uint16 _sl_version; ///< the major savegame version identifier @@ -291,108 +303,113 @@ enum SaveLoadAction { enum NeedLength { NL_NONE = 0, ///< not working in NeedLength mode NL_WANTLENGTH = 1, ///< writing length and data - NL_CALCLENGTH = 2, ///< need to calculate the length }; -/** Save in chunks of 128 KiB. */ -static const size_t MEMORY_CHUNK_SIZE = 128 * 1024; - -/** A buffer for reading (and buffering) savegame data. */ -struct ReadBuffer { - byte buf[MEMORY_CHUNK_SIZE]; ///< Buffer we're going to read from. - byte *bufp; ///< Location we're at reading the buffer. - byte *bufe; ///< End of the buffer we can read from. - LoadFilter *reader; ///< The filter used to actually read. - size_t read; ///< The amount of read bytes so far from the filter. - - /** - * Initialise our variables. - * @param reader The filter to actually read data. - */ - ReadBuffer(LoadFilter *reader) : bufp(NULL), bufe(NULL), reader(reader), read(0) - { - } - - inline byte ReadByte() - { - if (this->bufp == this->bufe) { - size_t len = this->reader->Read(this->buf, lengthof(this->buf)); - if (len == 0) SlErrorCorrupt("Unexpected end of chunk"); - - this->read += len; - this->bufp = this->buf; +void ReadBuffer::SkipBytesSlowPath(size_t bytes) +{ + bytes -= (this->bufe - this->bufp); + while (true) { + size_t len = this->reader->Read(this->buf, lengthof(this->buf)); + if (len == 0) SlErrorCorrupt("Unexpected end of chunk"); + this->read += len; + if (len >= bytes) { + this->bufp = this->buf + bytes; this->bufe = this->buf + len; + return; + } else { + bytes -= len; } + } +} - return *this->bufp++; +void ReadBuffer::AcquireBytes() +{ + size_t remainder = this->bufe - this->bufp; + if (remainder) { + memmove(this->buf, this->bufp, remainder); + } + size_t len = this->reader->Read(this->buf + remainder, lengthof(this->buf) - remainder); + if (len == 0) SlErrorCorrupt("Unexpected end of chunk"); + + this->read += len; + this->bufp = this->buf; + this->bufe = this->buf + remainder + len; +} + +void MemoryDumper::FinaliseBlock() +{ + assert(this->saved_buf == nullptr); + if (!this->blocks.empty()) { + size_t s = MEMORY_CHUNK_SIZE - (this->bufe - this->buf); + this->blocks.back().size = s; + this->completed_block_bytes += s; + } + this->buf = this->bufe = nullptr; +} + +void MemoryDumper::AllocateBuffer() +{ + if (this->saved_buf) { + const size_t offset = this->buf - this->autolen_buf; + const size_t size = (this->autolen_buf_end - this->autolen_buf) * 2; + this->autolen_buf = ReallocT(this->autolen_buf, size); + this->autolen_buf_end = this->autolen_buf + size; + this->buf = this->autolen_buf + offset; + this->bufe = this->autolen_buf_end; + return; + } + this->FinaliseBlock(); + this->buf = CallocT(MEMORY_CHUNK_SIZE); + this->blocks.emplace_back(this->buf); + this->bufe = this->buf + MEMORY_CHUNK_SIZE; +} + +/** + * Flush this dumper into a writer. + * @param writer The filter we want to use. + */ +void MemoryDumper::Flush(SaveFilter *writer) +{ + this->FinaliseBlock(); + + uint block_count = this->blocks.size(); + for (uint i = 0; i < block_count; i++) { + writer->Write(this->blocks[i].data, this->blocks[i].size); } - /** - * Get the size of the memory dump made so far. - * @return The size. - */ - size_t GetSize() const - { - return this->read - (this->bufe - this->bufp); - } -}; + writer->Finish(); +} +void MemoryDumper::StartAutoLength() +{ + assert(this->saved_buf == nullptr); -/** Container for dumping the savegame (quickly) to memory. */ -struct MemoryDumper { - AutoFreeSmallVector blocks; ///< Buffer with blocks of allocated memory. - byte *buf; ///< Buffer we're going to write to. - byte *bufe; ///< End of the buffer we write to. + this->saved_buf = this->buf; + this->saved_bufe = this->bufe; + this->buf = this->autolen_buf; + this->bufe = this->autolen_buf_end; +} - /** Initialise our variables. */ - MemoryDumper() : buf(NULL), bufe(NULL) - { - } +std::pair MemoryDumper::StopAutoLength() +{ + assert(this->saved_buf != nullptr); + auto res = std::make_pair(this->autolen_buf, this->buf - this->autolen_buf); - /** - * Write a single byte into the dumper. - * @param b The byte to write. - */ - inline void WriteByte(byte b) - { - /* Are we at the end of this chunk? */ - if (this->buf == this->bufe) { - this->buf = CallocT(MEMORY_CHUNK_SIZE); - *this->blocks.Append() = this->buf; - this->bufe = this->buf + MEMORY_CHUNK_SIZE; - } + this->buf = this->saved_buf; + this->bufe = this->saved_bufe; + this->saved_buf = this->saved_bufe = nullptr; + return res; +} - *this->buf++ = b; - } - - /** - * Flush this dumper into a writer. - * @param writer The filter we want to use. - */ - void Flush(SaveFilter *writer) - { - uint i = 0; - size_t t = this->GetSize(); - - while (t > 0) { - size_t to_write = min(MEMORY_CHUNK_SIZE, t); - - writer->Write(this->blocks[i++], to_write); - t -= to_write; - } - - writer->Finish(); - } - - /** - * Get the size of the memory dump made so far. - * @return The size. - */ - size_t GetSize() const - { - return this->blocks.Length() * MEMORY_CHUNK_SIZE - (this->bufe - this->buf); - } -}; +/** + * Get the size of the memory dump made so far. + * @return The size. + */ +size_t MemoryDumper::GetSize() const +{ + assert(this->saved_buf == nullptr); + return this->completed_block_bytes + (this->bufe ? (MEMORY_CHUNK_SIZE - (this->bufe - this->buf)) : 0); +} /** The saveload struct, containing reader-writer functions, buffer, version, etc. */ struct SaveLoadParams { @@ -419,6 +436,16 @@ struct SaveLoadParams { static SaveLoadParams _sl; ///< Parameters used for/at saveload. +ReadBuffer *ReadBuffer::GetCurrent() +{ + return _sl.reader; +} + +MemoryDumper *MemoryDumper::GetCurrent() +{ + return _sl.dumper; +} + /* these define the chunks */ extern const ChunkHandler _version_ext_chunk_handlers[]; extern const ChunkHandler _gamelog_chunk_handlers[]; @@ -564,7 +591,7 @@ void NORETURN SlError(StringID string, const char *extra_msg, bool already_mallo /** * As SlError, except that it takes a format string and additional parameters */ -void CDECL NORETURN SlErrorFmt(StringID string, const char *msg, ...) +void NORETURN CDECL SlErrorFmt(StringID string, const char *msg, ...) { va_list va; va_start(va, msg); @@ -588,7 +615,7 @@ void NORETURN SlErrorCorrupt(const char *msg, bool already_malloced) /** * As SlErrorCorruptFmt, except that it takes a format string and additional parameters */ -void CDECL NORETURN SlErrorCorruptFmt(const char *msg, ...) +void NORETURN CDECL SlErrorCorruptFmt(const char *msg, ...) { va_list va; va_start(va, msg); @@ -641,6 +668,34 @@ byte SlReadByte() return _sl.reader->ReadByte(); } +/** + * Read in bytes from the file/data structure but don't do + * anything with them, discarding them in effect + * @param length The amount of bytes that is being treated this way + */ +void SlSkipBytes(size_t length) +{ + return _sl.reader->SkipBytes(length); +} + +int SlReadUint16() +{ + _sl.reader->CheckBytes(2); + return _sl.reader->RawReadUint16(); +} + +uint32 SlReadUint32() +{ + _sl.reader->CheckBytes(4); + return _sl.reader->RawReadUint32(); +} + +uint64 SlReadUint64() +{ + _sl.reader->CheckBytes(8); + return _sl.reader->RawReadUint64(); +} + /** * Wrapper for writing a byte to the dumper. * @param b The byte to write. @@ -650,6 +705,24 @@ void SlWriteByte(byte b) _sl.dumper->WriteByte(b); } +void SlWriteUint16(uint16 v) +{ + _sl.dumper->CheckBytes(2); + _sl.dumper->RawWriteUint16(v); +} + +void SlWriteUint32(uint32 v) +{ + _sl.dumper->CheckBytes(4); + _sl.dumper->RawWriteUint32(v); +} + +void SlWriteUint64(uint64 v) +{ + _sl.dumper->CheckBytes(8); + _sl.dumper->RawWriteUint64(v); +} + /** * Returns number of bytes read so far * May only be called during a load/load check action @@ -888,9 +961,20 @@ void SlSetLength(size_t length) case CH_RIFF: /* Ugly encoding of >16M RIFF chunks * The lower 24 bits are normal - * The uppermost 4 bits are bits 24:27 */ - assert(length < (1 << 28)); + * The uppermost 4 bits are bits 24:27 + * + * If we have more than 28 bits, use an extra uint32 and + * signal this using the extended chunk header */ + assert(length < (1LL << 32)); + if (length >= (1 << 28)) { + /* write out extended chunk header */ + SlWriteByte(CH_EXT_HDR); + SlWriteUint32(static_cast(SLCEHF_BIG_RIFF)); + } SlWriteUint32((uint32)((length & 0xFFFFFF) | ((length >> 24) << 28))); + if (length >= (1 << 28)) { + SlWriteUint32(length >> 28); + } break; case CH_ARRAY: assert(_sl.last_array_index <= _sl.array_index); @@ -907,10 +991,6 @@ void SlSetLength(size_t length) } break; - case NL_CALCLENGTH: - _sl.obj_len += (int)length; - break; - default: NOT_REACHED(); } } @@ -928,10 +1008,10 @@ static void SlCopyBytes(void *ptr, size_t length) switch (_sl.action) { case SLA_LOAD_CHECK: case SLA_LOAD: - for (; length != 0; length--) *p++ = SlReadByte(); + _sl.reader->CopyBytes(p, length); break; case SLA_SAVE: - for (; length != 0; length--) SlWriteByte(*p++); + _sl.dumper->CopyBytes(p, length); break; default: NOT_REACHED(); } @@ -1063,6 +1143,18 @@ static inline size_t SlCalcNetStringLen(const char *ptr, size_t length) return min(strlen(ptr), length - 1); } +/** + * Calculate the gross length of the std::string that it + * will occupy in the savegame. This includes the real length, + * and the length that the index will occupy. + * @param str reference to the std::string + * @return return the gross length of the string + */ +static inline size_t SlCalcStdStrLen(const std::string &str) +{ + return str.size() + SlGetArrayLength(str.size()); // also include the length of the index +} + /** * Calculate the gross length of the string that it * will occupy in the savegame. This includes the real length, returned @@ -1174,6 +1266,41 @@ static void SlString(void *ptr, size_t length, VarType conv) } } +/** + * Save/Load a std::string. + * @param ptr the std::string being manipulated + * @param conv must be SLE_FILE_STRING + */ +static void SlStdString(std::string &str, VarType conv) +{ + switch (_sl.action) { + case SLA_SAVE: { + SlWriteArrayLength(str.size()); + SlCopyBytes(const_cast(str.data()), str.size()); + break; + } + case SLA_LOAD_CHECK: + case SLA_LOAD: { + size_t len = SlReadArrayLength(); + str.resize(len); + SlCopyBytes(const_cast(str.c_str()), len); + + StringValidationSettings settings = SVS_REPLACE_WITH_QUESTION_MARK; + if ((conv & SLF_ALLOW_CONTROL) != 0) { + settings = settings | SVS_ALLOW_CONTROL_CODE; + } + if ((conv & SLF_ALLOW_NEWLINE) != 0) { + settings = settings | SVS_ALLOW_NEWLINE; + } + str_validate(str, settings); + break; + } + case SLA_PTRS: break; + case SLA_NULL: break; + default: NOT_REACHED(); + } +} + /** * Return the size in bytes of a certain type of atomic array * @param length The length of the array counted in elements @@ -1197,8 +1324,6 @@ void SlArray(void *array, size_t length, VarType conv) /* Automatically calculate the length? */ if (_sl.need_length != NL_NONE) { SlSetLength(SlCalcArrayLen(length, conv)); - /* Determine length only? */ - if (_sl.need_length == NL_CALCLENGTH) return; } /* NOTICE - handle some buggy stuff, in really old versions everything was saved @@ -1353,9 +1478,10 @@ static void *IntToReference(size_t index, SLRefType rt) * Return the size in bytes of a list * @param list The std::list to find the size of */ + template static inline size_t SlCalcListLen(const void *list) { - const std::list *l = (const std::list *) list; + const PtrList *l = (const PtrList *) list; int type_size = IsSavegameVersionBefore(69) ? 2 : 4; /* Each entry is saved as type_size bytes, plus type_size bytes are used for the length @@ -1363,29 +1489,39 @@ static inline size_t SlCalcListLen(const void *list) return l->size() * type_size + type_size; } +/** + * Return the size in bytes of a list + * @param list The std::list to find the size of + */ + template +static inline size_t SlCalcVarListLen(const void *list, size_t item_size) +{ + const PtrList *l = (const PtrList *) list; + /* Each entry is saved as item_size bytes, plus 4 bytes are used for the length + * of the list */ + return l->size() * item_size + 4; +} /** * Save/Load a list. * @param list The list being manipulated * @param conv SLRefType type of the list (Vehicle *, Station *, etc) */ +template static void SlList(void *list, SLRefType conv) { /* Automatically calculate the length? */ if (_sl.need_length != NL_NONE) { - SlSetLength(SlCalcListLen(list)); - /* Determine length only? */ - if (_sl.need_length == NL_CALCLENGTH) return; + SlSetLength(SlCalcListLen(list)); } - typedef std::list PtrList; PtrList *l = (PtrList *)list; switch (_sl.action) { case SLA_SAVE: { SlWriteUint32((uint32)l->size()); - PtrList::iterator iter; + typename PtrList::iterator iter; for (iter = l->begin(); iter != l->end(); ++iter) { void *ptr = *iter; SlWriteUint32((uint32)ReferenceToInt(ptr, conv)); @@ -1407,7 +1543,7 @@ static void SlList(void *list, SLRefType conv) PtrList temp = *l; l->clear(); - PtrList::iterator iter; + typename PtrList::iterator iter; for (iter = temp.begin(); iter != temp.end(); ++iter) { void *ptr = IntToReference((size_t)*iter, conv); l->push_back(ptr); @@ -1421,6 +1557,53 @@ static void SlList(void *list, SLRefType conv) } } +/** + * Save/Load a list. + * @param list The list being manipulated + * @param conv VarType type of the list + */ +template +static void SlVarList(void *list, VarType conv) +{ + const size_t size_len = SlCalcConvMemLen(conv); + /* Automatically calculate the length? */ + if (_sl.need_length != NL_NONE) { + SlSetLength(SlCalcVarListLen(list, size_len)); + } + + PtrList *l = (PtrList *)list; + + switch (_sl.action) { + case SLA_SAVE: { + SlWriteUint32((uint32)l->size()); + + typename PtrList::iterator iter; + for (iter = l->begin(); iter != l->end(); ++iter) { + SlSaveLoadConv(&(*iter), conv); + } + break; + } + case SLA_LOAD_CHECK: + case SLA_LOAD: { + size_t length = SlReadUint32(); + l->resize(length); + + typename PtrList::iterator iter; + iter = l->begin(); + + for (size_t i = 0; i < length; i++) { + SlSaveLoadConv(&(*iter), conv); + ++iter; + } + break; + } + case SLA_PTRS: break; + case SLA_NULL: + l->clear(); + break; + default: NOT_REACHED(); + } +} /** Are we going to save this object or not? */ static inline bool SlIsObjectValidInSavegame(const SaveLoad *sld) @@ -1473,6 +1656,10 @@ size_t SlCalcObjMemberLength(const void *object, const SaveLoad *sld) case SL_ARR: case SL_STR: case SL_LST: + case SL_DEQ: + case SL_VEC: + case SL_STDSTR: + case SL_VARVEC: /* CONDITIONAL saveload types depend on the savegame version */ if (!SlIsObjectValidInSavegame(sld)) break; @@ -1481,7 +1668,20 @@ size_t SlCalcObjMemberLength(const void *object, const SaveLoad *sld) case SL_REF: return SlCalcRefLen(); case SL_ARR: return SlCalcArrayLen(sld->length, sld->conv); case SL_STR: return SlCalcStringLen(GetVariableAddress(object, sld), sld->length, sld->conv); - case SL_LST: return SlCalcListLen(GetVariableAddress(object, sld)); + case SL_LST: return SlCalcListLen>(GetVariableAddress(object, sld)); + case SL_DEQ: return SlCalcListLen>(GetVariableAddress(object, sld)); + case SL_VEC: return SlCalcListLen>(GetVariableAddress(object, sld)); + case SL_VARVEC: { + const size_t size_len = SlCalcConvMemLen(sld->conv); + switch (size_len) { + case 1: return SlCalcVarListLen>(GetVariableAddress(object, sld), 1); + case 2: return SlCalcVarListLen>(GetVariableAddress(object, sld), 2); + case 4: return SlCalcVarListLen>(GetVariableAddress(object, sld), 4); + case 8: return SlCalcVarListLen>(GetVariableAddress(object, sld), 8); + default: NOT_REACHED(); + } + } + case SL_STDSTR: return SlCalcStdStrLen(*static_cast(GetVariableAddress(object, sld))); default: NOT_REACHED(); } break; @@ -1493,6 +1693,8 @@ size_t SlCalcObjMemberLength(const void *object, const SaveLoad *sld) return 0; } +#ifdef OTTD_ASSERT + /** * Check whether the variable size of the variable in the saveload configuration * matches with the actual variable size. @@ -1528,14 +1730,21 @@ static bool IsVariableSizeRight(const SaveLoad *sld) /* These should be pointer sized, or fixed array. */ return sld->size == sizeof(void *) || sld->size == sld->length; + case SL_STDSTR: + return sld->size == sizeof(std::string); + default: return true; } } +#endif /* OTTD_ASSERT */ + bool SlObjectMember(void *ptr, const SaveLoad *sld) { +#ifdef OTTD_ASSERT assert(IsVariableSizeRight(sld)); +#endif VarType conv = GB(sld->conv, 0, 8); switch (sld->cmd) { @@ -1544,6 +1753,10 @@ bool SlObjectMember(void *ptr, const SaveLoad *sld) case SL_ARR: case SL_STR: case SL_LST: + case SL_DEQ: + case SL_VEC: + case SL_STDSTR: + case SL_VARVEC: /* CONDITIONAL saveload types depend on the savegame version */ if (!SlIsObjectValidInSavegame(sld)) return false; if (SlSkipVariableOnLoad(sld)) return false; @@ -1570,7 +1783,21 @@ bool SlObjectMember(void *ptr, const SaveLoad *sld) break; case SL_ARR: SlArray(ptr, sld->length, conv); break; case SL_STR: SlString(ptr, sld->length, sld->conv); break; - case SL_LST: SlList(ptr, (SLRefType)conv); break; + case SL_LST: SlList>(ptr, (SLRefType)conv); break; + case SL_DEQ: SlList>(ptr, (SLRefType)conv); break; + case SL_VEC: SlList>(ptr, (SLRefType)conv); break; + case SL_VARVEC: { + const size_t size_len = SlCalcConvMemLen(sld->conv); + switch (size_len) { + case 1: SlVarList>(ptr, conv); break; + case 2: SlVarList>(ptr, conv); break; + case 4: SlVarList>(ptr, conv); break; + case 8: SlVarList>(ptr, conv); break; + default: NOT_REACHED(); + } + break; + } + case SL_STDSTR: SlStdString(*static_cast(ptr), sld->conv); break; default: NOT_REACHED(); } break; @@ -1615,7 +1842,6 @@ void SlObject(void *object, const SaveLoad *sld) /* Automatically calculate the length? */ if (_sl.need_length != NL_NONE) { SlSetLength(SlCalcObjLength(object, sld)); - if (_sl.need_length == NL_CALCLENGTH) return; } for (; sld->cmd != SL_END; sld++) { @@ -1640,27 +1866,29 @@ void SlGlobList(const SaveLoadGlobVarList *sldg) */ void SlAutolength(AutolengthProc *proc, void *arg) { - size_t offs; - assert(_sl.action == SLA_SAVE); + assert(_sl.need_length == NL_WANTLENGTH); - /* Tell it to calculate the length */ - _sl.need_length = NL_CALCLENGTH; - _sl.obj_len = 0; + _sl.need_length = NL_NONE; + _sl.dumper->StartAutoLength(); proc(arg); - + auto result = _sl.dumper->StopAutoLength(); /* Setup length */ _sl.need_length = NL_WANTLENGTH; - SlSetLength(_sl.obj_len); - - offs = _sl.dumper->GetSize() + _sl.obj_len; - - /* And write the stuff */ - proc(arg); - - if (offs != _sl.dumper->GetSize()) SlErrorCorrupt("Invalid chunk size"); + SlSetLength(result.second); + _sl.dumper->CopyBytes(result.first, result.second); } +/* + * Notes on extended chunk header: + * + * If the chunk type is CH_EXT_HDR (15), then a u32 flags field follows. + * This flag field may define additional fields which follow the flags field in future. + * The standard chunk header follows, though it my be modified by the flags field. + * At present SLCEHF_BIG_RIFF increases the RIFF size limit to a theoretical 60 bits, + * by adding a further u32 field for the high bits after the existing RIFF size field. + */ + /** * Load a chunk of data (eg vehicles, stations, etc.) * @param ch The chunkhandler that will be used for the operation @@ -1674,6 +1902,15 @@ static void SlLoadChunk(const ChunkHandler *ch) _sl.block_mode = m; _sl.obj_len = 0; + SaveLoadChunkExtHeaderFlags ext_flags = static_cast(0); + if ((m & 0xF) == CH_EXT_HDR) { + ext_flags = static_cast(SlReadUint32()); + + /* read in real header */ + m = SlReadByte(); + _sl.block_mode = m; + } + switch (m) { case CH_ARRAY: _sl.array_index = 0; @@ -1689,6 +1926,10 @@ static void SlLoadChunk(const ChunkHandler *ch) /* Read length */ len = (SlReadByte() << 16) | ((m >> 4) << 24); len += SlReadUint16(); + if (ext_flags & SLCEHF_BIG_RIFF) { + len |= SlReadUint32() << 28; + } + _sl.obj_len = len; endoffs = _sl.reader->GetSize() + len; ch->load_proc(); @@ -1714,9 +1955,21 @@ static void SlLoadCheckChunk(const ChunkHandler *ch) _sl.block_mode = m; _sl.obj_len = 0; + SaveLoadChunkExtHeaderFlags ext_flags = static_cast(0); + if ((m & 0xF) == CH_EXT_HDR) { + ext_flags = static_cast(SlReadUint32()); + + /* read in real header */ + m = SlReadByte(); + _sl.block_mode = m; + } + switch (m) { case CH_ARRAY: _sl.array_index = 0; + if (ext_flags) { + SlErrorCorruptFmt("CH_ARRAY does not take chunk header extension flags: 0x%X", ext_flags); + } if (ch && ch->load_check_proc) { ch->load_check_proc(); } else { @@ -1724,6 +1977,9 @@ static void SlLoadCheckChunk(const ChunkHandler *ch) } break; case CH_SPARSE_ARRAY: + if (ext_flags) { + SlErrorCorruptFmt("CH_SPARSE_ARRAY does not take chunk header extension flags: 0x%X", ext_flags); + } if (ch && ch->load_check_proc) { ch->load_check_proc(); } else { @@ -1732,9 +1988,19 @@ static void SlLoadCheckChunk(const ChunkHandler *ch) break; default: if ((m & 0xF) == CH_RIFF) { + if (ext_flags != (ext_flags & SLCEHF_BIG_RIFF)) { + SlErrorCorruptFmt("Unknown chunk header extension flags for CH_RIFF: 0x%X", ext_flags); + } /* Read length */ len = (SlReadByte() << 16) | ((m >> 4) << 24); len += SlReadUint16(); + if (ext_flags & SLCEHF_BIG_RIFF) { + uint64 full_len = len | (static_cast(SlReadUint32()) << 28); + if (full_len >= (1LL << 32)) { + SlErrorCorrupt("Chunk size too large: " OTTD_PRINTFHEX64, full_len); + } + len = static_cast(full_len); + } _sl.obj_len = len; endoffs = _sl.reader->GetSize() + len; if (ch && ch->load_check_proc) { @@ -1750,32 +2016,6 @@ static void SlLoadCheckChunk(const ChunkHandler *ch) } } -/** - * Stub Chunk handlers to only calculate length and do nothing else. - * The intended chunk handler that should be called. - */ -static ChunkSaveLoadProc *_stub_save_proc; - -/** - * Stub Chunk handlers to only calculate length and do nothing else. - * Actually call the intended chunk handler. - * @param arg ignored parameter. - */ -static inline void SlStubSaveProc2(void *arg) -{ - _stub_save_proc(); -} - -/** - * Stub Chunk handlers to only calculate length and do nothing else. - * Call SlAutoLenth with our stub save proc that will eventually - * call the intended chunk handler. - */ -static void SlStubSaveProc() -{ - SlAutolength(SlStubSaveProc2, NULL); -} - /** * Save a chunk of data (eg. vehicles, stations, etc.). Each chunk is * prefixed by an ID identifying it, followed by data, and terminator where appropriate @@ -1791,11 +2031,8 @@ static void SlSaveChunk(const ChunkHandler *ch) SlWriteUint32(ch->id); DEBUG(sl, 2, "Saving chunk %c%c%c%c", ch->id >> 24, ch->id >> 16, ch->id >> 8, ch->id); - if (ch->flags & CH_AUTO_LENGTH) { - /* Need to calculate the length. Solve that by calling SlAutoLength in the save_proc. */ - _stub_save_proc = proc; - proc = SlStubSaveProc; - } + size_t written = 0; + if (_debug_sl_level >= 3) written = SlGetBytesWritten(); _sl.block_mode = ch->flags & CH_TYPE_MASK; switch (ch->flags & CH_TYPE_MASK) { @@ -1816,6 +2053,8 @@ static void SlSaveChunk(const ChunkHandler *ch) break; default: NOT_REACHED(); } + + DEBUG(sl, 3, "Saved chunk %c%c%c%c (" PRINTF_SIZE " bytes)", ch->id >> 24, ch->id >> 16, ch->id >> 8, ch->id, SlGetBytesWritten() - written); } /** Save all chunks */ @@ -1849,6 +2088,8 @@ static void SlLoadChunks() for (id = SlReadUint32(); id != 0; id = SlReadUint32()) { DEBUG(sl, 2, "Loading chunk %c%c%c%c", id >> 24, id >> 16, id >> 8, id); + size_t read = 0; + if (_debug_sl_level >= 3) read = SlGetBytesRead(); ch = SlFindChunkHandler(id); if (ch == NULL) { @@ -1861,6 +2102,7 @@ static void SlLoadChunks() } else { SlLoadChunk(ch); } + DEBUG(sl, 3, "Loaded chunk %c%c%c%c (" PRINTF_SIZE " bytes)", id >> 24, id >> 16, id >> 8, id, SlGetBytesRead() - read); } } @@ -1872,10 +2114,13 @@ static void SlLoadCheckChunks() for (id = SlReadUint32(); id != 0; id = SlReadUint32()) { DEBUG(sl, 2, "Loading chunk %c%c%c%c", id >> 24, id >> 16, id >> 8, id); + size_t read = 0; + if (_debug_sl_level >= 3) read = SlGetBytesRead(); ch = SlFindChunkHandler(id); if (ch == NULL && !SlXvIsChunkDiscardable(id)) SlErrorCorrupt("Unknown chunk type"); SlLoadCheckChunk(ch); + DEBUG(sl, 3, "Loaded chunk %c%c%c%c (" PRINTF_SIZE " bytes)", id >> 24, id >> 16, id >> 8, id, SlGetBytesRead() - read); } } @@ -2004,7 +2249,7 @@ struct LZOLoadFilter : LoadFilter { byte out[LZO_BUFFER_SIZE + LZO_BUFFER_SIZE / 16 + 64 + 3 + sizeof(uint32) * 2]; uint32 tmp[2]; uint32 size; - lzo_uint len; + lzo_uint len = ssize; /* Read header*/ if (this->chain->Read((byte*)tmp, sizeof(tmp)) != sizeof(tmp)) SlError(STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE, "File read failed"); @@ -2026,7 +2271,8 @@ struct LZOLoadFilter : LoadFilter { if (tmp[0] != lzo_adler32(0, out, size + sizeof(uint32))) SlErrorCorrupt("Bad checksum"); /* Decompress */ - lzo1x_decompress_safe(out + sizeof(uint32) * 1, size, buf, &len, NULL); + int ret = lzo1x_decompress_safe(out + sizeof(uint32) * 1, size, buf, &len, NULL); + if (ret != LZO_E_OK) SlError(STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE); return len; } }; @@ -2478,7 +2724,7 @@ static void SaveFileStart() { _sl.ff_state = _fast_forward; _fast_forward = 0; - if (_cursor.sprite == SPR_CURSOR_MOUSE) SetMouseCursor(SPR_CURSOR_ZZZ, PAL_NONE); + SetMouseCursorBusy(true); InvalidateWindowData(WC_STATUS_BAR, 0, SBI_SAVELOAD_START); _sl.saveinprogress = true; @@ -2488,7 +2734,7 @@ static void SaveFileStart() static void SaveFileDone() { if (_game_mode != GM_MENU) _fast_forward = _sl.ff_state; - if (_cursor.sprite == SPR_CURSOR_ZZZ) SetMouseCursor(SPR_CURSOR_MOUSE, PAL_NONE); + SetMouseCursorBusy(false); InvalidateWindowData(WC_STATUS_BAR, 0, SBI_SAVELOAD_FINISH); _sl.saveinprogress = false; @@ -2530,7 +2776,7 @@ static SaveOrLoadResult SaveFileToDisk(bool threaded) const SaveLoadFormat *fmt = GetSavegameFormat(_savegame_format, &compression); /* We have written our stuff to memory, now write it to file! */ - uint32 hdr[2] = { fmt->tag, TO_BE32((SAVEGAME_VERSION | SAVEGAME_VERSION_EXT) << 16) }; + uint32 hdr[2] = { fmt->tag, TO_BE32((uint32) (SAVEGAME_VERSION | SAVEGAME_VERSION_EXT) << 16) }; _sl.sf->Write((byte*)hdr, sizeof(hdr)); _sl.sf = fmt->init_write(_sl.sf, compression); @@ -2603,7 +2849,7 @@ static SaveOrLoadResult DoSave(SaveFilter *writer, bool threaded) SlSaveChunks(); SaveFileStart(); - if (!threaded || !ThreadObject::New(&SaveFileToDiskThread, NULL, &_save_thread)) { + if (!threaded || !ThreadObject::New(&SaveFileToDiskThread, NULL, &_save_thread, "ottd:savegame")) { if (threaded) DEBUG(sl, 1, "Cannot create savegame thread, reverting to single-threaded mode..."); SaveOrLoadResult result = SaveFileToDisk(false); @@ -2776,10 +3022,9 @@ static SaveOrLoadResult DoLoad(LoadFilter *reader, bool load_check) } GamelogStopAction(); + SlXvSetCurrentState(); } - SlXvSetCurrentState(); - return SL_OK; } @@ -2803,15 +3048,15 @@ SaveOrLoadResult LoadWithFilter(LoadFilter *reader) * Main Save or Load function where the high-level saveload functions are * handled. It opens the savegame, selects format and checks versions * @param filename The name of the savegame being created/loaded - * @param mode Save or load mode. Load can also be a TTD(Patch) game. Use #SL_LOAD, #SL_OLD_LOAD, #SL_LOAD_CHECK, or #SL_SAVE. + * @param fop Save or load mode. Load can also be a TTD(Patch) game. * @param sb The sub directory to save the savegame in * @param threaded True when threaded saving is allowed * @return Return the result of the action. #SL_OK, #SL_ERROR, or #SL_REINIT ("unload" the game) */ -SaveOrLoadResult SaveOrLoad(const char *filename, int mode, Subdirectory sb, bool threaded) +SaveOrLoadResult SaveOrLoad(const char *filename, SaveLoadOperation fop, DetailedFileType dft, Subdirectory sb, bool threaded) { /* An instance of saving is already active, so don't go saving again */ - if (_sl.saveinprogress && mode == SL_SAVE && threaded) { + if (_sl.saveinprogress && fop == SLO_SAVE && dft == DFT_GAME_FILE && threaded) { /* if not an autosave, but a user action, show error message */ if (!_do_autosave) ShowErrorMessage(STR_ERROR_SAVE_STILL_IN_PROGRESS, INVALID_STRING_ID, WL_ERROR); return SL_OK; @@ -2820,7 +3065,7 @@ SaveOrLoadResult SaveOrLoad(const char *filename, int mode, Subdirectory sb, boo try { /* Load a TTDLX or TTDPatch game */ - if (mode == SL_OLD_LOAD) { + if (fop == SLO_LOAD && dft == DFT_OLD_GAME_FILE) { InitializeGame(256, 256, true, true); // set a mapsize of 256x256 for TTDPatch games or it might get confused /* TTD/TTO savegames have no NewGRFs, TTDP savegame have them @@ -2843,25 +3088,35 @@ SaveOrLoadResult SaveOrLoad(const char *filename, int mode, Subdirectory sb, boo return SL_OK; } - switch (mode) { - case SL_LOAD_CHECK: _sl.action = SLA_LOAD_CHECK; break; - case SL_LOAD: _sl.action = SLA_LOAD; break; - case SL_SAVE: _sl.action = SLA_SAVE; break; + assert(dft == DFT_GAME_FILE); + switch (fop) { + case SLO_CHECK: + _sl.action = SLA_LOAD_CHECK; + break; + + case SLO_LOAD: + _sl.action = SLA_LOAD; + break; + + case SLO_SAVE: + _sl.action = SLA_SAVE; + break; + default: NOT_REACHED(); } - FILE *fh = (mode == SL_SAVE) ? FioFOpenFile(filename, "wb", sb) : FioFOpenFile(filename, "rb", sb); + FILE *fh = (fop == SLO_SAVE) ? FioFOpenFile(filename, "wb", sb) : FioFOpenFile(filename, "rb", sb); /* Make it a little easier to load savegames from the console */ - if (fh == NULL && mode != SL_SAVE) fh = FioFOpenFile(filename, "rb", SAVE_DIR); - if (fh == NULL && mode != SL_SAVE) fh = FioFOpenFile(filename, "rb", BASE_DIR); - if (fh == NULL && mode != SL_SAVE) fh = FioFOpenFile(filename, "rb", SCENARIO_DIR); + if (fh == NULL && fop != SLO_SAVE) fh = FioFOpenFile(filename, "rb", SAVE_DIR); + if (fh == NULL && fop != SLO_SAVE) fh = FioFOpenFile(filename, "rb", BASE_DIR); + if (fh == NULL && fop != SLO_SAVE) fh = FioFOpenFile(filename, "rb", SCENARIO_DIR); if (fh == NULL) { - SlError(mode == SL_SAVE ? STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE : STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE); + SlError(fop == SLO_SAVE ? STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE : STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE); } - if (mode == SL_SAVE) { // SAVE game + if (fop == SLO_SAVE) { // SAVE game DEBUG(desync, 1, "save: %08x; %02x; %s", _date, _date_fract, filename); if (_network_server || !_settings_client.gui.threaded_saves) threaded = false; @@ -2869,24 +3124,25 @@ SaveOrLoadResult SaveOrLoad(const char *filename, int mode, Subdirectory sb, boo } /* LOAD game */ - assert(mode == SL_LOAD || mode == SL_LOAD_CHECK); + assert(fop == SLO_LOAD || fop == SLO_CHECK); DEBUG(desync, 1, "load: %s", filename); - return DoLoad(new FileReader(fh), mode == SL_LOAD_CHECK); + return DoLoad(new FileReader(fh), fop == SLO_CHECK); } catch (...) { + /* This code may be executed both for old and new save games. */ ClearSaveLoadState(); /* Skip the "colour" character */ - if (mode != SL_LOAD_CHECK) DEBUG(sl, 0, "%s", GetSaveLoadErrorString() + 3); + if (fop != SLO_CHECK) DEBUG(sl, 0, "%s", GetSaveLoadErrorString() + 3); /* A saver/loader exception!! reinitialize all variables to prevent crash! */ - return (mode == SL_LOAD || mode == SL_OLD_LOAD) ? SL_REINIT : SL_ERROR; + return (fop == SLO_LOAD) ? SL_REINIT : SL_ERROR; } } /** Do a save when exiting the game (_settings_client.gui.autosave_on_exit) */ void DoExitSave() { - SaveOrLoad("exit.sav", SL_SAVE, AUTOSAVE_DIR); + SaveOrLoad("exit.sav", SLO_SAVE, DFT_GAME_FILE, AUTOSAVE_DIR); } /** @@ -2924,6 +3180,53 @@ void GenerateDefaultSaveName(char *buf, const char *last) SanitizeFilename(buf); } +/** + * Set the mode and file type of the file to save or load based on the type of file entry at the file system. + * @param ft Type of file entry of the file system. + */ +void FileToSaveLoad::SetMode(FiosType ft) +{ + this->SetMode(SLO_LOAD, GetAbstractFileType(ft), GetDetailedFileType(ft)); +} + +/** + * Set the mode and file type of the file to save or load. + * @param fop File operation being performed. + * @param aft Abstract file type. + * @param dft Detailed file type. + */ +void FileToSaveLoad::SetMode(SaveLoadOperation fop, AbstractFileType aft, DetailedFileType dft) +{ + if (aft == FT_INVALID || aft == FT_NONE) { + this->file_op = SLO_INVALID; + this->detail_ftype = DFT_INVALID; + this->abstract_ftype = FT_INVALID; + return; + } + + this->file_op = fop; + this->detail_ftype = dft; + this->abstract_ftype = aft; +} + +/** + * Set the name of the file. + * @param name Name of the file. + */ +void FileToSaveLoad::SetName(const char *name) +{ + strecpy(this->name, name, lastof(this->name)); +} + +/** + * Set the title of the file. + * @param title Title of the file. + */ +void FileToSaveLoad::SetTitle(const char *title) +{ + strecpy(this->title, title, lastof(this->title)); +} + #if 0 /** * Function to get the type of the savegame by looking at the file header. diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index e34d4f3e9e..c8381c45a4 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -25,15 +25,18 @@ enum SaveOrLoadResult { SL_REINIT = 2, ///< error that was caught in the middle of updating game state, need to clear it. (can only happen during load) }; -/** Save or load mode. @see SaveOrLoad */ -enum SaveOrLoadMode { - SL_INVALID = -1, ///< Invalid mode. - SL_LOAD = 0, ///< Load game. - SL_SAVE = 1, ///< Save game. - SL_OLD_LOAD = 2, ///< Load old game. - SL_PNG = 3, ///< Load PNG file (height map). - SL_BMP = 4, ///< Load BMP file (height map). - SL_LOAD_CHECK = 5, ///< Load for game preview. +/** Deals with the type of the savegame, independent of extension */ +struct FileToSaveLoad { + SaveLoadOperation file_op; ///< File operation to perform. + DetailedFileType detail_ftype; ///< Concrete file type (PNG, BMP, old save, etc). + AbstractFileType abstract_ftype; ///< Abstract type of file (scenario, heightmap, etc). + char name[MAX_PATH]; ///< Name of the file. + char title[255]; ///< Internal name of the game. + + void SetMode(FiosType ft); + void SetMode(SaveLoadOperation fop, AbstractFileType aft, DetailedFileType dft); + void SetName(const char *name); + void SetTitle(const char *title); }; /** Types of save games. */ @@ -46,10 +49,12 @@ enum SavegameType { SGT_INVALID = 0xFF, ///< broken savegame (used internally) }; +extern FileToSaveLoad _file_to_saveload; + void GenerateDefaultSaveName(char *buf, const char *last); -void SetSaveLoadError(uint16 str); +void SetSaveLoadError(StringID str); const char *GetSaveLoadErrorString(); -SaveOrLoadResult SaveOrLoad(const char *filename, int mode, Subdirectory sb, bool threaded = true); +SaveOrLoadResult SaveOrLoad(const char *filename, SaveLoadOperation fop, DetailedFileType dft, Subdirectory sb, bool threaded = true); void WaitTillSaved(); void ProcessAsyncSaveFinish(); void DoExitSave(); @@ -99,10 +104,16 @@ enum ChunkType { CH_ARRAY = 1, CH_SPARSE_ARRAY = 2, CH_TYPE_MASK = 3, + CH_EXT_HDR = 15, ///< Extended chunk header CH_LAST = 8, ///< Last chunk in this array. - CH_AUTO_LENGTH = 16, }; +/** Flags for chunk extended headers */ +enum SaveLoadChunkExtHeaderFlags { + SLCEHF_BIG_RIFF = 1 << 0, ///< This block uses a 60-bit RIFF chunk size +}; +DECLARE_ENUM_AS_BIT_SET(SaveLoadChunkExtHeaderFlags) + /** * VarTypes is the general bitmasked magic type that tells us * certain characteristics about the variable it refers to. For example @@ -159,7 +170,7 @@ enum VarTypes { SLE_INT64 = SLE_FILE_I64 | SLE_VAR_I64, SLE_UINT64 = SLE_FILE_U64 | SLE_VAR_U64, SLE_CHAR = SLE_FILE_I8 | SLE_VAR_CHAR, - SLE_STRINGID = SLE_FILE_STRINGID | SLE_VAR_U16, + SLE_STRINGID = SLE_FILE_STRINGID | SLE_VAR_U32, SLE_STRINGBUF = SLE_FILE_STRING | SLE_VAR_STRB, SLE_STRINGBQUOTE = SLE_FILE_STRING | SLE_VAR_STRBQ, SLE_STRING = SLE_FILE_STRING | SLE_VAR_STR, @@ -193,10 +204,15 @@ enum SaveLoadTypes { SL_ARR = 2, ///< Save/load an array. SL_STR = 3, ///< Save/load a string. SL_LST = 4, ///< Save/load a list. + SL_DEQ = 5, ///< Save/load a deque. + SL_VEC = 6, ///< Save/load a vector. + SL_STDSTR = 7, ///< Save/load a std::string. /* non-normal save-load types */ SL_WRITEBYTE = 8, SL_VEH_INCLUDE = 9, SL_ST_INCLUDE = 10, + /* primitive type vector */ + SL_VARVEC = 14, SL_END = 15 }; @@ -286,6 +302,18 @@ typedef SaveLoad SaveLoadGlobVarList; #define SLE_CONDSTR_X(base, variable, type, length, from, to, extver) SLE_GENERAL_X(SL_STR, base, variable, type, length, from, to, extver) #define SLE_CONDSTR(base, variable, type, length, from, to) SLE_CONDSTR_X(base, variable, type, length, from, to, SlXvFeatureTest()) +/** + * Storage of a std::string in some savegame versions. + * @param base Name of the class or struct containing the string. + * @param variable Name of the variable in the class or struct referenced by \a base. + * @param type Storage of the data in memory and in the savegame. + * @param from First savegame version that has the string. + * @param to Last savegame version that has the string. + * @param extver SlXvFeatureTest to test (along with from and to) which savegames have the field + */ +#define SLE_CONDSTDSTR_X(base, variable, type, from, to, extver) SLE_GENERAL_X(SL_STDSTR, base, variable, type, 0, from, to, extver) +#define SLE_CONDSTDSTR(base, variable, type, from, to) SLE_CONDSTDSTR_X(base, variable, type, from, to, SlXvFeatureTest()) + /** * Storage of a list in some savegame versions. * @param base Name of the class or struct containing the list. @@ -298,6 +326,42 @@ typedef SaveLoad SaveLoadGlobVarList; #define SLE_CONDLST_X(base, variable, type, from, to, extver) SLE_GENERAL_X(SL_LST, base, variable, type, 0, from, to, extver) #define SLE_CONDLST(base, variable, type, from, to) SLE_CONDLST_X(base, variable, type, from, to, SlXvFeatureTest()) +/** + * Storage of a deque in some savegame versions. + * @param base Name of the class or struct containing the list. + * @param variable Name of the variable in the class or struct referenced by \a base. + * @param type Storage of the data in memory and in the savegame. + * @param from First savegame version that has the list. + * @param to Last savegame version that has the list. + * @param extver SlXvFeatureTest to test (along with from and to) which savegames have the field + */ +#define SLE_CONDDEQ_X(base, variable, type, from, to, extver) SLE_GENERAL_X(SL_DEQ, base, variable, type, 0, from, to, extver) +#define SLE_CONDDEQ(base, variable, type, from, to) SLE_CONDDEQ_X(base, variable, type, from, to, SlXvFeatureTest()) + +/** + * Storage of a vector in some savegame versions. + * @param base Name of the class or struct containing the list. + * @param variable Name of the variable in the class or struct referenced by \a base. + * @param type Storage of the data in memory and in the savegame. + * @param from First savegame version that has the list. + * @param to Last savegame version that has the list. + * @param extver SlXvFeatureTest to test (along with from and to) which savegames have the field + */ +#define SLE_CONDVEC_X(base, variable, type, from, to, extver) SLE_GENERAL_X(SL_VEC, base, variable, type, 0, from, to, extver) +#define SLE_CONDVEC(base, variable, type, from, to) SLE_CONDVEC_X(base, variable, type, from, to, SlXvFeatureTest()) + +/** + * Storage of a variable vector in some savegame versions. + * @param base Name of the class or struct containing the list. + * @param variable Name of the variable in the class or struct referenced by \a base. + * @param type Storage of the data in memory and in the savegame. + * @param from First savegame version that has the list. + * @param to Last savegame version that has the list. + * @param extver SlXvFeatureTest to test (along with from and to) which savegames have the field + */ +#define SLE_CONDVARVEC_X(base, variable, type, from, to, extver) SLE_GENERAL_X(SL_VARVEC, base, variable, type, 0, from, to, extver) +#define SLE_CONDVARVEC(base, variable, type, from, to) SLE_CONDVARVEC_X(base, variable, type, from, to, SlXvFeatureTest()) + /** * Storage of a variable in every version of a savegame. * @param base Name of the class or struct containing the variable. @@ -332,6 +396,14 @@ typedef SaveLoad SaveLoadGlobVarList; */ #define SLE_STR(base, variable, type, length) SLE_CONDSTR(base, variable, type, length, 0, SL_MAX_VERSION) +/** + * Storage of a std::string in every savegame version. + * @param base Name of the class or struct containing the string. + * @param variable Name of the variable in the class or struct referenced by \a base. + * @param type Storage of the data in memory and in the savegame. + */ +#define SLE_STDSTR(base, variable, type) SLE_CONDSTDSTR(base, variable, type, 0, SL_MAX_VERSION) + /** * Storage of a list in every savegame version. * @param base Name of the class or struct containing the list. @@ -340,6 +412,22 @@ typedef SaveLoad SaveLoadGlobVarList; */ #define SLE_LST(base, variable, type) SLE_CONDLST(base, variable, type, 0, SL_MAX_VERSION) +/** + * Storage of a deque in every savegame version. + * @param base Name of the class or struct containing the list. + * @param variable Name of the variable in the class or struct referenced by \a base. + * @param type Storage of the data in memory and in the savegame. + */ +#define SLE_DEQ(base, variable, type) SLE_CONDDEQ(base, variable, type, 0, SL_MAX_VERSION) + +/** + * Storage of a vector in every savegame version. + * @param base Name of the class or struct containing the list. + * @param variable Name of the variable in the class or struct referenced by \a base. + * @param type Storage of the data in memory and in the savegame. + */ +#define SLE_VEC(base, variable, type) SLE_CONDVEC(base, variable, type, 0, SL_MAX_VERSION) + /** * Empty space in every savegame version. * @param length Length of the empty space. @@ -435,6 +523,28 @@ typedef SaveLoad SaveLoadGlobVarList; #define SLEG_CONDLST_X(variable, type, from, to, extver) SLEG_GENERAL_X(SL_LST, variable, type, 0, from, to, extver) #define SLEG_CONDLST(variable, type, from, to) SLEG_CONDLST_X(variable, type, from, to, SlXvFeatureTest()) +/** + * Storage of a global deque in some savegame versions. + * @param variable Name of the global variable. + * @param type Storage of the data in memory and in the savegame. + * @param from First savegame version that has the list. + * @param to Last savegame version that has the list. + * @param extver SlXvFeatureTest to test (along with from and to) which savegames have the field + */ +#define SLEG_CONDDEQ_X(variable, type, from, to, extver) SLEG_GENERAL_X(SL_DEQ, variable, type, 0, from, to, extver) +#define SLEG_CONDDEQ(variable, type, from, to) SLEG_CONDDEQ_X(variable, type, from, to, SlXvFeatureTest()) + +/** + * Storage of a global vector in some savegame versions. + * @param variable Name of the global variable. + * @param type Storage of the data in memory and in the savegame. + * @param from First savegame version that has the list. + * @param to Last savegame version that has the list. + * @param extver SlXvFeatureTest to test (along with from and to) which savegames have the field + */ +#define SLEG_CONDVEC_X(variable, type, from, to, extver) SLEG_GENERAL_X(SL_VEC, variable, type, 0, from, to, extver) +#define SLEG_CONDVEC(variable, type, from, to) SLEG_CONDVEC_X(variable, type, from, to, SlXvFeatureTest()) + /** * Storage of a global variable in every savegame version. * @param variable Name of the global variable. @@ -461,7 +571,7 @@ typedef SaveLoad SaveLoadGlobVarList; * @param variable Name of the global variable. * @param type Storage of the data in memory and in the savegame. */ -#define SLEG_STR(variable, type) SLEG_CONDSTR(variable, type, lengthof(variable), 0, SL_MAX_VERSION) +#define SLEG_STR(variable, type) SLEG_CONDSTR(variable, type, sizeof(variable), 0, SL_MAX_VERSION) /** * Storage of a global list in every savegame version. @@ -470,6 +580,20 @@ typedef SaveLoad SaveLoadGlobVarList; */ #define SLEG_LST(variable, type) SLEG_CONDLST(variable, type, 0, SL_MAX_VERSION) +/** + * Storage of a global deque in every savegame version. + * @param variable Name of the global variable. + * @param type Storage of the data in memory and in the savegame. + */ +#define SLEG_DEQ(variable, type) SLEG_CONDDEQ(variable, type, 0, SL_MAX_VERSION) + +/** + * Storage of a global vector in every savegame version. + * @param variable Name of the global variable. + * @param type Storage of the data in memory and in the savegame. + */ +#define SLEG_VEC(variable, type) SLEG_CONDVEC(variable, type, 0, SL_MAX_VERSION) + /** * Empty global space in some savegame versions. * @param length Length of the empty space. @@ -514,7 +638,7 @@ static inline bool SlIsObjectCurrentlyValid(uint16 version_from, uint16 version_ * Get the NumberType of a setting. This describes the integer type * as it is represented in memory * @param type VarType holding information about the variable-type - * @return return the SLE_VAR_* part of a variable-type description + * @return the SLE_VAR_* part of a variable-type description */ static inline VarType GetVarMemType(VarType type) { @@ -522,10 +646,10 @@ static inline VarType GetVarMemType(VarType type) } /** - * Get the #FileType of a setting. This describes the integer type + * Get the FileType of a setting. This describes the integer type * as it is represented in a savegame/file * @param type VarType holding information about the file-type - * @param return the SLE_FILE_* part of a variable-type description + * @return the SLE_FILE_* part of a variable-type description */ static inline VarType GetVarFileType(VarType type) { @@ -568,52 +692,15 @@ size_t SlCalcObjLength(const void *object, const SaveLoad *sld); byte SlReadByte(); void SlWriteByte(byte b); -static inline int SlReadUint16() -{ - int x = SlReadByte() << 8; - return x | SlReadByte(); -} +int SlReadUint16(); +uint32 SlReadUint32(); +uint64 SlReadUint64(); -static inline uint32 SlReadUint32() -{ - uint32 x = SlReadUint16() << 16; - return x | SlReadUint16(); -} +void SlWriteUint16(uint16 v); +void SlWriteUint32(uint32 v); +void SlWriteUint64(uint64 v); -static inline uint64 SlReadUint64() -{ - uint32 x = SlReadUint32(); - uint32 y = SlReadUint32(); - return (uint64)x << 32 | y; -} - -static inline void SlWriteUint16(uint16 v) -{ - SlWriteByte(GB(v, 8, 8)); - SlWriteByte(GB(v, 0, 8)); -} - -static inline void SlWriteUint32(uint32 v) -{ - SlWriteUint16(GB(v, 16, 16)); - SlWriteUint16(GB(v, 0, 16)); -} - -static inline void SlWriteUint64(uint64 x) -{ - SlWriteUint32((uint32)(x >> 32)); - SlWriteUint32((uint32)x); -} - -/** - * Read in bytes from the file/data structure but don't do - * anything with them, discarding them in effect - * @param length The amount of bytes that is being treated this way - */ -static inline void SlSkipBytes(size_t length) -{ - for (; length != 0; length--) SlReadByte(); -} +void SlSkipBytes(size_t length); size_t SlGetBytesRead(); size_t SlGetBytesWritten(); @@ -624,8 +711,8 @@ void SlObject(void *object, const SaveLoad *sld); bool SlObjectMember(void *object, const SaveLoad *sld); void NORETURN SlError(StringID string, const char *extra_msg = NULL, bool already_malloced = false); void NORETURN SlErrorCorrupt(const char *msg, bool already_malloced = false); -void CDECL NORETURN SlErrorFmt(StringID string, const char *msg, ...) WARN_FORMAT(2, 3); -void CDECL NORETURN SlErrorCorruptFmt(const char *msg, ...) WARN_FORMAT(1, 2); +void NORETURN CDECL SlErrorFmt(StringID string, const char *msg, ...) WARN_FORMAT(2, 3); +void NORETURN CDECL SlErrorCorruptFmt(const char *msg, ...) WARN_FORMAT(1, 2); bool SaveloadCrashWithMissingNewGRFs(); diff --git a/src/saveload/saveload_buffer.h b/src/saveload/saveload_buffer.h new file mode 100644 index 0000000000..5e21cf5b02 --- /dev/null +++ b/src/saveload/saveload_buffer.h @@ -0,0 +1,266 @@ +/* $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 saveload_buffer.h Functions/types related to buffers used for saving and loading games. */ + +#ifndef SAVELOAD_BUFFER_H +#define SAVELOAD_BUFFER_H + +#include "../core/alloc_func.hpp" +#include "../core/endian_type.hpp" +#include "../core/endian_func.hpp" +#include "../core/math_func.hpp" + +#include +#include + +struct LoadFilter; +struct SaveFilter; + +/** Save in chunks of 128 KiB. */ +static const size_t MEMORY_CHUNK_SIZE = 128 * 1024; + +/** A buffer for reading (and buffering) savegame data. */ +struct ReadBuffer { + byte buf[MEMORY_CHUNK_SIZE]; ///< Buffer we're going to read from. + byte *bufp; ///< Location we're at reading the buffer. + byte *bufe; ///< End of the buffer we can read from. + LoadFilter *reader; ///< The filter used to actually read. + size_t read; ///< The amount of read bytes so far from the filter. + + /** + * Initialise our variables. + * @param reader The filter to actually read data. + */ + ReadBuffer(LoadFilter *reader) : bufp(NULL), bufe(NULL), reader(reader), read(0) + { + } + + static ReadBuffer *GetCurrent(); + + void SkipBytesSlowPath(size_t bytes); + void AcquireBytes(); + + inline void SkipBytes(size_t bytes) + { + byte *b = this->bufp + bytes; + if (likely(b <= this->bufe)) { + this->bufp = b; + } else { + SkipBytesSlowPath(bytes); + } + } + + inline byte RawReadByte() + { + return *this->bufp++; + } + + inline byte ReadByte() + { + if (unlikely(this->bufp == this->bufe)) { + this->AcquireBytes(); + } + + return RawReadByte(); + } + + inline void CheckBytes(size_t bytes) + { + while (unlikely(this->bufp + bytes > this->bufe)) this->AcquireBytes(); + } + + inline int RawReadUint16() + { +#if OTTD_ALIGNMENT == 0 + int x = FROM_BE16(*((const unaligned_uint16*) this->bufp)); + this->bufp += 2; + return x; +#else + int x = this->RawReadByte() << 8; + return x | this->RawReadByte(); +#endif + } + + inline uint32 RawReadUint32() + { +#if OTTD_ALIGNMENT == 0 + uint32 x = FROM_BE32(*((const unaligned_uint32*) this->bufp)); + this->bufp += 4; + return x; +#else + uint32 x = this->RawReadUint16() << 16; + return x | this->RawReadUint16(); +#endif + } + + inline uint64 RawReadUint64() + { +#if OTTD_ALIGNMENT == 0 + uint64 x = FROM_BE64(*((const unaligned_uint64*) this->bufp)); + this->bufp += 8; + return x; +#else + uint32 x = this->RawReadUint32(); + uint32 y = this->RawReadUint32(); + return (uint64)x << 32 | y; +#endif + } + + inline void CopyBytes(byte *ptr, size_t length) + { + while (length) { + if (unlikely(this->bufp == this->bufe)) { + this->AcquireBytes(); + } + size_t to_copy = min(this->bufe - this->bufp, length); + memcpy(ptr, this->bufp, to_copy); + this->bufp += to_copy; + ptr += to_copy; + length -= to_copy; + } + } + + /** + * Get the size of the memory dump made so far. + * @return The size. + */ + inline size_t GetSize() const + { + return this->read - (this->bufe - this->bufp); + } +}; + + +/** Container for dumping the savegame (quickly) to memory. */ +struct MemoryDumper { + struct BufferInfo { + byte *data; + size_t size = 0; + + BufferInfo(byte *d) : data(d) {} + ~BufferInfo() { free(this->data); } + + BufferInfo(const BufferInfo &) = delete; + BufferInfo(BufferInfo &&other) : data(other.data), size(other.size) { other.data = nullptr; }; + }; + + std::vector blocks; ///< Buffer with blocks of allocated memory. + byte *buf = nullptr; ///< Buffer we're going to write to. + byte *bufe = nullptr; ///< End of the buffer we write to. + size_t completed_block_bytes = 0; ///< Total byte count of completed blocks. + + byte *autolen_buf = nullptr; + byte *autolen_buf_end = nullptr; + byte *saved_buf = nullptr; + byte *saved_bufe = nullptr; + + MemoryDumper() + { + const size_t size = 8192; + this->autolen_buf = CallocT(size); + this->autolen_buf_end = this->autolen_buf + size; + } + + ~MemoryDumper() + { + free(this->autolen_buf); + } + + static MemoryDumper *GetCurrent(); + + void FinaliseBlock(); + void AllocateBuffer(); + + inline void CheckBytes(size_t bytes) + { + if (unlikely(this->buf + bytes > this->bufe)) this->AllocateBuffer(); + } + + /** + * Write a single byte into the dumper. + * @param b The byte to write. + */ + inline void WriteByte(byte b) + { + /* Are we at the end of this chunk? */ + if (unlikely(this->buf == this->bufe)) { + this->AllocateBuffer(); + } + + *this->buf++ = b; + } + + inline void CopyBytes(byte *ptr, size_t length) + { + while (length) { + if (unlikely(this->buf == this->bufe)) { + this->AllocateBuffer(); + } + size_t to_copy = min(this->bufe - this->buf, length); + memcpy(this->buf, ptr, to_copy); + this->buf += to_copy; + ptr += to_copy; + length -= to_copy; + } + } + + inline void RawWriteByte(byte b) + { + *this->buf++ = b; + } + + inline void RawWriteUint16(uint16 v) + { +#if OTTD_ALIGNMENT == 0 + *((unaligned_uint16 *) this->buf) = TO_BE16(v); +#else + this->buf[0] = GB(v, 8, 8); + this->buf[1] = GB(v, 0, 8); +#endif + this->buf += 2; + } + + inline void RawWriteUint32(uint32 v) + { +#if OTTD_ALIGNMENT == 0 + *((unaligned_uint32 *) this->buf) = TO_BE32(v); +#else + this->buf[0] = GB(v, 24, 8); + this->buf[1] = GB(v, 16, 8); + this->buf[2] = GB(v, 8, 8); + this->buf[3] = GB(v, 0, 8); +#endif + this->buf += 4; + } + + inline void RawWriteUint64(uint64 v) + { +#if OTTD_ALIGNMENT == 0 + *((unaligned_uint64 *) this->buf) = TO_BE64(v); +#else + this->buf[0] = GB(v, 56, 8); + this->buf[1] = GB(v, 48, 8); + this->buf[2] = GB(v, 40, 8); + this->buf[3] = GB(v, 32, 8); + this->buf[4] = GB(v, 24, 8); + this->buf[5] = GB(v, 16, 8); + this->buf[6] = GB(v, 8, 8); + this->buf[7] = GB(v, 0, 8); +#endif + this->buf += 8; + } + + void Flush(SaveFilter *writer); + size_t GetSize() const; + void StartAutoLength(); + std::pair StopAutoLength(); +}; + +#endif diff --git a/src/saveload/signs_sl.cpp b/src/saveload/signs_sl.cpp index d5bacd509c..132ac181e4 100644 --- a/src/saveload/signs_sl.cpp +++ b/src/saveload/signs_sl.cpp @@ -60,7 +60,7 @@ static void Load_SIGN() } /* Signs placed in scenario editor shall now be OWNER_DEITY */ - if (IsSavegameVersionBefore(171) && si->owner == OWNER_NONE && _saveload_mode == SLD_LOAD_SCENARIO) { + if (IsSavegameVersionBefore(171) && si->owner == OWNER_NONE && _file_to_saveload.abstract_ftype == FT_SCENARIO) { si->owner = OWNER_DEITY; } } diff --git a/src/saveload/station_sl.cpp b/src/saveload/station_sl.cpp index 3db5e1f5f8..670d6fcf06 100644 --- a/src/saveload/station_sl.cpp +++ b/src/saveload/station_sl.cpp @@ -325,6 +325,11 @@ static void SwapPackets(GoodsEntry *ge) static void Load_STNS() { + _cargo_source_xy = 0; + _cargo_days = 0; + _cargo_feeder_share = 0; + + uint num_cargo = IsSavegameVersionBefore(55) ? 12 : IsSavegameVersionBefore(199) ? 32 : NUM_CARGO; int index; while ((index = SlIterateArray()) != -1) { Station *st = new (index) Station(); @@ -333,7 +338,6 @@ static void Load_STNS() _waiting_acceptance = 0; - uint num_cargo = IsSavegameVersionBefore(55) ? 12 : NUM_CARGO; for (CargoID i = 0; i < num_cargo; i++) { GoodsEntry *ge = &st->goods[i]; SlObject(ge, GetGoodsDesc()); @@ -373,10 +377,11 @@ static void Ptrs_STNS() /* Don't run when savegame version is higher than or equal to 123. */ if (!IsSavegameVersionBefore(123)) return; + uint num_cargo = IsSavegameVersionBefore(199) ? 32 : NUM_CARGO; Station *st; FOR_ALL_STATIONS(st) { if (!IsSavegameVersionBefore(68)) { - for (CargoID i = 0; i < NUM_CARGO; i++) { + for (CargoID i = 0; i < num_cargo; i++) { GoodsEntry *ge = &st->goods[i]; SwapPackets(ge); SlObject(ge, GetGoodsDesc()); @@ -436,7 +441,8 @@ static const SaveLoad _station_desc[] = { SLE_VAR(Station, last_vehicle_type, SLE_UINT8), SLE_VAR(Station, had_vehicle_of_type, SLE_UINT8), SLE_LST(Station, loading_vehicles, REF_VEHICLE), - SLE_CONDVAR(Station, always_accepted, SLE_UINT32, 127, SL_MAX_VERSION), + SLE_CONDVAR(Station, always_accepted, SLE_FILE_U32 | SLE_VAR_U64, 127, 198), + SLE_CONDVAR(Station, always_accepted, SLE_UINT64, 199, SL_MAX_VERSION), SLE_END() }; @@ -514,8 +520,10 @@ static void Save_STNN() static void Load_STNN() { - int index; + _num_flows = 0; + uint num_cargo = IsSavegameVersionBefore(199) ? 32 : NUM_CARGO; + int index; while ((index = SlIterateArray()) != -1) { bool waypoint = (SlReadByte() & FACIL_WAYPOINT) != 0; @@ -530,10 +538,10 @@ static void Load_STNN() /* Store the old persistent storage. The GRFID will be added later. */ assert(PersistentStorage::CanAllocateItem()); st->airport.psa = new PersistentStorage(0, 0, 0); - memcpy(st->airport.psa->storage, _old_st_persistent_storage.storage, sizeof(st->airport.psa->storage)); + memcpy(st->airport.psa->storage, _old_st_persistent_storage.storage, sizeof(_old_st_persistent_storage.storage)); } - for (CargoID i = 0; i < NUM_CARGO; i++) { + for (CargoID i = 0; i < num_cargo; i++) { SlObject(&st->goods[i], GetGoodsDesc()); FlowSaveLoad flow; FlowStat *fs = NULL; @@ -575,9 +583,10 @@ static void Ptrs_STNN() /* Don't run when savegame version lower than 123. */ if (IsSavegameVersionBefore(123)) return; + uint num_cargo = IsSavegameVersionBefore(199) ? 32 : NUM_CARGO; Station *st; FOR_ALL_STATIONS(st) { - for (CargoID i = 0; i < NUM_CARGO; i++) { + for (CargoID i = 0; i < num_cargo; i++) { GoodsEntry *ge = &st->goods[i]; if (IsSavegameVersionBefore(183)) { SwapPackets(ge); diff --git a/src/saveload/storage_sl.cpp b/src/saveload/storage_sl.cpp index 110df63a7c..04980c7c37 100644 --- a/src/saveload/storage_sl.cpp +++ b/src/saveload/storage_sl.cpp @@ -18,7 +18,8 @@ /** Description of the data to save and load in #PersistentStorage. */ static const SaveLoad _storage_desc[] = { SLE_CONDVAR(PersistentStorage, grfid, SLE_UINT32, 6, SL_MAX_VERSION), - SLE_CONDARR(PersistentStorage, storage, SLE_UINT32, 16, 161, SL_MAX_VERSION), + SLE_CONDARR(PersistentStorage, storage, SLE_UINT32, 16, 161, 200), + SLE_CONDARR(PersistentStorage, storage, SLE_UINT32, 256, 201, SL_MAX_VERSION), SLE_END() }; diff --git a/src/saveload/strings_sl.cpp b/src/saveload/strings_sl.cpp index 73f2a1e2e1..aa2fdd3e60 100644 --- a/src/saveload/strings_sl.cpp +++ b/src/saveload/strings_sl.cpp @@ -11,6 +11,7 @@ #include "../stdafx.h" #include "../string_func.h" +#include "../strings_func.h" #include "saveload_internal.h" #include "table/strings.h" @@ -60,7 +61,7 @@ char *_old_name_array = NULL; char *CopyFromOldName(StringID id) { /* Is this name an (old) custom name? */ - if (GB(id, 11, 5) != 15) return NULL; + if (GetStringTab(id) != TEXT_TAB_OLD_CUSTOM) return NULL; if (IsSavegameVersionBefore(37)) { /* Allow for expansion when converted to UTF-8. */ diff --git a/src/saveload/town_sl.cpp b/src/saveload/town_sl.cpp index 7db6a7aa6f..13438d85bf 100644 --- a/src/saveload/town_sl.cpp +++ b/src/saveload/town_sl.cpp @@ -14,6 +14,7 @@ #include "../town.h" #include "../landscape.h" #include "../subsidy_func.h" +#include "../strings_func.h" #include "saveload.h" #include "newgrf_sl.h" @@ -191,7 +192,8 @@ static const SaveLoad _town_desc[] = { SLE_CONDLST(Town, psa_list, REF_STORAGE, 161, SL_MAX_VERSION), - SLE_CONDVAR(Town, cargo_produced, SLE_UINT32, 166, SL_MAX_VERSION), + SLE_CONDVAR(Town, cargo_produced, SLE_FILE_U32 | SLE_VAR_U64, 166, 198), + SLE_CONDVAR(Town, cargo_produced, SLE_UINT64, 199, SL_MAX_VERSION), /* reserve extra space in savegame here. (currently 30 bytes) */ SLE_CONDNULL(30, 2, SL_MAX_VERSION), @@ -273,19 +275,20 @@ static void Save_TOWN() static void Load_TOWN() { int index; + uint num_cargo = IsSavegameVersionBefore(199) ? 32 : NUM_CARGO; while ((index = SlIterateArray()) != -1) { Town *t = new (index) Town(); SlObject(t, _town_desc); - for (CargoID i = 0; i < NUM_CARGO; i++) { + for (CargoID i = 0; i < num_cargo; i++) { SlObject(&t->supplied[i], _town_supplied_desc); } for (int i = TE_BEGIN; i < TE_END; i++) { SlObject(&t->received[i], _town_received_desc); } - if (t->townnamegrfid == 0 && !IsInsideMM(t->townnametype, SPECSTR_TOWNNAME_START, SPECSTR_TOWNNAME_LAST + 1) && GB(t->townnametype, 11, 5) != 15) { + if (t->townnamegrfid == 0 && !IsInsideMM(t->townnametype, SPECSTR_TOWNNAME_START, SPECSTR_TOWNNAME_LAST + 1) && GetStringTab(t->townnametype) != TEXT_TAB_OLD_CUSTOM) { SlErrorCorrupt("Invalid town name generator"); } @@ -294,7 +297,7 @@ static void Load_TOWN() SlObject(&t->cargo_accepted, GetTileMatrixDesc()); if (t->cargo_accepted.area.w != 0) { uint arr_len = t->cargo_accepted.area.w / AcceptanceMatrix::GRID * t->cargo_accepted.area.h / AcceptanceMatrix::GRID; - t->cargo_accepted.data = MallocT(arr_len); + t->cargo_accepted.data = MallocT(arr_len); SlArray(t->cargo_accepted.data, arr_len, SLE_UINT32); /* Rebuild total cargo acceptance. */ diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index ebc5fc4215..bb3db3fe3e 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -375,6 +375,8 @@ void AfterLoadVehicles(bool part_of_load) FOR_ALL_VEHICLES(v) { assert(v->first != NULL); + v->trip_occupancy = CalcPercentVehicleFilled(v, NULL); + switch (v->type) { case VEH_TRAIN: { Train *t = Train::From(v); @@ -431,26 +433,26 @@ void AfterLoadVehicles(bool part_of_load) RoadVehicle *rv = RoadVehicle::From(v); rv->roadtype = HasBit(EngInfo(v->First()->engine_type)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD; rv->compatible_roadtypes = RoadTypeToRoadTypes(rv->roadtype); - /* FALL THROUGH */ + FALLTHROUGH; } case VEH_TRAIN: case VEH_SHIP: - v->cur_image = v->GetImage(v->direction, EIT_ON_MAP); + v->GetImage(v->direction, EIT_ON_MAP, &v->sprite_seq); break; case VEH_AIRCRAFT: if (Aircraft::From(v)->IsNormalAircraft()) { - v->cur_image = v->GetImage(v->direction, EIT_ON_MAP); + v->GetImage(v->direction, EIT_ON_MAP, &v->sprite_seq); - /* The plane's shadow will have the same image as the plane */ + /* The plane's shadow will have the same image as the plane, but no colour */ Vehicle *shadow = v->Next(); - shadow->cur_image = v->cur_image; + shadow->sprite_seq.CopyWithoutPalette(v->sprite_seq); /* In the case of a helicopter we will update the rotor sprites */ if (v->subtype == AIR_HELICOPTER) { Vehicle *rotor = shadow->Next(); - rotor->cur_image = GetRotorImage(Aircraft::From(v), EIT_ON_MAP); + GetRotorImage(Aircraft::From(v), EIT_ON_MAP, &rotor->sprite_seq); } UpdateAircraftCache(Aircraft::From(v), true); @@ -459,7 +461,7 @@ void AfterLoadVehicles(bool part_of_load) default: break; } - v->UpdateDeltaXY(v->direction); + v->UpdateDeltaXY(); v->coord.left = INVALID_COORD; v->UpdatePosition(); v->UpdateViewport(false); @@ -796,7 +798,7 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLE_CONDVAR(Vehicle, z_pos, SLE_FILE_U8 | SLE_VAR_I32, 0, 163), SLE_CONDVAR(Vehicle, z_pos, SLE_INT32, 164, SL_MAX_VERSION), - SLE_VAR(Vehicle, cur_image, SLE_FILE_U16 | SLE_VAR_U32), + SLE_VAR(Vehicle, sprite_seq.seq[0].sprite, SLE_FILE_U16 | SLE_VAR_U32), SLE_CONDNULL(5, 0, 57), SLE_VAR(Vehicle, progress, SLE_UINT8), SLE_VAR(Vehicle, vehstatus, SLE_UINT8), @@ -836,7 +838,7 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLE_CONDVAR(Vehicle, current_order.dest, SLE_FILE_U8 | SLE_VAR_U16, 0, 4), SLE_CONDVAR(Vehicle, current_order.dest, SLE_UINT16, 5, SL_MAX_VERSION), - SLE_VAR(Vehicle, cur_image, SLE_FILE_U16 | SLE_VAR_U32), + SLE_VAR(Vehicle, sprite_seq.seq[0].sprite, SLE_FILE_U16 | SLE_VAR_U32), SLE_CONDVAR(Vehicle, age, SLE_FILE_U16 | SLE_VAR_I32, 0, 30), SLE_CONDVAR(Vehicle, age, SLE_INT32, 31, SL_MAX_VERSION), SLE_VAR(Vehicle, tick_counter, SLE_UINT8), diff --git a/src/scope.h b/src/scope.h new file mode 100644 index 0000000000..b546813ac3 --- /dev/null +++ b/src/scope.h @@ -0,0 +1,55 @@ +/* $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 scope.h Simple scope guard... */ + +#ifndef SCOPE_H +#define SCOPE_H + +#include + +template +class scope_exit_obj { + T f; + bool shouldexec; + + + public: + + scope_exit_obj(T &&func) + : f(std::move(func)), shouldexec(true) { } + + scope_exit_obj(const scope_exit_obj ©src) = delete; + scope_exit_obj(scope_exit_obj &&movesrc) + : f(std::move(movesrc.f)), shouldexec(movesrc.shouldexec) { + movesrc.shouldexec = false; + } + + ~scope_exit_obj() { + exec(); + } + + void exec() { + if (shouldexec) { + f(); + shouldexec = false; + } + } + + void cancel() { + shouldexec = false; + } +}; + +template +scope_exit_obj::type> scope_guard(T &&func) { + return scope_exit_obj::type>(std::forward(func)); +} + +#endif /* SCOPE_H */ diff --git a/src/screenshot.cpp b/src/screenshot.cpp index a24cc6b211..700a065669 100644 --- a/src/screenshot.cpp +++ b/src/screenshot.cpp @@ -71,23 +71,16 @@ struct ScreenshotFormat { /************************************************* **** SCREENSHOT CODE FOR WINDOWS BITMAP (.BMP) *************************************************/ -#if defined(_MSC_VER) || defined(__WATCOMC__) -#pragma pack(push, 1) -#endif /** BMP File Header (stored in little endian) */ -struct BitmapFileHeader { +PACK(struct BitmapFileHeader { uint16 type; uint32 size; uint32 reserved; uint32 off_bits; -} GCC_PACK; +}); assert_compile(sizeof(BitmapFileHeader) == 14); -#if defined(_MSC_VER) || defined(__WATCOMC__) -#pragma pack(pop) -#endif - /** BMP Info Header (stored in little endian) */ struct BitmapInfoHeader { uint32 size; @@ -715,7 +708,7 @@ static bool MakeSmallScreenshot(bool crashlog) /** * Configure a ViewPort for rendering (a part of) the map into a screenshot. * @param t Screenshot type - * @param [out] vp Result viewport + * @param[out] vp Result viewport */ void SetupScreenshotViewport(ScreenshotType t, ViewPort *vp) { @@ -771,7 +764,7 @@ static bool MakeLargeWorldScreenshot(ScreenshotType t) /** * Callback for generating a heightmap. Supports 8bpp grayscale only. * @param userdata Pointer to user data. - * @param buf Destination buffer. + * @param buffer Destination buffer. * @param y Line number of the first line to write. * @param pitch Number of pixels to write (1 byte for 8bpp, 4 bytes for 32bpp). @see Colour * @param n Number of lines to write. diff --git a/src/script/api/ai/ai_airport.hpp.sq b/src/script/api/ai/ai_airport.hpp.sq index 63ee130981..89e7ba1258 100644 --- a/src/script/api/ai/ai_airport.hpp.sq +++ b/src/script/api/ai/ai_airport.hpp.sq @@ -52,6 +52,7 @@ void SQAIAirport_Register(Squirrel *engine) SQAIAirport.DefSQStaticMethod(engine, &ScriptAirport::GetNoiseLevelIncrease, "GetNoiseLevelIncrease", 3, ".ii"); SQAIAirport.DefSQStaticMethod(engine, &ScriptAirport::GetNearestTown, "GetNearestTown", 3, ".ii"); SQAIAirport.DefSQStaticMethod(engine, &ScriptAirport::GetMaintenanceCostFactor, "GetMaintenanceCostFactor", 2, ".i"); + SQAIAirport.DefSQStaticMethod(engine, &ScriptAirport::GetMonthlyMaintenanceCost, "GetMonthlyMaintenanceCost", 2, ".i"); SQAIAirport.PostRegister(engine); } diff --git a/src/script/api/ai/ai_company.hpp.sq b/src/script/api/ai/ai_company.hpp.sq index 76cc18e3a5..7ed55d97b6 100644 --- a/src/script/api/ai/ai_company.hpp.sq +++ b/src/script/api/ai/ai_company.hpp.sq @@ -21,15 +21,16 @@ void SQAICompany_Register(Squirrel *engine) SQAICompany.PreRegister(engine); SQAICompany.AddConstructor(engine, "x"); - SQAICompany.DefSQConst(engine, ScriptCompany::CURRENT_QUARTER, "CURRENT_QUARTER"); - SQAICompany.DefSQConst(engine, ScriptCompany::EARLIEST_QUARTER, "EARLIEST_QUARTER"); - SQAICompany.DefSQConst(engine, ScriptCompany::COMPANY_FIRST, "COMPANY_FIRST"); - SQAICompany.DefSQConst(engine, ScriptCompany::COMPANY_LAST, "COMPANY_LAST"); - SQAICompany.DefSQConst(engine, ScriptCompany::COMPANY_INVALID, "COMPANY_INVALID"); - SQAICompany.DefSQConst(engine, ScriptCompany::COMPANY_SELF, "COMPANY_SELF"); - SQAICompany.DefSQConst(engine, ScriptCompany::GENDER_MALE, "GENDER_MALE"); - SQAICompany.DefSQConst(engine, ScriptCompany::GENDER_FEMALE, "GENDER_FEMALE"); - SQAICompany.DefSQConst(engine, ScriptCompany::GENDER_INVALID, "GENDER_INVALID"); + SQAICompany.DefSQConst(engine, ScriptCompany::CURRENT_QUARTER, "CURRENT_QUARTER"); + SQAICompany.DefSQConst(engine, ScriptCompany::EARLIEST_QUARTER, "EARLIEST_QUARTER"); + SQAICompany.DefSQConst(engine, ScriptCompany::COMPANY_FIRST, "COMPANY_FIRST"); + SQAICompany.DefSQConst(engine, ScriptCompany::COMPANY_LAST, "COMPANY_LAST"); + SQAICompany.DefSQConst(engine, ScriptCompany::COMPANY_INVALID, "COMPANY_INVALID"); + SQAICompany.DefSQConst(engine, ScriptCompany::COMPANY_SELF, "COMPANY_SELF"); + SQAICompany.DefSQConst(engine, ScriptCompany::COMPANY_SPECTATOR, "COMPANY_SPECTATOR"); + SQAICompany.DefSQConst(engine, ScriptCompany::GENDER_MALE, "GENDER_MALE"); + SQAICompany.DefSQConst(engine, ScriptCompany::GENDER_FEMALE, "GENDER_FEMALE"); + SQAICompany.DefSQConst(engine, ScriptCompany::GENDER_INVALID, "GENDER_INVALID"); SQAICompany.DefSQStaticMethod(engine, &ScriptCompany::ResolveCompanyID, "ResolveCompanyID", 2, ".i"); SQAICompany.DefSQStaticMethod(engine, &ScriptCompany::IsMine, "IsMine", 2, ".i"); diff --git a/src/script/api/ai/ai_order.hpp.sq b/src/script/api/ai/ai_order.hpp.sq index 71cc8cfe90..ab25e4810d 100644 --- a/src/script/api/ai/ai_order.hpp.sq +++ b/src/script/api/ai/ai_order.hpp.sq @@ -44,6 +44,7 @@ void SQAIOrder_Register(Squirrel *engine) SQAIOrder.DefSQConst(engine, ScriptOrder::OF_INVALID, "OF_INVALID"); SQAIOrder.DefSQConst(engine, ScriptOrder::OC_LOAD_PERCENTAGE, "OC_LOAD_PERCENTAGE"); SQAIOrder.DefSQConst(engine, ScriptOrder::OC_RELIABILITY, "OC_RELIABILITY"); + SQAIOrder.DefSQConst(engine, ScriptOrder::OC_MAX_RELIABILITY, "OC_MAX_RELIABILITY"); SQAIOrder.DefSQConst(engine, ScriptOrder::OC_MAX_SPEED, "OC_MAX_SPEED"); SQAIOrder.DefSQConst(engine, ScriptOrder::OC_AGE, "OC_AGE"); SQAIOrder.DefSQConst(engine, ScriptOrder::OC_REQUIRES_SERVICE, "OC_REQUIRES_SERVICE"); diff --git a/src/script/api/ai/ai_station.hpp.sq b/src/script/api/ai/ai_station.hpp.sq index af7012d354..1850c1e740 100644 --- a/src/script/api/ai/ai_station.hpp.sq +++ b/src/script/api/ai/ai_station.hpp.sq @@ -33,7 +33,6 @@ void SQAIStation_Register(Squirrel *engine) SQAIStation.DefSQConst(engine, ScriptStation::STATION_ANY, "STATION_ANY"); ScriptError::RegisterErrorMap(STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT, ScriptStation::ERR_STATION_TOO_CLOSE_TO_ANOTHER_STATION); - ScriptError::RegisterErrorMap(STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION, ScriptStation::ERR_STATION_TOO_CLOSE_TO_ANOTHER_STATION); ScriptError::RegisterErrorMap(STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK, ScriptStation::ERR_STATION_TOO_CLOSE_TO_ANOTHER_STATION); ScriptError::RegisterErrorMap(STR_ERROR_TOO_MANY_STATIONS_LOADING, ScriptStation::ERR_STATION_TOO_MANY_STATIONS); ScriptError::RegisterErrorMap(STR_ERROR_TOO_MANY_TRUCK_STOPS, ScriptStation::ERR_STATION_TOO_MANY_STATIONS); diff --git a/src/script/api/ai_changelog.hpp b/src/script/api/ai_changelog.hpp index 83de91171e..03e9831a11 100644 --- a/src/script/api/ai_changelog.hpp +++ b/src/script/api/ai_changelog.hpp @@ -15,19 +15,25 @@ * functions may still be available if you return an older API version * in GetAPIVersion() in info.nut. * - * \b 1.6.0 + * \b 1.9.0 * - * 1.6.0 is not yet released. The following changes are not set in stone yet. + * 1.9.0 is not yet released. The following changes are not set in stone yet. + * API additions: + * \li AIAirport::GetMonthlyMaintenanceCost * - * \b 1.5.3 + * \b 1.8.0 * * No changes * - * \b 1.5.2 + * \b 1.7.0 - 1.7.2 * * No changes * - * \b 1.5.1 + * \b 1.6.1 - 1.6.0 + * + * No changes + * + * \b 1.5.3 - 1.5.1 * * No changes * @@ -49,20 +55,7 @@ * \li AIStationList_CargoWaitingFromByVia * \li AIStationList_CargoWaitingViaByFrom * - * \b 1.4.4 - * - * No changes - * - * \b 1.4.3 - * - * No changes - * - * \b 1.4.2 - * - * No changes - * - * \b 1.4.1 - * + * \b 1.4.4 - 1.4.1 * No changes * * \b 1.4.0 @@ -83,11 +76,7 @@ * \li AIStation::GetCargoRating does return -1 for cargo-station combinations that * do not have a rating yet instead of returning 69. * - * \b 1.3.3 - * - * No changes - * - * \b 1.3.2 + * \b 1.3.3 - 1.3.2 * * No changes * @@ -106,15 +95,7 @@ * \li AIStation::OpenCloseAirport * \li AIController::Break * - * \b 1.2.3 - * - * No changes - * - * \b 1.2.2 - * - * No changes - * - * \b 1.2.1 + * \b 1.2.3 - 1.2.1 * * No changes * @@ -181,15 +162,7 @@ * API additions: * \li AIVehicle::ERR_VEHICLE_TOO_LONG in case vehicle length limit is reached. * - * \b 1.1.3 - * - * No changes - * - * \b 1.1.2 - * - * No changes - * - * \b 1.1.1 + * \b 1.1.3 - 1.1.1 * * No changes * @@ -220,11 +193,7 @@ * \li AIRoad::BuildDriveThroughRoadStation now allows overbuilding. * \li AIRoad::BuildRoadStation now allows overbuilding. * - * \b 1.0.5 - * - * No changes - * - * \b 1.0.4 + * \b 1.0.5 - 1.0.4 * * No changes * @@ -338,11 +307,7 @@ * station orders for buoys one has to use waypoint orders. * \li Autoreplaces can now also be set for the default group via AIGroup. * - * \b 0.7.5 - * - * No changes - * - * \b 0.7.4 + * \b 0.7.5 - 0.7.4 * * No changes * diff --git a/src/script/api/game/game_airport.hpp.sq b/src/script/api/game/game_airport.hpp.sq index cfa99ba377..d8f3a2a64c 100644 --- a/src/script/api/game/game_airport.hpp.sq +++ b/src/script/api/game/game_airport.hpp.sq @@ -52,6 +52,7 @@ void SQGSAirport_Register(Squirrel *engine) SQGSAirport.DefSQStaticMethod(engine, &ScriptAirport::GetNoiseLevelIncrease, "GetNoiseLevelIncrease", 3, ".ii"); SQGSAirport.DefSQStaticMethod(engine, &ScriptAirport::GetNearestTown, "GetNearestTown", 3, ".ii"); SQGSAirport.DefSQStaticMethod(engine, &ScriptAirport::GetMaintenanceCostFactor, "GetMaintenanceCostFactor", 2, ".i"); + SQGSAirport.DefSQStaticMethod(engine, &ScriptAirport::GetMonthlyMaintenanceCost, "GetMonthlyMaintenanceCost", 2, ".i"); SQGSAirport.PostRegister(engine); } diff --git a/src/script/api/game/game_client.hpp.sq b/src/script/api/game/game_client.hpp.sq new file mode 100644 index 0000000000..b4230a6d05 --- /dev/null +++ b/src/script/api/game/game_client.hpp.sq @@ -0,0 +1,34 @@ +/* $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 . + */ + +/* THIS FILE IS AUTO-GENERATED; PLEASE DO NOT ALTER MANUALLY */ + +#include "../script_client.hpp" +#include "../template/template_client.hpp.sq" + + +template <> const char *GetClassName() { return "GSClient"; } + +void SQGSClient_Register(Squirrel *engine) +{ + DefSQClass SQGSClient("GSClient"); + SQGSClient.PreRegister(engine); + SQGSClient.AddConstructor(engine, "x"); + + SQGSClient.DefSQConst(engine, ScriptClient::CLIENT_INVALID, "CLIENT_INVALID"); + SQGSClient.DefSQConst(engine, ScriptClient::CLIENT_SERVER, "CLIENT_SERVER"); + SQGSClient.DefSQConst(engine, ScriptClient::CLIENT_FIRST, "CLIENT_FIRST"); + + SQGSClient.DefSQStaticMethod(engine, &ScriptClient::ResolveClientID, "ResolveClientID", 2, ".i"); + SQGSClient.DefSQStaticMethod(engine, &ScriptClient::GetName, "GetName", 2, ".i"); + SQGSClient.DefSQStaticMethod(engine, &ScriptClient::GetCompany, "GetCompany", 2, ".i"); + SQGSClient.DefSQStaticMethod(engine, &ScriptClient::GetJoinDate, "GetJoinDate", 2, ".i"); + + SQGSClient.PostRegister(engine); +} diff --git a/src/script/api/game/game_clientlist.hpp.sq b/src/script/api/game/game_clientlist.hpp.sq new file mode 100644 index 0000000000..ef02586474 --- /dev/null +++ b/src/script/api/game/game_clientlist.hpp.sq @@ -0,0 +1,37 @@ +/* $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 . + */ + +/* THIS FILE IS AUTO-GENERATED; PLEASE DO NOT ALTER MANUALLY */ + +#include "../script_clientlist.hpp" +#include "../template/template_clientlist.hpp.sq" + + +template <> const char *GetClassName() { return "GSClientList"; } + +void SQGSClientList_Register(Squirrel *engine) +{ + DefSQClass SQGSClientList("GSClientList"); + SQGSClientList.PreRegister(engine, "GSList"); + SQGSClientList.AddConstructor(engine, "x"); + + SQGSClientList.PostRegister(engine); +} + + +template <> const char *GetClassName() { return "GSClientList_Company"; } + +void SQGSClientList_Company_Register(Squirrel *engine) +{ + DefSQClass SQGSClientList_Company("GSClientList_Company"); + SQGSClientList_Company.PreRegister(engine, "GSList"); + SQGSClientList_Company.AddConstructor(engine, "xi"); + + SQGSClientList_Company.PostRegister(engine); +} diff --git a/src/script/api/game/game_company.hpp.sq b/src/script/api/game/game_company.hpp.sq index 56917a5b21..29476fc8aa 100644 --- a/src/script/api/game/game_company.hpp.sq +++ b/src/script/api/game/game_company.hpp.sq @@ -27,6 +27,7 @@ void SQGSCompany_Register(Squirrel *engine) SQGSCompany.DefSQConst(engine, ScriptCompany::COMPANY_LAST, "COMPANY_LAST"); SQGSCompany.DefSQConst(engine, ScriptCompany::COMPANY_INVALID, "COMPANY_INVALID"); SQGSCompany.DefSQConst(engine, ScriptCompany::COMPANY_SELF, "COMPANY_SELF"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COMPANY_SPECTATOR, "COMPANY_SPECTATOR"); SQGSCompany.DefSQConst(engine, ScriptCompany::GENDER_MALE, "GENDER_MALE"); SQGSCompany.DefSQConst(engine, ScriptCompany::GENDER_FEMALE, "GENDER_FEMALE"); SQGSCompany.DefSQConst(engine, ScriptCompany::GENDER_INVALID, "GENDER_INVALID"); diff --git a/src/script/api/game/game_goal.hpp.sq b/src/script/api/game/game_goal.hpp.sq index 7d8a3bf5e7..4cf15b3fc4 100644 --- a/src/script/api/game/game_goal.hpp.sq +++ b/src/script/api/game/game_goal.hpp.sq @@ -51,15 +51,16 @@ void SQGSGoal_Register(Squirrel *engine) SQGSGoal.DefSQConst(engine, ScriptGoal::BUTTON_SURRENDER, "BUTTON_SURRENDER"); SQGSGoal.DefSQConst(engine, ScriptGoal::BUTTON_CLOSE, "BUTTON_CLOSE"); - SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::IsValidGoal, "IsValidGoal", 2, ".i"); - SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::New, "New", 5, ".i.ii"); - SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::Remove, "Remove", 2, ".i"); - SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::SetText, "SetText", 3, ".i."); - SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::SetProgress, "SetProgress", 3, ".i."); - SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::SetCompleted, "SetCompleted", 3, ".ib"); - SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::IsCompleted, "IsCompleted", 2, ".i"); - SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::Question, "Question", 6, ".ii.ii"); - SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::CloseQuestion, "CloseQuestion", 2, ".i"); + SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::IsValidGoal, "IsValidGoal", 2, ".i"); + SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::New, "New", 5, ".i.ii"); + SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::Remove, "Remove", 2, ".i"); + SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::SetText, "SetText", 3, ".i."); + SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::SetProgress, "SetProgress", 3, ".i."); + SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::SetCompleted, "SetCompleted", 3, ".ib"); + SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::IsCompleted, "IsCompleted", 2, ".i"); + SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::Question, "Question", 6, ".ii.ii"); + SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::QuestionClient, "QuestionClient", 6, ".ii.ii"); + SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::CloseQuestion, "CloseQuestion", 2, ".i"); SQGSGoal.PostRegister(engine); } diff --git a/src/script/api/game/game_order.hpp.sq b/src/script/api/game/game_order.hpp.sq index f95dce925a..e2126c603d 100644 --- a/src/script/api/game/game_order.hpp.sq +++ b/src/script/api/game/game_order.hpp.sq @@ -44,6 +44,7 @@ void SQGSOrder_Register(Squirrel *engine) SQGSOrder.DefSQConst(engine, ScriptOrder::OF_INVALID, "OF_INVALID"); SQGSOrder.DefSQConst(engine, ScriptOrder::OC_LOAD_PERCENTAGE, "OC_LOAD_PERCENTAGE"); SQGSOrder.DefSQConst(engine, ScriptOrder::OC_RELIABILITY, "OC_RELIABILITY"); + SQGSOrder.DefSQConst(engine, ScriptOrder::OC_MAX_RELIABILITY, "OC_MAX_RELIABILITY"); SQGSOrder.DefSQConst(engine, ScriptOrder::OC_MAX_SPEED, "OC_MAX_SPEED"); SQGSOrder.DefSQConst(engine, ScriptOrder::OC_AGE, "OC_AGE"); SQGSOrder.DefSQConst(engine, ScriptOrder::OC_REQUIRES_SERVICE, "OC_REQUIRES_SERVICE"); diff --git a/src/script/api/game/game_station.hpp.sq b/src/script/api/game/game_station.hpp.sq index e3a7425caa..4c2f63b384 100644 --- a/src/script/api/game/game_station.hpp.sq +++ b/src/script/api/game/game_station.hpp.sq @@ -33,7 +33,6 @@ void SQGSStation_Register(Squirrel *engine) SQGSStation.DefSQConst(engine, ScriptStation::STATION_ANY, "STATION_ANY"); ScriptError::RegisterErrorMap(STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT, ScriptStation::ERR_STATION_TOO_CLOSE_TO_ANOTHER_STATION); - ScriptError::RegisterErrorMap(STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION, ScriptStation::ERR_STATION_TOO_CLOSE_TO_ANOTHER_STATION); ScriptError::RegisterErrorMap(STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK, ScriptStation::ERR_STATION_TOO_CLOSE_TO_ANOTHER_STATION); ScriptError::RegisterErrorMap(STR_ERROR_TOO_MANY_STATIONS_LOADING, ScriptStation::ERR_STATION_TOO_MANY_STATIONS); ScriptError::RegisterErrorMap(STR_ERROR_TOO_MANY_TRUCK_STOPS, ScriptStation::ERR_STATION_TOO_MANY_STATIONS); diff --git a/src/script/api/game/game_viewport.hpp.sq b/src/script/api/game/game_viewport.hpp.sq index d313f0d755..357357ae39 100644 --- a/src/script/api/game/game_viewport.hpp.sq +++ b/src/script/api/game/game_viewport.hpp.sq @@ -21,7 +21,10 @@ void SQGSViewport_Register(Squirrel *engine) SQGSViewport.PreRegister(engine); SQGSViewport.AddConstructor(engine, "x"); - SQGSViewport.DefSQStaticMethod(engine, &ScriptViewport::ScrollTo, "ScrollTo", 2, ".i"); + SQGSViewport.DefSQStaticMethod(engine, &ScriptViewport::ScrollTo, "ScrollTo", 2, ".i"); + SQGSViewport.DefSQStaticMethod(engine, &ScriptViewport::ScrollEveryoneTo, "ScrollEveryoneTo", 2, ".i"); + SQGSViewport.DefSQStaticMethod(engine, &ScriptViewport::ScrollCompanyClientsTo, "ScrollCompanyClientsTo", 3, ".ii"); + SQGSViewport.DefSQStaticMethod(engine, &ScriptViewport::ScrollClientTo, "ScrollClientTo", 3, ".ii"); SQGSViewport.PostRegister(engine); } diff --git a/src/script/api/game/game_window.hpp.sq b/src/script/api/game/game_window.hpp.sq index 23627ca665..9fc9526cc2 100644 --- a/src/script/api/game/game_window.hpp.sq +++ b/src/script/api/game/game_window.hpp.sq @@ -138,6 +138,8 @@ void SQGSWindow_Register(Squirrel *engine) SQGSWindow.DefSQConst(engine, ScriptWindow::WC_SPRITE_ALIGNER, "WC_SPRITE_ALIGNER"); SQGSWindow.DefSQConst(engine, ScriptWindow::WC_LINKGRAPH_LEGEND, "WC_LINKGRAPH_LEGEND"); SQGSWindow.DefSQConst(engine, ScriptWindow::WC_SAVE_PRESET, "WC_SAVE_PRESET"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WC_FRAMERATE_DISPLAY, "WC_FRAMERATE_DISPLAY"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WC_FRAMETIME_GRAPH, "WC_FRAMETIME_GRAPH"); SQGSWindow.DefSQConst(engine, ScriptWindow::WC_INVALID, "WC_INVALID"); SQGSWindow.DefSQConst(engine, ScriptWindow::TC_BLUE, "TC_BLUE"); SQGSWindow.DefSQConst(engine, ScriptWindow::TC_SILVER, "TC_SILVER"); @@ -225,10 +227,8 @@ void SQGSWindow_Register(Squirrel *engine) SQGSWindow.DefSQConst(engine, ScriptWindow::WID_RV_START_REPLACE, "WID_RV_START_REPLACE"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_RV_INFO_TAB, "WID_RV_INFO_TAB"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_RV_STOP_REPLACE, "WID_RV_STOP_REPLACE"); - SQGSWindow.DefSQConst(engine, ScriptWindow::WID_RV_TRAIN_ENGINEWAGON_TOGGLE, "WID_RV_TRAIN_ENGINEWAGON_TOGGLE"); - SQGSWindow.DefSQConst(engine, ScriptWindow::WID_RV_TRAIN_FLUFF_LEFT, "WID_RV_TRAIN_FLUFF_LEFT"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_RV_TRAIN_ENGINEWAGON_DROPDOWN, "WID_RV_TRAIN_ENGINEWAGON_DROPDOWN"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_RV_TRAIN_RAILTYPE_DROPDOWN, "WID_RV_TRAIN_RAILTYPE_DROPDOWN"); - SQGSWindow.DefSQConst(engine, ScriptWindow::WID_RV_TRAIN_FLUFF_RIGHT, "WID_RV_TRAIN_FLUFF_RIGHT"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_RV_TRAIN_WAGONREMOVE_TOGGLE, "WID_RV_TRAIN_WAGONREMOVE_TOGGLE"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_BB_BACKGROUND, "WID_BB_BACKGROUND"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_BAFD_QUESTION, "WID_BAFD_QUESTION"); @@ -438,6 +438,7 @@ void SQGSWindow_Register(Squirrel *engine) SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SL_CAPTION, "WID_SL_CAPTION"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SL_SORT_BYNAME, "WID_SL_SORT_BYNAME"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SL_SORT_BYDATE, "WID_SL_SORT_BYDATE"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SL_FILTER, "WID_SL_FILTER"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SL_BACKGROUND, "WID_SL_BACKGROUND"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SL_FILE_BACKGROUND, "WID_SL_FILE_BACKGROUND"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SL_HOME_BUTTON, "WID_SL_HOME_BUTTON"); @@ -452,6 +453,16 @@ void SQGSWindow_Register(Squirrel *engine) SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SL_NEWGRF_INFO, "WID_SL_NEWGRF_INFO"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SL_LOAD_BUTTON, "WID_SL_LOAD_BUTTON"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SL_MISSING_NEWGRFS, "WID_SL_MISSING_NEWGRFS"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_FRW_CAPTION, "WID_FRW_CAPTION"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_FRW_RATE_GAMELOOP, "WID_FRW_RATE_GAMELOOP"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_FRW_RATE_DRAWING, "WID_FRW_RATE_DRAWING"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_FRW_RATE_FACTOR, "WID_FRW_RATE_FACTOR"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_FRW_INFO_DATA_POINTS, "WID_FRW_INFO_DATA_POINTS"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_FRW_TIMES_NAMES, "WID_FRW_TIMES_NAMES"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_FRW_TIMES_CURRENT, "WID_FRW_TIMES_CURRENT"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_FRW_TIMES_AVERAGE, "WID_FRW_TIMES_AVERAGE"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_FGW_CAPTION, "WID_FGW_CAPTION"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_FGW_GRAPH, "WID_FGW_GRAPH"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_GL_TEMPERATE, "WID_GL_TEMPERATE"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_GL_ARCTIC, "WID_GL_ARCTIC"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_GL_TROPICAL, "WID_GL_TROPICAL"); @@ -553,6 +564,7 @@ void SQGSWindow_Register(Squirrel *engine) SQGSWindow.DefSQConst(engine, ScriptWindow::WID_GL_DELETE_GROUP, "WID_GL_DELETE_GROUP"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_GL_RENAME_GROUP, "WID_GL_RENAME_GROUP"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_GL_REPLACE_PROTECTION, "WID_GL_REPLACE_PROTECTION"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_GL_INFO, "WID_GL_INFO"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_H_BACKGROUND, "WID_H_BACKGROUND"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_DPI_MATRIX_WIDGET, "WID_DPI_MATRIX_WIDGET"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_DPI_SCROLLBAR, "WID_DPI_SCROLLBAR"); @@ -584,6 +596,8 @@ void SQGSWindow_Register(Squirrel *engine) SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SGI_ARCTIC_LANDSCAPE, "WID_SGI_ARCTIC_LANDSCAPE"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SGI_TROPIC_LANDSCAPE, "WID_SGI_TROPIC_LANDSCAPE"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SGI_TOYLAND_LANDSCAPE, "WID_SGI_TOYLAND_LANDSCAPE"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SGI_BASESET_SELECTION, "WID_SGI_BASESET_SELECTION"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SGI_BASESET, "WID_SGI_BASESET"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SGI_TRANSLATION_SELECTION, "WID_SGI_TRANSLATION_SELECTION"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SGI_TRANSLATION, "WID_SGI_TRANSLATION"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_SGI_OPTIONS, "WID_SGI_OPTIONS"); @@ -626,9 +640,11 @@ void SQGSWindow_Register(Squirrel *engine) SQGSWindow.DefSQConst(engine, ScriptWindow::WID_TF_BACKGROUND, "WID_TF_BACKGROUND"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_TF_VSCROLLBAR, "WID_TF_VSCROLLBAR"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_TF_HSCROLLBAR, "WID_TF_HSCROLLBAR"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_MTS_CAPTION, "WID_MTS_CAPTION"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_MTS_LIST_LEFT, "WID_MTS_LIST_LEFT"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_MTS_PLAYLIST, "WID_MTS_PLAYLIST"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_MTS_LIST_RIGHT, "WID_MTS_LIST_RIGHT"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_MTS_MUSICSET, "WID_MTS_MUSICSET"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_MTS_ALL, "WID_MTS_ALL"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_MTS_OLD, "WID_MTS_OLD"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_MTS_NEW, "WID_MTS_NEW"); @@ -1180,9 +1196,10 @@ void SQGSWindow_Register(Squirrel *engine) SQGSWindow.DefSQConst(engine, ScriptWindow::WID_TN_TRAINS, "WID_TN_TRAINS"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_TN_ROADVEHS, "WID_TN_ROADVEHS"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_TN_SHIPS, "WID_TN_SHIPS"); - SQGSWindow.DefSQConst(engine, ScriptWindow::WID_TN_AIRCRAFTS, "WID_TN_AIRCRAFTS"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_TN_AIRCRAFT, "WID_TN_AIRCRAFT"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_TN_ZOOM_IN, "WID_TN_ZOOM_IN"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_TN_ZOOM_OUT, "WID_TN_ZOOM_OUT"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_TN_BUILDING_TOOLS_START, "WID_TN_BUILDING_TOOLS_START"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_TN_RAILS, "WID_TN_RAILS"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_TN_ROADS, "WID_TN_ROADS"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_TN_WATER, "WID_TN_WATER"); diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp index 8cb58e3d7c..7aad75b442 100644 --- a/src/script/api/game_changelog.hpp +++ b/src/script/api/game_changelog.hpp @@ -15,19 +15,32 @@ * functions may still be available if you return an older API version * in GetAPIVersion() in info.nut. * - * \b 1.6.0 + * \b 1.9.0 * - * 1.6.0 is not yet released. The following changes are not set in stone yet. + * 1.9.0 is not yet released. The following changes are not set in stone yet. + * API additions: + * \li GSAirport::GetMonthlyMaintenanceCost + * \li GSClient + * \li GSClientList + * \li GSClientList_Company + * \li GSViewport::ScrollEveryoneTo + * \li GSViewport::ScrollCompanyClientsTo + * \li GSViewport::ScrollClientTo + * \li GSGoal::QuestionClient * - * \b 1.5.3 + * \b 1.8.0 * * No changes * - * \b 1.5.2 + * \b 1.7.0 - 1.7.2 * * No changes * - * \b 1.5.1 + * \b 1.6.1 - 1.6.0 + * + * No changes + * + * \b 1.5.3 - 1.5.1 * * No changes * @@ -54,11 +67,7 @@ * industry, or town. The user can click at the news message to jump to the * referred location. * - * \b 1.4.4 - * - * No changes - * - * \b 1.4.3 + * \b 1.4.4 - 1.4.3 * * No changes * @@ -102,11 +111,7 @@ * \li GSStation::GetCargoRating does return -1 for cargo-station combinations that * do not have a rating yet instead of returning 69. * - * \b 1.3.3 - * - * No changes - * - * \b 1.3.2 + * \b 1.3.3 - 1.3.2 * * No changes * @@ -132,15 +137,7 @@ * Other changes: * \li Company specific goals are now removed when a company goes bankrupt or is taken over. * - * \b 1.2.3 - * - * No changes - * - * \b 1.2.2 - * - * No changes - * - * \b 1.2.1 + * \b 1.2.3 - 1.2.1 * * No changes * diff --git a/src/script/api/script_airport.cpp b/src/script/api/script_airport.cpp index edb912609e..8e19d257df 100644 --- a/src/script/api/script_airport.cpp +++ b/src/script/api/script_airport.cpp @@ -163,3 +163,10 @@ return AirportSpec::Get(type)->maintenance_cost; } + +/* static */ Money ScriptAirport::GetMonthlyMaintenanceCost(AirportType type) +{ + if (!IsAirportInformationAvailable(type)) return -1; + + return (int64)GetMaintenanceCostFactor(type) * _price[PR_INFRASTRUCTURE_AIRPORT] >> 3; +} diff --git a/src/script/api/script_airport.hpp b/src/script/api/script_airport.hpp index e4c0a217d2..6073a2bdd6 100644 --- a/src/script/api/script_airport.hpp +++ b/src/script/api/script_airport.hpp @@ -201,6 +201,14 @@ public: * @return Maintenance cost factor of the airport type. */ static uint16 GetMaintenanceCostFactor(AirportType type); + + /** + * Get the monthly maintenance cost of an airport type. + * @param type The airport type to get the monthly maintenance cost of. + * @pre IsAirportInformationAvailable(type) + * @return Monthly maintenance cost of the airport type. + */ + static Money GetMonthlyMaintenanceCost(AirportType type); }; #endif /* SCRIPT_AIRPORT_HPP */ diff --git a/src/script/api/script_client.cpp b/src/script/api/script_client.cpp new file mode 100644 index 0000000000..771a0ae4ec --- /dev/null +++ b/src/script/api/script_client.cpp @@ -0,0 +1,74 @@ +/* $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 script_client.cpp Implementation of ScriptClient. */ + +#include "../../stdafx.h" +#include "script_client.hpp" +#include "../../network/network.h" +#include "../../network/network_base.h" + +#include "../../safeguards.h" + +#ifdef ENABLE_NETWORK +/** + * Finds NetworkClientInfo given client-identifier, + * is used by other methods to resolve client-identifier. + * @param client The client to get info structure for + * @return A pointer to corresponding CI struct or NULL when not found. + */ +static NetworkClientInfo *FindClientInfo(ScriptClient::ClientID client) +{ + if (client == ScriptClient::CLIENT_INVALID) return NULL; + if (!_networking) return NULL; + return NetworkClientInfo::GetByClientID((::ClientID)client); +} +#endif + +/* static */ ScriptClient::ClientID ScriptClient::ResolveClientID(ScriptClient::ClientID client) +{ +#ifdef ENABLE_NETWORK + return (FindClientInfo(client) == NULL ? ScriptClient::CLIENT_INVALID : client); +#else + return CLIENT_INVALID; +#endif +} + +/* static */ char *ScriptClient::GetName(ScriptClient::ClientID client) +{ +#ifdef ENABLE_NETWORK + NetworkClientInfo *ci = FindClientInfo(client); + if (ci == NULL) return NULL; + return stredup(ci->client_name); +#else + return NULL; +#endif +} + +/* static */ ScriptCompany::CompanyID ScriptClient::GetCompany(ScriptClient::ClientID client) +{ +#ifdef ENABLE_NETWORK + NetworkClientInfo *ci = FindClientInfo(client); + if (ci == NULL) return ScriptCompany::COMPANY_INVALID; + return (ScriptCompany::CompanyID)ci->client_playas; +#else + return ScriptCompany::COMPANY_INVALID; +#endif +} + +/* static */ ScriptDate::Date ScriptClient::GetJoinDate(ScriptClient::ClientID client) +{ +#ifdef ENABLE_NETWORK + NetworkClientInfo *ci = FindClientInfo(client); + if (ci == NULL) return ScriptDate::DATE_INVALID; + return (ScriptDate::Date)ci->join_date; +#else + return ScriptDate::DATE_INVALID; +#endif +} diff --git a/src/script/api/script_client.hpp b/src/script/api/script_client.hpp new file mode 100644 index 0000000000..423f134c07 --- /dev/null +++ b/src/script/api/script_client.hpp @@ -0,0 +1,70 @@ +/* $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 script_client.hpp Everything to query a network client's information */ + +#ifndef SCRIPT_CLIENT_HPP +#define SCRIPT_CLIENT_HPP + +#include "script_text.hpp" +#include "script_date.hpp" +#include "script_company.hpp" +#include "../../network/network_type.h" + +/** + * Class that handles all client related functions. + * + * @api game + */ +class ScriptClient : public ScriptObject { +public: + + /** Different constants related to ClientID. */ + enum ClientID { + CLIENT_INVALID = 0, ///< Client is not part of anything + CLIENT_SERVER = 1, ///< Servers always have this ID + CLIENT_FIRST = 2, ///< The first client ID + }; + + /** + * Resolves the given client id to the correct index for the client. + * If the client with the given id does not exist it will + * return CLIENT_INVALID. + * @param client The client id to resolve. + * @return The resolved client id. + */ + static ClientID ResolveClientID(ClientID client); + + /** + * Get the name of the given client. + * @param client The client to get the name for. + * @pre ResolveClientID(client) != CLIENT_INVALID. + * @return The name of the given client. + */ + static char *GetName(ClientID client); + + /** + * Get the company in which the given client is playing. + * @param client The client to get company for. + * @pre ResolveClientID(client) != CLIENT_INVALID. + * @return The company in which client is playing or COMPANY_SPECTATOR. + */ + static ScriptCompany::CompanyID GetCompany(ClientID client); + + /** + * Get the game date when the given client has joined. + * @param client The client to get joining date for. + * @pre ResolveClientID(client) != CLIENT_INVALID. + * @return The date when client has joined. + */ + static ScriptDate::Date GetJoinDate(ClientID client); +}; + + +#endif /* SCRIPT_CLIENT_HPP */ diff --git a/src/script/api/script_clientlist.cpp b/src/script/api/script_clientlist.cpp new file mode 100644 index 0000000000..2f7a19a9ff --- /dev/null +++ b/src/script/api/script_clientlist.cpp @@ -0,0 +1,49 @@ +/* $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 script_clientlist.cpp Implementation of ScriptClientList and friends. */ + +#include "../../stdafx.h" +#include "script_company.hpp" +#include "script_clientlist.hpp" +#include "../../network/network.h" +#include "../../network/network_base.h" + +#include "../../safeguards.h" + +ScriptClientList::ScriptClientList() +{ +#ifdef ENABLE_NETWORK + if (!_networking) return; + NetworkClientInfo *ci; + FOR_ALL_CLIENT_INFOS(ci) { + this->AddItem(ci->client_id); + } +#endif +} + +ScriptClientList_Company::ScriptClientList_Company(ScriptCompany::CompanyID company) +{ +#ifdef ENABLE_NETWORK + if (!_networking) return; + CompanyID c; + if (company == ScriptCompany::COMPANY_SPECTATOR) { + c = ::COMPANY_SPECTATOR; + } else { + company = ScriptCompany::ResolveCompanyID(company); + if (company == ScriptCompany::COMPANY_INVALID) return; + c = (CompanyID)company; + } + + NetworkClientInfo *ci; + FOR_ALL_CLIENT_INFOS(ci) { + if (ci->client_playas == c) this->AddItem(ci->client_id); + } +#endif +} diff --git a/src/script/api/script_clientlist.hpp b/src/script/api/script_clientlist.hpp new file mode 100644 index 0000000000..58d0177b21 --- /dev/null +++ b/src/script/api/script_clientlist.hpp @@ -0,0 +1,42 @@ +/* $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 script_clientlist.hpp List all the TODO. */ + +#ifndef SCRIPT_CLIENTLIST_HPP +#define SCRIPT_CLIENTLIST_HPP + +#include "script_list.hpp" +#include "script_company.hpp" + + +/** + * Creates a list of clients that are currently in game. + * @api game + * @ingroup ScriptList + */ +class ScriptClientList : public ScriptList { +public: + ScriptClientList(); +}; + +/** + * Creates a list of clients that are playing in the company. + * @api game + * @ingroup ScriptList + */ +class ScriptClientList_Company : public ScriptList { +public: + /** + * @param company_id The company to list clients for. + */ + ScriptClientList_Company(ScriptCompany::CompanyID company); +}; + +#endif /* SCRIPT_CIENTLIST_HPP */ diff --git a/src/script/api/script_company.hpp b/src/script/api/script_company.hpp index 4deaeed5e3..dc917500b7 100644 --- a/src/script/api/script_company.hpp +++ b/src/script/api/script_company.hpp @@ -30,12 +30,13 @@ public: /** Different constants related to CompanyID. */ enum CompanyID { /* Note: these values represent part of the in-game Owner enum */ - COMPANY_FIRST = ::COMPANY_FIRST, ///< The first available company. - COMPANY_LAST = ::MAX_COMPANIES, ///< The last available company. + COMPANY_FIRST = ::COMPANY_FIRST, ///< The first available company. + COMPANY_LAST = ::MAX_COMPANIES, ///< The last available company. /* Custom added value, only valid for this API */ - COMPANY_INVALID = -1, ///< An invalid company. - COMPANY_SELF = 254, ///< Constant that gets resolved to the correct company index for your company. + COMPANY_INVALID = -1, ///< An invalid company. + COMPANY_SELF = 254, ///< Constant that gets resolved to the correct company index for your company. + COMPANY_SPECTATOR = 255, ///< Constant indicating that player is spectating (gets resolved to COMPANY_INVALID) }; /** Possible genders for company presidents. */ @@ -54,12 +55,12 @@ public: EXPENSES_NEW_VEHICLES = ::EXPENSES_NEW_VEHICLES, ///< New vehicles. EXPENSES_TRAIN_RUN = ::EXPENSES_TRAIN_RUN, ///< Running costs trains. EXPENSES_ROADVEH_RUN = ::EXPENSES_ROADVEH_RUN, ///< Running costs road vehicles. - EXPENSES_AIRCRAFT_RUN = ::EXPENSES_AIRCRAFT_RUN, ///< Running costs aircrafts. + EXPENSES_AIRCRAFT_RUN = ::EXPENSES_AIRCRAFT_RUN, ///< Running costs aircraft. EXPENSES_SHIP_RUN = ::EXPENSES_SHIP_RUN, ///< Running costs ships. EXPENSES_PROPERTY = ::EXPENSES_PROPERTY, ///< Property costs. EXPENSES_TRAIN_INC = ::EXPENSES_TRAIN_INC, ///< Income from trains. EXPENSES_ROADVEH_INC = ::EXPENSES_ROADVEH_INC, ///< Income from road vehicles. - EXPENSES_AIRCRAFT_INC = ::EXPENSES_AIRCRAFT_INC, ///< Income from aircrafts. + EXPENSES_AIRCRAFT_INC = ::EXPENSES_AIRCRAFT_INC, ///< Income from aircraft. EXPENSES_SHIP_INC = ::EXPENSES_SHIP_INC, ///< Income from ships. EXPENSES_LOAN_INT = ::EXPENSES_LOAN_INT, ///< Interest payments over the loan. EXPENSES_OTHER = ::EXPENSES_OTHER, ///< Other expenses. diff --git a/src/script/api/script_companymode.cpp b/src/script/api/script_companymode.cpp index 1931a5db78..a5d3963a2d 100644 --- a/src/script/api/script_companymode.cpp +++ b/src/script/api/script_companymode.cpp @@ -10,6 +10,7 @@ /** @file script_companymode.cpp Implementation of ScriptCompanyMode. */ #include "../../stdafx.h" +#include "../../company_base.h" #include "script_companymode.hpp" #include "../../safeguards.h" @@ -17,6 +18,7 @@ ScriptCompanyMode::ScriptCompanyMode(int company) { if (company < OWNER_BEGIN || company >= MAX_COMPANIES) company = INVALID_COMPANY; + if (!::Company::IsValidID(company)) company = INVALID_COMPANY; this->last_company = ScriptObject::GetCompany(); ScriptObject::SetCompany((CompanyID)company); diff --git a/src/script/api/script_error.cpp b/src/script/api/script_error.cpp index d30ad9c66d..87d2906c55 100644 --- a/src/script/api/script_error.cpp +++ b/src/script/api/script_error.cpp @@ -13,6 +13,7 @@ #include "script_error.hpp" #include "../../core/bitmath_func.hpp" #include "../../string_func.h" +#include "../../strings_func.h" #include "../../safeguards.h" @@ -31,17 +32,18 @@ ScriptError::ScriptErrorMapString ScriptError::error_map_string = ScriptError::S /* static */ ScriptErrorType ScriptError::StringToError(StringID internal_string_id) { - uint index = GB(internal_string_id, 11, 5); - switch (GB(internal_string_id, 11, 5)) { - case 26: case 28: case 29: case 30: // NewGRF strings. - return ERR_NEWGRF_SUPPLIED_ERROR; + uint index = GetStringIndex(internal_string_id); + switch (GetStringTab(internal_string_id)) { + case TEXT_TAB_NEWGRF_START: + case TEXT_TAB_GAMESCRIPT_START: + return ERR_NEWGRF_SUPPLIED_ERROR; // NewGRF strings. - /* DO NOT SWAP case 14 and 4 because that will break StringToError due - * to the index dependency that relies on FALL THROUGHs. */ - case 14: if (index < 0xE4) break; // Player name - case 4: if (index < 0xC0) break; // Town name - case 15: // Custom name - case 31: // Dynamic strings + case TEXT_TAB_SPECIAL: + if (index < 0xE4) break; // Player name + FALLTHROUGH; + + case TEXT_TAB_TOWN: + if (index < 0xC0) break; // Town name /* These strings are 'random' and have no meaning. * They actually shouldn't even be returned as error messages. */ return ERR_UNKNOWN; diff --git a/src/script/api/script_event_types.hpp b/src/script/api/script_event_types.hpp index 9430168977..f13e588eed 100644 --- a/src/script/api/script_event_types.hpp +++ b/src/script/api/script_event_types.hpp @@ -363,7 +363,7 @@ private: class ScriptEventCompanyAskMerger : public ScriptEvent { public: /** - * @param owner The company that can be bough. + * @param owner The company that can be bought. * @param value The value/costs of buying the company. */ ScriptEventCompanyAskMerger(Owner owner, int32 value) : diff --git a/src/script/api/script_execmode.hpp b/src/script/api/script_execmode.hpp index 84eda5ce26..96d30d1e4a 100644 --- a/src/script/api/script_execmode.hpp +++ b/src/script/api/script_execmode.hpp @@ -47,6 +47,9 @@ public: */ ~ScriptExecMode(); + /** + * @api -all + */ virtual void FinalRelease(); }; diff --git a/src/script/api/script_goal.cpp b/src/script/api/script_goal.cpp index 5153e0ef0e..c183b75834 100644 --- a/src/script/api/script_goal.cpp +++ b/src/script/api/script_goal.cpp @@ -10,6 +10,7 @@ /** @file script_goal.cpp Implementation of ScriptGoal. */ #include "../../stdafx.h" +#include "script_game.hpp" #include "script_goal.hpp" #include "script_error.hpp" #include "script_industry.hpp" @@ -19,6 +20,7 @@ #include "../script_instance.hpp" #include "../../goal_base.h" #include "../../string_func.h" +#include "../../network/network_base.h" #include "../../safeguards.h" @@ -107,7 +109,7 @@ return g != NULL && g->completed; } -/* static */ bool ScriptGoal::Question(uint16 uniqueid, ScriptCompany::CompanyID company, Text *question, QuestionType type, int buttons) +/* static */ bool ScriptGoal::DoQuestion(uint16 uniqueid, uint8 target, bool is_client, Text *question, QuestionType type, int buttons) { CCountedPtr counter(question); @@ -115,15 +117,32 @@ EnforcePrecondition(false, question != NULL); const char *text = question->GetEncodedText(); EnforcePreconditionEncodedText(false, text); - EnforcePrecondition(false, company == ScriptCompany::COMPANY_INVALID || ScriptCompany::ResolveCompanyID(company) != ScriptCompany::COMPANY_INVALID); EnforcePrecondition(false, CountBits(buttons) >= 1 && CountBits(buttons) <= 3); EnforcePrecondition(false, buttons < (1 << ::GOAL_QUESTION_BUTTON_COUNT)); EnforcePrecondition(false, (int)type < ::GOAL_QUESTION_TYPE_COUNT); + return ScriptObject::DoCommand(0, uniqueid | (target << 16) | (type << 24) | (is_client ? (1 << 31) : 0), buttons, CMD_GOAL_QUESTION, text); +} + +/* static */ bool ScriptGoal::Question(uint16 uniqueid, ScriptCompany::CompanyID company, Text *question, QuestionType type, int buttons) +{ + EnforcePrecondition(false, company == ScriptCompany::COMPANY_INVALID || ScriptCompany::ResolveCompanyID(company) != ScriptCompany::COMPANY_INVALID); uint8 c = company; if (company == ScriptCompany::COMPANY_INVALID) c = INVALID_COMPANY; - return ScriptObject::DoCommand(0, uniqueid | (c << 16) | (type << 24), buttons, CMD_GOAL_QUESTION, text); + return DoQuestion(uniqueid, c, false, question, type, buttons); +} + +/* static */ bool ScriptGoal::QuestionClient(uint16 uniqueid, ScriptClient::ClientID client, Text *question, QuestionType type, int buttons) +{ + EnforcePrecondition(false, ScriptGame::IsMultiplayer()); + EnforcePrecondition(false, ScriptClient::ResolveClientID(client) != ScriptClient::CLIENT_INVALID); +#ifdef ENABLE_NETWORK + ClientIndex c = NetworkClientInfo::GetByClientID((::ClientID)client)->index; + return DoQuestion(uniqueid, c, true, question, type, buttons); +#else + return false; +#endif } /* static */ bool ScriptGoal::CloseQuestion(uint16 uniqueid) diff --git a/src/script/api/script_goal.hpp b/src/script/api/script_goal.hpp index a9c7b239d5..f5dfba095f 100644 --- a/src/script/api/script_goal.hpp +++ b/src/script/api/script_goal.hpp @@ -12,6 +12,7 @@ #ifndef SCRIPT_GOAL_HPP #define SCRIPT_GOAL_HPP +#include "script_client.hpp" #include "script_company.hpp" #include "../../goal_type.h" @@ -160,7 +161,7 @@ public: static bool IsCompleted(GoalID goal_id); /** - * Ask a question. + * Ask a question of all players in a company. * @param uniqueid Your unique id to distinguish results of multiple questions in the returning event. * @param company The company to ask the question, or ScriptCompany::COMPANY_INVALID for all. * @param question The question to ask (can be either a raw string, or a ScriptText object). @@ -176,6 +177,24 @@ public: */ static bool Question(uint16 uniqueid, ScriptCompany::CompanyID company, Text *question, QuestionType type, int buttons); + /** + * Ask client a question. + * @param uniqueid Your unique id to distinguish results of multiple questions in the returning event. + * @param client The client to ask the question. + * @param question The question to ask (can be either a raw string, or a ScriptText object). + * @param type The type of question that is being asked. + * @param buttons Any combinations (at least 1, up to 3) of buttons defined in QuestionButton. Like BUTTON_YES + BUTTON_NO. + * @return True if the action succeeded. + * @pre No ScriptCompanyMode may be in scope. + * @pre ScriptGame::IsMultiplayer() + * @pre question != NULL && len(question) != 0. + * @pre ResolveClientID(client) != CLIENT_INVALID. + * @pre CountBits(buttons) >= 1 && CountBits(buttons) <= 3. + * @note Replies to the question are given by you via the event ScriptEvent_GoalQuestionAnswer. + * @note There is no guarantee you ever get a reply on your question. + */ + static bool QuestionClient(uint16 uniqueid, ScriptClient::ClientID client, Text *question, QuestionType type, int buttons); + /** * Close the question on all clients. * @param uniqueid The uniqueid of the question you want to close. @@ -187,6 +206,12 @@ public: * companies, but you are only interested in the reply of the first. */ static bool CloseQuestion(uint16 uniqueid); + +protected: + /** + * Does common checks and asks the question. + */ + static bool DoQuestion(uint16 uniqueid, uint8 target, bool is_client, Text *question, QuestionType type, int buttons); }; #endif /* SCRIPT_GOAL_HPP */ diff --git a/src/script/api/script_list.cpp b/src/script/api/script_list.cpp index bdbc1209bd..d0c72b5bb1 100644 --- a/src/script/api/script_list.cpp +++ b/src/script/api/script_list.cpp @@ -11,6 +11,7 @@ #include "../../stdafx.h" #include "script_list.hpp" +#include "script_controller.hpp" #include "../../debug.h" #include "../../script/squirrel.hpp" @@ -905,6 +906,16 @@ SQInteger ScriptList::Valuate(HSQUIRRELVM vm) } } + /* Kill the script when the valuator call takes way too long. + * Triggered by nesting valuators, which then take billions of iterations. */ + if (ScriptController::GetOpsTillSuspend() < -1000000) { + /* See below for explanation. The extra pop is the return value. */ + sq_pop(vm, nparam + 4); + + ScriptObject::SetAllowDoCommand(backup_allow); + return sq_throwerror(vm, "excessive CPU usage in valuator function"); + } + /* Was something changed? */ if (previous_modification_count != this->modifications) { /* See below for explanation. The extra pop is the return value. */ diff --git a/src/script/api/script_order.cpp b/src/script/api/script_order.cpp index 676262dc77..a1390bf8f5 100644 --- a/src/script/api/script_order.cpp +++ b/src/script/api/script_order.cpp @@ -214,6 +214,7 @@ static int ScriptOrderPositionToRealOrderPosition(VehicleID vehicle_id, ScriptOr switch (condition) { case OC_LOAD_PERCENTAGE: case OC_RELIABILITY: + case OC_MAX_RELIABILITY: case OC_MAX_SPEED: case OC_AGE: case OC_REMAINING_LIFETIME: diff --git a/src/script/api/script_order.hpp b/src/script/api/script_order.hpp index 63089a2bd4..a4f945511e 100644 --- a/src/script/api/script_order.hpp +++ b/src/script/api/script_order.hpp @@ -91,6 +91,7 @@ public: /* Note: these values represent part of the in-game OrderConditionVariable enum */ OC_LOAD_PERCENTAGE = ::OCV_LOAD_PERCENTAGE, ///< Skip based on the amount of load, value is in tons. OC_RELIABILITY = ::OCV_RELIABILITY, ///< Skip based on the reliability, value is percent (0..100). + OC_MAX_RELIABILITY = ::OCV_MAX_RELIABILITY, ///< Skip based on the maximum reliability. Value in percent OC_MAX_SPEED = ::OCV_MAX_SPEED, ///< Skip based on the maximum speed, value is in OpenTTD's internal speed unit, see ScriptEngine::GetMaxSpeed. OC_AGE = ::OCV_AGE, ///< Skip based on the age, value is in years. OC_REQUIRES_SERVICE = ::OCV_REQUIRES_SERVICE, ///< Skip when the vehicle requires service, no value. diff --git a/src/script/api/script_rail.cpp b/src/script/api/script_rail.cpp index af68a3edc8..f7682cfd8f 100644 --- a/src/script/api/script_rail.cpp +++ b/src/script/api/script_rail.cpp @@ -157,7 +157,7 @@ EnforcePrecondition(false, station_id == ScriptStation::STATION_NEW || station_id == ScriptStation::STATION_JOIN_ADJACENT || ScriptStation::IsValidStation(station_id)); uint32 p1 = GetCurrentRailType() | (platform_length << 16) | (num_platforms << 8); - if (direction == RAILTRACK_NW_SE) p1 |= (1 << 4); + if (direction == RAILTRACK_NW_SE) p1 |= (1 << 6); if (station_id != ScriptStation::STATION_JOIN_ADJACENT) p1 |= (1 << 24); return ScriptObject::DoCommand(tile, p1, (ScriptStation::IsValidStation(station_id) ? station_id : INVALID_STATION) << 16, CMD_BUILD_RAIL_STATION); } @@ -176,7 +176,7 @@ EnforcePrecondition(false, goal_industry == ScriptIndustryType::INDUSTRYTYPE_UNKNOWN || goal_industry == ScriptIndustryType::INDUSTRYTYPE_TOWN || ScriptIndustryType::IsValidIndustryType(goal_industry)); uint32 p1 = GetCurrentRailType() | (platform_length << 16) | (num_platforms << 8); - if (direction == RAILTRACK_NW_SE) p1 |= 1 << 4; + if (direction == RAILTRACK_NW_SE) p1 |= 1 << 6; if (station_id != ScriptStation::STATION_JOIN_ADJACENT) p1 |= (1 << 24); const GRFFile *file; @@ -204,7 +204,7 @@ EnforcePrecondition(false, GetRailTracks(tile) == RAILTRACK_NE_SW || GetRailTracks(tile) == RAILTRACK_NW_SE); EnforcePrecondition(false, IsRailTypeAvailable(GetCurrentRailType())); - return ScriptObject::DoCommand(tile, GetCurrentRailType() | (GetRailTracks(tile) == RAILTRACK_NE_SW ? AXIS_X : AXIS_Y) << 4 | 1 << 8 | 1 << 16, STAT_CLASS_WAYP | INVALID_STATION << 16, CMD_BUILD_RAIL_WAYPOINT); + return ScriptObject::DoCommand(tile, GetCurrentRailType() | (GetRailTracks(tile) == RAILTRACK_NE_SW ? AXIS_X : AXIS_Y) << 6 | 1 << 8 | 1 << 16, STAT_CLASS_WAYP | INVALID_STATION << 16, CMD_BUILD_RAIL_WAYPOINT); } /* static */ bool ScriptRail::RemoveRailWaypointTileRectangle(TileIndex tile, TileIndex tile2, bool keep_rail) @@ -244,7 +244,7 @@ EnforcePrecondition(false, KillFirstBit((uint)rail_track) == 0); EnforcePrecondition(false, IsRailTypeAvailable(GetCurrentRailType())); - return ScriptObject::DoCommand(tile, tile, GetCurrentRailType() | (FindFirstTrack((::TrackBits)rail_track) << 4), CMD_BUILD_RAILROAD_TRACK); + return ScriptObject::DoCommand(tile, tile, GetCurrentRailType() | (FindFirstTrack((::TrackBits)rail_track) << 6), CMD_BUILD_RAILROAD_TRACK); } /* static */ bool ScriptRail::RemoveRailTrack(TileIndex tile, RailTrack rail_track) @@ -255,7 +255,7 @@ EnforcePrecondition(false, GetRailTracks(tile) & rail_track); EnforcePrecondition(false, KillFirstBit((uint)rail_track) == 0); - return ScriptObject::DoCommand(tile, tile, FindFirstTrack((::TrackBits)rail_track) << 4, CMD_REMOVE_RAILROAD_TRACK); + return ScriptObject::DoCommand(tile, tile, FindFirstTrack((::TrackBits)rail_track) << 6, CMD_REMOVE_RAILROAD_TRACK); } /* static */ bool ScriptRail::AreTilesConnected(TileIndex from, TileIndex tile, TileIndex to) @@ -288,16 +288,16 @@ static uint32 SimulateDrag(TileIndex from, TileIndex tile, TileIndex *to) int diag_offset = abs(abs((int)::TileX(*to) - (int)::TileX(tile)) - abs((int)::TileY(*to) - (int)::TileY(tile))); uint32 p2 = 0; if (::TileY(from) == ::TileY(*to)) { - p2 |= (TRACK_X << 4); + p2 |= (TRACK_X << 6); *to -= Clamp((int)::TileX(*to) - (int)::TileX(tile), -1, 1); } else if (::TileX(from) == ::TileX(*to)) { - p2 |= (TRACK_Y << 4); + p2 |= (TRACK_Y << 6); *to -= ::MapSizeX() * Clamp((int)::TileY(*to) - (int)::TileY(tile), -1, 1); } else if (::TileY(from) < ::TileY(tile)) { if (::TileX(*to) < ::TileX(tile)) { - p2 |= (TRACK_UPPER << 4); + p2 |= (TRACK_UPPER << 6); } else { - p2 |= (TRACK_LEFT << 4); + p2 |= (TRACK_LEFT << 6); } if (diag_offset != 0) { *to -= Clamp((int)::TileX(*to) - (int)::TileX(tile), -1, 1); @@ -306,9 +306,9 @@ static uint32 SimulateDrag(TileIndex from, TileIndex tile, TileIndex *to) } } else if (::TileY(from) > ::TileY(tile)) { if (::TileX(*to) < ::TileX(tile)) { - p2 |= (TRACK_RIGHT << 4); + p2 |= (TRACK_RIGHT << 6); } else { - p2 |= (TRACK_LOWER << 4); + p2 |= (TRACK_LOWER << 6); } if (diag_offset != 0) { *to -= Clamp((int)::TileX(*to) - (int)::TileX(tile), -1, 1); @@ -317,9 +317,9 @@ static uint32 SimulateDrag(TileIndex from, TileIndex tile, TileIndex *to) } } else if (::TileX(from) < ::TileX(tile)) { if (::TileY(*to) < ::TileY(tile)) { - p2 |= (TRACK_UPPER << 4); + p2 |= (TRACK_UPPER << 6); } else { - p2 |= (TRACK_RIGHT << 4); + p2 |= (TRACK_RIGHT << 6); } if (diag_offset == 0) { *to -= Clamp((int)::TileX(*to) - (int)::TileX(tile), -1, 1); @@ -328,9 +328,9 @@ static uint32 SimulateDrag(TileIndex from, TileIndex tile, TileIndex *to) } } else if (::TileX(from) > ::TileX(tile)) { if (::TileY(*to) < ::TileY(tile)) { - p2 |= (TRACK_LEFT << 4); + p2 |= (TRACK_LEFT << 6); } else { - p2 |= (TRACK_LOWER << 4); + p2 |= (TRACK_LOWER << 6); } if (diag_offset == 0) { *to -= Clamp((int)::TileX(*to) - (int)::TileX(tile), -1, 1); @@ -355,7 +355,7 @@ static uint32 SimulateDrag(TileIndex from, TileIndex tile, TileIndex *to) (::TileX(from) == ::TileX(tile) && ::TileX(tile) == ::TileX(to)) || (::TileY(from) == ::TileY(tile) && ::TileY(tile) == ::TileY(to))); - uint32 p2 = SimulateDrag(from, tile, &to) | 1 << 8 | ScriptRail::GetCurrentRailType();; + uint32 p2 = SimulateDrag(from, tile, &to) | 1 << 10 | ScriptRail::GetCurrentRailType();; return ScriptObject::DoCommand(tile, to, p2, CMD_BUILD_RAILROAD_TRACK); } diff --git a/src/script/api/script_station.hpp b/src/script/api/script_station.hpp index 8561cd9bdd..42ea412d08 100644 --- a/src/script/api/script_station.hpp +++ b/src/script/api/script_station.hpp @@ -30,7 +30,7 @@ public: ERR_STATION_BASE = ScriptError::ERR_CAT_STATION << ScriptError::ERR_CAT_BIT_SIZE, /** The station is build too close to another station, airport or dock */ - ERR_STATION_TOO_CLOSE_TO_ANOTHER_STATION, // [STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT, STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION, STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK] + ERR_STATION_TOO_CLOSE_TO_ANOTHER_STATION, // [STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT, STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK] /** There are too many stations, airports and docks in the game */ ERR_STATION_TOO_MANY_STATIONS, // [STR_ERROR_TOO_MANY_STATIONS_LOADING, STR_ERROR_TOO_MANY_TRUCK_STOPS, STR_ERROR_TOO_MANY_BUS_STOPS] diff --git a/src/script/api/script_stationlist.cpp b/src/script/api/script_stationlist.cpp index ab9503a1b5..51a06b5a74 100644 --- a/src/script/api/script_stationlist.cpp +++ b/src/script/api/script_stationlist.cpp @@ -151,13 +151,13 @@ void CargoCollector::Update(StationID from, StationID via, uint amount) switch (Tselector) { case ScriptStationList_Cargo::CS_VIA_BY_FROM: if (via != this->other_station) return; - /* fall through */ + FALLTHROUGH; case ScriptStationList_Cargo::CS_BY_FROM: key = from; break; case ScriptStationList_Cargo::CS_FROM_BY_VIA: if (from != this->other_station) return; - /* fall through */ + FALLTHROUGH; case ScriptStationList_Cargo::CS_BY_VIA: key = via; break; diff --git a/src/script/api/script_testmode.hpp b/src/script/api/script_testmode.hpp index 25c1ddaab0..699d4db18b 100644 --- a/src/script/api/script_testmode.hpp +++ b/src/script/api/script_testmode.hpp @@ -49,6 +49,9 @@ public: */ ~ScriptTestMode(); + /** + * @api -all + */ virtual void FinalRelease(); }; diff --git a/src/script/api/script_text.hpp b/src/script/api/script_text.hpp index 21bf3929fb..ed14e391d0 100644 --- a/src/script/api/script_text.hpp +++ b/src/script/api/script_text.hpp @@ -124,7 +124,10 @@ public: ScriptText *AddParam(Object value); #endif /* DOXYGEN_API */ - /* virtual */ const char *GetEncodedText(); + /** + * @api -all + */ + virtual const char *GetEncodedText(); private: StringID string; diff --git a/src/script/api/script_town.cpp b/src/script/api/script_town.cpp index d81704ae38..4cdd6a9d0e 100644 --- a/src/script/api/script_town.cpp +++ b/src/script/api/script_town.cpp @@ -159,24 +159,24 @@ /* static */ bool ScriptTown::SetGrowthRate(TownID town_id, uint32 days_between_town_growth) { EnforcePrecondition(false, IsValidTown(town_id)); - + uint16 growth_rate; switch (days_between_town_growth) { case TOWN_GROWTH_NORMAL: - days_between_town_growth = 0; + growth_rate = 0; break; case TOWN_GROWTH_NONE: - days_between_town_growth = TOWN_GROW_RATE_CUSTOM_NONE; + growth_rate = TOWN_GROWTH_RATE_NONE; break; default: - days_between_town_growth = days_between_town_growth * DAY_TICKS / TOWN_GROWTH_TICKS; - EnforcePrecondition(false, days_between_town_growth < TOWN_GROW_RATE_CUSTOM); - if (days_between_town_growth == 0) days_between_town_growth = 1; // as fast as possible + EnforcePrecondition(false, days_between_town_growth <= MAX_TOWN_GROWTH_TICKS); + /* Don't use growth_rate 0 as it means GROWTH_NORMAL */ + growth_rate = max(days_between_town_growth * DAY_TICKS, 2u) - 1; break; } - return ScriptObject::DoCommand(::Town::Get(town_id)->xy, town_id, days_between_town_growth, CMD_TOWN_GROWTH_RATE); + return ScriptObject::DoCommand(::Town::Get(town_id)->xy, town_id, growth_rate, CMD_TOWN_GROWTH_RATE); } /* static */ int32 ScriptTown::GetGrowthRate(TownID town_id) @@ -185,9 +185,9 @@ const Town *t = ::Town::Get(town_id); - if (t->growth_rate == TOWN_GROW_RATE_CUSTOM_NONE) return TOWN_GROWTH_NONE; + if (t->growth_rate == TOWN_GROWTH_RATE_NONE) return TOWN_GROWTH_NONE; - return ((t->growth_rate & ~TOWN_GROW_RATE_CUSTOM) * TOWN_GROWTH_TICKS + DAY_TICKS) / DAY_TICKS; + return RoundDivSU(t->growth_rate + 1, DAY_TICKS); } /* static */ int32 ScriptTown::GetDistanceManhattanToTile(TownID town_id, TileIndex tile) diff --git a/src/script/api/script_town.hpp b/src/script/api/script_town.hpp index 03868e67a4..7fdf8a6b39 100644 --- a/src/script/api/script_town.hpp +++ b/src/script/api/script_town.hpp @@ -259,7 +259,7 @@ public: * @param town_id The index of the town. * @param days_between_town_growth The amount of days between town growth, TOWN_GROWTH_NONE or TOWN_GROWTH_NORMAL. * @pre IsValidTown(town_id). - * @pre days_between_town_growth <= 30000 || days_between_town_growth == TOWN_GROWTH_NONE || days_between_town_growth == TOWN_GROWTH_NORMAL. + * @pre days_between_town_growth <= 880 || days_between_town_growth == TOWN_GROWTH_NONE || days_between_town_growth == TOWN_GROWTH_NORMAL. * @return True if the action succeeded. * @note Even when setting a growth rate, towns only grow when the conditions for growth (SetCargoCoal) are met, * and the game settings (economy.town_growth_rate) allow town growth at all. diff --git a/src/script/api/script_types.hpp b/src/script/api/script_types.hpp index d3ac70b4d4..bd9b7c5607 100644 --- a/src/script/api/script_types.hpp +++ b/src/script/api/script_types.hpp @@ -98,7 +98,7 @@ typedef uint8 IndustryType; ///< The ID of an industry-type. typedef OverflowSafeInt64 Money; ///< Money, stored in a 32bit/64bit safe way. For scripts money is always in pounds. typedef uint16 SignID; ///< The ID of a sign. typedef uint16 StationID; ///< The ID of a station. -typedef uint16 StringID; ///< The ID of a string. +typedef uint32 StringID; ///< The ID of a string. typedef uint16 SubsidyID; ///< The ID of a subsidy. typedef uint16 StoryPageID; ///< The ID of a story page. typedef uint16 StoryPageElementID; ///< The ID of a story page element. diff --git a/src/script/api/script_viewport.cpp b/src/script/api/script_viewport.cpp index 737e7e68da..bed3ba9923 100644 --- a/src/script/api/script_viewport.cpp +++ b/src/script/api/script_viewport.cpp @@ -10,9 +10,11 @@ /** @file script_viewport.cpp Implementation of ScriptViewport. */ #include "../../stdafx.h" +#include "script_error.hpp" #include "script_viewport.hpp" #include "script_game.hpp" #include "script_map.hpp" +#include "../script_instance.hpp" #include "../../viewport_func.h" #include "../../safeguards.h" @@ -24,3 +26,34 @@ ScrollMainWindowToTile(tile); } + +/* static */ bool ScriptViewport::ScrollEveryoneTo(TileIndex tile) +{ + EnforcePrecondition(false, ScriptObject::GetCompany() == OWNER_DEITY); + EnforcePrecondition(false, ScriptMap::IsValidTile(tile)); + + return ScriptObject::DoCommand(tile, VST_EVERYONE, 0, CMD_SCROLL_VIEWPORT); +} + +/* static */ bool ScriptViewport::ScrollCompanyClientsTo(ScriptCompany::CompanyID company, TileIndex tile) +{ + EnforcePrecondition(false, ScriptObject::GetCompany() == OWNER_DEITY); + EnforcePrecondition(false, ScriptMap::IsValidTile(tile)); + + company = ScriptCompany::ResolveCompanyID(company); + EnforcePrecondition(false, company != ScriptCompany::COMPANY_INVALID); + + return ScriptObject::DoCommand(tile, VST_COMPANY, company, CMD_SCROLL_VIEWPORT); +} + +/* static */ bool ScriptViewport::ScrollClientTo(ScriptClient::ClientID client, TileIndex tile) +{ + EnforcePrecondition(false, ScriptGame::IsMultiplayer()); + EnforcePrecondition(false, ScriptObject::GetCompany() == OWNER_DEITY); + EnforcePrecondition(false, ScriptMap::IsValidTile(tile)); + + client = ScriptClient::ResolveClientID(client); + EnforcePrecondition(false, client != ScriptClient::CLIENT_INVALID); + + return ScriptObject::DoCommand(tile, VST_CLIENT, client, CMD_SCROLL_VIEWPORT); +} diff --git a/src/script/api/script_viewport.hpp b/src/script/api/script_viewport.hpp index 542b58095e..cae1a59300 100644 --- a/src/script/api/script_viewport.hpp +++ b/src/script/api/script_viewport.hpp @@ -13,6 +13,8 @@ #define SCRIPT_VIEWPORT_HPP #include "script_object.hpp" +#include "script_client.hpp" +#include "script_company.hpp" /** * Class that manipulates the user's viewport. @@ -28,6 +30,38 @@ public: * @pre ScriptMap::IsValidTile(tile). */ static void ScrollTo(TileIndex tile); + + /** + * Scroll the viewport of all players to the given tile, + * where the tile will be in the center of the screen. + * @param tile The tile to put in the center of the screen. + * @pre ScriptObject::GetCompany() == OWNER_DEITY + * @pre ScriptMap::IsValidTile(tile) + */ + static bool ScrollEveryoneTo(TileIndex tile); + + /** + * Scroll the viewports of all players in the company to the given tile, + * where the tile will be in the center of the screen. + * @param company The company which players to scroll the viewport of. + * @param tile The tile to put in the center of the screen. + * @pre ScriptObject::GetCompany() == OWNER_DEITY + * @pre ScriptMap::IsValidTile(tile) + * @pre ResolveCompanyID(company) != COMPANY_INVALID + */ + static bool ScrollCompanyClientsTo(ScriptCompany::CompanyID company, TileIndex tile); + + /** + * Scroll the viewport of the client to the given tile, + * where the tile will be in the center of the screen. + * @param client The client to scroll the viewport of. + * @param tile The tile to put in the center of the screen. + * @pre ScriptGame::IsMultiplayer() + * @pre ScriptObject::GetCompany() == OWNER_DEITY + * @pre ScriptMap::IsValidTile(tile) + * @pre ResolveClientID(client) != CLIENT_INVALID + */ + static bool ScrollClientTo(ScriptClient::ClientID client, TileIndex tile); }; #endif /* SCRIPT_ADMIN_HPP */ diff --git a/src/script/api/script_window.hpp b/src/script/api/script_window.hpp index 58e114734e..e11742bafb 100644 --- a/src/script/api/script_window.hpp +++ b/src/script/api/script_window.hpp @@ -32,6 +32,7 @@ #include "../../widgets/engine_widget.h" #include "../../widgets/error_widget.h" #include "../../widgets/fios_widget.h" +#include "../../widgets/framerate_widget.h" #include "../../widgets/genworld_widget.h" #include "../../widgets/goal_widget.h" #include "../../widgets/graph_widget.h" @@ -764,6 +765,18 @@ public: */ WC_SAVE_PRESET = ::WC_SAVE_PRESET, + /** + * Framerate display; %Window numbers: + * - 0 = #FramerateDisplayWidgets + */ + WC_FRAMERATE_DISPLAY = ::WC_FRAMERATE_DISPLAY, + + /** + * Frame time graph; %Window numbers: + * - 0 = #FrametimeGraphWindowWidgets + */ + WC_FRAMETIME_GRAPH = ::WC_FRAMETIME_GRAPH, + WC_INVALID = ::WC_INVALID, ///< Invalid window. }; @@ -942,10 +955,8 @@ public: WID_RV_STOP_REPLACE = ::WID_RV_STOP_REPLACE, ///< Stop Replacing button. /* Train only widgets. */ - WID_RV_TRAIN_ENGINEWAGON_TOGGLE = ::WID_RV_TRAIN_ENGINEWAGON_TOGGLE, ///< Button to toggle engines and/or wagons. - WID_RV_TRAIN_FLUFF_LEFT = ::WID_RV_TRAIN_FLUFF_LEFT, ///< The fluff on the left. + WID_RV_TRAIN_ENGINEWAGON_DROPDOWN = ::WID_RV_TRAIN_ENGINEWAGON_DROPDOWN, ///< Dropdown to select engines and/or wagons. WID_RV_TRAIN_RAILTYPE_DROPDOWN = ::WID_RV_TRAIN_RAILTYPE_DROPDOWN, ///< Dropdown menu about the railtype. - WID_RV_TRAIN_FLUFF_RIGHT = ::WID_RV_TRAIN_FLUFF_RIGHT, ///< The fluff on the right. WID_RV_TRAIN_WAGONREMOVE_TOGGLE = ::WID_RV_TRAIN_WAGONREMOVE_TOGGLE, ///< Button to toggle removing wagons. }; @@ -990,7 +1001,7 @@ public: }; /* automatically generated from ../../widgets/cheat_widget.h */ - /** Widgets of the #CheatWindow class.. */ + /** Widgets of the #CheatWindow class. */ enum CheatWidgets { WID_C_PANEL = ::WID_C_PANEL, ///< Panel where all cheats are shown in. }; @@ -1261,6 +1272,7 @@ public: WID_SL_CAPTION = ::WID_SL_CAPTION, ///< Caption of the window. WID_SL_SORT_BYNAME = ::WID_SL_SORT_BYNAME, ///< Sort by name button. WID_SL_SORT_BYDATE = ::WID_SL_SORT_BYDATE, ///< Sort by date button. + WID_SL_FILTER = ::WID_SL_FILTER, ///< Filter list of files WID_SL_BACKGROUND = ::WID_SL_BACKGROUND, ///< Background of window. WID_SL_FILE_BACKGROUND = ::WID_SL_FILE_BACKGROUND, ///< Background of file selection. WID_SL_HOME_BUTTON = ::WID_SL_HOME_BUTTON, ///< Home button. @@ -1277,6 +1289,25 @@ public: WID_SL_MISSING_NEWGRFS = ::WID_SL_MISSING_NEWGRFS, ///< Button to find missing NewGRFs online. }; + /* automatically generated from ../../widgets/framerate_widget.h */ + /** Widgets of the #FramerateWindow class. */ + enum FramerateWindowWidgets { + WID_FRW_CAPTION = ::WID_FRW_CAPTION, + WID_FRW_RATE_GAMELOOP = ::WID_FRW_RATE_GAMELOOP, + WID_FRW_RATE_DRAWING = ::WID_FRW_RATE_DRAWING, + WID_FRW_RATE_FACTOR = ::WID_FRW_RATE_FACTOR, + WID_FRW_INFO_DATA_POINTS = ::WID_FRW_INFO_DATA_POINTS, + WID_FRW_TIMES_NAMES = ::WID_FRW_TIMES_NAMES, + WID_FRW_TIMES_CURRENT = ::WID_FRW_TIMES_CURRENT, + WID_FRW_TIMES_AVERAGE = ::WID_FRW_TIMES_AVERAGE, + }; + + /** Widgets of the #FrametimeGraphWindow class. */ + enum FrametimeGraphWindowWidgets { + WID_FGW_CAPTION = ::WID_FGW_CAPTION, + WID_FGW_GRAPH = ::WID_FGW_GRAPH, + }; + /* automatically generated from ../../widgets/genworld_widget.h */ /** Widgets of the #GenerateLandscapeWindow class. */ enum GenerateLandscapeWidgets { @@ -1441,6 +1472,7 @@ public: WID_GL_DELETE_GROUP = ::WID_GL_DELETE_GROUP, ///< Delete group button. WID_GL_RENAME_GROUP = ::WID_GL_RENAME_GROUP, ///< Rename group button. WID_GL_REPLACE_PROTECTION = ::WID_GL_REPLACE_PROTECTION, ///< Replace protection button. + WID_GL_INFO = ::WID_GL_INFO, ///< Group info. }; /* automatically generated from ../../widgets/highscore_widget.h */ @@ -1499,8 +1531,10 @@ public: WID_SGI_ARCTIC_LANDSCAPE = ::WID_SGI_ARCTIC_LANDSCAPE, ///< Select arctic landscape button. WID_SGI_TROPIC_LANDSCAPE = ::WID_SGI_TROPIC_LANDSCAPE, ///< Select tropic landscape button. WID_SGI_TOYLAND_LANDSCAPE = ::WID_SGI_TOYLAND_LANDSCAPE, ///< Select toyland landscape button. + WID_SGI_BASESET_SELECTION = ::WID_SGI_BASESET_SELECTION, ///< Baseset selection. + WID_SGI_BASESET = ::WID_SGI_BASESET, ///< Baseset errors. WID_SGI_TRANSLATION_SELECTION = ::WID_SGI_TRANSLATION_SELECTION, ///< Translation selection. - WID_SGI_TRANSLATION = ::WID_SGI_TRANSLATION, ///< Translation. + WID_SGI_TRANSLATION = ::WID_SGI_TRANSLATION, ///< Translation errors. WID_SGI_OPTIONS = ::WID_SGI_OPTIONS, ///< Options button. WID_SGI_HIGHSCORE = ::WID_SGI_HIGHSCORE, ///< Highscore button. WID_SGI_SETTINGS_OPTIONS = ::WID_SGI_SETTINGS_OPTIONS, ///< Settings button. @@ -1581,9 +1615,11 @@ public: /* automatically generated from ../../widgets/music_widget.h */ /** Widgets of the #MusicTrackSelectionWindow class. */ enum MusicTrackSelectionWidgets { + WID_MTS_CAPTION = ::WID_MTS_CAPTION, ///< Window caption. WID_MTS_LIST_LEFT = ::WID_MTS_LIST_LEFT, ///< Left button. WID_MTS_PLAYLIST = ::WID_MTS_PLAYLIST, ///< Playlist. WID_MTS_LIST_RIGHT = ::WID_MTS_LIST_RIGHT, ///< Right button. + WID_MTS_MUSICSET = ::WID_MTS_MUSICSET, ///< Music set selection. WID_MTS_ALL = ::WID_MTS_ALL, ///< All button. WID_MTS_OLD = ::WID_MTS_OLD, ///< Old button. WID_MTS_NEW = ::WID_MTS_NEW, ///< New button. @@ -2381,9 +2417,10 @@ public: WID_TN_TRAINS = ::WID_TN_TRAINS, ///< Train menu. WID_TN_ROADVEHS = ::WID_TN_ROADVEHS, ///< Road vehicle menu. WID_TN_SHIPS = ::WID_TN_SHIPS, ///< Ship menu. - WID_TN_AIRCRAFTS = ::WID_TN_AIRCRAFTS, ///< Aircraft menu. + WID_TN_AIRCRAFT = ::WID_TN_AIRCRAFT, ///< Aircraft menu. WID_TN_ZOOM_IN = ::WID_TN_ZOOM_IN, ///< Zoom in the main viewport. WID_TN_ZOOM_OUT = ::WID_TN_ZOOM_OUT, ///< Zoom out the main viewport. + WID_TN_BUILDING_TOOLS_START = ::WID_TN_BUILDING_TOOLS_START, ///< Helper for the offset of the building tools WID_TN_RAILS = ::WID_TN_RAILS, ///< Rail building menu. WID_TN_ROADS = ::WID_TN_ROADS, ///< Road building menu. WID_TN_WATER = ::WID_TN_WATER, ///< Water building toolbar. diff --git a/src/script/api/squirrel_export.awk b/src/script/api/squirrel_export.awk index c397d1da6b..2cb47deddd 100644 --- a/src/script/api/squirrel_export.awk +++ b/src/script/api/squirrel_export.awk @@ -81,7 +81,6 @@ function reset_reader() struct_size = 0 method_size = 0 static_method_size = 0 - virtual_class = "false" cls = "" start_squirrel_define_on_next_line = "false" cls_level = 0 @@ -97,7 +96,6 @@ BEGIN { struct_size = 0 method_size = 0 static_method_size = 0 - virtual_class = "false" super_cls = "" cls = "" api_selected = "" @@ -340,7 +338,7 @@ BEGIN { } else { print " SQ" api_cls ".PreRegister(engine, \"" api_super_cls "\");" } - if (virtual_class == "false" && super_cls != "ScriptEvent") { + if (super_cls != "ScriptEvent") { if (cls_param[2] == "v") { print " SQ" api_cls ".AddSQAdvancedConstructor(engine);" } else { @@ -409,22 +407,21 @@ BEGIN { } if (static_method_size != 0) print "" - if (virtual_class == "false") { - # Non-static methods - mlen = 0 - for (i = 1; i <= method_size; i++) { - if (mlen <= length(methods[i, 0])) mlen = length(methods[i, 0]) - } - for (i = 1; i <= method_size; i++) { - if (methods[i, 2] == "v") { - print " SQ" api_cls ".DefSQAdvancedMethod(engine, &" cls "::" methods[i, 0] ", " substr(spaces, 1, mlen - length(methods[i, 0]) - 8) "\"" methods[i, 0] "\");" - } else { - print " SQ" api_cls ".DefSQMethod(engine, &" cls "::" methods[i, 0] ", " substr(spaces, 1, mlen - length(methods[i, 0])) "\"" methods[i, 0] "\", " substr(spaces, 1, mlen - length(methods[i, 0])) "" methods[i, 1] ", \"" methods[i, 2] "\");" - } - delete methods[i] - } - if (method_size != 0) print "" + # Non-static methods + mlen = 0 + for (i = 1; i <= method_size; i++) { + if (mlen <= length(methods[i, 0])) mlen = length(methods[i, 0]) } + for (i = 1; i <= method_size; i++) { + if (methods[i, 2] == "v") { + print " SQ" api_cls ".DefSQAdvancedMethod(engine, &" cls "::" methods[i, 0] ", " substr(spaces, 1, mlen - length(methods[i, 0]) - 8) "\"" methods[i, 0] "\");" + } else { + print " SQ" api_cls ".DefSQMethod(engine, &" cls "::" methods[i, 0] ", " substr(spaces, 1, mlen - length(methods[i, 0])) "\"" methods[i, 0] "\", " substr(spaces, 1, mlen - length(methods[i, 0])) "" methods[i, 1] ", \"" methods[i, 2] "\");" + } + delete methods[i] + } + if (method_size != 0) print "" + print " SQ" api_cls ".PostRegister(engine);" print "}" @@ -489,9 +486,6 @@ BEGIN { } is_static = match($0, "static") - if (match($0, "virtual")) { - virtual_class = "true" - } gsub("\\yvirtual\\y", "", $0) gsub("\\ystatic\\y", "", $0) gsub("\\yconst\\y", "", $0) diff --git a/src/script/api/template/template_client.hpp.sq b/src/script/api/template/template_client.hpp.sq new file mode 100644 index 0000000000..13b9d68b6a --- /dev/null +++ b/src/script/api/template/template_client.hpp.sq @@ -0,0 +1,25 @@ +/* $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 . + */ + +/* THIS FILE IS AUTO-GENERATED; PLEASE DO NOT ALTER MANUALLY */ + +#include "../script_client.hpp" + +namespace SQConvert { + /* Allow enums to be used as Squirrel parameters */ + template <> inline ScriptClient::ClientID GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (ScriptClient::ClientID)tmp; } + template <> inline int Return(HSQUIRRELVM vm, ScriptClient::ClientID res) { sq_pushinteger(vm, (int32)res); return 1; } + + /* Allow ScriptClient to be used as Squirrel parameter */ + template <> inline ScriptClient *GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (ScriptClient *)instance; } + template <> inline ScriptClient &GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(ScriptClient *)instance; } + template <> inline const ScriptClient *GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (ScriptClient *)instance; } + template <> inline const ScriptClient &GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(ScriptClient *)instance; } + template <> inline int Return(HSQUIRRELVM vm, ScriptClient *res) { if (res == NULL) { sq_pushnull(vm); return 1; } res->AddRef(); Squirrel::CreateClassInstanceVM(vm, "Client", res, NULL, DefSQDestructorCallback, true); return 1; } +} // namespace SQConvert diff --git a/src/script/api/template/template_clientlist.hpp.sq b/src/script/api/template/template_clientlist.hpp.sq new file mode 100644 index 0000000000..74c3f4525f --- /dev/null +++ b/src/script/api/template/template_clientlist.hpp.sq @@ -0,0 +1,30 @@ +/* $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 . + */ + +/* THIS FILE IS AUTO-GENERATED; PLEASE DO NOT ALTER MANUALLY */ + +#include "../script_clientlist.hpp" + +namespace SQConvert { + /* Allow ScriptClientList to be used as Squirrel parameter */ + template <> inline ScriptClientList *GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (ScriptClientList *)instance; } + template <> inline ScriptClientList &GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(ScriptClientList *)instance; } + template <> inline const ScriptClientList *GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (ScriptClientList *)instance; } + template <> inline const ScriptClientList &GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(ScriptClientList *)instance; } + template <> inline int Return(HSQUIRRELVM vm, ScriptClientList *res) { if (res == NULL) { sq_pushnull(vm); return 1; } res->AddRef(); Squirrel::CreateClassInstanceVM(vm, "ClientList", res, NULL, DefSQDestructorCallback, true); return 1; } +} // namespace SQConvert + +namespace SQConvert { + /* Allow ScriptClientList_Company to be used as Squirrel parameter */ + template <> inline ScriptClientList_Company *GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (ScriptClientList_Company *)instance; } + template <> inline ScriptClientList_Company &GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(ScriptClientList_Company *)instance; } + template <> inline const ScriptClientList_Company *GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (ScriptClientList_Company *)instance; } + template <> inline const ScriptClientList_Company &GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(ScriptClientList_Company *)instance; } + template <> inline int Return(HSQUIRRELVM vm, ScriptClientList_Company *res) { if (res == NULL) { sq_pushnull(vm); return 1; } res->AddRef(); Squirrel::CreateClassInstanceVM(vm, "ClientList_Company", res, NULL, DefSQDestructorCallback, true); return 1; } +} // namespace SQConvert diff --git a/src/script/api/template/template_window.hpp.sq b/src/script/api/template/template_window.hpp.sq index a21a75ab89..3077215ec2 100644 --- a/src/script/api/template/template_window.hpp.sq +++ b/src/script/api/template/template_window.hpp.sq @@ -77,6 +77,10 @@ namespace SQConvert { template <> inline int Return(HSQUIRRELVM vm, ScriptWindow::ErrorMessageWidgets res) { sq_pushinteger(vm, (int32)res); return 1; } template <> inline ScriptWindow::SaveLoadWidgets GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (ScriptWindow::SaveLoadWidgets)tmp; } template <> inline int Return(HSQUIRRELVM vm, ScriptWindow::SaveLoadWidgets res) { sq_pushinteger(vm, (int32)res); return 1; } + template <> inline ScriptWindow::FramerateWindowWidgets GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (ScriptWindow::FramerateWindowWidgets)tmp; } + template <> inline int Return(HSQUIRRELVM vm, ScriptWindow::FramerateWindowWidgets res) { sq_pushinteger(vm, (int32)res); return 1; } + template <> inline ScriptWindow::FrametimeGraphWindowWidgets GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (ScriptWindow::FrametimeGraphWindowWidgets)tmp; } + template <> inline int Return(HSQUIRRELVM vm, ScriptWindow::FrametimeGraphWindowWidgets res) { sq_pushinteger(vm, (int32)res); return 1; } template <> inline ScriptWindow::GenerateLandscapeWidgets GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (ScriptWindow::GenerateLandscapeWidgets)tmp; } template <> inline int Return(HSQUIRRELVM vm, ScriptWindow::GenerateLandscapeWidgets res) { sq_pushinteger(vm, (int32)res); return 1; } template <> inline ScriptWindow::CreateScenarioWidgets GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (ScriptWindow::CreateScenarioWidgets)tmp; } diff --git a/src/script/script_config.cpp b/src/script/script_config.cpp index a6e41476e8..3171e67d4f 100644 --- a/src/script/script_config.cpp +++ b/src/script/script_config.cpp @@ -36,7 +36,7 @@ void ScriptConfig::Change(const char *name, int version, bool force_exact_match, * for the Script that have the random flag to a random value. */ for (ScriptConfigItemList::const_iterator it = this->info->GetConfigList()->begin(); it != this->info->GetConfigList()->end(); it++) { if ((*it).flags & SCRIPTCONFIG_RANDOM) { - this->SetSetting((*it).name, InteractiveRandomRange((*it).max_value - (*it).min_value) + (*it).min_value); + this->SetSetting((*it).name, InteractiveRandomRange((*it).max_value + 1 - (*it).min_value) + (*it).min_value); } } this->AddRandomDeviation(); diff --git a/src/script/script_info_dummy.cpp b/src/script/script_info_dummy.cpp index e11c631512..53860386c1 100644 --- a/src/script/script_info_dummy.cpp +++ b/src/script/script_info_dummy.cpp @@ -92,7 +92,7 @@ void Script_CreateDummy(HSQUIRRELVM vm, StringID string, const char *type) p = newline + 1; } while (newline != NULL); - dp = strecpy(dp, " }\n}\n", lastof(dummy_script)); + strecpy(dp, " }\n}\n", lastof(dummy_script)); /* 3) We translate the error message in the character format that Squirrel wants. * We can use the fact that the wchar string printing also uses %s to print diff --git a/src/script/script_scanner.cpp b/src/script/script_scanner.cpp index 57265669f9..fe6d41cf92 100644 --- a/src/script/script_scanner.cpp +++ b/src/script/script_scanner.cpp @@ -134,7 +134,7 @@ void ScriptScanner::RegisterScript(ScriptInfo *info) if (this->info_list.find(script_name) != this->info_list.end()) { /* This script was already registered */ -#ifdef WIN32 +#ifdef _WIN32 /* Windows doesn't care about the case */ if (strcasecmp(this->info_list[script_name]->GetMainScript(), info->GetMainScript()) == 0) { #else diff --git a/src/script/squirrel.cpp b/src/script/squirrel.cpp index e38067480d..23163f6b34 100644 --- a/src/script/squirrel.cpp +++ b/src/script/squirrel.cpp @@ -432,13 +432,8 @@ static SQInteger _io_file_read(SQUserPointer file, SQUserPointer buf, SQInteger SQRESULT Squirrel::LoadFile(HSQUIRRELVM vm, const char *filename, SQBool printerror) { - size_t size; FILE *file; - SQInteger ret; - unsigned short us; - unsigned char uc; - SQLEXREADFUNC func; - + size_t size; if (strncmp(this->GetAPIName(), "AI", 2) == 0) { file = FioFOpenFile(filename, "rb", AI_DIR, &size); if (file == NULL) file = FioFOpenFile(filename, "rb", AI_LIBRARY_DIR, &size); @@ -449,61 +444,75 @@ SQRESULT Squirrel::LoadFile(HSQUIRRELVM vm, const char *filename, SQBool printer NOT_REACHED(); } - if (file != NULL) { - SQFile f(file, size); - ret = fread(&us, 1, sizeof(us), file); - /* Most likely an empty file */ - if (ret != 2) us = 0; - - switch (us) { - case SQ_BYTECODE_STREAM_TAG: { // BYTECODE - if (fseek(file, -2, SEEK_CUR) < 0) { - FioFCloseFile(file); - return sq_throwerror(vm, "cannot seek the file"); - } - if (SQ_SUCCEEDED(sq_readclosure(vm, _io_file_read, &f))) { - FioFCloseFile(file); - return SQ_OK; - } - FioFCloseFile(file); - return sq_throwerror(vm, "Couldn't read bytecode"); - } - case 0xFFFE: - /* Either this file is encoded as big-endian and we're on a little-endian - * machine, or this file is encoded as little-endian and we're on a big-endian - * machine. Either way, swap the bytes of every word we read. */ - func = _io_file_lexfeed_UCS2_swap; - break; - case 0xFEFF: func = _io_file_lexfeed_UCS2_no_swap; break; - case 0xBBEF: // UTF-8 - case 0xEFBB: // UTF-8 on big-endian machine - if (fread(&uc, 1, sizeof(uc), file) == 0) { - FioFCloseFile(file); - return sq_throwerror(vm, "I/O error"); - } - if (uc != 0xBF) { - FioFCloseFile(file); - return sq_throwerror(vm, "Unrecognized encoding"); - } - func = _io_file_lexfeed_UTF8; - break; - default: // ASCII - func = _io_file_lexfeed_ASCII; - if (fseek(file, -2, SEEK_CUR) < 0) { - FioFCloseFile(file); - return sq_throwerror(vm, "cannot seek the file"); - } - break; - } - - if (SQ_SUCCEEDED(sq_compile(vm, func, &f, filename, printerror))) { - FioFCloseFile(file); - return SQ_OK; - } - FioFCloseFile(file); - return SQ_ERROR; + if (file == NULL) { + return sq_throwerror(vm, "cannot open the file"); } - return sq_throwerror(vm, "cannot open the file"); + unsigned short bom = 0; + if (size >= 2) { + size_t sr = fread(&bom, 1, sizeof(bom), file); + (void)sr; // Inside tar, no point checking return value of fread + } + + SQLEXREADFUNC func; + switch (bom) { + case SQ_BYTECODE_STREAM_TAG: { // BYTECODE + if (fseek(file, -2, SEEK_CUR) < 0) { + FioFCloseFile(file); + return sq_throwerror(vm, "cannot seek the file"); + } + + SQFile f(file, size); + if (SQ_SUCCEEDED(sq_readclosure(vm, _io_file_read, &f))) { + FioFCloseFile(file); + return SQ_OK; + } + FioFCloseFile(file); + return sq_throwerror(vm, "Couldn't read bytecode"); + } + case 0xFFFE: + /* Either this file is encoded as big-endian and we're on a little-endian + * machine, or this file is encoded as little-endian and we're on a big-endian + * machine. Either way, swap the bytes of every word we read. */ + func = _io_file_lexfeed_UCS2_swap; + size -= 2; // Skip BOM + break; + case 0xFEFF: + func = _io_file_lexfeed_UCS2_no_swap; + size -= 2; // Skip BOM + break; + case 0xBBEF: // UTF-8 + case 0xEFBB: { // UTF-8 on big-endian machine + /* Similarly, check the file is actually big enough to finish checking BOM */ + if (size < 3) { + FioFCloseFile(file); + return sq_throwerror(vm, "I/O error"); + } + unsigned char uc; + if (fread(&uc, 1, sizeof(uc), file) != sizeof(uc) || uc != 0xBF) { + FioFCloseFile(file); + return sq_throwerror(vm, "Unrecognized encoding"); + } + func = _io_file_lexfeed_UTF8; + size -= 3; // Skip BOM + break; + } + default: // ASCII + func = _io_file_lexfeed_ASCII; + /* Account for when we might not have fread'd earlier */ + if (size >= 2 && fseek(file, -2, SEEK_CUR) < 0) { + FioFCloseFile(file); + return sq_throwerror(vm, "cannot seek the file"); + } + break; + } + + SQFile f(file, size); + if (SQ_SUCCEEDED(sq_compile(vm, func, &f, filename, printerror))) { + FioFCloseFile(file); + return SQ_OK; + } + FioFCloseFile(file); + return SQ_ERROR; } bool Squirrel::LoadScript(HSQUIRRELVM vm, const char *script, bool in_root) diff --git a/src/sdl.h b/src/sdl.h index ff1092358f..9033899a59 100644 --- a/src/sdl.h +++ b/src/sdl.h @@ -15,7 +15,7 @@ const char *SdlOpen(uint32 x); void SdlClose(uint32 x); -#ifdef WIN32 +#ifdef _WIN32 #define DYNAMICALLY_LOADED_SDL #endif diff --git a/src/settings.cpp b/src/settings.cpp index cdac4afc4a..110bb47640 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -183,7 +183,8 @@ static int ParseIntList(const char *p, int *items, int maxitems) /* Do not accept multiple commas between numbers */ if (!comma) return -1; comma = false; - /* FALL THROUGH */ + FALLTHROUGH; + case ' ': p++; break; @@ -1463,7 +1464,7 @@ static int DecodeHexNibble(char c) * Parse a sequence of characters (supposedly hex digits) into a sequence of bytes. * After the hex number should be a \c '|' character. * @param pos First character to convert. - * @param dest [out] Output byte array to write the bytes. + * @param[out] dest Output byte array to write the bytes. * @param dest_size Number of bytes in \a dest. * @return Whether reading was successful. */ @@ -1672,9 +1673,9 @@ static void HandleSettingDescs(IniFile *ini, SettingDescProc *proc, SettingDescP { if (basic_settings) { proc(ini, (const SettingDesc*)_misc_settings, "misc", NULL); -#if defined(WIN32) && !defined(DEDICATED) +#if defined(_WIN32) && !defined(DEDICATED) proc(ini, (const SettingDesc*)_win32_settings, "win32", NULL); -#endif /* WIN32 */ +#endif /* _WIN32 */ } if (other_settings) { @@ -1693,7 +1694,7 @@ static void HandleSettingDescs(IniFile *ini, SettingDescProc *proc, SettingDescP static IniFile *IniLoadConfig() { IniFile *ini = new IniFile(_list_group_names); - ini->LoadFromDisk(_config_file, BASE_DIR); + ini->LoadFromDisk(_config_file, NO_DIRECTORY); return ini; } @@ -1752,7 +1753,7 @@ void SaveToConfig() /** * Get the list of known NewGrf presets. - * @param list[inout] Pointer to list for storing the preset names. + * @param[in,out] list Pointer to list for storing the preset names. */ void GetGRFPresetList(GRFPresetList *list) { @@ -2044,24 +2045,27 @@ bool SetSettingValue(uint index, const char *value, bool force_newgame) /** * Given a name of setting, return a setting description of it. - * @param name Name of the setting to return a setting description of - * @param i Pointer to an integer that will contain the index of the setting after the call, if it is successful. + * @param name Name of the setting to return a setting description of + * @param i Pointer to an integer that will contain the index of the setting after the call, if it is successful. + * @param ignore_version Return a setting even if it not valid for the current savegame version * @return Pointer to the setting description of setting \a name if it can be found, * \c NULL indicates failure to obtain the description */ -const SettingDesc *GetSettingFromName(const char *name, uint *i) +const SettingDesc *GetSettingFromName(const char *name, uint *i, bool ignore_version) { const SettingDesc *sd; /* First check all full names */ for (*i = 0, sd = _settings; sd->save.cmd != SL_END; sd++, (*i)++) { - if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue; + if (sd->desc.name == NULL) continue; + if (!ignore_version && !SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue; if (strcmp(sd->desc.name, name) == 0) return sd; } /* Then check the shortcut variant of the name. */ for (*i = 0, sd = _settings; sd->save.cmd != SL_END; sd++, (*i)++) { - if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue; + if (sd->desc.name == NULL) continue; + if (!ignore_version && !SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue; const char *short_name = strchr(sd->desc.name, '.'); if (short_name != NULL) { short_name++; @@ -2072,7 +2076,8 @@ const SettingDesc *GetSettingFromName(const char *name, uint *i) if (strncmp(name, "company.", 8) == 0) name += 8; /* And finally the company-based settings */ for (*i = 0, sd = _company_settings; sd->save.cmd != SL_END; sd++, (*i)++) { - if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue; + if (sd->desc.name == NULL) continue; + if (!ignore_version && !SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue; if (strcmp(sd->desc.name, name) == 0) return sd; } @@ -2184,6 +2189,29 @@ void IConsoleListSettings(const char *prefilter) IConsolePrintF(CC_WARNING, "Use 'setting' command to change a value"); } +/** + * Load handler for settings, which don't go in the PATX chunk, and which are a cross-reference to another setting + * @param osd SettingDesc struct containing all information + * @param object can be either NULL in which case we load global variables or + * a pointer to a struct which is getting saved + */ +static void LoadSettingsXref(const SettingDesc *osd, void *object) { + DEBUG(sl, 3, "PATS chunk: Loading xref setting: '%s'", osd->xref); + uint index = 0; + const SettingDesc *setting_xref = GetSettingFromName(osd->xref, &index, true); + assert(setting_xref != NULL); + + // Generate a new SaveLoad from the xref target using the version params from the source + SaveLoad sld = setting_xref->save; + sld.version_from = osd->save.version_from; + sld.version_to = osd->save.version_to; + sld.ext_feature_test = osd->save.ext_feature_test; + void *ptr = GetVariableAddress(object, &sld); + + if (!SlObjectMember(ptr, &sld)) return; + if (IsNumericType(sld.conv)) Write_ValidateSetting(ptr, setting_xref, ReadValue(ptr, sld.conv)); +} + /** * Save and load handler for settings, except for those which go in the PATX chunk * @param osd SettingDesc struct containing all information @@ -2192,9 +2220,15 @@ void IConsoleListSettings(const char *prefilter) */ static void LoadSettings(const SettingDesc *osd, void *object) { + extern uint16 _sl_version; + for (; osd->save.cmd != SL_END; osd++) { if (osd->patx_name != NULL) continue; const SaveLoad *sld = &osd->save; + if (osd->xref != NULL) { + if (sld->ext_feature_test.IsFeaturePresent(_sl_version, sld->version_from, sld->version_to)) LoadSettingsXref(osd, object); + continue; + } void *ptr = GetVariableAddress(object, sld); if (!SlObjectMember(ptr, sld)) continue; @@ -2216,6 +2250,7 @@ static void SaveSettings(const SettingDesc *sd, void *object) size_t length = 0; for (i = sd; i->save.cmd != SL_END; i++) { if (i->patx_name != NULL) continue; + if (i->xref != NULL) continue; length += SlCalcObjMemberLength(object, &i->save); } SlSetLength(length); @@ -2235,10 +2270,10 @@ static void SaveSettings(const SettingDesc *sd, void *object) * * The PATX chunk contents has the following format: * - * uint32 chunk flags + * uint32 chunk flags (unused) * uint32 number of settings * For each of N settings: - * uint32 setting flags + * uint32 setting flags (unused) * SLE_STR setting name * uint32 length of setting field * N bytes setting field @@ -2247,18 +2282,6 @@ static void SaveSettings(const SettingDesc *sd, void *object) /** Sorted list of PATX settings, generated by MakeSettingsPatxList */ static std::vector _sorted_patx_settings; -/** - * Internal structure used in LoadSettingsPatx() - * placed outside for legacy compiler compatibility - * this makes me miss lambdas :/ - */ -struct StringSorter { - bool operator()(const SettingDesc *a, const SettingDesc *b) - { - return strcmp(a->patx_name, b->patx_name) < 0; - } -}; - /** * Prepare a sorted list of settings to be potentially be loaded out of the PATX chunk * This is to enable efficient lookup of settings by name @@ -2269,6 +2292,7 @@ static void MakeSettingsPatxList(const SettingDesc *sd) static const SettingDesc *previous = NULL; if (sd == previous) return; + previous = sd; _sorted_patx_settings.clear(); for (const SettingDesc *desc = sd; desc->save.cmd != SL_END; desc++) { @@ -2276,36 +2300,41 @@ static void MakeSettingsPatxList(const SettingDesc *sd) _sorted_patx_settings.push_back(desc); } - std::sort(_sorted_patx_settings.begin(), _sorted_patx_settings.end(), StringSorter()); + std::sort(_sorted_patx_settings.begin(), _sorted_patx_settings.end(), [](const SettingDesc *a, const SettingDesc *b) { + return strcmp(a->patx_name, b->patx_name) < 0; + }); } /** - * Internal structure used in LoadSettingsPatx() - * placed outside for legacy compiler compatibility + * Internal structure used in LoadSettingsPatx() and LoadSettingsPlyx() */ -struct SettingsPatxLoad { +struct SettingsExtLoad { uint32 flags; char name[256]; uint32 setting_length; }; +static const SaveLoad _settings_ext_load_desc[] = { + SLE_VAR(SettingsExtLoad, flags, SLE_UINT32), + SLE_STR(SettingsExtLoad, name, SLE_STRB, 256), + SLE_VAR(SettingsExtLoad, setting_length, SLE_UINT32), + SLE_END() +}; + /** - * Internal structure used in LoadSettingsPatx() - * placed outside for legacy compiler compatibility - * this is effectively a reference capture lambda + * Internal structure used in SaveSettingsPatx() and SaveSettingsPlyx() */ -struct StringSearcher { - bool &m_exact_match; +struct SettingsExtSave { + uint32 flags; + const char *name; + uint32 setting_length; +}; - StringSearcher(bool &exact_match) - : m_exact_match(exact_match) { } - - bool operator()(const SettingDesc *a, const char *b) - { - int result = strcmp(a->patx_name, b); - if (result == 0) m_exact_match = true; - return result < 0; - } +static const SaveLoad _settings_ext_save_desc[] = { + SLE_VAR(SettingsExtSave, flags, SLE_UINT32), + SLE_STR(SettingsExtSave, name, SLE_STR, 0), + SLE_VAR(SettingsExtSave, setting_length, SLE_UINT32), + SLE_END() }; /** @@ -2318,14 +2347,7 @@ static void LoadSettingsPatx(const SettingDesc *sd, void *object) { MakeSettingsPatxList(sd); - SettingsPatxLoad current_setting; - - static const SaveLoad _settings_patx_desc[] = { - SLE_VAR(SettingsPatxLoad, flags, SLE_UINT32), - SLE_STR(SettingsPatxLoad, name, SLE_STRB, 256), - SLE_VAR(SettingsPatxLoad, setting_length, SLE_UINT32), - SLE_END() - }; + SettingsExtLoad current_setting; uint32 flags = SlReadUint32(); // flags are not in use yet, reserve for future expansion @@ -2333,14 +2355,18 @@ static void LoadSettingsPatx(const SettingDesc *sd, void *object) uint32 settings_count = SlReadUint32(); for (uint32 i = 0; i < settings_count; i++) { - SlObject(¤t_setting, _settings_patx_desc); + SlObject(¤t_setting, _settings_ext_load_desc); // flags are not in use yet, reserve for future expansion if (current_setting.flags != 0) SlErrorCorruptFmt("PATX chunk: unknown setting header flags: 0x%X", current_setting.flags); - // now try to find corresponding setting, this would be much easier with C++11 support... + // now try to find corresponding setting bool exact_match = false; - std::vector::iterator iter = std::lower_bound(_sorted_patx_settings.begin(), _sorted_patx_settings.end(), current_setting.name, StringSearcher(exact_match)); + auto iter = std::lower_bound(_sorted_patx_settings.begin(), _sorted_patx_settings.end(), current_setting.name, [&](const SettingDesc *a, const char *b) { + int result = strcmp(a->patx_name, b); + if (result == 0) exact_match = true; + return result < 0; + }); if (exact_match) { assert(iter != _sorted_patx_settings.end()); @@ -2360,15 +2386,6 @@ static void LoadSettingsPatx(const SettingDesc *sd, void *object) } } -/** - * Internal structure used in SaveSettingsPatx() - * placed outside for legacy compiler compatibility - */ -struct SettingToAdd { - const SettingDesc *setting; - uint32 setting_length; -}; - /** * Save handler for settings which go in the PATX chunk * @param sd SettingDesc struct containing all information @@ -2377,20 +2394,12 @@ struct SettingToAdd { */ static void SaveSettingsPatx(const SettingDesc *sd, void *object) { - struct SettingsPatxSave { - uint32 flags; - const char *name; + SettingsExtSave current_setting; + + struct SettingToAdd { + const SettingDesc *setting; uint32 setting_length; }; - SettingsPatxSave current_setting; - - static const SaveLoad _settings_patx_desc[] = { - SLE_VAR(SettingsPatxSave, flags, SLE_UINT32), - SLE_STR(SettingsPatxSave, name, SLE_STR, 0), - SLE_VAR(SettingsPatxSave, setting_length, SLE_UINT32), - SLE_END() - }; - std::vector settings_to_add; size_t length = 8; @@ -2402,7 +2411,7 @@ static void SaveSettingsPatx(const SettingDesc *sd, void *object) current_setting.name = desc->patx_name; // add length of setting header - length += SlCalcObjLength(¤t_setting, _settings_patx_desc); + length += SlCalcObjLength(¤t_setting, _settings_ext_save_desc); // add length of actual setting length += setting_length; @@ -2421,12 +2430,171 @@ static void SaveSettingsPatx(const SettingDesc *sd, void *object) current_setting.flags = 0; current_setting.name = desc->patx_name; current_setting.setting_length = settings_to_add[i].setting_length; - SlObject(¤t_setting, _settings_patx_desc); + SlObject(¤t_setting, _settings_ext_save_desc); void *ptr = GetVariableAddress(object, &desc->save); SlObjectMember(ptr, &desc->save); } } +/** @file + * + * The PLYX chunk stores additional company settings in an unordered + * format which is tolerant of extra, missing or reordered settings. + * The format is similar to the PATX chunk. + * Additional settings generally means those that aren't in trunk. + * + * The PLYX chunk contents has the following format: + * + * uint32 chunk flags (unused) + * uint32 number of companies + * For each of N companies: + * uint32 company ID + * uint32 company flags (unused) + * uint32 number of settings + * For each of N settings: + * uint32 setting flags (unused) + * SLE_STR setting name + * uint32 length of setting field + * N bytes setting field + */ + +/** + * Load handler for company settings which go in the PLYX chunk + * @param check_mode Whether to skip over settings without reading + */ +void LoadSettingsPlyx(bool skip) +{ + SettingsExtLoad current_setting; + + uint32 chunk_flags = SlReadUint32(); + // flags are not in use yet, reserve for future expansion + if (chunk_flags != 0) SlErrorCorruptFmt("PLYX chunk: unknown chunk header flags: 0x%X", chunk_flags); + + uint32 company_count = SlReadUint32(); + for (uint32 i = 0; i < company_count; i++) { + uint32 company_id = SlReadUint32(); + if (company_id >= MAX_COMPANIES) SlErrorCorruptFmt("PLYX chunk: invalid company ID: %u", company_id); + + const Company *c = NULL; + if (!skip) { + c = Company::GetIfValid(company_id); + if (c == NULL) SlErrorCorruptFmt("PLYX chunk: non-existant company ID: %u", company_id); + } + + uint32 company_flags = SlReadUint32(); + // flags are not in use yet, reserve for future expansion + if (company_flags != 0) SlErrorCorruptFmt("PLYX chunk: unknown company flags: 0x%X", company_flags); + + uint32 settings_count = SlReadUint32(); + for (uint32 j = 0; j < settings_count; j++) { + SlObject(¤t_setting, _settings_ext_load_desc); + + // flags are not in use yet, reserve for future expansion + if (current_setting.flags != 0) SlErrorCorruptFmt("PLYX chunk: unknown setting header flags: 0x%X", current_setting.flags); + + if (skip) { + SlSkipBytes(current_setting.setting_length); + continue; + } + + const SettingDesc *setting = NULL; + + // not many company settings, so perform a linear scan + for (const SettingDesc *desc = _company_settings; desc->save.cmd != SL_END; desc++) { + if (desc->patx_name != NULL && strcmp(desc->patx_name, current_setting.name) == 0) { + setting = desc; + break; + } + } + + if (setting != NULL) { + // found setting + const SaveLoad *sld = &(setting->save); + size_t read = SlGetBytesRead(); + void *ptr = GetVariableAddress(&(c->settings), sld); + SlObjectMember(ptr, sld); + if (SlGetBytesRead() != read + current_setting.setting_length) { + SlErrorCorruptFmt("PLYX chunk: setting read length mismatch for setting: '%s'", current_setting.name); + } + if (IsNumericType(sld->conv)) Write_ValidateSetting(ptr, setting, ReadValue(ptr, sld->conv)); + } else { + DEBUG(sl, 1, "PLYX chunk: Could not find company setting: '%s', ignoring", current_setting.name); + SlSkipBytes(current_setting.setting_length); + } + } + } +} + +/** + * Save handler for settings which go in the PLYX chunk + */ +void SaveSettingsPlyx() +{ + SettingsExtSave current_setting; + + static const SaveLoad _settings_plyx_desc[] = { + SLE_VAR(SettingsExtSave, flags, SLE_UINT32), + SLE_STR(SettingsExtSave, name, SLE_STR, 0), + SLE_VAR(SettingsExtSave, setting_length, SLE_UINT32), + SLE_END() + }; + + std::vector company_setting_counts; + + size_t length = 8; + uint32 companies_count = 0; + + Company *c; + FOR_ALL_COMPANIES(c) { + length += 12; + companies_count++; + uint32 setting_count = 0; + for (const SettingDesc *desc = _company_settings; desc->save.cmd != SL_END; desc++) { + if (desc->patx_name == NULL) continue; + uint32 setting_length = SlCalcObjMemberLength(&(c->settings), &desc->save); + if (!setting_length) continue; + + current_setting.name = desc->patx_name; + + // add length of setting header + length += SlCalcObjLength(¤t_setting, _settings_ext_save_desc); + + // add length of actual setting + length += setting_length; + + setting_count++; + } + company_setting_counts.push_back(setting_count); + } + SlSetLength(length); + + SlWriteUint32(0); // flags + SlWriteUint32(companies_count); // companies count + + size_t index = 0; + FOR_ALL_COMPANIES(c) { + length += 12; + companies_count++; + SlWriteUint32(c->index); // company ID + SlWriteUint32(0); // flags + SlWriteUint32(company_setting_counts[index]); // setting count + index++; + + for (const SettingDesc *desc = _company_settings; desc->save.cmd != SL_END; desc++) { + if (desc->patx_name == NULL) continue; + uint32 setting_length = SlCalcObjMemberLength(&(c->settings), &desc->save); + if (!setting_length) continue; + + current_setting.flags = 0; + current_setting.name = desc->patx_name; + current_setting.setting_length = setting_length; + SlObject(¤t_setting, _settings_plyx_desc); + void *ptr = GetVariableAddress(&(c->settings), &desc->save); + SlObjectMember(ptr, &desc->save); + } + } +} + static void Load_OPTS() { /* Copy over default setting since some might not get loaded in diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 0652d1bd81..931e2d190f 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -114,19 +114,24 @@ static int GetCurRes() static void ShowCustCurrency(); template -static DropDownList *BuiltSetDropDownList(int *selected_index) +static DropDownList *BuildSetDropDownList(int *selected_index, bool allow_selection) { int n = T::GetNumSets(); *selected_index = T::GetIndexOfUsedSet(); DropDownList *list = new DropDownList(); for (int i = 0; i < n; i++) { - *list->Append() = new DropDownListCharStringItem(T::GetSet(i)->name, i, (_game_mode == GM_MENU) ? false : (*selected_index != i)); + *list->Append() = new DropDownListCharStringItem(T::GetSet(i)->name, i, !allow_selection && (*selected_index != i)); } return list; } +DropDownList *BuildMusicSetDropDownList(int *selected_index) +{ + return BuildSetDropDownList(selected_index, true); +} + /** Window for displaying the textfile of a BaseSet. */ template struct BaseSetTextfileWindow : public TextfileWindow { @@ -297,15 +302,15 @@ struct GameOptionsWindow : Window { } case WID_GO_BASE_GRF_DROPDOWN: - list = BuiltSetDropDownList(selected_index); + list = BuildSetDropDownList(selected_index, (_game_mode == GM_MENU)); break; case WID_GO_BASE_SFX_DROPDOWN: - list = BuiltSetDropDownList(selected_index); + list = BuildSetDropDownList(selected_index, (_game_mode == GM_MENU)); break; case WID_GO_BASE_MUSIC_DROPDOWN: - list = BuiltSetDropDownList(selected_index); + list = BuildMusicSetDropDownList(selected_index); break; default: @@ -532,6 +537,7 @@ struct GameOptionsWindow : Window { _gui_zoom = (ZoomLevel)(ZOOM_LVL_OUT_4X - index); UpdateCursorSize(); LoadStringWidthTable(); + UpdateAllVirtCoords(); break; case WID_GO_BASE_GRF_DROPDOWN: @@ -543,7 +549,7 @@ struct GameOptionsWindow : Window { break; case WID_GO_BASE_MUSIC_DROPDOWN: - this->SetMediaSet(index); + ChangeMusicSet(index); break; } } @@ -1501,14 +1507,14 @@ static SettingsContainer &GetSettingsTree() general->Add(new SettingEntry("gui.errmsg_duration")); general->Add(new SettingEntry("gui.window_snap_radius")); general->Add(new SettingEntry("gui.window_soft_limit")); + general->Add(new SettingEntry("gui.right_mouse_wnd_close")); } SettingsPage *viewports = interface->Add(new SettingsPage(STR_CONFIG_SETTING_INTERFACE_VIEWPORTS)); { viewports->Add(new SettingEntry("gui.auto_scrolling")); - viewports->Add(new SettingEntry("gui.reverse_scroll")); + viewports->Add(new SettingEntry("gui.scroll_mode")); viewports->Add(new SettingEntry("gui.smooth_scroll")); - viewports->Add(new SettingEntry("gui.left_mouse_btn_scrolling")); /* While the horizontal scrollwheel scrolling is written as general code, only * the cocoa (OSX) driver generates input for it. * Since it's also able to completely disable the scrollwheel will we display it on all platforms anyway */ @@ -2090,7 +2096,9 @@ struct GameSettingsWindow : Window { DropDownList *list = new DropDownList(); for (int i = sdb->min; i <= (int)sdb->max; i++) { - *list->Append() = new DropDownListStringItem(sdb->str_val + i - sdb->min, i, false); + int val = sd->orderproc ? sd->orderproc(i - sdb->min) : i; + assert_msg(val >= sdb->min && val <= (int)sdb->max, "min: %d, max: %d, val: %d", sdb->min, sdb->max, val); + *list->Append() = new DropDownListStringItem(sdb->str_val + val - sdb->min, val, false); } ShowDropDownListAt(this, list, value, -1, wi_rect, COLOUR_ORANGE, true); diff --git a/src/settings_gui.h b/src/settings_gui.h index 05955aa557..23a343219f 100644 --- a/src/settings_gui.h +++ b/src/settings_gui.h @@ -13,6 +13,7 @@ #define SETTING_GUI_H #include "gfx_type.h" +#include "widgets/dropdown_type.h" /** Width of setting buttons */ #define SETTING_BUTTON_WIDTH ((int)NWidgetScrollbar::GetHorizontalDimension().width * 2) @@ -23,5 +24,10 @@ void DrawArrowButtons(int x, int y, Colours button_colour, byte state, bool clic void DrawDropDownButton(int x, int y, Colours button_colour, bool state, bool clickable); void DrawBoolButton(int x, int y, bool state, bool clickable); +DropDownList *BuildMusicSetDropDownList(int *selected_index); + +/* Actually implemented in music_gui.cpp */ +void ChangeMusicSet(int index); + #endif /* SETTING_GUI_H */ diff --git a/src/settings_internal.h b/src/settings_internal.h index e356e7e5e6..4838bef805 100644 --- a/src/settings_internal.h +++ b/src/settings_internal.h @@ -89,6 +89,7 @@ enum SettingType { typedef bool OnChange(int32 var); ///< callback prototype on data modification typedef size_t OnConvert(const char *value); ///< callback prototype for conversion error +typedef int OnGuiOrder(uint nth); ///< callback prototype for GUI ordering /** Properties of config file settings. */ struct SettingDescBase { @@ -112,6 +113,8 @@ struct SettingDesc { SettingDescBase desc; ///< Settings structure (going to configuration file) SaveLoad save; ///< Internal structure (going to savegame, parts to config) const char *patx_name; ///< Name to save/load setting from in PATX chunk, if NULL save/load from PATS chunk as normal + const char *xref; ///< Name of SettingDesc to use instead of the contents of this one, useful for loading legacy savegames, if NULL save/load as normal + OnGuiOrder *orderproc; ///< Callback procedure for GUI re-ordering bool IsEditable(bool do_command = false) const; SettingType GetType() const; @@ -126,7 +129,7 @@ struct SettingDesc { * offset in a certain struct */ typedef SettingDesc SettingDescGlobVarList; -const SettingDesc *GetSettingFromName(const char *name, uint *i); +const SettingDesc *GetSettingFromName(const char *name, uint *i, bool ignore_version = false); bool SetSettingValue(uint index, int32 value, bool force_newgame = false); bool SetSettingValue(uint index, const char *value, bool force_newgame = false); void SetCompanySetting(uint index, int32 value); diff --git a/src/settings_type.h b/src/settings_type.h index 41366a7719..690f6d8036 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -71,6 +71,15 @@ struct DifficultySettings { byte town_council_tolerance; ///< minimum required town ratings to be allowed to demolish stuff }; +/** Settings relating to viewport/smallmap scrolling. */ +enum ViewportScrollMode { + VSM_VIEWPORT_RMB_FIXED, ///< Viewport moves with mouse movement on holding right mouse button, cursor position is fixed. + VSM_MAP_RMB_FIXED, ///< Map moves with mouse movement on holding right mouse button, cursor position is fixed. + VSM_MAP_RMB, ///< Map moves with mouse movement on holding right mouse button, cursor moves. + VSM_MAP_LMB, ///< Map moves with mouse movement on holding left mouse button, cursor moves. + VSM_END, ///< Number of scroll mode settings. +}; + /** Settings related to the GUI and other stuff that is not saved in the savegame. */ struct GUISettings { bool sg_full_load_any; ///< new full load calculation, any cargo must be full read from pre v93 savegames @@ -86,11 +95,11 @@ struct GUISettings { uint16 hover_delay_ms; ///< time required to activate a hover event, in milliseconds bool link_terraform_toolbar; ///< display terraform toolbar when displaying rail, road, water and airport toolbars uint8 smallmap_land_colour; ///< colour used for land and heightmap at the smallmap - bool reverse_scroll; ///< right-Click-Scrolling scrolls in the opposite direction + uint8 scroll_mode; ///< viewport scroll mode bool smooth_scroll; ///< smooth scroll viewports bool measure_tooltip; ///< show a permanent tooltip when dragging tools byte liveries; ///< options for displaying company liveries, 0=none, 1=self, 2=all - bool prefer_teamchat; ///< choose the chat message target with , true=all clients, false=your team + bool prefer_teamchat; ///< choose the chat message target with \, true=all clients, false=your team uint8 advanced_vehicle_list; ///< use the "advanced" vehicle list uint8 loading_indicators; ///< show loading indicators uint8 default_rail_type; ///< the default rail type for the rail GUI @@ -105,6 +114,7 @@ struct GUISettings { bool threaded_saves; ///< should we do threaded saves? bool keep_all_autosave; ///< name the autosave in a different way bool autosave_on_exit; ///< save an autosave when you quit the game, but do not ask "Do you really want to quit?" + bool autosave_on_network_disconnect; ///< save an autosave when you get disconnected from a network game with an error? uint8 date_format_in_default_names; ///< should the default savegame/screenshot name use long dates (31th Dec 2008), short dates (31-12-2008) or ISO dates (2008-12-31) byte max_num_autosaves; ///< controls how many autosavegames are made before the game starts to overwrite (names them 0 to max_num_autosaves - 1) bool population_in_label; ///< show the population of a town in his label? @@ -112,7 +122,7 @@ struct GUISettings { uint8 scrollwheel_scrolling; ///< scrolling using the scroll wheel? uint8 scrollwheel_multiplier; ///< how much 'wheel' per incoming event from the OS? bool timetable_arrival_departure; ///< show arrivals and departures in vehicle timetables - bool left_mouse_btn_scrolling; ///< left mouse button scroll + bool right_mouse_wnd_close; ///< close window with right click bool pause_on_newgame; ///< whether to start new games paused or not bool enable_signal_gui; ///< show the signal GUI when the signal button is pressed Year coloured_news_year; ///< when does newspaper become coloured? diff --git a/src/settingsgen/settingsgen.cpp b/src/settingsgen/settingsgen.cpp index dd92e2627b..298539417e 100644 --- a/src/settingsgen/settingsgen.cpp +++ b/src/settingsgen/settingsgen.cpp @@ -18,7 +18,7 @@ #include -#if (!defined(WIN32) && !defined(WIN64)) || defined(__CYGWIN__) +#if !defined(_WIN32) || defined(__CYGWIN__) #include #include #endif @@ -205,7 +205,6 @@ static const char *DEFAULTS_GROUP_NAME = "defaults"; ///< Name of the group c /** * Load the INI file. * @param filename Name of the file to load. - * @param subdir The subdirectory to load from. * @return Loaded INI data. */ static IniLoadFile *LoadIniFile(const char *filename) @@ -372,7 +371,10 @@ static bool CompareFiles(const char *n1, const char *n2) if (f2 == NULL) return false; FILE *f1 = fopen(n1, "rb"); - if (f1 == NULL) error("can't open %s", n1); + if (f1 == NULL) { + fclose(f2); + error("can't open %s", n1); + } size_t l1, l2; do { @@ -413,12 +415,12 @@ static const OptionData _opts[] = { * After loading, the [pre-amble] group is copied verbatim if it exists. * * For every group with a name that matches a template name the template is written. - * It starts with a optional '#if' line if an 'if' item exists in the group. The item - * value is used as condition. Similarly, '#ifdef' and '#ifndef' lines are also written. + * It starts with a optional \c \#if line if an 'if' item exists in the group. The item + * value is used as condition. Similarly, \c \#ifdef and \c \#ifndef lines are also written. * Below the macro processor directives, the value of the template is written * at a line with its variables replaced by item values of the group being written. * If the group has no item for the variable, the [defaults] group is tried as fall back. - * Finally, '#endif' lines are written to match the macro processor lines. + * Finally, \c \#endif lines are written to match the macro processor lines. * * Last but not least, the [post-amble] group is copied verbatim. * @@ -510,7 +512,7 @@ int CDECL main(int argc, char *argv[]) unlink(tmp_output); } else { /* Rename tmp2.xxx to output file. */ -#if defined(WIN32) || defined(WIN64) +#if defined(_WIN32) unlink(output_file); #endif if (rename(tmp_output, output_file) == -1) error("rename() failed"); diff --git a/src/ship.h b/src/ship.h index 18f04c8faf..0f396a237d 100644 --- a/src/ship.h +++ b/src/ship.h @@ -30,11 +30,11 @@ struct Ship FINAL : public SpecializedVehicle { virtual ~Ship() { this->PreDestructor(); } void MarkDirty(); - void UpdateDeltaXY(Direction direction); + void UpdateDeltaXY(); ExpensesType GetExpenseType(bool income) const { return income ? EXPENSES_SHIP_INC : EXPENSES_SHIP_RUN; } void PlayLeaveStationSound() const; bool IsPrimaryVehicle() const { return true; } - SpriteID GetImage(Direction direction, EngineImageType image_type) const; + void GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const; int GetDisplaySpeed() const { return this->cur_speed / 2; } int GetDisplayMaxSpeed() const { return this->vcache.cached_max_speed / 2; } int GetCurrentMaxSpeed() const { return min(this->vcache.cached_max_speed, this->current_order.GetMaxSpeed() * 2); } diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp index a24fb35104..e606afc0ce 100644 --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -28,11 +28,13 @@ #include "vehicle_func.h" #include "sound_func.h" #include "ai/ai.hpp" +#include "game/game.hpp" #include "pathfinder/opf/opf_ship.h" #include "engine_base.h" #include "company_base.h" #include "tunnelbridge_map.h" #include "zoom_func.h" +#include "framerate_type.h" #include "table/strings.h" @@ -70,30 +72,34 @@ static inline TrackBits GetTileShipTrackStatus(TileIndex tile) return TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_WATER, 0)); } -static SpriteID GetShipIcon(EngineID engine, EngineImageType image_type) +static void GetShipIcon(EngineID engine, EngineImageType image_type, VehicleSpriteSeq *result) { const Engine *e = Engine::Get(engine); uint8 spritenum = e->u.ship.image_index; if (is_custom_sprite(spritenum)) { - SpriteID sprite = GetCustomVehicleIcon(engine, DIR_W, image_type); - if (sprite != 0) return sprite; + GetCustomVehicleIcon(engine, DIR_W, image_type, result); + if (result->IsValid()) return; spritenum = e->original_image_index; } assert(IsValidImageIndex(spritenum)); - return DIR_W + _ship_sprites[spritenum]; + result->Set(DIR_W + _ship_sprites[spritenum]); } void DrawShipEngine(int left, int right, int preferred_x, int y, EngineID engine, PaletteID pal, EngineImageType image_type) { - SpriteID sprite = GetShipIcon(engine, image_type); - const Sprite *real_sprite = GetSprite(sprite, ST_NORMAL); + VehicleSpriteSeq seq; + GetShipIcon(engine, image_type, &seq); + + Rect rect; + seq.GetBounds(&rect); preferred_x = Clamp(preferred_x, - left - UnScaleGUI(real_sprite->x_offs), - right - UnScaleGUI(real_sprite->width) - UnScaleGUI(real_sprite->x_offs)); - DrawSprite(sprite, pal, preferred_x, y); + left - UnScaleGUI(rect.left), + right - UnScaleGUI(rect.right)); + + seq.Draw(preferred_x, y, pal, pal == PALETTE_CRASH); } /** @@ -107,27 +113,31 @@ void DrawShipEngine(int left, int right, int preferred_x, int y, EngineID engine */ void GetShipSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, int &yoffs, EngineImageType image_type) { - const Sprite *spr = GetSprite(GetShipIcon(engine, image_type), ST_NORMAL); + VehicleSpriteSeq seq; + GetShipIcon(engine, image_type, &seq); - width = UnScaleGUI(spr->width); - height = UnScaleGUI(spr->height); - xoffs = UnScaleGUI(spr->x_offs); - yoffs = UnScaleGUI(spr->y_offs); + Rect rect; + seq.GetBounds(&rect); + + width = UnScaleGUI(rect.right - rect.left + 1); + height = UnScaleGUI(rect.bottom - rect.top + 1); + xoffs = UnScaleGUI(rect.left); + yoffs = UnScaleGUI(rect.top); } -SpriteID Ship::GetImage(Direction direction, EngineImageType image_type) const +void Ship::GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const { uint8 spritenum = this->spritenum; if (is_custom_sprite(spritenum)) { - SpriteID sprite = GetCustomVehicleSprite(this, direction, image_type); - if (sprite != 0) return sprite; + GetCustomVehicleSprite(this, direction, image_type, result); + if (result->IsValid()) return; spritenum = this->GetEngine()->original_image_index; } assert(IsValidImageIndex(spritenum)); - return _ship_sprites[spritenum] + direction; + result->Set(_ship_sprites[spritenum] + direction); } static const Depot *FindClosestShipDepot(const Vehicle *v, uint max_distance) @@ -287,7 +297,7 @@ TileIndex Ship::GetOrderStationLocation(StationID station) } } -void Ship::UpdateDeltaXY(Direction direction) +void Ship::UpdateDeltaXY() { static const int8 _delta_xy_table[8][4] = { /* y_extent, x_extent, y_offs, x_offs */ @@ -301,7 +311,7 @@ void Ship::UpdateDeltaXY(Direction direction) {32, 6, -16, -3}, // NW }; - const int8 *bb = _delta_xy_table[direction]; + const int8 *bb = _delta_xy_table[this->direction]; this->x_offs = bb[3]; this->y_offs = bb[2]; this->x_extent = bb[1]; @@ -309,11 +319,6 @@ void Ship::UpdateDeltaXY(Direction direction) this->z_extent = 6; } -static const TileIndexDiffC _ship_leave_depot_offs[] = { - {-1, 0}, - { 0, -1} -}; - static bool CheckShipLeaveDepot(Ship *v) { if (!v->IsChainInDepot()) return false; @@ -329,9 +334,9 @@ static bool CheckShipLeaveDepot(Ship *v) Axis axis = GetShipDepotAxis(tile); DiagDirection north_dir = ReverseDiagDir(AxisToDiagDir(axis)); - TileIndex north_neighbour = TILE_ADD(tile, ToTileIndexDiff(_ship_leave_depot_offs[axis])); + TileIndex north_neighbour = TILE_ADD(tile, TileOffsByDiagDir(north_dir)); DiagDirection south_dir = AxisToDiagDir(axis); - TileIndex south_neighbour = TILE_ADD(tile, -2 * ToTileIndexDiff(_ship_leave_depot_offs[axis])); + TileIndex south_neighbour = TILE_ADD(tile, 2 * TileOffsByDiagDir(south_dir)); TrackBits north_tracks = DiagdirReachesTracks(north_dir) & GetTileShipTrackStatus(north_neighbour); TrackBits south_tracks = DiagdirReachesTracks(south_dir) & GetTileShipTrackStatus(south_neighbour); @@ -418,6 +423,7 @@ static void ShipArrivesAt(const Vehicle *v, Station *st) st->index ); AI::NewEvent(v->owner, new ScriptEventStationFirstVehicle(st->index, v->index)); + Game::NewEvent(new ScriptEventStationFirstVehicle(st->index, v->index)); } } @@ -448,27 +454,6 @@ static Track ChooseShipTrack(Ship *v, TileIndex tile, DiagDirection enterdir, Tr return track; } -static const Direction _new_vehicle_direction_table[] = { - DIR_N , DIR_NW, DIR_W , INVALID_DIR, - DIR_NE, DIR_N , DIR_SW, INVALID_DIR, - DIR_E , DIR_SE, DIR_S -}; - -static Direction ShipGetNewDirectionFromTiles(TileIndex new_tile, TileIndex old_tile) -{ - uint offs = (TileY(new_tile) - TileY(old_tile) + 1) * 4 + - TileX(new_tile) - TileX(old_tile) + 1; - assert(offs < 11 && offs != 3 && offs != 7); - return _new_vehicle_direction_table[offs]; -} - -static Direction ShipGetNewDirection(Vehicle *v, int x, int y) -{ - uint offs = (y - v->y_pos + 1) * 4 + (x - v->x_pos + 1); - assert(offs < 11 && offs != 3 && offs != 7); - return _new_vehicle_direction_table[offs]; -} - static inline TrackBits GetAvailShipTracks(TileIndex tile, DiagDirection dir) { return GetTileShipTrackStatus(tile) & DiagdirReachesTracks(dir); @@ -553,6 +538,10 @@ static void ShipController(Ship *v) if (v->current_order.IsType(OT_LEAVESTATION)) { v->current_order.Free(); SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP); + /* Test if continuing forward would lead to a dead-end, moving into the dock. */ + DiagDirection exitdir = VehicleExitDir(v->direction, v->state); + TileIndex tile = TileAddByDiagDir(v->tile, exitdir); + if (TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_WATER, 0, exitdir)) == TRACK_BIT_NONE) goto reverse_direction; } else if (v->dest_tile != 0) { /* We have a target, let's see if we reached it... */ if (v->current_order.IsType(OT_GOTO_WAYPOINT) && @@ -591,9 +580,8 @@ static void ShipController(Ship *v) /* New tile */ if (!IsValidTile(gp.new_tile)) goto reverse_direction; - dir = ShipGetNewDirectionFromTiles(gp.new_tile, gp.old_tile); - assert(dir == DIR_NE || dir == DIR_SE || dir == DIR_SW || dir == DIR_NW); - DiagDirection diagdir = DirToDiagDir(dir); + DiagDirection diagdir = DiagdirBetweenTiles(gp.old_tile, gp.new_tile); + assert(diagdir != INVALID_DIAGDIR); tracks = GetAvailShipTracks(gp.new_tile, diagdir); if (tracks == TRACK_BIT_NONE) goto reverse_direction; @@ -634,7 +622,6 @@ static void ShipController(Ship *v) } /* update image of ship, as well as delta XY */ - dir = ShipGetNewDirection(v, gp.x, gp.y); v->x_pos = gp.x; v->y_pos = gp.y; v->z_pos = GetSlopePixelZ(gp.x, gp.y); @@ -652,6 +639,8 @@ reverse_direction: bool Ship::Tick() { + PerformanceAccumulator framerate(PFE_GL_SHIPS); + if (!(this->vehstatus & VS_STOPPED)) this->running_ticks++; ShipController(this); @@ -665,7 +654,7 @@ bool Ship::Tick() * @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 CmdBuildShip(TileIndex tile, DoCommandFlag flags, const Engine *e, uint16 data, Vehicle **ret) @@ -688,7 +677,7 @@ CommandCost CmdBuildShip(TileIndex tile, DoCommandFlag flags, const Engine *e, u v->y_pos = y; v->z_pos = GetSlopePixelZ(x, y); - v->UpdateDeltaXY(v->direction); + v->UpdateDeltaXY(); v->vehstatus = VS_HIDDEN | VS_STOPPED | VS_DEFPAL; v->spritenum = svi->image_index; @@ -710,7 +699,7 @@ CommandCost CmdBuildShip(TileIndex tile, DoCommandFlag flags, const Engine *e, u v->SetServiceInterval(Company::Get(_current_company)->settings.vehicle.servint_ships); v->date_of_last_service = _date; v->build_year = _cur_year; - v->cur_image = SPR_IMG_QUERY; + v->sprite_seq.Set(SPR_IMG_QUERY); v->random_bits = VehicleRandomBits(); v->UpdateCache(); diff --git a/src/ship_gui.cpp b/src/ship_gui.cpp index 7ad2e8473a..c6bf342d97 100644 --- a/src/ship_gui.cpp +++ b/src/ship_gui.cpp @@ -35,20 +35,23 @@ void DrawShipImage(const Vehicle *v, int left, int right, int y, VehicleID selec { bool rtl = _current_text_dir == TD_RTL; - SpriteID sprite = v->GetImage(rtl ? DIR_E : DIR_W, image_type); - const Sprite *real_sprite = GetSprite(sprite, ST_NORMAL); + VehicleSpriteSeq seq; + v->GetImage(rtl ? DIR_E : DIR_W, image_type, &seq); - int width = UnScaleGUI(real_sprite->width); - int x_offs = UnScaleGUI(real_sprite->x_offs); + Rect rect; + seq.GetBounds(&rect); + + int width = UnScaleGUI(rect.right - rect.left + 1); + int x_offs = UnScaleGUI(rect.left); int x = rtl ? right - width - x_offs : left - x_offs; y += ScaleGUITrad(10); - DrawSprite(sprite, GetVehiclePalette(v), x, y); + seq.Draw(x, y, GetVehiclePalette(v), false); if (v->index == selection) { x += x_offs; - y += UnScaleGUI(real_sprite->y_offs); - DrawFrameRect(x - 1, y - 1, x + width + 1, y + UnScaleGUI(real_sprite->height) + 1, COLOUR_WHITE, FR_BORDERONLY); + y += UnScaleGUI(rect.top); + DrawFrameRect(x - 1, y - 1, x + width + 1, y + UnScaleGUI(rect.bottom - rect.top + 1) + 1, COLOUR_WHITE, FR_BORDERONLY); } } diff --git a/src/signal.cpp b/src/signal.cpp index 8e870b53db..b37e15074a 100644 --- a/src/signal.cpp +++ b/src/signal.cpp @@ -504,7 +504,8 @@ static SigSegState UpdateSignalsInBuffer(Owner owner) _tbdset.Add(tile, INVALID_DIAGDIR); // start from depot inside break; } - /* FALL THROUGH */ + FALLTHROUGH; + case MP_STATION: case MP_ROAD: if ((TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)) & _enterdir_to_trackbits[dir]) != TRACK_BIT_NONE) { @@ -513,7 +514,8 @@ static SigSegState UpdateSignalsInBuffer(Owner owner) _tbdset.Add(tile + TileOffsByDiagDir(dir), ReverseDiagDir(dir)); break; } - /* FALL THROUGH */ + FALLTHROUGH; + default: /* jump to next tile */ tile = tile + TileOffsByDiagDir(dir); diff --git a/src/signs_gui.cpp b/src/signs_gui.cpp index 020ee1b6ea..15adef0890 100644 --- a/src/signs_gui.cpp +++ b/src/signs_gui.cpp @@ -514,7 +514,7 @@ struct SignWindow : Window, SignList { case WID_QES_OK: if (RenameSign(this->cur_sign, this->name_editbox.text.buf)) break; - /* FALL THROUGH */ + FALLTHROUGH; case WID_QES_CANCEL: delete this; diff --git a/src/smallmap_gui.cpp b/src/smallmap_gui.cpp index 571d8d765d..135d7491c1 100644 --- a/src/smallmap_gui.cpp +++ b/src/smallmap_gui.cpp @@ -413,26 +413,10 @@ static const byte _tiletype_importance[] = { }; -static inline TileType GetEffectiveTileType(TileIndex tile) -{ - TileType t = GetTileType(tile); - - if (t == MP_TUNNELBRIDGE) { - TransportType tt = GetTunnelBridgeTransportType(tile); - - switch (tt) { - case TRANSPORT_RAIL: t = MP_RAILWAY; break; - case TRANSPORT_ROAD: t = MP_ROAD; break; - default: t = MP_WATER; break; - } - } - return t; -} - /** * Return the colour a tile would be displayed with in the small map in mode "Contour". * @param tile The tile of which we would like to get the colour. - * @param t Effective tile type of the tile (see #GetEffectiveTileType). + * @param t Effective tile type of the tile (see #SmallMapWindow::GetTileColours). * @return The colour of tile in the small map in mode "Contour" */ static inline uint32 GetSmallMapContoursPixels(TileIndex tile, TileType t) @@ -445,7 +429,7 @@ static inline uint32 GetSmallMapContoursPixels(TileIndex tile, TileType t) * Return the colour a tile would be displayed with in the small map in mode "Vehicles". * * @param tile The tile of which we would like to get the colour. - * @param t Effective tile type of the tile (see #GetEffectiveTileType). + * @param t Effective tile type of the tile (see #SmallMapWindow::GetTileColours). * @return The colour of tile in the small map in mode "Vehicles" */ static inline uint32 GetSmallMapVehiclesPixels(TileIndex tile, TileType t) @@ -458,23 +442,11 @@ static inline uint32 GetSmallMapVehiclesPixels(TileIndex tile, TileType t) * Return the colour a tile would be displayed with in the small map in mode "Industries". * * @param tile The tile of which we would like to get the colour. - * @param t Effective tile type of the tile (see #GetEffectiveTileType). + * @param t Effective tile type of the tile (see #SmallMapWindow::GetTileColours). * @return The colour of tile in the small map in mode "Industries" */ static inline uint32 GetSmallMapIndustriesPixels(TileIndex tile, TileType t) { - if (t == MP_INDUSTRY) { - /* If industry is allowed to be seen, use its colour on the map */ - IndustryType type = Industry::GetByTile(tile)->type; - if (_legend_from_industries[_industry_to_list_pos[type]].show_on_map && - (_smallmap_industry_highlight_state || type != _smallmap_industry_highlight)) { - return (type == _smallmap_industry_highlight ? PC_WHITE : GetIndustrySpec(Industry::GetByTile(tile)->type)->map_colour) * 0x01010101; - } else { - /* Otherwise, return the colour which will make it disappear */ - t = (IsTileOnWater(tile) ? MP_WATER : MP_CLEAR); - } - } - const SmallMapColourScheme *cs = &_heightmap_schemes[_settings_client.gui.smallmap_land_colour]; return ApplyMask(_smallmap_show_heightmap ? cs->height_colours[TileHeight(tile)] : cs->default_colour, &_smallmap_vehicles_andor[t]); } @@ -483,7 +455,7 @@ static inline uint32 GetSmallMapIndustriesPixels(TileIndex tile, TileType t) * Return the colour a tile would be displayed with in the small map in mode "Routes". * * @param tile The tile of which we would like to get the colour. - * @param t Effective tile type of the tile (see #GetEffectiveTileType). + * @param t Effective tile type of the tile (see #SmallMapWindow::GetTileColours). * @return The colour of tile in the small map in mode "Routes" */ static inline uint32 GetSmallMapRoutesPixels(TileIndex tile, TileType t) @@ -516,7 +488,7 @@ static inline uint32 GetSmallMapRoutesPixels(TileIndex tile, TileType t) * Return the colour a tile would be displayed with in the small map in mode "link stats". * * @param tile The tile of which we would like to get the colour. - * @param t Effective tile type of the tile (see #GetEffectiveTileType). + * @param t Effective tile type of the tile (see #SmallMapWindow::GetTileColours). * @return The colour of tile in the small map in mode "link stats" */ static inline uint32 GetSmallMapLinkStatsPixels(TileIndex tile, TileType t) @@ -539,7 +511,7 @@ static const uint32 _vegetation_clear_bits[] = { * Return the colour a tile would be displayed with in the smallmap in mode "Vegetation". * * @param tile The tile of which we would like to get the colour. - * @param t Effective tile type of the tile (see #GetEffectiveTileType). + * @param t Effective tile type of the tile (see #SmallMapWindow::GetTileColours). * @return The colour of tile in the smallmap in mode "Vegetation" */ static inline uint32 GetSmallMapVegetationPixels(TileIndex tile, TileType t) @@ -566,7 +538,7 @@ static inline uint32 GetSmallMapVegetationPixels(TileIndex tile, TileType t) * Return the colour a tile would be displayed with in the small map in mode "Owner". * * @param tile The tile of which we would like to get the colour. - * @param t Effective tile type of the tile (see #GetEffectiveTileType). + * @param t Effective tile type of the tile (see #SmallMapWindow::GetTileColours). * @return The colour of tile in the small map in mode "Owner" */ static inline uint32 GetSmallMapOwnerPixels(TileIndex tile, TileType t) @@ -600,6 +572,12 @@ static const byte _vehicle_type_colours[6] = { }; +/** Notify the industry chain window to stop sending newly selected industries. */ +/* static */ void SmallMapWindow::BreakIndustryChainLink() +{ + InvalidateWindowClassesData(WC_INDUSTRY_CARGOES, NUM_INDUSTRYTYPES); +} + inline Point SmallMapWindow::SmallmapRemapCoords(int x, int y) const { Point pt; @@ -633,7 +611,7 @@ inline Point SmallMapWindow::RemapTile(int tile_x, int tile_y) const * that tile for a point in the smallmap. * @param px Horizontal coordinate of the pixel. * @param py Vertical coordinate of the pixel. - * @param sub[out] Pixel position at the tile (0..3). + * @param[out] sub Pixel position at the tile (0..3). * @param add_sub Add current #subscroll to the position. * @return Tile being displayed at the given position relative to #scroll_x and #scroll_y. * @note The #subscroll offset is already accounted for. @@ -663,11 +641,11 @@ inline Point SmallMapWindow::PixelToTile(int px, int py, int *sub, bool add_sub) /** * Compute base parameters of the smallmap such that tile (\a tx, \a ty) starts at pixel (\a x, \a y). - * @param tx Tile x coordinate. - * @param ty Tile y coordinate. - * @param x Non-negative horizontal position in the display where the tile starts. - * @param y Non-negative vertical position in the display where the tile starts. - * @param sub [out] Value of #subscroll needed. + * @param tx Tile x coordinate. + * @param ty Tile y coordinate. + * @param x Non-negative horizontal position in the display where the tile starts. + * @param y Non-negative vertical position in the display where the tile starts. + * @param[out] sub Value of #subscroll needed. * @return #scroll_x, #scroll_y values. */ Point SmallMapWindow::ComputeScroll(int tx, int ty, int x, int y, int *sub) @@ -754,7 +732,42 @@ inline uint32 SmallMapWindow::GetTileColours(const TileArea &ta) const TileType et = MP_VOID; // Effective tile type at that position. TILE_AREA_LOOP(ti, ta) { - TileType ttype = GetEffectiveTileType(ti); + TileType ttype = GetTileType(ti); + + switch (ttype) { + case MP_TUNNELBRIDGE: { + TransportType tt = GetTunnelBridgeTransportType(ti); + + switch (tt) { + case TRANSPORT_RAIL: ttype = MP_RAILWAY; break; + case TRANSPORT_ROAD: ttype = MP_ROAD; break; + default: ttype = MP_WATER; break; + } + break; + } + + case MP_INDUSTRY: + /* Special handling of industries while in "Industries" smallmap view. */ + if (this->map_type == SMT_INDUSTRY) { + /* If industry is allowed to be seen, use its colour on the map. + * This has the highest priority above any value in _tiletype_importance. */ + IndustryType type = Industry::GetByTile(ti)->type; + if (_legend_from_industries[_industry_to_list_pos[type]].show_on_map) { + if (type == _smallmap_industry_highlight) { + if (_smallmap_industry_highlight_state) return MKCOLOUR_XXXX(PC_WHITE); + } else { + return GetIndustrySpec(type)->map_colour * 0x01010101; + } + } + /* Otherwise make it disappear */ + ttype = IsTileOnWater(ti) ? MP_WATER : MP_CLEAR; + } + break; + + default: + break; + } + if (_tiletype_importance[ttype] > importance) { importance = _tiletype_importance[ttype]; tile = ti; @@ -1062,6 +1075,12 @@ SmallMapWindow::SmallMapWindow(WindowDesc *desc, int window_number) : Window(des this->SetOverlayCargoMask(); } +SmallMapWindow::~SmallMapWindow() +{ + delete this->overlay; + this->BreakIndustryChainLink(); +} + /** * Rebuilds the colour indices used for fast access to the smallmap contour colours based on the heightlevel. */ @@ -1222,10 +1241,12 @@ void SmallMapWindow::RebuildColourIndexIfNecessary() if (tbl->show_on_map && tbl->type == _smallmap_industry_highlight) { legend_colour = _smallmap_industry_highlight_state ? PC_WHITE : PC_BLACK; } - /* FALL THROUGH */ + FALLTHROUGH; + case SMT_LINKSTATS: SetDParam(0, tbl->legend); - /* FALL_THROUGH */ + FALLTHROUGH; + case SMT_OWNER: if (this->map_type != SMT_OWNER || tbl->company != INVALID_COMPANY) { if (this->map_type == SMT_OWNER) SetDParam(0, tbl->company); @@ -1239,7 +1260,8 @@ void SmallMapWindow::RebuildColourIndexIfNecessary() } break; } - /* FALL_THROUGH */ + FALLTHROUGH; + default: if (this->map_type == SMT_CONTOUR) SetDParam(0, tbl->height * TILE_HEIGHT_STEP); /* Anything that is not an industry or a company is using normal process */ @@ -1268,6 +1290,7 @@ void SmallMapWindow::SwitchMapType(SmallMapType map_type) this->SetupWidgetData(); if (map_type == SMT_LINKSTATS) this->overlay->RebuildCache(); + if (map_type != SMT_INDUSTRY) this->BreakIndustryChainLink(); this->SetDirty(); } @@ -1319,6 +1342,8 @@ void SmallMapWindow::SelectLegendItem(int click_pos, LegendAndColour *legend, in } else { legend[click_pos].show_on_map = !legend[click_pos].show_on_map; } + + if (this->map_type == SMT_INDUSTRY) this->BreakIndustryChainLink(); } /** @@ -1326,7 +1351,7 @@ void SmallMapWindow::SelectLegendItem(int click_pos, LegendAndColour *legend, in */ void SmallMapWindow::SetOverlayCargoMask() { - uint32 cargo_mask = 0; + CargoTypes cargo_mask = 0; for (int i = 0; i != _smallmap_cargo_count; ++i) { if (_legend_linkstats[i].show_on_map) SetBit(cargo_mask, _legend_linkstats[i].type); } @@ -1373,9 +1398,6 @@ int SmallMapWindow::GetPositionOnLegend(Point pt) /* virtual */ void SmallMapWindow::OnClick(Point pt, int widget, int click_count) { - /* User clicked something, notify the industry chain window to stop sending newly selected industries. */ - InvalidateWindowClassesData(WC_INDUSTRY_CARGOES, NUM_INDUSTRYTYPES); - switch (widget) { case WID_SM_MAP: { // Map window /* @@ -1458,12 +1480,12 @@ int SmallMapWindow::GetPositionOnLegend(Point pt) break; case WID_SM_ENABLE_ALL: - /* FALL THROUGH */ case WID_SM_DISABLE_ALL: { LegendAndColour *tbl = NULL; switch (this->map_type) { case SMT_INDUSTRY: tbl = _legend_from_industries; + this->BreakIndustryChainLink(); break; case SMT_OWNER: tbl = &(_legend_land_owners[NUM_NO_COMPANY_ENTRIES]); @@ -1537,7 +1559,7 @@ int SmallMapWindow::GetPositionOnLegend(Point pt) /* virtual */ void SmallMapWindow::OnMouseWheel(int wheel) { - if (_settings_client.gui.scrollwheel_scrolling == 0) { + if (_settings_client.gui.scrollwheel_scrolling != 2) { const NWidgetBase *wid = this->GetWidget(WID_SM_MAP); int cursor_x = _cursor.pos.x - this->left - wid->pos_x; int cursor_y = _cursor.pos.y - this->top - wid->pos_y; @@ -1606,7 +1628,7 @@ void SmallMapWindow::SetNewScroll(int sx, int sy, int sub) /* virtual */ void SmallMapWindow::OnScroll(Point delta) { - _cursor.fix_at = true; + if (_settings_client.gui.scroll_mode == VSM_VIEWPORT_RMB_FIXED || _settings_client.gui.scroll_mode == VSM_MAP_RMB_FIXED) _cursor.fix_at = true; /* While tile is at (delta.x, delta.y)? */ int sub; diff --git a/src/smallmap_gui.h b/src/smallmap_gui.h index 2903544a69..c3151b1a71 100644 --- a/src/smallmap_gui.h +++ b/src/smallmap_gui.h @@ -82,6 +82,7 @@ protected: uint8 refresh; ///< Refresh counter, zeroed every FORCE_REFRESH_PERIOD ticks. LinkGraphOverlay *overlay; + static void BreakIndustryChainLink(); Point SmallmapRemapCoords(int x, int y) const; /** @@ -173,7 +174,7 @@ public: friend class NWidgetSmallmapDisplay; SmallMapWindow(WindowDesc *desc, int window_number); - virtual ~SmallMapWindow() { delete this->overlay; } + virtual ~SmallMapWindow(); void SmallMapCenterOnCurrentPos(); Point GetStationMiddle(const Station *st) const; diff --git a/src/sound/cocoa_s.cpp b/src/sound/cocoa_s.cpp index 8cf4a632bc..8133bf62f6 100644 --- a/src/sound/cocoa_s.cpp +++ b/src/sound/cocoa_s.cpp @@ -18,6 +18,7 @@ #ifdef WITH_COCOA #include "../stdafx.h" +#include "../os/macosx/macos.h" #include "../debug.h" #include "../driver.h" #include "../mixer.h" @@ -47,8 +48,6 @@ static OSStatus audioCallback(void *inRefCon, AudioUnitRenderActionFlags *inActi const char *SoundDriver_Cocoa::Start(const char * const *parm) { - Component comp; - ComponentDescription desc; struct AURenderCallbackStruct callback; AudioStreamBasicDescription requestedDesc; @@ -71,21 +70,49 @@ const char *SoundDriver_Cocoa::Start(const char * const *parm) MxInitialize((uint)requestedDesc.mSampleRate); - /* Locate the default output audio unit */ - desc.componentType = kAudioUnitType_Output; - desc.componentSubType = kAudioUnitSubType_HALOutput; - desc.componentManufacturer = kAudioUnitManufacturer_Apple; - desc.componentFlags = 0; - desc.componentFlagsMask = 0; +#if defined(__AUDIOCOMPONENT_H__) || defined(HAVE_OSX_107_SDK) + if (MacOSVersionIsAtLeast(10, 6, 0)) { + /* Locate the default output audio unit */ + AudioComponentDescription desc; + desc.componentType = kAudioUnitType_Output; + desc.componentSubType = kAudioUnitSubType_HALOutput; + desc.componentManufacturer = kAudioUnitManufacturer_Apple; + desc.componentFlags = 0; + desc.componentFlagsMask = 0; - comp = FindNextComponent (NULL, &desc); - if (comp == NULL) { - return "cocoa_s: Failed to start CoreAudio: FindNextComponent returned NULL"; - } + AudioComponent comp = AudioComponentFindNext (NULL, &desc); + if (comp == NULL) { + return "cocoa_s: Failed to start CoreAudio: AudioComponentFindNext returned NULL"; + } - /* Open & initialize the default output audio unit */ - if (OpenAComponent(comp, &_outputAudioUnit) != noErr) { - return "cocoa_s: Failed to start CoreAudio: OpenAComponent"; + /* Open & initialize the default output audio unit */ + if (AudioComponentInstanceNew(comp, &_outputAudioUnit) != noErr) { + return "cocoa_s: Failed to start CoreAudio: AudioComponentInstanceNew"; + } + } else +#endif + { +#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6) + /* Locate the default output audio unit */ + ComponentDescription desc; + desc.componentType = kAudioUnitType_Output; + desc.componentSubType = kAudioUnitSubType_HALOutput; + desc.componentManufacturer = kAudioUnitManufacturer_Apple; + desc.componentFlags = 0; + desc.componentFlagsMask = 0; + + Component comp = FindNextComponent (NULL, &desc); + if (comp == NULL) { + return "cocoa_s: Failed to start CoreAudio: FindNextComponent returned NULL"; + } + + /* Open & initialize the default output audio unit */ + if (OpenAComponent(comp, &_outputAudioUnit) != noErr) { + return "cocoa_s: Failed to start CoreAudio: OpenAComponent"; + } +#else + return "cocoa_s: Not supported on this OS X version"; +#endif } if (AudioUnitInitialize(_outputAudioUnit) != noErr) { @@ -132,9 +159,21 @@ void SoundDriver_Cocoa::Stop() return; } - if (CloseComponent(_outputAudioUnit) != noErr) { - DEBUG(driver, 0, "cocoa_s: Core_CloseAudio: CloseComponent failed"); - return; +#if defined(__AUDIOCOMPONENT_H__) || defined(HAVE_OSX_107_SDK) + if (MacOSVersionIsAtLeast(10, 6, 0)) { + if (AudioComponentInstanceDispose(_outputAudioUnit) != noErr) { + DEBUG(driver, 0, "cocoa_s: Core_CloseAudio: AudioComponentInstanceDispose failed"); + return; + } + } else +#endif + { +#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6) + if (CloseComponent(_outputAudioUnit) != noErr) { + DEBUG(driver, 0, "cocoa_s: Core_CloseAudio: CloseComponent failed"); + return; + } +#endif } } diff --git a/src/sound/win32_s.cpp b/src/sound/win32_s.cpp index 45f88172a9..c9c1a8afdc 100644 --- a/src/sound/win32_s.cpp +++ b/src/sound/win32_s.cpp @@ -19,6 +19,7 @@ #include "win32_s.h" #include #include +#include "../os/windows/win32.h" #include "../safeguards.h" @@ -41,6 +42,8 @@ static void PrepareHeader(WAVEHDR *hdr) static DWORD WINAPI SoundThread(LPVOID arg) { + SetWin32ThreadName(-1, "ottd:win-sound"); + do { for (WAVEHDR *hdr = _wave_hdr; hdr != endof(_wave_hdr); hdr++) { if ((hdr->dwFlags & WHDR_INQUEUE) != 0) continue; diff --git a/src/sound/win32_s.h b/src/sound/win32_s.h index 77906c88a3..c6c8e8d149 100644 --- a/src/sound/win32_s.h +++ b/src/sound/win32_s.h @@ -26,7 +26,7 @@ public: /** Factory for the sound driver for Windows. */ class FSoundDriver_Win32 : public DriverFactoryBase { public: - FSoundDriver_Win32() : DriverFactoryBase(Driver::DT_SOUND, 10, "win32", "Win32 WaveOut Sound Driver") {} + FSoundDriver_Win32() : DriverFactoryBase(Driver::DT_SOUND, 9, "win32", "Win32 WaveOut Sound Driver") {} /* virtual */ Driver *CreateInstance() const { return new SoundDriver_Win32(); } }; diff --git a/src/sound/xaudio2_s.cpp b/src/sound/xaudio2_s.cpp new file mode 100644 index 0000000000..60311ced20 --- /dev/null +++ b/src/sound/xaudio2_s.cpp @@ -0,0 +1,273 @@ +/* $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 xaudio2_s.cpp XAudio2 sound driver. */ + +#ifdef WITH_XAUDIO2 + +#include "../stdafx.h" +#include "../openttd.h" +#include "../driver.h" +#include "../mixer.h" +#include "../debug.h" +#include "../core/alloc_func.hpp" +#include "../core/bitmath_func.hpp" +#include "../core/math_func.hpp" + +// Windows 8 SDK required for XAudio2 +#undef NTDDI_VERSION +#undef _WIN32_WINNT + +#define NTDDI_VERSION NTDDI_WIN8 +#define _WIN32_WINNT _WIN32_WINNT_WIN8 + +#include "xaudio2_s.h" + +#include +#include +#include +#include + +using Microsoft::WRL::ComPtr; + +#include "../os/windows/win32.h" +#include "../safeguards.h" + +// Definition of the "XAudio2Create" call used to initialise XAudio2 +typedef HRESULT(__stdcall *API_XAudio2Create)(_Outptr_ IXAudio2** ppXAudio2, UINT32 Flags, XAUDIO2_PROCESSOR XAudio2Processor); + +static FSoundDriver_XAudio2 iFSoundDriver_XAudio2; + +/** +* Implementation of the IXAudio2VoiceCallback interface. +* Provides buffered audio to XAudio2 from the OpenTTD mixer. +*/ +class StreamingVoiceContext : public IXAudio2VoiceCallback +{ +private: + int bufferLength; + char *buffer; + +public: + IXAudio2SourceVoice* SourceVoice; + + StreamingVoiceContext(int bufferLength) + { + this->bufferLength = bufferLength; + this->buffer = MallocT(bufferLength); + } + + virtual ~StreamingVoiceContext() + { + free(this->buffer); + } + + HRESULT SubmitBuffer() + { + // Ensure we do have a valid voice + if (this->SourceVoice == nullptr) + { + return E_FAIL; + } + + MxMixSamples(this->buffer, this->bufferLength / 4); + + XAUDIO2_BUFFER buf = { 0 }; + buf.AudioBytes = this->bufferLength; + buf.pAudioData = (const BYTE *) this->buffer; + + return SourceVoice->SubmitSourceBuffer(&buf); + } + + STDMETHOD_(void, OnVoiceProcessingPassStart)(UINT32) override + { + } + + STDMETHOD_(void, OnVoiceProcessingPassEnd)() override + { + } + + STDMETHOD_(void, OnStreamEnd)() override + { + } + + STDMETHOD_(void, OnBufferStart)(void*) override + { + } + + STDMETHOD_(void, OnBufferEnd)(void*) override + { + SubmitBuffer(); + } + + STDMETHOD_(void, OnLoopEnd)(void*) override + { + } + + STDMETHOD_(void, OnVoiceError)(void*, HRESULT) override + { + } +}; + +static HMODULE _xaudio_dll_handle; +static IXAudio2SourceVoice* _source_voice = nullptr; +static IXAudio2MasteringVoice* _mastering_voice = nullptr; +static ComPtr _xaudio2; +static StreamingVoiceContext* _voice_context = nullptr; + +/** +* Initialises the XAudio2 driver. +* +* @param parm Driver parameters. +* @return An error message if unsuccessful, or NULL otherwise. +* +*/ +const char *SoundDriver_XAudio2::Start(const char * const *parm) +{ + HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED); + + if (FAILED(hr)) + { + DEBUG(driver, 0, "xaudio2_s: CoInitializeEx failed (%08x)", hr); + return "Failed to initialise COM"; + } + + _xaudio_dll_handle = LoadLibraryA(XAUDIO2_DLL_A); + + if (_xaudio_dll_handle == NULL) + { + CoUninitialize(); + + DEBUG(driver, 0, "xaudio2_s: Unable to load " XAUDIO2_DLL_A); + return "Failed to load XAudio2 DLL"; + } + + API_XAudio2Create xAudio2Create = (API_XAudio2Create) GetProcAddress(_xaudio_dll_handle, "XAudio2Create"); + + if (xAudio2Create == NULL) + { + FreeLibrary(_xaudio_dll_handle); + CoUninitialize(); + + DEBUG(driver, 0, "xaudio2_s: Unable to find XAudio2Create function in DLL"); + return "Failed to load XAudio2 DLL"; + } + + // Create the XAudio engine + UINT32 flags = 0; + hr = xAudio2Create(_xaudio2.GetAddressOf(), flags, XAUDIO2_DEFAULT_PROCESSOR); + + if (FAILED(hr)) + { + FreeLibrary(_xaudio_dll_handle); + CoUninitialize(); + + DEBUG(driver, 0, "xaudio2_s: XAudio2Create failed (%08x)", hr); + return "Failed to inititialise the XAudio2 engine"; + } + + // Create a mastering voice + hr = _xaudio2->CreateMasteringVoice(&_mastering_voice); + + if (FAILED(hr)) + { + _xaudio2.Reset(); + FreeLibrary(_xaudio_dll_handle); + CoUninitialize(); + + DEBUG(driver, 0, "xaudio2_s: CreateMasteringVoice failed (%08x)", hr); + return "Failed to create a mastering voice"; + } + + // Create a source voice to stream our audio + WAVEFORMATEX wfex; + + wfex.wFormatTag = WAVE_FORMAT_PCM; + wfex.nChannels = 2; + wfex.wBitsPerSample = 16; + wfex.nSamplesPerSec = GetDriverParamInt(parm, "hz", 44100); + wfex.nBlockAlign = (wfex.nChannels * wfex.wBitsPerSample) / 8; + wfex.nAvgBytesPerSec = wfex.nSamplesPerSec * wfex.nBlockAlign; + + // Limit buffer size to prevent overflows + int bufsize = GetDriverParamInt(parm, "bufsize", 8192); + bufsize = min(bufsize, UINT16_MAX); + + _voice_context = new StreamingVoiceContext(bufsize * 4); + + if (_voice_context == nullptr) + { + _mastering_voice->DestroyVoice(); + _xaudio2.Reset(); + FreeLibrary(_xaudio_dll_handle); + CoUninitialize(); + + return "Failed to create streaming voice context"; + } + + hr = _xaudio2->CreateSourceVoice(&_source_voice, &wfex, 0, 1.0f, _voice_context); + + if (FAILED(hr)) + { + _mastering_voice->DestroyVoice(); + _xaudio2.Reset(); + FreeLibrary(_xaudio_dll_handle); + CoUninitialize(); + + DEBUG(driver, 0, "xaudio2_s: CreateSourceVoice failed (%08x)", hr); + return "Failed to create a source voice"; + } + + _voice_context->SourceVoice = _source_voice; + hr = _source_voice->Start(0, 0); + + if (FAILED(hr)) + { + DEBUG(driver, 0, "xaudio2_s: _source_voice->Start failed (%08x)", hr); + + Stop(); + return "Failed to start the source voice"; + } + + MxInitialize(wfex.nSamplesPerSec); + + // Submit the first buffer + hr = _voice_context->SubmitBuffer(); + + if (FAILED(hr)) + { + DEBUG(driver, 0, "xaudio2_s: _voice_context->SubmitBuffer failed (%08x)", hr); + + Stop(); + return "Failed to submit the first audio buffer"; + } + + return NULL; +} + +/** +* Terminates the XAudio2 driver. +*/ +void SoundDriver_XAudio2::Stop() +{ + // Clean up XAudio2 + _source_voice->DestroyVoice(); + + delete _voice_context; + _voice_context = nullptr; + + _mastering_voice->DestroyVoice(); + + _xaudio2.Reset(); + + FreeLibrary(_xaudio_dll_handle); + CoUninitialize(); +} + +#endif diff --git a/src/sound/xaudio2_s.h b/src/sound/xaudio2_s.h new file mode 100644 index 0000000000..2385f49ee2 --- /dev/null +++ b/src/sound/xaudio2_s.h @@ -0,0 +1,33 @@ +/* $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 xaudio2_s.h Base for XAudio2 sound handling. */ + +#ifndef SOUND_XAUDIO2_H +#define SOUND_XAUDIO2_H + +#include "sound_driver.hpp" + +/** Implementation of the XAudio2 sound driver. */ +class SoundDriver_XAudio2 : public SoundDriver { +public: + /* virtual */ const char *Start(const char * const *param); + + /* virtual */ void Stop(); + /* virtual */ const char *GetName() const { return "xaudio2"; } +}; + +/** Factory for the XAudio2 sound driver. */ +class FSoundDriver_XAudio2 : public DriverFactoryBase { +public: + FSoundDriver_XAudio2() : DriverFactoryBase(Driver::DT_SOUND, 10, "xaudio2", "XAudio2 Sound Driver") {} + /* virtual */ Driver *CreateInstance() const { return new SoundDriver_XAudio2(); } +}; + +#endif /* SOUND_XAUDIO2_H */ diff --git a/src/sound_type.h b/src/sound_type.h index 72486dcac9..76fe25139e 100644 --- a/src/sound_type.h +++ b/src/sound_type.h @@ -119,4 +119,6 @@ static const uint ORIGINAL_SAMPLE_COUNT = 73; typedef uint16 SoundID; +static const SoundID INVALID_SOUND = 0xFFFF; + #endif /* SOUND_TYPE_H */ diff --git a/src/spritecache.cpp b/src/spritecache.cpp index 908e7599ab..579791d0d4 100644 --- a/src/spritecache.cpp +++ b/src/spritecache.cpp @@ -149,6 +149,25 @@ uint GetOriginFileSlot(SpriteID sprite) return GetSpriteCache(sprite)->file_slot; } +/** + * Count the sprites which originate from a specific file slot in a range of SpriteIDs. + * @param file_slot FIOS file slot. + * @param begin First sprite in range. + * @param end First sprite not in range. + * @return Number of sprites. + */ +uint GetSpriteCountForSlot(uint file_slot, SpriteID begin, SpriteID end) +{ + uint count = 0; + for (SpriteID i = begin; i != end; i++) { + if (SpriteExists(i)) { + SpriteCache *sc = GetSpriteCache(i); + if (sc->file_slot == file_slot) count++; + } + } + return count; +} + /** * Get a reasonable (upper bound) estimate of the maximum * SpriteID used in OpenTTD; there will be no sprites with @@ -799,7 +818,7 @@ static void *HandleInvalidSpriteRequest(SpriteID sprite, SpriteType requested, S switch (requested) { case ST_NORMAL: if (sprite == SPR_IMG_QUERY) usererror("Uhm, would you be so kind not to load a NewGRF that makes the 'query' sprite a non-normal sprite?"); - /* FALL THROUGH */ + FALLTHROUGH; case ST_FONT: return GetRawSprite(SPR_IMG_QUERY, ST_NORMAL, allocator); case ST_RECOLOUR: diff --git a/src/spritecache.h b/src/spritecache.h index 803bdb32c2..8013105183 100644 --- a/src/spritecache.h +++ b/src/spritecache.h @@ -32,6 +32,7 @@ bool SpriteExists(SpriteID sprite); SpriteType GetSpriteType(SpriteID sprite); uint GetOriginFileSlot(SpriteID sprite); +uint GetSpriteCountForSlot(uint file_slot, SpriteID begin, SpriteID end); uint GetMaxSpriteID(); diff --git a/src/station.cpp b/src/station.cpp index 456262dea4..f86286f3d9 100644 --- a/src/station.cpp +++ b/src/station.cpp @@ -35,9 +35,6 @@ StationPool _station_pool("Station"); INSTANTIATE_POOL_METHODS(Station) -typedef StationIDStack::SmallStackPool StationIDStackPool; -template<> StationIDStackPool StationIDStack::_pool = StationIDStackPool(); - BaseStation::~BaseStation() { free(this->name); diff --git a/src/station_base.h b/src/station_base.h index af4d206ba0..086d4332c5 100644 --- a/src/station_base.h +++ b/src/station_base.h @@ -470,7 +470,7 @@ public: byte last_vehicle_type; std::list loading_vehicles; GoodsEntry goods[NUM_CARGO]; ///< Goods at this station - uint32 always_accepted; ///< Bitmask of always accepted cargo types (by houses, HQs, industry tiles when industry doesn't accept cargo) + CargoTypes always_accepted; ///< Bitmask of always accepted cargo types (by houses, HQs, industry tiles when industry doesn't accept cargo) IndustryVector industries_near; ///< Cached list of industries near the station that can accept cargo, @see DeliverGoodsToIndustry() @@ -516,7 +516,7 @@ private: public: /** * Construct the iterator. - * @param ta Area, i.e. begin point and width/height of to-be-iterated area. + * @param st Station the airport is part of. */ AirportTileIterator(const Station *st) : OrthogonalTileIterator(st->airport), st(st) { diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index eb90c29ab5..16f135df25 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -89,25 +89,25 @@ bool IsHangar(TileIndex t) } /** - * Look for a station around the given tile area. + * Look for a station owned by the given company around the given tile area. * @param ta the area to search over - * @param closest_station the closest station found so far + * @param closest_station the closest owned station found so far + * @param company the company whose stations to look for * @param st to 'return' the found station * @return Succeeded command (if zero or one station found) or failed command (for two or more stations found). */ template -CommandCost GetStationAround(TileArea ta, StationID closest_station, T **st) +CommandCost GetStationAround(TileArea ta, StationID closest_station, CompanyID company, T **st) { ta.tile -= TileDiffXY(1, 1); ta.w += 2; ta.h += 2; - /* check around to see if there's any stations there */ + /* check around to see if there are any stations there owned by the company */ TILE_AREA_LOOP(tile_cur, ta) { if (IsTileType(tile_cur, MP_STATION)) { StationID t = GetStationIndex(tile_cur); - if (!T::IsValidID(t)) continue; - + if (!T::IsValidID(t) || Station::Get(t)->owner != company) continue; if (closest_station == INVALID_STATION) { closest_station = t; } else if (closest_station != t) { @@ -440,12 +440,12 @@ void UpdateAllStationVirtCoords() * @param st Station to query * @return the expected mask */ -static uint GetAcceptanceMask(const Station *st) +static CargoTypes GetAcceptanceMask(const Station *st) { - uint mask = 0; + CargoTypes mask = 0; for (CargoID i = 0; i < NUM_CARGO; i++) { - if (HasBit(st->goods[i].status, GoodsEntry::GES_ACCEPTANCE)) mask |= 1 << i; + if (HasBit(st->goods[i].status, GoodsEntry::GES_ACCEPTANCE)) SetBit(mask, i); } return mask; } @@ -524,7 +524,7 @@ CargoArray GetProductionAroundTiles(TileIndex tile, int w, int h, int rad) * @param rad Search radius in addition to given area * @param always_accepted bitmask of cargo accepted by houses and headquarters; can be NULL */ -CargoArray GetAcceptanceAroundTiles(TileIndex tile, int w, int h, int rad, uint32 *always_accepted) +CargoArray GetAcceptanceAroundTiles(TileIndex tile, int w, int h, int rad, CargoTypes *always_accepted) { CargoArray acceptance; if (always_accepted != NULL) *always_accepted = 0; @@ -562,7 +562,7 @@ CargoArray GetAcceptanceAroundTiles(TileIndex tile, int w, int h, int rad, uint3 void UpdateStationAcceptance(Station *st, bool show_msg) { /* old accepted goods types */ - uint old_acc = GetAcceptanceMask(st); + CargoTypes old_acc = GetAcceptanceMask(st); /* And retrieve the acceptance. */ CargoArray acceptance; @@ -595,7 +595,7 @@ void UpdateStationAcceptance(Station *st, bool show_msg) } /* Only show a message in case the acceptance was actually changed. */ - uint new_acc = GetAcceptanceMask(st); + CargoTypes new_acc = GetAcceptanceMask(st); if (old_acc == new_acc) return; /* show a message to report that the acceptance was changed? */ @@ -662,7 +662,7 @@ static void UpdateStationSignCoord(BaseStation *st) /** * Common part of building various station parts and possibly attaching them to an existing one. - * @param [in,out] st Station to attach to + * @param[in,out] st Station to attach to * @param flags Command flags * @param reuse Whether to try to reuse a deleted station (gray sign) if possible * @param area Area occupied by the new part @@ -676,7 +676,7 @@ static CommandCost BuildStationPart(Station **st, DoCommandFlag flags, bool reus if (*st != NULL) { if ((*st)->owner != _current_company) { - return_cmd_error(STR_ERROR_TOO_CLOSE_TO_ANOTHER_STATION); + return_cmd_error(CMD_ERROR); } CommandCost ret = (*st)->rect.BeforeAddRect(area.tile, area.w, area.h, StationRect::ADD_TEST); @@ -960,6 +960,8 @@ static CommandCost CheckFlatLandRoadStop(TileArea tile_area, DoCommandFlag flags num_roadbits += CountBits(GetRoadBits(cur_tile, ROADTYPE_ROAD)); } + if (GetDisallowedRoadDirections(cur_tile) != DRD_NONE) return_cmd_error(STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD); + /* There is a tram, check if we can build road+tram stop over it. */ if (HasBit(cur_rts, ROADTYPE_TRAM)) { Owner tram_owner = GetRoadOwner(cur_tile, ROADTYPE_TRAM); @@ -1103,8 +1105,8 @@ CommandCost FindJoiningBaseStation(StationID existing_station, StationID station } if (check_surrounding) { - /* Make sure there are no similar stations around us. */ - CommandCost ret = GetStationAround(ta, existing_station, st); + /* Make sure there is no more than one other station around us that is owned by us. */ + CommandCost ret = GetStationAround(ta, existing_station, _current_company, st); if (ret.Failed()) return ret; } @@ -1142,13 +1144,37 @@ CommandCost FindJoiningWaypoint(StationID existing_waypoint, StationID waypoint_ return FindJoiningBaseStation(existing_waypoint, waypoint_to_join, adjacent, ta, wp); } +/** + * Clear platform reservation during station building/removing. + * @param v vehicle which holds reservation + */ +static void FreeTrainReservation(Train *v) +{ + FreeTrainTrackReservation(v); + if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), false); + v = v->Last(); + if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(ReverseTrackdir(v->GetVehicleTrackdir())), false); +} + +/** + * Restore platform reservation during station building/removing. + * @param v vehicle which held reservation + */ +static void RestoreTrainReservation(Train *v) +{ + if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), true); + TryPathReserve(v, true, true); + v = v->Last(); + if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(ReverseTrackdir(v->GetVehicleTrackdir())), true); +} + /** * Build rail station * @param tile_org northern most position of station dragging/placement * @param flags operation to perform * @param p1 various bitstuffed elements - * - p1 = (bit 0- 3) - railtype - * - p1 = (bit 4) - orientation (Axis) + * - p1 = (bit 0- 5) - railtype + * - p1 = (bit 6) - orientation (Axis) * - p1 = (bit 8-15) - number of tracks * - p1 = (bit 16-23) - platform length * - p1 = (bit 24) - allow stations directly adjacent to other stations. @@ -1162,8 +1188,8 @@ CommandCost FindJoiningWaypoint(StationID existing_waypoint, StationID waypoint_ CommandCost CmdBuildRailStation(TileIndex tile_org, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) { /* Unpack parameters */ - RailType rt = Extract(p1); - Axis axis = Extract(p1); + RailType rt = Extract(p1); + Axis axis = Extract(p1); byte numtracks = GB(p1, 8, 8); byte plat_len = GB(p1, 16, 8); bool adjacent = HasBit(p1, 24); @@ -1281,11 +1307,8 @@ CommandCost CmdBuildRailStation(TileIndex tile_org, DoCommandFlag flags, uint32 /* Check for trains having a reservation for this tile. */ Train *v = GetTrainForReservation(tile, AxisToTrack(GetRailStationAxis(tile))); if (v != NULL) { - FreeTrainTrackReservation(v); *affected_vehicles.Append() = v; - if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), false); - for (; v->Next() != NULL; v = v->Next()) { } - if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(ReverseTrackdir(v->GetVehicleTrackdir())), false); + FreeTrainReservation(v); } } @@ -1336,11 +1359,7 @@ CommandCost CmdBuildRailStation(TileIndex tile_org, DoCommandFlag flags, uint32 for (uint i = 0; i < affected_vehicles.Length(); ++i) { /* Restore reservations of trains. */ - Train *v = affected_vehicles[i]; - if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), true); - TryPathReserve(v, true, true); - for (; v->Next() != NULL; v = v->Next()) { } - if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(ReverseTrackdir(v->GetVehicleTrackdir())), true); + RestoreTrainReservation(affected_vehicles[i]); } /* Check whether we need to expand the reservation of trains already on the station. */ @@ -1504,14 +1523,7 @@ CommandCost RemoveFromRailBaseStation(TileArea ta, SmallVector &affected if (HasStationReservation(tile)) { v = GetTrainForReservation(tile, track); - if (v != NULL) { - /* Free train reservation. */ - FreeTrainTrackReservation(v); - if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), false); - Vehicle *temp = v; - for (; temp->Next() != NULL; temp = temp->Next()) { } - if (IsRailStationTile(temp->tile)) SetRailStationPlatformReservation(temp->tile, TrackdirToExitdir(ReverseTrackdir(temp->GetVehicleTrackdir())), false); - } + if (v != NULL) FreeTrainReservation(v); } bool build_rail = keep_rail && !IsStationTileBlocked(tile); @@ -1531,13 +1543,7 @@ CommandCost RemoveFromRailBaseStation(TileArea ta, SmallVector &affected affected_stations.Include(st); - if (v != NULL) { - /* Restore station reservation. */ - if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), true); - TryPathReserve(v, true, true); - for (; v->Next() != NULL; v = v->Next()) { } - if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(ReverseTrackdir(v->GetVehicleTrackdir())), true); - } + if (v != NULL) RestoreTrainReservation(v); } } @@ -2618,9 +2624,9 @@ const DrawTileSprites *GetStationTileLayout(StationType st, byte gfx) * Check whether a sprite is a track sprite, which can be replaced by a non-track ground sprite and a rail overlay. * If the ground sprite is suitable, \a ground is replaced with the new non-track ground sprite, and \a overlay_offset * is set to the overlay to draw. - * @param ti Positional info for the tile to decide snowyness etc. May be NULL. - * @param [in,out] ground Groundsprite to draw. - * @param [out] overlay_offset Overlay to draw. + * @param ti Positional info for the tile to decide snowyness etc. May be NULL. + * @param[in,out] ground Groundsprite to draw. + * @param[out] overlay_offset Overlay to draw. * @return true if overlay can be drawn. */ bool SplitGroundSpriteForOverlay(const TileInfo *ti, SpriteID *ground, RailTrackOffset *overlay_offset) @@ -2897,12 +2903,12 @@ draw_default_foundation: } } - if (HasStationRail(ti->tile) && HasCatenaryDrawn(GetRailType(ti->tile))) DrawCatenary(ti); + if (HasStationRail(ti->tile) && HasRailCatenaryDrawn(GetRailType(ti->tile))) DrawRailCatenary(ti); if (HasBit(roadtypes, ROADTYPE_TRAM)) { Axis axis = GetRoadStopDir(ti->tile) == DIAGDIR_NE ? AXIS_X : AXIS_Y; DrawGroundSprite((HasBit(roadtypes, ROADTYPE_ROAD) ? SPR_TRAMWAY_OVERLAY : SPR_TRAMWAY_TRAM) + (axis ^ 1), PAL_NONE); - DrawTramCatenary(ti, axis == AXIS_X ? ROAD_X : ROAD_Y); + DrawRoadCatenary(ti, axis == AXIS_X ? ROAD_X : ROAD_Y); } if (IsRailWaypoint(ti->tile)) { @@ -2995,6 +3001,7 @@ static void GetTileDesc_Station(TileIndex tile, TileDesc *td) const RailtypeInfo *rti = GetRailTypeInfo(GetRailType(tile)); td->rail_speed = rti->max_speed; + td->railtype = rti->strings.name; } if (IsAirport(tile)) { @@ -3086,7 +3093,8 @@ static void TileLoop_Station(TileIndex tile) case STATION_DOCK: if (!IsTileFlat(tile)) break; // only handle water part - /* FALL THROUGH */ + FALLTHROUGH; + case STATION_OILRIG: //(station part) case STATION_BUOY: TileLoop_Water(tile); @@ -3180,7 +3188,7 @@ static VehicleEnterTileStatus VehicleEnter_Station(Vehicle *v, TileIndex tile, i void TriggerWatchedCargoCallbacks(Station *st) { /* Collect cargoes accepted since the last big tick. */ - uint cargoes = 0; + CargoTypes cargoes = 0; for (CargoID cid = 0; cid < NUM_CARGO; cid++) { if (HasBit(st->goods[cid].status, GoodsEntry::GES_ACCEPTED_BIGTICK)) SetBit(cargoes, cid); } @@ -3445,6 +3453,7 @@ void RerouteCargo(Station *st, CargoID c, StationID avoid, StationID avoid2) void DeleteStaleLinks(Station *from) { for (CargoID c = 0; c < NUM_CARGO; ++c) { + const bool auto_distributed = (_settings_game.linkgraph.GetDistributionType(c) != DT_MANUAL); GoodsEntry &ge = from->goods[c]; LinkGraph *lg = LinkGraph::GetIfValid(ge.link_graph); if (lg == NULL) continue; @@ -3457,36 +3466,52 @@ void DeleteStaleLinks(Station *from) assert(_date >= edge.LastUpdate()); uint timeout = LinkGraph::MIN_TIMEOUT_DISTANCE + (DistanceManhattan(from->xy, to->xy) >> 3); if ((uint)(_date - edge.LastUpdate()) > timeout) { - /* Have all vehicles refresh their next hops before deciding to - * remove the node. */ bool updated = false; - OrderList *l; - FOR_ALL_ORDER_LISTS(l) { - bool found_from = false; - bool found_to = false; - for (Order *order = l->GetFirstOrder(); order != NULL; order = order->next) { - if (!order->IsType(OT_GOTO_STATION) && !order->IsType(OT_IMPLICIT)) continue; - if (order->GetDestination() == from->index) { - found_from = true; - if (found_to) break; - } else if (order->GetDestination() == to->index) { - found_to = true; - if (found_from) break; + + if (auto_distributed) { + /* Have all vehicles refresh their next hops before deciding to + * remove the node. */ + OrderList *l; + SmallVector vehicles; + FOR_ALL_ORDER_LISTS(l) { + bool found_from = false; + bool found_to = false; + for (Order *order = l->GetFirstOrder(); order != NULL; order = order->next) { + if (!order->IsType(OT_GOTO_STATION) && !order->IsType(OT_IMPLICIT)) continue; + if (order->GetDestination() == from->index) { + found_from = true; + if (found_to) break; + } else if (order->GetDestination() == to->index) { + found_to = true; + if (found_from) break; + } } + if (!found_to || !found_from) continue; + *(vehicles.Append()) = l->GetFirstSharedVehicle(); } - if (!found_to || !found_from) continue; - for (Vehicle *v = l->GetFirstSharedVehicle(); !updated && v != NULL; v = v->NextShared()) { - /* There is potential for optimization here: - * - Usually consists of the same order list are the same. It's probably better to - * first check the first of each list, then the second of each list and so on. - * - We could try to figure out if we've seen a consist with the same cargo on the - * same list already and if the consist can actually carry the cargo we're looking - * for. With conditional and refit orders this is not quite trivial, though. */ + + Vehicle **iter = vehicles.Begin(); + while (iter != vehicles.End()) { + Vehicle *v = *iter; + LinkRefresher::Run(v, false); // Don't allow merging. Otherwise lg might get deleted. - if (edge.LastUpdate() == _date) updated = true; + if (edge.LastUpdate() == _date) { + updated = true; + break; + } + + Vehicle *next_shared = v->NextShared(); + if (next_shared) { + *iter = next_shared; + ++iter; + } else { + vehicles.Erase(iter); + } + + if (iter == vehicles.End()) iter = vehicles.Begin(); } - if (updated) break; } + if (!updated) { /* If it's still considered dead remove it. */ node.RemoveEdge(to->goods[c].node); diff --git a/src/station_func.h b/src/station_func.h index f33dbd21fb..9748297f21 100644 --- a/src/station_func.h +++ b/src/station_func.h @@ -28,7 +28,7 @@ void ShowStationViewWindow(StationID station); void UpdateAllStationVirtCoords(); CargoArray GetProductionAroundTiles(TileIndex tile, int w, int h, int rad); -CargoArray GetAcceptanceAroundTiles(TileIndex tile, int w, int h, int rad, uint32 *always_accepted = NULL); +CargoArray GetAcceptanceAroundTiles(TileIndex tile, int w, int h, int rad, CargoTypes *always_accepted = NULL); void UpdateStationAcceptance(Station *st, bool show_msg); diff --git a/src/station_gui.cpp b/src/station_gui.cpp index 7399fe0067..3f64b139ac 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -56,7 +56,7 @@ int DrawStationCoverageAreaText(int left, int right, int top, StationCoverageType sct, int rad, bool supplies) { TileIndex tile = TileVirtXY(_thd.pos.x, _thd.pos.y); - uint32 cargo_mask = 0; + CargoTypes cargo_mask = 0; if (_thd.drawstyle == HT_RECT && tile < MapSize()) { CargoArray cargoes; if (supplies) { @@ -156,8 +156,8 @@ protected: static Listing last_sorting; static byte facilities; // types of stations of interest static bool include_empty; // whether we should include stations without waiting cargo - static const uint32 cargo_filter_max; - static uint32 cargo_filter; // bitmap of cargo types to include + static const CargoTypes cargo_filter_max; + static CargoTypes cargo_filter; // bitmap of cargo types to include static const Station *last_station; /* Constants for sorting stations */ @@ -654,8 +654,8 @@ public: Listing CompanyStationsWindow::last_sorting = {false, 0}; byte CompanyStationsWindow::facilities = FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK; bool CompanyStationsWindow::include_empty = true; -const uint32 CompanyStationsWindow::cargo_filter_max = UINT32_MAX; -uint32 CompanyStationsWindow::cargo_filter = UINT32_MAX; +const CargoTypes CompanyStationsWindow::cargo_filter_max = ALL_CARGOTYPES; +CargoTypes CompanyStationsWindow::cargo_filter = ALL_CARGOTYPES; const Station *CompanyStationsWindow::last_station = NULL; /* Availible station sorting functions */ @@ -802,7 +802,6 @@ static const NWidgetPart _nested_station_view_widgets[] = { * @param left left most coordinate to draw on * @param right right most coordinate to draw on * @param y y coordinate - * @param width the width of the view */ static void DrawCargoIcons(CargoID i, uint waiting, int left, int right, int y) { @@ -1799,7 +1798,7 @@ struct StationViewWindow : public Window { { const Station *st = Station::Get(this->window_number); - uint32 cargo_mask = 0; + CargoTypes cargo_mask = 0; for (CargoID i = 0; i < NUM_CARGO; i++) { if (HasBit(st->goods[i].status, GoodsEntry::GES_ACCEPTANCE)) SetBit(cargo_mask, i); } @@ -1820,7 +1819,7 @@ struct StationViewWindow : public Window { if (st->town->exclusive_counter > 0) { SetDParam(0, st->town->exclusivity); - y = DrawStringMultiLine(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, r.bottom, st->town->exclusivity == st->owner ? STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_SELF : STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY); + y = DrawStringMultiLine(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, r.bottom, st->town->exclusivity == st->owner ? STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF : STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY); y += WD_PAR_VSEP_WIDE; } @@ -2208,7 +2207,7 @@ static const T *FindStationsNearby(TileArea ta, bool distant_join) if (distant_join && min(ta.w, ta.h) >= _settings_game.station.station_spread) return NULL; uint max_dist = distant_join ? _settings_game.station.station_spread - min(ta.w, ta.h) : 1; - TileIndex tile = TILE_ADD(ctx.tile, TileOffsByDir(DIR_N)); + TileIndex tile = TileAddByDir(ctx.tile, DIR_N); CircularTileSearch(&tile, max_dist, ta.w, ta.h, AddNearbyStation, &ctx); return NULL; diff --git a/src/station_map.h b/src/station_map.h index 7ca9bd7204..e591787e3b 100644 --- a/src/station_map.h +++ b/src/station_map.h @@ -542,6 +542,7 @@ static inline void MakeStation(TileIndex t, Owner o, StationID sid, StationType SB(_me[t].m6, 2, 1, 0); SB(_me[t].m6, 3, 3, st); _me[t].m7 = 0; + _me[t].m8 = 0; } /** diff --git a/src/stdafx.h b/src/stdafx.h index 4616212f18..c76cb6c2b2 100644 --- a/src/stdafx.h +++ b/src/stdafx.h @@ -100,12 +100,6 @@ #define strcasecmp stricmp #endif -#if defined(PSP) - #include - #include - #include -#endif - #if defined(SUNOS) || defined(HPUX) #include #endif @@ -134,36 +128,34 @@ #define CLIB_USERGROUP_PROTOS_H #endif /* __MORPHOS__ */ -#if defined(PSP) - /* PSP can only have 10 file-descriptors open at any given time, but this - * switch only limits reads via the Fio system. So keep 2 fds free for things - * like saving a game. */ - #define LIMITED_FDS 8 - #define printf pspDebugScreenPrintf -#endif /* PSP */ - /* Stuff for GCC */ -#if defined(__GNUC__) +#if defined(__GNUC__) || defined(__clang__) #define NORETURN __attribute__ ((noreturn)) #define CDECL #define __int64 long long - #define GCC_PACK __attribute__((packed)) /* Warn about functions using 'printf' format syntax. First argument determines which parameter * is the format string, second argument is start of values passed to printf. */ #define WARN_FORMAT(string, args) __attribute__ ((format (printf, string, args))) - #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) - #define FINAL final + #define FINAL final + + /* Use fallthrough attribute where supported */ + #if __GNUC__ >= 7 + #if __cplusplus > 201402L // C++17 + #define FALLTHROUGH [[fallthrough]] + #else + #define FALLTHROUGH __attribute__((fallthrough)) + #endif #else - #define FINAL + #define FALLTHROUGH #endif -#endif /* __GNUC__ */ +#endif /* __GNUC__ || __clang__ */ #if defined(__WATCOMC__) #define NORETURN #define CDECL - #define GCC_PACK #define WARN_FORMAT(string, args) #define FINAL + #define FALLTHROUGH #include #endif /* __WATCOMC__ */ @@ -171,7 +163,7 @@ #include // alloca() #endif -#if defined(WIN32) +#if defined(_WIN32) #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #endif @@ -191,9 +183,7 @@ #define NTDDI_VERSION NTDDI_WIN2K // Windows 2000 #define _WIN32_WINNT 0x0500 // Windows 2000 #define _WIN32_WINDOWS 0x400 // Windows 95 - #if !defined(WINCE) - #define WINVER 0x0400 // Windows NT 4.0 / Windows 95 - #endif + #define WINVER 0x0400 // Windows NT 4.0 / Windows 95 #define _WIN32_IE_ 0x0401 // 4.01 (win98 and NT4SP5+) #endif #define NOMINMAX // Disable min/max macros in windows.h. @@ -227,47 +217,46 @@ #define inline __forceinline #endif - #if !defined(WINCE) - #define CDECL _cdecl - #endif - - #define GCC_PACK + #define CDECL _cdecl #define WARN_FORMAT(string, args) #define FINAL sealed - #if defined(WINCE) - int CDECL vsnprintf(char *str, size_t size, const char *format, va_list ap); + /* fallthrough attribute, VS 2017 */ + #if (_MSC_VER >= 1910) + #define FALLTHROUGH [[fallthrough]] + #else + #define FALLTHROUGH #endif - #if defined(WIN32) && !defined(_WIN64) && !defined(WIN64) +# if defined(_WIN32) && !defined(_WIN64) #if !defined(_W64) #define _W64 #endif typedef _W64 int INT_PTR, *PINT_PTR; typedef _W64 unsigned int UINT_PTR, *PUINT_PTR; - #endif /* WIN32 && !_WIN64 && !WIN64 */ +# endif /* _WIN32 && !_WIN64 */ - #if defined(_WIN64) || defined(WIN64) +# if defined(_WIN64) #define fseek _fseeki64 - #endif /* _WIN64 || WIN64 */ +# endif /* _WIN64 */ - /* This is needed to zlib uses the stdcall calling convention on visual studio */ - #if defined(WITH_ZLIB) || defined(WITH_PNG) - #if !defined(ZLIB_WINAPI) - #define ZLIB_WINAPI - #endif - #endif + /* zlib from vcpkg use cdecl calling convention without enforcing it in the headers */ +# if defined(WITH_ZLIB) +# if !defined(ZEXPORT) +# define ZEXPORT CDECL +# endif +# endif - #if defined(WINCE) - #define strcasecmp _stricmp - #define strncasecmp _strnicmp - #undef DEBUG - #else - #define strcasecmp stricmp - #define strncasecmp strnicmp - #endif + /* freetype from vcpkg use cdecl calling convention without enforcing it in the headers */ +# if defined(WITH_FREETYPE) +# if !defined(FT_EXPORT) +# define FT_EXPORT( x ) extern "C" x CDECL +# endif +# endif + #define strcasecmp stricmp + #define strncasecmp strnicmp #define strtoull _strtoui64 /* MSVC doesn't have these :( */ @@ -285,35 +274,28 @@ #define SIGBUS SIGNOFP #endif -#if defined(WINCE) - #define stredup _stredup -#endif /* WINCE */ - /* NOTE: the string returned by these functions is only valid until the next * call to the same function and is not thread- or reentrancy-safe */ #if !defined(STRGEN) && !defined(SETTINGSGEN) - #if defined(WIN32) || defined(WIN64) +# if defined(_WIN32) char *getcwd(char *buf, size_t size); #include #include - /* XXX - WinCE without MSVCRT doesn't support wfopen, so it seems */ - #if !defined(WINCE) - namespace std { using ::_tfopen; } - #define fopen(file, mode) _tfopen(OTTD2FS(file), _T(mode)) - #define unlink(file) _tunlink(OTTD2FS(file)) - #endif /* WINCE */ + namespace std { using ::_tfopen; } + #define fopen(file, mode) _tfopen(OTTD2FS(file), _T(mode)) + #define unlink(file) _tunlink(OTTD2FS(file)) const char *FS2OTTD(const TCHAR *name); const TCHAR *OTTD2FS(const char *name, bool console_cp = false); - #else +# else #define fopen(file, mode) fopen(OTTD2FS(file), mode) const char *FS2OTTD(const char *name); const char *OTTD2FS(const char *name); - #endif /* WIN32 */ +# endif /* _WIN32 */ #endif /* STRGEN || SETTINGSGEN */ -#if defined(WIN32) || defined(WIN64) || defined(__OS2__) && !defined(__INNOTEK_LIBC__) +#if defined(_WIN32) || defined(__OS2__) && !defined(__INNOTEK_LIBC__) #define PATHSEP "\\" #define PATHSEPCHAR '\\' #else @@ -321,13 +303,25 @@ #define PATHSEPCHAR '/' #endif +#if defined(_MSC_VER) || defined(__WATCOMC__) +# define PACK_N(type_dec, n) __pragma(pack(push, n)) type_dec; __pragma(pack(pop)) +#elif defined(__MINGW32__) +# define PRAGMA(x) _Pragma(#x) +# define PACK_N(type_dec, n) PRAGMA(pack(push, n)) type_dec; PRAGMA(pack(pop)) +#else +# define PACK_N(type_dec, n) type_dec __attribute__((__packed__, aligned(n))) +#endif +#define PACK(type_dec) PACK_N(type_dec, 1) + /* MSVCRT of course has to have a different syntax for long long *sigh* */ #if defined(_MSC_VER) || defined(__MINGW32__) #define OTTD_PRINTF64 "%I64d" + #define OTTD_PRINTF64U "%I64u" #define OTTD_PRINTFHEX64 "%I64x" #define PRINTF_SIZE "%Iu" #else #define OTTD_PRINTF64 "%lld" + #define OTTD_PRINTF64U "%llu" #define OTTD_PRINTFHEX64 "%llx" #define PRINTF_SIZE "%zu" #endif @@ -361,21 +355,8 @@ typedef unsigned char byte; #define PERSONAL_DIR "" #endif -/* Compile time assertions. Prefer c++0x static_assert(). - * Older compilers cannot evaluate some expressions at compile time, - * typically when templates are involved, try assert_tcompile() in those cases. */ -#if defined(__STDCXX_VERSION__) || defined(__GXX_EXPERIMENTAL_CXX0X__) || defined(__GXX_EXPERIMENTAL_CPP0X__) || defined(static_assert) - /* __STDCXX_VERSION__ is c++0x feature macro, __GXX_EXPERIMENTAL_CXX0X__ is used by gcc, __GXX_EXPERIMENTAL_CPP0X__ by icc */ - #define assert_compile(expr) static_assert(expr, #expr ) - #define assert_tcompile(expr) assert_compile(expr) -#elif defined(__OS2__) - /* Disabled for OS/2 */ - #define assert_compile(expr) - #define assert_tcompile(expr) assert_compile(expr) -#else - #define assert_compile(expr) typedef int __ct_assert__[1 - 2 * !(expr)] - #define assert_tcompile(expr) assert(expr) -#endif +#define assert_compile(expr) static_assert(expr, #expr ) +#define assert_tcompile(expr) assert_compile(expr) /* Check if the types have the bitsizes like we are using them */ assert_compile(sizeof(uint64) == 8); @@ -444,8 +425,27 @@ assert_compile(SIZE_MAX >= UINT32_MAX); #define CloseConnection OTTD_CloseConnection #endif /* __APPLE__ */ +#if defined(__GNUC__) || defined(__clang__) +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) +#else +#define likely(x) (x) +#define unlikely(x) (x) +#endif /* __GNUC__ || __clang__ */ + +#if defined(__GNUC__) || defined(__clang__) +__attribute__((aligned(1))) typedef uint16 unaligned_uint16; +__attribute__((aligned(1))) typedef uint32 unaligned_uint32; +__attribute__((aligned(1))) typedef uint64 unaligned_uint64; +#else +typedef uint16 unaligned_uint16; +typedef uint32 unaligned_uint32; +typedef uint64 unaligned_uint64; +#endif /* __GNUC__ || __clang__ */ + void NORETURN CDECL usererror(const char *str, ...) WARN_FORMAT(1, 2); void NORETURN CDECL error(const char *str, ...) WARN_FORMAT(1, 2); +void NORETURN CDECL assert_msg_error(int line, const char *file, const char *expr, const char *str, ...) WARN_FORMAT(4, 5); #define NOT_REACHED() error("NOT_REACHED triggered at line %i of %s", __LINE__, __FILE__) /* For non-debug builds with assertions enabled use the special assertion handler: @@ -454,12 +454,15 @@ void NORETURN CDECL error(const char *str, ...) WARN_FORMAT(1, 2); */ #if (defined(_MSC_VER) && defined(NDEBUG) && defined(WITH_ASSERT)) || (!defined(_MSC_VER) && !defined(NDEBUG) && !defined(_DEBUG)) #undef assert - #define assert(expression) if (!(expression)) error("Assertion failed at line %i of %s: %s", __LINE__, __FILE__, #expression); + #define assert(expression) if (unlikely(!(expression))) error("Assertion failed at line %i of %s: %s", __LINE__, __FILE__, #expression); #endif /* Asserts are enabled if NDEBUG isn't defined, or if we are using MSVC and WITH_ASSERT is defined. */ #if !defined(NDEBUG) || (defined(_MSC_VER) && defined(WITH_ASSERT)) #define OTTD_ASSERT + #define assert_msg(expression, ...) if (unlikely(!(expression))) assert_msg_error(__LINE__, __FILE__, #expression, __VA_ARGS__); +#else + #define assert_msg(expression, ...) #endif #if defined(MORPHOS) || defined(__NDS__) || defined(__DJGPP__) diff --git a/src/story.cpp b/src/story.cpp index b74842f41a..602dc27248 100644 --- a/src/story.cpp +++ b/src/story.cpp @@ -101,7 +101,7 @@ static void UpdateElement(StoryPageElement &pe, TileIndex tile, uint32 reference * @param p1 various bitstuffed elements * - p1 = (bit 0 - 7) - Company for which this story page belongs to. * @param p2 unused. - * @param text Title of the story page. Null is allowed in wich case a generic page title is provided by OpenTTD. + * @param text Title of the story page. Null is allowed in which case a generic page title is provided by OpenTTD. * @return the cost of this operation or an error */ CommandCost CmdCreateStoryPage(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) diff --git a/src/strgen/strgen.cpp b/src/strgen/strgen.cpp index 85b83f2b57..44cbd127a1 100644 --- a/src/strgen/strgen.cpp +++ b/src/strgen/strgen.cpp @@ -21,14 +21,14 @@ #include #include -#if (!defined(WIN32) && !defined(WIN64)) || defined(__CYGWIN__) +#if !defined(_WIN32) || defined(__CYGWIN__) #include #include #endif -#if defined WIN32 || defined __WATCOMC__ +#if defined(_WIN32) || defined(__WATCOMC__) #include -#endif /* WIN32 || __WATCOMC__ */ +#endif /* _WIN32 || __WATCOMC__ */ #ifdef __MORPHOS__ #ifdef stderr @@ -215,7 +215,10 @@ bool CompareFiles(const char *n1, const char *n2) if (f2 == NULL) return false; FILE *f1 = fopen(n1, "rb"); - if (f1 == NULL) error("can't open %s", n1); + if (f1 == NULL) { + fclose(f2); + error("can't open %s", n1); + } size_t l1, l2; do { @@ -330,9 +333,9 @@ struct HeaderFileWriter : HeaderWriter, FileWriter { unlink(this->filename); } else { /* else rename tmp.xxx into filename */ - #if defined(WIN32) || defined(WIN64) +# if defined(_WIN32) unlink(this->real_filename); - #endif +# endif if (rename(this->filename, this->real_filename) == -1) error("rename() failed"); } } @@ -374,7 +377,7 @@ static inline void ottd_mkdir(const char *directory) { /* Ignore directory creation errors; they'll surface later on, and most * of the time they are 'directory already exists' errors anyhow. */ -#if defined(WIN32) || defined(__WATCOMC__) +#if defined(_WIN32) || defined(__WATCOMC__) mkdir(directory); #else mkdir(directory, 0755); @@ -525,7 +528,7 @@ int CDECL main(int argc, char *argv[]) mkpath(pathbuf, lastof(pathbuf), src_dir, "english.txt"); /* parse master file */ - StringData data(TAB_COUNT); + StringData data(TEXT_TAB_END); FileStringReader master_reader(data, pathbuf, true, false); master_reader.ParseFile(); if (_errors != 0) return 1; @@ -542,7 +545,7 @@ int CDECL main(int argc, char *argv[]) mkpath(pathbuf, lastof(pathbuf), src_dir, "english.txt"); - StringData data(TAB_COUNT); + StringData data(TEXT_TAB_END); /* parse master file and check if target file is correct */ FileStringReader master_reader(data, pathbuf, true, false); master_reader.ParseFile(); diff --git a/src/strgen/strgen_base.cpp b/src/strgen/strgen_base.cpp index 385ca72b2a..8d46b1b271 100644 --- a/src/strgen/strgen_base.cpp +++ b/src/strgen/strgen_base.cpp @@ -85,7 +85,7 @@ void LangString::FreeTranslation() /** * Create a new string data container. - * @param max_strings The maximum number of strings. + * @param tabs The maximum number of strings. */ StringData::StringData(size_t tabs) : tabs(tabs), max_strings(tabs * TAB_SIZE) { diff --git a/src/string.cpp b/src/string.cpp index 1ceae6061b..7746166cae 100644 --- a/src/string.cpp +++ b/src/string.cpp @@ -25,6 +25,18 @@ #include // required by vsnprintf implementation for MSVC #endif +#ifdef _WIN32 +#include "os/windows/win32.h" +#endif + +#ifdef WITH_UNISCRIBE +#include "os/windows/string_uniscribe.h" +#endif + +#if defined(WITH_COCOA) +#include "os/macosx/string_osx.h" +#endif + #ifdef WITH_ICU_SORT /* Required by strnatcmp. */ #include @@ -168,7 +180,7 @@ void str_fix_scc_encoded(char *str, const char *last) if ((len == 0 && str + 4 > last) || str + len > last) break; WChar c; - len = Utf8Decode(&c, str); + Utf8Decode(&c, str); if (c == '\0') break; if (c == 0xE028 || c == 0xE02A) { @@ -180,14 +192,7 @@ void str_fix_scc_encoded(char *str, const char *last) } -/** - * Scans the string for valid characters and if it finds invalid ones, - * replaces them with a question mark '?' (if not ignored) - * @param str the string to validate - * @param last the last valid character of str - * @param settings the settings for the string validation. - */ -void str_validate(char *str, const char *last, StringValidationSettings settings) +char *str_validate_intl(char *str, const char *last, StringValidationSettings settings) { /* Assume the ABSOLUTE WORST to be in str as it comes from the outside. */ @@ -228,7 +233,7 @@ void str_validate(char *str, const char *last, StringValidationSettings settings } } - *dst = '\0'; + return dst; } /** @@ -349,12 +354,11 @@ bool IsValidChar(WChar key, CharSetFilter afilter) case CS_NUMERAL_SPACE: return (key >= '0' && key <= '9') || key == ' '; case CS_ALPHA: return IsPrintable(key) && !(key >= '0' && key <= '9'); case CS_HEXADECIMAL: return (key >= '0' && key <= '9') || (key >= 'a' && key <= 'f') || (key >= 'A' && key <= 'F'); + default: NOT_REACHED(); } - - return false; } -#ifdef WIN32 +#ifdef _WIN32 #if defined(_MSC_VER) && _MSC_VER < 1900 /** * Almost POSIX compliant implementation of \c vsnprintf for VC compiler. @@ -390,7 +394,7 @@ int CDECL vsnprintf(char *str, size_t size, const char *format, va_list ap) } #endif /* _MSC_VER */ -#endif /* WIN32 */ +#endif /* _WIN32 */ /** * Safer implementation of snprintf; same as snprintf except: @@ -578,20 +582,37 @@ int strnatcmp(const char *s1, const char *s2, bool ignore_garbage_at_front) s1 = SkipGarbage(s1); s2 = SkipGarbage(s2); } + #ifdef WITH_ICU_SORT if (_current_collator != NULL) { UErrorCode status = U_ZERO_ERROR; int result = _current_collator->compareUTF8(s1, s2, status); if (U_SUCCESS(status)) return result; } - #endif /* WITH_ICU_SORT */ +#if defined(_WIN32) && !defined(STRGEN) && !defined(SETTINGSGEN) + int res = OTTDStringCompare(s1, s2); + if (res != 0) return res - 2; // Convert to normal C return values. +#endif + +#if defined(WITH_COCOA) && !defined(STRGEN) && !defined(SETTINGSGEN) + int res = MacOSStringCompare(s1, s2); + if (res != 0) return res - 2; // Convert to normal C return values. +#endif + /* Do a normal comparison if ICU is missing or if we cannot create a collator. */ return strcasecmp(s1, s2); } -#ifdef WITH_ICU_SORT +#ifdef WITH_UNISCRIBE + +/* static */ StringIterator *StringIterator::Create() +{ + return new UniscribeStringIterator(); +} + +#elif defined(WITH_ICU_SORT) #include #include @@ -852,9 +873,19 @@ public: } }; +#if defined(WITH_COCOA) && !defined(STRGEN) && !defined(SETTINGSGEN) +/* static */ StringIterator *StringIterator::Create() +{ + StringIterator *i = OSXStringIterator::Create(); + if (i != NULL) return i; + + return new DefaultStringIterator(); +} +#else /* static */ StringIterator *StringIterator::Create() { return new DefaultStringIterator(); } +#endif /* defined(WITH_COCOA) && !defined(STRGEN) && !defined(SETTINGSGEN) */ #endif diff --git a/src/string_base.h b/src/string_base.h index e1eaed3496..02856cf1c6 100644 --- a/src/string_base.h +++ b/src/string_base.h @@ -41,9 +41,9 @@ public: /** * Change the current string cursor. - * @param p New cursor position. + * @param pos New cursor position. * @return Actual new cursor position at the next valid character boundary. - * @pre p has to be inside the current string. + * @pre pos has to be inside the current string. */ virtual size_t SetCurPosition(size_t pos) = 0; diff --git a/src/string_func.h b/src/string_func.h index dd9b42600d..f5dd289499 100644 --- a/src/string_func.h +++ b/src/string_func.h @@ -41,7 +41,20 @@ int CDECL vseprintf(char *str, const char *last, const char *format, va_list ap) char *CDECL str_fmt(const char *str, ...) WARN_FORMAT(1, 2); char *str_vfmt(const char *str, va_list ap); -void str_validate(char *str, const char *last, StringValidationSettings settings = SVS_REPLACE_WITH_QUESTION_MARK); +char *str_validate_intl(char *str, const char *last, StringValidationSettings settings); + +/** + * Scans the string for valid characters and if it finds invalid ones, + * replaces them with a question mark '?' (if not ignored) + * @param str the string to validate + * @param last the last valid character of str + * @param settings the settings for the string validation. + */ +static inline void str_validate(char *str, const char *last, StringValidationSettings settings = SVS_REPLACE_WITH_QUESTION_MARK) +{ + *str_validate_intl(str, last, settings) = '\0'; +} + void ValidateString(const char *str); void str_fix_scc_encoded(char *str, const char *last); diff --git a/src/string_func_extra.h b/src/string_func_extra.h new file mode 100644 index 0000000000..9c320f3ea2 --- /dev/null +++ b/src/string_func_extra.h @@ -0,0 +1,23 @@ +/* $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 . + */ + +#ifndef STRING_FUNC_EXTRA_H +#define STRING_FUNC_EXTRA_H + +#include "string_func.h" +#include + +static inline void str_validate(std::string &str, StringValidationSettings settings = SVS_REPLACE_WITH_QUESTION_MARK) +{ + if (str.empty()) return; + char *buf = const_cast(str.c_str()); + str.resize(str_validate_intl(buf, buf + str.size(), settings) - buf); +} + +#endif /* STRING_FUNC_EXTRA_H */ diff --git a/src/strings.cpp b/src/strings.cpp index d2ce762b70..2cc3a23be2 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -35,7 +35,9 @@ #include "window_func.h" #include "debug.h" #include "game/game_text.hpp" -#include "network/network_content_gui.h" +#ifdef ENABLE_NETWORK +# include "network/network_content_gui.h" +#endif /* ENABLE_NETWORK */ #include #include "table/strings.h" @@ -50,11 +52,11 @@ const LanguageMetadata *_current_language = NULL; ///< The currently loaded lang TextDirection _current_text_dir; ///< Text direction of the currently selected language. #ifdef WITH_ICU_SORT -Collator *_current_collator = NULL; ///< Collator for the language currently in use. +icu::Collator *_current_collator = NULL; ///< Collator for the language currently in use. #endif /* WITH_ICU_SORT */ static uint64 _global_string_params_data[20]; ///< Global array of string parameters. To access, use #SetDParam. -static WChar _global_string_params_type[20]; ///< Type of parameters stored in #_decode_parameters +static WChar _global_string_params_type[20]; ///< Type of parameters stored in #_global_string_params StringParameters _global_string_params(_global_string_params_data, 20, _global_string_params_type); /** Reset the type array. */ @@ -185,21 +187,19 @@ struct LanguagePack : public LanguagePackHeader { static char **_langpack_offs; static LanguagePack *_langpack; -static uint _langtab_num[TAB_COUNT]; ///< Offset into langpack offs -static uint _langtab_start[TAB_COUNT]; ///< Offset into langpack offs +static uint _langtab_num[TEXT_TAB_END]; ///< Offset into langpack offs +static uint _langtab_start[TEXT_TAB_END]; ///< Offset into langpack offs static bool _scan_for_gender_data = false; ///< Are we scanning for the gender of the current string? (instead of formatting it) const char *GetStringPtr(StringID string) { - switch (GB(string, TAB_COUNT_OFFSET, TAB_COUNT_BITS)) { - case GAME_TEXT_TAB: return GetGameStringPtr(GB(string, TAB_SIZE_OFFSET, TAB_SIZE_BITS)); + switch (GetStringTab(string)) { + case TEXT_TAB_GAMESCRIPT_START: return GetGameStringPtr(GetStringIndex(string)); /* 0xD0xx and 0xD4xx IDs have been converted earlier. */ - case 26: NOT_REACHED(); - case 28: return GetGRFStringPtr(GB(string, TAB_SIZE_OFFSET, TAB_SIZE_BITS)); - case 29: return GetGRFStringPtr(GB(string, TAB_SIZE_OFFSET, TAB_SIZE_BITS) + 0x0800); - case 30: return GetGRFStringPtr(GB(string, TAB_SIZE_OFFSET, TAB_SIZE_BITS) + 0x1000); - default: return _langpack_offs[_langtab_start[GB(string, TAB_COUNT_OFFSET, TAB_COUNT_BITS)] + GB(string, TAB_SIZE_OFFSET, TAB_SIZE_BITS)]; + case TEXT_TAB_OLD_NEWGRF: NOT_REACHED(); + case TEXT_TAB_NEWGRF_START: return GetGRFStringPtr(GetStringIndex(string)); + default: return _langpack_offs[_langtab_start[GetStringTab(string)] + GetStringIndex(string)]; } } @@ -217,43 +217,40 @@ char *GetStringWithArgs(char *buffr, StringID string, StringParameters *args, co { if (string == 0) return GetStringWithArgs(buffr, STR_UNDEFINED, args, last); - uint index = GB(string, TAB_SIZE_OFFSET, TAB_SIZE_BITS); - uint tab = GB(string, TAB_COUNT_OFFSET, TAB_COUNT_BITS); + uint index = GetStringIndex(string); + StringTab tab = GetStringTab(string); switch (tab) { - case 4: + case TEXT_TAB_TOWN: if (index >= 0xC0 && !game_script) { return GetSpecialTownNameString(buffr, index - 0xC0, args->GetInt32(), last); } break; - case 14: + case TEXT_TAB_SPECIAL: if (index >= 0xE4 && !game_script) { return GetSpecialNameString(buffr, index - 0xE4, args, last); } break; - case 15: + case TEXT_TAB_OLD_CUSTOM: /* Old table for custom names. This is no longer used */ if (!game_script) { error("Incorrect conversion of custom name string."); } break; - case GAME_TEXT_TAB: + case TEXT_TAB_GAMESCRIPT_START: return FormatString(buffr, GetGameStringPtr(index), args, last, case_index, true); - case 26: + case TEXT_TAB_OLD_NEWGRF: NOT_REACHED(); - case 28: + case TEXT_TAB_NEWGRF_START: return FormatString(buffr, GetGRFStringPtr(index), args, last, case_index); - case 29: - return FormatString(buffr, GetGRFStringPtr(index + 0x0800), args, last, case_index); - - case 30: - return FormatString(buffr, GetGRFStringPtr(index + 0x1000), args, last, case_index); + default: + break; } if (index >= _langtab_num[tab]) { @@ -452,6 +449,8 @@ static char *FormatGenericCurrency(char *buff, const CurrencySpec *spec, Money n /* convert from negative */ if (number < 0) { + if (buff + Utf8CharLen(SCC_PUSH_COLOUR) > last) return buff; + buff += Utf8Encode(buff, SCC_PUSH_COLOUR); if (buff + Utf8CharLen(SCC_RED) > last) return buff; buff += Utf8Encode(buff, SCC_RED); buff = strecpy(buff, "-", last); @@ -488,8 +487,8 @@ static char *FormatGenericCurrency(char *buff, const CurrencySpec *spec, Money n if (spec->symbol_pos != 0) buff = strecpy(buff, spec->suffix, last); if (negative) { - if (buff + Utf8CharLen(SCC_PREVIOUS_COLOUR) > last) return buff; - buff += Utf8Encode(buff, SCC_PREVIOUS_COLOUR); + if (buff + Utf8CharLen(SCC_POP_COLOUR) > last) return buff; + buff += Utf8Encode(buff, SCC_POP_COLOUR); *buff = '\0'; } @@ -761,11 +760,10 @@ uint ConvertDisplaySpeedToKmhishSpeed(uint speed) } /** * Parse most format codes within a string and write the result to a buffer. - * @param buff The buffer to write the final string to. - * @param str The original string with format codes. - * @param args Pointer to extra arguments used by various string codes. - * @param case_index - * @param last Pointer to just past the end of the buff array. + * @param buff The buffer to write the final string to. + * @param str_arg The original string with format codes. + * @param args Pointer to extra arguments used by various string codes. + * @param last Pointer to just past the end of the buff array. * @param dry_run True when the argt array is not yet initialized. */ static char *FormatString(char *buff, const char *str_arg, StringParameters *args, const char *last, uint case_index, bool game_script, bool dry_run) @@ -820,17 +818,15 @@ static char *FormatString(char *buff, const char *str_arg, StringParameters *arg sub_args.ClearTypeInformation(); memset(sub_args_need_free, 0, sizeof(sub_args_need_free)); - uint16 stringid; - const char *s = str; char *p; - stringid = strtol(str, &p, 16); + uint32 stringid = strtoul(str, &p, 16); if (*p != ':' && *p != '\0') { while (*p != '\0') p++; str = p; buff = strecat(buff, "(invalid SCC_ENCODED)", last); break; } - if (stringid >= TAB_SIZE) { + if (stringid >= TAB_SIZE_GAMESCRIPT) { while (*p != '\0') p++; str = p; buff = strecat(buff, "(invalid StringID)", last); @@ -840,7 +836,7 @@ static char *FormatString(char *buff, const char *str_arg, StringParameters *arg int i = 0; while (*p != '\0' && i < 20) { uint64 param; - s = ++p; + const char *s = ++p; /* Find the next value */ bool instring = false; @@ -878,13 +874,13 @@ static char *FormatString(char *buff, const char *str_arg, StringParameters *arg param = strtoull(s, &p, 16); if (lookup) { - if (param >= TAB_SIZE) { + if (param >= TAB_SIZE_GAMESCRIPT) { while (*p != '\0') p++; str = p; buff = strecat(buff, "(invalid sub-StringID)", last); break; } - param = (GAME_TEXT_TAB << TAB_COUNT_OFFSET) + param; + param = MakeStringID(TEXT_TAB_GAMESCRIPT_START, param); } sub_args.SetParam(i++, param); @@ -899,7 +895,7 @@ static char *FormatString(char *buff, const char *str_arg, StringParameters *arg /* If we didn't error out, we can actually print the string. */ if (*str != '\0') { str = p; - buff = GetStringWithArgs(buff, (GAME_TEXT_TAB << TAB_COUNT_OFFSET) + stringid, &sub_args, last, true); + buff = GetStringWithArgs(buff, MakeStringID(TEXT_TAB_GAMESCRIPT_START, stringid), &sub_args, last, true); } for (int i = 0; i < 20; i++) { @@ -1015,7 +1011,7 @@ static char *FormatString(char *buff, const char *str_arg, StringParameters *arg case SCC_STRING: {// {STRING} StringID str = args->GetInt32(SCC_STRING); - if (game_script && GB(str, TAB_COUNT_OFFSET, TAB_COUNT_BITS) != GAME_TEXT_TAB) break; + if (game_script && GetStringTab(str) != TEXT_TAB_GAMESCRIPT_START) break; /* WARNING. It's prohibited for the included string to consume any arguments. * For included strings that consume argument, you should use STRING1, STRING2 etc. * To debug stuff you can set argv to NULL and it will tell you */ @@ -1034,7 +1030,7 @@ static char *FormatString(char *buff, const char *str_arg, StringParameters *arg case SCC_STRING7: { // {STRING1..7} /* Strings that consume arguments */ StringID str = args->GetInt32(b); - if (game_script && GB(str, TAB_COUNT_OFFSET, TAB_COUNT_BITS) != GAME_TEXT_TAB) break; + if (game_script && GetStringTab(str) != TEXT_TAB_GAMESCRIPT_START) break; uint size = b - SCC_STRING1 + 1; if (game_script && size > args->GetDataLeft()) { buff = strecat(buff, "(too many parameters)", last); @@ -1149,7 +1145,7 @@ static char *FormatString(char *buff, const char *str_arg, StringParameters *arg } case SCC_CARGO_LIST: { // {CARGO_LIST} - uint32 cmask = args->GetInt32(SCC_CARGO_LIST); + CargoTypes cmask = args->GetInt64(SCC_CARGO_LIST); bool first = true; const CargoSpec *cs; @@ -1734,13 +1730,13 @@ bool ReadLanguagePack(const LanguageMetadata *lang) } #if TTD_ENDIAN == TTD_BIG_ENDIAN - for (uint i = 0; i < TAB_COUNT; i++) { + for (uint i = 0; i < TEXT_TAB_END; i++) { lang_pack->offsets[i] = ReadLE16Aligned(&lang_pack->offsets[i]); } #endif /* TTD_ENDIAN == TTD_BIG_ENDIAN */ uint count = 0; - for (uint i = 0; i < TAB_COUNT; i++) { + for (uint i = 0; i < TEXT_TAB_END; i++) { uint16 num = lang_pack->offsets[i]; if (num > TAB_SIZE) { free(lang_pack); @@ -1790,6 +1786,16 @@ bool ReadLanguagePack(const LanguageMetadata *lang) strecpy(_config_language_file, c_file, lastof(_config_language_file)); SetCurrentGrfLangID(_current_language->newgrflangid); +#ifdef _WIN32 + extern void Win32SetCurrentLocaleName(const char *iso_code); + Win32SetCurrentLocaleName(_current_language->isocode); +#endif + +#ifdef WITH_COCOA + extern void MacOSSetCurrentLocaleName(const char *iso_code); + MacOSSetCurrentLocaleName(_current_language->isocode); +#endif + #ifdef WITH_ICU_SORT /* Delete previous collator. */ if (_current_collator != NULL) { @@ -1799,7 +1805,7 @@ bool ReadLanguagePack(const LanguageMetadata *lang) /* Create a collator instance for our current locale. */ UErrorCode status = U_ZERO_ERROR; - _current_collator = Collator::createInstance(Locale(_current_language->isocode), status); + _current_collator = icu::Collator::createInstance(icu::Locale(_current_language->isocode), status); /* Sort number substrings by their numerical value. */ if (_current_collator != NULL) _current_collator->setAttribute(UCOL_NUMERIC_COLLATION, UCOL_ON, status); /* Avoid using the collator if it is not correctly set. */ @@ -1815,7 +1821,9 @@ bool ReadLanguagePack(const LanguageMetadata *lang) SortIndustryTypes(); BuildIndustriesLegend(); SortNetworkLanguages(); +#ifdef ENABLE_NETWORK BuildContentTypeStringList(); +#endif /* ENABLE_NETWORK */ InvalidateWindowClassesData(WC_BUILD_VEHICLE); // Build vehicle window. InvalidateWindowClassesData(WC_TRAINS_LIST); // Train group window. InvalidateWindowClassesData(WC_ROADVEH_LIST); // Road vehicle group window. @@ -1829,7 +1837,7 @@ bool ReadLanguagePack(const LanguageMetadata *lang) /* Win32 implementation in win32.cpp. * OS X implementation in os/macosx/macos.mm. */ -#if !(defined(WIN32) || defined(__APPLE__)) +#if !(defined(_WIN32) || defined(__APPLE__)) /** * Determine the current charset based on the environment * First check some default values, after this one we passed ourselves @@ -1857,7 +1865,7 @@ const char *GetCurrentLocale(const char *param) } #else const char *GetCurrentLocale(const char *param); -#endif /* !(defined(WIN32) || defined(__APPLE__)) */ +#endif /* !(defined(_WIN32) || defined(__APPLE__)) */ int CDECL StringIDSorter(const StringID *a, const StringID *b) { @@ -1998,7 +2006,7 @@ const char *GetCurrentLanguageIsoCode() /** * Check whether there are glyphs missing in the current language. - * @param Pointer to an address for storing the text pointer. + * @param[out] str Pointer to an address for storing the text pointer. * @return If glyphs are missing, return \c true, else return \c false. * @post If \c true is returned and str is not NULL, *str points to a string that is found to contain at least one missing glyph. */ @@ -2016,10 +2024,8 @@ bool MissingGlyphSearcher::FindMissingGlyphs(const char **str) FontSize size = this->DefaultSize(); if (str != NULL) *str = text; for (WChar c = Utf8Consume(&text); c != '\0'; c = Utf8Consume(&text)) { - if (c == SCC_TINYFONT) { - size = FS_SMALL; - } else if (c == SCC_BIGFONT) { - size = FS_LARGE; + if (c >= SCC_FIRST_FONT && c <= SCC_LAST_FONT) { + size = (FontSize)(c - SCC_FIRST_FONT); } else if (!IsInsideMM(c, SCC_SPRITE_START, SCC_SPRITE_END) && IsPrintable(c) && !IsTextDirectionChar(c) && c != '?' && GetGlyph(size, c) == question_mark[size]) { /* The character is printable, but not in the normal font. This is the case we were testing for. */ return true; @@ -2047,12 +2053,12 @@ class LanguagePackGlyphSearcher : public MissingGlyphSearcher { /* virtual */ const char *NextString() { - if (this->i >= TAB_COUNT) return NULL; + if (this->i >= TEXT_TAB_END) return NULL; const char *ret = _langpack_offs[_langtab_start[this->i] + this->j]; this->j++; - while (this->i < TAB_COUNT && this->j >= _langtab_num[this->i]) { + while (this->i < TEXT_TAB_END && this->j >= _langtab_num[this->i]) { this->i++; this->j = 0; } @@ -2132,7 +2138,7 @@ void CheckForMissingGlyphs(bool base_font, MissingGlyphSearcher *searcher) /* Update the font with cache */ LoadStringWidthTable(searcher->Monospace()); -#if !defined(WITH_ICU_LAYOUT) +#if !defined(WITH_ICU_LAYOUT) && !defined(WITH_UNISCRIBE) && !defined(WITH_COCOA) /* * For right-to-left languages we need the ICU library. If * we do not have support for that library we warn the user diff --git a/src/strings_func.h b/src/strings_func.h index 2c7809d020..0da711bc4d 100644 --- a/src/strings_func.h +++ b/src/strings_func.h @@ -15,6 +15,49 @@ #include "strings_type.h" #include "string_type.h" #include "gfx_type.h" +#include "core/bitmath_func.hpp" + +/** + * Extract the StringTab from a StringID. + * @param str String identifier + * @return StringTab from \a str + */ +static inline StringTab GetStringTab(StringID str) +{ + StringTab result = (StringTab)(str >> TAB_SIZE_BITS); + if (result >= TEXT_TAB_NEWGRF_START) return TEXT_TAB_NEWGRF_START; + if (result >= TEXT_TAB_GAMESCRIPT_START) return TEXT_TAB_GAMESCRIPT_START; + return result; +} + +/** + * Extract the StringIndex from a StringID. + * @param str String identifier + * @return StringIndex from \a str + */ +static inline uint GetStringIndex(StringID str) +{ + return str - (GetStringTab(str) << TAB_SIZE_BITS); +} + +/** + * Create a StringID + * @param tab StringTab + * @param index StringIndex + * @return StringID composed from \a tab and \a index + */ +static inline StringID MakeStringID(StringTab tab, uint index) +{ + if (tab == TEXT_TAB_NEWGRF_START) { + assert(index < TAB_SIZE_NEWGRF); + } else if (tab == TEXT_TAB_GAMESCRIPT_START) { + assert(index < TAB_SIZE_GAMESCRIPT); + } else { + assert(tab < TEXT_TAB_END); + assert(index < TAB_SIZE); + } + return (tab << TAB_SIZE_BITS) + index; +} class StringParameters { StringParameters *parent; ///< If not NULL, this instance references data from this parent instance. diff --git a/src/strings_type.h b/src/strings_type.h index c6eebd54d8..aa3ed788c3 100644 --- a/src/strings_type.h +++ b/src/strings_type.h @@ -15,8 +15,8 @@ /** * Numeric value that represents a string, independent of the selected language. */ -typedef uint16 StringID; -static const StringID INVALID_STRING_ID = 0xFFFF; ///< Constant representing an invalid string +typedef uint32 StringID; +static const StringID INVALID_STRING_ID = 0xFFFF; ///< Constant representing an invalid string (16bit in case it is used in savegames) static const int MAX_CHAR_LENGTH = 4; ///< Max. length of UTF-8 encoded unicode character static const uint MAX_LANG = 0x7F; ///< Maximum number of languages supported by the game, and the NewGRF specs @@ -26,6 +26,33 @@ enum TextDirection { TD_RTL, ///< Text is written right-to-left by default }; +/** StringTabs to group StringIDs */ +enum StringTab { + /* Tabs 0..1 for regular strings */ + TEXT_TAB_TOWN = 4, + TEXT_TAB_INDUSTRY = 9, + TEXT_TAB_STATION = 12, + TEXT_TAB_SPECIAL = 14, + TEXT_TAB_OLD_CUSTOM = 15, + TEXT_TAB_VEHICLE = 16, + /* Tab 17 for regular strings */ + TEXT_TAB_OLD_NEWGRF = 26, + TEXT_TAB_END = 32, ///< End of language files. + TEXT_TAB_GAMESCRIPT_START = 32, ///< Start of GameScript supplied strings. + TEXT_TAB_NEWGRF_START = 64, ///< Start of NewGRF supplied strings. +}; + +/** Number of bits for the StringIndex within a StringTab */ +static const uint TAB_SIZE_BITS = 11; +/** Number of strings per StringTab */ +static const uint TAB_SIZE = 1 << TAB_SIZE_BITS; + +/** Number of strings for GameScripts */ +static const uint TAB_SIZE_GAMESCRIPT = TAB_SIZE * 32; + +/** Number of strings for NewGRFs */ +static const uint TAB_SIZE_NEWGRF = TAB_SIZE * 256; + /** Special string constants */ enum SpecialStrings { diff --git a/src/subsidy.cpp b/src/subsidy.cpp index 62b463ced3..d1fda0f0ac 100644 --- a/src/subsidy.cpp +++ b/src/subsidy.cpp @@ -334,7 +334,7 @@ bool FindSubsidyTownCargoRoute() /* Select a random town. */ const Town *src_town = Town::GetRandom(); - uint32 town_cargo_produced = src_town->cargo_produced; + CargoTypes town_cargo_produced = src_town->cargo_produced; /* Passenger subsidies are not handled here. */ ClrBit(town_cargo_produced, CT_PASSENGERS); @@ -383,15 +383,21 @@ bool FindSubsidyIndustryCargoRoute() CargoID cid; /* Randomize cargo type */ - if (src_ind->produced_cargo[1] != CT_INVALID && HasBit(Random(), 0)) { - cid = src_ind->produced_cargo[1]; - trans = src_ind->last_month_pct_transported[1]; - total = src_ind->last_month_production[1]; - } else { - cid = src_ind->produced_cargo[0]; - trans = src_ind->last_month_pct_transported[0]; - total = src_ind->last_month_production[0]; + int num_cargos = 0; + uint cargo_index; + for (cargo_index = 0; cargo_index < lengthof(src_ind->produced_cargo); cargo_index++) { + if (src_ind->produced_cargo[cargo_index] != CT_INVALID) num_cargos++; } + if (num_cargos == 0) return false; // industry produces nothing + int cargo_num = RandomRange(num_cargos) + 1; + for (cargo_index = 0; cargo_index < lengthof(src_ind->produced_cargo); cargo_index++) { + if (src_ind->produced_cargo[cargo_index] != CT_INVALID) cargo_num--; + if (cargo_num == 0) break; + } + assert(cargo_num == 0); // indicates loop didn't break as intended + cid = src_ind->produced_cargo[cargo_index]; + trans = src_ind->last_month_pct_transported[cargo_index]; + total = src_ind->last_month_production[cargo_index]; /* Quit if no production in this industry * or if the pct transported is already large enough @@ -435,14 +441,11 @@ bool FindSubsidyCargoDestination(CargoID cid, SourceType src_type, SourceID src) case ST_INDUSTRY: { /* Select a random industry. */ const Industry *dst_ind = Industry::GetRandom(); + if (dst_ind == NULL) return false; /* The industry must accept the cargo */ - if (dst_ind == NULL || - (cid != dst_ind->accepts_cargo[0] && - cid != dst_ind->accepts_cargo[1] && - cid != dst_ind->accepts_cargo[2])) { - return false; - } + bool valid = std::find(dst_ind->accepts_cargo, endof(dst_ind->accepts_cargo), cid) != endof(dst_ind->accepts_cargo); + if (!valid) return false; dst = dst_ind->index; break; diff --git a/src/table/airport_defaults.h b/src/table/airport_defaults.h index 01a55ce89e..593e157ac3 100644 --- a/src/table/airport_defaults.h +++ b/src/table/airport_defaults.h @@ -28,7 +28,7 @@ #define MKEND {{-0x80, 0}, 0} /** Tiles for Country Airfield (small) */ -static AirportTileTable _tile_table_country_0[] = { +static const AirportTileTable _tile_table_country_0[] = { MK(0, 0, APT_SMALL_BUILDING_1), MK(1, 0, APT_SMALL_BUILDING_2), MK(2, 0, APT_SMALL_BUILDING_3), @@ -44,12 +44,12 @@ static AirportTileTable _tile_table_country_0[] = { MKEND }; -static AirportTileTable *_tile_table_country[] = { +static const AirportTileTable * const _tile_table_country[] = { _tile_table_country_0, }; /** Tiles for Commuter Airfield (small) */ -static AirportTileTable _tile_table_commuter_0[] = { +static const AirportTileTable _tile_table_commuter_0[] = { MK(0, 0, APT_TOWER), MK(1, 0, APT_BUILDING_3), MK(2, 0, APT_HELIPAD_2_FENCE_NW), @@ -73,12 +73,12 @@ static AirportTileTable _tile_table_commuter_0[] = { MKEND }; -static AirportTileTable *_tile_table_commuter[] = { +static const AirportTileTable * const _tile_table_commuter[] = { _tile_table_commuter_0, }; /** Tiles for City Airport (large) */ -static AirportTileTable _tile_table_city_0[] = { +static const AirportTileTable _tile_table_city_0[] = { MK(0, 0, APT_BUILDING_1), MK(1, 0, APT_APRON_FENCE_NW), MK(2, 0, APT_STAND_1), @@ -118,12 +118,12 @@ static AirportTileTable _tile_table_city_0[] = { MKEND }; -static AirportTileTable *_tile_table_city[] = { +static const AirportTileTable * const _tile_table_city[] = { _tile_table_city_0, }; /** Tiles for Metropolitain Airport (large) - 2 runways */ -static AirportTileTable _tile_table_metropolitan_0[] = { +static const AirportTileTable _tile_table_metropolitan_0[] = { MK(0, 0, APT_BUILDING_1), MK(1, 0, APT_APRON_FENCE_NW), MK(2, 0, APT_STAND_1), @@ -163,12 +163,12 @@ static AirportTileTable _tile_table_metropolitan_0[] = { MKEND }; -static AirportTileTable *_tile_table_metropolitan[] = { +static const AirportTileTable * const _tile_table_metropolitan[] = { _tile_table_metropolitan_0, }; /** Tiles for International Airport (large) - 2 runways */ -static AirportTileTable _tile_table_international_0[] = { +static const AirportTileTable _tile_table_international_0[] = { MK(0, 0, APT_RUNWAY_END_FENCE_NW), MK(1, 0, APT_RUNWAY_FENCE_NW), MK(2, 0, APT_RUNWAY_FENCE_NW), @@ -221,12 +221,12 @@ static AirportTileTable _tile_table_international_0[] = { MKEND }; -static AirportTileTable *_tile_table_international[] = { +static const AirportTileTable * const _tile_table_international[] = { _tile_table_international_0, }; /** Tiles for International Airport (large) - 2 runways */ -static AirportTileTable _tile_table_intercontinental_0[] = { +static const AirportTileTable _tile_table_intercontinental_0[] = { MK(0, 0, APT_RADAR_FENCE_NE), MK(1, 0, APT_RUNWAY_END_FENCE_NE_NW), MK(2, 0, APT_RUNWAY_FENCE_NW), @@ -329,22 +329,22 @@ static AirportTileTable _tile_table_intercontinental_0[] = { MKEND }; -static AirportTileTable *_tile_table_intercontinental[] = { +static const AirportTileTable * const _tile_table_intercontinental[] = { _tile_table_intercontinental_0, }; /** Tiles for Heliport */ -static AirportTileTable _tile_table_heliport_0[] = { +static const AirportTileTable _tile_table_heliport_0[] = { MK(0, 0, APT_HELIPORT), MKEND }; -static AirportTileTable *_tile_table_heliport[] = { +static const AirportTileTable * const _tile_table_heliport[] = { _tile_table_heliport_0, }; /** Tiles for Helidepot */ -static AirportTileTable _tile_table_helidepot_0[] = { +static const AirportTileTable _tile_table_helidepot_0[] = { MK(0, 0, APT_LOW_BUILDING_FENCE_N), MK(1, 0, APT_DEPOT_SE), MK(0, 1, APT_HELIPAD_2_FENCE_NE_SE), @@ -352,12 +352,12 @@ static AirportTileTable _tile_table_helidepot_0[] = { MKEND }; -static AirportTileTable *_tile_table_helidepot[] = { +static const AirportTileTable * const _tile_table_helidepot[] = { _tile_table_helidepot_0, }; /** Tiles for Helistation */ -static AirportTileTable _tile_table_helistation_0[] = { +static const AirportTileTable _tile_table_helistation_0[] = { MK(0, 0, APT_DEPOT_SE), MK(1, 0, APT_LOW_BUILDING_FENCE_NW), MK(2, 0, APT_HELIPAD_3_FENCE_NW), @@ -369,11 +369,11 @@ static AirportTileTable _tile_table_helistation_0[] = { MKEND }; -static AirportTileTable *_tile_table_helistation[] = { +static const AirportTileTable * const _tile_table_helistation[] = { _tile_table_helistation_0, }; -static Direction _default_airports_rotation[] = { +static const Direction _default_airports_rotation[] = { DIR_N, }; @@ -410,7 +410,7 @@ extern const AirportSpec _origin_airport_specs[] = { assert_compile(NEW_AIRPORT_OFFSET == lengthof(_origin_airport_specs)); -AirportSpec AirportSpec::dummy = AS_GENERIC(&_airportfta_dummy, NULL, _default_airports_rotation, 0, NULL, 0, 0, 0, 0, 0, MIN_YEAR, MIN_YEAR, 0, ATP_TTDP_LARGE, APC_BEGIN, STR_NULL, 0, false); +const AirportSpec AirportSpec::dummy = AS_GENERIC(&_airportfta_dummy, NULL, _default_airports_rotation, 0, NULL, 0, 0, 0, 0, 0, MIN_YEAR, MIN_YEAR, 0, ATP_TTDP_LARGE, APC_BEGIN, STR_NULL, 0, false); #undef AS #undef AS_ND diff --git a/src/table/build_industry.h b/src/table/build_industry.h index 5ae93bc7ed..62264eb6f8 100644 --- a/src/table/build_industry.h +++ b/src/table/build_industry.h @@ -293,6 +293,19 @@ static const IndustryTileTable _tile_table_oil_rig_0[] = { MK(-2, -4, 255), MK(-3, -4, 255), MK(2, 0, 255), + MK(2, -1, 255), + MK(1, -1, 255), + MK(0, -1, 255), + MK(-1, -1, 255), + MK(-1, 0, 255), + MK(-1, 1, 255), + MK(-1, 2, 255), + MK(-1, 3, 255), + MK(0, 3, 255), + MK(1, 3, 255), + MK(2, 3, 255), + MK(2, 2, 255), + MK(2, 1, 255), MKEND }; @@ -1182,8 +1195,12 @@ enum IndustryTypes { #define MI(tbl, sndc, snd, d, pc, ai1, ai2, ai3, ai4, ag1, ag2, ag3, ag4, col, \ c1, c2, c3, proc, p1, r1, p2, r2, m, a1, im1, a2, im2, a3, im3, pr, clim, bev, in, intx, s1, s2, s3) \ - {tbl, lengthof(tbl), d, 0, pc, {c1, c2, c3}, proc, {p1, p2}, {r1, r2}, m, \ - {a1, a2, a3}, {{im1, 0}, {im2, 0}, {im3, 0}}, pr, clim, bev, col, in, intx, s1, s2, s3, STR_UNDEFINED, {ai1, ai2, ai3, ai4}, {ag1, ag2, ag3, ag4}, \ + {tbl, lengthof(tbl), d, 0, pc, {c1, c2, c3}, proc, \ + {p1, p2, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID}, \ + {r1, r2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, m, \ + {a1, a2, a3, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID}, \ + {{im1, 0}, {im2, 0}, {im3, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}, \ + pr, clim, bev, col, in, intx, s1, s2, s3, STR_UNDEFINED, {ai1, ai2, ai3, ai4}, {ag1, ag2, ag3, ag4}, \ sndc, snd, 0, 0, true, GRFFileProps(INVALID_INDUSTRYTYPE)} /* Format: tile table count and sounds table @@ -1581,7 +1598,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { * @param a2 next frame of animation * @param a3 chooses between animation or construction state */ -#define MT(ca1, c1, ca2, c2, ca3, c3, sl, a1, a2, a3) {{c1, c2, c3}, {ca1, ca2, ca3}, sl, a1, a2, a3, 0, {0, ANIM_STATUS_NO_ANIMATION, 2, 0}, INDTILE_SPECIAL_NONE, true, GRFFileProps(INVALID_INDUSTRYTILE)} +#define MT(ca1, c1, ca2, c2, ca3, c3, sl, a1, a2, a3) {{c1, c2, c3, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID}, {ca1, ca2, ca3}, sl, a1, a2, a3, 0, {0, ANIM_STATUS_NO_ANIMATION, 2, 0}, INDTILE_SPECIAL_NONE, true, GRFFileProps(INVALID_INDUSTRYTILE)} static const IndustryTileSpec _origin_industry_tile_specs[NEW_INDUSTRYTILEOFFSET] = { /* Coal Mine */ MT(0, CT_INVALID, 0, CT_INVALID, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), diff --git a/src/table/company_settings.ini b/src/table/company_settings.ini index e49f4094fa..92d8b30ae8 100644 --- a/src/table/company_settings.ini +++ b/src/table/company_settings.ini @@ -18,8 +18,9 @@ static const SettingDesc _company_settings[] = { [post-amble] }; [templates] -SDT_BOOL = SDT_BOOL($base, $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL), -SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL), +SDT_BOOL = SDT_BOOL($base, $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, $patxname), +SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, $patxname, $orderproc), +SDT_NULL = SDT_NULL($length, $from, $to, $extver), SDT_END = SDT_END() [defaults] @@ -35,6 +36,8 @@ from = 0 to = SL_MAX_VERSION cat = SC_ADVANCED extver = SlXvFeatureTest() +patxname = NULL +orderproc = NULL diff --git a/src/table/control_codes.h b/src/table/control_codes.h index 81f9950d5f..d8e9673e9f 100644 --- a/src/table/control_codes.h +++ b/src/table/control_codes.h @@ -26,9 +26,13 @@ enum StringControlCode { /* This must be the first entry. It's encoded in strings that are saved. */ SCC_ENCODED = SCC_CONTROL_START, - /* Display control codes */ - SCC_TINYFONT, ///< Switch to small font - SCC_BIGFONT, ///< Switch to large font + /* Font selection codes, must be in same order as FontSize enum */ + SCC_FIRST_FONT, + SCC_NORMALFONT = SCC_FIRST_FONT, ///< Switch to normal size font + SCC_TINYFONT, ///< Switch to small font + SCC_BIGFONT, ///< Switch to large font + SCC_MONOFONT, ///< Switch to monospaced font + SCC_LAST_FONT = SCC_MONOFONT, /* Formatting control codes */ SCC_REVISION, @@ -111,42 +115,44 @@ enum StringControlCode { SCC_GRAY, SCC_DKBLUE, SCC_BLACK, - SCC_PREVIOUS_COLOUR, + SCC_PUSH_COLOUR, + SCC_POP_COLOUR, /** * The next variables are part of a NewGRF subsystem for creating text strings. * It uses a "stack" of bytes and reads from there. */ SCC_NEWGRF_FIRST, - SCC_NEWGRF_PRINT_DWORD_SIGNED = SCC_NEWGRF_FIRST, ///< Read 4 bytes from the stack - SCC_NEWGRF_PRINT_WORD_SIGNED, ///< Read 2 bytes from the stack as signed value - SCC_NEWGRF_PRINT_BYTE_SIGNED, ///< Read 1 byte from the stack as signed value - SCC_NEWGRF_PRINT_WORD_UNSIGNED, ///< Read 2 bytes from the stack as unsigned value - SCC_NEWGRF_PRINT_DWORD_CURRENCY, ///< Read 4 bytes from the stack as currency - SCC_NEWGRF_PRINT_WORD_STRING_ID, ///< Read 2 bytes from the stack as String ID - SCC_NEWGRF_PRINT_WORD_DATE_LONG, ///< Read 2 bytes from the stack as base 1920 date - SCC_NEWGRF_PRINT_WORD_DATE_SHORT, ///< Read 2 bytes from the stack as base 1920 date - SCC_NEWGRF_PRINT_WORD_SPEED, ///< Read 2 bytes from the stack as signed speed - SCC_NEWGRF_PRINT_WORD_VOLUME_LONG, ///< Read 2 bytes from the stack as long signed volume - SCC_NEWGRF_PRINT_WORD_WEIGHT_LONG, ///< Read 2 bytes from the stack as long unsigned weight - SCC_NEWGRF_PRINT_WORD_STATION_NAME, ///< Read 2 bytes from the stack as station name - SCC_NEWGRF_PRINT_QWORD_CURRENCY, ///< Read 8 bytes from the stack as currency - SCC_NEWGRF_PRINT_BYTE_HEX, ///< Read 1 byte from the stack and print it as hex - SCC_NEWGRF_PRINT_WORD_HEX, ///< Read 2 bytes from the stack and print it as hex - SCC_NEWGRF_PRINT_DWORD_HEX, ///< Read 4 bytes from the stack and print it as hex - SCC_NEWGRF_PRINT_QWORD_HEX, ///< Read 8 bytes from the stack and print it as hex - SCC_NEWGRF_PRINT_DWORD_DATE_LONG, ///< Read 4 bytes from the stack as base 0 date - SCC_NEWGRF_PRINT_DWORD_DATE_SHORT, ///< Read 4 bytes from the stack as base 0 date - SCC_NEWGRF_PRINT_WORD_POWER, ///< Read 2 bytes from the stack as unsigned power - SCC_NEWGRF_PRINT_WORD_VOLUME_SHORT, ///< Read 2 bytes from the stack as short signed volume - SCC_NEWGRF_PRINT_WORD_WEIGHT_SHORT, ///< Read 2 bytes from the stack as short unsigned weight - SCC_NEWGRF_PRINT_WORD_CARGO_LONG, ///< Read 2 + 2 bytes from the stack as cargo type (translated) and unsigned cargo amount - SCC_NEWGRF_PRINT_WORD_CARGO_SHORT, ///< Read 2 + 2 bytes from the stack as cargo type (translated) and unsigned cargo amount - SCC_NEWGRF_PRINT_WORD_CARGO_TINY, ///< Read 2 + 2 bytes from the stack as cargo type (translated) and unsigned cargo amount - SCC_NEWGRF_PUSH_WORD, ///< Pushes 2 bytes onto the stack - SCC_NEWGRF_UNPRINT, ///< "Unprints" the given number of bytes from the string - SCC_NEWGRF_DISCARD_WORD, ///< Discard the next two bytes - SCC_NEWGRF_ROTATE_TOP_4_WORDS, ///< Rotate the top 4 words of the stack (W4 W1 W2 W3) + SCC_NEWGRF_PRINT_DWORD_SIGNED = SCC_NEWGRF_FIRST, ///< 7B: Read 4 bytes from the stack + SCC_NEWGRF_PRINT_WORD_SIGNED, ///< 7C: Read 2 bytes from the stack as signed value + SCC_NEWGRF_PRINT_BYTE_SIGNED, ///< 7D: Read 1 byte from the stack as signed value + SCC_NEWGRF_PRINT_WORD_UNSIGNED, ///< 7E: Read 2 bytes from the stack as unsigned value + SCC_NEWGRF_PRINT_DWORD_CURRENCY, ///< 8F: Read 4 bytes from the stack as currency + SCC_NEWGRF_PRINT_WORD_STRING_ID, ///< 81: Read 2 bytes from the stack as String ID + SCC_NEWGRF_PRINT_WORD_DATE_LONG, ///< 82: Read 2 bytes from the stack as base 1920 date + SCC_NEWGRF_PRINT_WORD_DATE_SHORT, ///< 83: Read 2 bytes from the stack as base 1920 date + SCC_NEWGRF_PRINT_WORD_SPEED, ///< 84: Read 2 bytes from the stack as signed speed + SCC_NEWGRF_PRINT_WORD_VOLUME_LONG, ///< 87: Read 2 bytes from the stack as long signed volume + SCC_NEWGRF_PRINT_WORD_WEIGHT_LONG, ///< 9A 0D: Read 2 bytes from the stack as long unsigned weight + SCC_NEWGRF_PRINT_WORD_STATION_NAME, ///< 9A 0C: Read 2 bytes from the stack as station name + SCC_NEWGRF_PRINT_QWORD_CURRENCY, ///< 9A 01: Read 8 bytes from the stack as currency + SCC_NEWGRF_PRINT_BYTE_HEX, ///< 9A 06: Read 1 byte from the stack and print it as hex + SCC_NEWGRF_PRINT_WORD_HEX, ///< 9A 07: Read 2 bytes from the stack and print it as hex + SCC_NEWGRF_PRINT_DWORD_HEX, ///< 9A 08: Read 4 bytes from the stack and print it as hex + SCC_NEWGRF_PRINT_QWORD_HEX, ///< 9A 0B: Read 8 bytes from the stack and print it as hex + SCC_NEWGRF_PRINT_DWORD_DATE_LONG, ///< 9A 16: Read 4 bytes from the stack as base 0 date + SCC_NEWGRF_PRINT_DWORD_DATE_SHORT, ///< 9A 17: Read 4 bytes from the stack as base 0 date + SCC_NEWGRF_PRINT_WORD_POWER, ///< 9A 18: Read 2 bytes from the stack as unsigned power + SCC_NEWGRF_PRINT_WORD_VOLUME_SHORT, ///< 9A 19: Read 2 bytes from the stack as short signed volume + SCC_NEWGRF_PRINT_WORD_WEIGHT_SHORT, ///< 9A 1A: Read 2 bytes from the stack as short unsigned weight + SCC_NEWGRF_PRINT_WORD_CARGO_LONG, ///< 9A 1B: Read 2 + 2 bytes from the stack as cargo type (translated) and unsigned cargo amount + SCC_NEWGRF_PRINT_WORD_CARGO_SHORT, ///< 9A 1C: Read 2 + 2 bytes from the stack as cargo type (translated) and unsigned cargo amount + SCC_NEWGRF_PRINT_WORD_CARGO_TINY, ///< 9A 1D: Read 2 + 2 bytes from the stack as cargo type (translated) and unsigned cargo amount + SCC_NEWGRF_PRINT_WORD_CARGO_NAME, ///< 9A 1E: Read 2 bytes from the stack as cargo name + SCC_NEWGRF_PUSH_WORD, ///< 9A 03: Pushes 2 bytes onto the stack + SCC_NEWGRF_UNPRINT, ///< 9A 04: "Unprints" the given number of bytes from the string + SCC_NEWGRF_DISCARD_WORD, ///< 85: Discard the next two bytes + SCC_NEWGRF_ROTATE_TOP_4_WORDS, ///< 86: Rotate the top 4 words of the stack (W4 W1 W2 W3) SCC_NEWGRF_LAST = SCC_NEWGRF_ROTATE_TOP_4_WORDS, SCC_NEWGRF_STRINL, ///< Inline another string at the current position, StringID is encoded in the string diff --git a/src/table/currency_settings.ini b/src/table/currency_settings.ini index 6a8665379a..94e568f7b2 100644 --- a/src/table/currency_settings.ini +++ b/src/table/currency_settings.ini @@ -11,7 +11,7 @@ static const SettingDesc _currency_settings[] = { [post-amble] }; [templates] -SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL), +SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL, $orderproc), SDT_CHR = SDT_CHR($base, $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL), SDT_STR = SDT_STR($base, $var, $type, $flags, $guiflags, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL), SDT_END = SDT_END() @@ -29,6 +29,7 @@ from = 0 to = SL_MAX_VERSION cat = SC_ADVANCED extver = SlXvFeatureTest() +orderproc = NULL diff --git a/src/table/elrail_data.h b/src/table/elrail_data.h index 156f0e9413..6915360035 100644 --- a/src/table/elrail_data.h +++ b/src/table/elrail_data.h @@ -310,10 +310,10 @@ enum WireSpriteOffset { WSO_X_NE_UP, WSO_Y_NW_DOWN, - WSO_ENTRANCE_NE, - WSO_ENTRANCE_SE, WSO_ENTRANCE_SW, WSO_ENTRANCE_NW, + WSO_ENTRANCE_NE, + WSO_ENTRANCE_SE, }; struct SortableSpriteStruct { @@ -331,7 +331,7 @@ static const uint ELRAIL_ELEVATION = 10; /** Wires that a draw one level higher than the north corner. */ static const uint ELRAIL_ELEVRAISE = ELRAIL_ELEVATION + TILE_HEIGHT; -static const SortableSpriteStruct CatenarySpriteData[] = { +static const SortableSpriteStruct RailCatenarySpriteData[] = { /* X direction * Flat tiles: * Wires */ @@ -392,18 +392,18 @@ static const SortableSpriteStruct CatenarySpriteData[] = { { WSO_EW_E, 15, 8, 3, 3, 1, ELRAIL_ELEVATION } //!33: LOWER trackbit wire, pylon on both ends }; -static const SortableSpriteStruct CatenarySpriteData_Depot[] = { +static const SortableSpriteStruct RailCatenarySpriteData_Depot[] = { { WSO_ENTRANCE_NE, 0, 7, 15, 1, 1, ELRAIL_ELEVATION }, //! Wire for NE depot exit { WSO_ENTRANCE_SE, 7, 0, 1, 15, 1, ELRAIL_ELEVATION }, //! Wire for SE depot exit { WSO_ENTRANCE_SW, 0, 7, 15, 1, 1, ELRAIL_ELEVATION }, //! Wire for SW depot exit { WSO_ENTRANCE_NW, 7, 0, 1, 15, 1, ELRAIL_ELEVATION } //! Wire for NW depot exit }; -static const SortableSpriteStruct CatenarySpriteData_Tunnel[] = { - { WSO_ENTRANCE_NE, 0, 7, 15, 1, 1, ELRAIL_ELEVATION }, //! Wire for NE tunnel exit - { WSO_ENTRANCE_SE, 7, 0, 1, 15, 1, ELRAIL_ELEVATION }, //! Wire for SE tunnel exit - { WSO_ENTRANCE_SW, 0, 7, 15, 1, 1, ELRAIL_ELEVATION }, //! Wire for SW tunnel exit - { WSO_ENTRANCE_NW, 7, 0, 1, 15, 1, ELRAIL_ELEVATION } //! Wire for NW tunnel exit +static const SortableSpriteStruct RailCatenarySpriteData_Tunnel[] = { + { WSO_ENTRANCE_SW, 0, 7, 15, 1, 1, ELRAIL_ELEVATION }, //! Wire for NE tunnel (SW facing exit) + { WSO_ENTRANCE_NW, 7, 0, 1, 15, 1, ELRAIL_ELEVATION }, //! Wire for SE tunnel (NW facing exit) + { WSO_ENTRANCE_NE, 0, 7, 15, 1, 1, ELRAIL_ELEVATION }, //! Wire for SW tunnel (NE facing exit) + { WSO_ENTRANCE_SE, 7, 0, 1, 15, 1, ELRAIL_ELEVATION } //! Wire for NW tunnel (SE facing exit) }; @@ -419,7 +419,7 @@ static const SortableSpriteStruct CatenarySpriteData_Tunnel[] = { *
  • Position of the Pylon relative to the track
  • *
  • Position of the Pylon inside the tile
  • */ -enum CatenarySprite { +enum RailCatenarySprite { WIRE_X_FLAT_SW, WIRE_X_FLAT_NE, WIRE_X_FLAT_BOTH, @@ -471,7 +471,7 @@ enum CatenarySprite { * c) the second * d) both * PCP exists.*/ -static const CatenarySprite Wires[5][TRACK_END][4] = { +static const RailCatenarySprite Wires[5][TRACK_END][4] = { { // Tileh == 0 {INVALID_CATENARY, WIRE_X_FLAT_NE, WIRE_X_FLAT_SW, WIRE_X_FLAT_BOTH}, {INVALID_CATENARY, WIRE_Y_FLAT_SE, WIRE_Y_FLAT_NW, WIRE_Y_FLAT_BOTH}, diff --git a/src/table/gameopt_settings.ini b/src/table/gameopt_settings.ini index a5bc766ecb..798a6c9083 100644 --- a/src/table/gameopt_settings.ini +++ b/src/table/gameopt_settings.ini @@ -42,12 +42,12 @@ static const SettingDesc _gameopt_settings[] = { }; [templates] SDTG_GENERAL = SDTG_GENERAL($name, $sdt_cmd, $sle_cmd, $type, $flags, $guiflags, $var, $length, $def, $min, $max, $interval, $full, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL), -SDTG_VAR = SDTG_VAR($name, $type, $flags, $guiflags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL), +SDTG_VAR = SDTG_VAR($name, $type, $flags, $guiflags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL, $orderproc), SDT_NULL = SDT_NULL($length, $from, $to, $extver), SDTC_OMANY = SDTC_OMANY( $var, $type, $flags, $guiflags, $def, $max, $full, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL), SDTG_OMANY = SDTG_OMANY($name, $type, $flags, $guiflags, $var, $def, $max, $full, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL), SDT_OMANY = SDT_OMANY($base, $var, $type, $flags, $guiflags, $def, $max, $full, $str, $strhelp, $strval, $proc, $from, $to, $load, $cat, $extver, NULL), -SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL), +SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL, $orderproc), SDT_END = SDT_END() [defaults] @@ -63,6 +63,7 @@ from = 0 to = SL_MAX_VERSION cat = SC_ADVANCED extver = SlXvFeatureTest() +orderproc = NULL diff --git a/src/table/misc_settings.ini b/src/table/misc_settings.ini index 06bae18013..401d952bab 100644 --- a/src/table/misc_settings.ini +++ b/src/table/misc_settings.ini @@ -20,7 +20,7 @@ SDTG_MMANY = SDTG_MMANY($name, $type, $flags, $guiflags, $var, $def, SDTG_OMANY = SDTG_OMANY($name, $type, $flags, $guiflags, $var, $def, $max, $full, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL), SDTG_STR = SDTG_STR($name, $type, $flags, $guiflags, $var, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL), SDTG_BOOL = SDTG_BOOL($name, $flags, $guiflags, $var, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL), -SDTG_VAR = SDTG_VAR($name, $type, $flags, $guiflags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL), +SDTG_VAR = SDTG_VAR($name, $type, $flags, $guiflags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL, $orderproc), SDTG_END = SDTG_END() [defaults] @@ -36,6 +36,7 @@ from = 0 to = SL_MAX_VERSION cat = SC_ADVANCED extver = SlXvFeatureTest() +orderproc = NULL diff --git a/src/table/newgrf_debug_data.h b/src/table/newgrf_debug_data.h index b7d0c92024..19b411fed0 100644 --- a/src/table/newgrf_debug_data.h +++ b/src/table/newgrf_debug_data.h @@ -17,7 +17,7 @@ #define NIP_END() { NULL, 0, 0, 0, 0 } /* Helper for filling callback tables */ -#define NIC(cb_id, base, variable, bit) { #cb_id, cpp_offsetof(base, variable), cpp_sizeof(base, variable), bit, cb_id } +#define NIC(cb_id, base, variable, bit) { #cb_id, (ptrdiff_t)cpp_offsetof(base, variable), cpp_sizeof(base, variable), bit, cb_id } #define NIC_END() { NULL, 0, 0, 0, 0 } /* Helper for filling variable tables */ @@ -272,11 +272,38 @@ static const NIFeature _nif_industrytile = { /*** NewGRF industries ***/ static const NIProperty _nip_industries[] = { - NIP(0x10, Industry, produced_cargo[0], NIT_CARGO, "produced cargo 0"), - NIP(0x10, Industry, produced_cargo[1], NIT_CARGO, "produced cargo 1"), - NIP(0x11, Industry, accepts_cargo[0], NIT_CARGO, "accepted cargo 0"), - NIP(0x11, Industry, accepts_cargo[1], NIT_CARGO, "accepted cargo 1"), - NIP(0x11, Industry, accepts_cargo[2], NIT_CARGO, "accepted cargo 2"), + NIP(0x25, Industry, produced_cargo[ 0], NIT_CARGO, "produced cargo 0"), + NIP(0x25, Industry, produced_cargo[ 1], NIT_CARGO, "produced cargo 1"), + NIP(0x25, Industry, produced_cargo[ 2], NIT_CARGO, "produced cargo 2"), + NIP(0x25, Industry, produced_cargo[ 3], NIT_CARGO, "produced cargo 3"), + NIP(0x25, Industry, produced_cargo[ 4], NIT_CARGO, "produced cargo 4"), + NIP(0x25, Industry, produced_cargo[ 5], NIT_CARGO, "produced cargo 5"), + NIP(0x25, Industry, produced_cargo[ 6], NIT_CARGO, "produced cargo 6"), + NIP(0x25, Industry, produced_cargo[ 7], NIT_CARGO, "produced cargo 7"), + NIP(0x25, Industry, produced_cargo[ 8], NIT_CARGO, "produced cargo 8"), + NIP(0x25, Industry, produced_cargo[ 9], NIT_CARGO, "produced cargo 9"), + NIP(0x25, Industry, produced_cargo[10], NIT_CARGO, "produced cargo 10"), + NIP(0x25, Industry, produced_cargo[11], NIT_CARGO, "produced cargo 11"), + NIP(0x25, Industry, produced_cargo[12], NIT_CARGO, "produced cargo 12"), + NIP(0x25, Industry, produced_cargo[13], NIT_CARGO, "produced cargo 13"), + NIP(0x25, Industry, produced_cargo[14], NIT_CARGO, "produced cargo 14"), + NIP(0x25, Industry, produced_cargo[15], NIT_CARGO, "produced cargo 15"), + NIP(0x26, Industry, accepts_cargo[ 0], NIT_CARGO, "accepted cargo 0"), + NIP(0x26, Industry, accepts_cargo[ 1], NIT_CARGO, "accepted cargo 1"), + NIP(0x26, Industry, accepts_cargo[ 2], NIT_CARGO, "accepted cargo 2"), + NIP(0x26, Industry, accepts_cargo[ 3], NIT_CARGO, "accepted cargo 3"), + NIP(0x26, Industry, accepts_cargo[ 4], NIT_CARGO, "accepted cargo 4"), + NIP(0x26, Industry, accepts_cargo[ 5], NIT_CARGO, "accepted cargo 5"), + NIP(0x26, Industry, accepts_cargo[ 6], NIT_CARGO, "accepted cargo 6"), + NIP(0x26, Industry, accepts_cargo[ 7], NIT_CARGO, "accepted cargo 7"), + NIP(0x26, Industry, accepts_cargo[ 8], NIT_CARGO, "accepted cargo 8"), + NIP(0x26, Industry, accepts_cargo[ 9], NIT_CARGO, "accepted cargo 9"), + NIP(0x26, Industry, accepts_cargo[10], NIT_CARGO, "accepted cargo 10"), + NIP(0x26, Industry, accepts_cargo[11], NIT_CARGO, "accepted cargo 11"), + NIP(0x26, Industry, accepts_cargo[12], NIT_CARGO, "accepted cargo 12"), + NIP(0x26, Industry, accepts_cargo[13], NIT_CARGO, "accepted cargo 13"), + NIP(0x26, Industry, accepts_cargo[14], NIT_CARGO, "accepted cargo 14"), + NIP(0x26, Industry, accepts_cargo[15], NIT_CARGO, "accepted cargo 15"), NIP_END() }; diff --git a/src/table/settings.h.preamble b/src/table/settings.h.preamble index ed67d43c30..9adc7e79fa 100644 --- a/src/table/settings.h.preamble +++ b/src/table/settings.h.preamble @@ -61,11 +61,14 @@ static size_t ConvertLandscape(const char *value); /* Macros for various objects to go in the configuration file. * This section is for global variables */ -#define SDTG_GENERAL(name, sdt_cmd, sle_cmd, type, flags, guiflags, var, length, def, min, max, interval, full, str, strhelp, strval, proc, from, to, cat, extver, patxname)\ - {NSD_GENERAL(name, def, sdt_cmd, guiflags, min, max, interval, full, str, strhelp, strval, proc, NULL, cat), SLEG_GENERAL_X(sle_cmd, var, type | flags, length, from, to, extver), patxname} +#define SDTG_GENERAL2(name, sdt_cmd, sle_cmd, type, flags, guiflags, var, length, def, min, max, interval, full, str, strhelp, strval, proc, from, to, cat, extver, patxname, orderproc)\ + {NSD_GENERAL(name, def, sdt_cmd, guiflags, min, max, interval, full, str, strhelp, strval, proc, NULL, cat), SLEG_GENERAL_X(sle_cmd, var, type | flags, length, from, to, extver), patxname, NULL, orderproc} -#define SDTG_VAR(name, type, flags, guiflags, var, def, min, max, interval, str, strhelp, strval, proc, from, to, cat, extver, patxname)\ - SDTG_GENERAL(name, SDT_NUMX, SL_VAR, type, flags, guiflags, var, 0, def, min, max, interval, NULL, str, strhelp, strval, proc, from, to, cat, extver, patxname) +#define SDTG_GENERAL(name, sdt_cmd, sle_cmd, type, flags, guiflags, var, length, def, min, max, interval, full, str, strhelp, strval, proc, from, to, cat, extver, patxname)\ + SDTG_GENERAL2(name, sdt_cmd, sle_cmd, type, flags, guiflags, var, length, def, min, max, interval, full, str, strhelp, strval, proc, from, to, cat, extver, patxname, NULL) + +#define SDTG_VAR(name, type, flags, guiflags, var, def, min, max, interval, str, strhelp, strval, proc, from, to, cat, extver, patxname, orderproc)\ + SDTG_GENERAL2(name, SDT_NUMX, SL_VAR, type, flags, guiflags, var, 0, def, min, max, interval, NULL, str, strhelp, strval, proc, from, to, cat, extver, patxname, orderproc) #define SDTG_BOOL(name, flags, guiflags, var, def, str, strhelp, strval, proc, from, to, cat, extver, patxname)\ SDTG_GENERAL(name, SDT_BOOLX, SL_VAR, SLE_BOOL, flags, guiflags, var, 0, def, 0, 1, 0, NULL, str, strhelp, strval, proc, from, to, cat, extver, patxname) @@ -74,7 +77,7 @@ static size_t ConvertLandscape(const char *value); SDTG_GENERAL(name, SDT_INTLIST, SL_ARR, type, flags, guiflags, var, length, def, 0, 0, 0, NULL, str, strhelp, strval, proc, from, to, cat, extver, patxname) #define SDTG_STR(name, type, flags, guiflags, var, def, str, strhelp, strval, proc, from, to, cat, extver, patxname)\ - SDTG_GENERAL(name, SDT_STRING, SL_STR, type, flags, guiflags, var, lengthof(var), def, 0, 0, 0, NULL, str, strhelp, strval, proc, from, to, cat, extver, patxname) + SDTG_GENERAL(name, SDT_STRING, SL_STR, type, flags, guiflags, var, sizeof(var), def, 0, 0, 0, NULL, str, strhelp, strval, proc, from, to, cat, extver, patxname) #define SDTG_OMANY(name, type, flags, guiflags, var, def, max, full, str, strhelp, strval, proc, from, to, cat, extver, patxname)\ SDTG_GENERAL(name, SDT_ONEOFMANY, SL_VAR, type, flags, guiflags, var, 0, def, 0, max, 0, full, str, strhelp, strval, proc, from, to, cat, extver, patxname) @@ -83,17 +86,20 @@ static size_t ConvertLandscape(const char *value); SDTG_GENERAL(name, SDT_MANYOFMANY, SL_VAR, type, flags, guiflags, var, 0, def, 0, 0, 0, full, str, strhelp, strval, proc, from, to, cat, extver, patxname) #define SDTG_NULL(length, from, to, extver)\ - {{"", NULL, {0}, {0}, 0, 0, 0, NULL, STR_NULL, STR_NULL, STR_NULL, NULL, NULL, SC_NONE}, SLEG_NULL_X(length, from, to, extver), NULL} + {{"", NULL, {0}, {0}, 0, 0, 0, NULL, STR_NULL, STR_NULL, STR_NULL, NULL, NULL, SC_NONE}, SLEG_NULL_X(length, from, to, extver), NULL, NULL, NULL} -#define SDTG_END() {{NULL, NULL, {0}, {0}, 0, 0, 0, NULL, STR_NULL, STR_NULL, STR_NULL, NULL, NULL, SC_NONE}, SLEG_END(), NULL} +#define SDTG_END() {{NULL, NULL, {0}, {0}, 0, 0, 0, NULL, STR_NULL, STR_NULL, STR_NULL, NULL, NULL, SC_NONE}, SLEG_END(), NULL, NULL, NULL} /* Macros for various objects to go in the configuration file. * This section is for structures where their various members are saved */ -#define SDT_GENERAL(name, sdt_cmd, sle_cmd, type, flags, guiflags, base, var, length, def, min, max, interval, full, str, strhelp, strval, proc, load, from, to, cat, extver, patxname)\ - {NSD_GENERAL(name, def, sdt_cmd, guiflags, min, max, interval, full, str, strhelp, strval, proc, load, cat), SLE_GENERAL_X(sle_cmd, base, var, type | flags, length, from, to, extver), patxname} +#define SDT_GENERAL2(name, sdt_cmd, sle_cmd, type, flags, guiflags, base, var, length, def, min, max, interval, full, str, strhelp, strval, proc, load, from, to, cat, extver, patxname, orderproc)\ + {NSD_GENERAL(name, def, sdt_cmd, guiflags, min, max, interval, full, str, strhelp, strval, proc, load, cat), SLE_GENERAL_X(sle_cmd, base, var, type | flags, length, from, to, extver), patxname, NULL, orderproc} -#define SDT_VAR(base, var, type, flags, guiflags, def, min, max, interval, str, strhelp, strval, proc, from, to, cat, extver, patxname)\ - SDT_GENERAL(#var, SDT_NUMX, SL_VAR, type, flags, guiflags, base, var, 1, def, min, max, interval, NULL, str, strhelp, strval, proc, NULL, from, to, cat, extver, patxname) +#define SDT_GENERAL(name, sdt_cmd, sle_cmd, type, flags, guiflags, base, var, length, def, min, max, interval, full, str, strhelp, strval, proc, load, from, to, cat, extver, patxname)\ + SDT_GENERAL2(name, sdt_cmd, sle_cmd, type, flags, guiflags, base, var, length, def, min, max, interval, full, str, strhelp, strval, proc, load, from, to, cat, extver, patxname, NULL) + +#define SDT_VAR(base, var, type, flags, guiflags, def, min, max, interval, str, strhelp, strval, proc, from, to, cat, extver, patxname, orderproc)\ + SDT_GENERAL2(#var, SDT_NUMX, SL_VAR, type, flags, guiflags, base, var, 1, def, min, max, interval, NULL, str, strhelp, strval, proc, NULL, from, to, cat, extver, patxname, orderproc) #define SDT_BOOL(base, var, flags, guiflags, def, str, strhelp, strval, proc, from, to, cat, extver, patxname)\ SDT_GENERAL(#var, SDT_BOOLX, SL_VAR, SLE_BOOL, flags, guiflags, base, var, 1, def, 0, 1, 0, NULL, str, strhelp, strval, proc, NULL, from, to, cat, extver, patxname) @@ -102,7 +108,7 @@ static size_t ConvertLandscape(const char *value); SDT_GENERAL(#var, SDT_INTLIST, SL_ARR, type, flags, guiflags, base, var, lengthof(((base*)8)->var), def, 0, 0, 0, NULL, str, strhelp, strval, proc, NULL, from, to, cat, extver, patxname) #define SDT_STR(base, var, type, flags, guiflags, def, str, strhelp, strval, proc, from, to, cat, extver, patxname)\ - SDT_GENERAL(#var, SDT_STRING, SL_STR, type, flags, guiflags, base, var, lengthof(((base*)8)->var), def, 0, 0, 0, NULL, str, strhelp, strval, proc, NULL, from, to, cat, extver, patxname) + SDT_GENERAL(#var, SDT_STRING, SL_STR, type, flags, guiflags, base, var, sizeof(((base*)8)->var), def, 0, 0, 0, NULL, str, strhelp, strval, proc, NULL, from, to, cat, extver, patxname) #define SDT_CHR(base, var, flags, guiflags, def, str, strhelp, strval, proc, from, to, cat, extver, patxname)\ SDT_GENERAL(#var, SDT_STRING, SL_VAR, SLE_CHAR, flags, guiflags, base, var, 1, def, 0, 0, 0, NULL, str, strhelp, strval, proc, NULL, from, to, cat, extver, patxname) @@ -114,11 +120,11 @@ static size_t ConvertLandscape(const char *value); SDT_GENERAL(#var, SDT_MANYOFMANY, SL_VAR, type, flags, guiflags, base, var, 1, def, 0, 0, 0, full, str, strhelp, strval, proc, NULL, from, to, cat, extver, patxname) #define SDT_NULL(length, from, to, extver)\ - {{"", NULL, {0}, {0}, 0, 0, 0, NULL, STR_NULL, STR_NULL, STR_NULL, NULL, NULL, SC_NONE}, SLE_CONDNULL_X(length, from, to, extver), NULL} + {{"", NULL, {0}, {0}, 0, 0, 0, NULL, STR_NULL, STR_NULL, STR_NULL, NULL, NULL, SC_NONE}, SLE_CONDNULL_X(length, from, to, extver), NULL, NULL, NULL} -#define SDTC_VAR(var, type, flags, guiflags, def, min, max, interval, str, strhelp, strval, proc, from, to, cat, extver, patxname)\ - SDTG_GENERAL(#var, SDT_NUMX, SL_VAR, type, flags, guiflags, _settings_client.var, 1, def, min, max, interval, NULL, str, strhelp, strval, proc, from, to, cat, extver, patxname) +#define SDTC_VAR(var, type, flags, guiflags, def, min, max, interval, str, strhelp, strval, proc, from, to, cat, extver, patxname, orderproc)\ + SDTG_GENERAL2(#var, SDT_NUMX, SL_VAR, type, flags, guiflags, _settings_client.var, 1, def, min, max, interval, NULL, str, strhelp, strval, proc, from, to, cat, extver, patxname, orderproc) #define SDTC_BOOL(var, flags, guiflags, def, str, strhelp, strval, proc, from, to, cat, extver, patxname)\ SDTG_GENERAL(#var, SDT_BOOLX, SL_VAR, SLE_BOOL, flags, guiflags, _settings_client.var, 1, def, 0, 1, 0, NULL, str, strhelp, strval, proc, from, to, cat, extver, patxname) @@ -127,10 +133,13 @@ static size_t ConvertLandscape(const char *value); SDTG_GENERAL(#var, SDT_INTLIST, SL_ARR, type, flags, guiflags, _settings_client.var, lengthof(_settings_client.var), def, 0, 0, 0, NULL, str, strhelp, strval, proc, from, to, cat, extver, patxname) #define SDTC_STR(var, type, flags, guiflags, def, str, strhelp, strval, proc, from, to, cat, extver, patxname)\ - SDTG_GENERAL(#var, SDT_STRING, SL_STR, type, flags, guiflags, _settings_client.var, lengthof(_settings_client.var), def, 0, 0, 0, NULL, str, strhelp, strval, proc, from, to, cat, extver, patxname) + SDTG_GENERAL(#var, SDT_STRING, SL_STR, type, flags, guiflags, _settings_client.var, sizeof(_settings_client.var), def, 0, 0, 0, NULL, str, strhelp, strval, proc, from, to, cat, extver, patxname) #define SDTC_OMANY(var, type, flags, guiflags, def, max, full, str, strhelp, strval, proc, from, to, cat, extver, patxname)\ SDTG_GENERAL(#var, SDT_ONEOFMANY, SL_VAR, type, flags, guiflags, _settings_client.var, 1, def, 0, max, 0, full, str, strhelp, strval, proc, from, to, cat, extver, patxname) -#define SDT_END() {{NULL, NULL, {0}, {0}, 0, 0, 0, NULL, STR_NULL, STR_NULL, STR_NULL, NULL, NULL, SC_NONE}, SLE_END(), NULL} +#define SDT_XREF(from, to, extver, xref)\ + {{"", NULL, {0}, {0}, 0, 0, 0, NULL, STR_NULL, STR_NULL, STR_NULL, NULL, NULL, SC_NONE}, SLE_CONDNULL_X(0, from, to, extver), NULL, xref, NULL} + +#define SDT_END() {{NULL, NULL, {0}, {0}, 0, 0, 0, NULL, STR_NULL, STR_NULL, STR_NULL, NULL, NULL, SC_NONE}, SLE_END(), NULL, NULL, NULL} diff --git a/src/table/settings.ini b/src/table/settings.ini index 3a951f9b62..d1fb1f4224 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -51,6 +51,10 @@ static bool UpdateClientConfigValues(int32 p1); #endif /* ENABLE_NETWORK */ /* End - Callback Functions for the various settings */ +/* Begin - GUI order callbacks */ + +/* End - GUI order callbacks */ + /* Some settings do not need to be synchronised when playing in multiplayer. * These include for example the GUI settings and will not be saved with the * savegame. @@ -65,18 +69,19 @@ const SettingDesc _settings[] = { }; [templates] SDTG_BOOL = SDTG_BOOL($name, $flags, $guiflags, $var, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, $patxname), -SDTG_VAR = SDTG_VAR($name, $type, $flags, $guiflags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, $patxname), +SDTG_VAR = SDTG_VAR($name, $type, $flags, $guiflags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, $patxname, $orderproc), SDTG_OMANY = SDTG_OMANY($name, $type, $flags, $guiflags, $var, $def, $max, $full, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, $patxname), SDTC_BOOL = SDTC_BOOL( $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, $patxname), SDTC_LIST = SDTC_LIST( $var, $type, $flags, $guiflags, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, $patxname), SDTC_OMANY = SDTC_OMANY( $var, $type, $flags, $guiflags, $def, $max, $full, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, $patxname), SDTC_STR = SDTC_STR( $var, $type, $flags, $guiflags, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, $patxname), -SDTC_VAR = SDTC_VAR( $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, $patxname), +SDTC_VAR = SDTC_VAR( $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, $patxname, $orderproc), SDT_BOOL = SDT_BOOL($base, $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, $patxname), SDT_OMANY = SDT_OMANY($base, $var, $type, $flags, $guiflags, $def, $max, $full, $str, $strhelp, $strval, $proc, $from, $to, $load, $cat, $extver, $patxname), SDT_STR = SDT_STR($base, $var, $type, $flags, $guiflags, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, $patxname), -SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, $patxname), +SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, $patxname, $orderproc), SDT_NULL = SDT_NULL($length, $from, $to, $extver), +SDT_XREF = SDT_XREF( $from, $to, $extver, $xref), SDT_END = SDT_END() [defaults] @@ -93,6 +98,8 @@ to = SL_MAX_VERSION cat = SC_ADVANCED extver = SlXvFeatureTest() patxname = NULL +xref = +orderproc = NULL @@ -762,7 +769,7 @@ base = GameSettings var = vehicle.train_acceleration_model type = SLE_UINT8 guiflags = SGF_MULTISTRING -def = 0 +def = 1 min = 0 max = 1 interval = 1 @@ -777,7 +784,7 @@ var = vehicle.roadveh_acceleration_model type = SLE_UINT8 from = 139 guiflags = SGF_MULTISTRING -def = 0 +def = 1 min = 0 max = 1 interval = 1 @@ -2191,7 +2198,7 @@ cat = SC_BASIC base = GameSettings var = game_creation.variety type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +from = 197 guiflags = SGF_MULTISTRING | SGF_NEWGAME_ONLY def = 0 min = 0 @@ -2562,13 +2569,17 @@ strhelp = STR_CONFIG_SETTING_AUTOSCROLL_HELPTEXT strval = STR_CONFIG_SETTING_AUTOSCROLL_DISABLED cat = SC_BASIC -[SDTC_BOOL] -var = gui.reverse_scroll +[SDTC_VAR] +var = gui.scroll_mode +type = SLE_UINT8 flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -def = false -str = STR_CONFIG_SETTING_REVERSE_SCROLLING -strhelp = STR_CONFIG_SETTING_REVERSE_SCROLLING_HELPTEXT -cat = SC_BASIC +guiflags = SGF_MULTISTRING +def = 0 +min = 0 +max = 3 +str = STR_CONFIG_SETTING_SCROLLMODE +strhelp = STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT +strval = STR_CONFIG_SETTING_SCROLLMODE_DEFAULT [SDTC_BOOL] var = gui.smooth_scroll @@ -2578,11 +2589,11 @@ str = STR_CONFIG_SETTING_SMOOTH_SCROLLING strhelp = STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT [SDTC_BOOL] -var = gui.left_mouse_btn_scrolling +var = gui.right_mouse_wnd_close flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC def = false -str = STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING -strhelp = STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT +str = STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE +strhelp = STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT cat = SC_BASIC [SDTC_BOOL] @@ -2985,6 +2996,12 @@ flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC def = false cat = SC_BASIC +[SDTC_BOOL] +var = gui.autosave_on_network_disconnect +flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +def = true +cat = SC_EXPERT + [SDTC_VAR] var = gui.max_num_autosaves type = SLE_UINT8 diff --git a/src/table/strgen_tables.h b/src/table/strgen_tables.h index 322f1bc6bf..6297eea3bc 100644 --- a/src/table/strgen_tables.h +++ b/src/table/strgen_tables.h @@ -37,8 +37,10 @@ extern void EmitGender(Buffer *buffer, char *buf, int value); static const CmdStruct _cmd_structs[] = { /* Font size */ + {"NORMAL_FONT", EmitSingleChar, SCC_NORMALFONT, 0, -1, C_NONE}, {"TINY_FONT", EmitSingleChar, SCC_TINYFONT, 0, -1, C_NONE}, {"BIG_FONT", EmitSingleChar, SCC_BIGFONT, 0, -1, C_NONE}, + {"MONO_FONT", EmitSingleChar, SCC_MONOFONT, 0, -1, C_NONE}, /* Colours */ {"BLUE", EmitSingleChar, SCC_BLUE, 0, -1, C_DONTCOUNT}, @@ -58,6 +60,8 @@ static const CmdStruct _cmd_structs[] = { {"GRAY", EmitSingleChar, SCC_GRAY, 0, -1, C_DONTCOUNT}, {"DKBLUE", EmitSingleChar, SCC_DKBLUE, 0, -1, C_DONTCOUNT}, {"BLACK", EmitSingleChar, SCC_BLACK, 0, -1, C_DONTCOUNT}, + {"PUSH_COLOUR", EmitSingleChar, SCC_PUSH_COLOUR, 0, -1, C_DONTCOUNT}, + {"POP_COLOUR", EmitSingleChar, SCC_POP_COLOUR, 0, -1, C_DONTCOUNT}, {"REV", EmitSingleChar, SCC_REVISION, 0, -1, C_NONE}, // openttd revision string diff --git a/src/table/townname.h b/src/table/townname.h index 25c997d255..d14999340c 100644 --- a/src/table/townname.h +++ b/src/table/townname.h @@ -11,6 +11,10 @@ #include "../core/enum_type.hpp" +#if defined(__GNUC__) +#pragma GCC diagnostic ignored "-Wunused-variable" +#endif + static const char * const _name_original_english_1[] = { "Great ", "Little ", diff --git a/src/table/win32_settings.ini b/src/table/win32_settings.ini index a22e1a54e7..a0710cc333 100644 --- a/src/table/win32_settings.ini +++ b/src/table/win32_settings.ini @@ -8,17 +8,17 @@ [pre-amble] /* win32_v.cpp only settings */ -#if defined(WIN32) && !defined(DEDICATED) +#if defined(_WIN32) && !defined(DEDICATED) extern bool _force_full_redraw, _window_maximize; extern uint _display_hz; static const SettingDescGlobVarList _win32_settings[] = { [post-amble] }; -#endif /* WIN32 */ +#endif /* _WIN32 */ [templates] SDTG_BOOL = SDTG_BOOL($name, $flags, $guiflags, $var, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL), -SDTG_VAR = SDTG_VAR($name, $type, $flags, $guiflags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL), +SDTG_VAR = SDTG_VAR($name, $type, $flags, $guiflags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL, $orderproc), SDTG_END = SDTG_END() [defaults] @@ -34,6 +34,7 @@ from = 0 to = SL_MAX_VERSION cat = SC_ADVANCED extver = SlXvFeatureTest() +orderproc = NULL diff --git a/src/table/window_settings.ini b/src/table/window_settings.ini index a7b1742040..f2e8f0111e 100644 --- a/src/table/window_settings.ini +++ b/src/table/window_settings.ini @@ -13,7 +13,7 @@ static const SettingDesc _window_settings[] = { }; [templates] SDT_BOOL = SDT_BOOL($base, $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL), -SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL), +SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extver, NULL, $orderproc), SDT_END = SDT_END() [defaults] @@ -30,6 +30,7 @@ from = 0 to = SL_MAX_VERSION cat = SC_ADVANCED extver = SlXvFeatureTest() +orderproc = NULL diff --git a/src/terraform_gui.cpp b/src/terraform_gui.cpp index 7a319d66fc..97749a8dcc 100644 --- a/src/terraform_gui.cpp +++ b/src/terraform_gui.cpp @@ -80,12 +80,14 @@ static void GenerateRockyArea(TileIndex end, TileIndex start) switch (GetTileType(tile)) { case MP_TREES: if (GetTreeGround(tile) == TREE_GROUND_SHORE) continue; - /* FALL THROUGH */ + FALLTHROUGH; + case MP_CLEAR: MakeClear(tile, CLEAR_ROCKS, 3); break; - default: continue; + default: + continue; } MarkTileDirtyByTile(tile); success = true; @@ -114,7 +116,7 @@ bool GUIPlaceProcDragXY(ViewportDragDropSelectionProcess proc, TileIndex start_t switch (proc) { case DDSP_DEMOLISH_AREA: - DoCommandP(end_tile, start_tile, _ctrl_pressed ? 1 : 0, CMD_CLEAR_AREA | CMD_MSG(STR_ERROR_CAN_T_CLEAR_THIS_AREA), CcPlaySound10); + DoCommandP(end_tile, start_tile, _ctrl_pressed ? 1 : 0, CMD_CLEAR_AREA | CMD_MSG(STR_ERROR_CAN_T_CLEAR_THIS_AREA), CcPlaySound_EXPLOSION); break; case DDSP_RAISE_AND_LEVEL_AREA: DoCommandP(end_tile, start_tile, LM_RAISE << 1 | (_ctrl_pressed ? 1 : 0), CMD_LEVEL_LAND | CMD_MSG(STR_ERROR_CAN_T_RAISE_LAND_HERE), CcTerraform); @@ -237,7 +239,7 @@ struct TerraformToolbarWindow : Window { break; case WID_TT_BUY_LAND: // Buy land button - DoCommandP(tile, OBJECT_OWNED_LAND, 0, CMD_BUILD_OBJECT | CMD_MSG(STR_ERROR_CAN_T_PURCHASE_THIS_LAND), CcPlaySound1E); + DoCommandP(tile, OBJECT_OWNED_LAND, 0, CMD_BUILD_OBJECT | CMD_MSG(STR_ERROR_CAN_T_PURCHASE_THIS_LAND), CcPlaySound_SPLAT_RAIL); break; case WID_TT_PLACE_SIGN: // Place sign button diff --git a/src/textbuf.cpp b/src/textbuf.cpp index 3d219e916d..61e449d3ae 100644 --- a/src/textbuf.cpp +++ b/src/textbuf.cpp @@ -367,7 +367,6 @@ bool Textbuf::MovePos(uint16 keycode) /** * Initialize the textbuffer by supplying it the buffer to write into * and the maximum length of this buffer - * @param buf the buffer that will be holding the data for input * @param max_bytes maximum size in bytes, including terminating '\0' * @param max_chars maximum size in chars, including terminating '\0' */ diff --git a/src/thread/thread.h b/src/thread/thread.h index b944a53b96..07831bb4ba 100644 --- a/src/thread/thread.h +++ b/src/thread/thread.h @@ -44,9 +44,10 @@ public: * @param proc The procedure to call inside the thread. * @param param The params to give with 'proc'. * @param thread Place to store a pointer to the thread in. May be NULL. + * @param name A name for the thread. May be NULL. * @return True if the thread was started correctly. */ - static bool New(OTTDThreadFunc proc, void *param, ThreadObject **thread = NULL); + static bool New(OTTDThreadFunc proc, void *param, ThreadObject **thread = NULL, const char *name = NULL); }; /** diff --git a/src/thread/thread_morphos.cpp b/src/thread/thread_morphos.cpp index cc6b2f9d3d..e368663f79 100644 --- a/src/thread/thread_morphos.cpp +++ b/src/thread/thread_morphos.cpp @@ -50,14 +50,10 @@ struct OTTDThreadStartupMessage { * Default OpenTTD STDIO/ERR debug output is not very useful for this, so we * utilize serial/ramdebug instead. */ -#ifndef NO_DEBUG_MESSAGES void KPutStr(CONST_STRPTR format) { RawDoFmt(format, NULL, (void (*)())RAWFMTFUNC_SERIAL, NULL); } -#else -#define KPutStr(x) -#endif /** @@ -193,7 +189,7 @@ private: } }; -/* static */ bool ThreadObject::New(OTTDThreadFunc proc, void *param, ThreadObject **thread) +/* static */ bool ThreadObject::New(OTTDThreadFunc proc, void *param, ThreadObject **thread, const char *name) { ThreadObject *to = new ThreadObject_MorphOS(proc, param, thread == NULL); if (thread != NULL) *thread = to; diff --git a/src/thread/thread_none.cpp b/src/thread/thread_none.cpp index afa799b239..91eb50b113 100644 --- a/src/thread/thread_none.cpp +++ b/src/thread/thread_none.cpp @@ -14,7 +14,7 @@ #include "../safeguards.h" -/* static */ bool ThreadObject::New(OTTDThreadFunc proc, void *param, ThreadObject **thread) +/* static */ bool ThreadObject::New(OTTDThreadFunc proc, void *param, ThreadObject **thread, const char *name) { if (thread != NULL) *thread = NULL; return false; diff --git a/src/thread/thread_os2.cpp b/src/thread/thread_os2.cpp index 2dcb8288f4..c66e2ad643 100644 --- a/src/thread/thread_os2.cpp +++ b/src/thread/thread_os2.cpp @@ -83,7 +83,7 @@ private: } }; -/* static */ bool ThreadObject::New(OTTDThreadFunc proc, void *param, ThreadObject **thread) +/* static */ bool ThreadObject::New(OTTDThreadFunc proc, void *param, ThreadObject **thread, const char *name) { ThreadObject *to = new ThreadObject_OS2(proc, param, thread == NULL); if (thread != NULL) *thread = to; diff --git a/src/thread/thread_pthread.cpp b/src/thread/thread_pthread.cpp index ce407fd941..8aed5ee136 100644 --- a/src/thread/thread_pthread.cpp +++ b/src/thread/thread_pthread.cpp @@ -14,6 +14,10 @@ #include #include +#if defined(__APPLE__) +#include "../os/macosx/macos.h" +#endif + #include "../safeguards.h" /** @@ -25,16 +29,18 @@ private: OTTDThreadFunc proc; ///< External thread procedure. void *param; ///< Parameter for the external thread procedure. bool self_destruct; ///< Free ourselves when done? + const char *name; ///< Name for the thread public: /** * Create a pthread and start it, calling proc(param). */ - ThreadObject_pthread(OTTDThreadFunc proc, void *param, bool self_destruct) : + ThreadObject_pthread(OTTDThreadFunc proc, void *param, bool self_destruct, const char *name) : thread(0), proc(proc), param(param), - self_destruct(self_destruct) + self_destruct(self_destruct), + name(name) { pthread_create(&this->thread, NULL, &stThreadProc, this); } @@ -60,7 +66,18 @@ private: */ static void *stThreadProc(void *thr) { - ((ThreadObject_pthread *)thr)->ThreadProc(); + ThreadObject_pthread *self = (ThreadObject_pthread *) thr; +#if defined(__GLIBC__) +#if __GLIBC_PREREQ(2, 12) + if (self->name) { + pthread_setname_np(pthread_self(), self->name); + } +#endif +#endif +#if defined(__APPLE__) + MacOSSetThreadName(self->name); +#endif + self->ThreadProc(); pthread_exit(NULL); } @@ -85,9 +102,9 @@ private: } }; -/* static */ bool ThreadObject::New(OTTDThreadFunc proc, void *param, ThreadObject **thread) +/* static */ bool ThreadObject::New(OTTDThreadFunc proc, void *param, ThreadObject **thread, const char *name) { - ThreadObject *to = new ThreadObject_pthread(proc, param, thread == NULL); + ThreadObject *to = new ThreadObject_pthread(proc, param, thread == NULL, name); if (thread != NULL) *thread = to; return true; } diff --git a/src/thread/thread_win32.cpp b/src/thread/thread_win32.cpp index c37baf7c36..a01ea8e108 100644 --- a/src/thread/thread_win32.cpp +++ b/src/thread/thread_win32.cpp @@ -16,6 +16,7 @@ #include #include #include +#include "../os/windows/win32.h" #include "../safeguards.h" @@ -29,17 +30,19 @@ private: OTTDThreadFunc proc; ///< External thread procedure. void *param; ///< Parameter for the external thread procedure. bool self_destruct; ///< Free ourselves when done? + const char *name; ///< Thread name. public: /** * Create a win32 thread and start it, calling proc(param). */ - ThreadObject_Win32(OTTDThreadFunc proc, void *param, bool self_destruct) : + ThreadObject_Win32(OTTDThreadFunc proc, void *param, bool self_destruct, const char *name) : thread(NULL), id(0), proc(proc), param(param), - self_destruct(self_destruct) + self_destruct(self_destruct), + name(name) { this->thread = (HANDLE)_beginthreadex(NULL, 0, &stThreadProc, this, CREATE_SUSPENDED, &this->id); if (this->thread == NULL) return; @@ -85,6 +88,10 @@ private: */ void ThreadProc() { +#ifdef _MSC_VER + /* Set thread name for debuggers. Has to be done from the thread due to a race condition in older MS debuggers. */ + SetWin32ThreadName(-1, this->name); +#endif try { this->proc(this->param); } catch (OTTDThreadExitSignal) { @@ -96,9 +103,9 @@ private: } }; -/* static */ bool ThreadObject::New(OTTDThreadFunc proc, void *param, ThreadObject **thread) +/* static */ bool ThreadObject::New(OTTDThreadFunc proc, void *param, ThreadObject **thread, const char *name) { - ThreadObject *to = new ThreadObject_Win32(proc, param, thread == NULL); + ThreadObject *to = new ThreadObject_Win32(proc, param, thread == NULL, name); if (thread != NULL) *thread = to; return true; } diff --git a/src/tile_cmd.h b/src/tile_cmd.h index 966694bfb9..ce70232a02 100644 --- a/src/tile_cmd.h +++ b/src/tile_cmd.h @@ -62,6 +62,7 @@ struct TileDesc { StringID airport_tile_name; ///< Name of the airport tile const char *grf; ///< newGRF used for the tile contents uint64 dparam[2]; ///< Parameters of the \a str string + StringID railtype; ///< Type of rail on the tile. uint16 rail_speed; ///< Speed limit of rail (bridges and track) uint16 road_speed; ///< Speed limit of road (bridges) }; @@ -80,7 +81,7 @@ typedef CommandCost ClearTileProc(TileIndex tile, DoCommandFlag flags); * @param acceptance Storage destination of the cargo acceptance in 1/8 * @param always_accepted Bitmask of always accepted cargo types */ -typedef void AddAcceptedCargoProc(TileIndex tile, CargoArray &acceptance, uint32 *always_accepted); +typedef void AddAcceptedCargoProc(TileIndex tile, CargoArray &acceptance, CargoTypes *always_accepted); /** * Tile callback function signature for obtaining a tile description @@ -164,11 +165,11 @@ VehicleEnterTileStatus VehicleEnterTile(Vehicle *v, TileIndex tile, int x, int y void ChangeTileOwner(TileIndex tile, Owner old_owner, Owner new_owner); void GetTileDesc(TileIndex tile, TileDesc *td); -static inline void AddAcceptedCargo(TileIndex tile, CargoArray &acceptance, uint32 *always_accepted) +static inline void AddAcceptedCargo(TileIndex tile, CargoArray &acceptance, CargoTypes *always_accepted) { AddAcceptedCargoProc *proc = _tile_type_procs[GetTileType(tile)]->add_accepted_cargo_proc; if (proc == NULL) return; - uint32 dummy = 0; // use dummy bitmask so there don't need to be several 'always_accepted != NULL' checks + CargoTypes dummy = 0; // use dummy bitmask so there don't need to be several 'always_accepted != NULL' checks proc(tile, acceptance, always_accepted == NULL ? &dummy : always_accepted); } diff --git a/src/tile_map.cpp b/src/tile_map.cpp index c566ad02cd..d73beeb886 100644 --- a/src/tile_map.cpp +++ b/src/tile_map.cpp @@ -70,11 +70,11 @@ uint TileHeightOutsideMap(int x, int y) /** * Get a tile's slope given the heigh of its four corners. - * @param hnorth The height at the northern corner in the same unit as TileHeight. - * @param hwest The height at the western corner in the same unit as TileHeight. - * @param heast The height at the eastern corner in the same unit as TileHeight. - * @param hsouth The height at the southern corner in the same unit as TileHeight. - * @param [out] h The lowest height of the four corners. + * @param hnorth The height at the northern corner in the same unit as TileHeight. + * @param hwest The height at the western corner in the same unit as TileHeight. + * @param heast The height at the eastern corner in the same unit as TileHeight. + * @param hsouth The height at the southern corner in the same unit as TileHeight. + * @param[out] h The lowest height of the four corners. * @return The slope. */ static Slope GetTileSlopeGivenHeight(int hnorth, int hwest, int heast, int hsouth, int *h) @@ -134,7 +134,8 @@ Slope GetTileSlope(TileIndex tile, int *h) /** * Return the slope of a given tile outside the map. * - * @param tile Tile outside the map to compute slope of. + * @param x X-coordinate of the tile outside to compute height of. + * @param y Y-coordinate of the tile outside to compute height of. * @param h If not \c NULL, pointer to storage of z height. * @return Slope of the tile outside map, except for the HALFTILE part. */ @@ -194,7 +195,8 @@ int GetTileZ(TileIndex tile) /** * Get bottom height of the tile outside map. * - * @param tile Tile outside the map to compute height of. + * @param x X-coordinate of the tile outside to compute height of. + * @param y Y-coordinate of the tile outside to compute height of. * @return Minimum height of the tile outside the map. */ int GetTilePixelZOutsideMap(int x, int y) @@ -229,7 +231,8 @@ int GetTileMaxZ(TileIndex t) * * @see Detailed description in header. * - * @param tile Tile outside to compute height of. + * @param x X-coordinate of the tile outside to compute height of. + * @param y Y-coordinate of the tile outside to compute height of. * @return Maximum height of the tile. */ int GetTileMaxPixelZOutsideMap(int x, int y) diff --git a/src/tile_map.h b/src/tile_map.h index 4d5891d7ba..7ee5727bea 100644 --- a/src/tile_map.h +++ b/src/tile_map.h @@ -44,7 +44,7 @@ uint TileHeightOutsideMap(int x, int y); * @param tile The tile to change the height * @param height The new height value of the tile * @pre tile < MapSize() - * @pre heigth <= MAX_TILE_HEIGHT + * @pre height <= MAX_TILE_HEIGHT */ static inline void SetTileHeight(TileIndex tile, uint height) { @@ -293,7 +293,7 @@ int GetTilePixelZOutsideMap(int x, int y); /** * Get top height of the tile - * @param t Tile to compute height of + * @param tile Tile to compute height of * @return Maximum height of the tile */ static inline int GetTileMaxPixelZ(TileIndex tile) diff --git a/src/tile_type.h b/src/tile_type.h index 0d720925da..c02ba4fc45 100644 --- a/src/tile_type.h +++ b/src/tile_type.h @@ -18,6 +18,8 @@ static const uint TILE_PIXELS = 32; ///< Pixel distan static const uint TILE_HEIGHT = 8; ///< Height of a height level in world coordinate AND in pixels in #ZOOM_LVL_BASE. static const uint MAX_BUILDING_PIXELS = 200; ///< Maximum height of a building in pixels in #ZOOM_LVL_BASE. (Also applies to "bridge buildings" on the bridge floor.) +static const int MAX_VEHICLE_PIXEL_X = 192; ///< Maximum width of a vehicle in pixels in #ZOOM_LVL_BASE. +static const int MAX_VEHICLE_PIXEL_Y = 96; ///< Maximum height of a vehicle in pixels in #ZOOM_LVL_BASE. static const uint MAX_TILE_HEIGHT = 255; ///< Maximum allowed tile height diff --git a/src/tilematrix_type.hpp b/src/tilematrix_type.hpp index 56f2541438..f9c7392b24 100644 --- a/src/tilematrix_type.hpp +++ b/src/tilematrix_type.hpp @@ -87,7 +87,7 @@ public: /** * Get the area of the matrix square that contains a specific tile. - * @param The tile to get the map area for. + * @param tile The tile to get the map area for. * @param extend Extend the area by this many squares on all sides. * @return Tile area containing the tile. */ diff --git a/src/timetable_gui.cpp b/src/timetable_gui.cpp index ffea9a8642..5dd45561f3 100644 --- a/src/timetable_gui.cpp +++ b/src/timetable_gui.cpp @@ -139,7 +139,7 @@ static void FillTimetableArrivalDepartureTable(const Vehicle *v, VehicleOrderID /** * Callback for when a time has been chosen to start the time table - * @param window the window related to the setting of the date + * @param w the window related to the setting of the date * @param date the actually chosen date */ static void ChangeTimetableStartCallback(const Window *w, Date date) @@ -197,7 +197,8 @@ struct TimetableWindow : Window { this->deparr_time_width = GetStringBoundingBox(STR_JUST_DATE_TINY).width; this->deparr_abbr_width = max(GetStringBoundingBox(STR_TIMETABLE_ARRIVAL_ABBREVIATION).width, GetStringBoundingBox(STR_TIMETABLE_DEPARTURE_ABBREVIATION).width); size->width = WD_FRAMERECT_LEFT + this->deparr_abbr_width + 10 + this->deparr_time_width + WD_FRAMERECT_RIGHT; - /* FALL THROUGH */ + FALLTHROUGH; + case WID_VT_ARRIVAL_DEPARTURE_SELECTION: case WID_VT_TIMETABLE_PANEL: resize->height = FONT_HEIGHT_NORMAL; diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index 45d751dc56..40ac3634f1 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -47,6 +47,7 @@ #include "goal_base.h" #include "story_base.h" #include "toolbar_gui.h" +#include "framerate_type.h" #include "widgets/toolbar_widget.h" @@ -79,6 +80,9 @@ enum CallBackFunction { CBF_PLACE_LANDINFO, }; +static CallBackFunction _last_started_action = CBF_NONE; ///< Last started user action. + + /** * Drop down list entry for showing a checked/unchecked toggle item. */ @@ -247,7 +251,7 @@ static ToolbarMode _toolbar_mode; static CallBackFunction SelectSignTool() { - if (_cursor.sprite == SPR_CURSOR_SIGN) { + if (_last_started_action == CBF_PLACE_SIGN) { ResetObjectToPlace(); return CBF_NONE; } else { @@ -424,17 +428,17 @@ static CallBackFunction MenuClickSaveLoad(int index = 0) { if (_game_mode == GM_EDITOR) { switch (index) { - case SLEME_SAVE_SCENARIO: ShowSaveLoadDialog(SLD_SAVE_SCENARIO); break; - case SLEME_LOAD_SCENARIO: ShowSaveLoadDialog(SLD_LOAD_SCENARIO); break; - case SLEME_SAVE_HEIGHTMAP: ShowSaveLoadDialog(SLD_SAVE_HEIGHTMAP); break; - case SLEME_LOAD_HEIGHTMAP: ShowSaveLoadDialog(SLD_LOAD_HEIGHTMAP); break; + case SLEME_SAVE_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_SAVE); break; + case SLEME_LOAD_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_LOAD); break; + case SLEME_SAVE_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP,SLO_SAVE); break; + case SLEME_LOAD_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP,SLO_LOAD); break; case SLEME_EXIT_TOINTRO: AskExitToGameMenu(); break; case SLEME_EXIT_GAME: HandleExitGameRequest(); break; } } else { switch (index) { - case SLNME_SAVE_GAME: ShowSaveLoadDialog(SLD_SAVE_GAME); break; - case SLNME_LOAD_GAME: ShowSaveLoadDialog(SLD_LOAD_GAME); break; + case SLNME_SAVE_GAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_SAVE); break; + case SLNME_LOAD_GAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break; case SLNME_EXIT_TOINTRO: AskExitToGameMenu(); break; case SLNME_EXIT_GAME: HandleExitGameRequest(); break; } @@ -1031,7 +1035,7 @@ static CallBackFunction MenuClickNewspaper(int index) static CallBackFunction PlaceLandBlockInfo() { - if (_cursor.sprite == SPR_CURSOR_QUERY) { + if (_last_started_action == CBF_PLACE_LANDINFO) { ResetObjectToPlace(); return CBF_NONE; } else { @@ -1042,7 +1046,7 @@ static CallBackFunction PlaceLandBlockInfo() static CallBackFunction ToolbarHelpClick(Window *w) { - PopupMainToolbMenu(w, WID_TN_HELP, STR_ABOUT_MENU_LAND_BLOCK_INFO, _settings_client.gui.newgrf_developer_tools ? 12 : 9); + PopupMainToolbMenu(w, WID_TN_HELP, STR_ABOUT_MENU_LAND_BLOCK_INFO, _settings_client.gui.newgrf_developer_tools ? 13 : 10); return CBF_NONE; } @@ -1144,10 +1148,11 @@ static CallBackFunction MenuClickHelp(int index) case 5: MenuClickLargeWorldScreenshot(SC_ZOOMEDIN); break; case 6: MenuClickLargeWorldScreenshot(SC_DEFAULTZOOM); break; case 7: MenuClickLargeWorldScreenshot(SC_WORLD); break; - case 8: ShowAboutWindow(); break; - case 9: ShowSpriteAlignerWindow(); break; - case 10: ToggleBoundingBoxes(); break; - case 11: ToggleDirtyBlocks(); break; + case 8: ShowFramerateWindow(); break; + case 9: ShowAboutWindow(); break; + case 10: ShowSpriteAlignerWindow(); break; + case 11: ToggleBoundingBoxes(); break; + case 12: ToggleDirtyBlocks(); break; } return CBF_NONE; } @@ -1466,36 +1471,302 @@ class NWidgetMainToolbarContainer : public NWidgetToolbarContainer { { static const uint SMALLEST_ARRANGEMENT = 14; static const uint BIGGEST_ARRANGEMENT = 20; + + /* The number of buttons of each row of the toolbar should match the number of items which we want to be visible. + * The total number of buttons should be equal to arrangable_count * 2. + * No bad things happen, but we could see strange behaviours if we have buttons < (arrangable_count * 2) like a + * pause button appearing on the right of the lower toolbar and weird resizing of the widgets even if there is + * enough space. + */ static const byte arrange14[] = { - 0, 1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 29, - 2, 3, 4, 5, 6, 7, 8, 9, 12, 14, 26, 27, 28, 29, + WID_TN_PAUSE, + WID_TN_FAST_FORWARD, + WID_TN_TRAINS, + WID_TN_ROADVEHS, + WID_TN_SHIPS, + WID_TN_AIRCRAFT, + WID_TN_ZOOM_IN, + WID_TN_ZOOM_OUT, + WID_TN_RAILS, + WID_TN_ROADS, + WID_TN_WATER, + WID_TN_AIR, + WID_TN_LANDSCAPE, + WID_TN_SWITCH_BAR, + // lower toolbar + WID_TN_SETTINGS, + WID_TN_SAVE, + WID_TN_SMALL_MAP, + WID_TN_TOWNS, + WID_TN_SUBSIDIES, + WID_TN_STATIONS, + WID_TN_FINANCES, + WID_TN_COMPANIES, + WID_TN_GRAPHS, + WID_TN_INDUSTRIES, + WID_TN_MUSIC_SOUND, + WID_TN_MESSAGES, + WID_TN_HELP, + WID_TN_SWITCH_BAR, }; static const byte arrange15[] = { - 0, 1, 4, 15, 16, 17, 18, 21, 22, 23, 24, 25, 19, 20, 29, - 0, 2, 4, 3, 5, 6, 7, 8, 9, 12, 14, 26, 27, 28, 29, + WID_TN_PAUSE, + WID_TN_FAST_FORWARD, + WID_TN_SMALL_MAP, + WID_TN_TRAINS, + WID_TN_ROADVEHS, + WID_TN_SHIPS, + WID_TN_AIRCRAFT, + WID_TN_RAILS, + WID_TN_ROADS, + WID_TN_WATER, + WID_TN_AIR, + WID_TN_LANDSCAPE, + WID_TN_ZOOM_IN, + WID_TN_ZOOM_OUT, + WID_TN_SWITCH_BAR, + // lower toolbar + WID_TN_PAUSE, + WID_TN_SETTINGS, + WID_TN_SMALL_MAP, + WID_TN_SAVE, + WID_TN_TOWNS, + WID_TN_SUBSIDIES, + WID_TN_STATIONS, + WID_TN_FINANCES, + WID_TN_COMPANIES, + WID_TN_GRAPHS, + WID_TN_INDUSTRIES, + WID_TN_MUSIC_SOUND, + WID_TN_MESSAGES, + WID_TN_HELP, + WID_TN_SWITCH_BAR, }; static const byte arrange16[] = { - 0, 1, 2, 4, 15, 16, 17, 18, 21, 22, 23, 24, 25, 19, 20, 29, - 0, 1, 3, 5, 6, 7, 8, 9, 12, 14, 26, 27, 28, 19, 20, 29, + WID_TN_PAUSE, + WID_TN_FAST_FORWARD, + WID_TN_SETTINGS, + WID_TN_SMALL_MAP, + WID_TN_TRAINS, + WID_TN_ROADVEHS, + WID_TN_SHIPS, + WID_TN_AIRCRAFT, + WID_TN_RAILS, + WID_TN_ROADS, + WID_TN_WATER, + WID_TN_AIR, + WID_TN_LANDSCAPE, + WID_TN_ZOOM_IN, + WID_TN_ZOOM_OUT, + WID_TN_SWITCH_BAR, + // lower toolbar + WID_TN_PAUSE, + WID_TN_FAST_FORWARD, + WID_TN_SAVE, + WID_TN_TOWNS, + WID_TN_SUBSIDIES, + WID_TN_STATIONS, + WID_TN_FINANCES, + WID_TN_COMPANIES, + WID_TN_GRAPHS, + WID_TN_INDUSTRIES, + WID_TN_MUSIC_SOUND, + WID_TN_MESSAGES, + WID_TN_HELP, + WID_TN_ZOOM_IN, + WID_TN_ZOOM_OUT, + WID_TN_SWITCH_BAR, }; static const byte arrange17[] = { - 0, 1, 2, 4, 6, 15, 16, 17, 18, 21, 22, 23, 24, 25, 19, 20, 29, - 0, 1, 3, 4, 6, 5, 7, 8, 9, 12, 14, 26, 27, 28, 19, 20, 29, + WID_TN_PAUSE, + WID_TN_FAST_FORWARD, + WID_TN_SETTINGS, + WID_TN_SMALL_MAP, + WID_TN_SUBSIDIES, + WID_TN_TRAINS, + WID_TN_ROADVEHS, + WID_TN_SHIPS, + WID_TN_AIRCRAFT, + WID_TN_RAILS, + WID_TN_ROADS, + WID_TN_WATER, + WID_TN_AIR, + WID_TN_LANDSCAPE, + WID_TN_ZOOM_IN, + WID_TN_ZOOM_OUT, + WID_TN_SWITCH_BAR, + // lower toolbar + WID_TN_PAUSE, + WID_TN_FAST_FORWARD, + WID_TN_SAVE, + WID_TN_SMALL_MAP, + WID_TN_SUBSIDIES, + WID_TN_TOWNS, + WID_TN_STATIONS, + WID_TN_FINANCES, + WID_TN_COMPANIES, + WID_TN_GRAPHS, + WID_TN_INDUSTRIES, + WID_TN_MUSIC_SOUND, + WID_TN_MESSAGES, + WID_TN_HELP, + WID_TN_ZOOM_IN, + WID_TN_ZOOM_OUT, + WID_TN_SWITCH_BAR, }; static const byte arrange18[] = { - 0, 1, 2, 4, 5, 6, 7, 8, 9, 14, 21, 22, 23, 24, 25, 19, 20, 29, - 0, 1, 3, 4, 5, 6, 7, 12, 15, 16, 17, 18, 26, 27, 28, 19, 20, 29, + WID_TN_PAUSE, + WID_TN_FAST_FORWARD, + WID_TN_SETTINGS, + WID_TN_SMALL_MAP, + WID_TN_TOWNS, + WID_TN_SUBSIDIES, + WID_TN_STATIONS, + WID_TN_FINANCES, + WID_TN_COMPANIES, + WID_TN_INDUSTRIES, + WID_TN_RAILS, + WID_TN_ROADS, + WID_TN_WATER, + WID_TN_AIR, + WID_TN_LANDSCAPE, + WID_TN_ZOOM_IN, + WID_TN_ZOOM_OUT, + WID_TN_SWITCH_BAR, + // lower toolbar + WID_TN_PAUSE, + WID_TN_FAST_FORWARD, + WID_TN_SAVE, + WID_TN_SMALL_MAP, + WID_TN_TOWNS, + WID_TN_SUBSIDIES, + WID_TN_STATIONS, + WID_TN_GRAPHS, + WID_TN_TRAINS, + WID_TN_ROADVEHS, + WID_TN_SHIPS, + WID_TN_AIRCRAFT, + WID_TN_MUSIC_SOUND, + WID_TN_MESSAGES, + WID_TN_HELP, + WID_TN_ZOOM_IN, + WID_TN_ZOOM_OUT, + WID_TN_SWITCH_BAR, }; static const byte arrange19[] = { - 0, 1, 2, 4, 5, 6, 15, 16, 17, 18, 21, 22, 23, 24, 25, 26, 19, 20, 29, - 0, 1, 3, 4, 7, 8, 9, 12, 14, 27, 21, 22, 23, 24, 25, 28, 19, 20, 29, + WID_TN_PAUSE, + WID_TN_FAST_FORWARD, + WID_TN_SETTINGS, + WID_TN_SMALL_MAP, + WID_TN_TOWNS, + WID_TN_SUBSIDIES, + WID_TN_TRAINS, + WID_TN_ROADVEHS, + WID_TN_SHIPS, + WID_TN_AIRCRAFT, + WID_TN_RAILS, + WID_TN_ROADS, + WID_TN_WATER, + WID_TN_AIR, + WID_TN_LANDSCAPE, + WID_TN_MUSIC_SOUND, + WID_TN_ZOOM_IN, + WID_TN_ZOOM_OUT, + WID_TN_SWITCH_BAR, + // lower toolbar + WID_TN_PAUSE, + WID_TN_FAST_FORWARD, + WID_TN_SAVE, + WID_TN_SMALL_MAP, + WID_TN_STATIONS, + WID_TN_FINANCES, + WID_TN_COMPANIES, + WID_TN_GRAPHS, + WID_TN_INDUSTRIES, + WID_TN_MESSAGES, + WID_TN_RAILS, + WID_TN_ROADS, + WID_TN_WATER, + WID_TN_AIR, + WID_TN_LANDSCAPE, + WID_TN_HELP, + WID_TN_ZOOM_IN, + WID_TN_ZOOM_OUT, + WID_TN_SWITCH_BAR, }; static const byte arrange20[] = { - 0, 1, 2, 4, 5, 6, 15, 16, 17, 18, 21, 22, 23, 24, 25, 26, 11, 19, 20, 29, - 0, 1, 3, 4, 7, 8, 9, 12, 14, 27, 21, 22, 23, 24, 25, 10, 28, 19, 20, 29, + WID_TN_PAUSE, + WID_TN_FAST_FORWARD, + WID_TN_SETTINGS, + WID_TN_SMALL_MAP, + WID_TN_TOWNS, + WID_TN_SUBSIDIES, + WID_TN_TRAINS, + WID_TN_ROADVEHS, + WID_TN_SHIPS, + WID_TN_AIRCRAFT, + WID_TN_RAILS, + WID_TN_ROADS, + WID_TN_WATER, + WID_TN_AIR, + WID_TN_LANDSCAPE, + WID_TN_MUSIC_SOUND, + WID_TN_GOAL, + WID_TN_ZOOM_IN, + WID_TN_ZOOM_OUT, + WID_TN_SWITCH_BAR, + // lower toolbar + WID_TN_PAUSE, + WID_TN_FAST_FORWARD, + WID_TN_SAVE, + WID_TN_SMALL_MAP, + WID_TN_STATIONS, + WID_TN_FINANCES, + WID_TN_COMPANIES, + WID_TN_GRAPHS, + WID_TN_INDUSTRIES, + WID_TN_MESSAGES, + WID_TN_RAILS, + WID_TN_ROADS, + WID_TN_WATER, + WID_TN_AIR, + WID_TN_LANDSCAPE, + WID_TN_STORY, + WID_TN_HELP, + WID_TN_ZOOM_IN, + WID_TN_ZOOM_OUT, + WID_TN_SWITCH_BAR, }; static const byte arrange_all[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28 + WID_TN_PAUSE, + WID_TN_FAST_FORWARD, + WID_TN_SETTINGS, + WID_TN_SAVE, + WID_TN_SMALL_MAP, + WID_TN_TOWNS, + WID_TN_SUBSIDIES, + WID_TN_STATIONS, + WID_TN_FINANCES, + WID_TN_COMPANIES, + WID_TN_STORY, + WID_TN_GOAL, + WID_TN_GRAPHS, + WID_TN_LEAGUE, + WID_TN_INDUSTRIES, + WID_TN_TRAINS, + WID_TN_ROADVEHS, + WID_TN_SHIPS, + WID_TN_AIRCRAFT, + WID_TN_ZOOM_IN, + WID_TN_ZOOM_OUT, + WID_TN_RAILS, + WID_TN_ROADS, + WID_TN_WATER, + WID_TN_AIR, + WID_TN_LANDSCAPE, + WID_TN_MUSIC_SOUND, + WID_TN_MESSAGES, + WID_TN_HELP }; /* If at least BIGGEST_ARRANGEMENT fit, just spread all the buttons nicely */ @@ -1537,14 +1808,65 @@ class NWidgetScenarioToolbarContainer : public NWidgetToolbarContainer { /* virtual */ const byte *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const { static const byte arrange_all[] = { - 0, 1, 2, 3, 4, 18, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 26, 28, + WID_TE_PAUSE, + WID_TE_FAST_FORWARD, + WID_TE_SETTINGS, + WID_TE_SAVE, + WID_TE_SPACER, + WID_TE_DATE_PANEL, + WID_TE_SMALL_MAP, + WID_TE_ZOOM_IN, + WID_TE_ZOOM_OUT, + WID_TE_LAND_GENERATE, + WID_TE_TOWN_GENERATE, + WID_TE_INDUSTRY, + WID_TE_ROADS, + WID_TE_WATER, + WID_TE_TREES, + WID_TE_SIGNS, + WID_TE_MUSIC_SOUND, + WID_TE_HELP, }; static const byte arrange_nopanel[] = { - 0, 1, 2, 3, 18, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 26, 28, + WID_TE_PAUSE, + WID_TE_FAST_FORWARD, + WID_TE_SETTINGS, + WID_TE_SAVE, + WID_TE_DATE_PANEL, + WID_TE_SMALL_MAP, + WID_TE_ZOOM_IN, + WID_TE_ZOOM_OUT, + WID_TE_LAND_GENERATE, + WID_TE_TOWN_GENERATE, + WID_TE_INDUSTRY, + WID_TE_ROADS, + WID_TE_WATER, + WID_TE_TREES, + WID_TE_SIGNS, + WID_TE_MUSIC_SOUND, + WID_TE_HELP, }; static const byte arrange_switch[] = { - 18, 8, 11, 12, 13, 14, 15, 16, 17, 29, - 0, 1, 2, 3, 18, 9, 10, 26, 28, 29, + WID_TE_DATE_PANEL, + WID_TE_SMALL_MAP, + WID_TE_LAND_GENERATE, + WID_TE_TOWN_GENERATE, + WID_TE_INDUSTRY, + WID_TE_ROADS, + WID_TE_WATER, + WID_TE_TREES, + WID_TE_SIGNS, + WID_TE_SWITCH_BAR, + // lower toolbar + WID_TE_PAUSE, + WID_TE_FAST_FORWARD, + WID_TE_SETTINGS, + WID_TE_SAVE, + WID_TE_DATE_PANEL, + WID_TE_ZOOM_IN, + WID_TE_ZOOM_OUT, + WID_TE_MUSIC_SOUND, + WID_TE_HELP, WID_TE_SWITCH_BAR, }; /* If we can place all buttons *and* the panels, show them. */ @@ -1656,13 +1978,11 @@ enum MainToolbarHotkeys { /** Main toolbar. */ struct MainToolbarWindow : Window { - CallBackFunction last_started_action; ///< Last started user action. - MainToolbarWindow(WindowDesc *desc) : Window(desc) { this->InitNested(0); - this->last_started_action = CBF_NONE; + _last_started_action = CBF_NONE; CLRBITS(this->flags, WF_WHITE_BORDER); this->SetWidgetDisabledState(WID_TN_PAUSE, _networking && !_network_server); // if not server, disable pause button this->SetWidgetDisabledState(WID_TN_FAST_FORWARD, _networking); // if networking, disable fast-forward button @@ -1682,7 +2002,7 @@ struct MainToolbarWindow : Window { * Since enabled state is the default, just disable when needed */ this->SetWidgetsDisabledState(_local_company == COMPANY_SPECTATOR, WID_TN_RAILS, WID_TN_ROADS, WID_TN_WATER, WID_TN_AIR, WID_TN_LANDSCAPE, WIDGET_LIST_END); /* disable company list drop downs, if there are no companies */ - this->SetWidgetsDisabledState(Company::GetNumItems() == 0, WID_TN_STATIONS, WID_TN_FINANCES, WID_TN_TRAINS, WID_TN_ROADVEHS, WID_TN_SHIPS, WID_TN_AIRCRAFTS, WIDGET_LIST_END); + this->SetWidgetsDisabledState(Company::GetNumItems() == 0, WID_TN_STATIONS, WID_TN_FINANCES, WID_TN_TRAINS, WID_TN_ROADVEHS, WID_TN_SHIPS, WID_TN_AIRCRAFT, WIDGET_LIST_END); this->SetWidgetDisabledState(WID_TN_GOAL, Goal::GetNumItems() == 0); this->SetWidgetDisabledState(WID_TN_STORY, StoryPage::GetNumItems() == 0); @@ -1701,7 +2021,7 @@ struct MainToolbarWindow : Window { virtual void OnDropdownSelect(int widget, int index) { CallBackFunction cbf = _menu_clicked_procs[widget](index); - if (cbf != CBF_NONE) this->last_started_action = cbf; + if (cbf != CBF_NONE) _last_started_action = cbf; } virtual EventState OnHotkey(int hotkey) @@ -1711,7 +2031,7 @@ struct MainToolbarWindow : Window { case MTHK_FASTFORWARD: ToolbarFastForwardClick(this); break; case MTHK_SETTINGS: ShowGameOptions(); break; case MTHK_SAVEGAME: MenuClickSaveLoad(); break; - case MTHK_LOADGAME: ShowSaveLoadDialog(SLD_LOAD_GAME); break; + case MTHK_LOADGAME: ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break; case MTHK_SMALLMAP: ShowSmallMap(); break; case MTHK_TOWNDIRECTORY: ShowTownDirectory(); break; case MTHK_SUBSIDIES: ShowSubsidiesList(); break; @@ -1754,7 +2074,7 @@ struct MainToolbarWindow : Window { virtual void OnPlaceObject(Point pt, TileIndex tile) { - switch (this->last_started_action) { + switch (_last_started_action) { case CBF_PLACE_SIGN: PlaceProc_Sign(tile); break; @@ -1767,6 +2087,11 @@ struct MainToolbarWindow : Window { } } + virtual void OnPlaceObjectAbort() + { + _last_started_action = CBF_NONE; + } + virtual void OnTick() { if (this->IsWidgetLowered(WID_TN_PAUSE) != !!_pause_mode) { @@ -1895,7 +2220,14 @@ static NWidgetBase *MakeMainToolbar(int *biggest_index) NWidgetMainToolbarContainer *hor = new NWidgetMainToolbarContainer(); for (uint i = 0; i < WID_TN_END; i++) { switch (i) { - case 4: case 8: case 15: case 19: case 21: case 26: hor->Add(new NWidgetSpacer(0, 0)); break; + case WID_TN_SMALL_MAP: + case WID_TN_FINANCES: + case WID_TN_VEHICLE_START: + case WID_TN_ZOOM_IN: + case WID_TN_BUILDING_TOOLS_START: + case WID_TN_MUSIC_SOUND: + hor->Add(new NWidgetSpacer(0, 0)); + break; } hor->Add(new NWidgetLeaf(i == WID_TN_SAVE ? WWT_IMGBTN_2 : WWT_IMGBTN, COLOUR_GREY, i, toolbar_button_sprites[i], STR_TOOLBAR_TOOLTIP_PAUSE_GAME + i)); } @@ -1978,13 +2310,11 @@ enum MainToolbarEditorHotkeys { }; struct ScenarioEditorToolbarWindow : Window { - CallBackFunction last_started_action; ///< Last started user action. - ScenarioEditorToolbarWindow(WindowDesc *desc) : Window(desc) { this->InitNested(0); - this->last_started_action = CBF_NONE; + _last_started_action = CBF_NONE; CLRBITS(this->flags, WF_WHITE_BORDER); PositionMainToolbar(this); DoZoomInOutWindow(ZOOM_NONE, this); @@ -2043,7 +2373,7 @@ struct ScenarioEditorToolbarWindow : Window { { if (_game_mode == GM_MENU) return; CallBackFunction cbf = _scen_toolbar_button_procs[widget](this); - if (cbf != CBF_NONE) this->last_started_action = cbf; + if (cbf != CBF_NONE) _last_started_action = cbf; } virtual void OnDropdownSelect(int widget, int index) @@ -2052,7 +2382,7 @@ struct ScenarioEditorToolbarWindow : Window { * editor toolbar, so we need to adjust for it. */ if (widget == WID_TE_SMALL_MAP) widget = WID_TN_SMALL_MAP; CallBackFunction cbf = _menu_clicked_procs[widget](index); - if (cbf != CBF_NONE) this->last_started_action = cbf; + if (cbf != CBF_NONE) _last_started_action = cbf; if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP); } @@ -2084,13 +2414,13 @@ struct ScenarioEditorToolbarWindow : Window { case MTEHK_EXTRA_VIEWPORT: ShowExtraViewPortWindowForTileUnderCursor(); break; default: return ES_NOT_HANDLED; } - if (cbf != CBF_NONE) this->last_started_action = cbf; + if (cbf != CBF_NONE) _last_started_action = cbf; return ES_HANDLED; } virtual void OnPlaceObject(Point pt, TileIndex tile) { - switch (this->last_started_action) { + switch (_last_started_action) { case CBF_PLACE_SIGN: PlaceProc_Sign(tile); break; @@ -2103,6 +2433,11 @@ struct ScenarioEditorToolbarWindow : Window { } } + virtual void OnPlaceObjectAbort() + { + _last_started_action = CBF_NONE; + } + virtual void OnTimeout() { this->SetWidgetsLoweredState(false, WID_TE_DATE_BACKWARD, WID_TE_DATE_FORWARD, WIDGET_LIST_END); diff --git a/src/town.h b/src/town.h index 010c7c2168..19a4118bad 100644 --- a/src/town.h +++ b/src/town.h @@ -26,7 +26,7 @@ struct BuildingCounts { T class_count[HOUSE_CLASS_MAX]; }; -typedef TileMatrix AcceptanceMatrix; +typedef TileMatrix AcceptanceMatrix; static const uint CUSTOM_TOWN_NUMBER_DIFFICULTY = 4; ///< value for custom town number in difficulty settings static const uint CUSTOM_TOWN_MAX_NUMBER = 5000; ///< this is the maximum number of towns a user can specify in customisation @@ -35,8 +35,8 @@ static const uint INVALID_TOWN = 0xFFFF; static const uint TOWN_GROWTH_WINTER = 0xFFFFFFFE; ///< The town only needs this cargo in the winter (any amount) static const uint TOWN_GROWTH_DESERT = 0xFFFFFFFF; ///< The town needs the cargo for growth when on desert (any amount) -static const uint16 TOWN_GROW_RATE_CUSTOM = 0x8000; ///< If this mask is applied to Town::growth_rate, the grow_counter will not be calculated by the system (but assumed to be set by scripts) -static const uint16 TOWN_GROW_RATE_CUSTOM_NONE = 0xFFFF; ///< Special value for Town::growth_rate to disable town growth. +static const uint16 TOWN_GROWTH_RATE_NONE = 0xFFFF; ///< Special value for Town::growth_rate to disable town growth. +static const uint16 MAX_TOWN_GROWTH_TICKS = 930; ///< Max amount of original town ticks that still fit into uint16, about equal to UINT16_MAX / TOWN_GROWTH_TICKS but sligtly less to simplify calculations typedef Pool TownPool; extern TownPool _town_pool; @@ -85,9 +85,9 @@ struct Town : TownPool::PoolItem<&_town_pool> { inline byte GetPercentTransported(CargoID cid) const { return this->supplied[cid].old_act * 256 / (this->supplied[cid].old_max + 1); } /* Cargo production and acceptance stats. */ - uint32 cargo_produced; ///< Bitmap of all cargoes produced by houses in this town. + CargoTypes cargo_produced; ///< Bitmap of all cargoes produced by houses in this town. AcceptanceMatrix cargo_accepted; ///< Bitmap of cargoes accepted by houses for each 4*4 map square of the town. - uint32 cargo_accepted_total; ///< NOSAVE: Bitmap of all cargoes accepted by houses in this town. + CargoTypes cargo_accepted_total; ///< NOSAVE: Bitmap of all cargoes accepted by houses in this town. uint16 time_until_rebuild; ///< time until we rebuild a house @@ -165,6 +165,7 @@ enum TownFlags { TOWN_IS_GROWING = 0, ///< Conditions for town growth are met. Grow according to Town::growth_rate. TOWN_HAS_CHURCH = 1, ///< There can be only one church by town. TOWN_HAS_STADIUM = 2, ///< There can be only one stadium by town. + TOWN_CUSTOM_GROWTH = 3, ///< Growth rate is controlled by GS. }; CommandCost CheckforTownRating(DoCommandFlag flags, Town *t, TownRatingCheckType type); @@ -194,7 +195,6 @@ uint GetMaskOfTownActions(int *nump, CompanyID cid, const Town *t); bool GenerateTowns(TownLayout layout); const CargoSpec *FindFirstCargoWithTownEffect(TownEffect effect); - /** Town actions of a company. */ enum TownActions { TACT_NONE = 0x00, ///< Empty action set. @@ -284,6 +284,15 @@ void MakeDefaultName(T *obj) obj->town_cn = (uint16)next; // set index... } -extern uint32 _town_cargoes_accepted; +/* + * Converts original town ticks counters to plain game ticks. Note that + * tick 0 is a valid tick so actual amount is one more than the counter value. + */ +static inline uint16 TownTicksToGameTicks(uint16 ticks) { + return (min(ticks, MAX_TOWN_GROWTH_TICKS) + 1) * TOWN_GROWTH_TICKS - 1; +} + + +extern CargoTypes _town_cargoes_accepted; #endif /* TOWN_H */ diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 7479892c23..927651864f 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -53,7 +53,7 @@ #include "safeguards.h" TownID _new_town_id; -uint32 _town_cargoes_accepted; ///< Bitmap of all cargoes accepted by houses. +CargoTypes _town_cargoes_accepted; ///< Bitmap of all cargoes accepted by houses. /* Initialize the town-pool */ TownPool _town_pool("Town"); @@ -601,14 +601,14 @@ static void AddProducedCargo_Town(TileIndex tile, CargoArray &produced) } } -static inline void AddAcceptedCargoSetMask(CargoID cargo, uint amount, CargoArray &acceptance, uint32 *always_accepted) +static inline void AddAcceptedCargoSetMask(CargoID cargo, uint amount, CargoArray &acceptance, CargoTypes *always_accepted) { if (cargo == CT_INVALID || amount == 0) return; acceptance[cargo] += amount; SetBit(*always_accepted, cargo); } -static void AddAcceptedCargo_Town(TileIndex tile, CargoArray &acceptance, uint32 *always_accepted) +static void AddAcceptedCargo_Town(TileIndex tile, CargoArray &acceptance, CargoTypes *always_accepted) { const HouseSpec *hs = HouseSpec::Get(GetHouseType(tile)); CargoID accepts[3]; @@ -719,7 +719,7 @@ void UpdateTownCargoTotal(Town *t) static void UpdateTownCargoes(Town *t, TileIndex start, bool update_total = true) { CargoArray accepted, produced; - uint32 dummy; + CargoTypes dummy = 0; /* Gather acceptance for all houses in an area around the start tile. * The area is composed of the square the tile is in, extended one square in all @@ -733,7 +733,7 @@ static void UpdateTownCargoes(Town *t, TileIndex start, bool update_total = true } /* Create bitmap of produced and accepted cargoes. */ - uint32 acc = 0; + CargoTypes acc = 0; for (uint cid = 0; cid < NUM_CARGO; cid++) { if (accepted[cid] >= 8) SetBit(acc, cid); if (produced[cid] > 0) SetBit(t->cargo_produced, cid); @@ -780,12 +780,13 @@ static bool GrowTown(Town *t); static void TownTickHandler(Town *t) { if (HasBit(t->flags, TOWN_IS_GROWING)) { - int i = t->grow_counter - 1; + int i = (int)t->grow_counter - 1; if (i < 0) { if (GrowTown(t)) { - i = t->growth_rate & (~TOWN_GROW_RATE_CUSTOM); + i = t->growth_rate; } else { - i = 0; + /* If growth failed wait a bit before retrying */ + i = min(t->growth_rate, TOWN_GROWTH_TICKS - 1); } } t->grow_counter = i; @@ -798,10 +799,7 @@ void OnTick_Town() Town *t; FOR_ALL_TOWNS(t) { - /* Run town tick at regular intervals, but not all at once. */ - if ((_tick_counter + t->index) % TOWN_GROWTH_TICKS == 0) { - TownTickHandler(t); - } + TownTickHandler(t); } } @@ -1228,37 +1226,68 @@ static void GrowTownInTile(TileIndex *tile_ptr, RoadBits cur_rb, DiagDirection t /* Possibly extend the road in a direction. * Randomize a direction and if it has a road, bail out. */ target_dir = RandomDiagDir(); - if (cur_rb & DiagDirToRoadBits(target_dir)) return; + RoadBits target_rb = DiagDirToRoadBits(target_dir); + TileIndex house_tile; // position of a possible house - /* This is the tile we will reach if we extend to this direction. */ - TileIndex house_tile = TileAddByDiagDir(tile, target_dir); // position of a possible house + if (cur_rb & target_rb) { + /* If it's a road turn possibly build a house in a corner. + * Use intersection with straight road as an indicator + * that we randomed corner house position. + * A turn (and we check for that later) always has only + * one common bit with a straight road so it has the same + * chance to be chosen as the house on the side of a road. + */ + if ((cur_rb & ROAD_X) != target_rb) return; + + /* Check whether it is a turn and if so determine + * position of the corner tile */ + switch (cur_rb) { + case ROAD_N: + house_tile = TileAddByDir(tile, DIR_S); + break; + case ROAD_S: + house_tile = TileAddByDir(tile, DIR_N); + break; + case ROAD_E: + house_tile = TileAddByDir(tile, DIR_W); + break; + case ROAD_W: + house_tile = TileAddByDir(tile, DIR_E); + break; + default: + return; // not a turn + } + target_dir = DIAGDIR_END; + } else { + house_tile = TileAddByDiagDir(tile, target_dir); + } /* Don't walk into water. */ if (HasTileWaterGround(house_tile)) return; if (!IsValidTile(house_tile)) return; - if (_settings_game.economy.allow_town_roads || _generating_world) { + if (target_dir != DIAGDIR_END && (_settings_game.economy.allow_town_roads || _generating_world)) { switch (t1->layout) { default: NOT_REACHED(); case TL_3X3_GRID: // Use 2x2 grid afterwards! GrowTownWithExtraHouse(t1, TileAddByDiagDir(house_tile, target_dir)); - /* FALL THROUGH */ + FALLTHROUGH; case TL_2X2_GRID: rcmd = GetTownRoadGridElement(t1, tile, target_dir); - allow_house = (rcmd & DiagDirToRoadBits(target_dir)) == ROAD_NONE; + allow_house = (rcmd & target_rb) == ROAD_NONE; break; case TL_BETTER_ROADS: // Use original afterwards! GrowTownWithExtraHouse(t1, TileAddByDiagDir(house_tile, target_dir)); - /* FALL THROUGH */ + FALLTHROUGH; case TL_ORIGINAL: /* Allow a house at the edge. 60% chance or * always ok if no road allowed. */ - rcmd = DiagDirToRoadBits(target_dir); + rcmd = target_rb; allow_house = (!IsRoadAllowedHere(t1, house_tile, target_dir) || Chance16(6, 10)); break; } @@ -1546,6 +1575,9 @@ void UpdateTownMaxPass(Town *t) t->supplied[CT_MAIL].old_max = t->cache.population >> 4; } +static void UpdateTownGrowthRate(Town *t); +static void UpdateTownGrowth(Town *t); + /** * Does the actual town creation. * @@ -1565,8 +1597,10 @@ static void DoCreateTown(Town *t, TileIndex tile, uint32 townnameparts, TownSize UpdateTownRadius(t); t->flags = 0; t->cache.population = 0; - t->grow_counter = 0; - t->growth_rate = 250; + /* Spread growth across ticks so even if there are many + * similar towns they're unlikely to grow all in one tick */ + t->grow_counter = t->index % TOWN_GROWTH_TICKS; + t->growth_rate = TownTicksToGameTicks(250); /* Set the default cargo requirement for town growth */ switch (_settings_game.game_creation.landscape) { @@ -1623,6 +1657,7 @@ static void DoCreateTown(Town *t, TileIndex tile, uint32 townnameparts, TownSize t->cache.num_houses -= x; UpdateTownRadius(t); + UpdateTownGrowthRate(t); UpdateTownMaxPass(t); UpdateAirportsNoise(); } @@ -1763,15 +1798,21 @@ CommandCost CmdFoundTown(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 if (_game_mode != GM_EDITOR) { /* 't' can't be NULL since 'random' is false outside scenedit */ assert(!random); - char company_name[MAX_LENGTH_COMPANY_NAME_CHARS * MAX_CHAR_LENGTH]; - SetDParam(0, _current_company); - GetString(company_name, STR_COMPANY_NAME, lastof(company_name)); - char *cn = stredup(company_name); - SetDParamStr(0, cn); - SetDParam(1, t->index); + if (_current_company == OWNER_DEITY) { + SetDParam(0, t->index); + AddTileNewsItem(STR_NEWS_NEW_TOWN_UNSPONSORED, NT_INDUSTRY_OPEN, tile); + } else { + char company_name[MAX_LENGTH_COMPANY_NAME_CHARS * MAX_CHAR_LENGTH]; + SetDParam(0, _current_company); + GetString(company_name, STR_COMPANY_NAME, lastof(company_name)); - AddTileNewsItem(STR_NEWS_NEW_TOWN, NT_INDUSTRY_OPEN, tile, cn); + char *cn = stredup(company_name); + SetDParamStr(0, cn); + SetDParam(1, t->index); + + AddTileNewsItem(STR_NEWS_NEW_TOWN, NT_INDUSTRY_OPEN, tile, cn); + } AI::BroadcastNewEvent(new ScriptEventTownFounded(t->index)); Game::NewEvent(new ScriptEventTownFounded(t->index)); } @@ -2058,11 +2099,10 @@ static void MakeTownHouse(TileIndex t, Town *town, byte counter, byte stage, Hou * Checks if a house can be built here. Important is slope, bridge above * and ability to clear the land. * @param tile tile to check - * @param town town that is checking * @param noslope are slopes (foundations) allowed? * @return true iff house can be built here */ -static inline bool CanBuildHouseHere(TileIndex tile, TownID town, bool noslope) +static inline bool CanBuildHouseHere(TileIndex tile, bool noslope) { /* cannot build on these slopes... */ Slope slope = GetTileSlope(tile); @@ -2071,9 +2111,6 @@ static inline bool CanBuildHouseHere(TileIndex tile, TownID town, bool noslope) /* building under a bridge? */ if (IsBridgeAbove(tile)) return false; - /* do not try to build over house owned by another town */ - if (IsTileType(tile, MP_HOUSE) && GetTownIndex(tile) != town) return false; - /* can we clear the land? */ return DoCommand(tile, 0, 0, DC_AUTO | DC_NO_WATER, CMD_LANDSCAPE_CLEAR).Succeeded(); } @@ -2082,15 +2119,14 @@ static inline bool CanBuildHouseHere(TileIndex tile, TownID town, bool noslope) /** * Checks if a house can be built at this tile, must have the same max z as parameter. * @param tile tile to check - * @param town town that is checking * @param z max z of this tile so more parts of a house are at the same height (with foundation) * @param noslope are slopes (foundations) allowed? * @return true iff house can be built here * @see CanBuildHouseHere() */ -static inline bool CheckBuildHouseSameZ(TileIndex tile, TownID town, int z, bool noslope) +static inline bool CheckBuildHouseSameZ(TileIndex tile, int z, bool noslope) { - if (!CanBuildHouseHere(tile, town, noslope)) return false; + if (!CanBuildHouseHere(tile, noslope)) return false; /* if building on slopes is allowed, there will be flattening foundation (to tile max z) */ if (GetTileMaxZ(tile) != z) return false; @@ -2102,20 +2138,19 @@ static inline bool CheckBuildHouseSameZ(TileIndex tile, TownID town, int z, bool /** * Checks if a house of size 2x2 can be built at this tile * @param tile tile, N corner - * @param town town that is checking * @param z maximum tile z so all tile have the same max z * @param noslope are slopes (foundations) allowed? * @return true iff house can be built * @see CheckBuildHouseSameZ() */ -static bool CheckFree2x2Area(TileIndex tile, TownID town, int z, bool noslope) +static bool CheckFree2x2Area(TileIndex tile, int z, bool noslope) { /* we need to check this tile too because we can be at different tile now */ - if (!CheckBuildHouseSameZ(tile, town, z, noslope)) return false; + if (!CheckBuildHouseSameZ(tile, z, noslope)) return false; for (DiagDirection d = DIAGDIR_SE; d < DIAGDIR_END; d++) { tile += TileOffsByDiagDir(d); - if (!CheckBuildHouseSameZ(tile, town, z, noslope)) return false; + if (!CheckBuildHouseSameZ(tile, z, noslope)) return false; } return true; @@ -2202,10 +2237,10 @@ static bool CheckTownBuild2House(TileIndex *tile, Town *t, int maxz, bool noslop /* 'tile' is already checked in BuildTownHouse() - CanBuildHouseHere() and slope test */ TileIndex tile2 = *tile + TileOffsByDiagDir(second); - if (TownLayoutAllowsHouseHere(t, tile2) && CheckBuildHouseSameZ(tile2, t->index, maxz, noslope)) return true; + if (TownLayoutAllowsHouseHere(t, tile2) && CheckBuildHouseSameZ(tile2, maxz, noslope)) return true; tile2 = *tile + TileOffsByDiagDir(ReverseDiagDir(second)); - if (TownLayoutAllowsHouseHere(t, tile2) && CheckBuildHouseSameZ(tile2, t->index, maxz, noslope)) { + if (TownLayoutAllowsHouseHere(t, tile2) && CheckBuildHouseSameZ(tile2, maxz, noslope)) { *tile = tile2; return true; } @@ -2227,7 +2262,7 @@ static bool CheckTownBuild2x2House(TileIndex *tile, Town *t, int maxz, bool nosl TileIndex tile2 = *tile; for (DiagDirection d = DIAGDIR_SE;; d++) { // 'd' goes through DIAGDIR_SE, DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_END - if (TownLayoutAllows2x2HouseHere(t, tile2) && CheckFree2x2Area(tile2, t->index, maxz, noslope)) { + if (TownLayoutAllows2x2HouseHere(t, tile2) && CheckFree2x2Area(tile2, maxz, noslope)) { *tile = tile2; return true; } @@ -2251,7 +2286,7 @@ static bool BuildTownHouse(Town *t, TileIndex tile) if (!TownLayoutAllowsHouseHere(t, tile)) return false; /* no house allowed at all, bail out */ - if (!CanBuildHouseHere(tile, t->index, false)) return false; + if (!CanBuildHouseHere(tile, false)) return false; Slope slope = GetTileSlope(tile); int maxz = GetTileMaxZ(tile); @@ -2387,6 +2422,7 @@ static bool BuildTownHouse(Town *t, TileIndex tile) MakeTownHouse(tile, t, construction_counter, construction_stage, house, random_bits); UpdateTownRadius(t); + UpdateTownGrowthRate(t); UpdateTownCargoes(t, tile); return true; @@ -2522,8 +2558,6 @@ const CargoSpec *FindFirstCargoWithTownEffect(TownEffect effect) return NULL; } -static void UpdateTownGrowRate(Town *t); - /** * Change the cargo goal of a town. * @param tile Unused. @@ -2552,7 +2586,7 @@ CommandCost CmdTownCargoGoal(TileIndex tile, DoCommandFlag flags, uint32 p1, uin if (flags & DC_EXEC) { t->goal[te] = p2; - UpdateTownGrowRate(t); + UpdateTownGrowth(t); InvalidateWindowData(WC_TOWN_VIEW, index); } @@ -2588,14 +2622,13 @@ CommandCost CmdTownSetText(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 * @param tile Unused. * @param flags Type of operation. * @param p1 Town ID to cargo game of. - * @param p2 Amount of days between growth, or TOWN_GROW_RATE_CUSTOM_NONE, or 0 to reset custom growth rate. + * @param p2 Amount of days between growth, or TOWN_GROWTH_RATE_NONE, or 0 to reset custom growth rate. * @param text Unused. * @return Empty cost or an error. */ CommandCost CmdTownGrowthRate(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) { if (_current_company != OWNER_DEITY) return CMD_ERROR; - if ((p2 & TOWN_GROW_RATE_CUSTOM) != 0 && p2 != TOWN_GROW_RATE_CUSTOM_NONE) return CMD_ERROR; if (GB(p2, 16, 16) != 0) return CMD_ERROR; Town *t = Town::GetIfValid(p1); @@ -2603,10 +2636,10 @@ CommandCost CmdTownGrowthRate(TileIndex tile, DoCommandFlag flags, uint32 p1, ui if (flags & DC_EXEC) { if (p2 == 0) { - /* Clear TOWN_GROW_RATE_CUSTOM, UpdateTownGrowRate will determine a proper value */ - t->growth_rate = 0; + /* Just clear the flag, UpdateTownGrowth will determine a proper growth rate */ + ClrBit(t->flags, TOWN_CUSTOM_GROWTH); } else { - uint old_rate = t->growth_rate & ~TOWN_GROW_RATE_CUSTOM; + uint old_rate = t->growth_rate; if (t->grow_counter >= old_rate) { /* This also catches old_rate == 0 */ t->grow_counter = p2; @@ -2614,9 +2647,10 @@ CommandCost CmdTownGrowthRate(TileIndex tile, DoCommandFlag flags, uint32 p1, ui /* Scale grow_counter, so half finished houses stay half finished */ t->grow_counter = t->grow_counter * p2 / old_rate; } - t->growth_rate = p2 | TOWN_GROW_RATE_CUSTOM; + t->growth_rate = p2; + SetBit(t->flags, TOWN_CUSTOM_GROWTH); } - UpdateTownGrowRate(t); + UpdateTownGrowth(t); InvalidateWindowData(WC_TOWN_VIEW, p1); } @@ -2899,13 +2933,21 @@ static CommandCost TownActionFundBuildings(Town *t, DoCommandFlag flags) if (!_settings_game.economy.fund_buildings) return CMD_ERROR; if (flags & DC_EXEC) { - /* Build next tick */ - t->grow_counter = 1; /* And grow for 3 months */ t->fund_buildings_months = 3; /* Enable growth (also checking GameScript's opinion) */ - UpdateTownGrowRate(t); + UpdateTownGrowth(t); + + /* Build a new house, but add a small delay to make sure + * that spamming funding doesn't let town grow any faster + * than 1 house per 2 * TOWN_GROWTH_TICKS ticks. + * Also emulate original behaviour when town was only growing in + * TOWN_GROWTH_TICKS intervals, to make sure that it's not too + * tick-perfect and gives player some time window where he can + * spam funding with the exact same effeciency. + */ + t->grow_counter = min(t->grow_counter, 2 * TOWN_GROWTH_TICKS - (t->growth_rate - t->grow_counter) % TOWN_GROWTH_TICKS); SetWindowDirty(WC_TOWN_VIEW, t->index); } @@ -3099,8 +3141,87 @@ static void UpdateTownRating(Town *t) SetWindowDirty(WC_TOWN_AUTHORITY, t->index); } -static void UpdateTownGrowRate(Town *t) + +/** + * Updates town grow counter after growth rate change. + * Preserves relative house builting progress whenever it can. + * @param t The town to calculate grow counter for + * @param prev_growth_rate Town growth rate before it changed (one that was used with grow counter to be updated) + */ +static void UpdateTownGrowCounter(Town *t, uint16 prev_growth_rate) { + if (t->growth_rate == TOWN_GROWTH_RATE_NONE) return; + if (prev_growth_rate == TOWN_GROWTH_RATE_NONE) { + t->grow_counter = min(t->growth_rate, t->grow_counter); + return; + } + t->grow_counter = RoundDivSU((uint32)t->grow_counter * (t->growth_rate + 1), prev_growth_rate + 1); +} + +/** + * Calculates amount of active stations in the range of town (HZB_TOWN_EDGE). + * @param t The town to calculate stations for + * @returns Amount of active stations + */ +static int CountActiveStations(Town *t) +{ + int n = 0; + const Station *st; + FOR_ALL_STATIONS(st) { + if (DistanceSquare(st->xy, t->xy) <= t->cache.squared_town_zone_radius[0]) { + if (st->time_since_load <= 20 || st->time_since_unload <= 20) { + n++; + } + } + } + return n; +} + +/** + * Calculates town growth rate in normal conditions (custom growth rate not set). + * If town growth speed is set to None(0) returns the same rate as if it was Normal(2). + * @param t The town to calculate growth rate for + * @returns Calculated growth rate + */ +static uint GetNormalGrowthRate(Town *t) +{ + static const uint16 _grow_count_values[2][6] = { + { 120, 120, 120, 100, 80, 60 }, // Fund new buildings has been activated + { 320, 420, 300, 220, 160, 100 } // Normal values + }; + + int n = CountActiveStations(t); + uint16 m = _grow_count_values[t->fund_buildings_months != 0 ? 0 : 1][min(n, 5)]; + + uint growth_multiplier = _settings_game.economy.town_growth_rate != 0 ? _settings_game.economy.town_growth_rate - 1 : 1; + + m >>= growth_multiplier; + if (t->larger_town) m /= 2; + + return TownTicksToGameTicks(m / (t->cache.num_houses / 50 + 1)); +} + +/** + * Updates town growth rate. + * @param t The town to update growth rate for + */ +static void UpdateTownGrowthRate(Town *t) +{ + if (HasBit(t->flags, TOWN_CUSTOM_GROWTH)) return; + uint old_rate = t->growth_rate; + t->growth_rate = GetNormalGrowthRate(t); + UpdateTownGrowCounter(t, old_rate); + SetWindowDirty(WC_TOWN_VIEW, t->index); +} + +/** + * Updates town growth state (whether it is growing or not). + * @param t The town to update growth for + */ +static void UpdateTownGrowth(Town *t) +{ + UpdateTownGrowthRate(t); + ClrBit(t->flags, TOWN_IS_GROWING); SetWindowDirty(WC_TOWN_VIEW, t->index); @@ -3123,50 +3244,13 @@ static void UpdateTownGrowRate(Town *t) } } - if ((t->growth_rate & TOWN_GROW_RATE_CUSTOM) != 0) { - if (t->growth_rate != TOWN_GROW_RATE_CUSTOM_NONE) SetBit(t->flags, TOWN_IS_GROWING); + if (HasBit(t->flags, TOWN_CUSTOM_GROWTH)) { + if (t->growth_rate != TOWN_GROWTH_RATE_NONE) SetBit(t->flags, TOWN_IS_GROWING); SetWindowDirty(WC_TOWN_VIEW, t->index); return; } - /** - * Towns are processed every TOWN_GROWTH_TICKS ticks, and this is the - * number of times towns are processed before a new building is built. - */ - static const uint16 _grow_count_values[2][6] = { - { 120, 120, 120, 100, 80, 60 }, // Fund new buildings has been activated - { 320, 420, 300, 220, 160, 100 } // Normal values - }; - - int n = 0; - - const Station *st; - FOR_ALL_STATIONS(st) { - if (DistanceSquare(st->xy, t->xy) <= t->cache.squared_town_zone_radius[0]) { - if (st->time_since_load <= 20 || st->time_since_unload <= 20) { - n++; - } - } - } - - uint16 m; - - if (t->fund_buildings_months != 0) { - m = _grow_count_values[0][min(n, 5)]; - } else { - m = _grow_count_values[1][min(n, 5)]; - if (n == 0 && !Chance16(1, 12)) return; - } - - /* Use the normal growth rate values if new buildings have been funded in - * this town and the growth rate is set to none. */ - uint growth_multiplier = _settings_game.economy.town_growth_rate != 0 ? _settings_game.economy.town_growth_rate - 1 : 1; - - m >>= growth_multiplier; - if (t->larger_town) m /= 2; - - t->growth_rate = m / (t->cache.num_houses / 50 + 1); - t->grow_counter = min(t->growth_rate, t->grow_counter); + if (t->fund_buildings_months == 0 && CountActiveStations(t) == 0 && !Chance16(1, 12)) return; SetBit(t->flags, TOWN_IS_GROWING); SetWindowDirty(WC_TOWN_VIEW, t->index); @@ -3265,7 +3349,7 @@ Town *ClosestTownFromTile(TileIndex tile, uint threshold) return town; } - /* FALL THROUGH */ + FALLTHROUGH; case MP_HOUSE: return Town::GetByTile(tile); @@ -3400,8 +3484,8 @@ void TownsMonthlyLoop() } UpdateTownAmounts(t); + UpdateTownGrowth(t); UpdateTownRating(t); - UpdateTownGrowRate(t); UpdateTownUnwanted(t); UpdateTownCargoes(t); } diff --git a/src/town_gui.cpp b/src/town_gui.cpp index 222549ff73..17449854d6 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -177,7 +177,7 @@ public: y = y + WD_FRAMERECT_BOTTOM - nwid->pos_y; // Compute needed size of the widget. if (y > nwid->current_y) { /* If the company list is too big to fit, mark ourself dirty and draw again. */ - ResizeWindow(this, 0, y - nwid->current_y); + ResizeWindow(this, 0, y - nwid->current_y, false); } } @@ -267,8 +267,9 @@ public: this->sel_index = y; this->SetDirty(); } - /* FALL THROUGH, when double-clicking. */ + /* When double-clicking, continue */ if (click_count == 1 || y < 0) break; + FALLTHROUGH; } case WID_TA_EXECUTE: @@ -336,13 +337,15 @@ public: SetDParam(1, this->town->cache.num_houses); DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_LEFT, y, STR_TOWN_VIEW_POPULATION_HOUSES); - SetDParam(0, this->town->supplied[CT_PASSENGERS].old_act); - SetDParam(1, this->town->supplied[CT_PASSENGERS].old_max); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_LEFT, y += FONT_HEIGHT_NORMAL, STR_TOWN_VIEW_PASSENGERS_LAST_MONTH_MAX); + SetDParam(0, 1 << CT_PASSENGERS); + SetDParam(1, this->town->supplied[CT_PASSENGERS].old_act); + SetDParam(2, this->town->supplied[CT_PASSENGERS].old_max); + DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_LEFT, y += FONT_HEIGHT_NORMAL, STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX); - SetDParam(0, this->town->supplied[CT_MAIL].old_act); - SetDParam(1, this->town->supplied[CT_MAIL].old_max); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_LEFT, y += FONT_HEIGHT_NORMAL, STR_TOWN_VIEW_MAIL_LAST_MONTH_MAX); + SetDParam(0, 1 << CT_MAIL); + SetDParam(1, this->town->supplied[CT_MAIL].old_act); + SetDParam(2, this->town->supplied[CT_MAIL].old_max); + DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_LEFT, y += FONT_HEIGHT_NORMAL, STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX); bool first = true; for (int i = TE_BEGIN; i < TE_END; i++) { @@ -391,7 +394,7 @@ public: } if (HasBit(this->town->flags, TOWN_IS_GROWING)) { - SetDParam(0, ((this->town->growth_rate & (~TOWN_GROW_RATE_CUSTOM)) * TOWN_GROWTH_TICKS + DAY_TICKS) / DAY_TICKS); + SetDParam(0, RoundDivSU(this->town->growth_rate + 1, DAY_TICKS)); DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_LEFT, y += FONT_HEIGHT_NORMAL, this->town->fund_buildings_months == 0 ? STR_TOWN_VIEW_TOWN_GROWS_EVERY : STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED); } else { DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_LEFT, y += FONT_HEIGHT_NORMAL, STR_TOWN_VIEW_TOWN_GROW_STOPPED); @@ -744,6 +747,16 @@ public: } } + /** + * Get the string to draw the town name. + * @param t Town to draw. + * @return The string to use. + */ + static StringID GetTownString(const Town *t) + { + return t->larger_town ? STR_TOWN_DIRECTORY_CITY : STR_TOWN_DIRECTORY_TOWN; + } + virtual void DrawWidget(const Rect &r, int widget) const { switch (widget) { @@ -782,7 +795,7 @@ public: SetDParam(0, t->index); SetDParam(1, t->cache.population); - DrawString(text_left, text_right, y + (this->resize.step_height - FONT_HEIGHT_NORMAL) / 2, STR_TOWN_DIRECTORY_TOWN); + DrawString(text_left, text_right, y + (this->resize.step_height - FONT_HEIGHT_NORMAL) / 2, GetTownString(t)); y += this->resize.step_height; if (++n == this->vscroll->GetCapacity()) break; // max number of towns in 1 window @@ -821,7 +834,7 @@ public: SetDParam(0, t->index); SetDParamMaxDigits(1, 8); - d = maxdim(d, GetStringBoundingBox(STR_TOWN_DIRECTORY_TOWN)); + d = maxdim(d, GetStringBoundingBox(GetTownString(t))); } Dimension icon_size = GetSpriteSize(SPR_TOWN_RATING_GOOD); d.width += icon_size.width + 2; diff --git a/src/track_func.h b/src/track_func.h index 6896792374..a55d6d8f20 100644 --- a/src/track_func.h +++ b/src/track_func.h @@ -61,7 +61,7 @@ static inline bool IsValidTrackdirForRoadVehicle(Trackdir trackdir) */ static inline bool IsValidTrackdir(Trackdir trackdir) { - return (1 << trackdir & TRACKDIR_BIT_MASK) != 0; + return trackdir != INVALID_TRACKDIR && ((1 << trackdir & TRACKDIR_BIT_MASK) != TRACKDIR_BIT_NONE); } /** @@ -331,6 +331,28 @@ static inline TrackdirBits TrackBitsToTrackdirBits(TrackBits bits) return (TrackdirBits)(bits * 0x101); } +/** + * Checks whether a TrackBits has a given Track. + * @param tracks The track bits. + * @param track The track to check. + */ +static inline bool HasTrack(TrackBits tracks, Track track) +{ + assert(IsValidTrack(track)); + return HasBit(tracks, track); +} + +/** + * Checks whether a TrackdirBits has a given Trackdir. + * @param trackdirs The trackdir bits. + * @param trackdir The trackdir to check. + */ +static inline bool HasTrackdir(TrackdirBits trackdirs, Trackdir trackdir) +{ + assert(IsValidTrackdir(trackdir)); + return HasBit(trackdirs, trackdir); +} + /** * Returns the present-trackdir-information of a TrackStatus. * @@ -594,7 +616,7 @@ static inline TrackdirBits TrackdirReachesTrackdirs(Trackdir trackdir) static inline TrackdirBits TrackdirCrossesTrackdirs(Trackdir trackdir) { assert(IsValidTrackdirForRoadVehicle(trackdir)); - extern const TrackdirBits _track_crosses_trackdirs[TRACKDIR_END]; + extern const TrackdirBits _track_crosses_trackdirs[TRACK_END]; return _track_crosses_trackdirs[TrackdirToTrack(trackdir)]; } @@ -692,4 +714,25 @@ static inline bool IsUphillTrackdir(Slope slope, Trackdir dir) return HasBit(_uphill_trackdirs[RemoveHalftileSlope(slope)], dir); } +/** + * Determine the side in which the vehicle will leave the tile + * + * @param direction vehicle direction + * @param track vehicle track bits + * @return side of tile the vehicle will leave + */ +static inline DiagDirection VehicleExitDir(Direction direction, TrackBits track) +{ + static const TrackBits state_dir_table[DIAGDIR_END] = { TRACK_BIT_RIGHT, TRACK_BIT_LOWER, TRACK_BIT_LEFT, TRACK_BIT_UPPER }; + + DiagDirection diagdir = DirToDiagDir(direction); + + /* Determine the diagonal direction in which we will exit this tile */ + if (!HasBit(direction, 0) && track != state_dir_table[diagdir]) { + diagdir = ChangeDiagDir(diagdir, DIAGDIRDIFF_90LEFT); + } + + return diagdir; +} + #endif /* TRACK_FUNC_H */ diff --git a/src/track_type.h b/src/track_type.h index c0bfa0887f..2982288bba 100644 --- a/src/track_type.h +++ b/src/track_type.h @@ -104,22 +104,22 @@ typedef TinyEnumT TrackdirByte; * direction (corresponding to the Track enum) and 8-13 in the other direction. */ enum TrackdirBits { - TRACKDIR_BIT_NONE = 0x0000, ///< No track build - TRACKDIR_BIT_X_NE = 0x0001, ///< Track x-axis, direction north-east - TRACKDIR_BIT_Y_SE = 0x0002, ///< Track y-axis, direction south-east - TRACKDIR_BIT_UPPER_E = 0x0004, ///< Track upper, direction east - TRACKDIR_BIT_LOWER_E = 0x0008, ///< Track lower, direction east - TRACKDIR_BIT_LEFT_S = 0x0010, ///< Track left, direction south - TRACKDIR_BIT_RIGHT_S = 0x0020, ///< Track right, direction south + TRACKDIR_BIT_NONE = 0U, ///< No track build + TRACKDIR_BIT_X_NE = 1U << TRACKDIR_X_NE, ///< Track x-axis, direction north-east + TRACKDIR_BIT_Y_SE = 1U << TRACKDIR_Y_SE, ///< Track y-axis, direction south-east + TRACKDIR_BIT_UPPER_E = 1U << TRACKDIR_UPPER_E, ///< Track upper, direction east + TRACKDIR_BIT_LOWER_E = 1U << TRACKDIR_LOWER_E, ///< Track lower, direction east + TRACKDIR_BIT_LEFT_S = 1U << TRACKDIR_LEFT_S, ///< Track left, direction south + TRACKDIR_BIT_RIGHT_S = 1U << TRACKDIR_RIGHT_S, ///< Track right, direction south /* Again, note the two missing values here. This enables trackdir -> track conversion by doing (trackdir & 0xFF) */ - TRACKDIR_BIT_X_SW = 0x0100, ///< Track x-axis, direction south-west - TRACKDIR_BIT_Y_NW = 0x0200, ///< Track y-axis, direction north-west - TRACKDIR_BIT_UPPER_W = 0x0400, ///< Track upper, direction west - TRACKDIR_BIT_LOWER_W = 0x0800, ///< Track lower, direction west - TRACKDIR_BIT_LEFT_N = 0x1000, ///< Track left, direction north - TRACKDIR_BIT_RIGHT_N = 0x2000, ///< Track right, direction north - TRACKDIR_BIT_MASK = 0x3F3F, ///< Bitmask for bit-operations - INVALID_TRACKDIR_BIT = 0xFFFF, ///< Flag for an invalid trackdirbit value + TRACKDIR_BIT_X_SW = 1U << TRACKDIR_X_SW, ///< Track x-axis, direction south-west + TRACKDIR_BIT_Y_NW = 1U << TRACKDIR_Y_NW, ///< Track y-axis, direction north-west + TRACKDIR_BIT_UPPER_W = 1U << TRACKDIR_UPPER_W, ///< Track upper, direction west + TRACKDIR_BIT_LOWER_W = 1U << TRACKDIR_LOWER_W, ///< Track lower, direction west + TRACKDIR_BIT_LEFT_N = 1U << TRACKDIR_LEFT_N, ///< Track left, direction north + TRACKDIR_BIT_RIGHT_N = 1U << TRACKDIR_RIGHT_N, ///< Track right, direction north + TRACKDIR_BIT_MASK = 0x3F3F, ///< Bitmask for bit-operations + INVALID_TRACKDIR_BIT = 0xFFFF, ///< Flag for an invalid trackdirbit value }; DECLARE_ENUM_AS_BIT_SET(TrackdirBits) typedef SimpleTinyEnumT TrackdirBitsShort; diff --git a/src/train.h b/src/train.h index 280d59ebdd..5958cde1a0 100644 --- a/src/train.h +++ b/src/train.h @@ -61,7 +61,7 @@ byte FreightWagonMult(CargoID cargo); void CheckTrainsLengths(); -void FreeTrainTrackReservation(const Train *v, TileIndex origin = INVALID_TILE, Trackdir orig_td = INVALID_TRACKDIR); +void FreeTrainTrackReservation(const Train *v); bool TryPathReserve(Train *v, bool mark_as_stuck = false, bool first_tile_okay = false); int GetTrainStopLocation(StationID station_id, TileIndex tile, const Train *v, int *station_ahead, int *station_length); @@ -110,11 +110,11 @@ struct Train FINAL : public GroundVehicle { friend struct GroundVehicle; // GroundVehicle needs to use the acceleration functions defined at Train. void MarkDirty(); - void UpdateDeltaXY(Direction direction); + void UpdateDeltaXY(); ExpensesType GetExpenseType(bool income) const { return income ? EXPENSES_TRAIN_INC : EXPENSES_TRAIN_RUN; } void PlayLeaveStationSound() const; bool IsPrimaryVehicle() const { return this->IsFrontEngine(); } - SpriteID GetImage(Direction direction, EngineImageType image_type) const; + void GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const; int GetDisplaySpeed() const { return this->gcache.last_speed; } int GetDisplayMaxSpeed() const { return this->vcache.cached_max_speed; } Money GetRunningCost() const; diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 6f2feeaab7..0672ac2093 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -35,6 +35,7 @@ #include "order_backup.h" #include "zoom_func.h" #include "newgrf_debug.h" +#include "framerate_type.h" #include "table/strings.h" #include "table/train_cmd.h" @@ -57,27 +58,6 @@ bool IsValidImageIndex(uint8 image_index) return image_index < lengthof(_engine_sprite_base); } -/** - * Determine the side in which the train will leave the tile - * - * @param direction vehicle direction - * @param track vehicle track bits - * @return side of tile the train will leave - */ -static inline DiagDirection TrainExitDir(Direction direction, TrackBits track) -{ - static const TrackBits state_dir_table[DIAGDIR_END] = { TRACK_BIT_RIGHT, TRACK_BIT_LOWER, TRACK_BIT_LEFT, TRACK_BIT_UPPER }; - - DiagDirection diagdir = DirToDiagDir(direction); - - /* Determine the diagonal direction in which we will exit this tile */ - if (!HasBit(direction, 0) && track != state_dir_table[diagdir]) { - diagdir = ChangeDiagDir(diagdir, DIAGDIRDIFF_90LEFT); - } - - return diagdir; -} - /** * Return the cargo weight multiplier to use for a rail vehicle @@ -482,41 +462,40 @@ static SpriteID GetDefaultTrainSprite(uint8 spritenum, Direction direction) * @param image_type Visualisation context. * @return Sprite to display. */ -SpriteID Train::GetImage(Direction direction, EngineImageType image_type) const +void Train::GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const { uint8 spritenum = this->spritenum; - SpriteID sprite; if (HasBit(this->flags, VRF_REVERSE_DIRECTION)) direction = ReverseDir(direction); if (is_custom_sprite(spritenum)) { - sprite = GetCustomVehicleSprite(this, (Direction)(direction + 4 * IS_CUSTOM_SECONDHEAD_SPRITE(spritenum)), image_type); - if (sprite != 0) return sprite; + GetCustomVehicleSprite(this, (Direction)(direction + 4 * IS_CUSTOM_SECONDHEAD_SPRITE(spritenum)), image_type, result); + if (result->IsValid()) return; spritenum = this->GetEngine()->original_image_index; } assert(IsValidImageIndex(spritenum)); - sprite = GetDefaultTrainSprite(spritenum, direction); + SpriteID sprite = GetDefaultTrainSprite(spritenum, direction); if (this->cargo.StoredCount() >= this->cargo_cap / 2U) sprite += _wagon_full_adder[spritenum]; - return sprite; + result->Set(sprite); } -static SpriteID GetRailIcon(EngineID engine, bool rear_head, int &y, EngineImageType image_type) +static void GetRailIcon(EngineID engine, bool rear_head, int &y, EngineImageType image_type, VehicleSpriteSeq *result) { const Engine *e = Engine::Get(engine); Direction dir = rear_head ? DIR_E : DIR_W; uint8 spritenum = e->u.rail.image_index; if (is_custom_sprite(spritenum)) { - SpriteID sprite = GetCustomVehicleIcon(engine, dir, image_type); - if (sprite != 0) { + GetCustomVehicleIcon(engine, dir, image_type, result); + if (result->IsValid()) { if (e->GetGRF() != NULL) { y += ScaleGUITrad(e->GetGRF()->traininfo_vehicle_pitch); } - return sprite; + return; } spritenum = Engine::Get(engine)->original_image_index; @@ -524,7 +503,7 @@ static SpriteID GetRailIcon(EngineID engine, bool rear_head, int &y, EngineImage if (rear_head) spritenum++; - return GetDefaultTrainSprite(spritenum, DIR_W); + result->Set(GetDefaultTrainSprite(spritenum, DIR_W)); } void DrawTrainEngine(int left, int right, int preferred_x, int y, EngineID engine, PaletteID pal, EngineImageType image_type) @@ -533,24 +512,31 @@ void DrawTrainEngine(int left, int right, int preferred_x, int y, EngineID engin int yf = y; int yr = y; - SpriteID spritef = GetRailIcon(engine, false, yf, image_type); - SpriteID spriter = GetRailIcon(engine, true, yr, image_type); - const Sprite *real_spritef = GetSprite(spritef, ST_NORMAL); - const Sprite *real_spriter = GetSprite(spriter, ST_NORMAL); + VehicleSpriteSeq seqf, seqr; + GetRailIcon(engine, false, yf, image_type, &seqf); + GetRailIcon(engine, true, yr, image_type, &seqr); + + Rect rectf, rectr; + seqf.GetBounds(&rectf); + seqr.GetBounds(&rectr); preferred_x = Clamp(preferred_x, - left - UnScaleGUI(real_spritef->x_offs) + ScaleGUITrad(14), - right - UnScaleGUI(real_spriter->width) - UnScaleGUI(real_spriter->x_offs) - ScaleGUITrad(15)); + left - UnScaleGUI(rectf.left) + ScaleGUITrad(14), + right - UnScaleGUI(rectr.right) - ScaleGUITrad(15)); - DrawSprite(spritef, pal, preferred_x - ScaleGUITrad(14), yf); - DrawSprite(spriter, pal, preferred_x + ScaleGUITrad(15), yr); + seqf.Draw(preferred_x - ScaleGUITrad(14), yf, pal, pal == PALETTE_CRASH); + seqr.Draw(preferred_x + ScaleGUITrad(15), yr, pal, pal == PALETTE_CRASH); } else { - SpriteID sprite = GetRailIcon(engine, false, y, image_type); - const Sprite *real_sprite = GetSprite(sprite, ST_NORMAL); + VehicleSpriteSeq seq; + GetRailIcon(engine, false, y, image_type, &seq); + + Rect rect; + seq.GetBounds(&rect); preferred_x = Clamp(preferred_x, - left - UnScaleGUI(real_sprite->x_offs), - right - UnScaleGUI(real_sprite->width) - UnScaleGUI(real_sprite->x_offs)); - DrawSprite(sprite, pal, preferred_x, y); + left - UnScaleGUI(rect.left), + right - UnScaleGUI(rect.right)); + + seq.Draw(preferred_x, y, pal, pal == PALETTE_CRASH); } } @@ -567,23 +553,26 @@ void GetTrainSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, { int y = 0; - SpriteID sprite = GetRailIcon(engine, false, y, image_type); - const Sprite *real_sprite = GetSprite(sprite, ST_NORMAL); + VehicleSpriteSeq seq; + GetRailIcon(engine, false, y, image_type, &seq); - width = UnScaleGUI(real_sprite->width); - height = UnScaleGUI(real_sprite->height); - xoffs = UnScaleGUI(real_sprite->x_offs); - yoffs = UnScaleGUI(real_sprite->y_offs); + Rect rect; + seq.GetBounds(&rect); + + width = UnScaleGUI(rect.right - rect.left + 1); + height = UnScaleGUI(rect.bottom - rect.top + 1); + xoffs = UnScaleGUI(rect.left); + yoffs = UnScaleGUI(rect.top); if (RailVehInfo(engine)->railveh_type == RAILVEH_MULTIHEAD) { - sprite = GetRailIcon(engine, true, y, image_type); - real_sprite = GetSprite(sprite, ST_NORMAL); + GetRailIcon(engine, true, y, image_type, &seq); + seq.GetBounds(&rect); /* Calculate values relative to an imaginary center between the two sprites. */ - width = ScaleGUITrad(TRAININFO_DEFAULT_VEHICLE_WIDTH) + UnScaleGUI(real_sprite->width) + UnScaleGUI(real_sprite->x_offs) - xoffs; - height = max(height, UnScaleGUI(real_sprite->height)); + width = ScaleGUITrad(TRAININFO_DEFAULT_VEHICLE_WIDTH) + UnScaleGUI(rect.right) - xoffs; + height = max(height, UnScaleGUI(rect.bottom - rect.top + 1)); xoffs = xoffs - ScaleGUITrad(TRAININFO_DEFAULT_VEHICLE_WIDTH) / 2; - yoffs = min(yoffs, UnScaleGUI(real_sprite->y_offs)); + yoffs = min(yoffs, UnScaleGUI(rect.top)); } } @@ -592,7 +581,7 @@ void GetTrainSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, * @param tile tile of the depot where rail-vehicle is built. * @param flags type of operation. * @param e the engine to build. - * @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. */ static CommandCost CmdBuildRailWagon(TileIndex tile, DoCommandFlag flags, const Engine *e, Vehicle **ret) @@ -636,8 +625,9 @@ static CommandCost CmdBuildRailWagon(TileIndex tile, DoCommandFlag flags, const v->railtype = rvi->railtype; + v->date_of_last_service = _date; v->build_year = _cur_year; - v->cur_image = SPR_IMG_QUERY; + v->sprite_seq.Set(SPR_IMG_QUERY); v->random_bits = VehicleRandomBits(); v->group_id = DEFAULT_GROUP; @@ -703,8 +693,9 @@ static void AddRearEngineToMultiheadedTrain(Train *v) u->refit_cap = v->refit_cap; u->railtype = v->railtype; u->engine_type = v->engine_type; + u->date_of_last_service = v->date_of_last_service; u->build_year = v->build_year; - u->cur_image = SPR_IMG_QUERY; + u->sprite_seq.Set(SPR_IMG_QUERY); u->random_bits = VehicleRandomBits(); v->SetMultiheaded(); u->SetMultiheaded(); @@ -722,7 +713,7 @@ static void AddRearEngineToMultiheadedTrain(Train *v) * @param flags type of operation. * @param e the engine to build. * @param data bit 0 prevents any free cars from being added to the train. - * @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 CmdBuildRailVehicle(TileIndex tile, DoCommandFlag flags, const Engine *e, uint16 data, Vehicle **ret) @@ -770,7 +761,7 @@ CommandCost CmdBuildRailVehicle(TileIndex tile, DoCommandFlag flags, const Engin v->SetServiceInterval(Company::Get(_current_company)->settings.vehicle.servint_trains); v->date_of_last_service = _date; v->build_year = _cur_year; - v->cur_image = SPR_IMG_QUERY; + v->sprite_seq.Set(SPR_IMG_QUERY); v->random_bits = VehicleRandomBits(); if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SetBit(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE); @@ -883,7 +874,7 @@ static void RemoveFromConsist(Train *part, bool chain = false) static void InsertInConsist(Train *dst, Train *chain) { /* We do not want to add something in the middle of an articulated part. */ - assert(dst->Next() == NULL || !dst->Next()->IsArticulatedPart()); + assert(dst != NULL && (dst->Next() == NULL || !dst->Next()->IsArticulatedPart())); chain->Last()->SetNext(dst->Next()); dst->SetNext(chain); @@ -944,8 +935,8 @@ static void NormaliseSubtypes(Train *chain) * @note All vehicles are/were 'heads' of their chains. * @param original_dst The original destination chain. * @param dst The destination chain after constructing the train. - * @param original_dst The original source chain. - * @param dst The source chain after constructing the train. + * @param original_src The original source chain. + * @param src The source chain after constructing the train. * @return possible error of this command. */ static CommandCost CheckNewTrain(Train *original_dst, Train *dst, Train *original_src, Train *src) @@ -1063,8 +1054,8 @@ static CommandCost CheckTrainAttachment(Train *t) * @note All vehicles are/were 'heads' of their chains. * @param original_dst The original destination chain. * @param dst The destination chain after constructing the train. - * @param original_dst The original source chain. - * @param dst The source chain after constructing the train. + * @param original_src The original source chain. + * @param src The source chain after constructing the train. * @param check_limit Whether to check the vehicle limit. * @return possible error of this command. */ @@ -1431,7 +1422,7 @@ CommandCost CmdSellRailWagon(DoCommandFlag flags, Vehicle *t, uint16 data, uint3 return cost; } -void Train::UpdateDeltaXY(Direction direction) +void Train::UpdateDeltaXY() { /* Set common defaults. */ this->x_offs = -1; @@ -1442,7 +1433,7 @@ void Train::UpdateDeltaXY(Direction direction) this->x_bb_offs = 0; this->y_bb_offs = 0; - if (!IsDiagonalDirection(direction)) { + if (!IsDiagonalDirection(this->direction)) { static const int _sign_table[] = { /* x, y */ @@ -1455,12 +1446,12 @@ void Train::UpdateDeltaXY(Direction direction) int half_shorten = (VEHICLE_LENGTH - this->gcache.cached_veh_length) / 2; /* For all straight directions, move the bound box to the centre of the vehicle, but keep the size. */ - this->x_offs -= half_shorten * _sign_table[direction]; - this->y_offs -= half_shorten * _sign_table[direction + 1]; + this->x_offs -= half_shorten * _sign_table[this->direction]; + this->y_offs -= half_shorten * _sign_table[this->direction + 1]; this->x_extent += this->x_bb_offs = half_shorten * _sign_table[direction]; this->y_extent += this->y_bb_offs = half_shorten * _sign_table[direction + 1]; } else { - switch (direction) { + switch (this->direction) { /* Shorten southern corner of the bounding box according the vehicle length * and center the bounding box on the vehicle. */ case DIR_NE: @@ -1520,8 +1511,8 @@ static void MarkTrainAsStuck(Train *v) * Swap the two up/down flags in two ways: * - Swap values of \a swap_flag1 and \a swap_flag2, and * - If going up previously (#GVF_GOINGUP_BIT set), the #GVF_GOINGDOWN_BIT is set, and vice versa. - * @param swap_flag1 [inout] First train flag. - * @param swap_flag2 [inout] Second train flag. + * @param[in,out] swap_flag1 First train flag. + * @param[in,out] swap_flag2 Second train flag. */ static void SwapTrainFlags(uint16 *swap_flag1, uint16 *swap_flag2) { @@ -1689,8 +1680,8 @@ void UpdateLevelCrossing(TileIndex tile, bool sound) { assert(IsLevelCrossingTile(tile)); - /* train on crossing || train approaching crossing || reserved */ - bool new_state = HasVehicleOnPos(tile, NULL, &TrainOnTileEnum) || TrainApproachingCrossing(tile) || HasCrossingReservation(tile); + /* reserved || train on crossing || train approaching crossing */ + bool new_state = HasCrossingReservation(tile) || HasVehicleOnPos(tile, NULL, &TrainOnTileEnum) || TrainApproachingCrossing(tile); if (new_state != IsCrossingBarred(tile)) { if (new_state && sound) { @@ -1861,9 +1852,9 @@ void ReverseTrainDirection(Train *v) return; } - /* TrainExitDir does not always produce the desired dir for depots and + /* VehicleExitDir does not always produce the desired dir for depots and * tunnels/bridges that is needed for UpdateSignalsOnSegment. */ - DiagDirection dir = TrainExitDir(v->direction, v->track); + DiagDirection dir = VehicleExitDir(v->direction, v->track); if (IsRailDepotTile(v->tile) || IsTileType(v->tile, MP_TUNNELBRIDGE)) dir = INVALID_DIAGDIR; if (UpdateSignalsOnSegment(v->tile, dir, v->owner) == SIGSEG_PBS || _settings_game.pf.reserve_paths) { @@ -2023,9 +2014,9 @@ static FindDepotData FindClosestTrainDepot(Train *v, int max_distance) /** * Locate the closest depot for this consist, and return the information to the caller. - * @param location [out] If not \c NULL and a depot is found, store its location in the given address. - * @param destination [out] If not \c NULL and a depot is found, store its index in the given address. - * @param reverse [out] If not \c NULL and a depot is found, store reversal information in the given address. + * @param[out] location If not \c NULL and a depot is found, store its location in the given address. + * @param[out] destination If not \c NULL and a depot is found, store its index in the given address. + * @param[out] reverse If not \c NULL and a depot is found, store reversal information in the given address. * @return A depot has been found. */ bool Train::FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse) @@ -2243,16 +2234,14 @@ static void ClearPathReservation(const Train *v, TileIndex tile, Trackdir track_ /** * Free the reserved path in front of a vehicle. * @param v %Train owning the reserved path. - * @param origin %Tile to start clearing (if #INVALID_TILE, use the current tile of \a v). - * @param orig_td Track direction (if #INVALID_TRACKDIR, use the track direction of \a v). */ -void FreeTrainTrackReservation(const Train *v, TileIndex origin, Trackdir orig_td) +void FreeTrainTrackReservation(const Train *v) { assert(v->IsFrontEngine()); - TileIndex tile = origin != INVALID_TILE ? origin : v->tile; - Trackdir td = orig_td != INVALID_TRACKDIR ? orig_td : v->GetVehicleTrackdir(); - bool free_tile = tile != v->tile || !(IsRailStationTile(v->tile) || IsTileType(v->tile, MP_TUNNELBRIDGE)); + TileIndex tile = v->tile; + Trackdir td = v->GetVehicleTrackdir(); + bool free_tile = !(IsRailStationTile(v->tile) || IsTileType(v->tile, MP_TUNNELBRIDGE)); StationID station_id = IsRailStationTile(v->tile) ? GetStationIndex(v->tile) : INVALID_STATION; /* Can't be holding a reservation if we enter a depot. */ @@ -2318,9 +2307,9 @@ static const byte _initial_tile_subcoord[6][4][3] = { * @param tile The tile the train is about to enter * @param enterdir Diagonal direction the train is coming from * @param tracks Usable tracks on the new tile - * @param path_found [out] Whether a path has been found or not. + * @param[out] path_found Whether a path has been found or not. * @param do_track_reservation Path reservation is requested - * @param dest [out] State and destination of the requested path + * @param[out] dest State and destination of the requested path * @return The best track the train should follow */ static Track DoTrainPathfind(const Train *v, TileIndex tile, DiagDirection enterdir, TrackBits tracks, bool &path_found, bool do_track_reservation, PBSTileInfo *dest) @@ -2430,11 +2419,11 @@ static PBSTileInfo ExtendTrainReservation(const Train *v, TrackBits *new_tracks, * @param override_railtype Whether all physically compatible railtypes should be followed. * @return True if a path to a safe stopping tile could be reserved. */ -static bool TryReserveSafeTrack(const Train *v, TileIndex tile, Trackdir td, bool override_tailtype) +static bool TryReserveSafeTrack(const Train *v, TileIndex tile, Trackdir td, bool override_railtype) { switch (_settings_game.pf.pathfinder_for_trains) { - case VPF_NPF: return NPFTrainFindNearestSafeTile(v, tile, td, override_tailtype); - case VPF_YAPF: return YapfTrainFindNearestSafeTile(v, tile, td, override_tailtype); + case VPF_NPF: return NPFTrainFindNearestSafeTile(v, tile, td, override_railtype); + case VPF_YAPF: return YapfTrainFindNearestSafeTile(v, tile, td, override_railtype); default: NOT_REACHED(); } @@ -2493,6 +2482,7 @@ public: case OT_GOTO_DEPOT: /* Skip service in depot orders when the train doesn't need service. */ if ((order->GetDepotOrderType() & ODTFB_SERVICE) && !this->v->NeedsServicing()) break; + FALLTHROUGH; case OT_GOTO_STATION: case OT_GOTO_WAYPOINT: this->v->current_order = *order; @@ -3088,7 +3078,7 @@ static Vehicle *CheckTrainAtSignal(Vehicle *v, void *data) /* not front engine of a train, inside wormhole or depot, crashed */ if (!t->IsFrontEngine() || !(t->track & TRACK_BIT_MASK)) return NULL; - if (t->cur_speed > 5 || TrainExitDir(t->direction, t->track) != exitdir) return NULL; + if (t->cur_speed > 5 || VehicleExitDir(t->direction, t->track) != exitdir) return NULL; return t; } @@ -3351,7 +3341,7 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse) } /* update image of train, as well as delta XY */ - v->UpdateDeltaXY(v->direction); + v->UpdateDeltaXY(); v->x_pos = gp.x; v->y_pos = gp.y; @@ -3519,14 +3509,14 @@ static void ChangeTrainDirRandomly(Train *v) /* We don't need to twist around vehicles if they're not visible */ if (!(v->vehstatus & VS_HIDDEN)) { v->direction = ChangeDir(v->direction, delta[GB(Random(), 0, 2)]); - v->UpdateDeltaXY(v->direction); - v->cur_image = v->GetImage(v->direction, EIT_ON_MAP); /* Refrain from updating the z position of the vehicle when on * a bridge, because UpdateInclination() will put the vehicle under * the bridge in that case */ if (v->track != TRACK_BIT_WORMHOLE) { v->UpdatePosition(); - v->UpdateInclination(false, false); + v->UpdateInclination(false, true); + } else { + v->UpdateViewport(false, true); } } } while ((v = v->Next()) != NULL); @@ -3599,7 +3589,7 @@ static bool TrainApproachingLineEnd(Train *v, bool signal, bool reverse) * for other directions, it will be 1, 3, 5, ..., 15 */ switch (v->direction) { case DIR_N : x = ~x + ~y + 25; break; - case DIR_NW: x = y; // FALL THROUGH + case DIR_NW: x = y; FALLTHROUGH; case DIR_NE: x = ~x + 16; break; case DIR_E : x = ~x + y + 9; break; case DIR_SE: x = y; break; @@ -3671,7 +3661,7 @@ static TileIndex TrainApproachingCrossingTile(const Train *v) if (!TrainCanLeaveTile(v)) return INVALID_TILE; - DiagDirection dir = TrainExitDir(v->direction, v->track); + DiagDirection dir = VehicleExitDir(v->direction, v->track); TileIndex tile = v->tile + TileOffsByDiagDir(dir); /* not a crossing || wrong axis || unusable rail (wrong type or owner) */ @@ -3708,7 +3698,7 @@ static bool TrainCheckIfLineEnds(Train *v, bool reverse) if (!TrainCanLeaveTile(v)) return true; /* Determine the non-diagonal direction in which we will exit this tile */ - DiagDirection dir = TrainExitDir(v->direction, v->track); + DiagDirection dir = VehicleExitDir(v->direction, v->track); /* Calculate next tile */ TileIndex tile = v->tile + TileOffsByDiagDir(dir); @@ -3776,7 +3766,7 @@ static bool TrainLocoHandler(Train *v, bool mode) /* Try to reserve a path when leaving the station as we * might not be marked as wanting a reservation, e.g. * when an overlength train gets turned around in a station. */ - DiagDirection dir = TrainExitDir(v->direction, v->track); + DiagDirection dir = VehicleExitDir(v->direction, v->track); if (IsRailDepotTile(v->tile) || IsTileType(v->tile, MP_TUNNELBRIDGE)) dir = INVALID_DIAGDIR; if (UpdateSignalsOnSegment(v->tile, dir, v->owner) == SIGSEG_PBS || _settings_game.pf.reserve_paths) { @@ -3913,6 +3903,8 @@ Money Train::GetRunningCost() const */ bool Train::Tick() { + PerformanceAccumulator framerate(PFE_GL_TRAINS); + this->tick_counter++; if (this->IsFrontEngine()) { diff --git a/src/train_gui.cpp b/src/train_gui.cpp index d9da097017..51e772b520 100644 --- a/src/train_gui.cpp +++ b/src/train_gui.cpp @@ -56,21 +56,22 @@ void CcBuildWagon(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p * @param px The current x position to draw from. * @param max_width The maximum space available to draw. * @param selection Selected vehicle that is dragged. + * @param chain Whether a whole chain is dragged. * @return The width of the highlight mark. */ -static int HighlightDragPosition(int px, int max_width, VehicleID selection) +static int HighlightDragPosition(int px, int max_width, VehicleID selection, bool chain) { bool rtl = _current_text_dir == TD_RTL; assert(selection != INVALID_VEHICLE); - int dragged_width = WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; - for (Train *t = Train::Get(selection); t != NULL; t = t->HasArticulatedPart() ? t->GetNextArticulatedPart() : NULL) { + int dragged_width = 0; + for (Train *t = Train::Get(selection); t != NULL; t = chain ? t->Next() : (t->HasArticulatedPart() ? t->GetNextArticulatedPart() : NULL)) { dragged_width += t->GetDisplayImageWidth(NULL); } - int drag_hlight_left = rtl ? max(px -dragged_width, 0) : px; - int drag_hlight_right = rtl ? px : min(px + dragged_width, max_width); - int drag_hlight_width = max(drag_hlight_right - drag_hlight_left, 0); + int drag_hlight_left = rtl ? max(px - dragged_width + 1, 0) : px; + int drag_hlight_right = rtl ? px : min(px + dragged_width, max_width) - 1; + int drag_hlight_width = max(drag_hlight_right - drag_hlight_left + 1, 0); if (drag_hlight_width > 0) { GfxFillRect(drag_hlight_left + WD_FRAMERECT_LEFT, WD_FRAMERECT_TOP + 1, @@ -114,7 +115,7 @@ void DrawTrainImage(const Train *v, int left, int right, int y, VehicleID select for (; v != NULL && (rtl ? px > 0 : px < max_width); v = v->Next()) { if (dragging && !drag_at_end_of_train && drag_dest == v->index) { /* Highlight the drag-and-drop destination inside the train. */ - int drag_hlight_width = HighlightDragPosition(px, max_width, selection); + int drag_hlight_width = HighlightDragPosition(px, max_width, selection, _cursor.vehchain); px += rtl ? -drag_hlight_width : drag_hlight_width; } @@ -123,7 +124,9 @@ void DrawTrainImage(const Train *v, int left, int right, int y, VehicleID select if (rtl ? px + width > 0 : px - width < max_width) { PaletteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v); - DrawSprite(v->GetImage(dir, image_type), pal, px + (rtl ? -offset.x : offset.x), height / 2 + offset.y); + VehicleSpriteSeq seq; + v->GetImage(dir, image_type, &seq); + seq.Draw(px + (rtl ? -offset.x : offset.x), height / 2 + offset.y, pal, (v->vehstatus & VS_CRASHED) != 0); } if (!v->IsArticulatedPart()) sel_articulated = false; @@ -146,7 +149,7 @@ void DrawTrainImage(const Train *v, int left, int right, int y, VehicleID select if (dragging && drag_at_end_of_train) { /* Highlight the drag-and-drop destination at the end of the train. */ - HighlightDragPosition(px, max_width, selection); + HighlightDragPosition(px, max_width, selection, _cursor.vehchain); } if (highlight_l != highlight_r) { @@ -382,7 +385,9 @@ void DrawTrainDetails(const Train *v, int left, int right, int y, int vscroll_po pitch = ScaleGUITrad(e->GetGRF()->traininfo_vehicle_pitch); } PaletteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v); - DrawSprite(u->GetImage(dir, EIT_IN_DETAILS), pal, px + (rtl ? -offset.x : offset.x), y - line_height * vscroll_pos + sprite_y_offset + pitch); + VehicleSpriteSeq seq; + u->GetImage(dir, EIT_IN_DETAILS, &seq); + seq.Draw(px + (rtl ? -offset.x : offset.x), y - line_height * vscroll_pos + sprite_y_offset + pitch, pal, (v->vehstatus & VS_CRASHED) != 0); } px += rtl ? -width : width; dx += width; diff --git a/src/tree_cmd.cpp b/src/tree_cmd.cpp index c862f0dbc1..7240cf86d3 100644 --- a/src/tree_cmd.cpp +++ b/src/tree_cmd.cpp @@ -375,7 +375,8 @@ CommandCost CmdPlantTree(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 msg = STR_ERROR_CAN_T_BUILD_ON_WATER; continue; } - /* FALL THROUGH */ + FALLTHROUGH; + case MP_CLEAR: { if (IsBridgeAbove(tile)) { msg = STR_ERROR_SITE_UNSUITABLE; @@ -680,7 +681,7 @@ static void TileLoop_Trees(TileIndex tile) SetTreeGrowth(tile, 0); break; } - /* FALL THROUGH */ + FALLTHROUGH; case 2: { // add a neighbouring tree /* Don't plant extra trees if that's not allowed. */ diff --git a/src/tunnel_map.h b/src/tunnel_map.h index e200a1275e..d6f475d05c 100644 --- a/src/tunnel_map.h +++ b/src/tunnel_map.h @@ -58,6 +58,7 @@ static inline void MakeRoadTunnel(TileIndex t, Owner o, DiagDirection d, RoadTyp _m[t].m5 = TRANSPORT_ROAD << 2 | d; SB(_me[t].m6, 2, 4, 0); _me[t].m7 = 0; + _me[t].m8 = 0; SetRoadOwner(t, ROADTYPE_ROAD, o); if (o != OWNER_TOWN) SetRoadOwner(t, ROADTYPE_TRAM, o); SetRoadTypes(t, r); @@ -75,11 +76,12 @@ static inline void MakeRailTunnel(TileIndex t, Owner o, DiagDirection d, RailTyp SetTileType(t, MP_TUNNELBRIDGE); SetTileOwner(t, o); _m[t].m2 = 0; - _m[t].m3 = r; + _m[t].m3 = 0; _m[t].m4 = 0; _m[t].m5 = TRANSPORT_RAIL << 2 | d; SB(_me[t].m6, 2, 4, 0); _me[t].m7 = 0; + _me[t].m8 = r; } #endif /* TUNNEL_MAP_H */ diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index 5f2534b58c..06dc24e84f 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -159,40 +159,27 @@ static inline const PalSpriteID *GetBridgeSpriteTable(int index, BridgePieces ta /** - * Determines the foundation for the north bridge head, and tests if the resulting slope is valid. + * Determines the foundation for the bridge head, and tests if the resulting slope is valid. * + * @param bridge_piece Direction of the bridge head. * @param axis Axis of the bridge * @param tileh Slope of the tile under the north bridge head; returns slope on top of foundation * @param z TileZ corresponding to tileh, gets modified as well * @return Error or cost for bridge foundation */ -static CommandCost CheckBridgeSlopeNorth(Axis axis, Slope *tileh, int *z) +static CommandCost CheckBridgeSlope(BridgePieces bridge_piece, Axis axis, Slope *tileh, int *z) { + assert(bridge_piece == BRIDGE_PIECE_NORTH || bridge_piece == BRIDGE_PIECE_SOUTH); + Foundation f = GetBridgeFoundation(*tileh, axis); *z += ApplyFoundationToSlope(f, tileh); - Slope valid_inclined = (axis == AXIS_X ? SLOPE_NE : SLOPE_NW); - if ((*tileh != SLOPE_FLAT) && (*tileh != valid_inclined)) return CMD_ERROR; - - if (f == FOUNDATION_NONE) return CommandCost(); - - return CommandCost(EXPENSES_CONSTRUCTION, _price[PR_BUILD_FOUNDATION]); -} - -/** - * Determines the foundation for the south bridge head, and tests if the resulting slope is valid. - * - * @param axis Axis of the bridge - * @param tileh Slope of the tile under the south bridge head; returns slope on top of foundation - * @param z TileZ corresponding to tileh, gets modified as well - * @return Error or cost for bridge foundation - */ -static CommandCost CheckBridgeSlopeSouth(Axis axis, Slope *tileh, int *z) -{ - Foundation f = GetBridgeFoundation(*tileh, axis); - *z += ApplyFoundationToSlope(f, tileh); - - Slope valid_inclined = (axis == AXIS_X ? SLOPE_SW : SLOPE_SE); + Slope valid_inclined; + if (bridge_piece == BRIDGE_PIECE_NORTH) { + valid_inclined = (axis == AXIS_X ? SLOPE_NE : SLOPE_NW); + } else { + valid_inclined = (axis == AXIS_X ? SLOPE_SW : SLOPE_SE); + } if ((*tileh != SLOPE_FLAT) && (*tileh != valid_inclined)) return CMD_ERROR; if (f == FOUNDATION_NONE) return CommandCost(); @@ -204,6 +191,7 @@ static CommandCost CheckBridgeSlopeSouth(Axis axis, Slope *tileh, int *z) * Is a bridge of the specified type and length available? * @param bridge_type Wanted type of bridge. * @param bridge_len Wanted length of the bridge. + * @param flags Type of operation. * @return A succeeded (the requested bridge is available) or failed (it cannot be built) command. */ CommandCost CheckBridgeAvailability(BridgeType bridge_type, uint bridge_len, DoCommandFlag flags) @@ -232,7 +220,7 @@ CommandCost CheckBridgeAvailability(BridgeType bridge_type, uint bridge_len, DoC * @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. * @param text unused * @return the cost of this operation or an error @@ -259,7 +247,7 @@ CommandCost CmdBuildBridge(TileIndex end_tile, DoCommandFlag flags, uint32 p1, u break; case TRANSPORT_RAIL: - railtype = Extract(p2); + railtype = Extract(p2); if (!ValParamRailtype(railtype)) return CMD_ERROR; break; @@ -315,8 +303,8 @@ CommandCost CmdBuildBridge(TileIndex end_tile, DoCommandFlag flags, uint32 p1, u Slope tileh_end = GetTileSlope(tile_end, &z_end); bool pbs_reservation = false; - CommandCost terraform_cost_north = CheckBridgeSlopeNorth(direction, &tileh_start, &z_start); - CommandCost terraform_cost_south = CheckBridgeSlopeSouth(direction, &tileh_end, &z_end); + CommandCost terraform_cost_north = CheckBridgeSlope(BRIDGE_PIECE_NORTH, direction, &tileh_start, &z_start); + CommandCost terraform_cost_south = CheckBridgeSlope(BRIDGE_PIECE_SOUTH, direction, &tileh_end, &z_end); /* Aqueducts can't be built of flat land. */ if (transport_type == TRANSPORT_WATER && (tileh_start == SLOPE_FLAT || tileh_end == SLOPE_FLAT)) return_cmd_error(STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION); @@ -574,7 +562,7 @@ CommandCost CmdBuildBridge(TileIndex end_tile, DoCommandFlag flags, uint32 p1, u * Build Tunnel. * @param start_tile start tile of tunnel * @param flags type of operation - * @param p1 bit 0-3 railtype or roadtypes + * @param p1 bit 0-5 railtype or roadtypes * bit 8-9 transport type * @param p2 unused * @param text unused @@ -591,7 +579,7 @@ CommandCost CmdBuildTunnel(TileIndex start_tile, DoCommandFlag flags, uint32 p1, _build_tunnel_endtile = 0; switch (transport_type) { case TRANSPORT_RAIL: - railtype = Extract(p1); + railtype = Extract(p1); if (!ValParamRailtype(railtype)) return CMD_ERROR; break; @@ -701,8 +689,23 @@ CommandCost CmdBuildTunnel(TileIndex start_tile, DoCommandFlag flags, uint32 p1, /* Hide the tile from the terraforming command */ TileIndex old_first_tile = coa->first_tile; coa->first_tile = INVALID_TILE; + + /* CMD_TERRAFORM_LAND may append further items to _cleared_object_areas, + * however it will never erase or re-order existing items. + * _cleared_object_areas is a value-type SmallVector, therefore appending items + * may result in a backing-store re-allocation, which would invalidate the coa pointer. + * The index of the coa pointer into the _cleared_object_areas vector remains valid, + * and can be used safely after the CMD_TERRAFORM_LAND operation. + * Deliberately clear the coa pointer to avoid leaving dangling pointers which could + * inadvertently be dereferenced. + */ + assert(coa >= _cleared_object_areas.Begin() && coa < _cleared_object_areas.End()); + size_t coa_index = coa - _cleared_object_areas.Begin(); + assert(coa_index < UINT_MAX); // more than 2**32 cleared areas would be a bug in itself + coa = NULL; + ret = DoCommand(end_tile, end_tileh & start_tileh, 0, flags, CMD_TERRAFORM_LAND); - coa->first_tile = old_first_tile; + _cleared_object_areas[(uint)coa_index].first_tile = old_first_tile; if (ret.Failed()) return_cmd_error(STR_ERROR_UNABLE_TO_EXCAVATE_LAND); cost.AddCost(ret); } @@ -1216,14 +1219,14 @@ static void DrawTile_TunnelBridge(TileInfo *ti) } } - if (HasCatenaryDrawn(GetRailType(ti->tile))) { + if (HasRailCatenaryDrawn(GetRailType(ti->tile))) { /* Maybe draw pylons on the entry side */ - DrawCatenary(ti); + DrawRailCatenary(ti); catenary = true; StartSpriteCombine(); /* Draw wire above the ramp */ - DrawCatenaryOnTunnel(ti); + DrawRailCatenaryOnTunnel(ti); } } @@ -1341,8 +1344,8 @@ static void DrawTile_TunnelBridge(TileInfo *ti) } EndSpriteCombine(); - if (HasCatenaryDrawn(GetRailType(ti->tile))) { - DrawCatenary(ti); + if (HasRailCatenaryDrawn(GetRailType(ti->tile))) { + DrawRailCatenary(ti); } } @@ -1392,7 +1395,7 @@ void DrawBridgeMiddle(const TileInfo *ti) { /* Sectional view of bridge bounding boxes: * - * 1 2 1,2 = SpriteCombine of Bridge front/(back&floor) and TramCatenary + * 1 2 1,2 = SpriteCombine of Bridge front/(back&floor) and RoadCatenary * 1 2 3 = empty helper BB * 1 7 2 4,5 = pillars under higher bridges * 1 6 88888 6 2 6 = elrail-pylons @@ -1491,8 +1494,8 @@ void DrawBridgeMiddle(const TileInfo *ti) EndSpriteCombine(); - if (HasCatenaryDrawn(GetRailType(rampsouth))) { - DrawCatenaryOnBridge(ti); + if (HasRailCatenaryDrawn(GetRailType(rampsouth))) { + DrawRailCatenaryOnBridge(ti); } } @@ -1612,6 +1615,7 @@ static void GetTileDesc_TunnelBridge(TileIndex tile, TileDesc *td) if (tt == TRANSPORT_RAIL) { const RailtypeInfo *rti = GetRailTypeInfo(GetRailType(tile)); td->rail_speed = rti->max_speed; + td->railtype = rti->strings.name; if (!IsTunnel(tile)) { uint16 spd = GetBridgeSpec(GetBridgeType(tile))->speed; @@ -1884,11 +1888,11 @@ static CommandCost TerraformTile_TunnelBridge(TileIndex tile, DoCommandFlag flag /* Check if new slope is valid for bridges in general (so we can safely call GetBridgeFoundation()) */ if ((direction == DIAGDIR_NW) || (direction == DIAGDIR_NE)) { - CheckBridgeSlopeSouth(axis, &tileh_old, &z_old); - res = CheckBridgeSlopeSouth(axis, &tileh_new, &z_new); + CheckBridgeSlope(BRIDGE_PIECE_SOUTH, axis, &tileh_old, &z_old); + res = CheckBridgeSlope(BRIDGE_PIECE_SOUTH, axis, &tileh_new, &z_new); } else { - CheckBridgeSlopeNorth(axis, &tileh_old, &z_old); - res = CheckBridgeSlopeNorth(axis, &tileh_new, &z_new); + CheckBridgeSlope(BRIDGE_PIECE_NORTH, axis, &tileh_old, &z_old); + res = CheckBridgeSlope(BRIDGE_PIECE_NORTH, axis, &tileh_new, &z_new); } /* Surface slope is valid and remains unchanged? */ diff --git a/src/vehicle.cpp b/src/vehicle.cpp index a482520f25..9015396a8b 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -52,12 +52,36 @@ #include "gamelog.h" #include "linkgraph/linkgraph.h" #include "linkgraph/refresh.h" +#include "framerate_type.h" #include "table/strings.h" #include "safeguards.h" -#define GEN_HASH(x, y) ((GB((y), 6 + ZOOM_LVL_SHIFT, 6) << 6) + GB((x), 7 + ZOOM_LVL_SHIFT, 6)) +/* Number of bits in the hash to use from each vehicle coord */ +static const uint GEN_HASHX_BITS = 6; +static const uint GEN_HASHY_BITS = 6; + +/* Size of each hash bucket */ +static const uint GEN_HASHX_BUCKET_BITS = 7; +static const uint GEN_HASHY_BUCKET_BITS = 6; + +/* Compute hash for vehicle coord */ +#define GEN_HASHX(x) GB((x), GEN_HASHX_BUCKET_BITS + ZOOM_LVL_SHIFT, GEN_HASHX_BITS) +#define GEN_HASHY(y) (GB((y), GEN_HASHY_BUCKET_BITS + ZOOM_LVL_SHIFT, GEN_HASHY_BITS) << GEN_HASHX_BITS) +#define GEN_HASH(x, y) (GEN_HASHY(y) + GEN_HASHX(x)) + +/* Maximum size until hash repeats */ +static const int GEN_HASHX_SIZE = 1 << (GEN_HASHX_BUCKET_BITS + GEN_HASHX_BITS + ZOOM_LVL_SHIFT); +static const int GEN_HASHY_SIZE = 1 << (GEN_HASHY_BUCKET_BITS + GEN_HASHY_BITS + ZOOM_LVL_SHIFT); + +/* Increments to reach next bucket in hash table */ +static const int GEN_HASHX_INC = 1; +static const int GEN_HASHY_INC = 1 << GEN_HASHX_BITS; + +/* Mask to wrap-around buckets */ +static const uint GEN_HASHX_MASK = (1 << GEN_HASHX_BITS) - 1; +static const uint GEN_HASHY_MASK = ((1 << GEN_HASHY_BITS) - 1) << GEN_HASHX_BITS; VehicleID _new_vehicle_id; uint16 _returned_refit_capacity; ///< Stores the capacity after a refit operation. @@ -68,6 +92,47 @@ uint16 _returned_mail_refit_capacity; ///< Stores the mail capacity after a refi VehiclePool _vehicle_pool("Vehicle"); INSTANTIATE_POOL_METHODS(Vehicle) + +/** + * Determine shared bounds of all sprites. + * @param[out] bounds Shared bounds. + */ +void VehicleSpriteSeq::GetBounds(Rect *bounds) const +{ + bounds->left = bounds->top = bounds->right = bounds->bottom = 0; + for (uint i = 0; i < this->count; ++i) { + const Sprite *spr = GetSprite(this->seq[i].sprite, ST_NORMAL); + if (i == 0) { + bounds->left = spr->x_offs; + bounds->top = spr->y_offs; + bounds->right = spr->width + spr->x_offs - 1; + bounds->bottom = spr->height + spr->y_offs - 1; + } else { + if (spr->x_offs < bounds->left) bounds->left = spr->x_offs; + if (spr->y_offs < bounds->top) bounds->top = spr->y_offs; + int right = spr->width + spr->x_offs - 1; + int bottom = spr->height + spr->y_offs - 1; + if (right > bounds->right) bounds->right = right; + if (bottom > bounds->bottom) bounds->bottom = bottom; + } + } +} + +/** + * Draw the sprite sequence. + * @param x X position + * @param y Y position + * @param default_pal Vehicle palette + * @param force_pal Whether to ignore individual palettes, and draw everything with \a default_pal. + */ +void VehicleSpriteSeq::Draw(int x, int y, PaletteID default_pal, bool force_pal) const +{ + for (uint i = 0; i < this->count; ++i) { + PaletteID pal = force_pal || !this->seq[i].pal ? default_pal : this->seq[i].pal; + DrawSprite(this->seq[i].sprite, pal, x, y); + } +} + /** * Function to tell if a vehicle needs to be autorenewed * @param *c The vehicle owner @@ -155,7 +220,7 @@ bool Vehicle::NeedsServicing() const if (replace_when_old && !v->NeedsAutorenewing(c, false)) continue; /* Check refittability */ - uint32 available_cargo_types, union_mask; + CargoTypes available_cargo_types, union_mask; GetArticulatedRefitMasks(new_engine, true, &union_mask, &available_cargo_types); /* Is there anything to refit? */ if (union_mask != 0) { @@ -216,7 +281,7 @@ uint Vehicle::Crash(bool flooded) SetWindowDirty(WC_VEHICLE_DEPOT, this->tile); delete this->cargo_payment; - this->cargo_payment = NULL; + assert(this->cargo_payment == NULL); // cleared by ~CargoPayment return RandomRange(pass + 1); // Randomise deceased passengers. } @@ -577,7 +642,7 @@ static void UpdateVehicleTileHash(Vehicle *v, bool remove) v->hash_tile_current = new_hash; } -static Vehicle *_vehicle_viewport_hash[0x1000]; +static Vehicle *_vehicle_viewport_hash[1 << (GEN_HASHX_BITS + GEN_HASHY_BITS)]; static void UpdateVehicleViewportHash(Vehicle *v, int x, int y) { @@ -746,6 +811,7 @@ void Vehicle::PreDestructor() HideFillingPercent(&this->fill_percent_te_id); this->CancelReservation(INVALID_STATION, st); delete this->cargo_payment; + assert(this->cargo_payment == NULL); // cleared by ~CargoPayment } if (this->IsEngineCountable()) { @@ -880,8 +946,15 @@ void CallVehicleTicks() RunVehicleDayProc(); - Station *st; - FOR_ALL_STATIONS(st) LoadUnloadStation(st); + { + PerformanceMeasurer framerate(PFE_GL_ECONOMY); + Station *st; + FOR_ALL_STATIONS(st) LoadUnloadStation(st); + } + PerformanceAccumulator::Reset(PFE_GL_TRAINS); + PerformanceAccumulator::Reset(PFE_GL_ROADVEHS); + PerformanceAccumulator::Reset(PFE_GL_SHIPS); + PerformanceAccumulator::Reset(PFE_GL_AIRCRAFT); Vehicle *v; FOR_ALL_VEHICLES(v) { @@ -1007,7 +1080,6 @@ void CallVehicleTicks() */ static void DoDrawVehicle(const Vehicle *v) { - SpriteID image = v->cur_image; PaletteID pal = PAL_NONE; if (v->vehstatus & VS_DEFPAL) pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v); @@ -1022,8 +1094,14 @@ static void DoDrawVehicle(const Vehicle *v) if (to != TO_INVALID && (IsTransparencySet(to) || IsInvisibilitySet(to))) return; } - AddSortableSpriteToDraw(image, pal, v->x_pos + v->x_offs, v->y_pos + v->y_offs, - v->x_extent, v->y_extent, v->z_extent, v->z_pos, shadowed, v->x_bb_offs, v->y_bb_offs); + StartSpriteCombine(); + for (uint i = 0; i < v->sprite_seq.count; ++i) { + PaletteID pal2 = v->sprite_seq.seq[i].pal; + if (!pal2 || (v->vehstatus & VS_CRASHED)) pal2 = pal; + AddSortableSpriteToDraw(v->sprite_seq.seq[i].sprite, pal2, v->x_pos + v->x_offs, v->y_pos + v->y_offs, + v->x_extent, v->y_extent, v->z_extent, v->z_pos, shadowed, v->x_bb_offs, v->y_bb_offs); + } + EndSpriteCombine(); } /** @@ -1041,26 +1119,26 @@ void ViewportAddVehicles(DrawPixelInfo *dpi) /* The hash area to scan */ int xl, xu, yl, yu; - if (dpi->width + (70 * ZOOM_LVL_BASE) < (1 << (7 + 6 + ZOOM_LVL_SHIFT))) { - xl = GB(l - (70 * ZOOM_LVL_BASE), 7 + ZOOM_LVL_SHIFT, 6); - xu = GB(r, 7 + ZOOM_LVL_SHIFT, 6); + if (dpi->width + (MAX_VEHICLE_PIXEL_X * ZOOM_LVL_BASE) < GEN_HASHX_SIZE) { + xl = GEN_HASHX(l - MAX_VEHICLE_PIXEL_X * ZOOM_LVL_BASE); + xu = GEN_HASHX(r); } else { /* scan whole hash row */ xl = 0; - xu = 0x3F; + xu = GEN_HASHX_MASK; } - if (dpi->height + (70 * ZOOM_LVL_BASE) < (1 << (6 + 6 + ZOOM_LVL_SHIFT))) { - yl = GB(t - (70 * ZOOM_LVL_BASE), 6 + ZOOM_LVL_SHIFT, 6) << 6; - yu = GB(b, 6 + ZOOM_LVL_SHIFT, 6) << 6; + if (dpi->height + (MAX_VEHICLE_PIXEL_Y * ZOOM_LVL_BASE) < GEN_HASHY_SIZE) { + yl = GEN_HASHY(t - MAX_VEHICLE_PIXEL_Y * ZOOM_LVL_BASE); + yu = GEN_HASHY(b); } else { /* scan whole column */ yl = 0; - yu = 0x3F << 6; + yu = GEN_HASHY_MASK; } - for (int y = yl;; y = (y + (1 << 6)) & (0x3F << 6)) { - for (int x = xl;; x = (x + 1) & 0x3F) { + for (int y = yl;; y = (y + GEN_HASHY_INC) & GEN_HASHY_MASK) { + for (int x = xl;; x = (x + GEN_HASHX_INC) & GEN_HASHX_MASK) { const Vehicle *v = _vehicle_viewport_hash[x + y]; // already masked & 0xFFF while (v != NULL) { @@ -1222,7 +1300,7 @@ bool Vehicle::HandleBreakdown() SetWindowDirty(WC_VEHICLE_VIEW, this->index); SetWindowDirty(WC_VEHICLE_DETAILS, this->index); - /* FALL THROUGH */ + FALLTHROUGH; case 1: /* Aircraft breakdowns end only when arriving at the airport */ if (this->type == VEH_AIRCRAFT) return false; @@ -1486,20 +1564,19 @@ void Vehicle::UpdatePosition() */ void Vehicle::UpdateViewport(bool dirty) { - int img = this->cur_image; + Rect new_coord; + this->sprite_seq.GetBounds(&new_coord); + Point pt = RemapCoords(this->x_pos + this->x_offs, this->y_pos + this->y_offs, this->z_pos); - const Sprite *spr = GetSprite(img, ST_NORMAL); + new_coord.left += pt.x; + new_coord.top += pt.y; + new_coord.right += pt.x + 2 * ZOOM_LVL_BASE; + new_coord.bottom += pt.y + 2 * ZOOM_LVL_BASE; - pt.x += spr->x_offs; - pt.y += spr->y_offs; - - UpdateVehicleViewportHash(this, pt.x, pt.y); + UpdateVehicleViewportHash(this, new_coord.left, new_coord.top); Rect old_coord = this->coord; - this->coord.left = pt.x; - this->coord.top = pt.y; - this->coord.right = pt.x + spr->width + 2 * ZOOM_LVL_BASE; - this->coord.bottom = pt.y + spr->height + 2 * ZOOM_LVL_BASE; + this->coord = new_coord; if (dirty) { if (old_coord.left == INVALID_COORD) { @@ -2085,6 +2162,7 @@ void Vehicle::LeaveStation() assert(this->current_order.IsType(OT_LOADING)); delete this->cargo_payment; + assert(this->cargo_payment == NULL); // cleared by ~CargoPayment /* Only update the timetable if the vehicle was supposed to stop here. */ if (this->current_order.GetNonStopType() != ONSF_STOP_EVERYWHERE) UpdateVehicleTimetable(this, false); @@ -2113,6 +2191,7 @@ void Vehicle::LeaveStation() st->loading_vehicles.remove(this); HideFillingPercent(&this->fill_percent_te_id); + trip_occupancy = CalcPercentVehicleFilled(this, NULL); if (this->type == VEH_TRAIN && !(this->vehstatus & VS_CRASHED)) { /* Trigger station animation (trains only) */ @@ -2629,7 +2708,7 @@ void Vehicle::RemoveFromShared() if (this->orders.list->GetNumVehicles() == 1) { /* When there is only one vehicle, remove the shared order list window. */ DeleteWindowById(GetWindowClassForVehicleType(this->type), vli.Pack()); - InvalidateVehicleOrder(this->FirstShared(), 0); + InvalidateVehicleOrder(this->FirstShared(), VIWD_MODIFY_ORDERS); } else if (were_first) { /* If we were the first one, update to the new first one. * Note: FirstShared() is already the new first */ @@ -2780,7 +2859,7 @@ const uint16 &Vehicle::GetGroundVehicleFlags() const /** * Calculates the set of vehicles that will be affected by a given selection. - * @param set [inout] Set of affected vehicles. + * @param[in,out] set Set of affected vehicles. * @param v First vehicle of the selection. * @param num_vehicles Number of vehicles in the selection (not counting articulated parts). * @pre \a set must be empty. diff --git a/src/vehicle_base.h b/src/vehicle_base.h index 59584da788..b2a2a5d7a4 100644 --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -23,6 +23,7 @@ #include "transport_type.h" #include "group_type.h" #include "base_consist.h" +#include "network/network.h" #include #include @@ -125,6 +126,63 @@ struct VehicleCache { byte cached_vis_effect; ///< Visual effect to show (see #VisualEffect) }; +/** Sprite sequence for a vehicle part. */ +struct VehicleSpriteSeq { + PalSpriteID seq[4]; + uint count; + + bool operator==(const VehicleSpriteSeq &other) const + { + return this->count == other.count && MemCmpT(this->seq, other.seq, this->count) == 0; + } + + bool operator!=(const VehicleSpriteSeq &other) const + { + return !this->operator==(other); + } + + /** + * Check whether the sequence contains any sprites. + */ + bool IsValid() const + { + return this->count != 0; + } + + /** + * Clear all information. + */ + void Clear() + { + this->count = 0; + } + + /** + * Assign a single sprite to the sequence. + */ + void Set(SpriteID sprite) + { + this->count = 1; + this->seq[0].sprite = sprite; + this->seq[0].pal = 0; + } + + /** + * Copy data from another sprite sequence, while dropping all recolouring information. + */ + void CopyWithoutPalette(const VehicleSpriteSeq &src) + { + this->count = src.count; + for (uint i = 0; i < src.count; ++i) { + this->seq[i].sprite = src.seq[i].sprite; + this->seq[i].pal = 0; + } + } + + void GetBounds(Rect *bounds) const; + void Draw(int x, int y, PaletteID default_pal, bool force_pal) const; +}; + /** A vehicle pool for a little over 1 million vehicles. */ typedef Pool VehiclePool; extern VehiclePool _vehicle_pool; @@ -219,7 +277,7 @@ public: * 0xff == reserved for another custom sprite */ byte spritenum; - SpriteID cur_image; ///< sprite number for this vehicle + VehicleSpriteSeq sprite_seq; ///< Vehicle appearance. byte x_extent; ///< x-extent of vehicle bounding box byte y_extent; ///< y-extent of vehicle bounding box byte z_extent; ///< z-extent of vehicle bounding box @@ -250,6 +308,7 @@ public: uint16 refit_cap; ///< Capacity left over from before last refit. VehicleCargoList cargo; ///< The cargo this vehicle is carrying uint16 cargo_age_counter; ///< Ticks till cargo is aged next. + int8 trip_occupancy; ///< NOSAVE: Occupancy of vehicle of the current trip (updated after leaving a station). byte day_counter; ///< Increased by one for each day byte tick_counter; ///< Increased by one for each tick @@ -265,7 +324,7 @@ public: uint16 load_unload_ticks; ///< Ticks to wait before starting next cycle. GroupID group_id; ///< Index of group Pool array - byte subtype; ///< subtype (Filled with values from #EffectVehicles/#TrainSubTypes/#AircraftSubTypes) + byte subtype; ///< subtype (Filled with values from #AircraftSubType/#DisasterSubType/#EffectVehicleType/#GroundVehicleSubtypeFlags) NewGRFCache grf_cache; ///< Cache of often used calculated NewGRF values VehicleCache vcache; ///< Cache of often used vehicle values. @@ -307,9 +366,8 @@ public: /** * Updates the x and y offsets and the size of the sprite used * for this vehicle. - * @param direction the direction the vehicle is facing */ - virtual void UpdateDeltaXY(Direction direction) {} + virtual void UpdateDeltaXY() {} /** * Determines the effective direction-specific vehicle movement speed. @@ -379,9 +437,9 @@ public: /** * Gets the sprite to show for the given direction * @param direction the direction the vehicle is facing - * @return the sprite for the given vehicle in the given direction + * @param[out] result Vehicle sprite sequence. */ - virtual SpriteID GetImage(Direction direction, EngineImageType image_type) const { return 0; } + virtual void GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const { result->Clear(); } const GRFFile *GetGRF() const; uint32 GetGRFID() const; @@ -939,7 +997,10 @@ struct SpecializedVehicle : public Vehicle { /** * Set vehicle type correctly */ - inline SpecializedVehicle() : Vehicle(Type) { } + inline SpecializedVehicle() : Vehicle(Type) + { + this->sprite_seq.count = 1; + } /** * Get the first vehicle in the chain @@ -1072,12 +1133,18 @@ struct SpecializedVehicle : public Vehicle { */ inline void UpdateViewport(bool force_update, bool update_delta) { + /* Skip updating sprites on dedicated servers without screen */ + if (_network_dedicated) return; + /* Explicitly choose method to call to prevent vtable dereference - * it gives ~3% runtime improvements in games with many vehicles */ - if (update_delta) ((T *)this)->T::UpdateDeltaXY(this->direction); - SpriteID old_image = this->cur_image; - this->cur_image = ((T *)this)->T::GetImage(this->direction, EIT_ON_MAP); - if (force_update || this->cur_image != old_image) this->Vehicle::UpdateViewport(true); + if (update_delta) ((T *)this)->T::UpdateDeltaXY(); + VehicleSpriteSeq seq; + ((T *)this)->T::GetImage(this->direction, EIT_ON_MAP, &seq); + if (force_update || this->sprite_seq != seq) { + this->sprite_seq = seq; + this->Vehicle::UpdateViewport(true); + } } }; diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp index 3b664defb6..9231ad689d 100644 --- a/src/vehicle_cmd.cpp +++ b/src/vehicle_cmd.cpp @@ -206,7 +206,7 @@ CommandCost CmdSellVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 * @param engine_type Which engine to refit * @param new_cid Cargo type we are refitting to. * @param new_subtype New cargo subtype. - * @param [out] auto_refit_allowed The refit is allowed as an auto-refit. + * @param[out] auto_refit_allowed The refit is allowed as an auto-refit. * @return Price for refitting */ static int GetRefitCostFactor(const Vehicle *v, EngineID engine_type, CargoID new_cid, byte new_subtype, bool *auto_refit_allowed) @@ -238,7 +238,7 @@ static int GetRefitCostFactor(const Vehicle *v, EngineID engine_type, CargoID ne * @param engine_type Which engine to refit * @param new_cid Cargo type we are refitting to. * @param new_subtype New cargo subtype. - * @param [out] auto_refit_allowed The refit is allowed as an auto-refit. + * @param[out] auto_refit_allowed The refit is allowed as an auto-refit. * @return Price for refitting */ static CommandCost GetRefitCost(const Vehicle *v, EngineID engine_type, CargoID new_cid, byte new_subtype, bool *auto_refit_allowed) @@ -464,7 +464,7 @@ CommandCost CmdRefitVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1, uint byte new_subtype = GB(p2, 8, 8); if (new_cid >= NUM_CARGO) return CMD_ERROR; - /* For ships and aircrafts there is always only one. */ + /* For ships and aircraft there is always only one. */ bool only_this = HasBit(p2, 7) || front->type == VEH_SHIP || front->type == VEH_AIRCRAFT; uint8 num_vehicles = GB(p2, 16, 8); @@ -542,7 +542,8 @@ CommandCost CmdStartStopVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1, case VEH_AIRCRAFT: { Aircraft *a = Aircraft::From(v); /* cannot stop airplane when in flight, or when taking off / landing */ - if (!(v->vehstatus & VS_CRASHED) && a->state >= STARTTAKEOFF && a->state < TERM7) return_cmd_error(STR_ERROR_AIRCRAFT_IS_IN_FLIGHT); + if (a->state >= STARTTAKEOFF && a->state < TERM7) return_cmd_error(STR_ERROR_AIRCRAFT_IS_IN_FLIGHT); + if (HasBit(a->flags, VAF_HELI_DIRECT_DESCENT)) return_cmd_error(STR_ERROR_AIRCRAFT_IS_IN_FLIGHT); break; } @@ -606,7 +607,7 @@ CommandCost CmdMassStartStopVehicle(TileIndex tile, DoCommandFlag flags, uint32 bool vehicle_list_window = HasBit(p1, 1); VehicleListIdentifier vli; - if (!vli.Unpack(p2)) return CMD_ERROR; + if (!vli.UnpackIfValid(p2)) return CMD_ERROR; if (!IsCompanyBuildableVehicleType(vli.vtype)) return CMD_ERROR; if (vehicle_list_window) { @@ -1001,7 +1002,7 @@ CommandCost CmdSendVehicleToDepot(TileIndex tile, DoCommandFlag flags, uint32 p1 if (p1 & DEPOT_MASS_SEND) { /* Mass goto depot requested */ VehicleListIdentifier vli; - if (!vli.Unpack(p2)) return CMD_ERROR; + if (!vli.UnpackIfValid(p2)) return CMD_ERROR; return SendAllVehiclesToDepot(flags, (p1 & DEPOT_SERVICE) != 0, vli); } diff --git a/src/vehicle_func.h b/src/vehicle_func.h index 9eb6b91219..17ec9e28da 100644 --- a/src/vehicle_func.h +++ b/src/vehicle_func.h @@ -31,7 +31,7 @@ static const Money VEHICLE_PROFIT_THRESHOLD = 10000; ///< Threshold for a /** * Helper to check whether an image index is valid for a particular 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. */ diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 10f1d952da..4926f7a4fc 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -416,7 +416,7 @@ struct RefitWindow : public Window { do { if (v->type == VEH_TRAIN && !vehicles_to_refit.Contains(v->index)) continue; const Engine *e = v->GetEngine(); - uint32 cmask = e->info.refit_mask; + CargoTypes cmask = e->info.refit_mask; byte callback_mask = e->info.callback_mask; /* Skip this engine if it does not carry anything */ @@ -681,7 +681,7 @@ struct RefitWindow : public Window { /** * Gets the #StringID to use for displaying capacity. - * @param Cargo and cargo subtype to check for capacity. + * @param option Cargo and cargo subtype to check for capacity. * @return INVALID_STRING_ID if there is no capacity. StringID to use in any other case. * @post String parameters have been set. */ @@ -817,7 +817,7 @@ struct RefitWindow : public Window { Vehicle *v = Vehicle::Get(this->window_number); this->selected_vehicle = v->index; this->num_vehicles = UINT8_MAX; - /* FALL THROUGH */ + FALLTHROUGH; } case 2: { // The vehicle selection has changed; rebuild the entire list. @@ -843,7 +843,7 @@ struct RefitWindow : public Window { this->information_width = max_width; this->ReInit(); } - /* FALL THROUGH */ + FALLTHROUGH; } case 1: // A new cargo has been selected. @@ -905,7 +905,7 @@ struct RefitWindow : public Window { if (_ctrl_pressed) this->num_vehicles = UINT8_MAX; break; } - /* FALL THROUGH */ + FALLTHROUGH; } default: @@ -940,7 +940,7 @@ struct RefitWindow : public Window { this->InvalidateData(1); if (click_count == 1) break; - /* FALL THROUGH */ + FALLTHROUGH; } case WID_VR_REFIT: // refit button @@ -1043,9 +1043,9 @@ void ShowVehicleRefitWindow(const Vehicle *v, VehicleOrderID order, Window *pare uint ShowRefitOptionsList(int left, int right, int y, EngineID engine) { /* List of cargo types of this engine */ - uint32 cmask = GetUnionOfArticulatedRefitMasks(engine, false); + CargoTypes cmask = GetUnionOfArticulatedRefitMasks(engine, false); /* List of cargo types available in this climate */ - uint32 lmask = _cargo_mask; + CargoTypes lmask = _cargo_mask; /* Draw nothing if the engine is not refittable */ if (HasAtMostOneBit(cmask)) return y; @@ -1638,7 +1638,7 @@ public: break; case WID_VL_MANAGE_VEHICLES_DROPDOWN: { - DropDownList *list = this->BuildActionDropdownList(VehicleListIdentifier(this->window_number).type == VL_STANDARD, false); + DropDownList *list = this->BuildActionDropdownList(VehicleListIdentifier::UnPack(this->window_number).type == VL_STANDARD, false); ShowDropDownList(this, list, 0, WID_VL_MANAGE_VEHICLES_DROPDOWN); break; } @@ -1830,7 +1830,7 @@ static const NWidgetPart _nested_train_vehicle_details_widgets[] = { NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_VD_DECREASE_SERVICING_INTERVAL), SetFill(0, 1), SetDataTip(AWV_DECREASE, STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_VD_INCREASE_SERVICING_INTERVAL), SetFill(0, 1), - SetDataTip(AWV_INCREASE, STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP), + SetDataTip(AWV_INCREASE, STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP), NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_VD_SERVICE_INTERVAL_DROPDOWN), SetFill(0, 1), SetDataTip(STR_EMPTY, STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP), NWidget(WWT_PANEL, COLOUR_GREY, WID_VD_SERVICING_INTERVAL), SetFill(1, 1), SetResize(1, 0), EndContainer(), @@ -2069,9 +2069,14 @@ struct VehicleDetailsWindow : Window { } } else { SetDParam(0, v->GetDisplayMaxSpeed()); - if (v->type == VEH_AIRCRAFT && Aircraft::From(v)->GetRange() > 0) { - SetDParam(1, Aircraft::From(v)->GetRange()); - string = STR_VEHICLE_INFO_MAX_SPEED_RANGE; + if (v->type == VEH_AIRCRAFT) { + SetDParam(1, v->GetEngine()->GetAircraftTypeText()); + if (Aircraft::From(v)->GetRange() > 0) { + SetDParam(2, Aircraft::From(v)->GetRange()); + string = STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE; + } else { + string = STR_VEHICLE_INFO_MAX_SPEED_TYPE; + } } else { string = STR_VEHICLE_INFO_MAX_SPEED; } @@ -2100,9 +2105,7 @@ struct VehicleDetailsWindow : Window { case WID_VD_MIDDLE_DETAILS: { /* For other vehicles, at the place of the matrix. */ bool rtl = _current_text_dir == TD_RTL; - uint sprite_width = UnScaleGUI( - max(GetSprite(v->GetImage(rtl ? DIR_E : DIR_W, EIT_IN_DETAILS), ST_NORMAL)->width, 70U)) + - WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; + uint sprite_width = GetSingleVehicleWidth(v, EIT_IN_DETAILS) + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; uint text_left = r.left + (rtl ? 0 : sprite_width); uint text_right = r.right - (rtl ? sprite_width : 0); @@ -2278,22 +2281,22 @@ static const NWidgetPart _nested_vehicle_view_widgets[] = { EndContainer(), EndContainer(), NWidget(NWID_VERTICAL), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_CENTER_MAIN_VIEW), SetMinimalSize(18, 18), SetFill(1, 1), SetDataTip(SPR_CENTRE_VIEW_VEHICLE, 0x0 /* filled later */), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_CENTER_MAIN_VIEW), SetMinimalSize(18, 18), SetDataTip(SPR_CENTRE_VIEW_VEHICLE, 0x0 /* filled later */), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_VV_SELECT_DEPOT_CLONE), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_GOTO_DEPOT), SetMinimalSize(18, 18), SetFill(1, 1), SetDataTip(0x0 /* filled later */, 0x0 /* filled later */), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_CLONE), SetMinimalSize(18, 18), SetFill(1, 1), SetDataTip(0x0 /* filled later */, 0x0 /* filled later */), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_GOTO_DEPOT), SetMinimalSize(18, 18), SetDataTip(0x0 /* filled later */, 0x0 /* filled later */), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_CLONE), SetMinimalSize(18, 18), SetDataTip(0x0 /* filled later */, 0x0 /* filled later */), EndContainer(), /* For trains only, 'ignore signal' button. */ - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_FORCE_PROCEED), SetMinimalSize(18, 18), SetFill(1, 1), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_FORCE_PROCEED), SetMinimalSize(18, 18), SetDataTip(SPR_IGNORE_SIGNALS, STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_VV_SELECT_REFIT_TURN), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_REFIT), SetMinimalSize(18, 18), SetFill(1, 1), SetDataTip(SPR_REFIT_VEHICLE, 0x0 /* filled later */), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_TURN_AROUND), SetMinimalSize(18, 18), SetFill(1, 1), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_REFIT), SetMinimalSize(18, 18), SetDataTip(SPR_REFIT_VEHICLE, 0x0 /* filled later */), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_TURN_AROUND), SetMinimalSize(18, 18), SetDataTip(SPR_FORCE_VEHICLE_TURN, STR_VEHICLE_VIEW_ROAD_VEHICLE_REVERSE_TOOLTIP), EndContainer(), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_SHOW_ORDERS), SetFill(1, 1), SetMinimalSize(18, 18), SetDataTip(SPR_SHOW_ORDERS, 0x0 /* filled later */), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_SHOW_DETAILS), SetFill(1, 1), SetMinimalSize(18, 18), SetDataTip(SPR_SHOW_VEHICLE_DETAILS, 0x0 /* filled later */), - NWidget(WWT_PANEL, COLOUR_GREY), SetFill(1, 1), SetMinimalSize(18, 0), SetResize(0, 1), EndContainer(), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_SHOW_ORDERS), SetMinimalSize(18, 18), SetDataTip(SPR_SHOW_ORDERS, 0x0 /* filled later */), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_SHOW_DETAILS), SetMinimalSize(18, 18), SetDataTip(SPR_SHOW_VEHICLE_DETAILS, 0x0 /* filled later */), + NWidget(WWT_PANEL, COLOUR_GREY), SetMinimalSize(18, 0), SetResize(0, 1), EndContainer(), EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL), @@ -2367,13 +2370,13 @@ static const uint32 _vehicle_command_translation_table[][4] = { CMD_REVERSE_TRAIN_DIRECTION | CMD_MSG(STR_ERROR_CAN_T_REVERSE_DIRECTION_TRAIN), CMD_TURN_ROADVEH | CMD_MSG(STR_ERROR_CAN_T_MAKE_ROAD_VEHICLE_TURN), 0xffffffff, // invalid for ships - 0xffffffff // invalid for aircrafts + 0xffffffff // invalid for aircraft }, }; /** - * This is the Callback method after the cloning attempt of a vehicle - * @param result the result of the cloning command + * This is the Callback method after attempting to start/stop a vehicle + * @param result the result of the start/stop command * @param tile unused * @param p1 vehicle ID * @param p2 unused @@ -2453,6 +2456,7 @@ private: public: VehicleViewWindow(WindowDesc *desc, WindowNumber window_number) : Window(desc) { + this->flags |= WF_DISABLE_VP_SCROLL; this->CreateNestedTree(); /* Sprites for the 'send to depot' button indexed by vehicle type. */ @@ -2634,8 +2638,7 @@ public: str = STR_VEHICLE_STATUS_LEAVING; break; } - /* FALL THROUGH, if aircraft. Does this even happen? */ - + FALLTHROUGH; default: if (v->GetNumManualOrders() == 0) { str = STR_VEHICLE_STATUS_NO_ORDERS_VEL; @@ -2828,36 +2831,85 @@ void CcBuildPrimaryVehicle(const CommandCost &result, TileIndex tile, uint32 p1, ShowVehicleViewWindow(v); } +/** + * Get the width of a vehicle (part) in pixels. + * @param v Vehicle to get the width for. + * @return Width of the vehicle. + */ +int GetSingleVehicleWidth(const Vehicle *v, EngineImageType image_type) +{ + switch (v->type) { + case VEH_TRAIN: + return Train::From(v)->GetDisplayImageWidth(); + + case VEH_ROAD: + return RoadVehicle::From(v)->GetDisplayImageWidth(); + + default: + bool rtl = _current_text_dir == TD_RTL; + VehicleSpriteSeq seq; + v->GetImage(rtl ? DIR_E : DIR_W, image_type, &seq); + Rect rec; + seq.GetBounds(&rec); + return UnScaleGUI(rec.right - rec.left + 1); + } +} + /** * Get the width of a vehicle (including all parts of the consist) in pixels. * @param v Vehicle to get the width for. * @return Width of the vehicle. */ -int GetVehicleWidth(Vehicle *v, EngineImageType image_type) +int GetVehicleWidth(const Vehicle *v, EngineImageType image_type) { - int vehicle_width = 0; + if (v->type == VEH_TRAIN || v->type == VEH_ROAD) { + int vehicle_width = 0; + for (const Vehicle *u = v; u != NULL; u = u->Next()) { + vehicle_width += GetSingleVehicleWidth(u, image_type); + } + return vehicle_width; + } else { + return GetSingleVehicleWidth(v, image_type); + } +} - switch (v->type) { - case VEH_TRAIN: - for (const Train *u = Train::From(v); u != NULL; u = u->Next()) { - vehicle_width += u->GetDisplayImageWidth(); - } - break; +/** + * Set the mouse cursor to look like a vehicle. + * @param v Vehicle + * @param image_type Type of vehicle image to use. + */ +void SetMouseCursorVehicle(const Vehicle *v, EngineImageType image_type) +{ + bool rtl = _current_text_dir == TD_RTL; - case VEH_ROAD: - for (const RoadVehicle *u = RoadVehicle::From(v); u != NULL; u = u->Next()) { - vehicle_width += u->GetDisplayImageWidth(); - } - break; + _cursor.sprite_count = 0; + int total_width = 0; + for (; v != NULL; v = v->HasArticulatedPart() ? v->GetNextArticulatedPart() : NULL) { + if (total_width >= 2 * (int)VEHICLEINFO_FULL_VEHICLE_WIDTH) break; - default: - bool rtl = _current_text_dir == TD_RTL; - SpriteID sprite = v->GetImage(rtl ? DIR_E : DIR_W, image_type); - const Sprite *real_sprite = GetSprite(sprite, ST_NORMAL); - vehicle_width = UnScaleGUI(real_sprite->width); + PaletteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v); + VehicleSpriteSeq seq; + v->GetImage(rtl ? DIR_E : DIR_W, image_type, &seq); - break; + if (_cursor.sprite_count + seq.count > lengthof(_cursor.sprite_seq)) break; + + for (uint i = 0; i < seq.count; ++i) { + PaletteID pal2 = (v->vehstatus & VS_CRASHED) || !seq.seq[i].pal ? pal : seq.seq[i].pal; + _cursor.sprite_seq[_cursor.sprite_count].sprite = seq.seq[i].sprite; + _cursor.sprite_seq[_cursor.sprite_count].pal = pal2; + _cursor.sprite_pos[_cursor.sprite_count].x = rtl ? -total_width : total_width; + _cursor.sprite_pos[_cursor.sprite_count].y = 0; + _cursor.sprite_count++; + } + + total_width += GetSingleVehicleWidth(v, image_type); } - return vehicle_width; + int offs = ((int)VEHICLEINFO_FULL_VEHICLE_WIDTH - total_width) / 2; + if (rtl) offs = -offs; + for (uint i = 0; i < _cursor.sprite_count; ++i) { + _cursor.sprite_pos[i].x += offs; + } + + UpdateCursorSize(); } diff --git a/src/vehicle_gui.h b/src/vehicle_gui.h index 83e098dcd9..92975425df 100644 --- a/src/vehicle_gui.h +++ b/src/vehicle_gui.h @@ -64,7 +64,8 @@ static inline uint GetVehicleHeight(VehicleType type) return (type == VEH_TRAIN || type == VEH_ROAD) ? 14 : 24; } -int GetVehicleWidth(Vehicle *v, EngineImageType image_type); +int GetSingleVehicleWidth(const Vehicle *v, EngineImageType image_type); +int GetVehicleWidth(const Vehicle *v, EngineImageType image_type); /** Dimensions of a cell in the purchase/depot windows. */ struct VehicleCellSize { @@ -100,5 +101,6 @@ void StartStopVehicle(const Vehicle *v, bool texteffect); Vehicle *CheckClickOnVehicle(const struct ViewPort *vp, int x, int y); void DrawVehicleImage(const Vehicle *v, int left, int right, int y, VehicleID selection, EngineImageType image_type, int skip); +void SetMouseCursorVehicle(const Vehicle *v, EngineImageType image_type); #endif /* VEHICLE_GUI_H */ diff --git a/src/vehicle_gui_base.h b/src/vehicle_gui_base.h index 1c03f7b34d..5755c7fa88 100644 --- a/src/vehicle_gui_base.h +++ b/src/vehicle_gui_base.h @@ -38,7 +38,7 @@ struct BaseVehicleListWindow : public Window { static const StringID vehicle_sorter_names[]; static GUIVehicleList::SortFunction * const vehicle_sorter_funcs[]; - BaseVehicleListWindow(WindowDesc *desc, WindowNumber wno) : Window(desc), vli(wno) + BaseVehicleListWindow(WindowDesc *desc, WindowNumber wno) : Window(desc), vli(VehicleListIdentifier::UnPack(wno)) { this->vehicles.SetSortFuncs(this->vehicle_sorter_funcs); } diff --git a/src/vehicle_type.h b/src/vehicle_type.h index 0921b39e36..f3e7d535fd 100644 --- a/src/vehicle_type.h +++ b/src/vehicle_type.h @@ -17,6 +17,8 @@ /** The type all our vehicle IDs have. */ typedef uint32 VehicleID; +static const int GROUND_ACCELERATION = 9800; ///< Acceleration due to gravity, 9.8 m/s^2 + /** Available vehicle types. */ enum VehicleType { VEH_BEGIN, diff --git a/src/vehiclelist.cpp b/src/vehiclelist.cpp index 7e42b25aa2..bfe4e5ffd1 100644 --- a/src/vehiclelist.cpp +++ b/src/vehiclelist.cpp @@ -37,7 +37,7 @@ uint32 VehicleListIdentifier::Pack() const * @param data The data to unpack. * @return true iff the data was valid (enough). */ -bool VehicleListIdentifier::Unpack(uint32 data) +bool VehicleListIdentifier::UnpackIfValid(uint32 data) { byte c = GB(data, 28, 4); this->company = c == 0xF ? OWNER_NONE : (CompanyID)c; @@ -52,10 +52,12 @@ bool VehicleListIdentifier::Unpack(uint32 data) * Decode a packed vehicle list identifier into a new one. * @param data The data to unpack. */ -VehicleListIdentifier::VehicleListIdentifier(uint32 data) +/* static */ VehicleListIdentifier VehicleListIdentifier::UnPack(uint32 data) { - bool ret = this->Unpack(data); + VehicleListIdentifier result; + bool ret = result.UnpackIfValid(data); assert(ret); + return result; } /** @@ -154,7 +156,7 @@ bool GenerateVehicleSortList(VehicleList *list, const VehicleListIdentifier &vli } break; } - /* FALL THROUGH */ + FALLTHROUGH; case VL_STANDARD: FOR_ALL_VEHICLES(v) { diff --git a/src/vehiclelist.h b/src/vehiclelist.h index c96fb692ae..996c8c007f 100644 --- a/src/vehiclelist.h +++ b/src/vehiclelist.h @@ -35,7 +35,8 @@ struct VehicleListIdentifier { uint32 index; ///< A vehicle list type specific index. uint32 Pack() const; - bool Unpack(uint32 data); + bool UnpackIfValid(uint32 data); + static VehicleListIdentifier UnPack(uint32 data); /** * Create a simple vehicle list. @@ -47,7 +48,7 @@ struct VehicleListIdentifier { VehicleListIdentifier(VehicleListType type, VehicleType vtype, CompanyID company, uint index = 0) : type(type), vtype(vtype), company(company), index(index) {} - VehicleListIdentifier(uint32 data = 0); + VehicleListIdentifier() : type(), vtype(), company(), index() {} }; /** A list of vehicles. */ diff --git a/src/video/allegro_v.cpp b/src/video/allegro_v.cpp index 01628f99cd..960d7fb7c8 100644 --- a/src/video/allegro_v.cpp +++ b/src/video/allegro_v.cpp @@ -24,6 +24,7 @@ #include "../network/network.h" #include "../core/random_func.hpp" #include "../core/math_func.hpp" +#include "../framerate_type.h" #include "allegro_v.h" #include @@ -56,6 +57,8 @@ void VideoDriver_Allegro::MakeDirty(int left, int top, int width, int height) static void DrawSurfaceToScreen() { + PerformanceMeasurer framerate(PFE_VIDEO); + int n = _num_dirty_rects; if (n == 0) return; @@ -458,7 +461,7 @@ void VideoDriver_Allegro::Stop() if (--_allegro_instance_count == 0) allegro_exit(); } -#if defined(UNIX) || defined(__OS2__) || defined(PSP) || defined(DOS) +#if defined(UNIX) || defined(__OS2__) || defined(DOS) # include /* gettimeofday */ static uint32 GetTime() diff --git a/src/video/cocoa/cocoa_v.h b/src/video/cocoa/cocoa_v.h index 86085da62e..564daefe0f 100644 --- a/src/video/cocoa/cocoa_v.h +++ b/src/video/cocoa/cocoa_v.h @@ -259,7 +259,11 @@ uint QZ_ListModes(OTTD_Point *modes, uint max_modes, CGDirectDisplayID display_i @end /** Delegate for our NSWindow to send ask for quit on close */ -@interface OTTD_CocoaWindowDelegate : NSObject { +@interface OTTD_CocoaWindowDelegate : NSObject +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 + +#endif +{ CocoaSubdriver *driver; } diff --git a/src/video/cocoa/cocoa_v.mm b/src/video/cocoa/cocoa_v.mm index 4df7cb0035..d165610245 100644 --- a/src/video/cocoa/cocoa_v.mm +++ b/src/video/cocoa/cocoa_v.mm @@ -48,6 +48,9 @@ @interface OTTDMain : NSObject +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 + +#endif @end @@ -211,9 +214,14 @@ static void setupApplication() } #endif + /* Disable the system-wide tab feature as we only have one window. */ + if ([ NSWindow respondsToSelector:@selector(setAllowsAutomaticWindowTabbing:) ]) { + /* We use nil instead of NO as withObject requires an id. */ + [ NSWindow performSelector:@selector(setAllowsAutomaticWindowTabbing:) withObject:nil]; + } + /* Become the front process, important when start from the command line. */ - OSErr err = SetFrontProcess(&psn); - if (err != 0) DEBUG(driver, 0, "Could not bring the application to front. Error %d", (int)err); + [ [ NSApplication sharedApplication ] activateIgnoringOtherApps:YES ]; /* Set up the menubar */ [ NSApp setMainMenu:[ [ NSMenu alloc ] init ] ]; @@ -235,22 +243,39 @@ static int CDECL ModeSorter(const OTTD_Point *p1, const OTTD_Point *p2) return 0; } -uint QZ_ListModes(OTTD_Point *modes, uint max_modes, CGDirectDisplayID display_id, int device_depth) +static void QZ_GetDisplayModeInfo(CFArrayRef modes, CFIndex i, int &bpp, uint16 &width, uint16 &height) { - CFArrayRef mode_list = CGDisplayAvailableModes(display_id); - CFIndex num_modes = CFArrayGetCount(mode_list); + bpp = 0; + width = 0; + height = 0; - /* Build list of modes with the requested bpp */ - uint count = 0; - for (CFIndex i = 0; i < num_modes && count < max_modes; i++) { - int intvalue, bpp; - uint16 width, height; +#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6) + if (MacOSVersionIsAtLeast(10, 6, 0)) { + CGDisplayModeRef mode = (CGDisplayModeRef)CFArrayGetValueAtIndex(modes, i); - CFDictionaryRef onemode = (const __CFDictionary*)CFArrayGetValueAtIndex(mode_list, i); + width = (uint16)CGDisplayModeGetWidth(mode); + height = (uint16)CGDisplayModeGetHeight(mode); + +#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_11) + /* Extract bit depth from mode string. */ + CFStringRef pixEnc = CGDisplayModeCopyPixelEncoding(mode); + if (CFStringCompare(pixEnc, CFSTR(IO32BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) bpp = 32; + if (CFStringCompare(pixEnc, CFSTR(IO16BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) bpp = 16; + if (CFStringCompare(pixEnc, CFSTR(IO8BitIndexedPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) bpp = 8; + CFRelease(pixEnc); +#else + /* CGDisplayModeCopyPixelEncoding is deprecated on OSX 10.11+, but there are no 8 bpp modes anyway... */ + bpp = 32; +#endif + } else +#endif + { + int intvalue; + + CFDictionaryRef onemode = (const __CFDictionary*)CFArrayGetValueAtIndex(modes, i); CFNumberRef number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayBitsPerPixel); - CFNumberGetValue(number, kCFNumberSInt32Type, &bpp); - - if (bpp != device_depth) continue; + CFNumberGetValue(number, kCFNumberSInt32Type, &intvalue); + bpp = intvalue; number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayWidth); CFNumberGetValue(number, kCFNumberSInt32Type, &intvalue); @@ -259,6 +284,29 @@ uint QZ_ListModes(OTTD_Point *modes, uint max_modes, CGDirectDisplayID display_i number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayHeight); CFNumberGetValue(number, kCFNumberSInt32Type, &intvalue); height = (uint16)intvalue; + } +} + +uint QZ_ListModes(OTTD_Point *modes, uint max_modes, CGDirectDisplayID display_id, int device_depth) +{ +#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6) && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6) + CFArrayRef mode_list = MacOSVersionIsAtLeast(10, 6, 0) ? CGDisplayCopyAllDisplayModes(display_id, NULL) : CGDisplayAvailableModes(display_id); +#elif (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6) + CFArrayRef mode_list = CGDisplayCopyAllDisplayModes(display_id, NULL); +#else + CFArrayRef mode_list = CGDisplayAvailableModes(display_id); +#endif + CFIndex num_modes = CFArrayGetCount(mode_list); + + /* Build list of modes with the requested bpp */ + uint count = 0; + for (CFIndex i = 0; i < num_modes && count < max_modes; i++) { + int bpp; + uint16 width, height; + + QZ_GetDisplayModeInfo(mode_list, i, bpp, width, height); + + if (bpp != device_depth) continue; /* Check if mode is already in the list */ bool hasMode = false; @@ -280,6 +328,10 @@ uint QZ_ListModes(OTTD_Point *modes, uint max_modes, CGDirectDisplayID display_i /* Sort list smallest to largest */ QSortT(modes, count, &ModeSorter); +#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6) + if (MacOSVersionIsAtLeast(10, 6, 0)) CFRelease(mode_list); +#endif + return count; } @@ -575,9 +627,12 @@ void VideoDriver_Cocoa::EditBoxLostFocus() if (_cocoa_subdriver != NULL) { if ([ _cocoa_subdriver->cocoaview respondsToSelector:@selector(inputContext) ] && [ [ _cocoa_subdriver->cocoaview performSelector:@selector(inputContext) ] respondsToSelector:@selector(discardMarkedText) ]) { [ [ _cocoa_subdriver->cocoaview performSelector:@selector(inputContext) ] performSelector:@selector(discardMarkedText) ]; - } else { + } +#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6) + else { [ [ NSInputManager currentInputManager ] markedTextAbandoned:_cocoa_subdriver->cocoaview ]; } +#endif } /* Clear any marked string from the current edit box. */ HandleTextInput(NULL, true); @@ -604,7 +659,22 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel return; } - NSRunAlertPanel([ NSString stringWithUTF8String:title ], [ NSString stringWithUTF8String:message ], [ NSString stringWithUTF8String:buttonLabel ], nil, nil); +#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3) + if (MacOSVersionIsAtLeast(10, 3, 0)) { + NSAlert *alert = [ [ NSAlert alloc ] init ]; + [ alert setAlertStyle: NSCriticalAlertStyle ]; + [ alert setMessageText:[ NSString stringWithUTF8String:title ] ]; + [ alert setInformativeText:[ NSString stringWithUTF8String:message ] ]; + [ alert addButtonWithTitle: [ NSString stringWithUTF8String:buttonLabel ] ]; + [ alert runModal ]; + [ alert release ]; + } else +#endif + { +#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_3) + NSRunAlertPanel([ NSString stringWithUTF8String:title ], [ NSString stringWithUTF8String:message ], [ NSString stringWithUTF8String:buttonLabel ], nil, nil); +#endif + } if (!wasstarted && VideoDriver::GetInstance() != NULL) VideoDriver::GetInstance()->Stop(); @@ -1032,7 +1102,17 @@ static const char *Utf8AdvanceByUtf16Units(const char *str, NSUInteger count) { if (!EditBoxInGlobalFocus()) return NSNotFound; - NSPoint view_pt = [ self convertPoint:[ [ self window ] convertScreenToBase:thePoint ] fromView:nil ]; + NSPoint view_pt = NSZeroPoint; +#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7) + if ([ [ self window ] respondsToSelector:@selector(convertRectFromScreen:) ]) { + view_pt = [ self convertRect:[ [ self window ] convertRectFromScreen:NSMakeRect(thePoint.x, thePoint.y, 0, 0) ] fromView:nil ].origin; + } else +#endif + { +#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_7) + view_pt = [ self convertPoint:[ [ self window ] convertScreenToBase:thePoint ] fromView:nil ]; +#endif + } Point pt = { (int)view_pt.x, (int)[ self frame ].size.height - (int)view_pt.y }; @@ -1061,9 +1141,13 @@ static const char *Utf8AdvanceByUtf16Units(const char *str, NSUInteger count) } #endif +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_7 NSRect window_rect = [ self convertRect:view_rect toView:nil ]; NSPoint origin = [ [ self window ] convertBaseToScreen:window_rect.origin ]; return NSMakeRect(origin.x, origin.y, window_rect.size.width, window_rect.size.height); +#else + return NSMakeRect(0, 0, 0, 0);; +#endif } /** Get the bounding rect for the given range. */ @@ -1271,7 +1355,12 @@ static const char *Utf8AdvanceByUtf16Units(const char *str, NSUInteger count) NSPoint loc = [ driver->cocoaview convertPoint:[ [ aNotification object ] mouseLocationOutsideOfEventStream ] fromView:nil ]; BOOL inside = ([ driver->cocoaview hitTest:loc ] == driver->cocoaview); - if (inside) [ driver->cocoaview mouseEntered:NULL ]; + if (inside) { + /* We don't care about the event, but the compiler does. */ + NSEvent *e = [ [ NSEvent alloc ] init ]; + [ driver->cocoaview mouseEntered:e ]; + [ e release ]; + } } @end diff --git a/src/video/cocoa/event.mm b/src/video/cocoa/event.mm index c8d10717e3..30b6563b68 100644 --- a/src/video/cocoa/event.mm +++ b/src/video/cocoa/event.mm @@ -100,10 +100,10 @@ static void QZ_WarpCursor(int x, int y) NSPoint p = NSMakePoint(x, y); CGPoint cgp = _cocoa_subdriver->PrivateLocalToCG(&p); - /* this is the magic call that fixes cursor "freezing" after warp */ - CGSetLocalEventsSuppressionInterval(0.0); /* Do the actual warp */ CGWarpMouseCursorPosition(cgp); + /* this is the magic call that fixes cursor "freezing" after warp */ + CGAssociateMouseAndMouseCursorPosition(true); } @@ -587,12 +587,12 @@ static bool QZ_PollEvent() while (_current_magnification >= 1.0f) { _current_magnification -= 1.0f; - _cursor.wheel++; + _cursor.wheel--; HandleMouseEvents(); } while (_current_magnification <= -1.0f) { _current_magnification += 1.0f; - _cursor.wheel--; + _cursor.wheel++; HandleMouseEvents(); } break; @@ -610,7 +610,7 @@ static bool QZ_PollEvent() * the mouse position programmatically, which would trigger OS X to show * the default arrow cursor if the events are propagated. */ if (_cursor.fix_at) break; - /* FALL THROUGH */ + FALLTHROUGH; default: [ NSApp sendEvent:event ]; diff --git a/src/video/cocoa/wnd_quartz.mm b/src/video/cocoa/wnd_quartz.mm index c93a1f6fb3..4245a3c183 100644 --- a/src/video/cocoa/wnd_quartz.mm +++ b/src/video/cocoa/wnd_quartz.mm @@ -33,6 +33,7 @@ #include "cocoa_v.h" #include "../../core/math_func.hpp" #include "../../gfx_func.h" +#include "../../framerate_type.h" /* On some old versions of MAC OS this may not be defined. * Those versions generally only produce code for PPC. So it should be safe to @@ -110,15 +111,23 @@ static CGColorSpaceRef QZ_GetCorrectColorSpace() static CGColorSpaceRef colorSpace = NULL; if (colorSpace == NULL) { - CMProfileRef sysProfile; - - if (CMGetSystemProfile(&sysProfile) == noErr) { - colorSpace = CGColorSpaceCreateWithPlatformColorSpace(sysProfile); - CMCloseProfile(sysProfile); - } else { - colorSpace = CGColorSpaceCreateDeviceRGB(); +#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) + if (MacOSVersionIsAtLeast(10, 5, 0)) { + colorSpace = CGDisplayCopyColorSpace(CGMainDisplayID()); + } else +#endif + { +#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) && !defined(HAVE_OSX_1011_SDK) + CMProfileRef sysProfile; + if (CMGetSystemProfile(&sysProfile) == noErr) { + colorSpace = CGColorSpaceCreateWithPlatformColorSpace(sysProfile); + CMCloseProfile(sysProfile); + } +#endif } + if (colorSpace == NULL) colorSpace = CGColorSpaceCreateDeviceRGB(); + if (colorSpace == NULL) error("Could not get system colour space. You might need to recalibrate your monitor."); } @@ -325,7 +334,9 @@ bool WindowQuartzSubdriver::SetVideoMode(int width, int height, int bpp) [ this->window setAcceptsMouseMovedEvents:YES ]; [ this->window setViewsNeedDisplay:NO ]; - [ this->window useOptimizedDrawing:YES ]; +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_10 + if ([ this->window respondsToSelector:@selector(useOptimizedDrawing:) ]) [ this->window useOptimizedDrawing:YES ]; +#endif delegate = [ [ OTTD_CocoaWindowDelegate alloc ] init ]; [ delegate setDriver:this ]; @@ -421,6 +432,8 @@ WindowQuartzSubdriver::~WindowQuartzSubdriver() void WindowQuartzSubdriver::Draw(bool force_update) { + PerformanceMeasurer framerate(PFE_VIDEO); + /* Check if we need to do anything */ if (this->num_dirty_rects == 0 || [ this->window isMiniaturized ]) return; @@ -509,7 +522,16 @@ CGPoint WindowQuartzSubdriver::PrivateLocalToCG(NSPoint *p) p->y = this->window_height - p->y; *p = [ this->cocoaview convertPoint:*p toView:nil ]; - *p = [ this->window convertBaseToScreen:*p ]; +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 + if ([ this->window respondsToSelector:@selector(convertRectToScreen:) ]) { + *p = [ this->window convertRectToScreen:NSMakeRect(p->x, p->y, 0, 0) ].origin; + } else +#endif + { +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_7 + *p = [ this->window convertBaseToScreen:*p ]; +#endif + } p->y = this->device_height - p->y; CGPoint cgp; @@ -525,13 +547,15 @@ NSPoint WindowQuartzSubdriver::GetMouseLocation(NSEvent *event) if ( [ event window ] == nil) { #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 - if ([ this->cocoaview respondsToSelector:@selector(convertRectFromScreen:) ]) { + if ([ [ this->cocoaview window ] respondsToSelector:@selector(convertRectFromScreen:) ]) { pt = [ this->cocoaview convertPoint:[ [ this->cocoaview window ] convertRectFromScreen:NSMakeRect([ event locationInWindow ].x, [ event locationInWindow ].y, 0, 0) ].origin fromView:nil ]; } else #endif { +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_7 pt = [ this->cocoaview convertPoint:[ [ this->cocoaview window ] convertScreenToBase:[ event locationInWindow ] ] fromView:nil ]; +#endif } } else { pt = [ event locationInWindow ]; diff --git a/src/video/cocoa/wnd_quickdraw.mm b/src/video/cocoa/wnd_quickdraw.mm index df10d87739..8475efb0fd 100644 --- a/src/video/cocoa/wnd_quickdraw.mm +++ b/src/video/cocoa/wnd_quickdraw.mm @@ -32,6 +32,7 @@ #include "cocoa_v.h" #include "../../core/math_func.hpp" #include "../../gfx_func.h" +#include "../../framerate_type.h" /** * Important notice regarding all modifications!!!!!!! @@ -361,6 +362,8 @@ WindowQuickdrawSubdriver::~WindowQuickdrawSubdriver() void WindowQuickdrawSubdriver::Draw(bool force_update) { + PerformanceMeasurer framerate(PFE_VIDEO); + /* Check if we need to do anything */ if (this->num_dirty_rects == 0 || [ this->window isMiniaturized ]) return; diff --git a/src/video/dedicated_v.cpp b/src/video/dedicated_v.cpp index bfe853e9a0..47fa64231a 100644 --- a/src/video/dedicated_v.cpp +++ b/src/video/dedicated_v.cpp @@ -57,16 +57,12 @@ static void OS2_SwitchToConsoleMode() } #endif -#if defined(UNIX) || defined(PSP) +#if defined(UNIX) # include /* gettimeofday */ # include # include # include # define STDIN 0 /* file descriptor for standard input */ -# if defined(PSP) -# include -# include -# endif /* PSP */ /* Signal handlers */ static void DedicatedSignalHandler(int sig) @@ -77,13 +73,12 @@ static void DedicatedSignalHandler(int sig) } #endif -#if defined(WIN32) +#if defined(_WIN32) # include /* GetTickCount */ -# if !defined(WINCE) -# include -# endif +# include # include # include +# include "../os/windows/win32.h" static HANDLE _hInputReady, _hWaitForInputHandling; static HANDLE _hThread; // Thread to close static char _win_console_thread_buffer[200]; @@ -91,10 +86,8 @@ static char _win_console_thread_buffer[200]; /* Windows Console thread. Just loop and signal when input has been received */ static void WINAPI CheckForConsoleInput() { -#if defined(WINCE) - /* WinCE doesn't support console stuff */ - return; -#else + SetWin32ThreadName(-1, "ottd:win-console"); + DWORD nb; HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); for (;;) { @@ -107,7 +100,6 @@ static void WINAPI CheckForConsoleInput() SetEvent(_hInputReady); WaitForSingleObject(_hWaitForInputHandling, INFINITE); } -#endif } static void CreateWindowsConsoleThread() @@ -142,7 +134,7 @@ static void *_dedicated_video_mem; /* Whether a fork has been done. */ bool _dedicated_forks; -extern bool SafeLoad(const char *filename, int mode, GameMode newgm, Subdirectory subdir, struct LoadFilter *lf = NULL); +extern bool SafeLoad(const char *filename, SaveLoadOperation fop, DetailedFileType dft, GameMode newgm, Subdirectory subdir, struct LoadFilter *lf = NULL); static FVideoDriver_Dedicated iFVideoDriver_Dedicated; @@ -158,9 +150,7 @@ const char *VideoDriver_Dedicated::Start(const char * const *parm) ScreenSizeChanged(); BlitterFactory::GetCurrentBlitter()->PostResize(); -#if defined(WINCE) - /* WinCE doesn't support console stuff */ -#elif defined(WIN32) +#if defined(_WIN32) /* For win32 we need to allocate a console (debug mode does the same) */ CreateConsole(); CreateWindowsConsoleThread(); @@ -183,7 +173,7 @@ const char *VideoDriver_Dedicated::Start(const char * const *parm) void VideoDriver_Dedicated::Stop() { -#ifdef WIN32 +#ifdef _WIN32 CloseWindowsConsoleThread(); #endif free(_dedicated_video_mem); @@ -193,7 +183,7 @@ void VideoDriver_Dedicated::MakeDirty(int left, int top, int width, int height) bool VideoDriver_Dedicated::ChangeResolution(int w, int h) { return false; } bool VideoDriver_Dedicated::ToggleFullscreen(bool fs) { return false; } -#if defined(UNIX) || defined(__OS2__) || defined(PSP) +#if defined(UNIX) || defined(__OS2__) static bool InputWaiting() { struct timeval tv; @@ -239,7 +229,7 @@ static void DedicatedHandleKeyInput() if (_exit_game) return; -#if defined(UNIX) || defined(__OS2__) || defined(PSP) +#if defined(UNIX) || defined(__OS2__) if (fgets(input_line, lengthof(input_line), stdin) == NULL) return; #else /* Handle console input, and signal console thread, it can accept input again */ @@ -266,7 +256,7 @@ void VideoDriver_Dedicated::MainLoop() uint32 next_tick = cur_ticks + MILLISECONDS_PER_TICK; /* Signal handlers */ -#if defined(UNIX) || defined(PSP) +#if defined(UNIX) signal(SIGTERM, DedicatedSignalHandler); signal(SIGINT, DedicatedSignalHandler); signal(SIGQUIT, DedicatedSignalHandler); @@ -286,7 +276,7 @@ void VideoDriver_Dedicated::MainLoop() _switch_mode = SM_NONE; /* First we need to test if the savegame can be loaded, else we will end up playing the * intro game... */ - if (!SafeLoad(_file_to_saveload.name, _file_to_saveload.mode, GM_NORMAL, BASE_DIR)) { + if (!SafeLoad(_file_to_saveload.name, _file_to_saveload.file_op, _file_to_saveload.detail_ftype, GM_NORMAL, BASE_DIR)) { /* Loading failed, pop out.. */ DEBUG(net, 0, "Loading requested map failed, aborting"); _networking = false; diff --git a/src/video/sdl_v.cpp b/src/video/sdl_v.cpp index ea68c21656..e96decb451 100644 --- a/src/video/sdl_v.cpp +++ b/src/video/sdl_v.cpp @@ -23,6 +23,7 @@ #include "../core/random_func.hpp" #include "../core/math_func.hpp" #include "../fileio_func.h" +#include "../framerate_type.h" #include "sdl_v.h" #include @@ -148,6 +149,8 @@ static void CheckPaletteAnim() static void DrawSurfaceToScreen() { + PerformanceMeasurer framerate(PFE_VIDEO); + int n = _num_dirty_rects; if (n == 0) return; @@ -261,7 +264,7 @@ static void GetAvailableVideoMode(uint *w, uint *h) *h = _resolutions[best].height; } -#ifdef WIN32 +#ifdef _WIN32 /* Let's redefine the LoadBMP macro with because we are dynamically * loading SDL and need to 'SDL_CALL' all functions */ #undef SDL_LoadBMP @@ -323,7 +326,7 @@ bool VideoDriver_SDL::CreateMainSurface(uint w, uint h) want_hwpalette = _use_hwpalette; } - if (want_hwpalette) DEBUG(driver, 1, "SDL: requesting hardware palete"); + if (want_hwpalette) DEBUG(driver, 1, "SDL: requesting hardware palette"); /* Free any previously allocated shadow surface */ if (_sdl_screen != NULL && _sdl_screen != _sdl_realscreen) SDL_CALL SDL_FreeSurface(_sdl_screen); @@ -404,19 +407,6 @@ bool VideoDriver_SDL::CreateMainSurface(uint w, uint h) blitter->PostResize(); InitPalette(); - switch (blitter->UsePaletteAnimation()) { - case Blitter::PALETTE_ANIMATION_NONE: - case Blitter::PALETTE_ANIMATION_VIDEO_BACKEND: - UpdatePalette(); - break; - - case Blitter::PALETTE_ANIMATION_BLITTER: - if (VideoDriver::GetInstance() != NULL) blitter->PaletteAnimate(_local_palette); - break; - - default: - NOT_REACHED(); - } seprintf(caption, lastof(caption), "OpenTTD %s", _openttd_revision); SDL_CALL SDL_WM_SetCaption(caption, caption); @@ -510,7 +500,7 @@ static uint ConvertSdlKeyIntoMy(SDL_keysym *sym, WChar *character) } /* check scancode for BACKQUOTE key, because we want the key left of "1", not anything else (on non-US keyboards) */ -#if defined(WIN32) || defined(__OS2__) +#if defined(_WIN32) || defined(__OS2__) if (sym->scancode == 41) key = WKC_BACKQUOTE; #elif defined(__APPLE__) if (sym->scancode == 10) key = WKC_BACKQUOTE; @@ -687,7 +677,7 @@ void VideoDriver_SDL::MainLoop() _draw_mutex->BeginCritical(); _draw_continue = true; - _draw_threaded = ThreadObject::New(&DrawSurfaceToScreenThread, NULL, &_draw_thread); + _draw_threaded = ThreadObject::New(&DrawSurfaceToScreenThread, NULL, &_draw_thread, "ottd:draw-sdl"); /* Free the mutex if we won't be able to use it. */ if (!_draw_threaded) { @@ -830,11 +820,18 @@ bool VideoDriver_SDL::ToggleFullscreen(bool fullscreen) } bool VideoDriver_SDL::AfterBlitterChange() +{ + return CreateMainSurface(_screen.width, _screen.height); +} + +void VideoDriver_SDL::AcquireBlitterLock() { if (_draw_mutex != NULL) _draw_mutex->BeginCritical(true); - bool ret = CreateMainSurface(_screen.width, _screen.height); +} + +void VideoDriver_SDL::ReleaseBlitterLock() +{ if (_draw_mutex != NULL) _draw_mutex->EndCritical(true); - return ret; } #endif /* WITH_SDL */ diff --git a/src/video/sdl_v.h b/src/video/sdl_v.h index 730f82b93f..8855c3566e 100644 --- a/src/video/sdl_v.h +++ b/src/video/sdl_v.h @@ -31,6 +31,10 @@ public: /* virtual */ bool AfterBlitterChange(); + /* virtual */ void AcquireBlitterLock(); + + /* virtual */ void ReleaseBlitterLock(); + /* virtual */ bool ClaimMousePointer(); /* virtual */ const char *GetName() const { return "sdl"; } diff --git a/src/video/video_driver.hpp b/src/video/video_driver.hpp index 916044d358..5cb3c6cc3f 100644 --- a/src/video/video_driver.hpp +++ b/src/video/video_driver.hpp @@ -49,6 +49,7 @@ public: /** * Callback invoked after the blitter was changed. + * This may only be called between AcquireBlitterLock and ReleaseBlitterLock. * @return True if no error. */ virtual bool AfterBlitterChange() @@ -56,6 +57,18 @@ public: return true; } + /** + * Acquire any lock(s) required to be held when changing blitters. + * These lock(s) may not be acquired recursively. + */ + virtual void AcquireBlitterLock() { } + + /** + * Release any lock(s) required to be held when changing blitters. + * These lock(s) may not be acquired recursively. + */ + virtual void ReleaseBlitterLock() { } + virtual bool ClaimMousePointer() { return true; diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp index 4dcc9eb703..0655065a6c 100644 --- a/src/video/win32_v.cpp +++ b/src/video/win32_v.cpp @@ -23,6 +23,7 @@ #include "../progress.h" #include "../window_gui.h" #include "../window_func.h" +#include "../framerate_type.h" #include "win32_v.h" #include #include @@ -34,6 +35,13 @@ #define MAPVK_VK_TO_CHAR (2) #endif +#ifndef PM_QS_INPUT +#define PM_QS_INPUT 0x20000 +#endif + +typedef BOOL (WINAPI *PFNTRACKMOUSEEVENT)(LPTRACKMOUSEEVENT lpEventTrack); +static PFNTRACKMOUSEEVENT _pTrackMouseEvent = NULL; + static struct { HWND main_wnd; HBITMAP dib_sect; @@ -53,9 +61,7 @@ bool _force_full_redraw; bool _window_maximize; uint _display_hz; static Dimension _bck_resolution; -#if !defined(WINCE) || _WIN32_WCE >= 0x400 DWORD _imm_props; -#endif /** Whether the drawing is/may be done in a separate thread. */ static bool _draw_threaded; @@ -265,9 +271,6 @@ bool VideoDriver_Win32::MakeWindow(bool full_screen) _wnd.main_wnd = 0; } -#if defined(WINCE) - /* WinCE is always fullscreen */ -#else if (full_screen) { DEVMODE settings; @@ -311,7 +314,6 @@ bool VideoDriver_Win32::MakeWindow(bool full_screen) _wnd.width = _bck_resolution.width; _wnd.height = _bck_resolution.height; } -#endif { RECT r; @@ -330,22 +332,20 @@ bool VideoDriver_Win32::MakeWindow(bool full_screen) SetRect(&r, 0, 0, _wnd.width, _wnd.height); } -#if !defined(WINCE) AdjustWindowRect(&r, style, FALSE); -#endif w = r.right - r.left; h = r.bottom - r.top; if (_wnd.main_wnd != NULL) { if (!_window_maximize) SetWindowPos(_wnd.main_wnd, 0, 0, 0, w, h, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOMOVE); } else { - TCHAR Windowtitle[50]; int x = (GetSystemMetrics(SM_CXSCREEN) - w) / 2; int y = (GetSystemMetrics(SM_CYSCREEN) - h) / 2; - _sntprintf(Windowtitle, lengthof(Windowtitle), _T("OpenTTD %s"), MB_TO_WIDE(_openttd_revision)); + char window_title[64]; + seprintf(window_title, lastof(window_title), "OpenTTD %s", _openttd_revision); - _wnd.main_wnd = CreateWindow(_T("OTTD"), Windowtitle, style, x, y, w, h, 0, 0, GetModuleHandle(NULL), 0); + _wnd.main_wnd = CreateWindow(_T("OTTD"), MB_TO_WIDE(window_title), style, x, y, w, h, 0, 0, GetModuleHandle(NULL), 0); if (_wnd.main_wnd == NULL) usererror("CreateWindow failed"); ShowWindow(_wnd.main_wnd, showstyle); } @@ -360,6 +360,8 @@ bool VideoDriver_Win32::MakeWindow(bool full_screen) /** Do palette animation and blit to the window. */ static void PaintWindow(HDC dc) { + PerformanceMeasurer framerate(PFE_VIDEO); + HDC dc2 = CreateCompatibleDC(dc); HBITMAP old_bmp = (HBITMAP)SelectObject(dc2, _wnd.dib_sect); HPALETTE old_palette = SelectPalette(dc, _wnd.gdi_palette, FALSE); @@ -490,7 +492,6 @@ static LRESULT HandleCharMsg(uint keycode, WChar charcode) return 0; } -#if !defined(WINCE) || _WIN32_WCE >= 0x400 /** Should we draw the composition string ourself, i.e is this a normal IME? */ static bool DrawIMECompositionString() { @@ -627,15 +628,6 @@ static void CancelIMEComposition(HWND hwnd) HandleTextInput(NULL, true); } -#else - -static bool DrawIMECompositionString() { return false; } -static void SetCompositionPos(HWND hwnd) {} -static void SetCandidatePos(HWND hwnd) {} -static void CancelIMEComposition(HWND hwnd) {} - -#endif /* !defined(WINCE) || _WIN32_WCE >= 0x400 */ - static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static uint32 keycode = 0; @@ -646,9 +638,7 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP case WM_CREATE: SetTimer(hwnd, TID_POLLMOUSE, MOUSE_POLL_DELAY, (TIMERPROC)TrackMouseTimerProc); SetCompositionPos(hwnd); -#if !defined(WINCE) || _WIN32_WCE >= 0x400 _imm_props = ImmGetProperty(GetKeyboardLayout(0), IGP_PROPERTY); -#endif break; case WM_ENTERSIZEMOVE: @@ -680,7 +670,7 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP case WM_PALETTECHANGED: if ((HWND)wParam == hwnd) return 0; - /* FALL THROUGH */ + FALLTHROUGH; case WM_QUERYNEWPALETTE: { HDC hDC = GetWindowDC(hwnd); @@ -737,17 +727,36 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP case WM_MOUSEMOVE: { int x = (int16)LOWORD(lParam); int y = (int16)HIWORD(lParam); - POINT pt; /* If the mouse was not in the window and it has moved it means it has * come into the window, so start drawing the mouse. Also start * tracking the mouse for exiting the window */ if (!_cursor.in_window) { _cursor.in_window = true; - SetTimer(hwnd, TID_POLLMOUSE, MOUSE_POLL_DELAY, (TIMERPROC)TrackMouseTimerProc); + if (_pTrackMouseEvent != NULL) { + TRACKMOUSEEVENT tme; + tme.cbSize = sizeof(tme); + tme.dwFlags = TME_LEAVE; + tme.hwndTrack = hwnd; + + _pTrackMouseEvent(&tme); + } else { + SetTimer(hwnd, TID_POLLMOUSE, MOUSE_POLL_DELAY, (TIMERPROC)TrackMouseTimerProc); + } } - if (_cursor.UpdateCursorPosition(x, y, true)) { + if (_cursor.fix_at) { + /* Get all queued mouse events now in case we have to warp the cursor. In the + * end, we only care about the current mouse position and not bygone events. */ + MSG m; + while (PeekMessage(&m, hwnd, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE | PM_NOYIELD | PM_QS_INPUT)) { + x = (int16)LOWORD(m.lParam); + y = (int16)HIWORD(m.lParam); + } + } + + if (_cursor.UpdateCursorPosition(x, y, false)) { + POINT pt; pt.x = _cursor.pos.x; pt.y = _cursor.pos.y; ClientToScreen(hwnd, &pt); @@ -758,7 +767,6 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP return 0; } -#if !defined(WINCE) || _WIN32_WCE >= 0x400 case WM_INPUTLANGCHANGE: _imm_props = ImmGetProperty(GetKeyboardLayout(0), IGP_PROPERTY); break; @@ -794,7 +802,6 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP } HandleCharMsg(0, GB(wParam, 0, 8)); return 0; -#endif #endif case WM_DEADCHAR: @@ -888,7 +895,6 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP } return 0; -#if !defined(WINCE) case WM_SIZING: { RECT *r = (RECT*)lParam; RECT r2; @@ -946,7 +952,6 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP } return TRUE; } -#endif /* needed for wheel */ #if !defined(WM_MOUSEWHEEL) @@ -977,7 +982,6 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP _wnd.has_focus = false; break; -#if !defined(WINCE) case WM_ACTIVATE: { /* Don't do anything if we are closing openttd */ if (_exit_game) break; @@ -997,7 +1001,6 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP } break; } -#endif } return DefWindowProc(hwnd, msg, wParam, lParam); @@ -1024,6 +1027,9 @@ static void RegisterWndClass() registered = true; if (!RegisterClass(&wnd)) usererror("RegisterClass failed"); + + /* Dynamically load mouse tracking, as it doesn't exist on Windows 95. */ + _pTrackMouseEvent = (PFNTRACKMOUSEEVENT)GetProcAddress(GetModuleHandle(_T("User32")), "TrackMouseEvent"); } } @@ -1083,10 +1089,6 @@ static const Dimension default_resolutions[] = { static void FindResolutions() { uint n = 0; -#if defined(WINCE) - /* EnumDisplaySettingsW is only supported in CE 4.2+ - * XXX -- One might argue that we assume 4.2+ on every system. Then we can use this function safely */ -#else uint i; DEVMODEA dm; @@ -1116,7 +1118,6 @@ static void FindResolutions() } } } -#endif /* We have found no resolutions, show the default list */ if (n == 0) { @@ -1162,9 +1163,7 @@ void VideoDriver_Win32::Stop() DeleteObject(_wnd.dib_sect); DestroyWindow(_wnd.main_wnd); -#if !defined(WINCE) if (_wnd.fullscreen) ChangeDisplaySettings(NULL, 0); -#endif MyShowCursor(true); } @@ -1199,7 +1198,7 @@ void VideoDriver_Win32::MainLoop() _draw_threaded = false; } else { _draw_continue = true; - _draw_threaded = ThreadObject::New(&PaintWindowThread, NULL, &_draw_thread); + _draw_threaded = ThreadObject::New(&PaintWindowThread, NULL, &_draw_thread, "ottd:draw-win32"); /* Free the mutex if we won't be able to use it. */ if (!_draw_threaded) { @@ -1266,10 +1265,8 @@ void VideoDriver_Win32::MainLoop() if (old_ctrl_pressed != _ctrl_pressed) HandleCtrlChanged(); -#if !defined(WINCE) /* Flush GDI buffer to ensure we don't conflict with the drawing thread. */ GdiFlush(); -#endif /* The game loop is the part that can run asynchronously. * The rest except sleeping can't. */ @@ -1282,10 +1279,8 @@ void VideoDriver_Win32::MainLoop() UpdateWindows(); CheckPaletteAnim(); } else { -#if !defined(WINCE) /* Flush GDI buffer to ensure we don't conflict with the drawing thread. */ GdiFlush(); -#endif /* Release the thread while sleeping */ if (_draw_threaded) _draw_mutex->EndCritical(); @@ -1333,11 +1328,18 @@ bool VideoDriver_Win32::ToggleFullscreen(bool full_screen) } bool VideoDriver_Win32::AfterBlitterChange() +{ + return AllocateDibSection(_screen.width, _screen.height, true) && this->MakeWindow(_fullscreen); +} + +void VideoDriver_Win32::AcquireBlitterLock() { if (_draw_mutex != NULL) _draw_mutex->BeginCritical(true); - bool ret = AllocateDibSection(_screen.width, _screen.height, true) && this->MakeWindow(_fullscreen); +} + +void VideoDriver_Win32::ReleaseBlitterLock() +{ if (_draw_mutex != NULL) _draw_mutex->EndCritical(true); - return ret; } void VideoDriver_Win32::EditBoxLostFocus() diff --git a/src/video/win32_v.h b/src/video/win32_v.h index 21d59185b9..7609d0422d 100644 --- a/src/video/win32_v.h +++ b/src/video/win32_v.h @@ -31,6 +31,10 @@ public: /* virtual */ bool AfterBlitterChange(); + /* virtual */ void AcquireBlitterLock(); + + /* virtual */ void ReleaseBlitterLock(); + /* virtual */ bool ClaimMousePointer(); /* virtual */ void EditBoxLostFocus(); diff --git a/src/viewport.cpp b/src/viewport.cpp index a1bb2c81d1..350bb92381 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -84,6 +84,10 @@ #include "linkgraph/linkgraph_gui.h" #include "viewport_sprite_sorter.h" #include "bridge_map.h" +#include "company_base.h" +#include "command_func.h" +#include "network/network_func.h" +#include "framerate_type.h" #include @@ -1651,6 +1655,8 @@ static inline void ViewportDraw(const ViewPort *vp, int left, int top, int right */ void Window::DrawViewport() const { + PerformanceAccumulator framerate(PFE_DRAWWORLD); + DrawPixelInfo *dpi = _cur_dpi; dpi->left += this->left; @@ -2425,7 +2431,6 @@ void UpdateTileSelection() break; default: NOT_REACHED(); - break; } _thd.new_pos.x = x1 & ~TILE_UNIT_MASK; _thd.new_pos.y = y1 & ~TILE_UNIT_MASK; @@ -2633,7 +2638,7 @@ static int CalcHeightdiff(HighLightStyle style, uint distance, TileIndex start_t byte style_t = (byte)(TileX(end_tile) > TileX(start_tile)); start_tile = TILE_ADD(start_tile, ToTileIndexDiff(heightdiff_area_by_dir[style_t])); end_tile = TILE_ADD(end_tile, ToTileIndexDiff(heightdiff_area_by_dir[2 + style_t])); - /* FALL THROUGH */ + FALLTHROUGH; } case HT_POINT: @@ -2979,7 +2984,7 @@ void VpSelectTilesWithMethod(int x, int y, ViewportPlaceMethod method) case VPM_X_LIMITED: // Drag in X direction (limited size). limit = (_thd.sizelimit - 1) * TILE_SIZE; - /* FALL THROUGH */ + FALLTHROUGH; case VPM_FIX_X: // drag in Y direction x = sx; @@ -2988,7 +2993,7 @@ void VpSelectTilesWithMethod(int x, int y, ViewportPlaceMethod method) case VPM_Y_LIMITED: // Drag in Y direction (limited size). limit = (_thd.sizelimit - 1) * TILE_SIZE; - /* FALL THROUGH */ + FALLTHROUGH; case VPM_FIX_Y: // drag in X direction y = sy; @@ -3026,7 +3031,7 @@ calc_heightdiff_single_direction:; limit = (_thd.sizelimit - 1) * TILE_SIZE; x = sx + Clamp(x - sx, -limit, limit); y = sy + Clamp(y - sy, -limit, limit); - /* FALL THROUGH */ + FALLTHROUGH; case VPM_X_AND_Y: // drag an X by Y area if (_settings_client.gui.measure_tooltip) { @@ -3250,3 +3255,40 @@ void InitializeSpriteSorter() } assert(_vp_sprite_sorter != NULL); } + +/** + * Scroll players main viewport. + * @param tile tile to center viewport on + * @param flags type of operation + * @param p1 ViewportScrollTarget of scroll target + * @param p2 company or client id depending on the target + * @param text unused + * @return the cost of this operation or an error + */ +CommandCost CmdScrollViewport(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) +{ + if (_current_company != OWNER_DEITY) return CMD_ERROR; + ViewportScrollTarget target = (ViewportScrollTarget)p1; + switch (target) { + case VST_EVERYONE: + break; + case VST_COMPANY: + if (_local_company != (CompanyID)p2) return CommandCost(); + break; + case VST_CLIENT: +#ifdef ENABLE_NETWORK + if (_network_own_client_id != (ClientID)p2) return CommandCost(); + break; +#else + return CommandCost(); +#endif + default: + return CMD_ERROR; + } + + if (flags & DC_EXEC) { + ResetObjectToPlace(); + ScrollMainWindowToTile(tile); + } + return CommandCost(); +} diff --git a/src/viewport_gui.cpp b/src/viewport_gui.cpp index 90b0e1468f..9c89a85f84 100644 --- a/src/viewport_gui.cpp +++ b/src/viewport_gui.cpp @@ -71,7 +71,7 @@ public: pt.x = w->viewport->scrollpos_x + w->viewport->virtual_width / 2; pt.y = w->viewport->scrollpos_y + w->viewport->virtual_height / 2; } else { - pt = RemapCoords(TileX(tile) * TILE_SIZE + TILE_SIZE / 2, TileY(tile) * TILE_SIZE + TILE_SIZE / 2, TileHeight(tile)); + pt = RemapCoords(TileX(tile) * TILE_SIZE + TILE_SIZE / 2, TileY(tile) * TILE_SIZE + TILE_SIZE / 2, TilePixelHeight(tile)); } this->viewport->scrollpos_x = pt.x - this->viewport->virtual_width / 2; @@ -138,7 +138,7 @@ public: virtual void OnMouseWheel(int wheel) { - if (_settings_client.gui.scrollwheel_scrolling == 0) { + if (_settings_client.gui.scrollwheel_scrolling != 2) { ZoomInOrOutToCursorWindow(wheel < 0, this); } } diff --git a/src/viewport_sprite_sorter.h b/src/viewport_sprite_sorter.h index 19b903e152..324ece3020 100644 --- a/src/viewport_sprite_sorter.h +++ b/src/viewport_sprite_sorter.h @@ -37,7 +37,7 @@ struct ParentSpriteToDraw { int32 left; ///< minimal screen X coordinate of sprite (= x + sprite->x_offs), reference point for child sprites int32 top; ///< minimal screen Y coordinate of sprite (= y + sprite->y_offs), reference point for child sprites - int first_child; ///< the first child to draw. + int32 first_child; ///< the first child to draw. bool comparison_done; ///< Used during sprite sorting: true if sprite has been compared with all other sprites }; diff --git a/src/viewport_sprite_sorter_sse4.cpp b/src/viewport_sprite_sorter_sse4.cpp index 05a7f8aa1c..fb78c51c86 100644 --- a/src/viewport_sprite_sorter_sse4.cpp +++ b/src/viewport_sprite_sorter_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 viewport_sprite_sorter_sse.cpp Sprite sorter that uses SSE4.1. */ +/** @file viewport_sprite_sorter_sse4.cpp Sprite sorter that uses SSE4.1. */ #ifdef WITH_SSE diff --git a/src/viewport_type.h b/src/viewport_type.h index 07485c3243..74cd88d95d 100644 --- a/src/viewport_type.h +++ b/src/viewport_type.h @@ -123,4 +123,14 @@ enum ViewportDragDropSelectionProcess { DDSP_REMOVE_TRUCKSTOP, ///< Road stop removal (trucks) }; + +/** + * Target of the viewport scrolling GS method + */ +enum ViewportScrollTarget { + VST_EVERYONE, ///< All players + VST_COMPANY, ///< All players in specific company + VST_CLIENT, ///< Single player +}; + #endif /* VIEWPORT_TYPE_H */ diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index 4392eb2103..31dafe57fa 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -73,7 +73,7 @@ static const uint8 _flood_from_dirs[] = { */ static inline void MarkTileDirtyIfCanalOrRiver(TileIndex tile) { - if (IsTileType(tile, MP_WATER) && (IsCanal(tile) || IsRiver(tile))) MarkTileDirtyByTile(tile); + if (IsValidTile(tile) && IsTileType(tile, MP_WATER) && (IsCanal(tile) || IsRiver(tile))) MarkTileDirtyByTile(tile); } /** @@ -437,7 +437,7 @@ CommandCost CmdBuildCanal(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 MakeSea(tile); break; } - /* FALL THROUGH */ + FALLTHROUGH; default: MakeCanal(tile, _current_company, Random()); @@ -895,7 +895,7 @@ static void GetTileDesc_Water(TileIndex tile, TileDesc *td) case WATER_CLASS_SEA: td->str = STR_LAI_WATER_DESCRIPTION_WATER; break; case WATER_CLASS_CANAL: td->str = STR_LAI_WATER_DESCRIPTION_CANAL; break; case WATER_CLASS_RIVER: td->str = STR_LAI_WATER_DESCRIPTION_RIVER; break; - default: NOT_REACHED(); break; + default: NOT_REACHED(); } break; case WATER_TILE_COAST: td->str = STR_LAI_WATER_DESCRIPTION_COAST_OR_RIVERBANK; break; @@ -904,7 +904,7 @@ static void GetTileDesc_Water(TileIndex tile, TileDesc *td) td->str = STR_LAI_WATER_DESCRIPTION_SHIP_DEPOT; td->build_date = Depot::GetByTile(tile)->build_date; break; - default: NOT_REACHED(); break; + default: NOT_REACHED(); } td->owner[0] = GetTileOwner(tile); @@ -1015,7 +1015,7 @@ FloodingBehaviour GetFloodingBehaviour(TileIndex tile) Slope tileh = GetTileSlope(tile); return (IsSlopeWithOneCornerRaised(tileh) ? FLOOD_ACTIVE : FLOOD_DRYUP); } - /* FALL THROUGH */ + FALLTHROUGH; case MP_STATION: case MP_INDUSTRY: case MP_OBJECT: @@ -1064,7 +1064,7 @@ void DoFloodTile(TileIndex target) flooded = true; break; } - /* FALL THROUGH */ + FALLTHROUGH; case MP_CLEAR: if (DoCommand(target, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR).Succeeded()) { @@ -1218,7 +1218,7 @@ void ConvertGroundTilesIntoWaterTiles() default: uint dir; FOR_EACH_SET_BIT(dir, _flood_from_dirs[slope & ~SLOPE_STEEP]) { - TileIndex dest = TILE_ADD(tile, TileOffsByDir((Direction)dir)); + TileIndex dest = TileAddByDir(tile, (Direction)dir); Slope slope_dest = GetTileSlope(dest) & ~SLOPE_STEEP; if (slope_dest == SLOPE_FLAT || IsSlopeWithOneCornerRaised(slope_dest)) { MakeShore(tile); @@ -1233,7 +1233,8 @@ void ConvertGroundTilesIntoWaterTiles() static TrackStatus GetTileTrackStatus_Water(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side) { - static const byte coast_tracks[] = {0, 32, 4, 0, 16, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0}; + static const TrackBits coast_tracks[] = {TRACK_BIT_NONE, TRACK_BIT_RIGHT, TRACK_BIT_UPPER, TRACK_BIT_NONE, TRACK_BIT_LEFT, TRACK_BIT_NONE, TRACK_BIT_NONE, + TRACK_BIT_NONE, TRACK_BIT_LOWER, TRACK_BIT_NONE, TRACK_BIT_NONE, TRACK_BIT_NONE, TRACK_BIT_NONE, TRACK_BIT_NONE, TRACK_BIT_NONE, TRACK_BIT_NONE}; TrackBits ts; @@ -1241,7 +1242,7 @@ static TrackStatus GetTileTrackStatus_Water(TileIndex tile, TransportType mode, switch (GetWaterTileType(tile)) { case WATER_TILE_CLEAR: ts = IsTileFlat(tile) ? TRACK_BIT_ALL : TRACK_BIT_NONE; break; - case WATER_TILE_COAST: ts = (TrackBits)coast_tracks[GetTileSlope(tile) & 0xF]; break; + case WATER_TILE_COAST: ts = coast_tracks[GetTileSlope(tile) & 0xF]; break; case WATER_TILE_LOCK: ts = DiagDirToDiagTrackBits(GetLockDirection(tile)); break; case WATER_TILE_DEPOT: ts = AxisToTrackBits(GetShipDepotAxis(tile)); break; default: return 0; diff --git a/src/waypoint_cmd.cpp b/src/waypoint_cmd.cpp index efa48003f2..639dce13bc 100644 --- a/src/waypoint_cmd.cpp +++ b/src/waypoint_cmd.cpp @@ -148,7 +148,8 @@ extern CommandCost CanExpandRailStation(const BaseStation *st, TileArea &new_ta, * @param start_tile northern most tile where waypoint will be built * @param flags type of operation * @param p1 various bitstuffed elements - * - p1 = (bit 4) - orientation (Axis) + * - p1 = (bit 0- 5) - railtype (not used) + * - p1 = (bit 6) - orientation (Axis) * - p1 = (bit 8-15) - width of waypoint * - p1 = (bit 16-23) - height of waypoint * - p1 = (bit 24) - allow waypoints directly adjacent to other waypoints. @@ -161,7 +162,7 @@ extern CommandCost CanExpandRailStation(const BaseStation *st, TileArea &new_ta, CommandCost CmdBuildRailWaypoint(TileIndex start_tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) { /* Unpack parameters */ - Axis axis = Extract(p1); + Axis axis = Extract(p1); byte width = GB(p1, 8, 8); byte height = GB(p1, 16, 8); bool adjacent = HasBit(p1, 24); @@ -324,6 +325,7 @@ CommandCost CmdBuildBuoy(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 if (wp->town == NULL) MakeDefaultName(wp); MakeBuoy(tile, wp->index, GetWaterClass(tile)); + MarkTileDirtyByTile(tile); wp->UpdateVirtCoord(); InvalidateWindowData(WC_WAYPOINT_VIEW, wp->index); diff --git a/src/widget.cpp b/src/widget.cpp index d59ca020e0..73190f5e67 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -221,7 +221,8 @@ static inline void DrawImageButtons(const Rect &r, WidgetType type, Colours colo DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FR_LOWERED : FR_NONE); if ((type & WWT_MASK) == WWT_IMGBTN_2 && clicked) img++; // Show different image when clicked for #WWT_IMGBTN_2. - DrawSprite(img, PAL_NONE, r.left + WD_IMGBTN_LEFT + clicked, r.top + WD_IMGBTN_TOP + clicked); + Dimension d = GetSpriteSize(img); + DrawSprite(img, PAL_NONE, CenterBounds(r.left, r.right, d.width) + clicked, CenterBounds(r.top, r.bottom, d.height) + clicked); } /** @@ -459,8 +460,7 @@ static inline void DrawFrame(const Rect &r, Colours colour, StringID str) */ static inline void DrawShadeBox(const Rect &r, Colours colour, bool clicked) { - DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FR_LOWERED : FR_NONE); - DrawSprite((clicked) ? SPR_WINDOW_SHADE : SPR_WINDOW_UNSHADE, PAL_NONE, r.left + WD_SHADEBOX_LEFT + clicked, r.top + WD_SHADEBOX_TOP + clicked); + DrawImageButtons(r, WWT_SHADEBOX, colour, clicked, clicked ? SPR_WINDOW_SHADE: SPR_WINDOW_UNSHADE); } /** @@ -471,8 +471,7 @@ static inline void DrawShadeBox(const Rect &r, Colours colour, bool clicked) */ static inline void DrawStickyBox(const Rect &r, Colours colour, bool clicked) { - DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FR_LOWERED : FR_NONE); - DrawSprite((clicked) ? SPR_PIN_UP : SPR_PIN_DOWN, PAL_NONE, r.left + WD_STICKYBOX_LEFT + clicked, r.top + WD_STICKYBOX_TOP + clicked); + DrawImageButtons(r, WWT_STICKYBOX, colour, clicked, clicked ? SPR_PIN_UP : SPR_PIN_DOWN); } /** @@ -483,8 +482,7 @@ static inline void DrawStickyBox(const Rect &r, Colours colour, bool clicked) */ static inline void DrawDefSizeBox(const Rect &r, Colours colour, bool clicked) { - DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FR_LOWERED : FR_NONE); - DrawSprite(SPR_WINDOW_DEFSIZE, PAL_NONE, r.left + WD_DEFSIZEBOX_LEFT + clicked, r.top + WD_DEFSIZEBOX_TOP + clicked); + DrawImageButtons(r, WWT_DEFSIZEBOX, colour, clicked, SPR_WINDOW_DEFSIZE); } /** @@ -495,8 +493,7 @@ static inline void DrawDefSizeBox(const Rect &r, Colours colour, bool clicked) */ static inline void DrawDebugBox(const Rect &r, Colours colour, bool clicked) { - DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FR_LOWERED : FR_NONE); - DrawSprite(SPR_WINDOW_DEBUG, PAL_NONE, r.left + WD_DEBUGBOX_LEFT + clicked, r.top + WD_DEBUGBOX_TOP + clicked); + DrawImageButtons(r, WWT_DEBUGBOX, colour, clicked, SPR_WINDOW_DEBUG); } /** @@ -510,11 +507,13 @@ static inline void DrawResizeBox(const Rect &r, Colours colour, bool at_left, bo { DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FR_LOWERED : FR_NONE); if (at_left) { + Dimension d = GetSpriteSize(SPR_WINDOW_RESIZE_LEFT); DrawSprite(SPR_WINDOW_RESIZE_LEFT, PAL_NONE, r.left + WD_RESIZEBOX_RIGHT + clicked, - r.bottom - WD_RESIZEBOX_BOTTOM - GetSpriteSize(SPR_WINDOW_RESIZE_LEFT).height + clicked); + r.bottom + 1 - WD_RESIZEBOX_BOTTOM - d.height + clicked); } else { - DrawSprite(SPR_WINDOW_RESIZE_RIGHT, PAL_NONE, r.left + WD_RESIZEBOX_LEFT + clicked, - r.bottom - WD_RESIZEBOX_BOTTOM - GetSpriteSize(SPR_WINDOW_RESIZE_RIGHT).height + clicked); + Dimension d = GetSpriteSize(SPR_WINDOW_RESIZE_RIGHT); + DrawSprite(SPR_WINDOW_RESIZE_RIGHT, PAL_NONE, r.right + 1 - WD_RESIZEBOX_RIGHT - d.width + clicked, + r.bottom + 1 - WD_RESIZEBOX_BOTTOM - d.height + clicked); } } @@ -526,7 +525,9 @@ static inline void DrawResizeBox(const Rect &r, Colours colour, bool at_left, bo static inline void DrawCloseBox(const Rect &r, Colours colour) { if (colour != COLOUR_WHITE) DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, FR_NONE); - DrawSprite(SPR_CLOSEBOX, (colour != COLOUR_WHITE ? TC_BLACK : TC_SILVER) | (1 << PALETTE_TEXT_RECOLOUR), r.left + WD_CLOSEBOX_LEFT, r.top + WD_CLOSEBOX_TOP); + Dimension d = GetSpriteSize(SPR_CLOSEBOX); + int s = UnScaleGUI(1); /* Offset to account for shadow of SPR_CLOSEBOX */ + DrawSprite(SPR_CLOSEBOX, (colour != COLOUR_WHITE ? TC_BLACK : TC_SILVER) | (1 << PALETTE_TEXT_RECOLOUR), CenterBounds(r.left, r.right, d.width - s), CenterBounds(r.top, r.bottom, d.height - s)); } /** @@ -754,7 +755,7 @@ NWidgetBase::NWidgetBase(WidgetType tp) : ZeroedMemoryAllocator() */ /** - * @fn void FillNestedArray(NWidgetBase **array, uint length) + * @fn void NWidgetBase::FillNestedArray(NWidgetBase **array, uint length) * Fill the Window::nested_array array with pointers to nested widgets in the tree. * @param array Base pointer of the array. * @param length Length of the array. @@ -1672,10 +1673,10 @@ NWidgetCore *NWidgetMatrix::GetWidgetFromPos(int x, int y) /** * Get the different offsets that are influenced by scrolling. - * @param [out] start_x The start position in columns (index of the left-most column, swapped in RTL). - * @param [out] start_y The start position in rows. - * @param [out] base_offs_x The base horizontal offset in pixels (X position of the column \a start_x). - * @param [out] base_offs_y The base vertical offset in pixels (Y position of the column \a start_y). + * @param[out] start_x The start position in columns (index of the left-most column, swapped in RTL). + * @param[out] start_y The start position in rows. + * @param[out] base_offs_x The base horizontal offset in pixels (X position of the column \a start_x). + * @param[out] base_offs_y The base vertical offset in pixels (Y position of the column \a start_y). */ void NWidgetMatrix::GetScrollOffsets(int &start_x, int &start_y, int &base_offs_x, int &base_offs_y) { @@ -2286,8 +2287,8 @@ void NWidgetLeaf::SetupSmallestSize(Window *w, bool init_array) Dimension sprite_size = GetSpriteSize(_current_text_dir == TD_RTL ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT); size.width = max(size.width, 30 + sprite_size.width); size.height = max(sprite_size.height, GetStringBoundingBox("_").height + WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM); - /* FALL THROUGH */ } + FALLTHROUGH; case WWT_PUSHBTN: { static const Dimension extra = {WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM}; padding = &extra; @@ -2393,15 +2394,22 @@ void NWidgetLeaf::Draw(const Window *w) { if (this->current_x == 0 || this->current_y == 0) return; + /* Setup a clipping rectangle... */ + DrawPixelInfo new_dpi; + if (!FillDrawPixelInfo(&new_dpi, this->pos_x, this->pos_y, this->current_x, this->current_y)) return; + /* ...but keep coordinates relative to the window. */ + new_dpi.left += this->pos_x; + new_dpi.top += this->pos_y; + + DrawPixelInfo *old_dpi = _cur_dpi; + _cur_dpi = &new_dpi; + Rect r; r.left = this->pos_x; r.right = this->pos_x + this->current_x - 1; r.top = this->pos_y; r.bottom = this->pos_y + this->current_y - 1; - const DrawPixelInfo *dpi = _cur_dpi; - if (dpi->left > r.right || dpi->left + dpi->width <= r.left || dpi->top > r.bottom || dpi->top + dpi->height <= r.top) return; - bool clicked = this->IsLowered(); switch (this->type) { case WWT_EMPTY: @@ -2512,6 +2520,8 @@ void NWidgetLeaf::Draw(const Window *w) if (this->IsDisabled()) { GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, _colour_gradient[this->colour & 0xF][2], FILLRECT_CHECKER); } + + _cur_dpi = old_dpi; } /** @@ -2795,7 +2805,7 @@ NWidgetContainer *MakeNWidgets(const NWidgetPart *parts, int count, int *biggest * @param parts Array with parts of the widgets. * @param count Length of the \a parts array. * @param biggest_index Pointer to biggest nested widget index collected in the tree. - * @param [out] shade_select Pointer to the inserted shade selection widget (\c NULL if not unserted). + * @param[out] shade_select Pointer to the inserted shade selection widget (\c NULL if not unserted). * @return Root of the nested widget tree, a vertical container containing the entire GUI. * @ingroup NestedWidgetParts * @pre \c biggest_index != NULL diff --git a/src/widget_type.h b/src/widget_type.h index 39efbb4637..33fb8bce08 100644 --- a/src/widget_type.h +++ b/src/widget_type.h @@ -257,7 +257,7 @@ enum NWidgetDisplay { NDB_SHADE_GREY = 3, ///< Shade viewport to grey-scale. NDB_SHADE_DIMMED = 4, ///< Display dimmed colours in the viewport. /* Button dropdown widget. */ - NDB_DROPDOWN_ACTIVE = 5, ///< Dropdown menu of the button dropdown widget is active. @see #NWID_BUTTON_DRPDOWN + NDB_DROPDOWN_ACTIVE = 5, ///< Dropdown menu of the button dropdown widget is active. @see #NWID_BUTTON_DROPDOWN /* Scrollbar widget. */ NDB_SCROLLBAR_UP = 6, ///< Up-button is lowered bit. NDB_SCROLLBAR_DOWN = 7, ///< Down-button is lowered bit. @@ -400,7 +400,7 @@ enum StackedZeroSizePlanes { * There are also a number of special planes (defined in #StackedZeroSizePlanes) that have zero size in one direction (and are stretchable in * the other direction) or have zero size in both directions. They are used to make all child planes of the widget disappear. * Unlike switching between the regular display planes (that all have the same size), switching from or to one of the zero-sized planes means that - * a #Windows::ReInit() is needed to re-initialize the window since its size changes. + * a #Window::ReInit() is needed to re-initialize the window since its size changes. */ class NWidgetStacked : public NWidgetContainer { public: @@ -567,7 +567,7 @@ private: * Nested widget to display a viewport in a window. * After initializing the nested widget tree, call #InitializeViewport(). After changing the window size, * call #UpdateViewportCoordinates() eg from Window::OnResize(). - * If the #display_flags field contains the #ND_NO_TRANSPARENCY bit, the viewport will disable transparency. + * If the #disp_flags field contains the #ND_NO_TRANSPARENCY bit, the viewport will disable transparency. * Shading to grey-scale is controlled with the #ND_SHADE_GREY bit (used for B&W news papers), the #ND_SHADE_DIMMED gives dimmed colours (for colour news papers). * @todo Class derives from #NWidgetCore, but does not use #colour, #widget_data, or #tool_tip. * @ingroup NestedWidgets @@ -779,13 +779,13 @@ public: static void InvalidateDimensionCache(); static Dimension dropdown_dimension; ///< Cached size of a dropdown widget. + static Dimension resizebox_dimension; ///< Cached size of a resizebox widget. + static Dimension closebox_dimension; ///< Cached size of a closebox widget. private: static Dimension shadebox_dimension; ///< Cached size of a shadebox widget. static Dimension debugbox_dimension; ///< Cached size of a debugbox widget. static Dimension defsizebox_dimension; ///< Cached size of a defsizebox widget. static Dimension stickybox_dimension; ///< Cached size of a stickybox widget. - static Dimension resizebox_dimension; ///< Cached size of a resizebox widget. - static Dimension closebox_dimension; ///< Cached size of a closebox widget. }; /** @@ -1124,8 +1124,8 @@ static inline NWidgetPart NWidget(WidgetType tp, Colours col, int16 idx = -1) /** * Widget part function for starting a new horizontal container, vertical container, or spacer widget. - * @param tp Type of the new nested widget, #NWID_HORIZONTAL(_LTR), #NWID_VERTICAL, #NWID_SPACER, #NWID_SELECTION, and #NWID_MATRIX. - * @param cont_flags Flags for the containers (#NWID_HORIZONTAL(_LTR) and #NWID_VERTICAL). + * @param tp Type of the new nested widget, #NWID_HORIZONTAL, #NWID_VERTICAL, #NWID_SPACER, #NWID_SELECTION, and #NWID_MATRIX. + * @param cont_flags Flags for the containers (#NWID_HORIZONTAL and #NWID_VERTICAL). * @ingroup NestedWidgetParts */ static inline NWidgetPart NWidget(WidgetType tp, NWidContainerFlags cont_flags = NC_NONE) diff --git a/src/widgets/autoreplace_widget.h b/src/widgets/autoreplace_widget.h index 7a98b6cd72..4b761ca45d 100644 --- a/src/widgets/autoreplace_widget.h +++ b/src/widgets/autoreplace_widget.h @@ -35,10 +35,8 @@ enum ReplaceVehicleWidgets { WID_RV_STOP_REPLACE, ///< Stop Replacing button. /* Train only widgets. */ - WID_RV_TRAIN_ENGINEWAGON_TOGGLE, ///< Button to toggle engines and/or wagons. - WID_RV_TRAIN_FLUFF_LEFT, ///< The fluff on the left. + WID_RV_TRAIN_ENGINEWAGON_DROPDOWN, ///< Dropdown to select engines and/or wagons. WID_RV_TRAIN_RAILTYPE_DROPDOWN, ///< Dropdown menu about the railtype. - WID_RV_TRAIN_FLUFF_RIGHT, ///< The fluff on the right. WID_RV_TRAIN_WAGONREMOVE_TOGGLE, ///< Button to toggle removing wagons. }; diff --git a/src/widgets/cheat_widget.h b/src/widgets/cheat_widget.h index 78758f7b11..3209cae239 100644 --- a/src/widgets/cheat_widget.h +++ b/src/widgets/cheat_widget.h @@ -12,7 +12,7 @@ #ifndef WIDGETS_CHEAT_WIDGET_H #define WIDGETS_CHEAT_WIDGET_H -/** Widgets of the #CheatWindow class.. */ +/** Widgets of the #CheatWindow class. */ enum CheatWidgets { WID_C_PANEL, ///< Panel where all cheats are shown in. }; diff --git a/src/widgets/dropdown.cpp b/src/widgets/dropdown.cpp index e0ad96a87a..f8ddf55695 100644 --- a/src/widgets/dropdown.cpp +++ b/src/widgets/dropdown.cpp @@ -111,7 +111,6 @@ struct DropdownWindow : Window { * @param size Size of the dropdown menu window. * @param wi_colour Colour of the parent widget. * @param scroll Dropdown menu has a scrollbar. - * @param widget Widgets of the dropdown menu window. */ DropdownWindow(Window *parent, const DropDownList *list, int selected, int button, bool instant_close, const Point &position, const Dimension &size, Colours wi_colour, bool scroll) : Window(&_dropdown_desc) @@ -182,7 +181,7 @@ struct DropdownWindow : Window { /** * Find the dropdown item under the cursor. - * @param value [out] Selected item, if function returns \c true. + * @param[out] value Selected item, if function returns \c true. * @return Cursor points to a dropdown item. */ bool GetDropDownItem(int &value) @@ -363,18 +362,38 @@ void ShowDropDownListAt(Window *w, const DropDownList *list, int selected, int b /* Check if the dropdown will fully fit below the widget */ if (top + height + 4 >= screen_bottom) { /* If not, check if it will fit above the widget */ - if (w->top + wi_rect.top - height > GetMainViewTop()) { + int screen_top = GetMainViewTop(); + if (w->top + wi_rect.top > screen_top + height) { top = w->top + wi_rect.top - height - 4; } else { - /* ... and lastly if it won't, enable the scroll bar and fit the - * list in below the widget */ + /* If it doesn't fit above the widget, we need to enable a scrollbar... */ int avg_height = height / (int)list->Length(); - int rows = (screen_bottom - 4 - top) / avg_height; - height = rows * avg_height; scroll = true; + + /* ... and choose whether to put the list above or below the widget. */ + bool put_above = false; + int available_height = screen_bottom - w->top - wi_rect.bottom; + if (w->top + wi_rect.top - screen_top > available_height) { + // Put it above. + available_height = w->top + wi_rect.top - screen_top; + put_above = true; + } + + /* Check at least there is space for one item. */ + assert(available_height >= avg_height); + + /* And lastly, fit the list... */ + int rows = available_height / avg_height; + height = rows * avg_height; + /* Add space for the scroll bar if we automatically determined * the width of the list. */ max_item_width += NWidgetScrollbar::GetVerticalDimension().width; + + /* ... and set the top position if needed. */ + if (put_above) { + top = w->top + wi_rect.top - height - 4; + } } } diff --git a/src/widgets/fios_widget.h b/src/widgets/fios_widget.h index c94655d767..2351f8035e 100644 --- a/src/widgets/fios_widget.h +++ b/src/widgets/fios_widget.h @@ -17,6 +17,7 @@ enum SaveLoadWidgets { WID_SL_CAPTION, ///< Caption of the window. WID_SL_SORT_BYNAME, ///< Sort by name button. WID_SL_SORT_BYDATE, ///< Sort by date button. + WID_SL_FILTER, ///< Filter list of files WID_SL_BACKGROUND, ///< Background of window. WID_SL_FILE_BACKGROUND, ///< Background of file selection. WID_SL_HOME_BUTTON, ///< Home button. diff --git a/src/widgets/framerate_widget.h b/src/widgets/framerate_widget.h new file mode 100644 index 0000000000..388599537c --- /dev/null +++ b/src/widgets/framerate_widget.h @@ -0,0 +1,33 @@ +/* $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_widget.h Types related to the framerate windows widgets. */ + +#ifndef WIDGETS_FRAMERATE_WIDGET_H +#define WIDGETS_FRAMERATE_WIDGET_H + +/** Widgets of the #FramerateWindow class. */ +enum FramerateWindowWidgets { + WID_FRW_CAPTION, + WID_FRW_RATE_GAMELOOP, + WID_FRW_RATE_DRAWING, + WID_FRW_RATE_FACTOR, + WID_FRW_INFO_DATA_POINTS, + WID_FRW_TIMES_NAMES, + WID_FRW_TIMES_CURRENT, + WID_FRW_TIMES_AVERAGE, +}; + +/** Widgets of the #FrametimeGraphWindow class. */ +enum FrametimeGraphWindowWidgets { + WID_FGW_CAPTION, + WID_FGW_GRAPH, +}; + +#endif /* WIDGETS_FRAMERATE_WIDGET_H */ diff --git a/src/widgets/group_widget.h b/src/widgets/group_widget.h index bd0d90486b..41e0bcd45a 100644 --- a/src/widgets/group_widget.h +++ b/src/widgets/group_widget.h @@ -32,6 +32,7 @@ enum GroupListWidgets { WID_GL_DELETE_GROUP, ///< Delete group button. WID_GL_RENAME_GROUP, ///< Rename group button. WID_GL_REPLACE_PROTECTION, ///< Replace protection button. + WID_GL_INFO, ///< Group info. }; #endif /* WIDGETS_GROUP_WIDGET_H */ diff --git a/src/widgets/intro_widget.h b/src/widgets/intro_widget.h index 6a67fe64ca..ae48827ed1 100644 --- a/src/widgets/intro_widget.h +++ b/src/widgets/intro_widget.h @@ -24,8 +24,10 @@ enum SelectGameIntroWidgets { WID_SGI_ARCTIC_LANDSCAPE, ///< Select arctic landscape button. WID_SGI_TROPIC_LANDSCAPE, ///< Select tropic landscape button. WID_SGI_TOYLAND_LANDSCAPE, ///< Select toyland landscape button. + WID_SGI_BASESET_SELECTION, ///< Baseset selection. + WID_SGI_BASESET, ///< Baseset errors. WID_SGI_TRANSLATION_SELECTION, ///< Translation selection. - WID_SGI_TRANSLATION, ///< Translation. + WID_SGI_TRANSLATION, ///< Translation errors. WID_SGI_OPTIONS, ///< Options button. WID_SGI_HIGHSCORE, ///< Highscore button. WID_SGI_SETTINGS_OPTIONS, ///< Settings button. diff --git a/src/widgets/music_widget.h b/src/widgets/music_widget.h index 3a99bc6150..c8e6a98186 100644 --- a/src/widgets/music_widget.h +++ b/src/widgets/music_widget.h @@ -14,9 +14,11 @@ /** Widgets of the #MusicTrackSelectionWindow class. */ enum MusicTrackSelectionWidgets { + WID_MTS_CAPTION, ///< Window caption. WID_MTS_LIST_LEFT, ///< Left button. WID_MTS_PLAYLIST, ///< Playlist. WID_MTS_LIST_RIGHT, ///< Right button. + WID_MTS_MUSICSET, ///< Music set selection. WID_MTS_ALL, ///< All button. WID_MTS_OLD, ///< Old button. WID_MTS_NEW, ///< New button. diff --git a/src/widgets/toolbar_widget.h b/src/widgets/toolbar_widget.h index 6ede3ad634..c317fc9574 100644 --- a/src/widgets/toolbar_widget.h +++ b/src/widgets/toolbar_widget.h @@ -33,10 +33,11 @@ enum ToolbarNormalWidgets { WID_TN_TRAINS = WID_TN_VEHICLE_START, ///< Train menu. WID_TN_ROADVEHS, ///< Road vehicle menu. WID_TN_SHIPS, ///< Ship menu. - WID_TN_AIRCRAFTS, ///< Aircraft menu. + WID_TN_AIRCRAFT, ///< Aircraft menu. WID_TN_ZOOM_IN, ///< Zoom in the main viewport. WID_TN_ZOOM_OUT, ///< Zoom out the main viewport. - WID_TN_RAILS, ///< Rail building menu. + WID_TN_BUILDING_TOOLS_START, ///< Helper for the offset of the building tools + WID_TN_RAILS = WID_TN_BUILDING_TOOLS_START, ///< Rail building menu. WID_TN_ROADS, ///< Road building menu. WID_TN_WATER, ///< Water building toolbar. WID_TN_AIR, ///< Airport building toolbar. diff --git a/src/window.cpp b/src/window.cpp index 1fce1f3a8d..22084c200e 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -36,6 +36,7 @@ #include "error.h" #include "game/game.hpp" #include "video/video_driver.hpp" +#include "framerate_type.h" #include "safeguards.h" @@ -48,7 +49,7 @@ enum ViewportAutoscrolling { }; static Point _drag_delta; ///< delta between mouse cursor and upper left corner of dragged window -static Window *_mouseover_last_w = NULL; ///< Window of the last #MOUSEOVER event. +static Window *_mouseover_last_w = NULL; ///< Window of the last OnMouseOver event. static Window *_last_scroll_window = NULL; ///< Window of the last scroll event. /** List of windows opened at the screen sorted from the front. */ @@ -139,7 +140,7 @@ int16 WindowDesc::GetDefaultHeight() const void WindowDesc::LoadFromConfig() { IniFile *ini = new IniFile(); - ini->LoadFromDisk(_windows_file, BASE_DIR); + ini->LoadFromDisk(_windows_file, NO_DIRECTORY); for (WindowDesc **it = _window_descs->Begin(); it != _window_descs->End(); ++it) { if ((*it)->ini_key == NULL) continue; IniLoadWindowSettings(ini, (*it)->ini_key, *it); @@ -165,7 +166,7 @@ void WindowDesc::SaveToConfig() QSortT(_window_descs->Begin(), _window_descs->Length(), DescSorter); IniFile *ini = new IniFile(); - ini->LoadFromDisk(_windows_file, BASE_DIR); + ini->LoadFromDisk(_windows_file, NO_DIRECTORY); for (WindowDesc **it = _window_descs->Begin(); it != _window_descs->End(); ++it) { if ((*it)->ini_key == NULL) continue; IniSaveWindowSettings(ini, (*it)->ini_key, *it); @@ -772,7 +773,12 @@ static void DispatchRightClickEvent(Window *w, int x, int y) if (w->OnRightClick(pt, wid->index)) return; } - if (_settings_client.gui.hover_delay_ms == 0 && wid->tool_tip != 0) GuiShowTooltips(w, wid->tool_tip, 0, NULL, TCC_RIGHT_CLICK); + /* Right-click close is enabled and there is a closebox */ + if (_settings_client.gui.right_mouse_wnd_close && w->nested_root->GetWidgetOfType(WWT_CLOSEBOX)) { + delete w; + } else if (_settings_client.gui.hover_delay_ms == 0 && wid->tool_tip != 0) { + GuiShowTooltips(w, wid->tool_tip, 0, NULL, TCC_RIGHT_CLICK); + } } /** @@ -932,6 +938,8 @@ static void DrawOverlappedWindow(Window *w, int left, int top, int right, int bo void DrawOverlappedWindowForAll(int left, int top, int right, int bottom) { Window *w; + + DrawPixelInfo *old_dpi = _cur_dpi; DrawPixelInfo bk; _cur_dpi = &bk; @@ -942,9 +950,10 @@ void DrawOverlappedWindowForAll(int left, int top, int right, int bottom) left < w->left + w->width && top < w->top + w->height) { /* Window w intersects with the rectangle => needs repaint */ - DrawOverlappedWindow(w, left, top, right, bottom); + DrawOverlappedWindow(w, max(left, w->left), max(top, w->top), min(right, w->left + w->width), min(bottom, w->top + w->height)); } } + _cur_dpi = old_dpi; } /** @@ -1109,7 +1118,7 @@ Window *FindWindowById(WindowClass cls, WindowNumber number) /** * Find any window by its class. Useful when searching for a window that uses - * the window number as a #WindowType, like #WC_SEND_NETWORK_MSG. + * the window number as a #WindowClass, like #WC_SEND_NETWORK_MSG. * @param cls Window class * @return Pointer to the found window, or \c NULL if not available */ @@ -1259,39 +1268,46 @@ static inline bool IsVitalWindow(const Window *w) * Get the z-priority for a given window. This is used in comparison with other z-priority values; * a window with a given z-priority will appear above other windows with a lower value, and below * those with a higher one (the ordering within z-priorities is arbitrary). - * @param w The window to get the z-priority for - * @pre w->window_class != WC_INVALID + * @param wc The window class of window to get the z-priority for + * @pre wc != WC_INVALID * @return The window's z-priority */ -static uint GetWindowZPriority(const Window *w) +static uint GetWindowZPriority(WindowClass wc) { - assert(w->window_class != WC_INVALID); + assert(wc != WC_INVALID); uint z_priority = 0; - switch (w->window_class) { + switch (wc) { case WC_ENDSCREEN: ++z_priority; + FALLTHROUGH; case WC_HIGHSCORE: ++z_priority; + FALLTHROUGH; case WC_TOOLTIPS: ++z_priority; + FALLTHROUGH; case WC_DROPDOWN_MENU: ++z_priority; + FALLTHROUGH; case WC_MAIN_TOOLBAR: case WC_STATUS_BAR: ++z_priority; + FALLTHROUGH; case WC_OSK: ++z_priority; + FALLTHROUGH; case WC_QUERY_STRING: case WC_SEND_NETWORK_MSG: ++z_priority; + FALLTHROUGH; case WC_ERRMSG: case WC_CONFIRM_POPUP_QUERY: @@ -1299,6 +1315,7 @@ static uint GetWindowZPriority(const Window *w) case WC_NETWORK_STATUS_WINDOW: case WC_SAVE_PRESET: ++z_priority; + FALLTHROUGH; case WC_GENERATE_LANDSCAPE: case WC_SAVELOAD: @@ -1310,15 +1327,19 @@ static uint GetWindowZPriority(const Window *w) case WC_AI_SETTINGS: case WC_TEXTFILE: ++z_priority; + FALLTHROUGH; case WC_CONSOLE: ++z_priority; + FALLTHROUGH; case WC_NEWS_WINDOW: ++z_priority; + FALLTHROUGH; default: ++z_priority; + FALLTHROUGH; case WC_MAIN_WINDOW: return z_priority; @@ -1341,11 +1362,11 @@ static void AddWindowToZOrdering(Window *w) /* Search down the z-ordering for its location. */ Window *v = _z_front_window; uint last_z_priority = UINT_MAX; - while (v != NULL && (v->window_class == WC_INVALID || GetWindowZPriority(v) > GetWindowZPriority(w))) { + while (v != NULL && (v->window_class == WC_INVALID || GetWindowZPriority(v->window_class) > GetWindowZPriority(w->window_class))) { if (v->window_class != WC_INVALID) { /* Sanity check z-ordering, while we're at it. */ - assert(last_z_priority >= GetWindowZPriority(v)); - last_z_priority = GetWindowZPriority(v); + assert(last_z_priority >= GetWindowZPriority(v->window_class)); + last_z_priority = GetWindowZPriority(v->window_class); } v = v->z_back; @@ -1412,7 +1433,6 @@ static void BringWindowToFront(Window *w) /** * Initializes the data (except the position and initial size) of a new Window. - * @param desc Window description. * @param window_number Number being assigned to the new window * @return Window pointer of the newly created window * @pre If nested widgets are used (\a widget is \c NULL), #nested_root and #nested_array_size must be initialized. @@ -1538,16 +1558,16 @@ void Window::FindWindowPlacementAndResize(int def_width, int def_height) * @param top Top edge of the rectangle * @param width Width of the rectangle * @param height Height of the rectangle + * @param toolbar_y Height of main toolbar * @param pos If rectangle is good, use this parameter to return the top-left corner of the new window * @return Boolean indication that the rectangle is a good place for the new window */ -static bool IsGoodAutoPlace1(int left, int top, int width, int height, Point &pos) +static bool IsGoodAutoPlace1(int left, int top, int width, int height, int toolbar_y, Point &pos) { int right = width + left; int bottom = height + top; - const Window *main_toolbar = FindWindowByClass(WC_MAIN_TOOLBAR); - if (left < 0 || (main_toolbar != NULL && top < main_toolbar->height) || right > _screen.width || bottom > _screen.height) return false; + if (left < 0 || top < toolbar_y || right > _screen.width || bottom > _screen.height) return false; /* Make sure it is not obscured by any window. */ const Window *w; @@ -1575,17 +1595,25 @@ static bool IsGoodAutoPlace1(int left, int top, int width, int height, Point &po * @param top Top edge of the rectangle * @param width Width of the rectangle * @param height Height of the rectangle + * @param toolbar_y Height of main toolbar * @param pos If rectangle is good, use this parameter to return the top-left corner of the new window * @return Boolean indication that the rectangle is a good place for the new window */ -static bool IsGoodAutoPlace2(int left, int top, int width, int height, Point &pos) +static bool IsGoodAutoPlace2(int left, int top, int width, int height, int toolbar_y, Point &pos) { + bool rtl = _current_text_dir == TD_RTL; + /* Left part of the rectangle may be at most 1/4 off-screen, * right part of the rectangle may be at most 1/2 off-screen */ - if (left < -(width >> 2) || left > _screen.width - (width >> 1)) return false; + if (rtl) { + if (left < -(width >> 1) || left > _screen.width - (width >> 2)) return false; + } else { + if (left < -(width >> 2) || left > _screen.width - (width >> 1)) return false; + } + /* Bottom part of the rectangle may be at most 1/4 off-screen */ - if (top < 22 || top > _screen.height - (height >> 2)) return false; + if (top < toolbar_y || top > _screen.height - (height >> 2)) return false; /* Make sure it is not obscured by any window. */ const Window *w; @@ -1615,11 +1643,14 @@ static Point GetAutoPlacePosition(int width, int height) { Point pt; + bool rtl = _current_text_dir == TD_RTL; + /* First attempt, try top-left of the screen */ const Window *main_toolbar = FindWindowByClass(WC_MAIN_TOOLBAR); - if (IsGoodAutoPlace1(0, main_toolbar != NULL ? main_toolbar->height + 2 : 2, width, height, pt)) return pt; + const int toolbar_y = main_toolbar != NULL ? main_toolbar->height : 0; + if (IsGoodAutoPlace1(rtl ? _screen.width - width : 0, toolbar_y, width, height, toolbar_y, pt)) return pt; - /* Second attempt, try around all existing windows with a distance of 2 pixels. + /* Second attempt, try around all existing windows. * The new window must be entirely on-screen, and not overlap with an existing window. * Eight starting points are tried, two at each corner. */ @@ -1627,39 +1658,41 @@ static Point GetAutoPlacePosition(int width, int height) FOR_ALL_WINDOWS_FROM_BACK(w) { if (w->window_class == WC_MAIN_WINDOW) continue; - if (IsGoodAutoPlace1(w->left + w->width + 2, w->top, width, height, pt)) return pt; - if (IsGoodAutoPlace1(w->left - width - 2, w->top, width, height, pt)) return pt; - if (IsGoodAutoPlace1(w->left, w->top + w->height + 2, width, height, pt)) return pt; - if (IsGoodAutoPlace1(w->left, w->top - height - 2, width, height, pt)) return pt; - if (IsGoodAutoPlace1(w->left + w->width + 2, w->top + w->height - height, width, height, pt)) return pt; - if (IsGoodAutoPlace1(w->left - width - 2, w->top + w->height - height, width, height, pt)) return pt; - if (IsGoodAutoPlace1(w->left + w->width - width, w->top + w->height + 2, width, height, pt)) return pt; - if (IsGoodAutoPlace1(w->left + w->width - width, w->top - height - 2, width, height, pt)) return pt; + if (IsGoodAutoPlace1(w->left + w->width, w->top, width, height, toolbar_y, pt)) return pt; + if (IsGoodAutoPlace1(w->left - width, w->top, width, height, toolbar_y, pt)) return pt; + if (IsGoodAutoPlace1(w->left, w->top + w->height, width, height, toolbar_y, pt)) return pt; + if (IsGoodAutoPlace1(w->left, w->top - height, width, height, toolbar_y, pt)) return pt; + if (IsGoodAutoPlace1(w->left + w->width, w->top + w->height - height, width, height, toolbar_y, pt)) return pt; + if (IsGoodAutoPlace1(w->left - width, w->top + w->height - height, width, height, toolbar_y, pt)) return pt; + if (IsGoodAutoPlace1(w->left + w->width - width, w->top + w->height, width, height, toolbar_y, pt)) return pt; + if (IsGoodAutoPlace1(w->left + w->width - width, w->top - height, width, height, toolbar_y, pt)) return pt; } - /* Third attempt, try around all existing windows with a distance of 2 pixels. + /* Third attempt, try around all existing windows. * The new window may be partly off-screen, and must not overlap with an existing window. * Only four starting points are tried. */ FOR_ALL_WINDOWS_FROM_BACK(w) { if (w->window_class == WC_MAIN_WINDOW) continue; - if (IsGoodAutoPlace2(w->left + w->width + 2, w->top, width, height, pt)) return pt; - if (IsGoodAutoPlace2(w->left - width - 2, w->top, width, height, pt)) return pt; - if (IsGoodAutoPlace2(w->left, w->top + w->height + 2, width, height, pt)) return pt; - if (IsGoodAutoPlace2(w->left, w->top - height - 2, width, height, pt)) return pt; + if (IsGoodAutoPlace2(w->left + w->width, w->top, width, height, toolbar_y, pt)) return pt; + if (IsGoodAutoPlace2(w->left - width, w->top, width, height, toolbar_y, pt)) return pt; + if (IsGoodAutoPlace2(w->left, w->top + w->height, width, height, toolbar_y, pt)) return pt; + if (IsGoodAutoPlace2(w->left, w->top - height, width, height, toolbar_y, pt)) return pt; } - /* Fourth and final attempt, put window at diagonal starting from (0, 24), try multiples - * of (+5, +5) + /* Fourth and final attempt, put window at diagonal starting from (0, toolbar_y), try multiples + * of the closebox */ - int left = 0, top = 24; + int left = rtl ? _screen.width - width : 0, top = toolbar_y; + int offset_x = rtl ? -(int)NWidgetLeaf::closebox_dimension.width : (int)NWidgetLeaf::closebox_dimension.width; + int offset_y = max(NWidgetLeaf::closebox_dimension.height, FONT_HEIGHT_NORMAL + WD_CAPTIONTEXT_TOP + WD_CAPTIONTEXT_BOTTOM); restart: FOR_ALL_WINDOWS_FROM_BACK(w) { if (w->left == left && w->top == top) { - left += 5; - top += 5; + left += offset_x; + top += offset_y; goto restart; } } @@ -1708,16 +1741,31 @@ static Point LocalGetWindowPlacement(const WindowDesc *desc, int16 sm_width, int int16 default_width = max(desc->GetDefaultWidth(), sm_width); int16 default_height = max(desc->GetDefaultHeight(), sm_height); - if (desc->parent_cls != 0 /* WC_MAIN_WINDOW */ && - (w = FindWindowById(desc->parent_cls, window_number)) != NULL && - w->left < _screen.width - 20 && w->left > -60 && w->top < _screen.height - 20) { - - pt.x = w->left + ((desc->parent_cls == WC_BUILD_TOOLBAR || desc->parent_cls == WC_SCEN_LAND_GEN) ? 0 : 10); - if (pt.x > _screen.width + 10 - default_width) { - pt.x = (_screen.width + 10 - default_width) - 20; + if (desc->parent_cls != WC_NONE && (w = FindWindowById(desc->parent_cls, window_number)) != NULL) { + bool rtl = _current_text_dir == TD_RTL; + if (desc->parent_cls == WC_BUILD_TOOLBAR || desc->parent_cls == WC_SCEN_LAND_GEN) { + pt.x = w->left + (rtl ? w->width - default_width : 0); + pt.y = w->top + w->height; + return pt; + } else { + /* Position child window with offset of closebox, but make sure that either closebox or resizebox is visible + * - Y position: closebox of parent + closebox of child + statusbar + * - X position: closebox on left/right, resizebox on right/left (depending on ltr/rtl) + */ + int indent_y = max(NWidgetLeaf::closebox_dimension.height, FONT_HEIGHT_NORMAL + WD_CAPTIONTEXT_TOP + WD_CAPTIONTEXT_BOTTOM); + if (w->top + 3 * indent_y < _screen.height) { + pt.y = w->top + indent_y; + int indent_close = NWidgetLeaf::closebox_dimension.width; + int indent_resize = NWidgetLeaf::resizebox_dimension.width; + if (_current_text_dir == TD_RTL) { + pt.x = max(w->left + w->width - default_width - indent_close, 0); + if (pt.x + default_width >= indent_close && pt.x + indent_resize <= _screen.width) return pt; + } else { + pt.x = min(w->left + indent_close, _screen.width - default_width); + if (pt.x + default_width >= indent_resize && pt.x + indent_close <= _screen.width) return pt; + } + } } - pt.y = w->top + ((desc->parent_cls == WC_BUILD_TOOLBAR || desc->parent_cls == WC_SCEN_LAND_GEN) ? w->height : 10); - return pt; } switch (desc->default_pos) { @@ -1954,7 +2002,7 @@ static void HandleMouseOver() { Window *w = FindWindowFromPt(_cursor.pos.x, _cursor.pos.y); - /* We changed window, put a MOUSEOVER event to the last window */ + /* We changed window, put an OnMouseOver event to the last window */ if (_mouseover_last_w != NULL && _mouseover_last_w != w) { /* Reset mouse-over coordinates of previous window */ Point pt = { -1, -1 }; @@ -2397,7 +2445,7 @@ static EventState HandleViewportScroll() * outside of the window and should not left-mouse scroll anymore. */ if (_last_scroll_window == NULL) _last_scroll_window = FindWindowFromPt(_cursor.pos.x, _cursor.pos.y); - if (_last_scroll_window == NULL || !(_right_button_down || scrollwheel_scrolling || (_settings_client.gui.left_mouse_btn_scrolling && _left_button_down))) { + if (_last_scroll_window == NULL || !((_settings_client.gui.scroll_mode != VSM_MAP_LMB && _right_button_down) || scrollwheel_scrolling || (_settings_client.gui.scroll_mode == VSM_MAP_LMB && _left_button_down))) { _cursor.fix_at = false; _scrolling_viewport = false; _last_scroll_window = NULL; @@ -2412,20 +2460,20 @@ static EventState HandleViewportScroll() } Point delta; - if (_settings_client.gui.reverse_scroll || (_settings_client.gui.left_mouse_btn_scrolling && _left_button_down)) { - delta.x = -_cursor.delta.x; - delta.y = -_cursor.delta.y; - } else { - delta.x = _cursor.delta.x; - delta.y = _cursor.delta.y; - } - if (scrollwheel_scrolling) { /* We are using scrollwheels for scrolling */ delta.x = _cursor.h_wheel; delta.y = _cursor.v_wheel; _cursor.v_wheel = 0; _cursor.h_wheel = 0; + } else { + if (_settings_client.gui.scroll_mode != VSM_VIEWPORT_RMB_FIXED) { + delta.x = -_cursor.delta.x; + delta.y = -_cursor.delta.y; + } else { + delta.x = _cursor.delta.x; + delta.y = _cursor.delta.y; + } } /* Create a scroll-event and send it to the window */ @@ -2703,18 +2751,17 @@ static void HandleAutoscroll() y -= vp->top; /* here allows scrolling in both x and y axis */ -#define scrollspeed 3 + static const int SCROLLSPEED = 3; if (x - 15 < 0) { - w->viewport->dest_scrollpos_x += ScaleByZoom((x - 15) * scrollspeed, vp->zoom); + w->viewport->dest_scrollpos_x += ScaleByZoom((x - 15) * SCROLLSPEED, vp->zoom); } else if (15 - (vp->width - x) > 0) { - w->viewport->dest_scrollpos_x += ScaleByZoom((15 - (vp->width - x)) * scrollspeed, vp->zoom); + w->viewport->dest_scrollpos_x += ScaleByZoom((15 - (vp->width - x)) * SCROLLSPEED, vp->zoom); } if (y - 15 < 0) { - w->viewport->dest_scrollpos_y += ScaleByZoom((y - 15) * scrollspeed, vp->zoom); + w->viewport->dest_scrollpos_y += ScaleByZoom((y - 15) * SCROLLSPEED, vp->zoom); } else if (15 - (vp->height - y) > 0) { - w->viewport->dest_scrollpos_y += ScaleByZoom((15 - (vp->height - y)) * scrollspeed, vp->zoom); + w->viewport->dest_scrollpos_y += ScaleByZoom((15 - (vp->height - y)) * SCROLLSPEED, vp->zoom); } -#undef scrollspeed } enum MouseClick { @@ -2813,59 +2860,73 @@ static void MouseLoop(MouseClick click, int mousewheel) if (vp != NULL && (_game_mode == GM_MENU || HasModalProgress())) return; if (mousewheel != 0) { - /* Send mousewheel event to window */ - w->OnMouseWheel(mousewheel); + /* Send mousewheel event to window, unless we're scrolling a viewport or the map */ + if (!scrollwheel_scrolling || (vp == NULL && w->window_class != WC_SMALLMAP)) w->OnMouseWheel(mousewheel); /* Dispatch a MouseWheelEvent for widgets if it is not a viewport */ if (vp == NULL) DispatchMouseWheelEvent(w, w->nested_root->GetWidgetFromPos(x - w->left, y - w->top), mousewheel); } if (vp != NULL) { - if (scrollwheel_scrolling) click = MC_RIGHT; // we are using the scrollwheel in a viewport, so we emulate right mouse button + if (scrollwheel_scrolling && !(w->flags & WF_DISABLE_VP_SCROLL)) { + _scrolling_viewport = true; + _cursor.fix_at = true; + return; + } + switch (click) { case MC_DOUBLE_LEFT: case MC_LEFT: - DEBUG(misc, 2, "Cursor: 0x%X (%d)", _cursor.sprite, _cursor.sprite); - if (!HandleViewportClicked(vp, x, y) && - !(w->flags & WF_DISABLE_VP_SCROLL) && - _settings_client.gui.left_mouse_btn_scrolling) { + if (HandleViewportClicked(vp, x, y)) return; + if (!(w->flags & WF_DISABLE_VP_SCROLL) && + _settings_client.gui.scroll_mode == VSM_MAP_LMB) { _scrolling_viewport = true; _cursor.fix_at = false; + return; } break; case MC_RIGHT: - if (!(w->flags & WF_DISABLE_VP_SCROLL)) { + if (!(w->flags & WF_DISABLE_VP_SCROLL) && + _settings_client.gui.scroll_mode != VSM_MAP_LMB) { _scrolling_viewport = true; - _cursor.fix_at = true; - - /* clear 2D scrolling caches before we start a 2D scroll */ - _cursor.h_wheel = 0; - _cursor.v_wheel = 0; + _cursor.fix_at = (_settings_client.gui.scroll_mode == VSM_VIEWPORT_RMB_FIXED || + _settings_client.gui.scroll_mode == VSM_MAP_RMB_FIXED); + return; } break; default: break; } - } else { + } + + if (vp == NULL || (w->flags & WF_DISABLE_VP_SCROLL)) { switch (click) { case MC_LEFT: case MC_DOUBLE_LEFT: DispatchLeftClickEvent(w, x - w->left, y - w->top, click == MC_DOUBLE_LEFT ? 2 : 1); - break; + return; default: if (!scrollwheel_scrolling || w == NULL || w->window_class != WC_SMALLMAP) break; /* We try to use the scrollwheel to scroll since we didn't touch any of the buttons. * Simulate a right button click so we can get started. */ - /* FALL THROUGH */ + FALLTHROUGH; - case MC_RIGHT: DispatchRightClickEvent(w, x - w->left, y - w->top); break; + case MC_RIGHT: + DispatchRightClickEvent(w, x - w->left, y - w->top); + return; - case MC_HOVER: DispatchHoverEvent(w, x - w->left, y - w->top); break; + case MC_HOVER: + DispatchHoverEvent(w, x - w->left, y - w->top); + break; } } + + /* We're not doing anything with 2D scrolling, so reset the value. */ + _cursor.h_wheel = 0; + _cursor.v_wheel = 0; } /** @@ -3018,6 +3079,9 @@ void InputLoop() */ void UpdateWindows() { + PerformanceMeasurer framerate(PFE_DRAWING); + PerformanceAccumulator::Reset(PFE_DRAWWORLD); + Window *w; static int highlight_timer = 1; @@ -3031,6 +3095,10 @@ void UpdateWindows() w->ProcessHighlightedInvalidations(); } + /* Skip the actual drawing on dedicated servers without screen. + * But still empty the invalidation queues above. */ + if (_network_dedicated) return; + static int we4_timer = 0; int t = we4_timer + 1; diff --git a/src/window_type.h b/src/window_type.h index 809e81d485..7185bfcb4f 100644 --- a/src/window_type.h +++ b/src/window_type.h @@ -681,6 +681,18 @@ enum WindowClass { */ WC_SAVE_PRESET, + /** + * Framerate display; %Window numbers: + * - 0 = #FramerateDisplayWidgets + */ + WC_FRAMERATE_DISPLAY, + + /** + * Frame time graph; %Window numbers: + * - 0 = #FrametimeGraphWindowWidgets + */ + WC_FRAMETIME_GRAPH, + WC_INVALID = 0xFFFF, ///< Invalid window. };